计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
plan-error-handling【效率与协作】Plan-only audit of silent failures and observability gaps (Sentry, Langfuse). Use when "errors aren't showing in Sentry", "things fail silently", or "empty catch blocks". Apply patterns → backend-error-handling.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Degree of freedom: HIGH — map silent paths, score, plan. Stay plan-only. No code or SDK edits until each phase is approved.
| Skill | Owns |
|---|---|
| plan-error-handling (this) | Silent-failure + Sentry/Langfuse plan |
debug-sentry-monitor | Live Sentry triage |
audit-langfuse-llm | LLM eval / trace quality |
Propose: report + rethrow the empty catch on
api/pay.tscharge; init Sentry on the edge surface. Risk: payment failures produce no event — you only hear from the user. Keep-working: web client already captures unhandled exceptions. Phase: Phase 1 — stop silent failures.
Role: Senior reliability engineer + observability specialist.
Task: Map every silent-failure path across Sentry and Langfuse planes, score by
blast radius × invisibility, phase remediations, emit plan-error-handling.md.
Audit & plan only — no code or SDK edits until each phase is approved.
Find what fails in silence. Make it observable. Change nothing until approved.
AI coding agents optimize for making the error message go away, not for making
failure visible. Error-handling gaps are nearly twice as common in AI-generated
pull requests as in human ones — empty catch blocks, missing guards, unhandled
promise rejections, and handlers that leak stack traces into capture systems. The
dangerous part isn't the crash you see; it's the failure you don't.
This skill is the audit-and-plan half. Execution goes to backend-observability /
audit-langfuse-llm after you approve each phase.
Trigger phrases: "errors don't reach Sentry", "it fails silently", "empty catch blocks", "add error handling", "why can't I debug prod", "check my Langfuse traces", "my LLM costs are a mystery", "pre-launch observability".
Do not fire for: a specific firing incident (debug-error,
debug-sentry-monitor), or security gaps (plan-rls-audit,
plan-security-audit). This is the coverage audit, not incident response.
plan-stub-checker finds fake functionality (dead buttons). This finds real
functionality that fails invisibly. Different failure mode: "if this breaks in
production tonight, would you ever know?"
Walk every error path:
catch (e) {}, catch { return null },
catch (e) { console.log(e) } with no rethrow and no Sentry capture.Sentry.captureException. Local console ≠ production visibility.await without try/catch on
fallible calls, floating promises, missing .catch() on fire-and-forget.beforeSend scrubbing.For any AI/LLM feature:
@observe /
Langfuse generation wrapping them.If the user self-hosts Langfuse, add a note to re-check hosting and licensing terms against current upstream ownership before launch — a note, not a code finding.
console.log soup?path:line. For each: "If this fails in prod,
what's the signal?" — None / Console-only / Sentry / Langfuse.plan-error-handling.md, then end the turn with a standalone recap in chat: the two or three highest-impact findings and the first phase to approve. The file is the deliverable — write it before the recap. Do not edit code.plan-test-coverage.path:line and today's signaldebug-sentry-monitor; LLM quality → audit-langfuse-llmconsole.log ≠ Sentry; do not spam validation missesplan-error-handling.md# Error-Handling & Observability Audit — <repo>
_Audit-only. Nothing changes until each phase is approved._
## Scope
- Planes: [ ] Sentry [ ] Langfuse | Surfaces: web / edge / RN / server actions
- Assumptions / not inspected: …
## Verdict
| Plane | Silent failures | PII leaks | Coverage holes |
|-------|-----------------|-----------|----------------|
| Sentry | n | n | n |
| Langfuse | n | n | n |
## Findings — application errors (Sentry)
| # | path:line | Pattern | Signal today | Sev | Direction |
|---|-----------|---------|--------------|-----|-----------|
| E1 | api/pay.ts:88 | empty catch on charge | none | Crit | report + rethrow, surface to user |
## Findings — LLM observability (Langfuse)
| # | path:line | Gap | Sev | Direction |
|---|-----------|-----|-----|-----------|
| L1 | lib/ai.ts:40 | model call untraced | High | wrap with observe, capture usage |
## Phased burndown
- **Phase 1 — Stop silent failures** → `backend-observability` — E-tier swallows
- **Phase 2 — Close coverage holes** → `backend-observability` — init gaps, maps
- **Phase 3 — Redact PII** → `backend-observability` — beforeSend / SDK redaction
- **Phase 4 — LLM tracing & evals** → `audit-langfuse-llm` — L-tier items
## Execution handoff
Approve a phase to run it. Re-run after to confirm failures are now observable.
plan-error-handling); complements
plan-test-coverage (tests prevent; observability reveals).backend-observability, audit-langfuse-llm,
debug-sentry-monitor.Plan at high effort. Execute after approval at the default effort under
approved-plan-execution.mdc(no reward hacking, no feature deletion). The plan says what is invisible; the rule constrains how it's wired.