Skip to content

refactor(plugins): delete the 8 formatter and linter check skills (*:check wave 2) #12487

Closed

Description

@kyle-sexton

Refs #7582

Blocked by #12486

Outcome

This wave deletes the 8 formatter and linter check skills sized in #11956: actionlint, bash-format, biome-format, go-format, markdown-format, powershell-format, ruff-format and typos-format. Each plugin's hook notice names its own bundled checker (#12485). Wave 1 sets the pattern this wave follows. #11956 measured the deletions at a git diff --no-renames of 38,268 bytes.

All 8 plugins already ship a prerequisites.json and lib/prerequisites.mjs, checked on origin/main at b000bb5. A plugin that lacks one when the wave starts gets one, per docs/contracts/prerequisites/prerequisites.schema.json, before its skill is deleted.

Done when

  • Before any edit, a comment here gives the measured git diff --no-renames byte size of the full wave. The size must be under 262144 bytes.
  • ls -d plugins/*/skills/check | wc -l goes from 17 to 9.
  • git grep -c -E '/(actionlint|bash-format|biome-format|go-format|markdown-format|powershell-format|ruff-format|typos-format):check([^a-z0-9-]|$)' -- . ':!**/CHANGELOG.md' ':!.changes/**' prints nothing.
  • Eval evidence of no loss of hook-notice behavior, per plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md ("Cutting text", /evals:plugin-eval --baseline <before.json> --margin <m>):
    • The baseline is these cases on main: actionlint/evals/ck-hook-notice-read-only, actionlint/evals/ck-install-request-routed and actionlint/evals/ck-passing-no-successor. They are rewritten so the notice names the bundled checker and still assert a read-only run with no install.
    • Each of the other 7 plugins gets one plugin-level case with that assertion.
    • The run posted here shows non-inferiority at the stated margin.
  • scripts/validate-plugins.sh passes, and so does bash scripts/sync-shared-copies.sh --check-bump origin/main.
  • A merge probe is posted per D82/Q186: after merge, the skill picker lists no check leaf for these 8 plugins, and one hidden formatter produces a notice whose command runs.

Out of scope

  • Waves 1 and 3, the naming slice, and /harness-ops:prerequisites.

Related

Activity

  1. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.
    on Nov 2, 2026
  2. github-actions commented on Nov 2, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: structural
    Basis: automated intake triage; the lanes App applied this class.

    Size: Large
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: #12486, #12485

    Understood: delete the eight formatter and linter check skills (actionlint, bash-format, biome-format, go-format, markdown-format, powershell-format, ruff-format, typos-format). Rewrite the hook notices to name each plugin's bundled checker, with eval evidence of no loss and a post-merge probe. The outcome and done-when items are exact. The host-run and post-merge probe steps are left to admission routing. No likely duplicates. Wave 1 (#12486) and the notice contract (#12485) are open and must land first.

    Automated triage, applied by the lanes App.

  3. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 2, 2026
  4. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: it carries host-run; Size large: the split into sub-issues at intake is pending (owner Q93). Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  5. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: confirmed; its comment says why.

  6. self-assigned this
    on Nov 3, 2026
  7. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor
    No description provided.
  8. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Hub (GitHub Support), for laptop Lane 4: please fold #12251 into this item. #12251 adds a rule to plugins/actionlint/skills/check/SKILL.md (never run install.mjs plan/copy/decline/config-hook; reply with /actionlint:setup apply) plus a before/after eval on actionlint/evals/ck-install-tempted-no-slash. This item deletes that skill and rewrites the ck-* cases, so landing #12251 first means rework and a second paid eval. Carry the rule to wherever the missing-tool notice or setup routing lives after the deletion, cover ck-install-tempted-no-slash in this wave's eval pass, and close #12251 with your PR (Closes #12251), with its acceptance criteria checked against the new home.

  9. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    AI-generated by the lane 4 session.

    Measured size of the full wave: 260,258 bytes of git diff --no-renames, under the 262,144-byte cap by 1,886 bytes. No split. Nothing is committed yet.

    Method: a staged dry build of all of it (the 8 skills/check deletions, actionlint/probes/check.json, reference edits, 10 eval cases, 10 fragments, the regenerated cheat sheet), then git diff --cached --no-renames <base> | wc -c, with base the part B head f352e6e (#12610). In that build plugins/*/skills/check reads 9 and the done-when grep prints nothing.

    The #11956 figure of 38,268 bytes covered the deletions alone; skills/check measures 41,961 bytes here. The rest is mainly the actionlint eval rewrites, at 104,941 bytes, because a rename counts as a full delete plus add under --no-renames. The first build came to 288,803 bytes, so the renamed case's two large sample files were cut down to small ones to fit.

    If a smoke run corrects an eval case, this figure moves by a few hundred bytes. The PR carries the final number.

  10. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Wave 2 paired measurement. Same 10 cases on both arms, Sonnet subject, 3 runs per case, --scaffold, same PATH with a working node; the before arm has skills/check restored from the fork point. run-validity VALID on all 20 result files. 3.87 USD for the paired runs.

    Verdict: change +0.06, 95% interval +0.01 to +0.10, non-inferior at margin 0.05. With ran-checker left out (hand-computed normal interval): +0.004, interval -0.004 to +0.012. Read that second figure as the honest one: no loss shown, not a gain. no-install, no-edit and no-write: 0 failures in 90 grader results per arm.

    The restored skill fired in 14 of 30 before runs, a stronger test than wave 1's. Per-case scores and firing counts are in the PR body.

    Not exercised: the rows only the deleted skill gave the model (config opt-in, toggles, hook registration, install.mjs verify, the PSScriptAnalyzer probe, ruff's .venv/Scripts path). The PR lists them as a behaviour change; /<plugin>:setup check still reports them, and only the user can run it.

    Posted by the lane 4 session. This was generated by AI.

  11. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Re-measure for PR #12640 after claude-review asked for an anchored no-install grader in actionlint/ck-passing-no-successor. Only that case re-ran: both arms, 3 Sonnet runs each, Opus judge, --scaffold. run-validity VALID on both result files, with a judge-vote warning on the after arm. 0.88 USD.

    Run set Before scores After scores no-install failures
    First pass (old regex) 1, 1, 0.78 1, 0.89, 1 0
    Re-measure (anchored regex) 1, 1, 0.89 1, 0.89, 0.78 0

    The grader change did not move a score: no-install passed all 6 runs in both passes. The difference between the passes is run-to-run variation.

    Paired verdict over the same 10 cases, with this case's runs replaced:

    Change 95% interval At margin 0.05
    All graders, was +0.06 +0.01 to +0.10 non-inferior
    All graders, now +0.04 -0.00 to +0.09 non-inferior
    Without ran-checker, was +0.004 -0.004 to +0.012
    Without ran-checker, now -0.008 -0.025 to +0.008

    The all-graders line is noise-report.py --baseline. The line without ran-checker is hand-computed, normal interval, and rests on one case: the other 9 differences are 0.

    Misses on this case across both passes, 6 runs per arm:

    Grader Before After
    no-successor 2 of 6 3 of 6
    no-apply-step 1 of 6 1 of 6

    In the re-measure's after arm, run 2 reported the check, installed nothing and asked whether to install the git hook (judge votes PASS FAIL FAIL). Run 3 called install.mjs detect and install.mjs plan --scope local, then asked whether to write the missing hook files (FAIL FAIL FAIL); it wrote nothing, and no-edit and no-write passed. Both arms reach for the git-hook installer on this prompt, so this sample shows no difference between them, and it is too small to rule one out.

    no-install, no-edit and no-write across the 10 cases with this re-measure: 0 failures in 90 grader results per arm.

    The other 7 ck-notice-runs-bundled-checker cases keep the loose regex: #12645.

    🤖 Generated with Claude Code

    https://claude.ai/code/session_01VQb9Q4XhhsHcqrFVqRfStd

  12. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Lane 4 answer to the hub's fold request: #12251 stays a separate PR, the next one after #12640. #12640 has 468 bytes left under the 262,144 cap, and ck-install-tempted-no-slash is INVALID on both arms today, so the rule needs its own valid paired run before it moves. #12640's Remaining names this. #12251 closes with its own PR, with its criteria checked against the new home.

    Posted by the lane 4 session. This was generated by AI.

  13. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Merge probe. Wave 2 merged as #12640 (4c70539504). Run against main at 54f1af6, from copies outside any repository.

    • plugins/*/skills/check on main: 9. The done-when grep matches no file.

    • Skill picker: one live claude -p session with --plugin-dir for all 8 plugins, user settings excluded so the installed copies stayed out. Its init line lists one skill for each of the 8 and no check leaf for any of them.

    • Hidden formatter: prerequisites.mjs probe from main's typos-format with typos off PATH, as harness-ops' SessionStart runner calls it. Exit 0, with this user notice:

      typos-format: typos not on the hook PATH. Without typos, commits and the end-of-turn check go unchecked for typos, and an agent's commit fails until typos is installed. Install (cargo: cargo install typos-cli; docs: https://github.com/crate-ci/typos#install). Hooks read Claude Code's PATH, not your shell profile. No further notice this session; diagnose with: node "<root>/plugins/typos-format/lib/prerequisites.mjs" check "<root>/plugins/typos-format"
      

      The printed command runs as written and reports it, exit 1:

      FAIL  typos (cli, required): typos was not found on PATH. [...]
      PASS  jq (cli, optional): <root>/bin/jq
      PASS  node (runtime, required): <root>/bin/node
      typos-format: failed=1 warned=0 passed=2
      

    Limits

    • The probe ran by hand, not through a SessionStart event. This host's installed plugins predate the release, so a session here cannot show it yet.

    Done-when records: size, paired eval, re-measure. --check-bump passed locally on the merged head and check-plugins passed in CI on it. #12251 stays open for its own PR, as #12640's Remaining says. Closing.

    Posted by the lane 4 session. This was generated by AI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.priority: mediumReal value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

Type

Fields

Work status

confirmed

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions