DOUBLE-CHECK — Exhaustive Claim Validation
(working title during design: CHECK-THE-NUMBERS)
Target: "$ARGUMENTS"
Validate the claims in the target (a file path, a draft message, a section of analysis, or pasted text). The goal is to ensure we are not overstating, understating, or fibbing — and to say how true each claim is in calibrated terms.
Three operating beliefs (the whole skill in one breath)
- A claim is only as strong as its provenance. "I'm pretty sure" is not a source.
- Completeness must be proven, not implied. If we didn't check something, we say so — out loud, in a list.
- Certainty must be stated, not assumed. Every judgment gets a calibrated probability word, never a bare "possible" or unqualified "may."
When to run it
- Before sending an external communication (issue reply, email, PR comment, docs).
- Before relying on your own analysis to make a decision (internal mode).
- Any time the text contains EXACT numbers, registry/config values, code behavior claims, shell commands, or definitive factual assertions.
- As the Ground-Truth engine for a
/dev-workflow-process.
Modes
- internal — validating our own work before we trust it. Emphasis: catch unverified numbers and inference-as-fact.
- external — validating something we will send. Everything in internal, PLUS grade tone/overclaim and propose hedged rewrites the recipient will read.
Default to external when the target is addressed to anyone but us.
Phase 1 — EXTRACT (the prioritized sweep)
Read the target and pull every claim into a claim ledger file. Do not validate yet — just find and catalog, so nothing is missed.
Ledger location: private/claude/thinking/claims_<slug>.md — a PRIVATE, gitignored scratch area. Claim ledgers and validation scratch are tied to our private notes/process; they're opaque and not useful to the wider public, so they must NOT land in tests/one-offs/ (which is public and committed). If a project has no private/claude/, fall back to the user's private notes folder (e.g. ~/claude/private/thinking/). Reserve tests/one-offs/ only for scratch that genuinely illuminates the codebase for others.
Sweep in value-tiered passes — highest value first. This is the bound that stops the sweep from degrading into sentence-particles:
| Tier |
What |
Coverage rule |
| T1 — Definitive numeric |
Exact numbers, intervals, counts, percentages, versions, sizes ("every 15 seconds", "default is 8", "260 insertions", "fd00::/8") |
Exhaustive — every one, no exceptions |
| T2 — Definitive code / command / config |
"sets X", "binds to ::", a shell command + what its prose says it does, registry values, file:line behavior |
Exhaustive |
| T3 — Definitive factual assertions |
Causal/mechanism claims, "X causes Y", attributions, "Windows downgrades to local network" |
By section — sweep each section; log any section skipped |
| T4 — Soft/qualitative |
Hedged opinions, framing, subjective characterizations |
On request only — do not sweep by default |
Stopping rule: finish T1 and T2 completely; do T3 section-by-section; touch T4 only if asked. Log the boundary you stopped at.
Every ledger MUST end with a Coverage Ledger:
## Coverage Ledger
- COVERED: T1 (all N), T2 (all M), T3 (sections: …)
- NOT YET COVERED: T3 (section X — deferred), T4 (all — not requested)
- OUT OF SCOPE: <things deliberately excluded and why>
Never produce output that implies coverage you did not achieve. The "NOT YET COVERED" list is mandatory even when empty (say "none").
Phase 2 — VALIDATE (per claim type, with the right instrument)
For each ledger claim, pick the method by type. Validate against reality, don't re-assert from memory.
| Claim type |
How to validate |
| Numeric / calculation |
Write a throwaway script in private/claude/thinking/*.py (private scratch — see Ledger location) and RUN it. A computed number beats an argued one. |
| Code / registry / config |
Cite the exact file:line (read it), or run the code path. For registry/config values, read the live value. |
| Command |
Execute it and confirm it does what the surrounding prose claims — not just that it runs, but that its output matches the stated intent. (E.g. a command claimed to "show whether you have a global address" must actually surface that.) |
| Factual assertion |
Find a primary source and quote it verbatim. Distinguish primary docs from secondary/community sources from your own inference. |
HOST-SAFETY CONTRACT (non-negotiable)
- Read-only by default.
Get-*, ... show ..., --dry-run, pure computation: run freely.
- Mutation requires: (1) a backup/snapshot first, (2) a written reversal step, (3) an explicit flag in the output that state was changed. Prefer
dz safedel over destructive deletes.
- If validating a claim would itself be destructive or irreversible (e.g. "this registry write fixes X"): do NOT auto-run it. Mark it "requires live mutation to verify — not auto-run" and propose a reversible test plan for human approval.
- Never run a command whose effect you cannot predict and undo.
Record, per claim: the method used, the evidence (script output / file:line / command output / verbatim quote), and the source link.
Phase 3 — CALIBRATE (two independent axes)
Grade every validated claim on both axes. They are not the same thing: a claim can be from a primary source (high provenance) yet still be a probabilistic estimate (moderate confidence), or a sound calculation (code-verified) that rests on an assumption (note it).
Axis 1 — Provenance tier
- Primary-verified (P) — authoritative primary source, quoted.
- Code-verified (C) — verified against our own code at
file:line, or by running it.
- Host-verified (H) — confirmed by running a read-only check on a real machine.
- Synthesis (S) — true, but stitched from 2+ sources; no single source says it as one sentence. Flag the stitch.
- Secondary (2) — community/secondary source or a research agent; not confirmed against a primary.
- Inference (I) — derived/assumed, NOT stated by any source. The dangerous tier — inference dressed as fact is the #1 overclaim. Never let an
I wear a P's clothes.
Axis 2 — Confidence: Words of Estimative Probability
Use the house WEP vocabulary (must match /analysis):
| Phrase |
Probability |
When |
| Almost certainly / Nearly certain |
95-99% |
Multiple corroborating high-quality sources |
| Very likely / Highly probable |
80-95% |
Strong evidence, minor gaps |
| Likely / Probable |
55-80% |
Preponderance of evidence |
| Roughly even chance |
45-55% |
Balanced / ambiguous |
| Unlikely / Improbable |
20-45% |
Leans against, can't rule out |
| Very unlikely / Highly improbable |
5-20% |
Little support |
| Almost certainly not / Remote |
1-5% |
Would require extraordinary circumstances |
Rules (from /analysis):
- Never use "possible" alone — everything is possible; specify likelihood.
- Never say "may"/"might" without a WEP qualifier.
- "Insufficient information to judge" ≠ low probability. If we lack the data to estimate, say that — do not collapse it to "unlikely." (Kent's distinction.)
- For any claim below Likely, write an alternatives note: what else could be true, and what evidence would move the estimate.
Also assign an overall Analytic Confidence to the assessment: High / Moderate / Low.
Phase 4 — PROPOSE REWRITES (only when a change is warranted)
Default posture: the audit IS the deliverable. If validation finds nothing that needs changing, do NOT create a rewritten file — the audit doc (provenance + WEP + coverage metadata) is itself the confirmation that the target stands as-is. Never clobber or duplicate a clean original.
When a change IS warranted (overclaims, false numbers, unsupported assertions, command/prose mismatches), produce a corrected version:
- For every claim graded Synthesis, Secondary, Inference, or below Likely that the target asserts too strongly, hedge to the validated WEP tier — never stronger than the evidence supports, never weaker than warranted.
- Preserve the author's voice and length; change truth-strength, not style.
- Leave fully-verified claims (P/C/H, Almost-certain) alone — over-hedging verified facts is its own distortion.
Delivery — NEVER clobber the original:
- Target is a file: write the corrected version as a NEW file that continues the revision chain, with a
claude- marker showing Claude authored it: <original-basename>__claude-<N+1>.<ext>, where N is the highest existing revision index in that file's chain (e.g. latest ..._01__edits3.md → ..._01__claude-4.md; if no prior revisions exist, ..._01__claude-1.md). This keeps every revision diffable and never overwrites the original. Overwrite ONLY when the user explicitly says to clobber.
- Target is pasted text (no file): show before → after per changed sentence inline so the human can accept/reject each.
(This is the "fixing how true something is" work, automated. Run report-only to suppress rewrites entirely — the audit metadata then stands as the sole confirmation.)
OUTPUT — the claim-audit document
Write a markdown audit (model it on the canonical example below):
- Claim table:
# | claim | tier (T1-4) | provenance | method+evidence | WEP | rewrite (if any)
- Coverage Ledger (Phase 1) — including NOT-YET-COVERED.
- Rejected/avoided claims — tempting assertions we did NOT make and why (the inference-catch section).
- Net assessment: one paragraph — is anything false? what's the weakest link? overall Analytic Confidence.
- For external mode: the before→after rewrites.
Canonical worked example (study this)
A real audit of an IPv6 networking issue reply (identifiers anonymized here) demonstrated every phase, and three real catch-types:
- Numeric (T1): "every ~15 seconds" was un-sourced → verified verbatim against the primary Microsoft NCSI FAQ (
PassivePollPeriod). Provenance upgraded to P.
- Command (T2) + host-verify: running
Get-ItemProperty on the live registry upgraded five *V6 value claims from Secondary → Host-verified, and confirmed the ULA address in question (fdxx:xxxx:xxxx::1). Running netsh ... show address revealed its "Addr Type" column says Other, not "Unique Local"/"Link-Local" — a prose/command mismatch caught only by execution.
- Inference (I) caught: a web-summary asserted a well-known forum expert "is a Microsoft employee," inferring it from his Q&A reputation points — an invalid inference. Graded I, rejected; we used the defensible "Windows internals expert" instead. This is the prototypical overclaim the skill exists to stop.
Acceptance self-checks (the skill is working if…)
- AC1 Every T1 numeric + T2 code/command claim appears in the ledger (none missed).
- AC2 Output always contains a Coverage Ledger with a NOT-YET-COVERED list.
- AC3 A wrong number is flagged with the correcting source.
- AC4 An inference-dressed-as-fact is graded I, not P.
- AC5 A command whose output doesn't match its prose is caught by running it.
- AC6 No host state mutated without backup+reversal+flag; destructive-to-verify claims are refused, not auto-run.
- AC7 Every graded claim carries a WEP phrase + provenance tier; sub-"Likely" claims carry an alternatives note.
- AC8 Each flagged overclaim gets a rewrite hedged to its validated WEP tier (external mode).
Design lineage
2026-06-17__14-57-45__dev-workflow-process_check-the-numbers-skill.md (project-private DWP, maintainers only); WEP vocabulary from the /analysis command (not yet in this public set).
1---2name: double-check3description: Exhaustively validate every claim, number, calculation, code-fact, and command in a document or outbound communication. Extracts all claims into a prioritized ledger (flagging what is NOT covered), validates each by the right method (run the math, run the command, cite the file:line, quote the primary source), then calibrates certainty with CIA Words of Estimative Probability and a provenance tier — and proposes corrected, properly-hedged rewrites for any overclaim. Use before sending a message, filing an issue, committing analysis, or whenever you state exact numbers/assertions others will rely on.4---56# DOUBLE-CHECK — Exhaustive Claim Validation78*(working title during design: CHECK-THE-NUMBERS)*910## Target: "$ARGUMENTS"1112Validate the claims in the target (a file path, a draft message, a section of analysis, or pasted text). The goal is to ensure we **are not overstating, understating, or fibbing** — and to say *how true* each claim is in calibrated terms.1314## Three operating beliefs (the whole skill in one breath)151. **A claim is only as strong as its provenance.** "I'm pretty sure" is not a source.162. **Completeness must be proven, not implied.** If we didn't check something, we say so — out loud, in a list.173. **Certainty must be stated, not assumed.** Every judgment gets a calibrated probability word, never a bare "possible" or unqualified "may."1819## When to run it20- Before sending an external communication (issue reply, email, PR comment, docs).21- Before relying on your own analysis to make a decision (internal mode).22- Any time the text contains EXACT numbers, registry/config values, code behavior claims, shell commands, or definitive factual assertions.23- As the Ground-Truth engine for a `/dev-workflow-process`.2425## Modes26- **internal** — validating our own work before we trust it. Emphasis: catch unverified numbers and inference-as-fact.27- **external** — validating something we will send. Everything in internal, PLUS grade tone/overclaim and propose hedged rewrites the recipient will read.2829Default to **external** when the target is addressed to anyone but us.3031---3233# Phase 1 — EXTRACT (the prioritized sweep)3435Read the target and pull **every** claim into a **claim ledger** file. Do not validate yet — just find and catalog, so nothing is missed.3637**Ledger location:** `private/claude/thinking/claims_<slug>.md` — a **PRIVATE, gitignored** scratch area. Claim ledgers and validation scratch are tied to our private notes/process; they're opaque and not useful to the wider public, so they must NOT land in `tests/one-offs/` (which is public and committed). If a project has no `private/claude/`, fall back to the user's private notes folder (e.g. `~/claude/private/thinking/`). Reserve `tests/one-offs/` only for scratch that genuinely illuminates the codebase for others.3839**Sweep in value-tiered passes — highest value first. This is the bound that stops the sweep from degrading into sentence-particles:**4041| Tier | What | Coverage rule |42|---|---|---|43| **T1 — Definitive numeric** | Exact numbers, intervals, counts, percentages, versions, sizes ("every 15 seconds", "default is 8", "260 insertions", "fd00::/8") | **Exhaustive** — every one, no exceptions |44| **T2 — Definitive code / command / config** | "sets `X`", "binds to `::`", a shell command + what its prose says it does, registry values, file:line behavior | **Exhaustive** |45| **T3 — Definitive factual assertions** | Causal/mechanism claims, "X causes Y", attributions, "Windows downgrades to local network" | **By section** — sweep each section; log any section skipped |46| **T4 — Soft/qualitative** | Hedged opinions, framing, subjective characterizations | **On request only** — do not sweep by default |4748**Stopping rule:** finish T1 and T2 completely; do T3 section-by-section; touch T4 only if asked. **Log the boundary you stopped at.**4950**Every ledger MUST end with a Coverage Ledger:**51```52## Coverage Ledger53- COVERED: T1 (all N), T2 (all M), T3 (sections: …)54- NOT YET COVERED: T3 (section X — deferred), T4 (all — not requested)55- OUT OF SCOPE: <things deliberately excluded and why>56```57Never produce output that implies coverage you did not achieve. The "NOT YET COVERED" list is mandatory even when empty (say "none").5859---6061# Phase 2 — VALIDATE (per claim type, with the right instrument)6263For each ledger claim, pick the method by type. **Validate against reality, don't re-assert from memory.**6465| Claim type | How to validate |66|---|---|67| **Numeric / calculation** | Write a throwaway script in `private/claude/thinking/*.py` (private scratch — see Ledger location) and RUN it. A computed number beats an argued one. |68| **Code / registry / config** | Cite the exact `file:line` (read it), or run the code path. For registry/config values, read the live value. |69| **Command** | **Execute it** and confirm it does what the surrounding prose claims — not just that it runs, but that its *output matches the stated intent*. (E.g. a command claimed to "show whether you have a global address" must actually surface that.) |70| **Factual assertion** | Find a **primary source** and quote it **verbatim**. Distinguish primary docs from secondary/community sources from your own inference. |7172## HOST-SAFETY CONTRACT (non-negotiable)73- **Read-only by default.** `Get-*`, `... show ...`, `--dry-run`, pure computation: run freely.74- **Mutation requires:** (1) a backup/snapshot first, (2) a written reversal step, (3) an explicit flag in the output that state was changed. Prefer `dz safedel` over destructive deletes.75- **If validating a claim would itself be destructive or irreversible** (e.g. "this registry write fixes X"): **do NOT auto-run it.** Mark it "requires live mutation to verify — not auto-run" and propose a reversible test plan for human approval.76- Never run a command whose effect you cannot predict and undo.7778Record, per claim: the method used, the evidence (script output / `file:line` / command output / verbatim quote), and the source link.7980---8182# Phase 3 — CALIBRATE (two independent axes)8384Grade every validated claim on **both** axes. They are not the same thing: a claim can be from a primary source (high provenance) yet still be a probabilistic estimate (moderate confidence), or a sound calculation (code-verified) that rests on an assumption (note it).8586## Axis 1 — Provenance tier87- **Primary-verified (P)** — authoritative primary source, quoted.88- **Code-verified (C)** — verified against our own code at `file:line`, or by running it.89- **Host-verified (H)** — confirmed by running a read-only check on a real machine.90- **Synthesis (S)** — true, but stitched from 2+ sources; no single source says it as one sentence. *Flag the stitch.*91- **Secondary (2)** — community/secondary source or a research agent; not confirmed against a primary.92- **Inference (I)** — derived/assumed, NOT stated by any source. **The dangerous tier** — inference dressed as fact is the #1 overclaim. Never let an `I` wear a `P`'s clothes.9394## Axis 2 — Confidence: Words of Estimative Probability95Use the house WEP vocabulary (must match `/analysis`):9697| Phrase | Probability | When |98|---|---|---|99| **Almost certainly / Nearly certain** | 95-99% | Multiple corroborating high-quality sources |100| **Very likely / Highly probable** | 80-95% | Strong evidence, minor gaps |101| **Likely / Probable** | 55-80% | Preponderance of evidence |102| **Roughly even chance** | 45-55% | Balanced / ambiguous |103| **Unlikely / Improbable** | 20-45% | Leans against, can't rule out |104| **Very unlikely / Highly improbable** | 5-20% | Little support |105| **Almost certainly not / Remote** | 1-5% | Would require extraordinary circumstances |106107**Rules (from `/analysis`):**108- Never use "possible" alone — everything is possible; specify likelihood.109- Never say "may"/"might" without a WEP qualifier.110- **"Insufficient information to judge" ≠ low probability.** If we lack the data to estimate, say *that* — do not collapse it to "unlikely." (Kent's distinction.)111- For any claim below **Likely**, write an **alternatives note**: what else could be true, and what evidence would move the estimate.112113Also assign an overall **Analytic Confidence** to the assessment: **High / Moderate / Low**.114115---116117# Phase 4 — PROPOSE REWRITES (only when a change is warranted)118119**Default posture: the audit IS the deliverable.** If validation finds nothing that needs changing, do NOT create a rewritten file — the audit doc (provenance + WEP + coverage metadata) is itself the confirmation that the target stands as-is. Never clobber or duplicate a clean original.120121**When a change IS warranted** (overclaims, false numbers, unsupported assertions, command/prose mismatches), produce a corrected version:122- For every claim graded **Synthesis, Secondary, Inference**, or below **Likely** that the target asserts too strongly, hedge to the **validated WEP tier** — never stronger than the evidence supports, never weaker than warranted.123- Preserve the author's voice and length; change truth-strength, not style.124- Leave fully-verified claims (P/C/H, Almost-certain) alone — over-hedging verified facts is its own distortion.125126**Delivery — NEVER clobber the original:**127- **Target is a file:** write the corrected version as a NEW file that continues the revision chain, with a `claude-` marker showing Claude authored it: `<original-basename>__claude-<N+1>.<ext>`, where `N` is the highest existing revision index in that file's chain (e.g. latest `..._01__edits3.md` → `..._01__claude-4.md`; if no prior revisions exist, `..._01__claude-1.md`). This keeps every revision diffable and never overwrites the original. Overwrite ONLY when the user explicitly says to clobber.128- **Target is pasted text (no file):** show **before → after** per changed sentence inline so the human can accept/reject each.129130(This is the "fixing how true something is" work, automated. Run report-only to suppress rewrites entirely — the audit metadata then stands as the sole confirmation.)131132---133134# OUTPUT — the claim-audit document135136Write a markdown audit (model it on the canonical example below):137138- **Claim table:** `# | claim | tier (T1-4) | provenance | method+evidence | WEP | rewrite (if any)`139- **Coverage Ledger** (Phase 1) — including NOT-YET-COVERED.140- **Rejected/avoided claims** — tempting assertions we did NOT make and why (the inference-catch section).141- **Net assessment:** one paragraph — is anything false? what's the weakest link? overall Analytic Confidence.142- For external mode: the **before→after rewrites**.143144---145146# Canonical worked example (study this)147148A real audit of an IPv6 networking issue reply (identifiers anonymized here) demonstrated every phase, and three real catch-types:1491. **Numeric (T1):** "every ~15 seconds" was un-sourced → verified verbatim against the primary Microsoft NCSI FAQ (`PassivePollPeriod`). Provenance upgraded to **P**.1502. **Command (T2) + host-verify:** running `Get-ItemProperty` on the live registry **upgraded** five `*V6` value claims from **Secondary → Host-verified**, and confirmed the ULA address in question (`fdxx:xxxx:xxxx::1`). Running `netsh ... show address` revealed its "Addr Type" column says `Other`, not "Unique Local"/"Link-Local" — a prose/command mismatch caught only by execution.1513. **Inference (I) caught:** a web-summary asserted a well-known forum expert "is a Microsoft employee," inferring it from his Q&A *reputation points* — an invalid inference. Graded **I**, rejected; we used the defensible "Windows internals expert" instead. **This is the prototypical overclaim the skill exists to stop.**152153---154155# Acceptance self-checks (the skill is working if…)156- **AC1** Every T1 numeric + T2 code/command claim appears in the ledger (none missed).157- **AC2** Output always contains a Coverage Ledger with a NOT-YET-COVERED list.158- **AC3** A wrong number is flagged with the correcting source.159- **AC4** An inference-dressed-as-fact is graded **I**, not P.160- **AC5** A command whose output doesn't match its prose is caught by running it.161- **AC6** No host state mutated without backup+reversal+flag; destructive-to-verify claims are refused, not auto-run.162- **AC7** Every graded claim carries a WEP phrase + provenance tier; sub-"Likely" claims carry an alternatives note.163- **AC8** Each flagged overclaim gets a rewrite hedged to its validated WEP tier (external mode).164165## Design lineage166`2026-06-17__14-57-45__dev-workflow-process_check-the-numbers-skill.md` (project-private DWP, maintainers only); WEP vocabulary from the `/analysis` command (not yet in this public set).