Enforces observability rules (OBS-1 through OBS-5). Loaded by the conductor for review, incident response, and new service scaffolding. Detects empty catch blocks, unstructured logging, missing endpoint tracing, absent health checks, and vague error messages. Activated by: "incident", "on call", "debugging production", "empty catch", "logging", "observability", "health check".
From clean-code-codexnpx claudepluginhub mikecubed/agent-orchestration --plugin clean-code-codexThis skill uses the workspace's default tool permissions.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Details PluginEval's skill quality evaluation: 3 layers (static, LLM judge), 10 dimensions, rubrics, formulas, anti-patterns, badges. Use to interpret scores, improve triggering, calibrate thresholds.
Precedence in the overall system: SEC → TDD → ARCH/TYPE → OBS-1 (BLOCK) → OBS-2 through OBS-5.
Severity: BLOCK | Languages: * | Source: CCC
What it prohibits: Catch blocks (or equivalent error handling constructs) that swallow errors without any logging, re-throwing, or recovery action.
Prohibited patterns:
// TypeScript/JavaScript
try { ... } catch (e) {}
try { ... } catch (e) { /* TODO */ }
try { ... } catch (e) { return null; } // null return with no log
# Python
try: ...
except Exception: pass
except Exception: ... # ellipsis
# Go (result ignored)
if err != nil { } // empty block
_ = err // explicitly discarded without log
// Rust
if let Err(_) = result { } // empty block
let _ = result; // discarded result without log
Exemptions:
catch (e) { return defaultValue; } where defaultValue is semantically
correct AND a comment explains the intentional fallback_ discards in Go/Rust with a comment explaining whyDetection:
catch blocks with empty bodies or bodies containing only commentsexcept blocks containing only pass or ...if err != nil with empty block bodylet _ = or if let Err(_) with empty blocklog, logger,
console, fmt., panic, return Err, throw, or raise callagent_action:
OBS-1 (BLOCK): Empty catch block at {file}:{line} — error '{exception_type}' is silently swallowed.// Minimum: log + rethrow (preserve original error context)
} catch (error) {
logger.error({ err: error, context: 'operationName' }, 'Operation failed');
throw error; // or throw new AppError('descriptive message', { cause: error })
}
--fix: add a structured log call and rethrow — DO NOT add return null
as a default fix without explicit user confirmationBypass prohibition: "I'll add logging later", "it's a known ignorable error" → Refuse. Cite OBS-1. An ignorable error must be documented with a comment AND logged at DEBUG level so it can be correlated if it later causes issues.
Severity: WARN | Languages: * | Source: CCC
What it prohibits: Unstructured log statements (plain string concatenation) in production code paths, and log statements missing a correlation/request ID. Unstructured logs cannot be reliably parsed, queried, or correlated across distributed services.
Prohibited:
console.log("User " + userId + " not found");
console.error("Error: " + error.message);
Required:
logger.warn({ userId, requestId: ctx.requestId }, "User not found");
logger.error({ err: error, requestId: ctx.requestId, userId }, "User lookup failed");
Structured logging libraries by language:
| Language | Recommended | Minimum |
|---|---|---|
| TypeScript/JavaScript | pino, winston (JSON mode) | console.log with JSON.stringify object |
| Python | structlog, loguru (structured) | logging.warning with extra={} |
| Go | slog (stdlib ≥1.21), zerolog, zap | log.Printf is insufficient |
| Rust | tracing crate with JSON subscriber | log crate (unstructured — insufficient) |
Detection:
console.log(, console.error(, console.warn( in non-test source filesprint(f", logging.info(" (bare string), log.Printf( in non-test filesrequestId, correlationId, traceId, or ctxagent_action:
OBS-2 (WARN): Unstructured log at {file}:{line}. Use structured logging with correlation ID.--fix: convert console.log("message" + var) to
logger.info({ var, requestId: ctx.requestId }, "message")
— but only if a logger instance or ctx is already in scopeSeverity: WARN | Languages: typescript, javascript, python, go | Source: CCC
What it prohibits: HTTP endpoint handlers that do not propagate or initiate a trace span. Without tracing, distributed request flows become impossible to debug when they span multiple services.
Required (one of these patterns must be present):
tracer.startSpan(...), @trace, span = tracer.start_as_current_span(...)@opentelemetry/instrumentation-express)
— if middleware is verified at the application level, per-handler tracing is not requiredtraceparent / X-Request-IdDetection:
app.get(, app.post(, @app.route(, func(w http.ResponseWriter, etc.)agent_action:
OBS-3 (WARN): Endpoint '{method} {path}' at {file}:{line} has no trace span.--fix: add the minimal @opentelemetry/instrumentation-{framework} setup
reference — do not add manual spans when auto-instrumentation is availableSeverity: WARN | Languages: typescript, javascript, python, go | Source: CCC
What it requires: HTTP services must expose at least one health check endpoint that returns a machine-readable status. Health checks are required by Kubernetes liveness/readiness probes, load balancers, and on-call tooling.
Acceptable patterns:
GET /health → { "status": "ok" } (HTTP 200)GET /healthz → { "status": "ok" } (HTTP 200)GET /ready → status and dependency check (HTTP 200 / 503)GET /_health (common in internal APIs)Detection:
/health, /healthz, /ready, /_healthagent_action:
OBS-4 (WARN): No health check endpoint found in {file}. HTTP services must expose /health or /healthz.app.get('/health', (req, res) => res.json({ status: 'ok' }));
--fix: add the minimal health endpoint stubSeverity: INFO | Languages: * | Source: CCC
What it prohibits: Error messages thrown or returned to callers that contain no actionable information — messages that require reading source code to understand what went wrong and how to fix it.
Prohibited patterns:
throw new Error("Something went wrong");
throw new Error("Internal error");
throw new Error("Failed");
return { error: "Error occurred" };
Required patterns:
throw new Error(`User ${userId} not found in tenant ${tenantId}`);
throw new AppError("PAYMENT_DECLINED", {
code: "INSUFFICIENT_FUNDS",
hint: "Verify the card has available balance before retrying",
requestId: ctx.requestId,
});
Detection:
throw new Error(" patterns where the message is ≤ 20 characters
or matches generic phrases: "Something went wrong", "Internal error",
"Failed", "Error occurred", "An error occurred"message fieldagent_action:
OBS-5 (INFO): Vague error message at {file}:{line}: '{message}'.--fix: replace the vague message with a template that includes the
key variables (file and line context); require human to fill in specific valuesReport schema: see skills/conductor/shared-contracts.md.