docs: correct what chock writes, grades and enforces - #161
Merged
Merged
Conversation
The 0.11.0 release added the stop surface and Cursor's write vocabulary, and the figures regenerated, but the hand-written prose around them did not. The README's alt text still described eight surfaces and omitted stop, so the accessible text disagreed with the picture beside it; it now mirrors the figure's own generated description. The stop count read six vendors where stop_vendors returns seven. architecture.md and concepts.md both enumerated eight surfaces without stop, against nine in the Surface enum. enforcement-surfaces.md's callout had both halves wrong: stop wires seven vendors, and the write path wires three now that Cursor records Write. agent-plugins.md listed four plugin formats against five in HOOK_FORMATS, conflating the format count with the four distribution repos. cli-reference.md described a package as a guard and an adapter, which has been incomplete since the gate, its runner and a script gate's implementations began riding along, and it described Cursor as beforeShellExecution alone, with no mention of the write gate or the turn's end. The README also pointed Copilot and VS Code at .github/hooks/agentseam.json. chock writes chock.json there; agentseam.json is agentseam's recorded vendor path, not the file chock owns. Two source comments drifted the same way: surfaces.py still listed cursor among the agents that cannot refuse a finished turn, and both it and in_agent.py miscounted the vendors with no write vocabulary. The cursor line in plugin build's own output named only beforeShellExecution. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
The ecosystem table's count was last true three policies ago; the catalog's own README badge reads 42. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
A full audit of README.md and docs/ against the source, run in scratch repos rather than read off the previous prose. The honesty claim was the least honest passage in the README. It named three grades where COVERAGE_LEVELS has eight, said a level is claimed only with an install witness when a git hook earns its grade from emission alone, and described 'enforced' as what a control that fails closed reaches. Nothing reaches enforced: this repo's own coverage.json records 168 advisory, 72 enforced-at-commit, 41 best-effort, 5 enforceable and zero enforced, and every in-agent hook fails open except Cursor's, which is configurable. The example manifest a reader is told to write would have failed the check shown directly beneath it: version, provenance, lifecycle and the security baseline were all missing. Verified by running chock check against it. The adapter pages named instruction files chock never writes. Seven of those agents read AGENTS.md natively and get no wrapper at all; Claude Code's is the repo-root CLAUDE.md, not .claude/CLAUDE.md; and the files that are written are named agentseam.*, not chock.*. Checked against chock init --agent-agnostic. getting-started promised that protect-main-branch stops an agent before it runs a command. Its gate declares commit and push, so it compiles no pre-tool surface at all. The same page misdescribed what init and new policy leave on disk, and put chock.lock inside .chock/. Also: SEC-7 repointed to what it actually checks, per spec/enforcement-matrix; the rules page moved from AGENTS.md to INDEX.md; the coverage.json example rewritten in the shape the compiler writes; the CI matrix corrected to Linux-only across three Python versions; the action pin moved off v0.1.0; the conflicts and baseline check targets documented; six gate kinds and four trust tiers, not five and three. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
jothimani-rajendran
marked this pull request as ready for review
September 23, 2026 21:21
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A full audit of README.md and every page under
docs/against the source, run in scratch repos rather than read off the previous prose. No behaviour changes: the only source edits are two comments and one help string.The honesty claim was the least honest passage in the README
It said every policy × agent is graded
enforced,enforced-at-commitoradvisory, that a level is claimed only once there is an install witness, and that a native control "that fails closed" isenforced. All three are wrong:COVERAGE_LEVELShas eight members, not three.enforced-at-commitfrom emission alone;witnessedisfalseon every commit-time and advisory cell.enforced. This repo's own.chock/coverage.json: 168 advisory, 72 enforced-at-commit, 41 best-effort, 5 enforceable, 0 enforced.fail_modeisopenfor all ten in-agent vendors except Cursor, which isconfigurable— which is exactly why Cursor is the only one reachingenforceable.For a project whose pitch is not overclaiming enforcement, this was the wrong paragraph to be wrong in.
The example manifest would have failed the check printed beneath it
The README shows a manifest as the thing you write, directly above
chock check # validate every artifact against the spec. It was missingversion,provenance,lifecycleand the security baseline. Verified by writing it into a scratch repo and running the real check; it now passes.The adapter pages named files chock never writes
Checked against
chock init . --agent-agnosticin a clean repo. Seven of the documented agents readAGENTS.mdnatively and get no wrapper file at all — Cursor, Codex, Copilot, VS Code, Gemini, Windsurf, Kimi Code. Claude Code's wrapper is the repo-rootCLAUDE.md, not.claude/CLAUDE.md. The files that are written are namedagentseam.*, notchock.*. Junie was missing from both lists despite being written. Thirteen pages also carried a literal broken-markdown line with nested backticks.getting-started promised enforcement the policy does not have
It said
protect-main-branchstops Claude Code before it runs the command. That gate declareson: [commit, push], so it compiles no pre-tool surface:.chock/compiled/protect-main-branch/holds ambient-rule, ci-gate, git-hook and managed-setting only. The same page misdescribed whatinitandnew policyleave on disk and putchock.lockinside.chock/.Everything else, each verified against source
.github/hooks/agentseam.jsonchock.json—agentseam.jsonis agentseam's path, not the file chock ownsrule.textchock check --only index, perspec/enforcement-matrix.md, which records the byte-match was never performedAGENTS.md.agents/policies/INDEX.md;AGENTS.mdkeeps a pointer blocklevel,basis,witnessed— the page already said so 15 lines laterv*tag or manual dispatchchock@v0.1.0v0.11.0, matchingaction.yml--onlylist missingconflictsandbaseline;eval exportshown as acheckflageval exportis its own commandsubagents/.agents/skills/<id>/source: localalwaysaddrecords catalog provenance; the nextsyncresets it — the two pages contradicted each otherDefinition of done
chock check→ 0 errors, 0 warnings, 0 infoschock check --only matrixpasses; no behaviour changedchock sync --repo . --checkcleanchock check --only verifycleanpytest -qgreen (1460 passed, 2 skipped)pytest acceptance/— not applicable, packaging/init/add/hook installation unchangedruff check .andruff format --check .cleanClaims
Worth a separate look: nothing in CI compares any of these numbers or paths against the source. The figure check stayed green the whole time the prose beside it drifted, and the adapter pages have been wrong for as long as those agents have read
AGENTS.mdnatively.🤖 Generated with Claude Code
https://claude.ai/code/session_01CzNYfzP8ymU3r4JB9Sz8Ha