Ensures every delivery ships with the telemetry needed to prove its impact and catch its own regressions: RUM/analytics events for user-facing web changes (delegates to rum-tracking), OpenTelemetry traces, metrics, and structured logs for new or changed API endpoints, and explicit error/warning signal paths so failures surface instead of going silent. Knows OpenTelemetry Weaver — validating a signal against a semantic-convention registry, and treating a renamed metric or attribute as the breaking change it is. Modes: guide (default), implement, audit, setup. `setup` interviews the project once, recording its telemetry stack, schema (Weaver registry), per-package instrumentation approach for monorepos, and regression-detection expectations as a committed Observability Profile. Triggers on "is this measurable", "add telemetry", "instrument this endpoint", "check observability coverage", "will we know if this regresses", "does this break the telemetry contract", "/measurable".
68
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Makes "we shipped it" and "we can see it" the same statement. A change is only done when its impact is measurable and its regressions are visible — this skill decides what telemetry a diff needs, writes or audits it, and records a per-repo profile so the answer doesn't have to be re-derived every time.
This
SKILL.mdis a thin index. Detailed rules live inrules/*.mdand load on demand. The profile template lives intemplates/*.md.Composes, does not duplicate. Frontend event design is
rum-tracking's job — this skill only decides whether a user-facing change needs RUM and hands off to it. Backend span/metric semantic conventions belong to theotel-instrumentationandotel-semantic-conventionsskills (from the dash0 agent-skills repo) when installed — invoked viaSkill(), otherwise skipped with a one-line report, withrules/backend-instrumentation.mdas the built-in fallback. Persistence for the Observability Profile ispersistent-memory'sproject-sharedtier — this skill never invents its own storage layer. OpenTelemetry Weaver is an external CLI rather than a skill, sorules/weaver-schema.mdowns it end to end and is advisory in every mode — a repo that has not adopted Weaver loses one line of output, never a finding.
Parse $1 as the mode.
State the detected mode in one line before continuing.
| Mode | Default | Trigger |
|---|---|---|
guide | yes | "is this measurable", "what telemetry do I need", default if no mode |
implement | "add telemetry", "instrument this", "add RUM and API telemetry" | |
audit | "audit observability", "check observability coverage", "--diff", aw Phase 4 gate | |
setup | "set up observability profile", "first-time setup", "/measurable setup" |
If $1 is a diff, PR, file, or directory, treat it as the scope for
implement or audit.
The user is deciding whether and what telemetry a change needs.
rules/scope-detection.md and classify
the change: frontend (web), frontend (mobile), backend/API, infra, or
mixed. In a monorepo, check for a committed Observability Profile first
(see rules/setup-profile.md) so package
boundaries and stack choices don't have to be re-guessed.rules/frontend-rum.md (thin pointer into
rum-tracking).rules/backend-instrumentation.md.rules/regression-signals.md.
"We added a log line" is not a regression signal; "P99 latency on
POST /checkout is now tracked and alerts at 2× baseline" is.rules/weaver-schema.md. A rename is a
breaking change whose symptom is a query that quietly returns nothing, so
it is the one regression the previous step cannot see.implement mode. Guide mode ends with
a short, concrete list: signals to add, and why each one is the one that
would catch a regression.The user (or the autonomous-workflow Phase 3 trigger) wants the
instrumentation written.
Skill("rum-tracking", "implement", "<target>")rules/backend-instrumentation.md:
a span per new/changed operation with OTel semantic-convention attributes,
a RED metric (rate, errors, duration) if the operation is on a hot path,
and a structured log at the point of failure. Prefer delegating to
Skill("otel-instrumentation") / Skill("otel-semantic-conventions")
when installed; the rule file is the fallback when they are not.
When the Observability Profile names a Weaver registry, add the new
signal to it in the same diff and re-run weaver registry check —
rules/weaver-schema.md. Instrumentation
emitting a name the registry does not define is the schema drift the
registry exists to prevent, and it lands silently.rules/regression-signals.md so errors
and warnings are never silent: span status set on failure, a log at
error/warn severity with enough context to triage without
reproducing, and — when the Observability Profile names an existing
dashboard or check rule for this package — a note that it now covers
the new path (never auto-edit dashboards/alerts; that's dash0's job
in Dash0 chat, not this skill's).autonomous-workflow Phase 6 folds this into
the PR walkthrough.file:line claim; this step turns it into an
executed one:
Skill("observe-run")
command: <the command that exercises the new/changed operation>
expectations: "the run emits one span per invocation of <operation>, each a child of <parent span>"
"the new attribute's distinct-value set stays bounded across the run"observe-run's closed list of seven allowed kinds —
both behavioral, both graded against an actual run, never against the diff read back.
Note the phrasing of the first one: "a span named X exists" is answerable by reading the source
that was just written, so it is refused by the provenance rule as by-construction. The
expectation has to name something only the run can settle — here the count per invocation and
the parent it actually attached to, which a startSpan call site alone does not determine.
Phrase every expectation as one of those seven: the list is closed, and an expectation outside it
is refused rather than graded. Cardinality is also the check measurable most needs here, since
a new unbounded attribute is exactly what makes a signal unsafe as a metric dimension. Advisory, and skipped with one report line when
observe-run (or its Observability Profile dev target) is unavailable, consistent with Core
Principle 6 above — this step never blocks implement mode on the companion's absence.The user (or the autonomous-workflow Phase 4 gate) wants an existing diff
checked for coverage gaps, without writing anything.
rules/audit-checklist.md against the
diff (or the target file/directory if no diff is given).missing (no signal at all for a changed path
that needs one), unlinked (a signal exists but maps to no regression
detector — Step 4 of Guide mode), or pass.missing and unlinked
findings are both reported, neither blocks. Pass --strict to make
missing findings on web/mobile/api/worker paths block the
caller's gate (unlinked stays advisory even in --strict, since not
every signal needs a bespoke dashboard on day one). This mirrors how
critical and optimize-approach ship non-blocking by default in this
registry — a brand-new coverage heuristic earns a hard gate only once a
team has opted in, not on day one.audit mode — that is what implement mode is for.rules/audit-checklist.md too, and fold its
output into the same three verdicts. Weaver never adds a fourth verdict —
the pr-reviewer lens maps exactly three, so a fourth reaches no surface.Callers of audit mode. autonomous-workflow Phase 4 (its Observability Gate) and the
pr-reviewer agent's measurability lens (Step 2.4e, via
agents/shared/rules/measurability-review.md) are both audit-only consumers. autonomous-workflow
stays advisory unless a run opts into --observability-strict; the reviewer defaults to strict (a
repo opts down with measurable: advisory), because a merged change that ships a new failure mode with
no signal is the case the lens exists for. The reviewer additionally gates the call behind two
conditions of its own — the diff must touch a web/mobile/api/worker path and add or alter
observable behaviour — so a refactor PR never reaches this mode at all. Neither caller may invoke
implement: one is a gate, the other is read-only.
First-time (or repo-onboarding) interview that records durable project
facts so every later guide/implement/audit run stops re-deriving them.
rules/setup-profile.md end to end:
interview, monorepo package map, write via persistent-memory
(project-shared tier), confirm.setup is
idempotent and updates the existing profile rather than duplicating it.Load on demand — do not preload.
| Mode | Files |
|---|---|
guide | rules/scope-detection.md, rules/frontend-rum.md, rules/backend-instrumentation.md, rules/regression-signals.md, and rules/weaver-schema.md when the change adds or renames a signal name |
implement | Same as guide, plus the delegated skill's own required reading (rum-tracking, otel-instrumentation when installed) |
audit | rules/audit-checklist.md, rules/scope-detection.md, and rules/weaver-schema.md when the Observability Profile names a registry |
setup | rules/setup-profile.md, templates/observability-profile.template.md |
rum-tracking; this skill
decides whether a change needs it and folds it into the same coverage
picture as backend spans/metrics/logs.setup once, guide/audit read it after.dash0 agent) so a human reviews and creates them there.rum-tracking, otel-instrumentation,
otel-semantic-conventions, persistent-memory, and the weaver CLI are
all optional — degrade to the built-in rule files and say so in one line
(<name> — skipped (<reason>)), never block.rules/weaver-schema.md is how it is
answered mechanically rather than by memory.setup once and reading the profile.rum-tracking's centralized wrapper.catch {}) without a log at error severity and a
span status flip.audit mode findings as blocking by default — they're advisory
unless the caller explicitly passed --strict, and even then unlinked
findings never block.weaver registry check as evidence a change is
instrumented — it validates the schema, and a registry full of signals no
code emits passes it.39b3f44
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.