-
Upstream prerequisite: hyperpolymath/tropical-types#65 moves that package from Lean v4.13.0 to v4.35.0. No statement changes; seven proof edits for core-API drift (implicit arguments of
List.not_mem_nil,List.mem_cons_self,List.mem_map_of_mem;Nat.max_defnow unfolds to anif; new coreadd_max_add_*/add_min_add_*simp lemmas made foursimp [.., helper]calls loop). There:lake build→ 20 jobs green, and its ownlean.ymlaxiom audit, run verbatim, passes; onlyhub_ceilingmoved (propext→propext, Quot.sound, from coresimp). -
Here:
lakefile.tomlrequirestropical-resource-typingat a full commit, pinned for now to #65’s head226c9e1so this PR’s CI exercises the real dependency.scripts/fetch-siblings.shpins the same commit. Re-pin both to #65’s merge commit before merging this. -
New
Marches/TropicalAdapter.leanimportsTropicalAdapterPathand re-states none of it.bottleneck(upstream’s min-max⊗as a marchesGrade, by upstream’s laws);pathCost_eq_accum(upstream’spathCostisGrade.accum);pathCost_append_via_accum;carried_floor(hub_ceilingread as provenance);bottleneck_carries_unit(a non-empty path carries𝟙: no loop-freedom from this grade). -
track-siblings.yml: a tropical-types re-pin now also moveslakefile.tomlandlake-manifest.json, so the re-check builds marches against the new HEAD. A failed re-check restores the pins and files an issue (before, it exited red with no issue). Negative control run here: pointing the lake pin ate172f8a(v4.13-only) re-materialises that commit and fails the build (TropicalAdapterPath.lean:132:12, omega); restoring it builds green. -
KC-13: the one LINK in the correspondence table (both sides Lean, imported). README rows PROVEN / PROVEN (finite).
-
Gates on v4.35.0, verbatim:
$ lake build Build completed successfully (19 jobs). $ grep -rnw sorry Marches/ Marches.lean # empty $ lake env lean Marches/BadGadget.lean [(false, false), (true, true), (false, false), (true, true)] $ scripts/check-correspondence.sh PASS: 28 Lean names and 22 sibling names exist at the pins; both negative controls refused
#print axiomson the five new declarations:propextand/orQuot.sound, each exactly the footprint of the upstream lemma it consumes (pathCost_cons,hub_ceiling,tcMul_one_left). marches adds none. The 20 rung-3e declarations still report none. -
actionlint 1.7.7 and shellcheck clean (workflow run block extracted and checked too); Asciidoctor warning counts unchanged from
main. -
ROADMAP 3d: met on the PR-head pin; the merge-commit re-pin closes it. Rung 3 then stays OPEN only on 3f: postern still not found (
list_reposquerypostern: no match, 2026-10-27). No tag.
-
New
Marches/Provenance.lean, imported fromMarches.lean.Cut.leansaid where a well-typed trace may go; this says what it carries.-
Grade(a⊗-monoid: associativity and both units) andGrade.accum, the grade a word of labels accumulates.accum_append(a monoid homomorphism from label words) andaccum_map(reads through a relabelling). -
One region,
TropicalGrade:run_eq_seq_carried, the end signature of a run is the start⊗the grade its word carried;carried_cons_ne_one, a non-empty word carries a non-unit grade;no_return_of_carriedrecoverstropical_no_returnthrough the grade. -
Across the interface:
trace_cross_shape, a well-typed two-region trace that crosses is an A-word from an A-start, the crossing, a B-word (typing alone; no strictness used).Interface.fibreis the preimage fibre ofτ;Interface.carriedis the A-signature at the crossing as a point of it;trace_cross_lands. -
Region DAG:
DiscSys.carried_in_cutandcarried_to_cross_in_past, the grade reaching a point inside a cut, or a crossing out of↓r, is accumulated by a trace of the cut prefix alone (conditional onAcyclic, as everycomposetheorem is). -
Exhibits:
id_carries(the identity crossing carries the grade intact);zero_forgets,zero_fibre_distinguishes,collapse₀,collapse₁(a collapsing crossing forgets the A-grade, and the fibre still tells the two traces apart);trace₀ofCut.leangraded to 4.
-
-
echo-types read at
1073d60(its HEAD on 2026-10-27, shallow clone). ItsEcho f y := Σ x, f x ≡ yis "the standard preimage fiber" by its own README;EchoProvenance.agdagives the collapse and distinguish theorems. Pinned inscripts/fetch-siblings.sh(ECHO_TYPES_COMMIT);check-correspondence.shnow grepsecho-types:refs too (a fabricated echo-types name was run through it and refused);track-siblings.ymlre-pins it weekly. Nothing Agda is imported or re-declared. -
docs/kcut-correspondence.adoc: KC-9 (fibre ↔Echo,echo-intro), KC-10 (the collapse exhibit ↔provenance-collapses-at,echoes-distinguish-tag), KC-11 (graded cut-locality, KC-4 again), KC-12 (accumulation needs the⊗-monoid; K-4’s two laws supply neither associativity nor the right unit). All ASSUMED. F6 row updated. -
Gates on v4.35.0, verbatim:
$ lake build Build completed successfully (16 jobs). $ grep -rnw sorry Marches/ Marches.lean # empty $ lake env lean Marches/BadGadget.lean [(false, false), (true, true), (false, false), (true, true)] $ lake env lean Axioms.lean # #print axioms, the 20 new declarations 'Marches.Grade.accum_append' does not depend on any axioms (all 20 lines read "does not depend on any axioms") $ scripts/check-correspondence.sh PASS: 24 Lean names and 21 sibling names exist at the pins; both negative controls refused
A first proof of
no_return_of_carriedthroughNat.add_left_cancelpicked uppropext; it was reproved froma < a + carriedand is axiom-free. -
actionlint 1.7.7 clean on
track-siblings.yml; shellcheck clean on both scripts; Asciidoctor renders the edited.adocfiles without warnings.grep -ni converg Marches/Provenance.leanhits only the delimitation. -
ROADMAP 3e: met 2026-10-27. Rung 3 stays OPEN: 3d and 3f are not done. No tag.
-
hyperpolymath/cicd-suite#55 merged as
b17ec1a; the caller’s pin moves from376898b. One line changed inmain-estate-audit.yml. -
What the move brings: cicd-suite’s
manifest-checkignore-list inputs (manifest-deed-paths-ignore,manifest-k9-paths-ignore), which default to empty, so marches' behaviour is unchanged; the composite pins inside the reusable now serve current cicd-suite code; and #55 cures cicd-suite main’s redlock-transitive-closure. marches passes neither new input. -
Still de-onboarded from
actions.lock(checked withyq).b17ec1ais an ancestor of cicd-suiteorigin/main. -
Gates: actionlint 1.7.7 clean on the caller. No Lean file changed.
-
Gates on v4.35.0, verbatim:
$ lake build Build completed successfully (15 jobs). $ grep -rnw sorry Marches/ Marches.lean # empty $ lake env lean Marches/BadGadget.lean [(false, false), (true, true), (false, false), (true, true)]
-
hyperpolymath/cicd-suite#50 merged as
376898b. Its tree is identical toafa28ff, the PR head marches has called since #44 (git diff --stat afa28ff 376898bis empty). So this changes only the pin, from a PR-branch commit to a commit on cicd-suite’smain. -
track-estate-audit.ymlnow has amaincommit to compare against, and will move the pin forward weekly by PR. -
Gates: actionlint 1.7.7 clean on the caller. No Lean file changed.
-
Central Estate CI/CD Audit / estate-auditfailed after 8s for three reasons:-
The 26-step copy of cicd-suite’s workflow held here was frozen by
actions.lockatcicd-suite@5a10b72. That commit predates cicd-suite #32, which fixed the Required Files Gate. -
All 26 gates ran in one job, so the first failure hid the rest.
-
Two of the steps (
prat,semantic-audit) were stubs that could not fail.
-
-
The fix is in hyperpolymath/cicd-suite#50 and here:
-
.github/workflows/main-estate-audit.ymlis now a ten-line caller of cicd-suite’s reusable audit, pinned at a full SHA. The reusable reports five checks (governance, hygiene, manifests, languages, advisory), and each runs every gate even after one fails. It no longer runs the stubs. -
cicd-suite’s
scripts/deonboard-estate-audit.shremoved the caller fromactions.lock, a pure removal of its entry and of the three dependencies only it reached (cicd-suite@main,deed-ecosystem,k9-ecosystem). Onboarded, a cross-repo reusable call startup-fails undersha_pinning_required. The relock workflow from #41 scopes itself to tracked workflows plus those with nouses:, so it leaves the caller out. -
.github/workflows/track-estate-audit.yml(nouses:) opens a PR each week that moves the pin to cicd-suite HEAD. That PR’s own audit run is the check. It needsAUTOMATION_TOKEN.
-
-
The workflow and lock changes reached main through #41, which carried a byte-identical port of them. This PR (#44) adds this record.
-
Pin:
afa28ff, the head of cicd-suite#50, so that this PR’s pull_request run exercises the cross-repo call for real. Merge cicd-suite#50 first, then re-pin here to its merge commit. -
Gates: actionlint 1.7.7 clean on both workflows.
lake build→Build completed successfully (15 jobs).;grep -rnw sorryempty;#eval orbitunchanged. No Lean file changed. -
Local harness: cicd-suite’s 24 composite gates at
1aa6bfbwere run as composite steps (bash -e -o pipefail) against this commit. All 24 exit-
Negative control: with the gates at
5a10b72, the same harness fails required-files, which reproduces the original failure. The pull_request run of the caller is the authoritative check.
-
-
One root cause behind both red checks:
.github/workflows/actions.lockdrifted.-
Dependabot (#34) bumped
lean-action→ v1.6.1 andcodeql-action→ v4.38.2 but left the lock on v1.6.0 / v4.38.0, soCIends instartup_failure. dependabot-core still gates lock rewriting behind itsgithub_actions_lockfileexperiment. -
The lock held
cicd-suite@mainat5a10b72, before cicd-suite #32 fixed the Required Files Gate (grep -v | wc -lunder-e -o pipefailon a comment-only CODEOWNERS). That is whyestate-auditfails. The bug is already fixed upstream, so nothing needs filing.
-
-
.github/workflows/actions-lock.yml(new, nouses:) runsgithub/gh-actions-lock v0.2.0 --relockremotely. It triggers on pushes to main that change a workflow, weekly, and on dispatch. It is scoped to the workflows the lock already tracks plus every workflow with nouses:, and opens a PR only whenactions.lockalone changes. -
Track latest (maintainer preference: everything updated and checked against latest). Two weekly workflows, neither with
uses:; Lean comes from elan’s installer.-
track-lean.yml: tries the latest stable Lean and runs the three gates. Green → a PR (toolchain, README, STATE entry); red → an issue. Dry run here on v4.35.0:Build completed successfully (15 jobs).,sorrygrep empty,#eval orbitunchanged, so the first run opens a v4.35.0 PR. -
track-siblings.yml: runscheck-correspondence.shagainst each sibling’s HEAD. Green → one re-pin commit per sibling in one PR; a missing name → an issue, pin unchanged. Dry run here: choreographic-typesedb784a→ec08c7aPASS, resource-algebracf9235c→638dd3ePASS, tropical-types current. Names only; F6 still needs the diff read. -
Lean headers now point at
scripts/fetch-siblings.shinstead of naming a pin, so a re-pin leaves no stale SHA in prose.
-
-
3d decided: depend on tropical-types, tracking latest (ROADMAP).
-
Gates: actionlint 1.7.7 (with shellcheck) clean. The run itself can only be exercised on GitHub, because this sandbox cannot reach the GitHub API.
-
CodeRabbit flagged #36 (Major, security): v4.34.1 is the patched release of the 4.34 line. Verified against leanprover/lean4 rather than the bot’s summary:
v4.34.0..v4.34.1adds three runtime reference-count fixes (leanprover/lean4 #15241 sticky counts in deletion cascades, #15288 children of overflowed objects, #15307 panic instead of wrapping insharecommon_quick_fn), aBitVec.ofNatClampbackport and release preparation. marches checks only its own proofs, so the practical risk was low. Taking the patch keeps the soundness floor on the patched build at no cost. -
Gates on v4.34.1:
lake build→Build completed successfully (15 jobs).;grep -rnw sorry Marches/ Marches.leanempty;#eval orbitunchanged ([(false, false), (true, true), (false, false), (true, true)]). The v4.34.0 results below are now historical.
-
Marches/Cut.lean(3a). A cut is a predecessor-closed set of regions.-
Cut.edge_crosses_past: in an acyclic graph every edge leaves the principal cut of its source. -
Cut.path_back_crosses_no_cut: an edge on a cycle crosses no cut, soAcyclicis load-bearing. -
DiscSys.trace_cross_crosses_cut: every crossing in a well-typed trace crosses a cut holding the start, not the end. -
DiscSys.trace_mem_back,trace_inside,no_reentry: no re-entry, i.e.no_back_crosslifted to every cut. -
DiscSys.composeCut: prefix-closure. Its traces are exactly the composite’s traces that end in the prefix (composeCut_trace_embed/_reflect). -
The two-region
Interfaceversions aretrace_cross_crosses_cutandtrace_stays_in_B.CutExhibitholds a concrete trace and a negative control.
-
-
Marches/Tropical.leanTropicalGrade(3b). K-4’s two laws overTropicalNat(seq_unitl,alt_idem). S-3 inside marches:better_reverses_altLe,altLe_one(𝟙 on top, as Loss),s3_witness. -
docs/kcut-correspondence.adoc+scripts/check-correspondence.sh(3c). Lean ↔ Agda names, each pairing ASSUMED (M-2 idiom). The script fetches siblings at pins (scripts/fetch-siblings.sh,_build/dependencies) and checks names only. Pins: choreographic-typesedb784a, resource-algebracf9235c, tropical-typese172f8a. -
F6 added (
FALSIFIERS.adoc), and it FIRED on reading. MRC-01’s proposedAcyclic ↔ Consistentpairing is withdrawn: Agda’sConsistent p cis a party-indexed merge condition, and marches has no parties. F6 stays open (narrowed). -
Citation corrections found while reading the pins:
-
T-2’s
receiver-knows/sender-knowsare inInstances.agda, notTransport.agda. -
TropicalAdapterPath.leanis in hyperpolymath/tropical-types, whose lake package istropical-resource-typing, on Lean v4.13.0. -
marches'
TropicalNatis min-plus, so it is not one of M-2’s two (max-plus) objects.
-
-
Gates:
-
lake build→Build completed successfully (15 jobs). -
grep -rnw sorry Marches/ Marches.leanis empty. -
#eval orbitis unchanged ([(false, false), (true, true), (false, false), (true, true)]). -
#print axioms: every declaration added in 3a/3b depends on no axioms. -
scripts/check-correspondence.sh→PASS: 15 Lean names and 16 sibling names exist at the pins; both negative controls refused. A mutation test (one bad Lean name, one bad Agda name, one wrong pin) →FAIL, as it should.
-
-
CI anomalies, pre-existing on
main, not caused by this rung:-
CIhas ended instartup_failuresince #34. Dependabot movedlean-actionto v1.6.1 andcodeql-actionto v4.38.2 without relockingactions.lock. Fix:gh actions-lock, as in #25. -
estate-auditfails at cicd-suite’s Required Files Gate. Under-e -o pipefail, a comment-only CODEOWNERS makesgrep -v | wc -lexit 1 silently. The fix belongs in cicd-suite.
-
-
postern was not reachable (
add_repo: not found or no access; nolist_reposmatch). No cross-issue was filed. The import plan is kept in the correspondence doc. -
Status rows moved:
-
New PROVEN rows (README) for 3a/3b.
-
One ASSUMED row for the K-CUT correspondence.
-
No convergence claim (
grep -ni convergon new files hits only the disclaimers).
-
-
Rung 3 stays OPEN: 3d (TropicalAdapterPath import), 3e (echo-types bridge) and 3f (postern) are not done. No tag.
-
Maintainer decision (MRC-01 open question): move
lean-toolchainfromv4.15.0to the estate’sv4.34.0floor (F-11) before any rung-3 module is added, as its own change. -
No source change was needed: the tree at
ea1920awas built on both toolchains first, and both gaveBuild completed successfullywith no warnings and the same#eval orbit. -
Gates on v4.34.0:
lake build→Build completed successfully (14 jobs).;grep -rnw sorry Marches/ Marches.leanempty;#eval orbitunchanged ([(false, false), (true, true), (false, false), (true, true)]). -
Rung 3 still OPEN; nothing else moved.
-
Digraph foundation lifted:
Marches/Digraph.lean—RPath,RPath.snoc/trans/flip, andAcyclicmoved out of the GR namespace intoMarches.GRHierarchy.leanrefactored to consume them, so the customer→provider hierarchy (rung 1) and the region DAG (rung 2) are the SAMEMarches.Acyclic. GR proofs unchanged in substance. -
Reassembly by composition:
Marches/Reassembly.lean—-
Disciplineabstracts the shared invariant (strict order + typed step judgment whose every step worsens);Discipline.no_loopproves loop-freedom ONCE, generically. -
PathAlgebra.toDiscipline— the rung-0 kernel is an instance;toDiscipline_no_looprecoversno_return. -
DiscSys.compose(HEADLINE): a finite acyclic DAG of disciplines is itself aDiscipline. Compositebtransneeds onlyRPath.trans; compositebirreflneeds EXACTLYAcyclic S.E(the honest n-region home of the assumption);cstep_worsensis discharged from the componentwise obligations + DAG stratification, no global re-proof — the by-construction counterpart of Kirigami cut soundness. Becausecomposereturns aDiscipline, composites NEST:Reassembly.nestedComposedcomposes a composite as a region. -
Negatives:
no_foreign_local(a region’s label can’t fire from another region),no_self_cross(acyclicity ⇒ self-edge unconstructible). -
Crossing maps
τare UNCONSTRAINED — worsening is by DAG position.
-
-
Interface.strictRETIRED (roadmap-sanctioned): rung 2 confirmed order-preservation of crossing maps is never load-bearing, so the field was deleted fromCompose.Interface(and its provider inFreewheel.lean) rather than kept as a proven-unused wart. -
Gates:
lake build→Build completed successfully.(14 modules, zero deps);grep -rnw sorryempty;#eval orbitunchanged ([(false, false), (true, true), (false, false), (true, true)]). -
Claim discipline held: loop-freedom of the typed judgment is NOT protocol convergence (agda-routing’s ground); no convergence claim added anywhere.
-
GR wired into Trace:
Marches/GRTrace.lean— the five legal (relationship, signature) moves are the constructors ofGStep; ill-typed moves (valley, second peer hop, any move from ⊥) are unconstructible. Derivations fromcare EXACTLY the valley-free words (gtrace_iff_valley_free), and coincide with non-⊥ evaluation of the rung-0 table (valley_free_iff_gwalk). -
Acyclicity explicit:
Marches/GRHierarchy.lean—Acyclic T.custOfis a named hypothesis;gr_loop_freederives (node, signature) state-level loop-freedom UNDER it. Never silently discharged (F5). Convergence remains agda-routing’s ground; not claimed anywhere. -
F2 discharged:
Marches/Freewheel.lean— identity-extension algebra, inflationary but not strict;f2_dischargedexhibits a well-typed non-empty returning trace.hA/hBare load-bearing; stratification alone is not enough. FALSIFIERS F2 → held. -
Gates re-run:
lake build→Build completed successfully.;grep -rnw sorryempty;#eval orbitunchanged ([(false, false), (true, true), (false, false), (true, true)]). -
Deferred to rung 2 (unchanged): n-region DAG composition;
Interface.strictbecomes load-bearing or is deleted.
-
Repo scaffolded; six modules + root compile clean under Lean 4 v4.15.0, zero dependencies, zero
sorry. -
#eval orbitoutput (machine-evaluated):[(false, false), (true, true), (false, false), (true, true)]. -
Prior-art first sweep done; agda-routing and Kirigami found and written into LIMITATIONS; claim narrowed accordingly before first commit — no retraction debt.
-
Known deferred items: F2 counterexample (rung 1); GR↔Trace wiring (rung 1);
Interface.strictcurrently unused (rung 2 or delete); LICENSE text TODO (copy from palimpsest-license, do not improvise).
Rung 3 (see ROADMAP.adoc), the remaining items. 3d: once
hyperpolymath/tropical-types#65 merges, re-pin lakefile.toml,
lake-manifest.json, scripts/fetch-siblings.sh and the correspondence
pin table to its merge commit (one sed of the SHA; then lake build and
scripts/check-correspondence.sh). 3e: met 2026-10-27
(Marches/Provenance.lean). 3f: file the postern cross-issue once that
repository exists. Obtain the real files; never reconstruct from memory.
One rung only.