Skip to content

proof(flags): canonical --cubical-compatible in force; grades as PROOF-POLICY §8 PWG - #32

Merged
hyperpolymath merged 2 commits into
mainfrom
claude/serene-sagan-un5t4q
Nov 10, 2026
Merged

hyperpolymath merged 2 commits into
mainfrom
claude/serene-sagan-un5t4q

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

PROOF-POLICY §2.1 makes agda --safe --without-K --cubical-compatible the canonical invocation. Waiver W-1 kept the flag off. It assumed that only a relational big-step semantics could remove the last 13 warnings, all just-injectivity in Noninterference.Generic. That assumption was wrong. This PR puts the flag in force without changing any statement, the semantics, or any fixture.

PROOF-POLICY §8 (owner ruling 2026-11-04) replaces "mathesis Grade 3" with Proof Witness Grades, and makes PWG-3 depend on the §2.1 invocation. So while W-1 was open the theorems were ungraded, and the docs overclaimed. With this PR they are PWG-3, and the receipt records them in the §8.5 shape.

First of the follow-ups agreed with the owner. In order:

  1. this PR;
  2. Lintel's own fix and a re-pin to this PR's merge commit;
  3. a mathesis claims-registry ADR;
  4. ⇓ as a second semantics with an adequacy theorem;
  5. the Rocq and Lean legs, re-proved, with this repo as the pilot.

Changes

  • Prelude.just-inj is defined by cong through the computing projection from-just. It matches nothing, so it needs no unification rule.
  • Noninterference.Generic. Six clauses matched refl against exec … ≡ just t. They now carry agreement through just-≈ and just-≈₂. The diff is about 25 lines.
  • scripts/proof-flags.sh adds --cubical-compatible. The gate, the laws certificate and the receipt all run under it.
  • Flag control. tests/flag-control/IndexedMatch.agda is a correct proof that only the flag refuses. scripts/check.sh fails if it is ever accepted.
  • Receipt (verification/receipts/agda_praxis.deed, renamed from agda-grade3_praxis.deed because a grade is derived and can change):
    • §8.5 fields: pwg, foundation-diverse, and each leg's route, token and §2.2 state.
    • The grade is derived from the leg states. Only RECONCILED counts.
    • PROOF-POLICY is pinned by full commit (hyperpolymath/standards 9bdf864cc7f2c8e24b4df84bf00d04158eee3ad5, §7).
  • Docs.
    • PROOF-STATUS uses only the §5 vocabulary (DESIGNED and REFUTED are gone; N-9 is a proved refutation).
    • README, EXPLAINME, proof-debt and CHANGELOG are updated. W-1 is kept, closed, for provenance.
  • Corrected along the way.
    • EXPLAINME listed --cubical-compatible as a checker flag while it was waived; that line is now true.
    • README's Lintel pin was stale: ee01db4 → d1d843b.

Why not the relational semantics for this

A probe proving determinism of c , s ⇓ t raised 22 UnsupportedIndexedMatch warnings. Inverting two derivations of the same command needs injectivity of Cmd's constructors. So ⇓ alone does not satisfy the flag. It is still planned, as a second semantics with an adequacy theorem (exec finishes ⇔ ⇓), in a later PR.

RSR Quality Checklist

Required

  • Tests pass. Local, Agda 2.6.4.3:
    • scripts/check.sh is green: core proofs, 4 expected rejections, flag control.
    • scripts/minimal-laws.sh passes: 3 laws, each needed.
    • scripts/grade-receipt.sh --check passes.
  • Linter is clean: -W error, the invisible-character scan and the escape-hatch scan.
  • No banned language patterns.
  • No banned functions, no postulates.
  • SPDX headers on the new fixture.
  • No secrets.

As Applicable

  • Documentation updated: PROOF-STATUS, README, EXPLAINME, proof-debt, CHANGELOG. scripts/check-adoc-renders.sh passes on all 174 files (asciidoctor 2.0.26).
  • Deed (status): not touched.

Testing

  • Negative controls, both directions:
    • Re-planting one original refl match makes the gate fail (exit 42, UnsupportedIndexedMatch).
    • Deleting --cubical-compatible from proof-flags.sh makes check.sh fail at the flag control (flag control accepted).
    • The fixture type-checks without the flag (exit 0), so it fails for the right reason.
  • Rejections fail for their original reasons, with no cubical warnings in their logs.
  • Grade derivation, five cases:
    • no reconciled leg → 3;
    • one RECONCILED leg → 2i;
    • two → 2ii;
    • an open token → ungraded;
    • BRIDGE-PENDING does not count.
  • Downstream: Lintel's gate is green with the flag, against this tree, after Lintel's own three-clause fix plus a computed Writes. That goes in a separate Lintel PR once this one merges.

CI evidence for the new state comes from this PR's Agda proofs run. The old run links in PROOF-STATUS were for the waived flag set, so I removed them rather than carry them forward.


Generated by Claude Code

…des as PROOF-POLICY §8 PWG

PROOF-POLICY §2.1 names `agda --safe --without-K --cubical-compatible` as the
canonical invocation; waiver W-1 kept the flag off, on the belief that only a
relational big-step semantics could remove the last 13 warnings
(`just`-injectivity in Noninterference.Generic).  That belief was wrong:

- Prelude: `just-inj` defined by `cong` through the computing projection
  `from-just`, which needs no unification rule.
- Noninterference.Generic: the six clauses that matched `refl` against
  `exec … ≡ just t` now carry agreement along `just-inj` (`just-≈`,
  `just-≈₂`).  No statement, semantics or fixture changed.
- scripts/proof-flags.sh: `--cubical-compatible` added.  Gate, laws
  certificate and receipt all run under it.
- tests/flag-control/IndexedMatch.agda + scripts/check.sh: a correct proof
  that only the flag refuses; the gate fails if it is ever accepted.
  Removing the flag was tested to fail the gate.

The relational route would not have sufficed on its own: a probe proving
determinism of `c , s ⇓ t` raised 22 UnsupportedIndexedMatch warnings
(inverting two derivations of one command needs Cmd injectivity).

Grades: "mathesis Grade 3" was the unratified brief's wording.  PROOF-POLICY
§8 (2026-11-04) supersedes it and makes PWG-3 depend on the §2.1 invocation,
so the theorems were `ungraded` while W-1 was open; they are PWG-3 now.  The
receipt carries the §8.5 fields (pwg, foundation-diverse, per-leg route,
token and §2.2 state), derives the grade from leg states (tested: one
RECONCILED leg -> 2i, two -> 2ii, BRIDGE-PENDING does not count), pins the
PROOF-POLICY commit (§7), and moves from agda-grade3_praxis.deed to
agda_praxis.deed because a grade is derived and can change.

EXPLAINME listed --cubical-compatible as a checker flag while it was waived;
that line is now true.  README's Lintel pin corrected (ee01db4 -> d1d843b).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017yYi5JxzXZs6nz1ZSForfP
@coderabbitai

coderabbitai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

Caution

Review failed

The pull request is closed.

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

hyperpolymath commented Nov 9, 2026 •

Copy link
Copy Markdown
Owner Author

Two checks fail on 3bf7f8e, Canon lockstep and estate-rules. Neither is caused by this PR.

The proof gate is green in CI. "Core proofs, countermodels, expected rejections, minimal-laws certificate" passed under --safe --without-K --cubical-compatible, including the new flag-control step.

Canon lockstep

The job compares secret-types_chora.deed's (canon …) pin with canon.lock, which it fetches live from hyperpolymath/standards main:

pin canon.lock now secret-types_chora.deed
version 2.1.5 2.1.3
gates-sha256 5c510bba… 2f31f46d…

This PR does not touch the deed. The same pin is on main, and Lintel's deed carries it too.

No fix exists yet. The fix is to bump the deed's (canon …) clause, which asserts that this repository meets the changed gates table. That is an owner decision, and it belongs in its own change.

estate-rules

just repo-init failed on a Use-this-template child. The mint test aborts on an unanswerable {{OWNER}} token in mint-probe.md.

main fails the same way: run 42514345965 on eee4e40, and on every push since the mint. The cause is the template-mint contract conflict tracked in #23. No fix exists yet, and this PR touches no mint or template files.

I'm not widening this PR for either failure.


Generated by Claude Code

@hyperpolymath
hyperpolymath marked this pull request as ready for review November 9, 2026 15:40
@chatgpt-codex-connector

Copy link
Copy Markdown
Codex Review Summary: ❌ Failed

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

Review Status Commit Review trigger
📝 Code Review ❌ Failed 2026-11-09T15:40:39.316463Z
We couldn’t complete this review. Comment @codex review to try again.
3bf7f8e 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.

@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown

Hypatia grid orange

🟠 indeterminate · commit 3bf7f8e37725 · run 42649256745 · scope: this change (13 file(s))

Advisory: 11 row(s), worst 🔴 high (0 critical, 9 high) — reported, never grading the change.

Reporter Gate Status Critical High Medium Minor Since previous revision
Hypatia scan gating 🟠 indeterminate 0 0 0 0 — no comparable baseline
panic-attack assail advisory 🟢 clean 0 0 0 0 — no comparable baseline
pons asinorum advisory 🟢 clean 0 0 0 0 — no comparable baseline
finishingbot (release readiness) advisory 🔴 high 0 9 8 2 — no comparable baseline
glambot (presentation quality) advisory 🔵 minor 0 0 0 10 — no comparable baseline
rhodibot (RSR compliance) advisory 🟢 clean 0 0 0 0 — no comparable baseline
accessibilitybot advisory ⚪ not applicable 0 0 0 0 — no comparable baseline
cipherbot advisory ⚪ not applicable 0 0 0 0 — no comparable baseline
echidnabot advisory ⚪ not applicable 0 0 0 0 — no comparable baseline
panicbot advisory ⚪ not applicable 0 0 0 0 — no comparable baseline
seambot advisory ⚪ not applicable 0 0 0 0 — no comparable baseline
sustainabot advisory ⚪ not applicable 0 0 0 0 — no comparable baseline
Hypatia scan: error — the scanner produced no findings array
  • 🟠 indeterminate: the scanner produced no findings array
panic-attack assail: 14 finding(s)
  • 14 further finding(s) in files this change does not touch: reported, not graded (0 critical, 0 high).
pons asinorum: 9 finding(s)
  • 9 further finding(s) in files this change does not touch: reported, not graded (0 critical, 0 high).
finishingbot (release readiness): 173 finding(s)
  • high V1-DOC-ROADMAP.adoc — Required file ROADMAP.adoc not found (Project roadmap).
  • high TOOL-001 — .tool-versions file not found for asdf/mise version management.
  • high SCM-001-NEUROSYM.scm — Required SCM file NEUROSYM.scm not found (Neurosymbolic AI documentation).
  • high SCM-001-AGENTIC.scm — Required SCM file AGENTIC.scm not found (Agentic AI integration documentation).
  • high SCM-001-PLAYBOOK.scm — Required SCM file PLAYBOOK.scm not found (Operational playbooks and procedures).
  • high SCM-001-ECOSYSTEM.scm — Required SCM file ECOSYSTEM.scm not found (Project's place in the ecosystem).
  • high SCM-001-META.scm — Required SCM file META.scm not found (Meta-level information and architectural decisions).
  • high SCM-001-STATE.scm — Required SCM file STATE.scm not found (Project state and progress tracking).
  • high PH-100 — Found 124 placeholders, exceeds maximum allowed (0)
  • medium V1-COM-CONTRIBUTING.md — CONTRIBUTING.md file not found (Contribution guidelines).
  • medium V1-COM-CODE_OF_CONDUCT.md — CODE_OF_CONDUCT.md file not found (Code of conduct).
  • medium V1-SEC-001 — SECURITY.md not found for responsible disclosure.
  • medium TEST-001 — Could not determine if this is a Rust or Deno project.
  • medium REL-004 — No SECURITY.md file found
  • medium CLM-006 — CHANGELOG.adoc — Documentation references non-existent file: e2e.yml.template
  • medium CLM-006 — CHANGELOG.adoc — Documentation references non-existent file: hypatia-scan.yml
  • medium PH-001 — CHANGELOG.adoc:54 — Found 'TODO' in: `FROM …:latest` lines and a body of TODO comments built nothing and failed
  • info CLM-003 — README.adoc — README missing 'Usage examples' section
  • info CLM-003 — README.adoc — README missing 'Installation instructions' section
  • 154 further finding(s) in files this change does not touch: reported, not graded (0 critical, 3 high).
glambot (presentation quality): 93 finding(s)
  • info GS-001 — Install git-seo for comprehensive SEO analysis: https://github.com/hyperpolymath/git-seo
  • info MACH-007 — ECOSYSTEM.scm not found in .machine_readable/ directory.
  • info MACH-007 — META.scm not found in .machine_readable/ directory.
  • info MACH-007 — STATE.scm not found in .machine_readable/ directory.
  • info MACH-005 — No robots.txt found. Consider adding one for crawler control.
  • info VIS-005 — README.adoc:8 — Line 209 characters exceeds max length of 80.
  • info VIS-005 — CHANGELOG.adoc:13 — Line 84 characters exceeds max length of 80.
  • info VIS-005 — PROOF-STATUS.adoc:29 — Line 83 characters exceeds max length of 80.
  • info VIS-005 — docs/proof-debt.adoc:7 — Line 83 characters exceeds max length of 80.
  • info VIS-005 — docs/EXPLAINME.adoc:4 — Line 124 characters exceeds max length of 80.
  • 83 further finding(s) in files this change does not touch: reported, not graded (0 critical, 2 high).
rhodibot (RSR compliance): 13 finding(s)
  • 13 further finding(s) in files this change does not touch: reported, not graded (0 critical, 12 high).
accessibilitybot: not_applicable — template default: enrol once the repository serves HTML
  • ⚪ not applicable: template default: enrol once the repository serves HTML
cipherbot: not_applicable — template default: enrol once the repository implements cryptography
  • ⚪ not applicable: template default: enrol once the repository implements cryptography
echidnabot: not_applicable — template default: enrol once the repository carries proofs and an ECHIDNA engine is configured
  • ⚪ not applicable: template default: enrol once the repository carries proofs and an ECHIDNA engine is configured
panicbot: not_applicable — panic-attack is already graded by the verdict grid's own panic-attack row, from static-analysis-gate.yml evidence; enrolling panicbot would report one scanner twice and give two rows that can disagree
  • ⚪ not applicable: panic-attack is already graded by the verdict grid's own panic-attack row, from static-analysis-gate.yml evidence; enrolling panicbot would report one scanner twice and give two rows that can disagree
seambot: not_applicable — template default: enrol once a seam register exists at spec/seams/seam-register.json
  • ⚪ not applicable: template default: enrol once a seam register exists at spec/seams/seam-register.json
sustainabot: not_applicable — reserved fleet slot; no adapter exists (gitbot-fleet bots/sustainabot/README.adoc)
  • ⚪ not applicable: reserved fleet slot; no adapter exists (gitbot-fleet bots/sustainabot/README.adoc)

Scope: static findings reported by each row's tool at the named commit. The table grades only findings in files this change touches, so the colour answers "does this change introduce anything?", not "what does the whole repository still carry?". Standing findings are counted in each accordion and in report.json; the baseline filter remains the place where acknowledged debt is recorded. The lane state is the worst GATING row; advisory rows are listed and counted but never set it. Purple, red, yellow and blue grade the worst GRADED finding present; orange is evidence missing, malformed or a scanner that did not run; grey is an explicit scope exclusion with its reason. No row is a security certification. report.json, badge.json and the raw findings are in the verdict-grid artifact on the linked run.

Repository owner deleted a comment from chatgpt-codex-connector Bot Nov 9, 2026
@hyperpolymath
hyperpolymath enabled auto-merge (squash) November 9, 2026 21:19
…patible proof

#30 landed the same --cubical-compatible change
on main with its own helper names. The owner chose this PR's version, so
the 7 files that only #30 touched on main (Prelude, Generic,
proof-flags.sh, grade-receipt.sh, the receipt, PROOF-STATUS and
proof-debt) keep this branch's side. CHANGELOG keeps both new entries;
the template sync (#28) and the other main changes merge cleanly.

Checked with Agda 2.6.4.3 (Debian 13 agda-bin 2.6.4.3-1+b2):
check.sh (core proofs, 4 expected rejections, flag control),
minimal-laws.sh (3 laws, each needed), and grade-receipt.sh --check
(15 modules, all sha256 verified).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136P7ZmAsYpFA9gxfQLF3F6
Signed-off-by: Claude <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit 692c521 into main Nov 10, 2026
61 of 64 checks passed
@hyperpolymath
hyperpolymath deleted the claude/serene-sagan-un5t4q branch November 10, 2026 18:51
hyperpolymath pushed a commit that referenced this pull request Nov 10, 2026
The owner chose #32 as the base for the
cubical-compatible change, so this branch now builds on it instead of
#26.

- Proof code, proof-flags.sh: #32's version (Prelude.just-inj,
  tests/flag-control/IndexedMatch.agda). The legs do not depend on the
  Agda helper names.
- Receipt: verification/receipts/agda_praxis.deed (#32's name), written
  by grade-receipt.sh --write. #32 derives each PWG from the legs' §2.2
  states, so N-1..3 and N-7..9 now carry route re-proved and state
  RECONCILED for both legs, and their grade derives as 2ii. A
  RECONCILED leg's token is proven. This branch's (legs) block, leg
  input hashes and the correspondence-record check are carried over.
- proofs.yml: #32's receipt step plus this branch's legs job.
- PROOF-STATUS, README, EXPLAINME, proof-debt: #32's wording, with this
  branch's leg facts and the new receipt path.

Checked locally with Agda 2.6.4.3, Coq 8.18.0 and Lean 4.24.0:
check.sh (core proofs, 4 rejections, flag control), minimal-laws.sh,
check-legs.sh (both legs), grade-receipt.sh --check (15 modules),
check-escape-hatches.sh and the invisible-character scan. Negative
control: removing the N-9 row from verification/legs/README.adoc makes
grade-receipt.sh --check fail with "only in grade-receipt.sh: N-9".
check-adoc-renders.sh was not run here (no asciidoctor in this session).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136P7ZmAsYpFA9gxfQLF3F6
Signed-off-by: Claude <noreply@anthropic.com>
hyperpolymath pushed a commit that referenced this pull request Nov 10, 2026
My earlier merge (ba2484f) took #32's head before #32 was updated
(3bf7f8e), because the local ref was stale. So this branch lacked main's
later changes (the template sync #28, canon 2.1.5 #27, https-only edges
#25) and kept some #26-only text. This merge corrects that.

Each conflicted file is a 3-way merge on 3bf7f8e (the #32 commit the
earlier merge used), so only this PR's legs changes are carried onto
main. Files the legs work does not own take main's version:
tests/workflows/governance_policy_test.sh, and docs/proof-debt.adoc
except its legs bullet (this restores #32's dated W-1 record). The
receipt is regenerated.

The diff against main is now the legs work: the Rocq and Lean sources,
check-legs.sh, the legs CI job, the receipt's (legs) block and RECONCILED
leg states (PWG-2ii derived), and the matching doc lines.

Checked with Agda 2.6.4.3, Coq 8.18.0 and Lean 4.24.0: check.sh,
minimal-laws.sh, check-legs.sh, grade-receipt.sh --check (15 modules),
check-escape-hatches.sh, the invisible-character scan and
tests/workflows/governance_policy_test.sh.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136P7ZmAsYpFA9gxfQLF3F6
Signed-off-by: Claude <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Nov 10, 2026
## Summary

This PR replaces #29, on the same branch. #29
was stacked on #26, and GitHub refuses to move a stacked PR's base. #26
is superseded by #30 and #32, which are both on `main`, so this PR
targets `main` directly.

It adds the two recheck legs that `PROOF-POLICY` §2 asks for, Rocq and
Lean, for every proved theory claim: N-1, N-2, N-3, N-7, N-8 and N-9.
They are hand re-proofs, because transport is not available:
Agda2Dedukti is an Agda backend pinned to a fork of Agda and cannot run
on the pinned 2.6.4.3, and no Dedukti or Lambdapi exporter to Lean 4 has
been released. Both legs check with no library and no axioms, and the
statements are compared in a §2.2 record.

`main` (#32) derives each grade from the legs' §2.2 states, and only
`RECONCILED` counts. With both legs `RECONCILED`, the 6 claims derive
`PWG-2ii`.

**For the owner to review (doctrine 4):** the statement comparison in
`verification/legs/README.adoc` was written by Claude Code and is
labelled provisional until you review it. No tool checks it. The
`PWG-2ii` grade rests on it.

## Changes

- `verification/legs/rocq/SecretTypes.v`: Coq 8.18.0, prelude only, with
no `Require`. 11 theorems. `Print Assumptions` reports "Closed under the
global context" for each.
- `verification/legs/lean/`: Lean 4.24.0, core only (the lakefile has no
`require`, so no Mathlib). 11 theorems. `#print axioms` reports "does
not depend on any axioms" for each. `exec` is defined structurally
through `run`, so no well-founded recursion brings in `propext`.
- `scripts/check-legs.sh`: pins both checker versions, refuses any
library and any `sorry`, `admit`, `Admitted`, `Axiom` or `Parameter`,
and fails unless all 22 axiom lines are clean.
- `.github/workflows/proofs.yml`: new `legs` job. Coq is pinned by its
Ubuntu package version, Lean by the sha256 of its release tarball. It
uses only the already-locked `actions/checkout` pin.
- `verification/legs/README.adoc`: the §2.2 correspondence record (route
and reason, versions and invocations, residual assumptions (none),
universe discipline, a point-by-point statement comparison, and a
claim-by-claim map from each Agda name to its Lean and Rocq names).
State: `RECONCILED`.
- `scripts/grade-receipt.sh` and
`verification/receipts/agda_praxis.deed`:
- the 6 claims carry route `re-proved` and state `RECONCILED` for both
legs, so their grade derives as `2ii`; a `RECONCILED` leg's token is
`proven`;
- the receipt gains a `(legs)` block: pins, invocations, axioms, and the
sha256 of every leg input;
- the script refuses a `RECONCILED` leg without a row in the
correspondence record, and the reverse.
- `PROOF-STATUS.adoc`, `README.adoc`, `docs/EXPLAINME.adoc`,
`docs/proof-debt.adoc`: the new grade and legs. Not `PWG-1`: no
per-commit receipt captures each checker's observed result yet. Not
foundation-diverse: Agda, Rocq and Lean are all dependent type theories.

## RSR Quality Checklist

### Required

- [x] Tests pass. Run locally with Agda 2.6.4.3, Coq 8.18.0 and Lean
4.24.0: `check.sh` (core proofs, 4 expected rejections, flag control),
`minimal-laws.sh`, `check-legs.sh`, `grade-receipt.sh --check` (15
modules), `check-escape-hatches.sh`, the invisible-character scan,
`tests/workflows/governance_policy_test.sh`, and
`tests/e2e/use_template_mint_test.sh` (self-skips: this is a minted
tree).
- [x] No banned language patterns. The new code is Lean, Coq and bash.
`lake-manifest.json` is git-ignored.
- [x] No banned functions: `check-legs.sh` refuses `sorry`, `admit`,
`Admitted`, `Axiom` and `Parameter`.
- [x] SPDX headers on every new file except `lean-toolchain`, which Lean
reads whole as the toolchain name.
- [x] No secrets.

### As Applicable

- [x] Documentation updated: PROOF-STATUS, README, EXPLAINME,
proof-debt.

## Testing

Negative controls:

- Removing the N-9 row from `verification/legs/README.adoc` makes
`grade-receipt.sh --check` fail with `only in grade-receipt.sh: N-9`.
- Touching a leg source makes the receipt check fail on that file's
sha256.

Not run locally: `scripts/check-adoc-renders.sh` (no asciidoctor in the
authoring session). CI runs it.

---
_Generated by [Claude
Code](https://claude.ai/code/session_0136P7ZmAsYpFA9gxfQLF3F6)_

---------

Signed-off-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
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