Skip to content

M5 Phase 3: the demo's review arc becomes content instead of a constant - #64

Merged
kjpatel merged 2 commits into
mainfrom
m5-phase3-review-arc-derived
Aug 6, 2026
Merged

M5 Phase 3: the demo's review arc becomes content instead of a constant#64
kjpatel merged 2 commits into
mainfrom
m5-phase3-review-arc-derived

Conversation

@kjpatel

@kjpatel kjpatel commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Part 4b(ii)c-0, the blocker routed by #63.

demo/app.py named notice-ny in four constants — a teaching scenario's id compiled into toolkit code. A scenario now opts in 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 shape demoExtractor already 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.

That 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 now says why they are needed rather than only that they are.

Verification

975 passed, 7 skipped
verified 351 cases                                    # byte-for-byte
git diff -- golden/ fixtures/cases fixtures/receipts  # empty

The manifest change is presentation and touches no hashed body. Deletion re-measured in a detached worktree. test_review_arc derives 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.md carrying the uncovered dependency with the shape of the fix, and the changelog carrying what the removal taught.

🤖 Generated with Claude Code

kjpatel and others added 2 commits August 6, 2026 08:03
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>
@kjpatel
kjpatel merged commit 21afc6a into main Aug 6, 2026
9 of 10 checks passed
@kjpatel
kjpatel deleted the m5-phase3-review-arc-derived branch August 6, 2026 15:24
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.

1 participant