Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Pre-ship observability readiness checklist — ensures errors reach production monitoring, not just debug consoles.
.claude/skills/bilal140202-production-readiness/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 39% | 0% |
Code that passes all tests but logs errors only via debug-only APIs (e.g., debugPrint, console.log in debug mode) is functionally silent in production. This skill enforces observability readiness before ship — ensuring the team is not blind during beta testing and production rollout.
feature and architecture-change classifications./review (semantic error check) and /ship (readiness checklist)./review)For every catch / error-handling block in changed files:
| Check | Pass | Fail | |-------|------|------| | Logging call exists | Logger.error(), log.error(), crashReporter.capture() | Empty catch {} | | Logger is production-observable | Framework logger, crash reporter, structured stdout | debugPrint(), print(), debug-only console.log | | Error context is actionable | Includes error type, operation, identifiers | "error occurred", raw exception only |
/ship)Document in Work Log where production errors go:
## Observability
- Error sink: [e.g., Sentry via Logger.error(), Crashlytics, stdout → CloudWatch]
- Health check: [e.g., /health endpoint, Firebase Vitals, uptime monitor]
- Rollback signal: [e.g., error rate > 2x baseline → revert]If the project has no production logging infrastructure, document as Known Risk: > "No production error reporting configured. Errors in catch blocks will be logged to stdout only. Risk: silent failures in release builds if stdout is not monitored."
/ship)The rollback plan (per engineering_guardrails.md §12.5) must answer:
For phase-entry loading, read only:
When to UseObservability ChecklistLoad What This Skill Does NOT Cover, Anti-Patterns, and Interaction with Other Skills on full read or cache miss only.
| Anti-Pattern | Why It Fails | Fix | |---|---|---| | catch (e) { debugPrint(e); } | Tree-shaken in release build | Use production logger | | catch (e) { /* TODO: add logging */ } | Silent catch escapes review | Add logging now, not later | | Logger.error("error") without context | Useless in production triage | Include operation, identifiers, error type | | Logging to local file only | Not observable in cloud/mobile | Use centralized error reporting |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,346 | 5,992 | -42% | 1 | 1 | 0% | 1,961 | 1,855 | -5% | 0 | 0 | — |
case-02 | fail→pass | 12,973 | 11,405 | -12% | 1 | 1 | 0% | 2,240 | 2,699 | +20% | 0 | 0 | — |
case-03 | pass→pass | 11,356 | 6,539 | -42% | 1 | 1 | 0% | 1,876 | 1,961 | +5% | 0 | 0 | — |
case-04 | fail→pass | 13,472 | 6,339 | -53% | 1 | 1 | 0% | 2,346 | 1,879 | -20% | 0 | 0 | — |
case-05 | pass→pass | 18,828 | 13,100 | -30% | 1 | 1 | 0% | 3,016 | 3,037 | +1% | 0 | 0 | — |
case-06 | pass→pass | 7,088 | 3,820 | -46% | 1 | 1 | 0% | 1,238 | 1,491 | +20% | 0 | 0 | — |
case-07 | pass→pass | 12,080 | 6,072 | -50% | 1 | 1 | 0% | 1,830 | 1,878 | +3% | 0 | 0 | — |
case-08 | pass→pass | 15,434 | 8,850 | -43% | 1 | 1 | 0% | 2,255 | 2,119 | -6% | 0 | 0 | — |
case-09 | pass→pass | 10,292 | 4,675 | -55% | 1 | 1 | 0% | 1,597 | 1,612 | +1% | 0 | 0 | — |
case-10 | fail→fail | 13,782 | 6,171 | -55% | 1 | 1 | 0% | 2,230 | 1,983 | -11% | 0 | 0 | — |
case-11 | fail→pass | 20,400 | 8,100 | -60% | 1 | 1 | 0% | 1,886 | 2,019 | +7% | 0 | 0 | — |
case-12 | pass→pass | 8,935 | 4,247 | -52% | 1 | 1 | 0% | 1,408 | 1,484 | +5% | 0 | 0 | — |
case-13 | fail→pass | 6,190 | 4,517 | -27% | 1 | 1 | 0% | 1,046 | 1,454 | +39% | 0 | 0 | — |
case-14 | pass→pass | 12,755 | 11,139 | -13% | 1 | 1 | 0% | 2,122 | 2,326 | +10% | 0 | 0 | — |
case-15 | pass→pass | 10,971 | 6,854 | -38% | 1 | 1 | 0% | 1,970 | 2,073 | +5% | 0 | 0 | — |
case-16 | pass→pass | 11,734 | 6,467 | -45% | 1 | 1 | 0% | 2,035 | 2,034 | -0% | 0 | 0 | — |
case-17 | fail→pass | 14,561 | 7,143 | -51% | 1 | 1 | 0% | 2,370 | 2,160 | -9% | 0 | 0 | — |
case-18 | fail→pass | 16,600 | 7,473 | -55% | 1 | 1 | 0% | 2,748 | 2,169 | -21% | 0 | 0 | — |
case-19 | pass→pass | 8,201 | 4,792 | -42% | 1 | 1 | 0% | 1,429 | 1,772 | +24% | 0 | 0 | — |
case-20 | pass→pass | 12,417 | 5,396 | -57% | 1 | 1 | 0% | 2,087 | 1,812 | -13% | 0 | 0 | — |
case-21 | pass→pass | 12,051 | 6,565 | -46% | 1 | 1 | 0% | 2,232 | 2,083 | -7% | 0 | 0 | — |
case-22 | fail→pass | 11,584 | 6,917 | -40% | 1 | 1 | 0% | 2,006 | 2,100 | +5% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.