Description
A stalled source reads exactly like a quiet day, and a decoder that stops understanding a record type produces nothing rather than an error. Without these instruments there is no way to tell a working service from a broken one.
Acceptance Criteria
- #1 Every instrument listed under Self-observability in docs/signals.md is emitted
- #2 unhandled_record_types increments for any record type neither decoder recognises, labelled by tool and type
- #3 decode_errors carries a bounded reason, never the record body
- #4 A section failure is isolated: one sink failing does not stall the pipeline or the other sinks
- #5 No self-observability attribute carries a path, an id, a hash or content
Definition of Done
- #1 just check passes: fmt-check, lint, build, test-short, probe-ci, dashboard-check and docs-links all clean
Implementation Plan
Wave 1 lane 3: implement self-observability and health surfaces within owned packages; run focused tests; root integrates and runs the final gate.
Final Summary
The complete bounded self-observability registry is wired into the daemon with isolated sink errors; health and integrated tests passed.