Tool Feedback
Tools in active development improve only if every session that uses them reports
back. This skill writes that report — one per tool per distinct concern, into the
tool's own repo — in a format the downstream feedback-triage pass can cluster:
severity-tagged findings, stable IDs, the phase that missed, explicit links for
repeats. One tool exercised across distinct phases, concerns, or surfaces (a
library vs its consumer plugin) takes one report each, under distinct slugs. The
quality bar: a maintainer can act on it cold.
Registered tools — the feedback-targets binding
First hit wins: $FEEDBACK_TARGETS_FILE → ~/.claude/feedback-targets.toml
(absolute-pathed, so it survives being copied between environments) → a
feedback-targets table in loaded context → ask once. Never hunt the
filesystem. Either shape carries the same fields:
| tool |
repo |
feedback dir |
extras |
| keel |
C:\Users\me\Documents\keel |
docs/feedback |
format: that dir's README.md |
extras carries per-tool obligations — a format README that stays authoritative
for that directory, a registered triage template, "include cost table for engine
runs". Read and honor it; if it cites a README that does not exist, fall back to
this skill's template and note the gap in the report.
- The session used a tool if it invoked any of its skills/agents/commands, ran
its engine or CLI, or substantively applied its templates/doctrine.
Design-only use, authoring-only use, and maintaining the tool's own repo all
count.
- When the tool is a skill in a repo you are also developing, its authoritative
body is the working-tree
SKILL.md — the installed cache can run behind or
ahead of it. Read the working-tree file before reporting on current
behavior; step 4's version line records which copy you ran.
Were you asked, or did you notice?
- Asked ("write the feedback reports", "tooling feedback", "dogfood report") —
write now, no confirmation step. A standing per-session directive (a
CLAUDE.md "run tool-feedback at session close" mandate) is the asked branch:
treat it as asked and write — in an autonomous session, offer-first deadlocks.
- You noticed the session winding down after exercising registered tools —
do not auto-write. Emit a single one-line offer naming the tools: "This
session exercised keel and convoy — want the two feedback reports?" If
declined or ignored, drop it for the session.
- Can't tell which? Offer.
Workflow
- Resolve targets and destination. From the bindings table (or an inline
ask), list every registered tool the session used (per the binding
section's definition); one report per tool, plus one per additional distinct
concern or surface where that applies. A tool named but never exercised
gets a one-line "no report" back to the user — not an empty file. Destination
precedence: a dir the user named this session → the registered feedback dir
→ the tool's own repo — named or registered only, never inferred. A
redirected destination moves the write only; the recurrence check (step 2)
still reads the registered dir's index — state which baseline you used (fine
print:
references/mechanics.md).
- Check recurrence before drafting. Rebuild the recurrence dir's
INDEX.md first (the registered dir — step 1, even when the write is
redirected)
(uv run --no-project python "${CLAUDE_PLUGIN_ROOT}/skills/feedback-triage/scripts/build_feedback_index.py" <dir>),
then scan it for a finding your candidate repeats. An existing index may
predate recent reports or have been built by an older rule — rebuilding is
cheap, idempotent, and the only staleness check that cannot false-positive;
never degrade to a grep. A repeat is written as "extends
<prior-file-stem>#<n>" (or "extends <prior-file-stem> §Misses" for a
narrative finding) plus only the new evidence — never restated fresh.
- Route by ownership. Engine/execution findings go to the engine tool's
report; method/gate findings to the method tool's; skill findings to the skill
collection's. If ownership is genuinely ambiguous, report it where it surfaced
and say so — triage's ROUTE OUT is the backstop.
- Draft each report (per tool per distinct concern — step 1) using the
template below. For an installed plugin,
uv run --no-project python "${CLAUDE_PLUGIN_ROOT}/skills/tool-feedback/scripts/plugin_version.py" <name> [--tree <repo>]
prints the whole Tool/version line — version, install path, and any
cache-vs-checkout skew already in it. Paste it. Otherwise read the version
from the tool's manifest and name the file.
- Self-check, then write each report to
<resolved destination>/<YYYY-MM-DD>-<source-slug>.md (step 1), slug distinct
per wave/phase so reports never clobber earlier ones. Then rebuild that
destination's INDEX.md (step 2's command, pointed at the destination) so
the next session's recurrence check is one Read.
Report template
# <tool> feedback — <short title>
- **Date:** YYYY-MM-DD
- **Tool/version:** <name> <version> (<install path, or the manifest file read>)
- **Context:** <what the tool was applied to; which skills/components were exercised>
- **Outcome:** <one-line headline of how the session went>
## What worked
<where the tool earned its keep — name the features, so maintainers know which
complexity is paying for itself>
## Friction
<each item tagged [BLOCKER|HIGH|MED|LOW]; the concrete moment it cost time or
caused confusion — quantified when cheap (minutes lost, $ spent, retries)>
## Misses
<defects the tool failed to prevent — each with a severity tag AND the phase that
should have caught it ("phase: DoR", "phase: pre-mortem", "phase: gate",
"phase: review")>
## Vacuous gates
<anything that passed while hollow; "none observed" is a valid entry>
## Proposed promotions / changes
1. **[SEVERITY]** <suspected cause, one clause> → <the change that removes it, with its home>
2. **[SEVERITY]** extends `<prior-file-stem>#<n>` — <the new evidence only>
## Cost (optional — when engine or eval runs were involved)
<per-run or per-role cost/token table>
The numbered proposals are the report's stable finding IDs — <file-stem>#1,
#2, … — what triage docs and changelogs cite. Number proposals only; cite
friction/misses by file stem + section. (Triage mints its own T1a promotion IDs
— two namespaces, don't conflate them.) Your extends refs are load-bearing
downstream — triage follows the chain to cluster a lineage and count its
recurrence — so point them at the exact finding, not just the file.
A proposal opens with its suspected cause — the reporter holds the richest
evidence and triage clusters by cause; a symptom-only proposal makes the cold
triager re-derive what the session knew. It also carries its resolution and
referents: record a clarification the session already settled (or name the
deciding precedent), and name counted objects ("two holdout positives") —
otherwise the downstream lander re-derives them and can land the wrong one.
Self-check before writing
- Every path the report cites exists.
- The version field names the copy it was read from.
- Repeats are
extends refs, not restatements.
- Severities present on friction, misses, and proposals; every miss names a phase;
every proposal opens with its suspected cause.
- The report reads cold — a maintainer with zero session context can act on it.
What this skill does NOT do
- Fix anything, edit the tool, or write CHANGELOG entries.
- Triage the backlog (that is
feedback-triage, run periodically).
- Report on unregistered tools, or hunt for places to file reports.
- Capture general session knowledge — run
journaling-sessions for that; a session
can warrant both.
1---2name: tool-feedback3description: Write a per-session dogfooding feedback report for each registered in-development tool the session exercised — what worked, friction, misses with the phase that should have caught them, vacuous gates, and severity-tagged proposed changes with stable finding IDs — saved into that tool's own feedback directory. Use when the user asks for feedback on their tools ("write the feedback reports", "tooling feedback", "dogfood report", "capture the friction with keel / convoy") — a direct imperative naming one tool ("write a dogfooding feedback report for keel") is this skill too, since writing that report IS the skill; route it here rather than drafting the report freehand — and offer once, unprompted, when a session that exercised a registered tool is winding down. Registered tools come from a feedback-targets registry the user supplies — a file at a known path, or a table in loaded context — never hunt the filesystem for targets. Design-only or authoring-only use of a tool still counts as use. Not for feedback on c4---56# Tool Feedback78Tools in active development improve only if every session that uses them reports9back. This skill writes that report — one per tool per distinct concern, into the10tool's own repo — in a format the downstream `feedback-triage` pass can cluster:11severity-tagged findings, stable IDs, the phase that missed, explicit links for12repeats. One tool exercised across distinct phases, concerns, or surfaces (a13library vs its consumer plugin) takes one report each, under distinct slugs. The14quality bar: a maintainer can act on it cold.1516## Registered tools — the feedback-targets binding1718First hit wins: `$FEEDBACK_TARGETS_FILE` → `~/.claude/feedback-targets.toml`19(absolute-pathed, so it survives being copied between environments) → a20`feedback-targets` table in loaded context → **ask once**. **Never hunt the21filesystem.** Either shape carries the same fields:2223| tool | repo | feedback dir | extras |24|------|------|--------------|--------|25| keel | C:\Users\me\Documents\keel | docs/feedback | format: that dir's README.md |2627- `extras` carries per-tool obligations — a format README that stays authoritative28 for that directory, a registered triage template, "include cost table for engine29 runs". Read and honor it; if it cites a README that does not exist, fall back to30 this skill's template and note the gap in the report.31- The session **used** a tool if it invoked any of its skills/agents/commands, ran32 its engine or CLI, or substantively applied its templates/doctrine.33 **Design-only use, authoring-only use, and maintaining the tool's own repo all34 count.**35- When the tool is a skill in a repo you are also developing, its authoritative36 body is the working-tree `SKILL.md` — the installed cache can run *behind* or37 *ahead* of it. Read the working-tree file before reporting on current38 behavior; step 4's version line records which copy you ran.3940## Were you asked, or did you notice?4142- **Asked** ("write the feedback reports", "tooling feedback", "dogfood report") —43 write now, no confirmation step. A **standing per-session directive** (a44 CLAUDE.md "run tool-feedback at session close" mandate) is the asked branch:45 treat it as asked and write — in an autonomous session, offer-first deadlocks.46- **You noticed** the session winding down after exercising registered tools —47 do not auto-write. Emit a **single one-line offer** naming the tools: *"This48 session exercised keel and convoy — want the two feedback reports?"* If49 declined or ignored, drop it for the session.50- Can't tell which? Offer.5152## Workflow53541. **Resolve targets and destination.** From the bindings table (or an inline55 ask), list every registered tool the session **used** (per the binding56 section's definition); one report per tool, plus one per additional distinct57 concern or surface where that applies. A tool named but never exercised58 gets a one-line "no report" back to the user — not an empty file. Destination59 precedence: a dir the user named *this session* → the registered feedback dir60 → the tool's own repo — **named or registered only, never inferred**. A61 redirected destination moves the *write* only; the recurrence check (step 2)62 still reads the registered dir's index — state which baseline you used (fine63 print: `references/mechanics.md`).642. **Check recurrence before drafting.** **Rebuild** the recurrence dir's65 `INDEX.md` first (the registered dir — step 1, even when the write is66 redirected)67 (`uv run --no-project python "${CLAUDE_PLUGIN_ROOT}/skills/feedback-triage/scripts/build_feedback_index.py" <dir>`),68 then scan it for a finding your candidate repeats. An existing index may69 predate recent reports or have been built by an older rule — rebuilding is70 cheap, idempotent, and the only staleness check that cannot false-positive;71 never degrade to a grep. A repeat is written as **"extends72 `<prior-file-stem>#<n>`"** (or "extends `<prior-file-stem>` §Misses" for a73 narrative finding) plus only the *new* evidence — never restated fresh.743. **Route by ownership.** Engine/execution findings go to the engine tool's75 report; method/gate findings to the method tool's; skill findings to the skill76 collection's. If ownership is genuinely ambiguous, report it where it surfaced77 and say so — triage's ROUTE OUT is the backstop.784. **Draft each report** (per tool per distinct concern — step 1) using the79 template below. For an installed plugin,80 `uv run --no-project python "${CLAUDE_PLUGIN_ROOT}/skills/tool-feedback/scripts/plugin_version.py" <name> [--tree <repo>]`81 prints the whole `Tool/version` line — version, install path, and any82 cache-vs-checkout skew already in it. Paste it. Otherwise read the version83 from the tool's manifest and name the file.845. **Self-check, then write** each report to85 `<resolved destination>/<YYYY-MM-DD>-<source-slug>.md` (step 1), slug distinct86 per wave/phase so reports never clobber earlier ones. Then **rebuild that87 destination's `INDEX.md`** (step 2's command, pointed at the destination) so88 the next session's recurrence check is one Read.8990## Report template9192```markdown93# <tool> feedback — <short title>9495- **Date:** YYYY-MM-DD96- **Tool/version:** <name> <version> (<install path, or the manifest file read>)97- **Context:** <what the tool was applied to; which skills/components were exercised>98- **Outcome:** <one-line headline of how the session went>99100## What worked101<where the tool earned its keep — name the features, so maintainers know which102complexity is paying for itself>103104## Friction105<each item tagged [BLOCKER|HIGH|MED|LOW]; the concrete moment it cost time or106caused confusion — quantified when cheap (minutes lost, $ spent, retries)>107108## Misses109<defects the tool failed to prevent — each with a severity tag AND the phase that110should have caught it ("phase: DoR", "phase: pre-mortem", "phase: gate",111"phase: review")>112113## Vacuous gates114<anything that passed while hollow; "none observed" is a valid entry>115116## Proposed promotions / changes1171. **[SEVERITY]** <suspected cause, one clause> → <the change that removes it, with its home>1182. **[SEVERITY]** extends `<prior-file-stem>#<n>` — <the new evidence only>119120## Cost (optional — when engine or eval runs were involved)121<per-run or per-role cost/token table>122```123124The numbered proposals are the report's **stable finding IDs** — `<file-stem>#1`,125`#2`, … — what triage docs and changelogs cite. Number proposals only; cite126friction/misses by file stem + section. (Triage mints its own `T1a` promotion IDs127— two namespaces, don't conflate them.) Your `extends` refs are load-bearing128downstream — triage follows the chain to cluster a lineage and count its129recurrence — so point them at the exact finding, not just the file.130131A proposal opens with its **suspected cause** — the reporter holds the richest132evidence and triage clusters by cause; a symptom-only proposal makes the cold133triager re-derive what the session knew. It also carries its **resolution and134referents**: record a clarification the session already settled (or name the135deciding precedent), and name counted objects ("two holdout positives") —136otherwise the downstream lander re-derives them and can land the wrong one.137138## Self-check before writing139140- Every path the report cites exists.141- The version field names the copy it was read from.142- Repeats are `extends` refs, not restatements.143- Severities present on friction, misses, and proposals; every miss names a phase;144 every proposal opens with its suspected cause.145- The report reads cold — a maintainer with zero session context can act on it.146147## What this skill does NOT do148149- Fix anything, edit the tool, or write CHANGELOG entries.150- Triage the backlog (that is `feedback-triage`, run periodically).151- Report on unregistered tools, or hunt for places to file reports.152- Capture general session knowledge — run `journaling-sessions` for that; a session153 can warrant both.