Skip to content

fix(skill-review): stop requiring client-specific TodoWrite and Task - #3

Merged
korchak-aleksandr merged 4 commits into
mainfrom
m.novikov/planning-without-todowrite
Sep 17, 2026
Merged

korchak-aleksandr merged 4 commits into
mainfrom
m.novikov/planning-without-todowrite

Conversation

@mnovikov-mindbox

@mnovikov-mindbox mnovikov-mindbox commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Type of Change

  • New plugin
  • Update to existing plugin
  • Repository tooling / docs

What was broken

The skill refused to start on current Claude Code models.

SKILL.md § Preconditions said: "Before Step 0, check Task, TodoWrite, and file access for the skill. If anything is missing — stop and report what is lacking." Both names have since moved: the sub-agent tool was renamed Task → Agent in v2.1.63, TodoWrite was superseded by TaskCreate/TaskGet/TaskUpdate/TaskList in v0.2.82, and in v2.1.268 the whole task-tracking family became model-gated (CLAUDE_CODE_ENABLE_TODO_TOOLS=1 to restore it). Both preflight conditions fail on a current model, so the review stopped at step zero. references/instruction-singlepass.md § Preconditions repeated the same hard gate for the second execution mode.

The rest of the skill was built on top of that assumption: a mandatory "TODO plan", statuses pending/in_progress/completed, delegation "via Task".

Chasing the new names would only reset the clock. The fix removes the dependency instead.

What changed

Planning is one mechanism, described in words. The review plan is a markdown checklist the agent copies into its response and checks off as it goes — the pattern Anthropic's skill authoring guide recommends for complex workflows. Both execution modes ship a ready-made skeleton to copy: SKILL.md § Mandatory Review Plan (by check group) and instruction-singlepass.md § Algorithm (by Part A–G). It works in every client and names no tool, so nothing goes stale the next time one is renamed or gated.

Planning did not get weaker: an explicit completion gate replaces what the tool used to enforce — no final report while plan items are open, in the CRITICAL block and in single-pass Mandatory Rules.

No client tool is named anywhere in the skill. File read is the only hard requirement left. A missing sub-agent tool is not a precondition failure — it only selects the execution mode: single-pass regardless of volume, with the missing delegation recorded in Review Limitations, and a reading strategy for a large skill in one context.

The checklist the skill judges other skills by had the same staleness. WF12 now asks for a planning mechanism that does not depend on a tool being present in a particular client; WF13 is worded in terms of open plan items instead of one tool's status names.

Antipattern Bingo #21 "Client tool lock-in" (stage 3, WF12 + WF15, owner Workflow) — added so the reviewer catches this class in other skills. It is anchored to two checks on purpose: WF12 is gated on "workflow longer than 4 steps", so on its own it would have forced a NONE verdict for a short skill whose preconditions hard-require a tool — a clean verdict for a skill with exactly this defect. WF15 carries no such gate. This is the shape #20 already uses (RF12 gated, RF06 not), and the stage follows the maximum of the anchors as #15 does. The note against #16 Context overfitting splits by signal: a named client tool goes to #21, everything else to #16.

Fixed along the way

With logging on, the results folder is now created right after the user confirms its path (step 3d) instead of on the sub-agent branch only (was step 10b) — single-pass mode had nowhere to write report.md. Pre-existing, unrelated to the tool dependency, two lines.

Versions per CLAUDE.md § Version Policy: plugin.json 1.0.0 → 1.1.0, SKILL.md metadata.version 1.6.0 → 1.7.0, CHANGELOG entry added.


Plugin Checklist

  • All content in English
  • plugin.json has name, description (English), version, author
  • SKILL.md frontmatter complete: name (kebab-case, matches folder), description with trigger phrases and "Don't use when", metadata.version
  • marketplace.json updated — n/a, no new plugin; the existing entry needs no change
  • Root README.md plugin table updated — n/a, no new plugin
  • CHANGELOG.md updated in plugin root
  • CI (validate.yml) passes

Skill Review Results

Run on bbf9afc, in sub-agent mode (1911 lines, 5 sub-agents).

Scope used: Repository (full)

Statistics: FAIL: 2, WARNING: 18, PASS: 45, N/A: 7

That run found three places where the branch had half-landed, all fixed in bbf9afc:
instruction-singlepass.md still claimed it runs only below 500 lines while the new
fallback routes any volume into it; its algorithm never wrote the plan file; and its
copy of WF12 lacked a row its checklist twin had.

9237e76 then replaced the mechanism itself — capability tables out, one copyable
checklist in — and has not been re-reviewed by the skill. The statistics above
predate it. The three issues below were unaffected by either revision.

Top 3 issues (if any): all three predate this branch and are left for separate PRs — this one stays scoped to the tool-dependency fix.

  1. RF05 / Bingo #8 — no single source of truth between instruction-singlepass.md and the checklists. The single-pass file carries its own copies of all five checklists, the Bingo table, the report template and the base rules, and the copies have already drifted apart in four places (a Troubleshooting case present only in SKILL.md, a lost word in the base rules, a different RF10 wording, a different report section order). This PR had to edit WF12, WF13 and the Bingo note twice for exactly that reason. Fixing it means designating the checklists as the SSoT and reducing the single-pass file to mode-specific glue.
  2. LC01 — no metadata.author in the frontmatter. Ownership is declared only at package level in plugin.json, while the checklist treats metadata.author as a stage-4 gate. Worth fixing together with validate.yml, which today never reads SKILL.md frontmatter and so cannot catch it.
  3. WF15 — checklist paths handed to sub-agents are relative. The reviewed skill may itself have a references/ folder with colliding file names, and a sub-agent resolving references/checklist-structure.md against the reviewed folder would read the wrong file. Pass absolute paths, or paths relative to the reviewer's own folder.

🤖 Generated with Claude Code

mnovikov-mindbox and others added 3 commits September 17, 2026 07:06
Preflight aborted the review when TodoWrite or Task was missing. Newer
models ship without a built-in task-tracking tool, so the skill could not
start at all. File read is now the only hard requirement; task tracking
and sub-agent delegation are optional capabilities with declared
fallbacks. WF12/WF13 and Bingo #21 catch the same lock-in in reviewed
skills.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Self-review of the branch found the new fallbacks half-landed:
instruction-singlepass.md still claimed it runs only below 500 lines,
its algorithm never wrote review-plan.md, and WF12 lost the PASS row its
checklist twin has. Shell execution, required for the log timestamp, was
missing from the capability table that claims to enumerate what the
review needs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Replaces the capability/fallback tables with a single planning mechanism:
a markdown checklist copied into the response, the pattern the Anthropic
skill authoring guide recommends. No client tool is named anywhere in the
skill now, so nothing goes stale when a client renames or gates a tool.

- Preconditions keep file read as the only hard requirement
- SKILL.md and instruction-singlepass.md each ship a ready-made plan
  skeleton to copy, with an explicit instruction to check items off
- WF12 asks for a planning mechanism that survives a client without a
  given tool; its signal/verdict table is folded into the question so the
  check still yields a single verdict
- Bingo #21 note reworded without tool names and disambiguated against #16
- Drop the review-plan.md artifact and the invented [~] status

Fixed along the way: with logging on, the results folder is created right
after the user confirms its path, so single-pass mode has somewhere to
write report.md. Previously it was created only on the sub-agent branch.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…se NONE

#21 hung on WF12 alone, and WF12 is gated on "if the workflow is longer
than 4 steps". A short skill whose preconditions hard-require a client
tool made WF12 N/A, and the row then had to be filled as NONE — a clean
verdict for a skill that has exactly this defect. The file's own Scope
Fill Rule exists to avoid that false impression of cleanliness.

WF15 (preconditions) carries no such gate, so it becomes the second
anchor and the row fires whenever the antipattern is applicable at all.
This is the same shape #20 already uses: RF12 is gated on "many files",
RF06 is not, and the row survives on RF06.

Stage 2 -> 3, by the maximum of the anchors, as #15 does with WF22+LC02.
It also puts #21 next to #12 and #16 — the other two portability rows,
both stage 3, both owned by Workflow.

The #16 disambiguation note now splits by signal instead of by breadth:
both rows use WF15, so a named client tool goes to #21 and everything
else (OS, permissions, packages, paths) to #16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@korchak-aleksandr
korchak-aleksandr merged commit ffd69b4 into main Sep 17, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants