Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
43550ee
Fix typo in architecture doc (#1159)
joscoh May 12, 2026
25f2543
Add int-valued recursion with termination checking (#1167)
joscoh May 15, 2026
3696330
Merge `main` into `main2` (#1177)
joscoh May 18, 2026
83e3e54
Add one-time pad example with map, linked list, and sequence based im…
Dragon-Hatcher May 19, 2026
6524b31
Fix free variable issue in Boole (#1153)
kondylidou May 19, 2026
c4dbccf
Boole language extensions for dalek-lite benchmarks (#1075)
kondylidou May 19, 2026
e0f719f
Automate single page verso doc building via `make` (#1193)
leo-leesco May 20, 2026
23e99eb
Merge with main (#1197)
atomb May 22, 2026
d66fff9
Remove ability to initialize variable with nondeterministic variables…
joscoh May 27, 2026
e9f8036
SMT counter-example decoder: handle sc_decimal_neg (#1266)
MikaelMayer May 28, 2026
5ce3d95
Fix SMT translator to encode Term.none/Term.some instead of throwing …
MikaelMayer May 28, 2026
deab692
feat(Core): add Bv{n}.ToUInt, Bv{n}.ToInt, Int.ToBv{n} cast operators…
kondylidou May 28, 2026
86c7757
SMT counter-example decoder: bitvec literals decoded as UF applicatio…
MikaelMayer May 29, 2026
2b463bf
Fix empty seq literal typing (#1214)
PROgram52bc May 29, 2026
9f752af
ProcedureInlining: remove dead `var_map.find?` lookup in `outputSetSt…
MikaelMayer May 29, 2026
e9c2fad
`Strata.DL.Util.Maps`: delete `Maps.erase` (and its theorems), migrat…
MikaelMayer May 29, 2026
d157277
SMT encoder: route every emitted SMT-LIB identifier through a unified…
MikaelMayer May 29, 2026
75c782c
fix: correct "Source rang" typo in SourceRange.fromIon error message …
MikaelMayer May 29, 2026
688e125
`Core` translator: unlabeled `cover` statements use `assert_def` coun…
MikaelMayer May 29, 2026
eecc682
Fix #1228: skip field-key symbol push for NOP pads in struct deserial…
MikaelMayer May 29, 2026
bffad2f
Ion deserializer: `SyntaxDefAtom.fromIon "indent"` crashes on malform…
MikaelMayer May 29, 2026
7b73402
DDM Elab: fix failed import remaining in dialect.imports (#1259)
MikaelMayer May 29, 2026
3e3f1a2
Change "unreachable" assertion message to "unreachable in this contex…
MikaelMayer May 29, 2026
41cf05e
Fix: Ion deserializer `decimal` arg-count check reports wrong constru…
MikaelMayer May 29, 2026
a995388
Formatting and debugging improvements (#1115)
keyboardDrummer-bot Jun 1, 2026
729a417
Fix #1244: add missing s! prefix to error message in parseStrataProgr…
MikaelMayer Jun 1, 2026
315fda7
DDM Elab: circular dialect imports recurse forever (no cycle check in…
MikaelMayer Jun 1, 2026
a148268
DDM Elab: `DeclState.ofDialects` panics under non-deterministic `Hash…
MikaelMayer Jun 1, 2026
caad42f
Fix Core translator: local function declaration builds wrong arrow ty…
MikaelMayer Jun 1, 2026
632555a
Fix #1229: resolve chained type aliases and preserve user-supplied ty…
MikaelMayer Jun 1, 2026
8ff7cd5
Fix checkLeftRec panic when leading argument is NewlineSepBy (#1281)
MikaelMayer Jun 1, 2026
06d41f2
Fix Python for-loop translation: continue now advances the counter (#…
leo-leesco Jun 2, 2026
8e97471
Fix stack overflow in verify pipeline on large Core programs (#1314)
joscoh Jun 3, 2026
8011a42
Prove `LExpr.resolve` produces well-annotated terms (#1309)
joscoh Jun 3, 2026
47c5d18
Merge with main 2026 06 01 (#1311)
aqjune-aws Jun 3, 2026
4e4ceb9
Fix bugs in Function typing (#1288)
joscoh Jun 4, 2026
0044067
Factor out theorems and lemmas into dedicated Props files (#1327)
aqjune-aws Jun 5, 2026
5bd758d
Fix/precond and conjunction main2 (#1318)
kondylidou Jun 5, 2026
1af6cc1
Small doc cleanups (#1333)
atomb Jun 5, 2026
dda37e4
Add induction principle for `resolveAux` and clean up type inference …
joscoh Jun 5, 2026
618f22b
Fix outdated ion-java jar path in README (#1336)
amanda-zx Jun 6, 2026
c4e4a41
Examples using Lean to prove VCs of Core programs (#1219)
atomb Jun 8, 2026
ead057a
docs(BooleFeatureRequests) (#1300)
kondylidou Jun 8, 2026
2e525e8
Merge main into main2 (2026-06-08) (#1346)
shigoel Jun 8, 2026
a364a70
Support transparent procedures (#1215)
keyboardDrummer Jun 9, 2026
0b10086
Procedure.Body sum type with parser, translator, and consumer threadi…
PROgram52bc Jun 10, 2026
cde0447
Add array axiomatization as a standalone SMT-IR transformation (#795)
abdoo8080 Jun 10, 2026
4918dfe
fix(laurel): allow a valueless return in the grammar (#1354)
fabiomadge Jun 11, 2026
a68c98b
Exclude hidden files from the lake cache hash (#1313)
keyboardDrummer Jun 11, 2026
ea1ea46
Document Laurel passes and their dependencies, and other documentatio…
keyboardDrummer Jun 11, 2026
f7f6dee
Fix evaluator scoping in Imperative small-step semantics (#1337)
aqjune-aws Jun 11, 2026
655e196
Overhaul test framework for Laurel (#1223)
leo-leesco Jun 11, 2026
dde88b1
feat(laurel): Support bitvector types as composite fields (#1357)
olivier-aws Jun 12, 2026
8abb463
feat(laurel): add Java-style ++ and -- operators (#1320)
olivier-aws Jun 15, 2026
24b8f04
Per-invariant source ranges for loop-invariant diagnostics (#1361)
kadirayk Jun 16, 2026
4d3cbac
feat(laurel): Adding surface syntax for calling instance procedures &…
AD1024 Jun 16, 2026
0c99354
fix(laurel): datatype `==`/`!=` mis-lowered to reference comparison i…
fabiomadge Jun 17, 2026
9c40e44
Add type checking to Laurel resolution pass (#1121)
keyboardDrummer-bot Jun 18, 2026
45784fa
fix(laurel): Run LiftInstanceProcedure before EliminateValueInReturns…
olivier-aws Jun 18, 2026
925423b
File-relative error reporting (#1367)
leo-leesco Jun 18, 2026
81f20ab
Fix resolution errors during phases (#1389)
keyboardDrummer Jun 19, 2026
0abd9ef
laurel: wire old() to Core two-state semantics (#1203)
julesmt Jun 20, 2026
a6e0cee
fix(laurel) : incorrect reporting of mismatched annotation location (…
leo-leesco Jun 22, 2026
064e019
fix(core): isolate path conditions at the procedure boundary (#1391)
fabiomadge Jun 22, 2026
2c8eaa1
feat(laurel): add body-tested do-while loop (#1358)
fabiomadge Jun 23, 2026
8d6aa98
feat(laurel): paren-free field ++/--, and chained-field-access test c…
fabiomadge Jun 23, 2026
6a074b1
[Laurel] Support constrained types as composite fields (#1364)
olivier-aws Jun 23, 2026
49c3e1a
Enable calling procedures in contracts (#1352)
keyboardDrummer Jun 23, 2026
0a4a29b
Laurel: avoid quantified modifies frames when using array theory (#1374)
julesmt Jun 25, 2026
8e10731
pyspec: decorator framework (DecoratorForm + diagnostics extract)
julesmt Jun 26, 2026
cb9775f
pyspec: native contract decorator recognition surface
julesmt Jun 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 20 additions & 0 deletions .github/actions/check-copyright-headers/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Check copyright headers
description: >
Verify that all .lean files have the expected copyright header.
Downstream repos can add their own checks for other file types.

inputs:
directory:
description: Root directory to scan (relative to the workspace).
required: false
default: "."

runs:
using: composite
steps:
- name: Check copyright headers
shell: bash
run: |
python3 "${{ github.action_path }}/../../scripts/check_copyright_headers.py" "${{ inputs.directory }}"
20 changes: 20 additions & 0 deletions .github/actions/check-lean-import/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Check Lean import
description: >
Ensure no .lean file uses a bare "import Lean" statement. Encourages
importing only the specific parts of Lean that are needed.

inputs:
directory:
description: Directory to scan for .lean files (relative to the workspace).
required: false
default: "."

runs:
using: composite
steps:
- name: Check for bare import Lean
shell: bash
run: |
"${{ github.action_path }}/../../scripts/checkLeanImport.sh" "${{ inputs.directory }}"
24 changes: 24 additions & 0 deletions .github/actions/check-no-panic/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Check no panic
description: >
Detect net-new panic! calls introduced in a PR. Only fails when more
panics are added than removed. Suppression: add "-- nopanic:ok" on a line.
Requires actions/checkout with fetch-depth: 0 (needs full git history to
compute the merge base).

inputs:
base-ref:
description: >
Git ref to diff against (e.g. "origin/main"). The script computes
the merge base automatically.
required: false
default: "origin/main"

runs:
using: composite
steps:
- name: Check for new panic! usage
shell: bash
run: |
"${{ github.action_path }}/../../scripts/checkNoPanic.sh" "${{ inputs.base-ref }}"
52 changes: 52 additions & 0 deletions .github/actions/install-cvc5/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Install cvc5
description: >
Download a static cvc5 build and put it on the PATH. Supports both
x86_64 and aarch64 Linux runners. Consolidates the cvc5 install logic
previously duplicated across ci.yml and cbmc.yml; intended to also be
adopted by the python-fuzz workflow once that lands (see
https://github.com/strata-org/Strata/pull/984).

inputs:
version:
description: cvc5 release tag (e.g. "1.3.4").
required: false
default: "1.3.4"
install-to:
description: >
Where to make the cvc5 binary available. One of:
"path" (default) — prepend the unpacked bin/ directory to $GITHUB_PATH.
"system" — sudo cp the cvc5 binary into /usr/local/bin/.
required: false
default: "path"

runs:
using: composite
steps:
- name: Download cvc5
shell: bash
run: |
set -eu
ARCH=$(uname -m)
case "$ARCH" in
x86_64) ARCH_NAME="x86_64" ;;
aarch64|arm64) ARCH_NAME="arm64" ;;
*) echo "Unsupported architecture: $ARCH" >&2; exit 1 ;;
esac
URL="https://github.com/cvc5/cvc5/releases/download/cvc5-${{ inputs.version }}/cvc5-Linux-${ARCH_NAME}-static.zip"
wget -q "$URL"
unzip -q "cvc5-Linux-${ARCH_NAME}-static.zip"
chmod +x "cvc5-Linux-${ARCH_NAME}-static/bin/cvc5"
case "${{ inputs.install-to }}" in
path)
echo "$GITHUB_WORKSPACE/cvc5-Linux-${ARCH_NAME}-static/bin/" >> "$GITHUB_PATH"
;;
system)
sudo cp "cvc5-Linux-${ARCH_NAME}-static/bin/cvc5" /usr/local/bin/
;;
*)
echo "Unknown install-to value: ${{ inputs.install-to }}" >&2
exit 2
;;
esac
55 changes: 55 additions & 0 deletions .github/actions/install-z3/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Install z3
description: >
Download a z3 release and put it on the PATH. Supports x86_64 and
aarch64 Linux runners. Consolidates the z3 install logic previously
duplicated across ci.yml and cbmc.yml.

inputs:
version:
description: z3 release tag (e.g. "4.15.2").
required: false
default: "4.15.2"
install-to:
description: >
Where to make the z3 binary available. One of:
"path" (default) — prepend the unpacked bin/ directory to $GITHUB_PATH.
"system" — sudo cp the z3 binary into /usr/local/bin/.
required: false
default: "path"

runs:
using: composite
steps:
- name: Download z3
shell: bash
run: |
set -eu
ARCH=$(uname -m)
case "$ARCH" in
x86_64)
URL="https://github.com/Z3Prover/z3/releases/download/z3-${{ inputs.version }}/z3-${{ inputs.version }}-x64-glibc-2.39.zip"
ARCHIVE_NAME="z3-${{ inputs.version }}-x64-glibc-2.39"
;;
aarch64|arm64)
URL="https://github.com/Z3Prover/z3/releases/download/z3-${{ inputs.version }}/z3-${{ inputs.version }}-arm64-glibc-2.34.zip"
ARCHIVE_NAME="z3-${{ inputs.version }}-arm64-glibc-2.34"
;;
*) echo "Unsupported architecture: $ARCH" >&2; exit 1 ;;
esac
wget -q "$URL"
unzip -q "${ARCHIVE_NAME}.zip"
chmod +x "${ARCHIVE_NAME}/bin/z3"
case "${{ inputs.install-to }}" in
path)
echo "$GITHUB_WORKSPACE/${ARCHIVE_NAME}/bin/" >> "$GITHUB_PATH"
;;
system)
sudo cp "${ARCHIVE_NAME}/bin/z3" /usr/local/bin/
;;
*)
echo "Unknown install-to value: ${{ inputs.install-to }}" >&2
exit 2
;;
esac
19 changes: 19 additions & 0 deletions .github/actions/lint-whitespace/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Lint whitespace
description: >
Check .lean files for trailing whitespace and missing final newlines.

inputs:
directory:
description: Directory to scan for .lean files (relative to the workspace).
required: false
default: "Strata"

runs:
using: composite
steps:
- name: Check for trailing whitespace
shell: bash
run: |
"${{ github.action_path }}/../../scripts/lintWhitespace.sh" "${{ inputs.directory }}"
82 changes: 82 additions & 0 deletions .github/actions/restore-lake-cache/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Restore lake cache
description: >
Thin wrapper around actions/cache/restore@v5 that uses the standard
Strata cache-key pattern:
lake-<os>-<arch>-<lean-toolchain>-<lake-manifest>-<all .st files>-<sha>
with three fallback keys dropping each trailing component in turn.
Consolidates the ~15-line cache block previously duplicated across
ci.yml's build_and_test_lean, check_pending_python, build_python and
cbmc.yml; intended to also be adopted by the python-fuzz workflow once
that lands (see https://github.com/strata-org/Strata/pull/984).

inputs:
fail-on-cache-miss:
description: >
If 'true', the step fails when no cache entry matches. Use this in
jobs that depend on a cache saved by an upstream job for the same
SHA (see https://github.com/strata-org/Strata/issues/952).
required: false
default: "false"
path:
description: Cache path(s), newline-separated.
required: false
default: ".lake"
key-prefix:
description: >
Prefix used in the cache key. The action also hashes the
repo-root `lean-toolchain` and `lake-manifest.json`, so changing
only this prefix is appropriate for caches keyed on the same
root-level Lean build (e.g. distinguishing different artifact
names with the same source set). Sub-projects with their own
toolchain/manifest do not currently fit this action and should
not reuse it as-is.
required: false
default: "lake"
use-restore-keys:
description: >
Must be the string `'true'` or `'false'`.

If `'true'` (default), include three fallback `restore-keys` so
that a near match (same toolchain/manifest/.st files but different
SHA) is used when no exact-SHA cache exists.

Set to `'false'` for downstream jobs that depend on a cache saved
by an upstream job for the *same* SHA (typically together with
`fail-on-cache-miss: 'true'`); see
https://github.com/strata-org/Strata/issues/952. With fallback
keys present, `fail-on-cache-miss` only triggers when every
fallback also misses, which silently allows stale cross-SHA cache
matches and defeats the safety net.
required: false
default: "true"

outputs:
cache-hit:
description: Whether a cache entry was restored (see actions/cache/restore@v5).
value: ${{ steps.restore-with-fallback.outputs.cache-hit || steps.restore-exact.outputs.cache-hit }}

runs:
using: composite
steps:
- name: Restore lake cache (with fallback keys)
id: restore-with-fallback
if: inputs.use-restore-keys != 'false'
uses: actions/cache/restore@v5
with:
path: ${{ inputs.path }}
key: ${{ inputs.key-prefix }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}-${{ hashFiles('[^.]*/**/*.st', '*.st') }}-${{ github.sha }}
restore-keys: |
${{ inputs.key-prefix }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}-${{ hashFiles('[^.]*/**/*.st', '*.st') }}
${{ inputs.key-prefix }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}
${{ inputs.key-prefix }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}
fail-on-cache-miss: ${{ inputs.fail-on-cache-miss }}
- name: Restore lake cache (exact SHA only)
id: restore-exact
if: inputs.use-restore-keys == 'false'
uses: actions/cache/restore@v5
with:
path: ${{ inputs.path }}
key: ${{ inputs.key-prefix }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}-${{ hashFiles('[^.]*/**/*.st', '*.st') }}-${{ github.sha }}
fail-on-cache-miss: ${{ inputs.fail-on-cache-miss }}
35 changes: 35 additions & 0 deletions .github/actions/save-lake-cache/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright Strata Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT
name: Save lake cache
description: >
Save the lake build cache using the canonical Strata cache-key pattern.
Companion to `restore-lake-cache`: the two actions share the same key
construction so downstream jobs that consume the saved cache via
`restore-lake-cache` with `use-restore-keys: "false"` will hit it
reliably.

Use this in workflows that produce a fresh build (typically the
`build_and_test_lean` job in ci.yml) to share the result with
downstream jobs at the same SHA.

inputs:
path:
description: Cache path(s), newline-separated.
required: false
default: ".lake"
key-prefix:
description: >
Cache-key prefix; must match the `key-prefix` passed to the
companion `restore-lake-cache` action so that the exact-SHA
restore keys line up.
required: false
default: "lake"

runs:
using: composite
steps:
- name: Save lake cache
uses: actions/cache/save@v5
with:
path: ${{ inputs.path }}
key: ${{ inputs.key-prefix }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}-${{ hashFiles('[^.]*/**/*.st', '*.st') }}-${{ github.sha }}
9 changes: 5 additions & 4 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Python:
- changed-files:
- any-glob-to-any-file:
- 'Strata/Languages/Python/**'
- 'StrataTest/Languages/Python/**'
- 'Tools/Python/**'
- 'StrataPython/**'
- 'Tools/Python-base/**'
- 'StrataPython/Tools/strata-python/**'

Laurel:
- changed-files:
Expand Down Expand Up @@ -42,7 +42,8 @@ dependencies:
- 'lake-manifest.json'
- 'lakefile.toml'
- 'lean-toolchain'
- 'Tools/Python/pyproject.toml'
- 'Tools/Python-base/pyproject.toml'
- 'StrataPython/Tools/strata-python/pyproject.toml'
- 'Tools/BoogieToStrata/**/*.csproj'
- 'Tools/BoogieToStrata/**/*.sln'

Expand Down
7 changes: 7 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
**Warning:** This repository will shortly undergo a split into several separate repositories. If you're creating a PR that crosses the boundaries between these repositories, you may want to hold off until the split is complete or be prepared to rework your PR into multiple PRs once the split is complete.

The code that will be moved includes:
- Strata/DDM/*
- Strata/Languages/Boole/*
- Strata/Languages/Python/* along with Tools/Python/*
- Tools/BoogieToStrata
4 changes: 3 additions & 1 deletion .github/scripts/checkLeanImport.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@
# Check to identify modules that inadvertently import all of Lean.
# We want to encourage only importing parts of Lean when needed.

! (find . -name "*.lean" -type f -print0 | xargs -0 grep -E -n '^import Lean$')
LINT_DIR="${1:-.}"

! (find "$LINT_DIR" -name "*.lean" -type f -print0 | xargs -0 grep -E -n '^import Lean$')
14 changes: 14 additions & 0 deletions .github/scripts/checkMissingInterpolation.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash
# Checks for string literals containing {identifier} patterns in throw/panic!/userError
# that are missing the s! interpolation prefix.

issues_found=0

while IFS= read -r file; do
while IFS=: read -r line_num line; do
echo "Missing s! interpolation prefix in $file at line $line_num: $line"
issues_found=1
done < <(grep -n -E '(throw|panic!|userError|dbg_trace)\s+"[^"]*\{[a-zA-Z_]' "$file" | grep -v 's!"' | grep -v 'm!"' | grep -v 'f!"')
done < <(find Strata StrataTest -type f -name "*.lean" 2>/dev/null)

exit $issues_found
Loading
Loading