source-grounding
Verify version-sensitive facts against live authoritative sources before asserting them in code or answers. Triggers on: "/source-grounding", "source-grounding", "sourcing". Standing rule — always active via CLAUDE.md. Invoke for deep verification work (API signatures, CVEs, mode
Install
npx skills add https://github.com/TheColliery/CoalMine/tree/main/skills/source-grounding
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install hetcreep-coalmine@llmmart
git clone https://github.com/TheColliery/CoalMine.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole hetcreep/coalmine collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Source Grounding
Standing rule — active every response. No invocation needed for routine use.
Consent gates (G1–G4, declared)
| # | what it gates | when it fires | Agent lane | Hook lane |
|---|---|---|---|---|
| G1 | model tier | before work starts | ask_question, 3 tiers, wait for pick |
suppressed — auto-Light, no tier question |
| G2 | how to proceed on an unfetchable source | source can't be fetched, user present | ask_question |
ask_question |
| G3 | entanglement hand-off | after the findings, cross-domain | ask_question, once |
ask_question, once |
| G4 | self error-report | skill misbehaves | offer, never auto-submit | offer, never auto-submit |
Hook cells assume an interactive session (G2–G4 need a user to answer); non-interactive Hook fires D1 instead of G2, and offers nothing for G3/G4.
What to verify (not memory)
- CRITICAL (always fetch or flag — P2): API/SDK call signatures · library versions & deprecations · CVEs/security advisories · auth/crypto specs · LLM model IDs & params
- MEDIUM (verify when unsure): package names · config keys · CLI flags · protocol specs
- LOW/stable: math, algorithms, language syntax → memory fine (P3)
How
- Identify the version-sensitive claim.
- Name the authoritative source (official docs, advisory DB, package registry, spec, source code).
- Fetch (WebSearch/WebFetch/docs MCP) — or flag
⚠️ unverified: check [source](D1). - Cite at CRITICAL/MEDIUM. Don't over-verify stable facts (P3).
Per-claim-type authoritative source map: read references/sources.md when choosing where to verify.
Source hierarchy (1 = strongest)
- Source code / spec / RFC
- Official/vendor docs — authoritative secondary (honor
.coalmine.jsontrustedDomainsif set: treat those domains as additional authoritative / tier-2 sources) - Multiple reputable third-party sources
- Single blog — corroborate first (P4)
- Training memory — weakest for volatile facts
Why each rank sits where it does: references/sources.md.
Non-interactive runs: log unfetchable claims as ⚠️ UNVERIFIED and continue (D1). Interactive: when sources cannot be fetched, confirm how to proceed via ask_question (G2).
Prohibitions (P1–P6, declared)
| # | never … |
|---|---|
| P1 | default to English just because this file is English |
| P2 | skip fetching or flagging a CRITICAL version-sensitive claim |
| P3 | over-verify a stable/LOW fact |
| P4 | cite a single blog source without corroborating first |
| P5 | auto-submit the self error-report |
| P6 | include unapproved code or paths in the self error-report |
The shared footer's never fix without a chosen option does not apply here — this skill defines no Fix mode section, so that clause resolves vacuously; not counted above.
Degrade paths (D1–D4, declared)
| # | branch | fires when: |
|---|---|---|
| D1 | log as ⚠️ UNVERIFIED, continue, never block |
non-interactive, source unfetchable |
| D2 | degrade to model tier + reasoning depth, never fake parallelism | no capability lever for the target tier on this host |
| D3 | fall back to a numbered text menu | host has no question tool |
| D4 | fixed at Light, no tier question, no sub-agents | Hook Context (auto-triggered) |
This ledger deliberately diverges from skill-authoring.md §3b's column-or-separate-ledger rule for lane-applicability — gold-standard keeps a lane column, but here a column asserting a lane value that contradicted its own row's condition text measured worse than no column at all (SKILL-VARIANCE-WALK.md §Run 43: a bimodal Hook-Q4 split, the pre-registered key matching neither camp). D2 is restated at four sites in the shared partials — the general clause, the Standard row's "(else single-agent)", the Heavy row's "if supported", and the Heavy-specific "escalate by model + reasoning only" — all one row. D3 is stated once, in the shared Escalation footer's question-tool list ("…none → numbered text menu"). Neither is a new branch. D4's own branch text is restated verbatim in the footer's Hook Context line — same row, not a new one. The Freshness cap (scope already audited this session → cap at Light) is a tier-selection modifier on G1, not a degrade branch. The footer's Fix-mode-dependent offer clause is not a fifth branch — this skill defines no Fix mode section, so it never fires.
Output — 2 locations, declared
A location is a place this skill writes something a reader can see; the absence of an annotation is not one.
- Verified:
✅ [claim] — source: [link/file] - Unverified:
⚠️ unverified — check [exact source]
Stable fact: no annotation is written — not a location, not counted above.
AUTHORITATIVE vs DIVERSE
- AUTHORITATIVE (one ground truth): API/version/config/spec → go to the actual source code or official docs.
- DIVERSE (triangulate ≥ 3): "what's best" / landscape / patterns → multiple repos + docs + community; note conflicts.
Files (coalmine)
-
references
-
sources.md 2.6 KB
<!-- coalmine: verified 2026-06-12 · revalidate 90d · definition file for source-grounding --> # Source-grounding — authoritative source map ## Why the source hierarchy ranks this way 1. **Source code / spec / RFC** — primary ground truth: the implementation or the standard itself, nothing between you and the fact. 2. **Official/vendor docs** — authoritative secondary: maintained by the source, but a step removed from the code/spec that defines the actual behavior. 3. **Multiple reputable third-party sources** — triangulated: no single author's mistake, but still an interpretation layer. 4. **Single blog** — weak: one author, no editorial check, no accountability if wrong; corroborate before citing (P4 in `SKILL.md`). 5. **Training memory** — weakest for volatile facts: frozen at training time, with no way to know how stale it already is. ## Where ground truth lives, per claim type | Claim type | Primary source | Secondary | |---|---|---| | Package version / deprecation | the registry itself: npmjs.com, PyPI, crates.io, NuGet, RubyGems, pkg.go.dev | repo releases page | | CVE / advisory | GHSA, OSV.dev, NVD (cross-check at least two) | vendor security bulletins | | API / SDK signature | vendor docs site, then the SDK source on the repo | typed stubs (DefinitelyTyped etc.) | | Language / runtime feature | official docs versioned to the runtime line (e.g. nodejs.org/docs/latest-vXX.x) | spec (TC39, PEP, RFC) | | LLM model IDs / params / pricing | the provider's official docs + changelog pages — these move weekly-to-daily; NEVER from memory | provider SDK source | | Agent-platform behavior (paths, hooks, tools) | vendor docs + the platform's open-source repo (tool definitions live in source) | release notes | | Protocol / format | the RFC / spec document | reference implementation | | Web standards | MDN + WHATWG/W3C spec | caniuse for support matrices | ## Triangulation rules - AUTHORITATIVE questions (one ground truth: a version, a signature, a path) → go to the primary source; one good source suffices. - DIVERSE questions (what's best / landscape / adoption) → ≥3 independent reputable sources; report conflicts instead of averaging them away. - A single blog post is a lead, not a source — corroborate before citing. - Leaked system prompts / unofficial dumps: usable only when no official inventory exists, always tagged ⚠️ unofficial with confidence lowered. ## Citation format in findings `✅ <claim> — source: <url or file:line>` · `⚠️ unverified — check <exact source to consult>` · stable facts (math, language syntax) need no annotation.
-
-
skill-meta.json 177 B
{ "lightIntent": "Spot-check key claims, single source", "standardIntent": "Balanced verification, mixed sources", "heavyIntent": "Full cross-verification, adversarial check" } -
SKILL.md 5.4 KB
--- name: source-grounding description: >- Verify version-sensitive facts against live authoritative sources before asserting them in code or answers. Triggers on: "/source-grounding", "source-grounding", "sourcing". Standing rule — always active via CLAUDE.md. Invoke for deep verification work (API signatures, CVEs, model IDs, auth flows, deprecated patterns, security advisories). --- # Source Grounding <!-- SHARED:LANGUAGE_HEADER --> Standing rule — active every response. No invocation needed for routine use. ## Consent gates (G1–G4, declared) | # | what it gates | when it fires | Agent lane | Hook lane | |---|---|---|---|---| | G1 | model tier | before work starts | `ask_question`, 3 tiers, wait for pick | suppressed — auto-Light, no tier question | | G2 | how to proceed on an unfetchable source | source can't be fetched, user present | `ask_question` | `ask_question` | | G3 | entanglement hand-off | after the findings, cross-domain | `ask_question`, once | `ask_question`, once | | G4 | self error-report | skill misbehaves | offer, never auto-submit | offer, never auto-submit | Hook cells assume an interactive session (G2–G4 need a user to answer); non-interactive Hook fires D1 instead of G2, and offers nothing for G3/G4. ## What to verify (not memory) - **CRITICAL** (always fetch or flag — P2): API/SDK call signatures · library versions & deprecations · CVEs/security advisories · auth/crypto specs · LLM model IDs & params - **MEDIUM** (verify when unsure): package names · config keys · CLI flags · protocol specs - **LOW/stable**: math, algorithms, language syntax → memory fine (P3) ## How 1. Identify the version-sensitive claim. 2. Name the authoritative source (official docs, advisory DB, package registry, spec, source code). 3. Fetch (WebSearch/WebFetch/docs MCP) — or flag `⚠️ unverified: check [source]` (D1). 4. Cite at CRITICAL/MEDIUM. Don't over-verify stable facts (P3). Per-claim-type authoritative source map: read `references/sources.md` when choosing where to verify. ## Source hierarchy (1 = strongest) 1. Source code / spec / RFC 2. Official/vendor docs — authoritative secondary (honor `.coalmine.json` `trustedDomains` if set: treat those domains as additional authoritative / tier-2 sources) 3. Multiple reputable third-party sources 4. Single blog — corroborate first (P4) 5. Training memory — weakest for volatile facts Why each rank sits where it does: `references/sources.md`. Non-interactive runs: log unfetchable claims as `⚠️ UNVERIFIED` and continue (D1). Interactive: when sources cannot be fetched, confirm how to proceed via `ask_question` (G2). ## Prohibitions (P1–P6, declared) | # | never … | |---|---| | P1 | default to English just because this file is English | | P2 | skip fetching or flagging a CRITICAL version-sensitive claim | | P3 | over-verify a stable/LOW fact | | P4 | cite a single blog source without corroborating first | | P5 | auto-submit the self error-report | | P6 | include unapproved code or paths in the self error-report | The shared footer's `never fix without a chosen option` does not apply here — this skill defines no Fix mode section, so that clause resolves vacuously; not counted above. ## Degrade paths (D1–D4, declared) | # | branch | fires when: | |---|---|---| | D1 | log as `⚠️ UNVERIFIED`, continue, never block | non-interactive, source unfetchable | | D2 | degrade to model tier + reasoning depth, never fake parallelism | no capability lever for the target tier on this host | | D3 | fall back to a numbered text menu | host has no question tool | | D4 | fixed at Light, no tier question, no sub-agents | Hook Context (auto-triggered) | This ledger deliberately diverges from skill-authoring.md §3b's column-or-separate-ledger rule for lane-applicability — `gold-standard` keeps a lane column, but here a column asserting a lane value that contradicted its own row's condition text measured worse than no column at all (`SKILL-VARIANCE-WALK.md` §Run 43: a bimodal Hook-Q4 split, the pre-registered key matching neither camp). D2 is restated at four sites in the shared partials — the general clause, the Standard row's "(else single-agent)", the Heavy row's "if supported", and the Heavy-specific "escalate by model + reasoning only" — all one row. D3 is stated once, in the shared Escalation footer's question-tool list ("…none → numbered text menu"). Neither is a new branch. D4's own branch text is restated verbatim in the footer's Hook Context line — same row, not a new one. The Freshness cap (scope already audited this session → cap at Light) is a tier-selection modifier on G1, not a degrade branch. The footer's Fix-mode-dependent offer clause is not a fifth branch — this skill defines no Fix mode section, so it never fires. ## Output — 2 locations, declared A location is a place this skill **writes** something a reader can see; the absence of an annotation is not one. - Verified: `✅ [claim] — source: [link/file]` - Unverified: `⚠️ unverified — check [exact source]` Stable fact: no annotation is written — not a location, not counted above. ## AUTHORITATIVE vs DIVERSE - **AUTHORITATIVE** (one ground truth): API/version/config/spec → go to the actual source code or official docs. - **DIVERSE** (triangulate ≥ 3): "what's best" / landscape / patterns → multiple repos + docs + community; note conflicts. <!-- SHARED:ORCHESTRATION --> <!-- SHARED:ESCALATION_FOOTER -->
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.