feat(o11y): create GlitchTip project + populate /sentry-dsn/tool-failures; decide failure-record producer re-homing #326
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#326
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?
Follow-up from #250 (the GlitchTip shipper landed).
The one externally-visible step (needs Kai)
The shipper (
ward exec ship-tool-failures) is DSN-pluggable and fail-soft: it no-ops and the buffer keeps accumulating until a DSN exists. To turn it on:/sentry-dsn/tool-failures(the path recorded inSSM.mdand read by the shipper; override withTOOL_FAILURES_DSN_SSM_PATHif a different path is preferred). Following the observability skill's/sentry-dsn/<project>convention.Once the param exists, a timer or SessionEnd hook running the verb drains the buffer, fingerprint-grouped.
The producer question (raised by the build)
#250 was designed to drain the failure-record buffer that #248 (Goose
goose_json.ask) and #249 (Claude transcript drain) populate. Both producers were removed from aos by commit03d1525("aos execed agent commands are last era", 2026-06-26), so nothing in-tree currently writes~/.cache/agentic-os/tool-failures/<repo>.jsonl.The shipper is producer-agnostic by design and reads the exact schema-v1 contract (recovered from the deleted
docs/goose-failure-records.md/docs/claude-transcript-drain.md), so it works the moment any producer writes records again. But the failure-record chain now needs a decision: re-home the producers (e.g. into ward's embedded agent fleet), or retire the whole chain (which would make this shipper vestigial). This issue tracks that call.Filed by the #250 run.
🔎 ward agent advisor - cross-repo fan-out
ward agent advisor --harness codexran a one-shot standard research pass on this question:Recommendation
Keep the tool-failure chain, but do not re-home the producers back into
agentic-os. The right split is:wardowns producers because the live agent harnesses and host-side observability now live there.agentic-oskeeps the shared shipper for now because it is already landed, tested, producer-agnostic, and decoupled from any one harness./sentry-dsn/tool-failuresonly once the firstwardproducer is actively landing, unless Kai wants to pre-provision a dark project early.Why this is the right call
Two facts in the repo history matter:
03d1525intentionally removed the old in-tree producer surfaces fromagentic-os(goose_json.ask, Claude transcript drain, backlog-loop/triage stack). Reintroducing producers there would recreate a surface the repo explicitly retired.e386997added the GlitchTip shipper as a producer-agnostic drain of~/.cache/agentic-os/tool-failures/<repo>.jsonl, with SSM-backed DSN resolution, genuine-failure gating, fingerprint grouping, and watermark-based idempotency.That leaves a clean architectural answer: the shipper can stay where it is, while the current harness owner writes records again.
Evidence for
wardas the producer ownerwardis already the repo that owns the modern agent runtime and observability surface:docs/agent-observability.md,cmd/ward/agent_log_drain.go), including transcript draining from containerized Claude runs.WARD_SENTRY_DSN, resolved from/sentry-dsn/wardpercmd/ward/errorreport.go).That is a much better fit than putting harness-specific failure production back into
agentic-os, which now reads as a shared utilities/catalog repo, not the active runtime.Best near-term shape
1. First producer in
ward: Claude transcript-based drainThis should be the first implementation, not Goose.
Reasons:
docs/claude-transcript-drain.mdalready captured the important design finding: Claude hooks do not reliably see all tool failures, while the transcript JSONL does.wardalready drains Claude transcripts host-side after runs, so the raw source is already in the runtime that matters.agentic-osexec surfaces.2. Preserve the existing schema-v1 contract
The deleted producer docs and the current shipper still line up on one shared contract:
~/.cache/agentic-os/tool-failures/<repo>.jsonlfingerprint,failure_class,harness,repo, optionalexpectedexpected, group byfingerprint, advance watermarks only after accepted linesThat contract is worth keeping because it lets
wardadd producers without rewriting the shipping side.3. Treat Goose as follow-up, not day-one scope
The old Goose producer was specifically tied to the removed
goose_json.ask()path inagentic-os.wardstill supports Goose as a harness, but that is no longer the same seam. Recreate signal for Claude first, then decide whether Goose needs:ward, orOptions considered
Option A. Re-home producers into
ward, keep shipper inagentic-osRecommended.
Why:
Option B. Move the entire chain into
wardViable later, but not the best immediate move.
Why not first:
wardproducers.Option C. Retire the chain entirely
Not recommended.
Why:
Operational step: the GlitchTip project and DSN
Creating the project and storing
/sentry-dsn/tool-failuresis still the right convention. It follows the existing/sentry-dsn/<project>pattern already documented inagentic-os/SSM.md.My recommendation is:
tool-failuresGlitchTip project./sentry-dsn/tool-failures.wardproducer landing so the project does not sit dark indefinitely.If Kai prefers to pre-provision it now, that is low-risk because the shipper is fail-soft and no producer means no traffic. It is just lower signal than sequencing it alongside the first producer.
Open questions to settle in implementation
wardwrite directly into the existing~/.cache/agentic-os/tool-failures/buffer path, or should that path become a neutralward-owned location later with a compatibility bridge first?schema-v1contract stay documented inagentic-os, or doeswardbecome the canonical owner once the first producer lands there?wardlater grows both transcript and hook-based capture?stderr_excerpt-style fields into the local buffer, givenwardalready has stronger observability scrubbing rules than the oldagentic-osdocs assumed?Risks
wardwrites records butagentic-osremains the undocumented schema owner, the contract can fork silently.Bottom line
The issue should be resolved as "keep the chain, move production to
ward, keep the current shipper, and activate the DSN when the firstwardproducer is landing."That preserves the July 4 shipper work, respects the June 26 runtime cleanup, and puts the instrumentation where the agent fleet actually lives now.
The work spans multiple repos, so it was filed as 2 tracked issue(s), in dependency order:
Researched and posted automatically by
ward agent advisor --harness codex(ward#424). This is one-shot research, not a carried change - verify before acting on it.— Codex, via
ward agentTriage pass on 2026-07-09: closing this parent after advisor resolution.
Decision: keep the chain, move producer ownership to ward, keep the current AOS shipper for now, and create the GlitchTip project plus /sentry-dsn/tool-failures when the first ward producer is landing.
Follow-ups now track the remaining work: