observablip
Audits source files for observability gaps across three dimensions —
missing telemetry, poor practices, and code structure that resists
instrumentation. Output is a ranked, bounded finding list. Never edit
files in the target codebase.
Install
npx skills add xornivore/skills@observablip --agent claude-code -y
When to use
Invoke when the user:
- Uses an explicit invocation phrase: "observablip this",
"observablip
pkg/foo", "audit o11y on this PR".
- Asks for an observability or telemetry review: "audit observability",
"review telemetry", "find missing spans", "review my logging".
- Asks a diagnostic question: "is this instrumented well enough?"
Do not invoke for:
- Requests to write or apply telemetry — observablip is read-only.
- Security review, performance review, correctness review, or test
coverage review.
- Vendor selection ("should I use Datadog or Honeycomb?").
- Audits from runtime data (traces, logs, metrics dumps). observablip
reads source files only.
Hard rules
Read-only. Never edit files in the target codebase. Never
execute target code. Never run shell commands inside the target.
Audit: no Edit / Write / Bash tool calls touching paths
inside the target during a run.
No author attribution. Findings name behaviors, not authors.
Never use git blame to attribute. Never include usernames, emails,
or handles in findings. Audit: grep -E '@[a-zA-Z0-9_-]+|<[^>]+@[^>]+>'
over emitted findings returns nothing.
No verbatim secrets/PII. A finding referencing a log call with
sensitive data describes the shape (a log call passes a raw email field) and never quotes the line verbatim. Audit: findings must
not contain string literals matching the regex set in
poor-practices (basic email, JWT,
bearer-token shapes).
Bounded output. Default cap 20 findings; overflow surfaces with
a count and a "narrow the target" prompt. Never silently truncate.
Audit: if len(findings) > --max, emitted output contains the
string narrow the target.
Skipped files are explained. Every excluded file is counted in
the footer aggregate under one of the fixed reason words from
precheck. Never silently exclude.
Audit: scanned + skipped in the footer equals the resolved
file count from step 4.1.
No library prescription unless detected. If the codebase imports
OTel / slog / zap / structlog, suggestions use that vocabulary.
Otherwise stay neutral ("a span", "a structured log") — never push
a specific library. Audit: for each finding, the suggestion's
library tokens (otel, slog, zap, structlog, etc.) must
appear somewhere in the file set's imports — or the suggestion uses
neutral vocabulary only.
Reference index
The action-checklist steps below (1–5) correspond to spec sections 4.1–4.5. Reference files refer to step numbers in the 4.x form; treat checklist step N as spec step 4.N.
Read each reference only at the action step that loads it. Each
reference ends with an ## Action checklist — load and jump there.
The per-finding render template lives at assets/finding-template.md,
loaded at the emit substep of step 4.5.
Top-level action checklist (when invoked)
Resolve target. Expand the path/glob (or --diff rev range)
to a concrete file set. If the count exceeds 200, halt with a
"narrow the target" prompt — never partially scan.
Per-file precheck. Load precheck.
For each file, apply the pass criteria; assign a skip reason from
the fixed set if it fails. Record the rejection log for the footer.
Apply rubric. For each surviving file:
- Load missing-telemetry;
produce candidate findings for dimension 1.
- Load poor-practices; produce
candidates for dimension 2. Apply the secret/PII redaction rule
before queueing each candidate.
- Load structure-for-telemetry;
produce candidates for dimension 3.
False-positive review. Load
false-positive-review. Run
every candidate through checks 1–4 in order; drop on first match;
increment n_fp_dropped.
Rank and emit. Load output-schema.
Rank surviving findings; render each through
assets/finding-template.md; emit the footer block. If candidate
count exceeds --max, render only the top --max and append the
overflow note.
1---2name: observablip3description: Audits source code for observability gaps — missing telemetry, poor observability practices, and code structure that resists instrumentation — then emits a ranked, bounded finding list. Invoke when the user says "observablip this", "observablip `pkg/foo`", "audit observability", "review telemetry", "find missing spans", "audit o11y on this PR", "review my logging", or "is this instrumented well enough?". Read-only; never edits files.4license: MIT5---67# observablip89Audits source files for observability gaps across three dimensions —10missing telemetry, poor practices, and code structure that resists11instrumentation. Output is a ranked, bounded finding list. Never edit12files in the target codebase.1314## Install1516```bash17npx skills add xornivore/skills@observablip --agent claude-code -y18```1920## When to use2122Invoke when the user:2324- Uses an explicit invocation phrase: "observablip this",25 "observablip `pkg/foo`", "audit o11y on this PR".26- Asks for an observability or telemetry review: "audit observability",27 "review telemetry", "find missing spans", "review my logging".28- Asks a diagnostic question: "is this instrumented well enough?"2930Do not invoke for:3132- Requests to write or apply telemetry — observablip is read-only.33- Security review, performance review, correctness review, or test34 coverage review.35- Vendor selection ("should I use Datadog or Honeycomb?").36- Audits from runtime data (traces, logs, metrics dumps). observablip37 reads source files only.3839## Hard rules40411. **Read-only.** Never edit files in the target codebase. Never42 execute target code. Never run shell commands inside the target.43 **Audit:** no `Edit` / `Write` / `Bash` tool calls touching paths44 inside the target during a run.45462. **No author attribution.** Findings name behaviors, not authors.47 Never use `git blame` to attribute. Never include usernames, emails,48 or handles in findings. **Audit:** `grep -E '@[a-zA-Z0-9_-]+|<[^>]+@[^>]+>'`49 over emitted findings returns nothing.50513. **No verbatim secrets/PII.** A finding referencing a log call with52 sensitive data describes the shape (`a log call passes a raw email53 field`) and never quotes the line verbatim. **Audit:** findings must54 not contain string literals matching the regex set in55 [poor-practices](./references/poor-practices.md) (basic email, JWT,56 bearer-token shapes).57584. **Bounded output.** Default cap 20 findings; overflow surfaces with59 a count and a "narrow the target" prompt. Never silently truncate.60 **Audit:** if `len(findings) > --max`, emitted output contains the61 string `narrow the target`.62635. **Skipped files are explained.** Every excluded file is counted in64 the footer aggregate under one of the fixed reason words from65 [precheck](./references/precheck.md). Never silently exclude.66 **Audit:** `scanned` + `skipped` in the footer equals the resolved67 file count from step 4.1.68696. **No library prescription unless detected.** If the codebase imports70 OTel / slog / zap / structlog, suggestions use that vocabulary.71 Otherwise stay neutral ("a span", "a structured log") — never push72 a specific library. **Audit:** for each finding, the suggestion's73 library tokens (`otel`, `slog`, `zap`, `structlog`, etc.) must74 appear somewhere in the file set's imports — or the suggestion uses75 neutral vocabulary only.7677## Reference index7879The action-checklist steps below (1–5) correspond to spec sections 4.1–4.5. Reference files refer to step numbers in the 4.x form; treat checklist step N as spec step 4.N.8081Read each reference only at the action step that loads it. Each82reference ends with an `## Action checklist` — load and jump there.8384- [precheck](./references/precheck.md) — observable-surface-area85 criteria and skip categories. Load at step 4.2 (per-file precheck).86- [missing-telemetry](./references/missing-telemetry.md) — rubric87 dimension 1. Load at step 4.3 dim 1.88- [poor-practices](./references/poor-practices.md) — rubric dimension89 2 and secret/PII regex set. Load at step 4.3 dim 2.90- [structure-for-telemetry](./references/structure-for-telemetry.md)91 — rubric dimension 3. Load at step 4.3 dim 3.92- [false-positive-review](./references/false-positive-review.md) — FP93 pass rubric. Load at step 4.4.94- [output-schema](./references/output-schema.md) — finding fields,95 ranking, and footer format. Load at step 4.5 (rank and emit).9697The per-finding render template lives at `assets/finding-template.md`,98loaded at the emit substep of step 4.5.99100## Top-level action checklist (when invoked)1011021. **Resolve target.** Expand the path/glob (or `--diff` rev range)103 to a concrete file set. If the count exceeds 200, halt with a104 "narrow the target" prompt — never partially scan.1051062. **Per-file precheck.** Load [precheck](./references/precheck.md).107 For each file, apply the pass criteria; assign a skip reason from108 the fixed set if it fails. Record the rejection log for the footer.1091103. **Apply rubric.** For each surviving file:111112 1. Load [missing-telemetry](./references/missing-telemetry.md);113 produce candidate findings for dimension 1.114 2. Load [poor-practices](./references/poor-practices.md); produce115 candidates for dimension 2. Apply the secret/PII redaction rule116 before queueing each candidate.117 3. Load [structure-for-telemetry](./references/structure-for-telemetry.md);118 produce candidates for dimension 3.1191204. **False-positive review.** Load121 [false-positive-review](./references/false-positive-review.md). Run122 every candidate through checks 1–4 in order; drop on first match;123 increment `n_fp_dropped`.1241255. **Rank and emit.** Load [output-schema](./references/output-schema.md).126 Rank surviving findings; render each through127 `assets/finding-template.md`; emit the footer block. If candidate128 count exceeds `--max`, render only the top `--max` and append the129 overflow note.