WP-S7 gate was overridden by the owner on 2026-07-11, not
passed — ADR-0010). Open: the ≥95%-vs-labeled-corpus
criterion has never been measured; parser thresholds remain PROVISIONAL. Amended
2026-08-15, re-amended 2026-08-25 — still unmeasured; the P0 proofs described below
are merge-blocking for anyone who is not the repository owner (main is branch-protected
on the ci check; enforce_admins: false, deliberate for a single-maintainer repository)
(see the as-built updates below)concept-analysis-v2.md §2 “LB1 — Ingest primacy”,
§7 “Open questions → Phase-0 inputs” (G0.1, G0.1b)An 8-agent read-only probe of the real ~/.claude/projects corpus
(phase0-probe.md) empirically pre-answers CD-1 as
CONDITIONAL-GO → build (confidence 85/100). It de-risks this ADR’s open branch but does
not replace the formal Phase-0 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 production ingest
code before it). Three points the probe forces on the prose that follows:
Agent and Workflow spawn tools,
not Task — the real corpus has zero Task blocks (Agent = 142, Workflow = 29),
so a Task-keyed parser rebuilds an empty DAG. A general-purpose Agent spawn writes a flat
subagents/agent-<hex>.jsonl (join meta.toolUseId == the Agent tool_use.id); a Workflow
spawn writes a nested subagents/workflows/wf_<id>/agent-<hex>.jsonl. Any “Task-tool spawn” /
“JSONL Task-chain” phrasing the earlier draft used below has been corrected inline.WP-IN11 (durable outbox/spool) is pulled off the v1 critical path — a
deferrable, contingent fallback added only on a real trigger (a sub-second live-freshness need,
or hooks becoming a data source not also present in JSONL). The proven load-bearing hedges are
instead dual-layout parsing (85% nested) and child-transcript token summation (parent rollup
≈0%).Verdict: the branch resolved JSONL-primary and was built; the golden-corpus criterion that was supposed to certify it has not been run.
What is settled. Ingest is JSONL-primary. Hooks carry liveness only and cannot
write structure or tokens. The DAG rebuilds from JSONL alone after a simulated
outage, and a double replay is byte-identical — both asserted by merge-blocking P0
proofs. The Agent/Workflow correction from the desktop probe held: nothing keys
on Task.
The dual-path complexity named in Consequences did not materialize — but not
because it was avoided. SubagentStart does not exist, so the “forward-link if it
exists” arm was never needed and the reconstructor is post-hoc only. That is the
probe’s suspicion confirmed by the shipped hook installer, which wires four hooks
(UserPromptSubmit, Stop, SubagentStop, PreCompact). Edge detection turned out
to need four mechanisms rather than two, recorded per-row in
orchestration_edges.source: tool_use, directory, task_notification,
queue_operation.
Two acceptance criteria below are not met as written:
events_raw” — as built, only hooks do. JSONL is
parsed straight into the projections; see
ADR-0004’s as-built update. The
replay guarantee survives via re-reading the corpus, not via replaying rows.The WP-S7 gate this ADR defers to was overridden, not passed — see
ADR-0010.
One word above needs narrowing, and nothing else has moved. The two P0 proofs called
merge-blocking — the rebuild of the DAG from JSONL alone after a simulated outage, and
the byte-identical double replay — do run in CI on every push and pull request, and they
fail the run when violated. Until 2026-08-25 that was all they did: main was unprotected
(gh api repos/IvanBBaev/agenthropic/branches/main/protection → 404 Branch not
protected, verified 2026-08-15), so a red run withheld nothing. Since 2026-08-25 main
requires the ci check, so a red run does withhold the merge button — from a contributor,
and not from the repository owner, who is exempt on purpose (enforce_admins: false)
because this repository has a single maintainer whose normal mode is a direct push to
main. Read “merge-blocking” here, and everywhere in this ADR set, as “merge-blocking for
anyone who is not the repository owner” — see
the standing correction.
The rest of the verdict stands unchanged, including the part that matters most: the golden-corpus criterion that was supposed to certify this decision has still not been run. No hand-labelled corpus exists, the ≥95% hierarchy-accuracy gate still reports substrate unavailable rather than a number, and every parser threshold remains PROVISIONAL (LABEL-ME). Green CI against fixtures the same author wrote is not the measurement this ADR named, and no amount of it becomes that measurement.
(As built — 2026-08-15, recorded 2026-09-22: a fifth edge mechanism, legacy_explore, was
added by migration 13 on 2026-08-15 for pre-2.1.71 Explore sidecars that carry no
toolUseId; orchestration_edges.source now admits five values, not four. The hook count
and the JSONL-only reconstruction are unchanged.)
agenthropic ingests from two sources: Claude Code lifecycle hooks (sub-second, live) and
the durable ~/.claude/projects/*.jsonl transcript log (ground-truth tokens, replayable).
The single biggest architectural unknown is whether the JSONL log carries the subagent
parent→child linkage (Agent/Workflow spawn tool → child sessionId → parent ref) well enough to rebuild
the whole orchestration DAG from the durable log alone, after an outage, with no hook input.
This is not a preference — it is make-or-break for the persistent-DAG moat (docs/ai/DESIGN.md
§2.1) and for the ground-truth-tokens invariant. Both externally-produced parallel reports
(BASE, EXPANDED) silently default to hooks-primary ingest with no durability
contract, which concept-analysis-v2 identifies as their shared blind spot. It cannot be
settled on paper: a Phase-0 empirical spike (see ADR-0010, CD-8) must answer it before any
production ingest code is written.
Ingest is JSONL-primary + replay-on-startup, with hooks providing sub-second liveness only, and every write is an idempotent upsert on a stable event id — contingent on the Phase-0 spike proving JSONL carries the subagent parent→child linkage. If it does not, fall back to hooks-primary + a durable local outbox/spool (at-least-once, idempotent upsert), and only then.
The primacy decision is an output of Phase-0, not an assumption baked in ahead of it — the precise inversion of EXPANDED’s error.
From concept-analysis-v2.md §6 (“Data foundation & reconciliation” and “Tree correctness”):
events_raw with a stable idempotency key; re-ingesting the
same log yields byte-identical events_raw and an identical projected DB state.orchestration_edges/token_usage; zero data loss.Agent/Workflow spawn chain even if SubagentStart never fires.The Phase-0 verdict rule itself (development-plan.md WP-S2): JSONL-alone edge accuracy
≥95% survives a simulated outage → JSONL-primary; else hooks-primary+outbox; else NO-GO.
SubagentStart if it exists, else post-hoc reconstruction on SubagentStop — adding
branching complexity the externals did not have to plan for. Only a NO-GO on the
JSONL-alone path — JSONL genuinely cannot self-reconcile — would force the contingent
outbox/spool (at-least-once + idempotent dedupe) as required engineering. The 2026-07-04
desktop probe (phase0-probe.md) pre-answers this branch
CONDITIONAL-GO: JSONL self-reconciles by backfill (≈ 0 historical crashes), so the
outbox is YAGNI-leaning, added only on a specific sub-second-liveness or hooks-only-data
trigger — not by CONDITIONAL-GO itself.development-plan.md Track S (WP-S1…WP-S7) is the throwaway spike that
resolves this ADR’s open branch; WP-S7’s GO/NO-GO verdict gates all of Phase 1
(WP-F1). Only a hard NO-GO on JSONL-alone makes WP-IN11 (durable outbox/spool)
required; on CONDITIONAL-GO it stays deferrable (YAGNI-leaning per the probe). This ADR
should be re-read once WP-S7 reports — see the roadmap for phase
status.docs/ai/DESIGN.md §3).