Repository navigation
Description
Refs #7582
Outcome
A missing-tool hook notice names a command that runs the plugin's own bundled checker, not a /<plugin>:check skill. With that in place, the *:check consolidation waves can delete the per-plugin check and check-prerequisites skills without leaving a notice that points at a dead skill.
Design (owner-approved, lane 1 decision from evidence, 2026-11-02): delete the per-plugin check / check-prerequisites skills. Each plugin already declares its tools in prerequisites.json (schema docs/contracts/prerequisites/) and ships lib/prerequisites.mjs. /harness-ops:prerequisites stays as the fleet-wide view, and no plugin gains a dependency on harness-ops.
Why this is a separate slice: the contract names the skill in four places, and wave 1 cannot also carry them under the lane patch cap.
- The schema requires
checkand restricts it to a slash command (docs/contracts/prerequisites/prerequisites.schema.json:36,:63). - The checker rejects any other value (
lib/prerequisites.mjs:207-208). - The checker prints
Then run ${entry.check}.(:520,:719). - The README tells notices to name
/<plugin>:check(docs/contracts/prerequisites/README.md:71,:154-158). lib/prerequisites.mjshas 73 byte-identical copies registered inscripts/shared-copies.txt.
Done when
- Before any edit, a comment here gives this slice's measured
git diff --no-renamesbyte size, counting all 73 regenerated copies and any.changes/fragments--check-bumprequires. The size must be under 262144 bytes; if it is not, this issue is split first. - A missing-tool notice, at session start and from
hook::require, prints a command that runs the plugin's ownlib/prerequisites.mjswith the plugin root already resolved. Copied verbatim into a Bash tool call, the command runs. The Bash tool's environment carries no plugin variables (docs/contracts/prerequisites/README.md:30), so the printed text contains no${CLAUDE_PLUGIN_ROOT}. - The PR names the checker mode the notice uses and gives its basis. Recommended:
check <plugin-root>, because README:104makes it the per-plugin entry point with degrade and install text, whilereportemits the fleet TSV. - The schema and
lib/prerequisites.mjsno longer requirecheckto name a skill. Every existingprerequisites.jsonstill validates (scripts/validate-plugins.shpasses). -
docs/contracts/prerequisites/README.md"Hook notices" and thecheckrow describe the new notice. A short note covers the/<plugin>:checktext while the waves run: either it is temporarily still allowed, or it is left out. -
lib/hook-utils.test.sh,lib/prerequisites.test.sh,lib/prerequisites.test.mjsandplugins/harness-ops/hooks/prerequisites-fleet.test.sheach assert the new notice text. Each fails on main and passes on the branch, red then green. -
bash scripts/sync-shared-copies.sh --checkandbash scripts/sync-shared-copies.sh --check-bump origin/mainexit 0. - A merge probe is posted per D82/Q186: on a host with one hook dependency hidden from
PATH, the notice appears, and running its printed command reports that dependency asFAIL.
Out of scope
- Deleting any
checkorcheck-prerequisitesskill (waves 1 to 3). - Renaming
instruction-placement:check,skill-quality:checkandtoolchain:check(the naming slice). /harness-ops:prerequisites, which stays as the fleet view.
Related
- skill-quality: skill authoring, quality and catalog #7582 (parent), chore(skill-quality): recount the *:check skills and size their consolidation #11956 (recount and wave sizes).
docs/contracts/prerequisites/README.md, ADR 0019 (shared copies).
Metadata
Metadata
Assignees
Labels
Type
Fields
Work status
Activity
github-actions commentedon Nov 2, 2026
Proposed work class: work-class: structural
Basis: automated intake triage; the lanes App applied this class.
Size: Medium
Complexity: Medium
Uncertainty: Knowable
Flags: none
Blocked by: none
Understood: change the missing-tool hook notice (session start and
hook::require) to print a runnable command for the plugin's bundledlib/prerequisites.mjs, with the plugin root already resolved. It replaces the/<plugin>:checkskill name. The schema, checker, README and the shared-copy tests change with it. The design is already stated in the issue, and the acceptance items are specific, so I found no open intent question. The diff-size measurement and the merge probe on a host with a hidden dependency need a person or a host run. They don't block triage of the rest. I found no likely duplicates beyond the parent #7582.Automated triage, applied by the lanes App.
melodic-automation-lanes commentedon Nov 2, 2026
Not admitted to the issue lane: it carries host-run. Admission takes the issue once each of those is met, when intake triages it again (
.github/actions/resolve-config/admission-rules.json).melodic-automation-lanes commentedon Nov 2, 2026
The latest triage verdict holds nothing: admission moved the issue to
status: confirmed; its comment says why.kyle-sexton commentedon Nov 2, 2026
kyle-sexton commentedon Nov 2, 2026
Slice size, measured before commit (AI-generated, lane 4 session).
git diff --no-renamesof the built slice againstorigin/main(258464e): 234772 bytes, under the 262144 cap.It counts:
lib/prerequisites.mjs(about 2.2 KB each) and the canonical.lib/hook-utils.shand the canonical.hook::requirerenders its notice there..changes/, one per carrying plugin, thatsync-shared-copies.sh --check-bump origin/mainrequires.How it was measured: synced every copy,
git add -N .changes, thengit diff --no-renames | wc -c. Basis: tool output in the worktree for branchrefactor/12485-notice-names-bundled-checker.kyle-sexton commentedon Nov 2, 2026
Merge probe (partial). Merged as #12510 (aece4c1).
Run: a copy of
plugins/biome-format/lib/prerequisites.mjsandprerequisites.jsonfrom origin/main, in a directory outside any repository, withPATHholding onlynode, using the command form the notice prints:The printed command runs as written and reports the hidden dependency as
FAIL.Not yet shown: the notice appearing in a live session. That needs this change in a released plugin version on the host; #12486's merge probe covers it.
lib/hook-utils.test.shandprerequisites-fleet.test.shassert the notice text in the meantime.Until wave 2 (#12487), the checker's own failure line still ends "Then run /biome-format:check", from that plugin's
checkfield. The waves remove these fields.Posted by the lane 4 session. This was generated by AI.