A record from the Factory repository, docs/intelligence-layout-receipt.json, shown as committed except that its local paths appear as placeholders in angle brackets, such as <local evidence archive>, standing for files that are not published. Every hash, date and count is as recorded. The build review says what the Factory's receipts support.
{
"recordedAt": "2026-09-30",
"component": "Intelligence README layout (IR) and the produce-admission fix (R13): src/intelligence.ts, README.md, docs/agents/intelligence.md",
"base": "c044d5bec7ac4d13f14321a0e1c328a76338ff11",
"baseNote": "started from cc8d5b7cce0ee82318c088890529f71d939a263c, rebased onto c044d5bec7ac4d13f14321a0e1c328a76338ff11 after the coordinator review (coordinator finding 9); c044d5b is the current merge base with main (ledger.md line 3)",
"branch": "factory/churn-p6",
"disposition": "historical; superseded by intelligence-layout-followup-receipt.json",
"scope": "Wave-1 churn packet P6 (<local evidence archive>, id P6; plan: <local evidence archive>). Two changes only: R13 corrects PRODUCE_ADMISSION to the Product gate's real key shape; IR splits the README's Intelligence table so it stays within its 25-line cap as declarations are added. No task, pin, allowance, protocol or selector rule changes.",
"r13": {
"defect": "PRODUCE_ADMISSION (src/intelligence.ts:629) required 'produce:prod-' plus 48 hex digits; product-gate.ts's productionKeyOf returns 'produce:' plus 48 hex digits with no 'prod-' infix. That mismatch would refuse every genuine verifier request as malformed (a TypeError from readProducer, never reaching a normal refusal or a choice); nothing calls chooseModel yet, so none was actually refused (coordinator-review.md finding 4)",
"fix": "PRODUCE_ADMISSION is now /^produce:[0-9a-f]{48}$/, tested directly against productionKeyOf (src/product-gate.ts, never edited); the old 'produce:prod-' shape, uppercase hex, and 47 or 49 hex digits are refused (test/intelligence-adversarial.test.ts, new case). The ADMISSION fixture in test/intelligence-adversarial.test.ts (line 15) and test/intelligence.test.ts moved to 'produce:' plus 48 zeros; every earlier assertion using it is unchanged. The doc comments at src/intelligence.ts naming the key ('the produce admission key' and the ProducerIdentity doc comment) now cite productionKeyOf directly rather than describing the key as a run id (finding 4)",
"docsNote": "docs/agents/intelligence.md's invariant 9 (line 45, above line 81) now states the corrected shape (produce:<48 lowercase hex>, exactly productionKeyOf's key), under the coordinator's packet amendment recorded in <local evidence archive> (coordinator-review.md finding 3); lines 8, 9, 29 and 48 (also above line 81) were corrected in the same amendment for staleness the new renderers introduced. The short corrective note after line 81 ('## The produce admission key (R13)') dropped its second sentence, which cross-referenced invariant 9's old shape and repeated the same overstated 'refused every genuine verifier request' claim finding 4 identifies; deleting it resolves both. No line above line 81 was added or removed, so every docs/lifecycle.md anchor into this file and into src/intelligence.ts:709 is unaffected (rechecked by test/intelligence-lifecycle-adversarial.test.ts's anchor test)."
},
"ir": {
"before": "The README's Intelligence section held one table of all 20 MODULE_INTELLIGENCE declarations (every decision), 25 lines including its heading and one paragraph: at the accepted cap, blocking any new declaration (the Factory bet's branch-health, owner-digest and owner-policy; later modules L3b, SA4)",
"after": "renderIntelligenceTable() now renders only the declarations that use or may use a model (decision optional or required: project-guidance, producer, repository-assurance today, 3 rows); renderNoneModulesLine() names the 17 'none' declarations in one line, linking to the reference, with no per-module reason (every reason is in the reference's full table, checked exactly by the rewritten README-layout test \u2014 coordinator-review.md finding 6); renderModuleIntelligenceTable() (new) renders the full 20-row table, which now lives in docs/agents/intelligence.md between new <!-- module-declarations:start/end --> markers, in a new 'Declared modules' section placed after line 81, beside the existing planned and lifecycle tables, with an intro sentence that names the renderer and its verb (finding 2). The README paragraph keeps the facts the first draft had dropped: the deterministic-first rule, that authority/records/admission/integration/Verdicts never use a model, why every task is frontier, and the pointer to the planned declarations (finding 2). The README section is 9 lines; a headroom test in test/intelligence.test.ts now builds six real synthetic ModuleIntelligence declarations (three none, three optional) and renders them through renderIntelligenceTable()/renderNoneModulesLine() (both given an optional `modules` parameter, defaulting to MODULE_INTELLIGENCE \u2014 finding 5), confirming the section would still fit at 12 lines rather than only reasoning about it arithmetically"
},
"policyDigests": {
"method": "taskPolicyDigest(taskId) for the eleven earlier tasks, compared against docs/discovery-sources-receipt.json's policyDigests.unchanged (the service-access merge receipt states they did not change); PRODUCE_ADMISSION and the renderers are outside taskPolicyDigest's enforced fields",
"result": "byte-identical; new test in test/intelligence.test.ts asserts this against a literal copy of the eleven digests (the sandboxed copy in test/intelligence-adversarial.test.ts carries only src/, docs/agents/, README.md and the test file itself, so the assertion does not read docs/discovery-sources-receipt.json at runtime)"
},
"files": {
"src/intelligence.ts": "8a7ba9be4b619577440c27eb509d5ee97117c3f9b7e33e34e87e380007085bea",
"README.md": "5f26d430abe9b3e1a1a732bc42449ce2f5211ebcdbf16b066b43557b542eede4",
"docs/agents/intelligence.md": "26a52cf7d901a42f26ad4305ac05a9b837b021328b74e392e10076e12dc74cb9",
"test/intelligence.test.ts": "702d7e34be6b16d6a5dfdfe76c07531c50655280ced5dd87055885a2de731af0",
"test/intelligence-adversarial.test.ts": "c73217fd34657ac9dae770361b23071b3bba4fb0e2524ab97bb0fa79140baad5",
"test/intelligence-lifecycle.test.ts": "2d4a16a26693a9c1bc1a4798722908fbc56f29e6d275602efa12affe94fee9d9"
},
"testChanges": "test/intelligence-adversarial.test.ts: ADMISSION fixture moved to the corrected shape; one new test (R13) against productionKeyOf and four malformed shapes. test/intelligence.test.ts: ADMISSION fixture moved; the README-layout test rewritten for the new table, none-line and reference markers (renderModuleIntelligenceTable, renderNoneModulesLine imported); one headroom test rewritten to render six real synthetic declarations through the renderers themselves rather than by arithmetic (coordinator-review.md finding 5); one new policy-digest regression test (P6-A2). test/intelligence-lifecycle.test.ts (normally forbidden to this packet): its ADMISSION fixture moved to the corrected shape, under the coordinator's packet amendment (finding 1; <local evidence archive>); no other line changed. Nothing removed or weakened; every earlier assertion of every rewritten test is kept in the new one.",
"coordinatorReview": {
"report": "<local evidence archive>",
"verdict": "FAIL, nine findings",
"amendments": "<local evidence archive> (findings 1 and 3, plus one further amendment for a full-check failure discovered while completing finding 9, below)",
"disposition": "findings 1 to 8 addressed on factory/churn-p6 by Claude Sonnet 5; see implementer.md's \"Coordinator-review fixes applied\" section for the finding-by-finding record. Finding 9 open: no full check has yet run clean (see verification.fullCheck). Independent review (Fable, then Astra) of this fixed state found both findings 1-3 above still unmet; this receipt records the further fix pass that addresses them."
},
"additionalFixBeyondReview": {
"what": "Completing finding 9 (a clean npm run check) surfaced a seventh, pre-existing full-check failure, present but undocumented in the implementer's original npm-check-1.log and not one of coordinator-review.md's nine findings: test/discovery-sources-adversarial.test.ts's \"the README's Intelligence table does not present the unreviewed discovery-sources module as accepted\" test asserted a \"| discovery-sources\" row exists in README.md. IR's own design (only optional/required declarations get a row; none declarations, including discovery-sources, render only in the none-modules line) makes that row never exist, so the assertion failed deterministically, not from host load.",
"amendment": "Recorded in packet-amendment.md (amendment 3): test/discovery-sources-adversarial.test.ts is in neither allowedPaths nor forbiddenPaths. The amendment allows rewriting exactly this one test to check the guarantee it protects (README never presents discovery-sources' review status as accepted) against the shape IR actually produces: no row of its own, named only in the none-modules line, which carries no accepted/review text for any module. No other line of the file changed; the earlier assertions in the same file (17 tests total) are untouched.",
"staleness": "This edit changes test/discovery-sources-adversarial.test.ts's bytes, so docs/discovery-sources-receipt.json's pinned hash for that file (d7c69f6e208c159962ffd11e6d3e5b2bd1090323786a75e2f07ba815eb63e1d3) no longer matches, the same way earlier Intelligence receipts already record going stale when a later change touches a file they pinned. docs/discovery-sources-receipt.json is not rewritten (old hashes are never rewritten); this note is the record of why it is now stale, for whichever review or lane refreshes it next."
},
"producer": {
"model": "claude-sonnet-5",
"effort": "high",
"role": "implementer; not the verifier",
"modelIdConfirmation": "Original producer model and effort are implementer-reported, not independently verified from launch evidence. Registry entries and a later fix session cannot establish the original dispatch."
},
"verification": {
"logDirectory": "<local evidence archive>",
"focused": {
"command": "node --test test/intelligence.test.ts test/intelligence-adversarial.test.ts",
"result": "22 passed, 0 failed (15 + 7)"
},
"lifecycleAcceptance": {
"command": "node --test test/intelligence-lifecycle.test.ts test/intelligence-lifecycle-adversarial.test.ts",
"result": "15 passed, 0 failed (7 + 8), after the coordinator-amended one-line fixture fix (finding 1; packet-amendment.md)"
},
"docsSite": {
"command": "rm -rf site && npm run docs; node --test test/docs-site.test.ts test/website.test.ts",
"result": "Built 68 pages and copied 37 assets into site; 56 passed, 0 failed"
},
"typecheck": {
"command": "npx tsc --noEmit -p .",
"result": "clean"
},
"fullCheck": {
"command": "npm run check, run twice after the fixes above, on a host that stayed busy throughout (load average 35-52; roughly 8-10 other lanes' npm run check observed running concurrently in ps both times) rather than the quiet host finding 9 asked for",
"result": "coord-fix-npm-check-1.log: 1239 tests, 1232 passed, 6 failed, 1 cancelled. coord-fix-npm-check-2.log (after the additionalFixBeyondReview fix below): 1239 tests, 1232 passed, 6 failed, 1 cancelled",
"failures": "Historical runs contained failures in executor, producer, recovery and repository suites, plus the documented deterministic discovery-sources assertion in the earlier run. Standalone reruns passed, but do not establish the causes of prior failures. See archived logs; the follow-up receipt records the clean serial 1239/1239 run.",
"note": "Historical failed runs, not packet acceptance. Standalone passes did not establish their cause. The current serial full pass is recorded in intelligence-layout-followup-receipt.json."
},
"reviewFixVerification": {
"what": "Fix pass for astra-r1.md and fable-r1.md (both VERDICT: FAIL), applied by Claude Sonnet 5, 30 September 2026. Astra findings 1-2 and Fable findings 1-3 (blocking) plus 4-7 (corrections) are addressed: the receipt's base, disposition and fullCheck.failures text above; the files hashes (test/discovery-sources-adversarial.test.ts, site/agents/intelligence.html, site/build-manifest.json, the last two recomputed after a required docs-site rebuild); amendment 3's ratification (packet-amendment.md addendum); the model-id confirmation above; ledger.md's remaining 'take part' wording and base references; docs/agents/intelligence.md:86 wording; implementer.md's section-placement claim.",
"confinedExecutorBoundariesStandalone": "Historical standalone run passed 9/9. This establishes only that rerun, not the cause of the earlier failure.",
"focusedRerun": "node --test test/intelligence.test.ts test/intelligence-adversarial.test.ts test/intelligence-lifecycle.test.ts test/intelligence-lifecycle-adversarial.test.ts test/discovery-sources-adversarial.test.ts: 54 passed, 0 failed, after the docs/agents/intelligence.md wording fix and the site rebuild. node --test test/docs-site.test.ts test/website.test.ts: 56 passed, 0 failed. npx tsc --noEmit -p .: clean.",
"serialisedFullCheck": "See intelligence-layout-followup-receipt.json: 1239/1239 passed on 30 September."
}
},
"review": []
}
