Skip to content

PORT-011 landed in anvil — command.invoked emits direct via kindling-client (no TS bridge) #124

Description

@joshuaboys

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.invokedObservationKind::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":

  • Mark PORT-011 Merged in plans/modules/05-rust-port.aps.md (currently "In Progress — anvil KDS integration underway").
  • Tick the box in plans/reviews/post-merge/feat-kinteg-001-publish-readiness.md (line: "PORT-011: anvil integration proof … In Progress in anvil").
  • Tick the index success criterion — "anvil emits observations directly via kindling-client — no TS bridge" — for the command.invoked path.

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions