Skip to content

Follow-up to #107: review fixes and governance hardening - #108

Open
hyperpolymath wants to merge 58 commits into
mainfrom
arena/99ad561a-trope-checker
Open

hyperpolymath wants to merge 58 commits into
mainfrom
arena/99ad561a-trope-checker

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

Scope

This draft includes the current head of #107 and is intended to supersede it after the remaining blockers are resolved. It preserves #102 through #107. No other PR or branch has been merged or closed.

  • Validate the Rust prevent profile and writable effects, and correct the wiki CO-1/O4 status.
  • Reject duplicate edge IDs in both graph decoders; add a schema-valid shared regression fixture.
  • Reject absent/malformed or multiple per-module axiom-audit reports before merging them; add proof and conformance path triggers.
  • Bind artifact downloads to the triggering run and require the PR head and base scan workflow to match the trusted default before a privileged governance publisher uses run results. Test refusal of a changed workflow. The first publisher cannot run until this workflow lands on the default branch.
  • Pin harden-runner to its verified v2.22.3 commit and fetch the pinned trusted renderer without a checkout.
  • Address the remaining setup-script review findings: distinguish DragonFly, use a usable pinned binary for rpm-ostree/Guix, handle an unset PATH and fall back after unsuccessful elevation.

Known blockers / limitations

Validation

  • New proof-report predicate, publisher trust, and setup regression scripts passed; schema-valid graph fixtures, workflow YAML and embedded shell syntax checked; workflow and root-shape validation and aspect tests passed.
  • At f64f360, GitHub conformance (Rust and Idris), Lean, Agda, quality, workflow lint and SonarCloud passed. The pinned standards allowlist preflight failed, and the Hypatia scan failed with exit 139 on two successive runs; K9, DEED and fleet jobs passed.
  • Rust, Idris, Lean, Agda and GPG toolchains and GitHub release asset downloads were unavailable locally. CI must run the full conformance, proof, clippy, lockfile and review regression tests before this is ready. The lockfile entry was mechanically updated and needs authoritative CI verification.

claude and others added 30 commits October 27, 2026 07:36
… on the ratified carrier

spec/calculus.adoc was a v0.1 document (revnumber 0.1, 2026-06-22) with the
2026-07-07 ratification spliced in as notes, a separate never-merged v0.2
addendum (spec/calculus-v0.2-draft.adoc, 2026-06-23), and two design notes
carrying the operational model and the L4 analysis. It still said "seven
effects" while the vocabulary, EffectAtoms.lean and the IR say nine. A reader
— or an agent — following the spec alone got the pre-ratification world.

This folds the four into one v0.2 spec. What changed, section by section:

- §1: the object is stated as "property-instances as particulars", which every
  instance ontology supplies (tropes, modes, moments, qualities, SDCs), rather
  than as a commitment to one-category trope theory; §2 names the two
  constructs (attenuate, detach/FloatingQuality) that need instances to be
  particulars and would not survive a change of ontology.
- §3: the fate chain, bond fibring (HC-4) and merge are stated on the ratified
  carrier with A1–A3 inline; new §3.5 gives the nine-effect / nine-atom-family
  table (EffectAtoms.lean) and the two structure theorems, so "seven" and
  "nine" are reconciled: nine families, six writable, three faults.
- §4: L3 and L5 cover all three deceptive bottoms (two-sided zeros, A1); L4 is
  stated as holding in full with the Idris2/Lean/Agda lemma names; L6
  (commutativity) is new; the addendum's R-2026-06-23-02..04 become the
  cancellation structure C1–C3 with the ratified lemma names; the tropical
  factorisation re-run is recorded as (B′) sighted, with the pre-ratification
  (B) result kept as history.
- §5 T-Fuse: ⊔ is written ⊓ — the retention-order meet, "no better than its
  worse constituent" — matching the CO-1 note. Same meaning, one symbol.
- §6: the prevent/detect decision now names all three deceptive duals.
- §7: restated as greatest post-fixed point in the retention order with the
  decidable T-Fix-Decl rule, from the CO-1 note; the operational model is
  marked DESIGNED and its mechanisation OPEN.
- §8: each soundness result carries its status (exact lowering and β/let
  PROVED; conservative lowering and fix OPEN); the third firewall now cites a
  defined O5.
- §9.3: prover roles per the 2026-10-12 kernel ruling (Agda kernel, Idris2
  executable reference, Lean provenance, Rust fast core) — see ADR 0005.
- §10: O1 split into O1-carrier (PROVED) and O1-coord (OPEN, with the
  bond-transfer probe recorded as the live falsifier); O4 RESOLVED (ADR 0004);
  O5 DEFINED (adopted from the workbench proposal of 2026-07-17); O6 (ceiling
  verdict) newly opened; CO-1 listed with its DESIGNED/OPEN split.

Every lemma name cited in the spec was checked against the source files on
this branch (Idris2 Trope.*, Agda TB.*, Lean grade-boundary/* and
grade-factorisation/*). No normative rule changes semantics; the IR stays 0.2.

The README's repo map, firewall 3 and Status paragraph are brought into step;
INTEGRATION-REPORT.adoc gets a header note marking it historical rather than
being rewritten. CHANGELOG, ADR 0003 and PROOF-STATUS's dated history keep
their references to the addendum as records of what was true when written.
…n source

The `agda-theorem-b` job installed Agda from the runner's apt. ubuntu-latest is
24.04, whose agda-stdlib is 1.7.3, and Theorem B imports Data.Product.Base
(stdlib >= 2.0): the job fails at scope checking (exit 42). Reproduced here
2026-10-13 with Agda 2.6.3 / stdlib 1.7.3, exactly the runner's pair. The
workflow's own comment records a green run "under 2.6.4.3", which was a
Debian machine, not the runner. Because the workflow is paths-filtered to
verification/proofs/**, it has not run since the last proof change and the
red was never seen.

Fix: fetch the Agda 2.7.0.1 release binary and the agda-stdlib v2.0 archive,
verify both SHA-256 sums, register the stdlib under the name
theorem-b.agda-lib depends on (`standard-library`; the 2.0 archive calls
itself `standard-library-2.0`), set Agda_datadir and a UTF-8 locale. Verified
2026-10-13 with exactly these artefacts and sums: All.agda and Smoke.agda
typecheck under --safe --without-K, exit 0 (~100 s cold). The stdlib sum is
of the GitHub-generated tag archive (no release asset exists); if GitHub ever
regenerates it the checksum step fails loudly instead of testing something
else.

Also: `lean-source-honesty` and the mirroring `verify-all` recipe gated only
the two v0.1 files (GradeBoundary, GradeFactorisation). The spec now cites
GradeRatified, L4Monotonicity, TierTwoComplete, EffectAtoms and
GradeFactorisationR, so both now iterate every tracked Lean source. All eight
files pass the gate's regexes as they stand (run here).

actionlint -shellcheck= on proofs.yml: clean. The job's real run is still
needed: this sandbox has no Lean, so the lean-build matrix was not exercised.
What was wrong: PROOF-STATUS.adoc (revdate 2026-06-23) described the v0.1
carrier — a non-commutative ▷, a lax L4 that "fails on fate", CO-1 "gated by
O4", the OPEN-B/B′/C documentation gaps, "10/10" conformance — and listed as
open several results (O1 exhaustiveness, L4/L5 as lemmas) that are now proved.
A reader following it alone got the pre-ratification world.

What changed: one "Proved" table on the ratified carrier (Carrier & laws /
Cancellation / Factorisation / Metatheory / Soundness), citing only lemma names
that exist in the Idris2, Agda and Lean sources; one "Open" list matching
spec/calculus.adoc §10 (CO-1 mechanisation, O1-coord, O2, O3, O5 mechanisation,
O6) with where each is specified; the four modelling notes carried over; the
06-22 / 06-23 / 06-29 sections collapsed to one dated paragraph each under
"History", prefixed as superseded by R-2026-07-07 where they disagree.

What I ran: every cited identifier checked present by grep over
verification/proofs/{idris2/Trope,agda/theorem-b/TB,lean4} (38 + 43 + 44 names,
none missing); the acceptance grep for the stale phrases outside "== History"
returns nothing.

What I did not run: no prover in this commit (the AFFIRMATION commit carries
the runs).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
What was wrong: ROADMAP listed v0.2 as "in progress" with the v0.1 vocabulary
(CO-1 "gated by O4", the lax-L4 argument, OPEN-B/B′/C, a separate spec
addendum) although the carrier was ratified on 2026-07-07 and the spec
consolidated at v0.2.

What changed: "Shipped (v0.2)" lists the ratified carrier (ADR 0004), the Agda
carrier migration, L4 in full and L6, the atom factorisation (O1-carrier),
TierTwoComplete, the sighted factorisation re-run and the spec consolidation;
"Open problems" defers to spec/calculus.adoc §10 by reference and names CO-1
mechanisation as the next proof work; Deferred items kept.

What I ran: grep for "gated by O4|lax|OPEN-B|OPEN-C" over the file — no hits.

What I did not run: nothing else; documentation-only.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
What was wrong: the newest AFFIRMATION entry (2026-06-29) described the v0.1
carrier and cited 10/10 conformance cases and 8 schema-invalid fixtures; the
corpus has been 13 + 9 for months and the carrier was ratified on 2026-07-07.

What changed: a dated entry with an anchor (branch, commit, UTC time, exact
toolchain), one bullet per command, a short proved/open paragraph naming only
identifiers that exist, and two findings; :revdate: bumped.

What I ran (all in this session, on this branch):
  idris2 --typecheck verification/proofs/idris2/trope.ipkg   -> exit 0
  just trope-build && bash tests/conformance/run.sh           -> 13 + 9, all pass
  just trope-rust                                              -> 13 + 9, all pass
  just build-agda                                              -> PASS (All + Smoke)
  apt agda 2.6.3 + agda-stdlib 1.7.3 on All.agda               -> exit 42 (finding 1)
  lean-source-honesty regexes over 8 .lean files               -> clean

What I did not run: just build-lean (no lake / Mathlib reachable here) — written
as NOT RUN with the command named; the proofs.yml lean-build job is the
attestation and is cited in the PR.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
…n CO-1 alone

What was wrong: the NOT-REACHED footer of TB/Reduction.agda listed two
obstructions to fix-subject-reduction, the second being "a LIMIT CARRIER …
the open O4 fork (Conat-vs-tag)". ADR 0004 resolved O4 on 2026-07-07 (the
finitary carrier suffices; transfinitely deep fix is inexpressible), and the
operational model has since been designed.

What changed (comment only, no code): the footer now states one obstruction —
the operational model — DESIGNED in spec/notes/2026-07-07-co1-operational-model.adoc
(λ-trope, tagged values, T-Fix-Decl) with its mechanisation plan (that note's §6,
steps 1–5, extending this module), records O4 as RESOLVED by ADR 0004, and keeps
"NOT-REACHED, NO postulate" and the tier-stability remark.

What I ran: just build-agda (agda --safe --without-K All.agda + Smoke.agda) with
this edit in the tree -> PASS, exit 0.

What I did not run: nothing else applies.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
What was wrong: verification/proofs carried TypeSafety.v (Coq), StateMachine.tla
(TLA+) and Properties.agda — mint templates whose own text says "Replace with
your project's …", never instantiated — and the trees, usage lines and recipes
advertised a fourth and fifth prover the roles ruling does not assign here.

What changed: git rm of the three files; their lines dropped from the
verification/proofs/README.adoc and docs/status/PROOF-NEEDS.adoc trees and the
`just proof-check-coq` usage line; proof-check-coq removed from proof-check-all
and the Coq/TLA+ lines from proof-status (proof-scan-dangerous keeps its
harmless -name '*.v'); the awk's historical false-positive note no longer names
the removed file by path. The INTEGRATION-REPORT mention stays as history.

What I ran: git grep -n "TypeSafety\|StateMachine\|Properties.agda" -> only
INTEGRATION-REPORT.adoc; just proof-status -> runs (Idris2 14, Lean4 8, Agda 9
files); just proof-check-all -> runs and is red for pre-existing reasons
unrelated to this change (per-file idris2/agda checks from the repo root cannot
resolve module names; the ABI/Types Idris2 mint templates do not typecheck) —
recorded in AFFIRMATION and as an issue; just proof-scan-dangerous -> PASS.

What I did not run: coqc / tlc (not installed, and no longer referenced).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
…er roles (Proposed)

What was wrong: the spec consolidation of 2026-10-13 adopted O5, opened O6,
wrote the prover roles into §9.3 and cited "ADR 0005" for all of it, but no
ADR 0005 existed; the carrier-as-parameter question had no recorded home.

What changed: docs/decisions/0005-…adoc in the 0004 layout — Status (Proposed,
owner to accept), Context, Decisions D1–D6 (D1 v0.2 normative; D2 O5 adopted
from the workbench proposal of 2026-07-17 unchanged in substance; D3 O6 opened;
D4 prover roles per the 2026-10-12 kernel ruling; D5 three provers, templates
removed; D6 recorded-not-decided: fidelity carrier as a parameter, Phase 1A),
Consequences, Rejected alternatives.

What I ran: nothing to run; the referenced files and identifiers were checked
present (workbench note path, spec §9.3/§10, the removed templates).

What I did not run: n/a.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
What was wrong: CHANGELOG [Unreleased] stopped at the IR 0.2 normalisation and
the 2026-06 developments; the spec consolidation, the proofs.yml pin, the status
rewrites, ADR 0005 and the template removal were unrecorded.

What changed: the v0.2 consolidation line from the foot of spec/calculus.adoc;
one line each for the status-surface rewrites (T1–T4), the proofs.yml pin, ADR
0005 (Added) and the template removal (Removed). docs/status/READINESS.adoc was
grepped for the same stale phrases as PROOF-STATUS and has none, so it is
untouched (it remains the unfilled CRG template, which is not false).

What I ran: grep -nE "non-commutative|lax L4|L4 fails|OPEN-B|OPEN-C|gated by
O4|10/10|8 schema" docs/status/READINESS.adoc -> no hits.

What I did not run: n/a.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
…I Lean run

What was wrong: spec §9.3, PROOF-STATUS and verification/proofs/README said the
Lean developments' axiom audits show "propext/Quot.sound only". The proofs.yml
lean-build run on this branch (40472568287) prints the audit: Trope.nine_families
(EffectAtoms.lean), FateA.Q_add_left_cancel and FateA.atten_cancel_on_normalForms
(GradeRatified.lean) also depend on Classical.choice. GradeBoundary.lean's own
footer had listed Classical.choice all along; the surfaces overclaimed.

What changed: the three surfaces now say "no sorryAx, no user axiom; propext,
Quot.sound and, in three theorems, Classical.choice"; the AFFIRMATION entry's
Lean bullet cites the CI run (lake build succeeded for both packages; the job is
red only in lean-action's optional nanoda step, which cannot compile its
lean4export under the v4.16.0 toolchain, as on main — issue #104) and records
this as finding (3).

What I ran: read the job logs of run 40472568287 (both Lean jobs): "Build
completed successfully", one axiom line per theorem, then "nanoda check failed".

What I did not run: lake build locally (unchanged: no lake here).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
… ratified carrier

What was wrong (review findings on #102): the Reduction.agda footer said "the
gfp's fidelity lands in the absorbing tops {total, unknown}" for every fix; that
holds for a body that attenuates and recurses without bound, not for F(γ) = γ
(gfp Present) or a body that ignores its binder (finite gfp). PROOF-NEEDS.adoc
rows DOM-1/2/6/7/8 still described a non-commutative ▷, CO-1 "gated by O4", a
"lax L4", and "propext/Quot.sound only".

What changed: the footer restricts the absorbing-top argument to unbounded
attenuation and names the other cases the fix proof must cover (comment only);
DOM-1 marks non-commutativity historical and points at GradeRatified.lean,
DOM-2 drops "non-commutative", DOM-6 records CO-1 as DESIGNED (O4 resolved) with
mechanisation OPEN, DOM-7 drops the lax-L4 framing, DOM-8 records the (B′)
re-run; "propext/Quot.sound only" becomes "no user axiom".

What I ran: just build-agda after the footer edit -> PASS (All.agda + Smoke.agda);
grep -n "non-commutative\|gated by O4\|lax L4\|Quot.sound" docs/status/PROOF-NEEDS.adoc -> none.

What I did not run: n/a.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
… theorem is on

Review round 2 (Codex, CodeRabbit) on PR #102:

- proofs.yml lean-source-honesty and the `verify-all` recipe strip comments
  with tests/lib/strip-proof-comments.awk and match the bare `sorry`/`admit`
  tokens, so `:= by` followed by an indented `sorry` on the next line fails the
  gate (the old line-anchored regex passed it; ApiTypes.lean is not built by
  either Lake package, so the gate was its only check). Tested: all eight
  tracked .lean files still PASS; synthetic multiline sorry/admit now FAIL;
  "sorry-free" prose in comments still PASSes. actionlint clean.
- README / ROADMAP: "carry no axioms" -> "no `sorryAx` and no user axiom", the
  wording the axiom audit supports (propext, Quot.sound, Classical.choice x3).
- PROOF-STATUS, README, AFFIRMATION: the atom factorisation (`EffectAtoms.lean`)
  imports GradeBoundary and is a theorem about the v0.1 `Grade`; no GradeR
  restatement exists. Recorded as Open (O1-carrier on GradeR) and as AFFIRMATION
  finding (4); the spec's §6/§10 wording is left for the owner.
- PROOF-NEEDS DOM-3: symmetric cut holds on the ratified carrier
  (`cut-grade-comm`); the v0.1 refutation is historical.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J4QvDh3p24SCUjyM9HHT31
…firmation gate; make the workflow linter real

Three standards reusable pins (scorecard, governance, hypatia) referenced
commits that no longer exist in hyperpolymath/standards, so those
workflows failed at startup with zero jobs - invisible in 'gh pr checks'.
secret-scanner/mirror shared the same zero-job failure via wrapper shape.
All five are re-pinned to a verified-existing commit with the calling-job
permissions each reusable specifies, and workflow-linter now re-resolves
every external uses: ref so a phantom pin cannot rot invisibly again.

estate-audit failed its Affirmation gate: a depth-1 checkout made the
gate grade the PR test-merge commit, and the action's vendored GitHub
web-flow key is the pre-2024 expired one, so a good GitHub signature
classified as E ('cannot be checked') and failed as 'bad or revoked'.
Fetch full history, trust GitHub's current web-flow key (vendored with
provenance under .github/affirmation-trusted/), pin all 26 cicd-suite
composite actions that floated @main, add the SPDX header and top-level
permissions the file lacked, and run every gate even when one fails
instead of masking up to 18 unrun gates behind the first red.

workflow-linter's SPDX step demanded the tag on line 1, which
gh actions-lock's own banner makes impossible for every workflow
including itself; it now accepts the tag anywhere in the leading
comment block (REUSE convention) and thereby catches real misses.
Its enforcement core is now pinned actionlint + shellcheck and pinned
zizmor (hash-verified), alongside persist-credentials: false on every
checkout and env-passed values instead of template expansion in run:
scripts (template-injection class), with the three deliberate
exceptions justified inline for zizmor.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…working Lean gate suite

Agda Theorem B now typechecks under --safe --without-K
--cubical-compatible --exact-split --warning=error - in CI, in
theorem-b.agda-lib flags, in every module OPTIONS pragma, and in the
just recipes - not merely --safe --without-K on one command line.

The Lean nanoda configuration could never pass: lean-action's
run_nanoda.sh greps lakefile.toml for a [package] table these
multi-lib lakefiles do not have, so module detection failed before
nanoda ran (every Formal-proofs Lean run ever, on both packages).
It also cloned a floating debug branch at gate time and set
unpermitted_axiom_hard_error: false, so its sorryAx rejection was
advisory. Replaced with pinned, hard-failing equivalents: lake build
--wfail, leanchecker re-checking the compiled environment, and an
axiom-audit allowlist of exactly {propext, Classical.choice,
Quot.sound} over every module (non-vacuity asserted), both packages.
The source-level tripwire now also bans unsafe/extern/implemented_by
and sorryAx/ofReduceBool by token, comment-aware as before.

Curl fetches enforce HTTPS and redirects (--proto =https
--proto-redir =https --tlsv1.2 --fail) - the SonarCloud 'C' security
rating on #102's new code was these two lines.

just proof-check-{idris2,lean4,agda} no longer run per-file checks
from the repo root (red on main, per #102) or report SKIP as pass:
they run the package builds CI runs, fail when the toolchain is
absent, and fail on orphan proof files no package builds.
proof-check-coq is gone with the Coq it never checked. build-lean's
axiom audit re-elaborates every source and checks each #print axioms
receipt against the allowlist instead of grepping a silent warm build.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
- trope-check: the shipped JSON Schema is meta-validated (draft
  2020-12, strict mode), every positive fixture validated against it
  and every schema-invalid fixture rejected BY it - not jq
  well-formedness alone. The formally-typed ABI seam (abi.ipkg) is
  typechecked for the first time; the banned-construct sweep is
  comment-aware, covers all Idris2 trees, and asserts the %default
  total / covering posture per module. Rust fast-core: cargo fmt
  --check, clippy -D warnings -D clippy::pedantic over all targets,
  cargo test (never run in CI before), all --locked.
- quality: the list-and-pass steps become assertions (tracked .sh
  executable, none over 1MiB, missing core docs fail), TODO reporting
  is labelled advisory, and pinned ShellCheck runs at severity=style.
  Scripts it flagged are fixed, including two real bugs: missing
  line-continuations in maint-assault.sh and unexported variables
  consumed inside a bash -c child in the template e2e test.
- CodeQL: security-and-quality query suite for the actions extractor
  instead of the default set.
- release: git-cliff pinned + checksummed (was releases/latest with
  an asset name upstream does not publish - a guaranteed 404).
- static-analysis: panic-attack and hypatia tool sources pinned
  instead of latest/floating HEAD; hypatia pinned to the same commit
  the estate governance reusable builds.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…nt the status docs

verification/proofs/lean4/ApiTypes.lean, verification/proofs/idris2/
Types.idr and verification/proofs/idris2/ABI/* were uninstantiated
RSR template mint files ('Template - replace with your project's
...'): members of no lake/ipkg package, never compiled by anything,
and recorded in PR #102 as not typechecking. The orphan guards added
to the just proof checks flag exactly this class, so the files go the
way of T5's three templates. PROOF-NEEDS repoints at the real ABI
seam (src/interface/Abi + abi.ipkg, now CI-typechecked) or marks the
need honestly homeless; the proofs README tree/commands describe what
exists; proof-debt gains a dated addendum for its now-historical rows.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
… scoped Agda strictness, strict-clean schema, hypatia findings, Lean linter warnings

- actions.lock: an entry recording its own SHA as its ref is rejected
  by the Actions backend at job setup (estate-audit died there);
  cicd-suite ref is now the branch the commit came from ('main').
- proofs.yml Agda: CLI --exact-split -W error leaked into the stdlib's
  compilation and failed on its Data.Maybe.Base.zipWith catch-all.
  Exact-split/warnings-as-errors now live where they belong - the
  theorem-b OPTIONS pragmas + theorem-b.agda-lib flags (registered as
  a library in CI) - with a warning scan over theorem-b paths as belt.
- trope-ir schema: ajv strict mode found real gaps (contains without
  type:array; untyped conditionals; strictRequired). All fixed as
  semantics-preserving typings, proven verdict-identical to the old
  schema over every positive and negative fixture.
- --wfail did its job on first contact: three linter.unnecessarySeqFocus
  warnings in L4Monotonicity, fixed in the linter's suggested form.
- quality.yml: command-substitution while-loop returned the final
  test's status under set -e; now if-form + true.
- Hypatia's real findings: build/setup.sh curl|bash replaced with a
  pinned, checksum-verified just tarball (CWE-494); dependabot
  auto-merge gets the contents: write it actually needs;
  instant-sync skips cleanly when FARM_DISPATCH_TOKEN is absent.
- trope-check: failure-only clippy diagnostics step emitting every
  lint as a check annotation for log-free diagnosis.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…tyle-clean run blocks, wiki relocation, author-based dependabot gate

- Agda: Q-inj proved by encode-decode transport instead of matching on
  refl, so --cubical-compatible is genuinely satisfied (the refl-match
  relied on constructor injectivity Cubical cannot compute through;
  warnings-as-errors caught it on first scoped run, as designed).
- Lean: the (tac1; tac2) form must sit on one line; joined the two
  multiline comp_mono proofs.
- actionlint runs ShellCheck at every severity: all 91 run: blocks are
  now style-clean. SC2295/SC2012/SC2035 fixed properly (quoted pattern
  expansion; find-based deed count). SC2129 carries a per-block recorded
  opt-out only where one-echo-per-summary-line is a readability choice.
- estate formatting: wiki SOURCE pages move docs/wiki -> wiki/ (estate
  reserves docs/wiki* for published .md; this repo authors AsciiDoc).
  The generic docs/wikis template README goes with them.
- dependabot: job gate is the PR author (unspoofable); the actor check
  is an in-job noise reducer gating later steps, not a boundary.
- clippy diagnostics: full lint list to the step summary as well as
  the 10 annotations GitHub allows per step.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
… scope workflow secrets, and correct proof and conformance claims
…ffirmation key pinning, setup.sh portability, panic-attack from pinned source, Lean O1 on GradeR + axiom-audit compiler-decl filter

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
hyperpolymath and others added 20 commits October 28, 2026 17:27
…-repo resolver

Canary findings from bfb8168, all root-caused:

- patch-bridge.yml startup-failed and workflow-linter's lock-coverage
  step failed: the workflow was missing from actions.lock (a same-file
  edit collision dropped the entry), and GitHub's dependency locking
  refuses actions for workflows the lock does not name. Entry restored.
- quality.yml's regression harness stubs gh as a silent logger, so the
  resolver's new canonical full_name query read empty stdout as a move
  to "". Resolver now treats empty as unresolved; the stub answers
  canonical/contents queries properly, and a third fixture case proves
  a moved repository (canonical name mismatch) is rejected — the exact
  2026-10-28 outage class, now under test.
- Confirmed by annotation: fork-governance/governance/secret-scanner
  now fail ONLY on the selected-actions allow-list (cross-owner
  reusables not yet admitted for metadatastician) — an owner Settings
  action, recorded in ADR 0006 prompt S1.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…low-list

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…lus knots

Review-thread remediation for PRs #102/#107 (Codex + CodeRabbit):

- proofs.yml axiom audit could hide a source axiom given a
  compiler-internal-looking name (private axiom forged_spec): the old
  filter excused any component containing _spec/_cstage/_unfold as a
  substring and dropped violations by declaration shape. Now: anchored
  compiler-minted component shapes only; any axiom DECLARED in the gated
  sources is never excused; a violation is dropped only when nothing
  non-allowlisted remains in it. The source tripwire is token-based
  (private/protected axiom now caught) and also rejects
  addDecl/axiomDecl.
- workflow-linter resolver deduplicated by (repo, ref), so only the
  first reusable-workflow path per repo@SHA was existence-checked
  (eight of nine standards paths were unchecked). Dedup is now per
  coordinate; commit/tag resolution still happens once per (repo, ref).
- ci/CI-CRITICALITY.toml: the retired static-analysis-gate entry is
  gone (its earlier removal was clobbered) and fork-governance is
  actually listed.
- spec/calculus.adoc: 'deceptive' disambiguated into grade-deceptive
  (Falsified/Misbound/Conflated) vs fidelity-tier-deceptive
  (Unknown/top), at the Veridicality Derivation, L3 and C3, so Dropped
  absorbing Attenuated(top) no longer reads as laundering; C2 stated
  per carrier (unquotiented iff epsilon; A3-normalized finite core);
  O1-carrier now cites EffectAtomsRatified.GradeR.atom_factorization,
  the proof on the carrier in use; the detect profile is defined
  uniformly for all three deceptive duals (trope-ir aligned).
- tests/workflows/review_regressions_test.sh: regression cases for the
  per-coordinate path check and for the axiom filter (extracted
  verbatim from proofs.yml; forged_spec declared/undeclared,
  internal-decl + sorryAx, genuine IR placeholders).

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
… standards reusables

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
… debt ledger

The fork-governance K9 lane executed for the first time on 2026-10-28
(run 40782505930) once the Actions allow-list admitted the canonical
standards reusables. Verdict: 8 of 10 committed K9 files fail L0-L2
strict against contract v1.0.0 — rsr-template boilerplate and
pre-contract drafts that predate the contract (TODO placeholders,
missing pedigree.schema_version/component_type, a Hunt example with no
signature block, two .k9 files that do not parse as Nickel). Standards
grandfathered its own 25-file baseline the same way; fixing template
semantics blind, or deleting the templates, would be worse. The ledger
is shrink-only and renderer-enforced: conform-ing files must leave it,
new debt cannot join it silently, and touching a listed file voids its
exemption.

Ratchet-exception: .machine_readable/k9-contract-debt.txt — first-ever
K9 baseline for this repo; the 8 entries are the exact failing set of
run 40782505930, cross-checked locally at L1 with canonical
k9-validate.sh (standards@34cf03f9). Shrink work tracked against the
lane, entry by entry.

Also drop the curl|sh one-liner advertised in build/setup.sh (the
99-day Hypatia shell_download_then_run high): the script's own
downloads are already sha256-verified pinned archives; remote-pipe
bootstrap of the setup script itself was the indefensible part.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…ions

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…t Patch Bridge triage, axiom regression fixtures, and proof documentation
…a review round

Witness selection (Codex on calculus §6.2): both checkers scanned the
edges array in document order, so permuting the JSON changed the named
witness and a violating non-ancestor edge could be blamed. Both cores
now compute candidates as the output's ancestor DAG in topological
order with edge-ID tie-breaking (Kahn, smallest ready ID). Conformance
gains witness-permutation-a/-b: identical graphs, permuted edge
arrays, both must name e_alpha.

Rebased onto the CodeRabbit agent's f7f4139 (fork-governance
workflow_run publisher, Patch Bridge http/v1/dedupe fixes, wiki/spec/
ci-cost corrections) — overlaps union-merged: their publisher replaces
my same-repo verdict guard; my calculus/ci-cost wording kept. This
commit adds the threads that were not CodeRabbit's:
- proofs.just: mirror proofs.yml token-based axiom detection
  (private axiom, addDecl/axiomDecl) so verify-all is not weaker.
- trope-check: push paths cover abi.ipkg + src/interface.
- just e2e: depends on trope-build (no stale-binary conformance).
- rust: stable map().unwrap_or_default() for unstable map_or_default.
- instant-sync: harden-runner egress audit on the token-bearing
  dispatch job (Hypatia RE001), actions.lock updated.
- workflow-linter diagnostics: capture-and-report exit code instead of
  || true (Hypatia RE005).
- harness: undeclared-_spec_1 twin completing the declared/undeclared
  discrimination pair around source_declared_axiom.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…sure, lock order

- str_list and its two call sites use a plain match: map_or_default is
  unstable on some stable toolchains (Codex), while
  map().unwrap_or_default() trips clippy::map_unwrap_or under
  -D warnings, which tries to turn it back. The match is accepted by
  every toolchain and lint set.
- Extract the Kahn readiness predicate so its formatting is the
  rustfmt-canonical chain layout.
- actions.lock: list instant-sync actions in file-appearance order
  (harden-runner is the first step), matching gh actions-lock output.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…y entry

CI log ground truth: rustfmt wants the collect broken after '=' (the
only diff hunk), and gh actions-lock --verify-local requires a
dependencies: entry (ref/commit/owner_id/repo_id) for
step-security/harden-runner@v2.22.3, not just the per-workflow list.
SHA/IDs taken from the live repo (tag v2.22.3 -> commit 46b06ce).

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…h name

Hypatia SARIF gate (run 40789972726): workflow_audit
actions_expression_injection (critical) on fork-governance-publish —
${{ github.event.workflow_run.head_branch }} in the concurrency group.
A concurrency key is not a shell context, but there is no reason to
key on an attacker-controlled string when the head SHA is available
and the publish step already re-validates the PR head against it.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Before grade accumulation the calculus requires rejecting unknown node
references, duplicate producers and cycles as validation faults that
MUST NOT produce a verdict. Neither core enforced it: accumulation
treats a missing producer as grade ε, so a schema-valid document with
an undeclared use_model.output returned p-sufficient (Codex P1).

Both decoders now validate (lib.rs::validate_graph,
Decode.validateGraph): unique node IDs; edge inputs/outputs and
use_model.output all declared; at most one producer per node; producer
graph acyclic (Kahn). Faults ride the existing validation-fault/exit-2
channel in both CLIs. Conformance gains graph-invalid/ (7 schema-valid
fixtures, one per fault class) driven by a new run.sh loop; the
calculus paragraph that admitted the gap now records conformance.

The pre-existing corpus was machine-checked clean under the new rules
before enabling them.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
A fork PR controls the PR-side Fork governance workflow, so it could
upload a fork-governance-result artifact with correct identifiers and
arbitrary green lanes, and the trusted workflow_run publisher would
post it as github-actions[bot]. The publisher now refuses unless:
- the source run's referenced_workflows include every reusable the
  DEFAULT branch's fork-governance.yml names, at the same pins
  (a pin-bump PR simply gets no comment until merged — fail closed);
- lane pass/fail is derived from GitHub's own job conclusions for the
  run, and the artifact's lane claims must agree with them.
Rendering takes results from the API-derived lanes; only verdict
shading/grids remain artifact-sourced (produced by the proven-called
reusables). Concurrency is also keyed on fork identity + head SHA so
two forks' same-named branches cannot cancel each other's publisher
(Codex P2). jq lane derivation and the reusable-set comparison were
verified against run 40789972726's real API data.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
…/trope-checker into arena/99ad561a-trope-checker

# Conflicts:
#	.github/workflows/trope-check.yml
#	docs/wiki/Home.adoc
#	src/rust/src/lib.rs

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 127 files, which is 27 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 1d7f2a67-58a4-4939-9b33-aae89bf40730
Commits

Reviewing files that changed from the base of the PR and between 216f23b and f64f360.

Files ignored due to path filters: 1
  • .github/workflows/actions.lock is excluded by !**/*.lock
Files selected for processing: 127
  • .gitbot-fleet/enrolment.json
  • .gitbot-fleet/report-backs/README.adoc
  • .githooks/validate-a2ml.sh
  • .github/affirmation-trusted/README.adoc
  • .github/affirmation-trusted/allowed_signers
  • .github/affirmation-trusted/check.sh
  • .github/affirmation-trusted/github-web-flow-previous.gpg
  • .github/affirmation-trusted/github-web-flow.gpg
  • .github/workflows/boj-build.yml
  • .github/workflows/codeql.yml
  • .github/workflows/dependabot-automerge.yml
  • .github/workflows/dogfood-gate.yml
  • .github/workflows/estate-rules.yml
  • .github/workflows/fork-governance-publish.yml
  • .github/workflows/fork-governance.yml
  • .github/workflows/governance.yml
  • .github/workflows/hypatia-scan.yml
  • .github/workflows/instant-sync.yml
  • .github/workflows/label-triage.yml
  • .github/workflows/labels.yml
  • .github/workflows/main-estate-audit.yml
  • .github/workflows/mirror.yml
  • .github/workflows/patch-bridge.yml
  • .github/workflows/proofs.yml
  • .github/workflows/push-email-notify.yml
  • .github/workflows/quality.yml
  • .github/workflows/release.yml
  • .github/workflows/rhodibot.yml
  • .github/workflows/runtime-policy.yml
  • .github/workflows/scorecard.yml
  • .github/workflows/secret-scanner.yml
  • .github/workflows/security-policy.yml
  • .github/workflows/static-analysis-gate.yml
  • .github/workflows/trope-check.yml
  • .github/workflows/wellknown-enforcement.yml
  • .github/workflows/workflow-linter.yml
  • .github/zizmor.yml
  • .machine_readable/k9-contract-debt.txt
  • .machine_readable/root-allow.txt
  • .machine_readable/scripts/maintenance/maint-assault.sh
  • AFFIRMATION.adoc
  • CHANGELOG.adoc
  • Justfile
  • README.adoc
  • benches/template_bench.sh
  • build/just/proofs.just
  • build/just/trope.just
  • build/setup.sh
  • ci/CI-CRITICALITY.toml
  • docs/decisions/0005-v0.2-consolidation-o5-and-prover-roles.adoc
  • docs/decisions/0006-scanner-lane-sequencing.adoc
  • docs/practice/ci-cost-reduction.adoc
  • docs/proof-debt.adoc
  • docs/proposals/panic-attack-signed-suppression.adoc
  • docs/status/PROOF-NEEDS.adoc
  • docs/status/PROOF-STATUS.adoc
  • docs/status/ROADMAP.adoc
  • docs/wiki/Home.adoc
  • docs/wiki/README.adoc
  • docs/wiki/Tropical-Factorisation-Probe.adoc
  • docs/wikis/README.adoc
  • schemas/trope-ir.schema.json
  • scripts/check-no-md-in-docs.sh
  • scripts/check-root-shape.sh
  • spec/calculus-v0.2-draft.adoc
  • spec/calculus.adoc
  • spec/trope-ir.adoc
  • src/idris2/Checker/Check.idr
  • src/idris2/Checker/Decode.idr
  • src/rust/src/lib.rs
  • src/rust/src/main.rs
  • tests/aspect_tests.sh
  • tests/conformance/cases.json
  • tests/conformance/fixtures/witness-permutation-a.ir.json
  • tests/conformance/fixtures/witness-permutation-b.ir.json
  • tests/conformance/graph-invalid/cycle-self-loop.json
  • tests/conformance/graph-invalid/cycle-two-edge.json
  • tests/conformance/graph-invalid/dangling-edge-input.json
  • tests/conformance/graph-invalid/dangling-edge-output.json
  • tests/conformance/graph-invalid/dangling-use-output.json
  • tests/conformance/graph-invalid/duplicate-edge-id.json
  • tests/conformance/graph-invalid/duplicate-node-id.json
  • tests/conformance/graph-invalid/duplicate-producer.json
  • tests/conformance/run.sh
  • tests/e2e.sh
  • tests/e2e/template_instantiation_test.sh
  • tests/lib/strip-proof-comments.awk
  • tests/workflows/audit_report_test.sh
  • tests/workflows/publisher_trust_test.sh
  • tests/workflows/review_regressions_test.sh
  • tests/workflows/setup_test.sh
  • trope-checker_chora.deed
  • verification/proofs/INTEGRATION-REPORT.adoc
  • verification/proofs/README.adoc
  • verification/proofs/agda/Properties.agda
  • verification/proofs/agda/theorem-b/All.agda
  • verification/proofs/agda/theorem-b/Smoke.agda
  • verification/proofs/agda/theorem-b/TB/Grade.agda
  • verification/proofs/agda/theorem-b/TB/Honest.agda
  • verification/proofs/agda/theorem-b/TB/Order.agda
  • verification/proofs/agda/theorem-b/TB/Reduction.agda
  • verification/proofs/agda/theorem-b/TB/Substitution.agda
  • verification/proofs/agda/theorem-b/TB/Syntax.agda
  • verification/proofs/agda/theorem-b/TB/Tier.agda
  • verification/proofs/agda/theorem-b/theorem-b.agda-lib
  • verification/proofs/coq/TypeSafety.v
  • verification/proofs/idris2/ABI/Compliance.idr
  • verification/proofs/idris2/ABI/Foreign.idr
  • verification/proofs/idris2/ABI/Layout.idr
  • verification/proofs/idris2/ABI/Platform.idr
  • verification/proofs/idris2/ABI/Pointers.idr
  • verification/proofs/idris2/Trope/Coords.idr
  • verification/proofs/idris2/Types.idr
  • verification/proofs/lean4/ApiTypes.lean
  • verification/proofs/lean4/grade-boundary/EffectAtoms.lean
  • verification/proofs/lean4/grade-boundary/EffectAtomsRatified.lean
  • verification/proofs/lean4/grade-boundary/GradeBoundary.lean
  • verification/proofs/lean4/grade-boundary/GradeRatified.lean
  • verification/proofs/lean4/grade-boundary/L4Monotonicity.lean
  • verification/proofs/lean4/grade-boundary/TierTwoComplete.lean
  • verification/proofs/lean4/grade-boundary/lakefile.toml
  • verification/proofs/lean4/grade-factorisation/GradeFactorisation.lean
  • verification/proofs/lean4/grade-factorisation/GradeFactorisationR.lean
  • verification/proofs/tlaplus/StateMachine.tla
  • wiki/Home.md
  • wiki/README.md
  • wiki/Tropical-Factorisation-Probe.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath marked this pull request as ready for review October 29, 2026 11:53
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-29T11:56:48.155716Z f64f360 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@hyperpolymath
hyperpolymath enabled auto-merge (squash) October 29, 2026 15:40
@coderabbitai

coderabbitai Bot commented Oct 29, 2026

Copy link
Copy Markdown

Add Carrot credits or activate Agent usage billing to use Autofix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants