A record from the Factory repository, docs/intelligence-lifecycle-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-29T11:32:21Z",
"component": "Intelligence (src/intelligence.ts): lifecycle increment 0",
"base": "e62abe6",
"branch": "factory/lifecycle",
"disposition": "implemented, corrected after an independent adversarial pass and Astra round 1, and passed independent review (Astra round 2)",
"scope": "docs/lifecycle.md §9 row 0 only: planned declarations (extension protocols) for the nine lifecycle modules of spec §2, a discovery-window allowance, and codex-cli declared as the OpenAI provider's one route, unqualified. No lifecycle module, transport, audit, schedule, live web access or model call is built or run.",
"spec": {
"path": "<local evidence archive>",
"sha256": "c84d125badf586044f3fc57ddba22ab47d04a0da75e8649b3cd68eff8e4c86a0",
"review": "Astra round 3 PASS on the design only (<local evidence archive>, sha256 8f6fc83aa24d4e3e7db5d6b3d1ebd509edf720b62d4d7ba838bb1db99bacb2dc)",
"repositoryCopy": "docs/lifecycle.md: the spec's content with a status note (including that increment 0 defers the three Astra tasks) and its two archive paths made absolute; every file:line anchor unchanged and still pointing at what it cites (tested)"
},
"ownerDecisions": {
"state": "open: every default below is a proposal, not a signed commission",
"defaultsUsed": [
"1: signal-intake/triage, signal-intake/search and growth/draft-pack pin claude-sonnet-5 low (efficient), basis hypothesis; the selector refuses each not-measured until its own comparison (spec L3)",
"2: opportunity-synthesis/propose pins claude-opus-5-5 high",
"3: codex-cli added and the openai provider re-pointed to it; src/openai-producer.ts unchanged, accepted and unpinned",
"4: no small OpenAI model; the three gpt-6-astra xhigh tasks (signal-intake/audit, planning/challenge-opportunity, growth/review-pack) are declared as BLOCKED_TASKS with that pin only proposed, because codex exec has no dedicated effort option and the designed T2 argv sets none, so no effort is established on codex-cli; they become tasks with its audit (spec increment 7)",
"6: discovery-window allowance, a Factory admission limit, never a provider reservation; no ceiling exists yet"
]
},
"behaviourChange": "Claude models may be listed on claude-cli or the declared research route claude-cli-research (drafters only), OpenAI models only on codex-cli, so a registry listing a model on openai-responses is refused at load; gpt-6-astra is listed on codex-cli (unqualified, no established effort, providerRequests unknown) and is no tier candidate. chooseModel gains the refusal not-measured, after not-specified, for an efficient task whose basis is not measured; an efficient task's basis enters its policy digest. Registry gains an optional blocked list (BlockedTask: a task's descriptive fields and a proposed pin, no bounds, protocol, basis or policy), checked at load and allowed only where the proposed route lists no such effort; chooseModel refuses a blocked task's id with the new code blocked, and taskPolicyDigest refuses it. Allowance gains discovery-window. PLANNED_INTELLIGENCE's planning gains a source and a reworded why; LIFECYCLE_INTELLIGENCE holds the eight other lifecycle modules with five tasks; BLOCKED_TASKS the three Astra tasks; REGISTRY holds all of them. renderLifecycleIntelligenceTable renders LIFECYCLE_INTELLIGENCE for docs/agents/intelligence.md, and the README table keeps the accepted 25-line cap.",
"adversarial": {
"tests": "test/intelligence-lifecycle-adversarial.test.ts (8), unchanged, sha256 e81119c871c248ca857326d94eb8abc6e8758728ebbce9c8ad58ec6b6b2383f1",
"beforeFixes": "0 of 8 pass (<local evidence archive>)",
"dispositions": "<local evidence archive>",
"dispositionsSha256": "98d2c6aaf3e9bc5fcebd837e3efdc4c29dbe9c50abadb986ec93be673e8fdd90",
"result": "all 8 confirmed and fixed; none weakened, skipped or disputed",
"astraRound1": "FAIL, one finding (the Astra tasks left out rather than declared blocked; an overclaim about Codex's effort setting), fixed as corrected; see the dispositions"
},
"policyDigests": {
"method": "taskPolicyDigest(taskId) for every task, before (at e62abe6) and after the fixes; logs policy-digests-before.json, policy-digests-fix.json and policy-digests-fix-compare.txt under <local evidence archive>",
"unchanged": {
"project-guidance/summarise": "sha256:d80572acf57a2d8295820c18099f4b96dea310dbf4cdfda20edff0ec887afd2a",
"producer/propose": "sha256:c968ae728c657db94b3de4a07c86be013d3a9462aa3c503be5280a8011909375",
"repository-assurance/review": "sha256:576b016aaac6d4d0e4fb5cd381c95c530edb1cf89d435969a23bc02a232ac963",
"repository-assurance/fresh-scenario": "sha256:e0d63054ba0fdb23647381112cafd457df8e38e0b42e56506360febfb44b3567",
"brief/explain-trade-offs": "sha256:9ab750bbfab79dfc494d2cb557e4c78cd991400a03becfe21602f0220ac1702a",
"planning/propose-improvement": "sha256:cc1e170b76dec4cdb34121439343625f6500590854c7448d58ee3eefd79c52ba"
},
"new": [
"signal-intake/triage",
"signal-intake/search",
"opportunity-synthesis/propose",
"growth/draft-pack",
"capability-retirement/draft-case"
],
"blockedWithoutPolicy": [
"planning/challenge-opportunity",
"signal-intake/audit",
"growth/review-pack"
]
},
"files": {
"src/intelligence.ts": "1daf9cb9018d913a4258fa32c78f038628573ca7c653e8a942129d407bee7cb8",
"test/intelligence.test.ts": "aa58a143a3185a18289dc705bf5c39c0c8284808f886f87c8700e2f81fc01369",
"test/intelligence-adversarial.test.ts": "b6cc1fa6e454e0cdb1d65469bddd98e792cea7b95fae05d28e57ca701fdb8275",
"test/intelligence-lifecycle.test.ts": "dbc7b44106ce64fe673f6518bab3d086b520ba17d9bd7c73e81c778f52efeb4e",
"test/intelligence-lifecycle-adversarial.test.ts": "e81119c871c248ca857326d94eb8abc6e8758728ebbce9c8ad58ec6b6b2383f1",
"README.md": "0cb734c7185c4ca3a13a4cd9353aa2ba1f3abc9a6b7d2c507012127084b014a3",
"docs/lifecycle.md": "158f5c1accf1e3d19798d77a21215fd19ca639af664e815185ff24a89c0ab2a3",
"docs/agents/intelligence.md": "bc1a9171997292037246bab701d919e2b70fc65adf9b0590eef6302f184be621",
"site/build-manifest.json": "937af050405cc764d59b999a7f4d82efb1f40c5ace59ef75c659834deeac4b65"
},
"testChanges": "test/intelligence-lifecycle.test.ts (7 tests) holds the corrected design: the nine declarations and their pins, routes and per-call bounds, the three blocked Astra tasks and their refusal, the blocked-task checks (thirteen refused variants), discovery-window, codex-cli's missing effort, the research route and its drafter-only rule, the not-measured gate and its digest effect, and that no model becomes selectable. test/intelligence.test.ts: the planned-source check covers every non-accepted declaration; the transport binding table is partial and the agreement test covers both declared routes; the commission check refuses commissions for codex-cli and the research route; an OpenAI model on the research route is refused at load; the selection-order test expects not-measured; the README test keeps the accepted 25-line cap and proves every declaration renders in exactly one of the README and lifecycle tables. test/intelligence-adversarial.test.ts: its fixture's OpenAI model moves to codex-cli; no assertion changed.",
"producer": {
"model": "claude-opus-5-5",
"effort": "not reported to the session",
"role": "implementer and fixer; not the verifier"
},
"verification": {
"logDirectory": "<local evidence archive>",
"focused": {
"command": "node --test test/intelligence-lifecycle.test.ts test/intelligence.test.ts test/intelligence-adversarial.test.ts test/intelligence-lifecycle-adversarial.test.ts test/docs-site.test.ts",
"passed": 57,
"failed": 0,
"skipped": 0,
"log": "20-r1fix-focused.log",
"logSha256": "928ebd44244cf90b174b5542f988851695b7aa08809895f5b4188b0d46bf4870"
},
"typecheck": {
"command": "npx tsc",
"exitCode": 0,
"log": "21-r1fix-tsc.log",
"logSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"docs": {
"command": "rm -rf site && npm run docs",
"result": "Built 58 pages and copied 13 assets into site, no warnings",
"log": "19-r1fix-docs-build.log",
"logSha256": "cf5920c4750b557f04cc81ddbdcfa66deeb8f230f9fc15a7ce4348bfb0c7ae68"
},
"full": {
"command": "npm run check",
"passed": 918,
"failed": 0,
"skipped": 0,
"exitCode": 0,
"log": "22-r1fix-full-check.log",
"logSha256": "562997b412768be9c97f8d7bb586006bb9bc7e9ac9893779532288534337df7f"
},
"notRun": [
"npm --prefix apps/dashboard run check: apps/dashboard is untouched",
"scripts/render_docs.py: ReportLab is not installed here and nothing was installed, so output/pdf/software-factory-five-pages.pdf is not re-rendered for the docs/design.md term subsection and its five-page assertion is unchecked"
]
},
"review": {
"state": "PASS",
"reviewer": "gpt-6-astra, high effort, via codex exec (independent; read-only sandbox)",
"rounds": [
{
"round": 1,
"verdict": "FAIL",
"report": "<local evidence archive>",
"sha256": "fbf41ee536ac337fe3f94727f8e8a948963df7d2e23b6d952bed1701bfeec7bf"
},
{
"round": 2,
"verdict": "PASS",
"report": "<local evidence archive>",
"sha256": "032a6823989bd5ab715e313a20a804716ac6a678984d4426aac64b1154db1a9b"
}
],
"scope": "git diff e62abe6 plus untracked files, against lifecycle-spec.md §9 increment 0, AGENTS.md and the documentation obligations; it accepts local declarations only, not any lifecycle module, transport, qualification or customer value"
},
"notEstablished": [
"Any lifecycle module, schedule, collector, gate or owner bundle",
"A codex-cli Producers transport, its pinned audit or a commission (spec increment 7); that codex exec runs headless with --output-schema on the ChatGPT sign-in (A4), and how it would set an effort",
"The research profile's argv, audit or qualification (spec increment 10)",
"Sonnet 5 through the Claude transport, which binds only CLAUDE_MODEL (spec increment 6), and every efficient pin's measured comparison (spec L3)",
"An allowance ledger, ceiling or debit for discovery-window (spec increment 1)",
"Any qualified model: every task still refuses, and every blocked task always refuses"
]
}
