M5 Phase 3: the demo's review arc becomes content instead of a constant - #64
Merged
Conversation
demo/app.py named notice-ny in four constants — a teaching scenario's id compiled into toolkit code. A scenario now opts into the arc by carrying a `reviewArc` block in its manifest: which attribute to script below the pack's floor, at what confidence, what to call the result. The demo takes the first scenario declaring one, in sorted order, and names none itself. That is the same shape `demoExtractor` already had. Which demonstration the demo shows is content; that it can show one is code. This repository's arc is unchanged in every field — same id, title, case id, default as-of, domain. That was the check that mattered, because the point was to remove a name from toolkit code, not to change what the demo shows. Removing the name uncovered what it was hiding. A fixture-only deployment still gets no arc: the arc lives only in the session store, and store-backed ingest needs extraction targets that the fixture scenario does not have. One silent failure was standing in front of another, which is the recurring shape of this phase — a hardcoded path does not merely couple two things, it conceals everything downstream of itself. Fixture targets are routed to 4b(ii)c, and the plan says why they are needed rather than only that they are. test_review_arc derives the id from the suffix rather than importing a constant, so a fixture deployment would get its own. Verification: 975 passed, 7 skipped; verify 351 byte-for-byte; golden/, fixtures/cases and fixtures/receipts untouched — the manifest change is presentation and touches no hashed body; the arc re-checked field by field against a live load_scenarios(); deletion re-measured in a detached worktree. Documentation pass per CLAUDE.md: the gotcha rewritten around what is now true (content-declared, store-only, silent by design), the plan carrying the uncovered dependency, and the changelog carrying what the removal taught. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CLAUDE.md is 5,352 words and has grown 5x in a week; the gotchas are 3,139 of them, 59% of the file, in 27 bullets. That is loaded into every session, and phases 4-6 are still ahead of it. Recorded as a task on Phase 3's move rather than as its own PR, with the measurement, because the move rewrites the examples/ gotchas and creates the directory a nested CLAUDE.md belongs in — splitting first means splitting twice. Two halves. Route by directory using nested CLAUDE.md files, which stay auto-loaded: a docs/gotchas.md linked from root is the doc form of "a test that would still pass with its subject deleted", so the rejected option is written down with its reason. And a graduation rule — a gotcha exists because nothing catches the defect, so when a test starts catching it the bullet collapses to a line naming the test. Three already qualify. One landmine found in the writing: the deletion gate removes examples/CLAUDE.md one PR later. Correct for the two gotchas routed there, silent data loss for anything parked there for tidiness. Docs-only: one prose file, no code, command or path changed, so the suite and replay were not re-run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Part 4b(ii)c-0, the blocker routed by #63.
demo/app.pynamednotice-nyin four constants — a teaching scenario's id compiled into toolkit code. A scenario now opts in by carrying areviewArcblock in its manifest: which attribute to script below the pack's floor, at what confidence, what to call the result. The demo takes the first scenario declaring one, in sorted order, and names none itself.That is the shape
demoExtractoralready had. Which demonstration the demo shows is content; that it can show one is code.The check that mattered
This repository's arc is unchanged in every field — same id, title, case id, default as-of, domain — verified against a live
load_scenarios(). The point was to remove a name from toolkit code, not to change what the demo shows.Removing the name uncovered what it was hiding
A fixture-only deployment still gets no arc. The arc lives only in the session store, and store-backed ingest needs extraction targets that the fixture scenario does not have. One silent failure was standing in front of another.
Fixture targets are routed to 4b(ii)c, and the plan now says why they are needed rather than only that they are.
Verification
The manifest change is presentation and touches no hashed body. Deletion re-measured in a detached worktree.
test_review_arcderives the id from the suffix rather than importing a constant, so a fixture deployment would get its own.Documentation pass
Per CLAUDE.md's definition of done: the gotcha rewritten around what is now true (content-declared, store-only, silent by design),
docs/m5-plan.mdcarrying the uncovered dependency with the shape of the fix, and the changelog carrying what the removal taught.🤖 Generated with Claude Code