agenthropic

ADR-0003: CD-1 — Ingest source of truth, decided by the Phase-0 diff

Empirical update — 2026-07-04 desktop probe

The Phase-0 corpus probe (8-agent read-only run over the real ~/.claude/projects/ corpus, two load-bearing facts hand-verified) pre-answers CD-1:

This de-risks but does not replace the formal spike: WP-S1/WP-S5 still need the paired-capture corpus and Ivan’s tree sign-off, and the WP-S7 GO gate below still stands — no ingest/normalizer production code before it.

As-built update — 2026-07-30

Verdict: holds, strengthened. The Decision’s JSONL-primary branch is what was built, and the split is sharper in code than on paper.

One honest caveat on the procedural half of this ADR: the criterion below — “no ingest/normalizer production code until WP-S7 reports GO” — was not satisfied. Ingest was built under an owner override of that gate; see ADR-0010’s as-built update. The technical branch this ADR selects was independently borne out by the P0 proofs; the gate that was supposed to select it was bypassed.

As-built update — 2026-08-15

Verdict: unchanged; one claim narrowed. The P0 DAG-rebuild proof (apps/server/test/p0/p0-dag-rebuild.test.ts) is described above as merge-blocking. The half of that which is true is the important half: the test runs in CI on every push and pull request, and it fails the run if appending hook events changes the DAG dump — so a regression that let hooks write structure could not pass quietly. The half that is not true was the enforcement: main was unprotected when this was written. Since 2026-08-25 it is protected on the ci check, so a red run does withhold a merge — from a contributor; the owner remains exempt by design (enforce_admins: false). See the standing correction.

Neither the four-hooks finding nor the absence of SubagentStart has changed, and neither has the procedural caveat: WP-S7 never ran, and nothing since has retroactively satisfied the gate this ADR’s own criterion names.

Context

CD-1 is the canonical, build-facing formalization of ADR-0001 (LB1): it is the ten-item canonical register’s rule for how ingest primacy gets decided, not merely a restatement of what the answer might be. The risk it forecloses is procedural: both external reports (BASE, EXPANDED) reached a hooks-primary design by default, without ever running an experiment to check it, and EXPANDED went further by deferring any check to a Phase-4 UI walkthrough — by which point the schema and normalizer are already committed to an unverified premise.

Decision

Ingest primacy is decided by the Phase-0 diff (tree-from-JSONL vs tree-from-hooks), never assumed. Concretely: JSONL-primary + replay-on-startup if Phase-0 proves the JSONL log carries the subagent parent→child linkage; otherwise hooks-primary + a durable outbox. No normalizer or schema commitment is made ahead of that empirical result.

Acceptance criteria

The full quantified acceptance criteria (byte-identical replay, DAG-rebuild-from-JSONL-alone, hierarchy ≥95%) are shared with ADR-0001 (LB1) — see that ADR to avoid duplication. The criterion specific to this decision’s procedural nature:

Consequences

Alternatives considered