plugins/inkwell/skills/query/SKILL.md
Retrieval-augmented Q&A over the repo's `docs/` tree. Returns a one-paragraph synthesis plus citations (doc path + heading anchor) and per-citation corroboration verdicts. Field shape and ordering are locked at M3; M5 populates the verdicts.
npx skillsauth add acostanzo/quickstop queryInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Answer a writer's or LLM's question by pulling top-N chunks from the
FTS5 index over docs/, synthesising a one-paragraph answer from
those chunks, and returning the answer in a fixed shape — claim,
sources, corroboration. The synthesis is the only LLM-shaped part of
the path; everything else (retrieval, anchor resolution, citation
formatting, corroboration field) is produced deterministically by
bin/inkwell-query-retrieve.sh.
Run the retrieval script with the user's question verbatim:
bash "${CLAUDE_PLUGIN_ROOT}/bin/inkwell-query-retrieve.sh" "<QUESTION>" "<REPO_ROOT>"
<REPO_ROOT> is the absolute path to the target repository, typically
the working directory when /inkwell:query was invoked. The script:
bin/inkwell-search.sh to get the top-5 FTS5 hits.#-rule heading (falling back to the doc's
H1 if the match falls in YAML frontmatter).-, runs collapsed, leading/trailing -
stripped) so the citation path#anchor is the link a reader can
click.bin/inkwell-corroborate.sh, which
classifies each citation's claims into Tier 1 (deterministic
name-resolution), Tier 2 (subagent-judged behavioural verification),
or Tier 3 (annotated "could not corroborate"). The dispatcher's
per-citation verdicts populate the Corroboration block.The script's stdout is one combined block. Above the
---END-OF-CHUNKS--- sentinel is the chunks payload — one section
per cited doc, each prefixed ### path#anchor. Below the sentinel is
the rendered tail (Sources + Corroboration), which is appended to
the response unchanged.
Read the chunks. Synthesise one paragraph answering the user's question, drawing only from those chunks. Be honest about scope:
The synthesis paragraph is the only non-deterministic part of the response. Everything else — citations, snippets, corroboration — comes from the script unchanged.
Concatenate, in this exact order:
**Answer.** followed by the synthesised paragraph.---END-OF-CHUNKS--- sentinel).If the script's stdout is the literal *No matching documentation found.* line, return that string as-is. The empty-docs/ branch
and the no-FTS5-hits branch share this sentinel; do not retry, do
not fabricate citations.
This contract is load-bearing. The M3 stub and the M5 verdicts
share the same field name, ordering, and citation format —
downstream consumers of /inkwell:query output can rely on the
field's existence and position from M3 onward; M5 only changes the
content of the Corroboration block.
The response, in order:
| Field | Source | M3 behaviour | M5 behaviour |
|---|---|---|---|
| Answer. (one paragraph) | LLM synthesis from chunks | Synthesised | Unchanged |
| Sources: list, one per cited doc | bin/inkwell-query-retrieve.sh | - [path#anchor](path#anchor) — <one-line snippet> | Unchanged |
| Corroboration: block, one bullet per claim | bin/inkwell-corroborate.sh (via inkwell-query-retrieve.sh) | Single literal stub line not yet implemented | - path#anchor — <verdict> per claim — verdict ∈ verified / drift detected (see …) / could not corroborate |
The M5 Corroboration block looks like:
**Corroboration:**
- docs/auth/session.md#sessions — verified
- docs/auth/session.md#sessions — could not corroborate
- docs/concepts/auth.md#authentication — drift detected (see src/auth/login.ts: symbol 'foo' not found)
Multiple lines per citation are normal — Tier 1 emits one verdict per inline code span; Tier 2 emits one verdict per behavioural claim batch; Tier 3 emits a single fallback line for citations with no code-shape signal.
If the dispatcher is unavailable, fails, or returns empty stdout,
/inkwell:query falls back to one could not corroborate bullet
per cited Source — the field is always populated, the shape is
always stable, the response always ships. Per ADR-007:
"corroboration never blocks the response."
The architectural rationale is in
project/adrs/007-inkwell-corroboration-architecture.md.
If docs/ is missing, empty, or no hits resolve to a real heading,
the response is the single line:
*No matching documentation found.*
Exit cleanly. Never crash on a fresh repo.
docs/ or any consumer artefact. ADR-006 §2
holds: read-only retrieval surface. The corroboration dispatcher
is also read-only against the consumer's source tree.inkwell-query-retrieve.sh's deterministic output. If the chunks
don't answer the question, say so — do not fabricate sources to
pad an answer.inkwell-corroborate.sh's deterministic / subagent-dispatched
output. Do not synthesise verdicts in the answer paragraph.documentation
Surface (and optionally fix) doc-tree drift — duplicates, dead links, stale docs, template non-compliance, missing `## Related` blocks. Read-only by default; `--apply` does mechanical fixes; `--apply-semantic` emits diffs for human review.
documentation
Full-text search over the repo's `docs/` tree (FTS5-backed). Returns ranked hits with file paths, tags, and matching snippets.
documentation
Scaffold a new doc under `docs/` from a Diátaxis template, or update an existing one and bump its `updated:` date. Suggests `## Related` candidates and refreshes the FTS5 index on write.
data-ai
Strip Co-Authored-By trailers and "Generated with/by Claude" footers from a text blob. Read-only capability — emits cleaned text on stdout.