Factory docs, home
Page navigation

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"
  ]
}

Source: docs/intelligence-lifecycle-receipt.json