Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
573cec7
feat(formal): map every model challenge to native mutants in both ports
lan17 Sep 18, 2026
7da07ab
fix(formal): check every native mutant anchor on each pull request an…
lan17 Sep 18, 2026
ad33596
refactor(formal): one mutant catalog with per-port sections, anchors …
lan17 Sep 18, 2026
76ba3ef
fix(formal): lock the shared process flight registry in M20 and recor…
lan17 Sep 18, 2026
2ec10a4
test(formal): require a generated witness for every semantic case
lan17 Sep 18, 2026
4952b77
feat(formal): check the causally-ready-v1 settlement contract by receipt
lan17 Sep 18, 2026
16559e1
fix(formal): snapshot the reported observation as its wire encoding
lan17 Sep 18, 2026
e3bb674
fix(formal): record a settlement violation against its mutant and pin…
lan17 Sep 18, 2026
dd3d2ce
fix(formal): leave portable evidence unmeasured with its component an…
lan17 Sep 18, 2026
c16990a
fix(formal): match settlement violations by the ledger's own pattern …
lan17 Sep 19, 2026
cad8afa
perf(formal): anchor the Go runner's violation-line capture per line
lan17 Sep 19, 2026
7d0cada
test(formal): read the independent witnesses from inputs and public o…
lan17 Sep 19, 2026
036c6d9
feat(formal): add held remote I/O, recovery and instant-ordered deadl…
lan17 Sep 19, 2026
37d166e
feat(formal): compose the independent profile over held remote I/O
lan17 Sep 19, 2026
a19e1c5
fix(formal): map every held start to a loader ordinal, report any ope…
lan17 Sep 19, 2026
2de6dc1
ci(formal): give the differential lane an hour
lan17 Sep 19, 2026
ff5c1dd
fix(formal): judge operator arguments by the kernel's declared types,…
lan17 Sep 19, 2026
0135f49
fix(formal): resolve alias-typed operator positions and aliased kerne…
lan17 Sep 19, 2026
68eafb3
feat(formal): payload codes on both remote paths, the tracked retenti…
lan17 Sep 19, 2026
ea008a7
feat(formal): judge the invalidation outcome under a write fault in t…
lan17 Sep 19, 2026
0a47889
merge: main into claude/fault-map (Go API reshape), retarget the Go m…
lan17 Sep 19, 2026
20b9159
feat(formal): compose the recovery-read profile from the kernel library
lan17 Sep 19, 2026
cd28a96
refactor(formal): carry the remote observation through the layered re…
lan17 Sep 20, 2026
e961635
fix(formal): keep the manifest validation tests inside the hosted bud…
lan17 Sep 20, 2026
1937249
docs(formal): state the recovery monitor's seed assumption and the ba…
lan17 Sep 20, 2026
9d64a88
test(formal): pin the lapsed marker's un-fencing in both ports, requi…
lan17 Sep 20, 2026
206e878
feat(formal): expose the layered release judgment, a detached source,…
lan17 Sep 20, 2026
16bb2c6
feat(formal): compose the shadow-layers profile from the kernel library
lan17 Sep 20, 2026
5b4da7b
fix(formal): end a dark job on a failed C0 or confirmation read, judg…
lan17 Sep 20, 2026
eaa6296
refactor(formal): encode generated fixtures one state per line
lan17 Sep 20, 2026
5abaee4
refactor(formal): pin only what the generated fixtures read
lan17 Sep 20, 2026
7da6bcd
refactor(formal): derive the scheduled regressions and libraries from…
lan17 Sep 20, 2026
95c3382
feat(formal): let a model declare its own bytes-per-state bound for t…
lan17 Sep 20, 2026
a714a71
test(formal): compute the inventory pins from the manifest
lan17 Sep 20, 2026
d69ed9e
fix(formal): refuse any Quint library no scheduled model imports
lan17 Sep 20, 2026
3733b6b
fix(formal): compare the exported regression list as a set when judgi…
lan17 Sep 20, 2026
75d709e
feat(formal): a fractional clock, an inline local call, the newest so…
lan17 Sep 20, 2026
43c8dc9
feat(formal): compose the local-failure and local-clock profiles from…
lan17 Sep 20, 2026
9432f34
fix(formal): validate the working tree's manifest as written before t…
lan17 Sep 20, 2026
2add082
feat(formal): settle a dispatched read in its step, split the held re…
lan17 Sep 20, 2026
ee553de
feat(formal): compose the recovery profile from the kernel library
lan17 Sep 20, 2026
0675695
test(formal): prepare the differential from the working tree as written
lan17 Sep 20, 2026
e18bb93
test(formal): restore the composed-profile pin that names recovery
lan17 Sep 20, 2026
e88d137
test(formal): keep the differential prepare test beside the composed-…
lan17 Sep 20, 2026
e365162
fix(formal): state the local read fault as a judgment argument, not a…
lan17 Sep 20, 2026
da943a4
refactor(formal): delete the uncalled remote_io dispatch pair, pin th…
lan17 Sep 20, 2026
7db25ec
merge: lane B (local-failure and local-clock composed) into claude/fa…
lan17 Sep 20, 2026
fa27569
refactor(formal): derive go-parity.json's mirrored sections at check …
lan17 Sep 20, 2026
2dc8099
refactor(formal): fold quint-case-audit.json into semantic-cases.json
lan17 Sep 20, 2026
ca4354a
refactor(formal): share the witness fidelity scaffold across classifiers
lan17 Sep 20, 2026
56bb2bb
refactor(formal): judge higher-order kernel definitions by a denylist…
lan17 Sep 20, 2026
b1b5c83
fix(formal): resolve alias-typed operator parameters and aliased call…
lan17 Sep 20, 2026
21d57bf
feat(formal): compose the admission profile from the kernel library
lan17 Sep 20, 2026
d9e6d5a
merge: lane B (admission composed) into claude/fault-map
lan17 Sep 20, 2026
6fed122
test(formal): give the semantic coverage suite an explicit budget
lan17 Sep 20, 2026
eacef47
docs(formal): name TypeScript the executable reference and Quint the …
lan17 Sep 20, 2026
943f139
feat(formal): hold the shadow job's reads and decodes, spell the payl…
lan17 Sep 20, 2026
99da12d
feat(formal): compose the shadow profile from the kernel library and …
lan17 Sep 20, 2026
6164e43
feat(formal): split the read settlement from its judgment and hold th…
lan17 Sep 20, 2026
f6ced95
merge: lane B (shadow composed) into claude/fault-map
lan17 Sep 20, 2026
cf03e05
merge: claude/fault-map (shadow composed) into claude/fault-map-effects
lan17 Sep 20, 2026
8136c1b
feat(formal): compose the effects profile from the kernel library and…
lan17 Sep 20, 2026
070e42f
fix(formal): report a stale frame reply's miss as expired
lan17 Sep 20, 2026
84fccb1
ci(formal): shard the smoke differential across four runners
lan17 Sep 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 25 additions & 20 deletions .github/workflows/formal-full.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -147,24 +147,27 @@ jobs:
if-no-files-found: warn
retention-days: 14

# Each mutation lane is sharded over three runners. Every shard compiles,
# measures every unmodified baseline and evaluates the witness evidence
# itself, then measures a contiguous third of the catalog; the merge job
# refuses shards whose fingerprints or baselines disagree, so the merged
# report is exactly as strict as one sequential run. The lane was bounded
# by sequential mutants: run 34669546872 took 17 minutes unsharded. A shard
# runs the baselines (2-4 minutes) plus 4-5 mutants (2-4 minutes each);
# doubled for a slow runner that stays under 30.
# Each mutation lane is sharded. Every shard compiles, measures every
# unmodified baseline and evaluates the witness evidence itself, then
# measures a contiguous slice of the catalog; the merge job refuses shards
# whose fingerprints or baselines disagree, so the merged report is exactly
# as strict as one sequential run. The lane is bounded by sequential
# mutants: about 1 minute per TypeScript mutant on a fast runner and about 2
# on the slow class (13 mutants took 17 minutes unsharded in run
# 34669546872). test/formal-validation.test.ts pins the mutants a shard may
# hold so that the baselines (2-4 minutes), the slow-class mutant cost and
# one hung cohort's 9-minute bound fit the timeout; growing the catalog past
# that fails the pull request until the matrix grows.
typescript-mutations:
needs: generate
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
shard: [1, 2, 3, 4, 5, 6]
env:
MUTATION_SHARD: ${{ matrix.shard }}/3
timeout-minutes: 30
MUTATION_SHARD: ${{ matrix.shard }}/6
timeout-minutes: 40
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
- uses: ./.github/actions/setup-validation
Expand Down Expand Up @@ -247,22 +250,24 @@ jobs:
if-no-files-found: warn
retention-days: 14

# The Go lane bounded the whole workflow: 13 mutants each replaying the
# generated cohort for about 105 s on a fast runner, strictly in sequence.
# Run 34660598461 took 25 minutes; runs 34669546872 and 34670045249 took 47
# and 48 on the slow runner class. A shard compiles, runs the baselines
# (2-4 minutes) and 4-5 mutants (2-4 minutes each); doubled for a slow
# runner that stays under 40, and one hung cohort adds its 8-minute test
# bound before the shard fails.
# The Go lane bounds the whole workflow: every mutant replays the generated
# cohort, about 1.6 minutes per mutant on a fast runner and about 3 on the
# slow class (13 mutants took 25 minutes in run 34660598461 and 47-48 in
# runs 34669546872 and 34670045249), strictly in sequence. A shard compiles,
# runs the baselines (2-4 minutes) and its slice of the catalog; one hung
# cohort adds its 8-minute test bound before the shard fails.
# test/formal-validation.test.ts pins the mutants a shard may hold within
# the timeout, so catalog growth fails the pull request until the matrix
# grows.
go-mutations:
needs: generate
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
env:
MUTATION_SHARD: ${{ matrix.shard }}/3
MUTATION_SHARD: ${{ matrix.shard }}/10
timeout-minutes: 40
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
Expand Down
24 changes: 19 additions & 5 deletions .github/workflows/formal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,24 @@ jobs:
# previous text generated, and vice versa, unless the manifest declares an
# intended change. The reference is the merge base with the pull request's
# base branch; a push to main has no reference. The step also checks the
# composition lint baseline.
# composition lint baseline and the kernel fixtures. A kernel change replays
# every composed profile in both directions: six profiles took about 35
# minutes on the hosted runner, five about 26, and fourteen in one job
# overran the 60-minute budget (57 minutes, then a cancellation at the
# timeout), so the lane runs as four matrix shards, each replaying a
# round-robin quarter of the profiles sorted by name (DIFFERENTIAL_SHARD);
# a change outside the kernel skips unchanged closures in under ten. The
# gate is the four statuses `differential (1)` to `differential (4)`; none
# is required on main. Grow the matrix, and the count in DIFFERENTIAL_SHARD
# with it, before a shard approaches the budget.
differential:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
with:
Expand All @@ -63,16 +76,17 @@ jobs:
run: node .github/scripts/fixture-scope.mjs
- uses: ./.github/actions/setup-quint
if: steps.fixture-scope.outputs.recompute == 'true'
- name: Replay every composed profile's reference corpus through the pull request's text
- name: Replay this shard of the composed profiles' reference corpus through the pull request's text
if: steps.fixture-scope.outputs.recompute == 'true'
env:
DIFFERENTIAL_REFERENCE: origin/${{ github.base_ref }}
DIFFERENTIAL_SHARD: ${{ matrix.shard }}/4
run: make differential
- name: Preserve differential reports
- name: Preserve this shard's differential reports
if: always() && steps.fixture-scope.outputs.recompute == 'true'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: formal-differential
name: formal-differential-${{ matrix.shard }}
path: |
.formal-traces/differential/*/report.json
.formal-traces/differential/**/replay-*/quint-test.log
Expand Down
Loading
Loading