Heads-up from the anvil side: the PORT-011 acceptance slice has merged.
What landed
anvil eddacraft/anvil-001#2897 (merged 2026-06-23, 9ab2cfd) — KindlingDaemonSink in anvil-cli emits command.invoked observations directly to the kindling daemon via kindling-client 0.2 (features = ["spool"]), with SpooledClient as the durable fallback. No TypeScript bridge involved.
- Mapping mirrors the TS adapter:
command.invoked → ObservationKind::Command; content = serialised anvil observation; provenance anvil_kind + anvil_contract_version; scope_ids.session_id + repo_id.
- Async bridge confined to
anvil-cli (ADR-064 daemon dep-boundary intact — the networking client never reaches anvil-intercept).
- Opt-in, default-off (
ANVIL_KINDLING_SINK=daemon); the legacy usage.ndjson path stays the default.
- Spool contract consumed exactly as documented: connectivity failures (
Unavailable/Http) buffer; Api/SchemaMismatch propagate (never spooled); replays on flush().
Acceptance — green in CI
Per the handoff's agreed minimum (the TS bridge is deprecated, so parity is NDJSON-path vs daemon-path, not TS-vs-Rust):
- Parity test — same
CommandInvokedObservation input → identical persisted row via the NDJSON sink vs the KindlingDaemonSink (modulo daemon-assigned id/ts); kind/provenance/scope asserted.
- Spool replay test — daemon down →
Spooled + Ok; restart → flush() replays → row retrievable with identical content.
Both run against an in-process kindling-server on a temp UDS. cargo add kindling-client@0.2 --features spool resolved cleanly; Client::health() schema check (v5) green.
Suggested kindling-side closeout (your call)
From plans/execution/PORT-011-anvil-handoff.md → "Closing the loop":
Scope note
This is the command.invoked proof slice only. On the anvil side, gate.evaluated daemon routing, full sink selection (daemon|ndjson|off), and a spool size/age cap are tracked as follow-ups (KDS-002/004/005). The spool-cap one may interest you: SpooledClient has no rotation/size bound yet (its SpoolConfig reserves the knob) — anvil documented it as a limitation pending an upstream cap.
Ref: anvil PR eddacraft/anvil-001#2897 · KDS module plans/modules/kindling-daemon-sink.aps.md.
Heads-up from the anvil side: the PORT-011 acceptance slice has merged.
What landed
anvil eddacraft/anvil-001#2897 (merged 2026-06-23,
9ab2cfd) —KindlingDaemonSinkinanvil-cliemitscommand.invokedobservations directly to the kindling daemon viakindling-client0.2 (features = ["spool"]), withSpooledClientas the durable fallback. No TypeScript bridge involved.command.invoked→ObservationKind::Command;content= serialised anvil observation; provenanceanvil_kind+anvil_contract_version;scope_ids.session_id+repo_id.anvil-cli(ADR-064 daemon dep-boundary intact — the networking client never reachesanvil-intercept).ANVIL_KINDLING_SINK=daemon); the legacyusage.ndjsonpath stays the default.Unavailable/Http) buffer;Api/SchemaMismatchpropagate (never spooled); replays onflush().Acceptance — green in CI
Per the handoff's agreed minimum (the TS bridge is deprecated, so parity is NDJSON-path vs daemon-path, not TS-vs-Rust):
CommandInvokedObservationinput → identical persisted row via the NDJSON sink vs theKindlingDaemonSink(modulo daemon-assignedid/ts); kind/provenance/scope asserted.Spooled+Ok; restart →flush()replays → row retrievable with identical content.Both run against an in-process
kindling-serveron a temp UDS.cargo add kindling-client@0.2 --features spoolresolved cleanly;Client::health()schema check (v5) green.Suggested kindling-side closeout (your call)
From
plans/execution/PORT-011-anvil-handoff.md→ "Closing the loop":plans/modules/05-rust-port.aps.md(currently "In Progress — anvil KDS integration underway").plans/reviews/post-merge/feat-kinteg-001-publish-readiness.md(line: "PORT-011: anvil integration proof … In Progress in anvil").kindling-client— no TS bridge" — for thecommand.invokedpath.Scope note
This is the
command.invokedproof slice only. On the anvil side,gate.evaluateddaemon routing, full sink selection (daemon|ndjson|off), and a spool size/age cap are tracked as follow-ups (KDS-002/004/005). The spool-cap one may interest you:SpooledClienthas no rotation/size bound yet (itsSpoolConfigreserves the knob) — anvil documented it as a limitation pending an upstream cap.Ref: anvil PR eddacraft/anvil-001#2897 · KDS module
plans/modules/kindling-daemon-sink.aps.md.