o11y-logging
Installation
SKILL.md
JoelClaw Observability + Logging
Prevent silent failure by default. Observability is not optional polish: it is part of done.
Non-Negotiable Rules
- Use the canonical event contract only.
packages/system-bus/src/observability/otel-event.tspackages/system-bus/src/observability/emit.tspackages/system-bus/src/observability/store.ts
- Worker/Inngest code emits through
emitOtelEventoremitMeasuredOtelEvent. - Gateway code emits through
emitGatewayOtel. - Internal ingestion goes through
POST /observability/emit(packages/system-bus/src/serve.ts), not ad-hoc writes. - Never treat
console.logas primary observability. Keep structured events as source of truth. - High-cardinality values go in
metadata, not in facet fields (source,component,level,success). - Failures must set
success: falsewith a meaningfulerror. - For warn/error/fatal, verify Convex mirror behavior (rolling window) in addition to Typesense write.
- In Inngest durable functions, any "emit once" telemetry must live inside
step.run(...)to avoid replay duplication after resume.