reconcile: CP2 binds the invoked export, and S23.4's Open guard is bounded - #118
Merged
Conversation
…unded Two divergences found against the tree at 9cf09d0 and decided. CP2 read "content/ has exactly one production writer, and it writes nowhere else", and § Public surface forbade any parameter that writes elsewhere or writes a subset. exportContent takes both as arguments, and the exporter's error table needs them: CampaignDidNotBuild and ValidationRejected want a failing catalog, WriteFailed a real filesystem rejection that cannot be aimed at the published directory. Scoped the contract to the invoked surface, stated the seam and the obligation it carries, and corrected the evidence check's title and comment - it resolves writes to the binding spelled outputDir, which inside exportContent is the argument, not the module constant. S23.4 asserted the S16.5 item is still in ## Open by slicing to the next ## heading, which does not exist - so it searched the whole 93 KB log and passed with the item anywhere in it. Bounded on the --- that closes the section. Verified by reverting: it now fails with the item relocated to either of two positions among the dated entries. Descriptive corrections: agent.md's instruction and graphify-trap pointers named CLAUDE.md, which has been a pointer to AGENTS.md since the 2026-08-20 flip; its orientation said "game specs only", which the 2026-08-30 ownership decision contradicts; and the 04 size figure was ~104/~105 KB against an actual 114.5 KB. Gates: Test-SpecSet 0, Test-Companion 0, Test-DesignState 0 findings (exit 2 on TrackerUnavailable only - no gh here), npm run check clean, Pester 338/353 with the same 15 environmental failures before and after.
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.
Summary
A reconciliation pass against the tree at
9cf09d0. Two divergences found, both decided, both applied.1. CP2's "writes nowhere else" contradicted the exporter's own signature. CP2 read "
content/has exactly one production writer, and it writes nowhere else", and § Public surface added that no parameter may make it write elsewhere or write a subset.exportContent(catalogEntries, outputDir)has both, one level below the command line, and the exporter's error table needs them —CampaignDidNotBuildandValidationRejectedwant a catalog that fails, andWriteFailedwants a filesystem that rejects a real write, which the 2026-09-01 decision chose over a stub and which cannot be aimed at the published directory without publishing from it. Scoped the contract to the invoked surface (main()and the CLI), stated the seam and the obligation it carries, and corrected the evidence check's title and comment: it resolves writes to the binding spelledoutputDir, which insideexportContentis the argument shadowing the module constant, so it proved less than its name read. Same move as the 2026-08-31 CP2/CP3 production-source scoping, one level down.2. S23.4's
## Openguard guarded nothing. The bullet in## Opensays the S16.5 item is kept there after filing "because S23.4's test asserts this exact entry stays in## Open". It sliced from## Opento the next##heading — and## Openis the last one in the file, so the bound was-1and the assertion searched all 93,055 of the log's 93,211 bytes. It has asserted nothing since it landed at79da1c8. Bounded on the---that closes the section.Descriptive corrections alongside:
agent.mdpointed atCLAUDE.mdfor standing instructions and the graphify--updatetrap (both moved toAGENTS.mdin the 2026-08-20 flip); its orientation said "game specs only", which the 2026-08-30 ownership decision contradicts; and04-engine-specification.md's size was stated as ~104/~105 KB inagent.mdand twice inAGENTS.mdagainst an actual 114.5 KB, a figureagent.mduses for token budgeting.Nothing in
design/30-slices.mdwas touched, and no unlanded slice's criteria were edited.Test plan
Verified by reverting, as the repository requires:
Gates run, with what each reported:
tools/Test-SpecSet.ps1tools/Test-Companion.ps1tools/Test-DesignState.ps1unit/document/design-20-contractat 14,417 of 16,384 bytes, unchanged. Exit 2 onTrackerUnavailableonlynpm run checkcontent/matches the sourcesInvoke-Pester -Path toolsWhat did not run cleanly, and why it is not this change: the 15 Pester failures are
Wait-PullRequestCheck(12),Invoke-DoneHousekeepingworktree cases (3, counted within),Update-DesignProjectionS7.10 andTest-DesignStateS12.5/S18.6 — all of them needingghor git-worktree support absent from this environment. The identical 15 fail on a pristine checkout of9cf09d0, confirmed by stashing this branch's changes and re-running.Test-DesignState.ps1's exit 2 has the same cause and is the behaviour20-contract.md§ Could not evaluate specifies.Two decision-log entries were appended with matching
design/state/decisions/records, and the projection regenerated before the checker ran, perAGENTS.md§ Writing a design-state record. Neither id was added to a unit'sLive: both write their terms into their site in this same change, which is step 4's absorption case — recorded in the site alone, sinceStatedInis not in the pinned kit's record grammar (issue #113, blocked upstream).No AI-attribution footer, per
AGENTS.md§ House conventions.Generated by Claude Code