Pipeline Seam Audit — 2026-07-05

Scope: read-only trace of the lifecycle chain — ingest → lint → audit(harvest) → consolidate → surfaces, plus the weave / speculate / sign-off side chains — at schema v0d.25 (same-session, after the audit-v2 redesign landed at commit b986cd89). No workflow was executed; no orchestration built. Method: full read of all eleven skill files + CLAUDE.md + NEXT.md + artifact/script existence checks, asking at every seam: (1) does the upstream close-out state the downstream trigger mechanically? (2) does every artifact have exactly one owner workflow? (3) are there contradictory leftovers (pre-v0d.24 halt language, stale cross-references, dead file paths)?

Headline: the chain is structurally sound post-v0d.25 — no orphaned artifacts, no dead file paths, all subagent/script references resolve. The defects found are seam-pointer gaps (upstream close-outs that don't name their downstream) and four contradictory leftovers, the worst being lint item 18 still instructing lint to merge claim entries directly (now consolidate C1's job). 12 cheap fixes applied this session (marked ✅ below); 3 larger items specified as future work, not built.


1. Seam map

Main chain

Seam Close-out states downstream trigger? Verdict
raw/ → ingest User-triggered by definition; ingest skill's when_to_use covers it. OK
ingest → audit (Harvest) Extraction-note Claim Candidates section + Step 2 plan both say "defer to the audit Harvest phase" — but the close-out (Steps 9–12) never says where the candidates queue or that NEXT.md wants a refresh after any ingest (NEXT.md §Authority says it does; the ingest skill never mentions NEXT.md). Audit's trigger conditions (≥10 ingests, major-volume ingest) are counted by nobody mechanically. GAP-4 ✅ fixed (close-out pointer added); trigger counting → future item F2
ingest → lint None needed — lint is periodic/user-triggered, and ingest Step 7 already runs the claims-integrity check inline. OK
lint → consolidate Item 21 (dead claim refs) correctly routes claim-shaped findings to Harvest. Item 18 (duplicate claims) still instructs lint to merge entries directly — pre-v0d.24 leftover; merge is a retirement-queue leg owned by consolidate C1. Double-ownership with contradictory instructions. GAP-1 ✅ fixed (item 18 now detect-and-route)
audit (Harvest) → consolidate Harvest section states "the register is the queue"; the C2 pre-gate re-enumerates mechanically — the strongest seam in the chain (no routing artifact needed at all). Close-out lacked the one-line pointer; H2 walk-list didn't name consolidate C4 reservoir worksheets as an input. GAP-7, GAP-8 ✅ fixed (two pointer sentences)
consolidate → surfaces C5 owns cite-back, normalizers, baselines, digest, log, NEXT.md row updates — fully specified. OK
consolidate → next consolidate OPS-015 says "repeat until the pre-gate runs dry" but the skill itself never states the re-trigger condition. GAP-6 ✅ fixed (run-until-dry pointer in C5); loop wiring → future item F1
consolidate internal: C0 ↔ parked ledger The Parked-ledger section claims "C0 step 5 re-reads the ledger and unparks…" but C0 step 5 as written reads only the speculative promotion ledgers. consolidation-parked.md also does not exist yet (no run yet) and no step says to create it. GAP-3 ✅ fixed (C0 step 5 now reads/creates the parked ledger)

Side chains

Seam Verdict
weave → bridge-card-signoff Pass 3 stages cards at Status: proposed and the card template cites the sign-off skill's §3.5/§20 — but Pass 5 (close-out) never names the sign-off batch as the downstream trigger for staged cards, nor consolidation C2 for emitted candidates. GAP-9 ✅ fixed (close-out pointer).
bridge-card-signoff → apply-mode → surfaces Clean: per-card Approved by maintainer: gate, bridge-cards-applied.md provenance register, destination-page markers, lint enforcement (check_bridge_card_provenance), §12f hand-apply path explicitly scoped. Best-documented seam in the system. OK.
speculate → speculate-signoff The speculate skill never mentions speculate-signoff. Its §Promotion pathway describes only the pre-v0d.12 manual maintainer route; Phase 6 close-out hands off to the user with file paths and no downstream trigger. The codified jury path exists only from the signoff side (its when_to_use) and from CLAUDE.md. GAP-2 ✅ fixed (Promotion pathway now names speculate-signoff as the standard route, standalone or C4; manual path kept as fallback).
speculate-signoff → claims.md / consolidate Clean post-v0d.24/25 (Agent-B reconciliation this session): Phase 6 per-verdict actions, C4 parking, supported-routing all consistent; verdict-table contradiction fixed at commit b986cd89. OK.
speculate trigger-exclusion wording Line 70 justified the don't-run-inside-other-workflows rule via "the human-review HALTs those workflows rely on" — stale post-v0d.24/25 (audit has one hard halt; consolidate has none). Rule still correct, rationale stale. GAP-10 ✅ fixed (reworded to caps/quarantine rationale).
ops-ledger ↔ everything Step 2 evidence list was updated for v0d.25 (audit digests) this session, but: the step-6 workflow: enum omits consolidate (NEXT.md's OPS-015 already uses it — a refresh agent classifying strictly by the enum would have no bucket for the highest-leverage open item), and the step-3 evidence list omits consolidation digests + parked ledger. GAP-5 ✅ fixed (both).
NEXT.md open-item text OPS-004 (open, execution-ready) done_when still says "Supported HALT applies if any L-set item yields a candidate claim" — instructs a mechanism retired at v0d.24. Closed-item HALT mentions (OPS-001/002/015 histories) are records and stay verbatim. GAP-11 ✅ fixed (OPS-004 done_when now routes candidates to the register/consolidation).

2. Artifact ownership

Artifact Owner (writes) Other writers Verdict
wiki/sources/.extraction-*.md ingest (creates, full structure) audit Keys appends ## Silent Keys OK — dual-write documented on both sides
wiki/claims.md bodies consolidate (all status moves) audit Harvest + speculate-signoff Phase 6 + ingest (registration only, at candidate/ratified live) OK — disjoint verbs, each documented; derived surfaces owned solely by normalize_claims_table.py
wiki/motifs.md audit Motifs (aggregation) ingest 6a (entry edits), weave Pass 2 (wiki-home fields) OK — weight changes park/never-autonomous everywhere
wiki/.audit/audit-{date}.md (digest) audit OK (new at v0d.25; ops-ledger step 2 reads it)
wiki/.audit/consolidation-{date}.md (digest) consolidate OK (none exist yet — no run yet)
wiki/.audit/consolidation-parked.md consolidate speculate-signoff C4-mode parking (inside a consolidation run — same run context) Was internally drifted (C0 didn't read it; nothing creates it) — fixed
wiki/.audit/claim-retirement-queue-*.md consolidate C0 (generator script) may be generated read-only anytime OK post-v0d.25
Phase-8/Harvest reservoir (synthetic-layer-*.md unpromoted rows) audit (writes reports) consolidate C4 (enumerates → worksheet), Harvest (registers from worksheets) OK — split by design; walk-list now names C4 worksheets
wiki/.audit/bridge-cards-applied.md bridge-card-signoff apply-mode (+§12f hand-apply) OK — lint-enforced register↔marker consistency
SPECULATIONS.md (per run-dir) speculate lead (sole writer) speculate-signoff Phase 6 HOLD annotations OK — documented both sides
promotion-ledger.md, methodological-queue.md, ingest-dependency-ledger.md speculate-signoff ops-ledger reads only OK
NEXT.md ops-ledger (maintainer) any workflow may mark its own OPS item done (per NEXT.md §Authority) OK — authority model explicit
wiki/.audit/next-actions.md, ingest-wishlist.md none (deprecated, bannered) OK — historical evidence by design
cite-back / inline claim labels consolidate C5 (at status change) lint item 19 (drift backstop) OK — noted below (N1), no edit needed

No orphaned artifacts found. All scripts referenced by skills exist (11/11); all subagent files referenced exist (11/11 + environment-register); speculate-signoff-write-guard.py is documented-but-unbuilt by design (explicitly flagged in the skill, not a dead path).

3. Gaps, ranked

# Sev Finding Fix Status
GAP-1 High Lint item 18 instructs lint to merge duplicate claim entries directly — contradicts consolidate C1's ownership of merge rows and skirts the never-autonomous ledger Item 18 becomes detect-and-route: report the pair; concrete-defect merges are the retirement queue's (consolidate C1) ✅ applied
GAP-2 High speculate skill never names speculate-signoff; its Promotion pathway describes only the manual pre-v0d.12 route — the codified downstream is invisible from upstream Promotion pathway names speculate-signoff (standalone or consolidation C4) as the standard route; manual path kept as explicit-user-confirmation fallback ✅ applied
GAP-3 Med consolidate internal drift: Parked-ledger section says C0 step 5 re-reads it; C0 step 5 doesn't, and nothing creates the file on first run C0 step 5 reads the parked ledger (create if absent) and the speculative promotion ledgers ✅ applied
GAP-4 Med ingest close-out doesn't state where claim candidates queue, nor that NEXT.md wants a post-ingest refresh (NEXT.md §Authority expects one) One close-out pointer sentence at Step 12 ✅ applied
GAP-5 Med ops-ledger workflow: enum omits consolidate (OPS-015 already uses it); evidence list omits consolidation digests/parked ledger Both lists extended ✅ applied
GAP-6 Med consolidate never states its own re-trigger ("repeat until pre-gate dry" lives only in NEXT.md OPS-015) Run-until-dry pointer sentence in C5 ✅ applied
GAP-7 Low audit Close-out lacks the "registrations queue for consolidation automatically" pointer One sentence ✅ applied
GAP-8 Low audit Harvest H2 walk-list doesn't name consolidate C4 reservoir worksheets as an input Walk item 6 extended ✅ applied
GAP-9 Low weave Pass 5 close-out doesn't name bridge-card-signoff (staged cards) or consolidation C2 (emitted candidates) as downstream One close-out pointer sentence ✅ applied
GAP-10 Low speculate line 70 rationale cites "human-review HALTs" — stale post-v0d.24/25 Reworded to commit-hygiene/caps rationale; rule unchanged ✅ applied
GAP-11 Med NEXT.md OPS-004 (open item) done_when instructs the retired "Supported HALT" Reworded to v0d.25 routing (register at candidate; consolidation adjudicates) ✅ applied

12 edits total (GAP-5 took two), within the ≤15 budget. Every edit is a pointer sentence or stale-reference correction; no behavior, gate, cap, or invariant changed.

4. Notes — no edit needed

  • N1 (cite-back backstop): consolidate C5 is the primary owner of inline-label syncs; lint item 19 remains a drift backstop for labels missed between runs. Intentional redundancy in the safe direction — repair-toward-register is idempotent. Documented here rather than edited.
  • N2 (closed-record HALT mentions): NEXT.md OPS-001/002/015 histories and the consolidate skill's "replaces the per-promotion human HALT" line describe what was replaced — historical records, left verbatim.
  • N3 (stale worktree): .claude/worktrees/nervous-villani-a0f6e3/ contains a stale copy of v0c-migration-kickoff.md — flagged at the v0d.25 commit; git worktree prune-class cleanup, not a skill edit.

5. Scoped future items (specified, NOT built — per session scope)

  • F1 — Consolidation run-until-dry wiring. OPS-015 needs ~5–8 /consolidate runs. Options, in increasing automation: (a) status quo — user triggers each run after reading the prior digest (preserves the v0d.24 "user-triggered runs" ratified decision; recommended until ≥2 runs have completed clean); (b) a /loop-driven sequence in one session, one run per iteration, ending when consolidation_pregate.py enumerates zero eligible claims and the retirement queue emits zero concrete-defect rows — requires an explicit user opt-in and a decision to amend the "user-triggered runs" clause (schema-changelog entry); (c) scheduled cloud runs — same amendment plus dual-machine/single-writer (Rule 20) guarantees. Decision belongs to the user; nothing here changes the v0d.24 ratification.
  • F2 — Audit-trigger counter. "≥10 ingests since last audit" is counted by nobody. Cheapest mechanical form: ops-ledger refresh step compares source-count in the index counts line against the Net outcome column of the newest AUDIT_HISTORY ledger row and notes the delta in the State Snapshot. One-line addition to the ops-ledger skill + a State Snapshot convention; deferred because it changes a workflow's procedure beyond a pointer sentence.
  • F3 — First-consolidation bootstrap check. The first /consolidate run creates consolidation-parked.md (per the GAP-3 fix) and digest #1. Worth one explicit verification in that first run's digest review: parked-ledger created, veto paths render correctly, C4 ESCALATE-parking exercised or explicitly untested. A one-time checklist row for the OPS-015 first run, not a skill change.