feat(o11y): shared GlitchTip shipper - classify, fingerprint, drain failure-record JSONL to GlitchTip (DSN from SSM) #250
Labels
No labels
burndown-2026-06
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
coilyco-flight-deck/agentic-os#250
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Issues A (Goose) and B (Claude) populate a local failure-record buffer at
~/.cache/agentic-os/tool-failures/<repo-slug>.jsonl. This issue ships that buffer to GlitchTip so the tool-use error rate becomes a visible, grouped, counted feed - the original o11y goal.Scope
wardverb on a timer and/or aSessionEndward hook. Never on any hot path.fingerprintto the failure-recordfingerprintso a flood of identical failures collapses to one GlitchTip issue with a count. Tag byharness,failure_class,repo. This count-per-fingerprint view is the actual signal ("which failure mode dominates").SSM.md.Open decision
GlitchTip project + DSN: does a project already exist, or does this issue create one? If creating, that is the one externally-visible step and should be confirmed by Kai. The code is built DSN-pluggable so the buffer-and-classify half lands and is testable before the project exists.
Done condition
SSM.md, fail-soft when absent.Depends on
🔒 Reserved by
ward agent --driver claude— containerengineer-claude-agentic-os-250on hostKAI-DESKTOP-TOWERis carrying this issue (reserved 2026-07-04T09:02:08Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).
— Claude (she/her), via
ward agentWARD-OUTCOME: done - shipper landed on main (agentic_os/tool_failures/): drains the failure-record buffer to GlitchTip, fingerprint-grouped, watermark-idempotent, DSN-from-SSM fail-soft.
The code half went smoothly. The surprise was upstream: this shipper was designed to drain the buffer that #248 (Goose) and #249 (Claude) populate, but both producers were deleted from aos back in June by the
03d1525"aos execed agent commands are last era" commit. So I'm shipping a drainer for a buffer nothing in-tree currently writes. The good news is #250's own design made that a non-blocker - the shipper is explicitly producer-agnostic and DSN-pluggable ("C can land against A alone"), so it lands and is fully tested regardless. I recovered the exact schema-v1 contract from the deleted producer docs so the shipper reads records in the precise shape any future producer would emit.Confident in the buffer/classify/fingerprint/watermark half: 22 tests, and I exercised dry-run and fail-soft live. Where I can't be confident is the actual GlitchTip wire path end-to-end - the project and DSN don't exist yet, and creating them is the one externally-visible step that's yours. Until the
/sentry-dsn/tool-failuresparam exists the shipper fail-softs and the buffer just accumulates, which is the intended behavior.Rough edges / follow-ups, filed as #326: (1) create the GlitchTip project + populate the SSM DSN, and (2) the bigger question the build surfaced - with both producers retired, the whole failure-record chain needs a call: re-home the producers (into ward's fleet?) or retire the chain, which would make this shipper vestigial. One cosmetic nit I left: the fail-soft summary line prints "0 buffer files" because it returns before counting - harmless, the note explains it.
One decision I made unilaterally: the SSM path
/sentry-dsn/tool-failures, following the observability skill's/sentry-dsn/<project>convention rather than the newer 4-segment scheme (which the existing DSN family also predates). It's overridable via env, so it's cheap to change when you wire the project.