Problem
PR CI (know-code verify) fails after a normal range quiz → know-code commit → push, while local verify passes.
Root cause: pass-time range hash included staged: material; after commit CI only has merge-base..HEAD (no gitignored range-seal.json / gate.json). Local green path used range-seal-pass. Default pull_request checkout is also a merge commit without trailers.
Seen on #7: expected 104454c6… (merge-base..HEAD), trailer was passHash 4a6e5b6a….
Fix
- Tree-canonical range hash:
fromOid^{tree} → write-tree (stable staged↔committed)
- Workflow: checkout
pull_request.head.sha, write requireTrailer: true
scripts/smoke-verify-ci.sh — e2e without local seal artifacts
- Docs:
website/docs/verify.md
Acceptance
Related: #6 / #7 (Actions bumps). Threat model: CI proves trailer↔tree match only — not comprehension.
Problem
PR CI (
know-code verify) fails after a normal range quiz →know-code commit→ push, while local verify passes.Root cause: pass-time range hash included
staged:material; after commit CI only hasmerge-base..HEAD(no gitignoredrange-seal.json/gate.json). Local green path usedrange-seal-pass. Defaultpull_requestcheckout is also a merge commit without trailers.Seen on #7: expected
104454c6…(merge-base..HEAD), trailer was passHash4a6e5b6a….Fix
fromOid^{tree} → write-tree(stable staged↔committed)pull_request.head.sha, writerequireTrailer: truescripts/smoke-verify-ci.sh— e2e without local seal artifactswebsite/docs/verify.mdAcceptance
npm run smoke:verifygreen (strip.know-codeseals after commit, then verify)know-codecheck without relying on local seal filesRelated: #6 / #7 (Actions bumps). Threat model: CI proves trailer↔tree match only — not comprehension.