Todo check
Preflight sweep of quality-list items before or during implementation, framed as 'what to set up so done-check passes at the end'. Dual of done-check.From its SKILL.md
npx -y skills add ultimatile/development-skills --skill todo-checkAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
17.7 KB, ~3.9k tokens by cl100k_base, as published. Nobody here has run it
Todo-Check
Forward-looking preflight against the planned change. Item definitions live in quality-list; this skill is the runner. Update quality-list, not this file, when adding or modifying items.
done-check asks: "Did the diff satisfy item N?" todo-check asks: "What does item N require us to set up so the diff will satisfy it?" Same mechanical / contextual lane split as done-check (quality-list/SKILL.md's Item lanes section): mechanical-lane items go to a fresh-context subagent (Step 2), contextual-lane items stay in main context (Step 3).
Procedure
-
Resolve the active rule set. Base items live in
quality-list/SKILL.md; language-specific addenda atquality-list/lang-<language>.mdrealize them concretely.Detect language from the project's
CLAUDE.mdLanguage:declaration; otherwise auto-detect from the extensions of the files the work will likely touch — taken from the plan or task description, since Step 0 runs before Step 1 formalizes the scope (.rs→ rust,.cpp/.cc/.cxx/.h/.hpp→ cpp,.py→ python,.ts/.tsx→ typescript,.go→ go, etc.). Multi-language projects detect every present language; each matching addendum applies. Missing addendum → base rules only for that language (not a concern). Step 0 only detects the language(s); it routes nothing. Each consumer — the Step 2 mechanical subagent and the Step 3 contextual pass — loads every matching addendum file itself. -
Describe the planned change. State in plain terms what the change will do: the files / modules it will touch, the behavior it will change, the public symbols / schemas / contracts it will move, and the invariants it introduces or modifies. Capture what is already decided; leave the rest unstated — an unsettled fact surfaces as a
? unknownrow below, not a guess. State the language(s) Step 0 detected here too, so the subagent applies the same addenda the contextual lane does rather than re-deriving them from a scope description that may name modules without file extensions. Do not pre-classify the change against individual items — the subagent (Step 2) and the contextual pass (Step 3) read each item's body and decide applicability themselves; the scope description is a plain account of the change, not a per-item trigger checklist.todo-checkalso runs mid-implementation. When earlier units are already materialized on disk, name their inspectable revision range in the scope description too, so the subagent reads the real code instead of treating the tree as unwritten:git log --oneline @{upstream}..HEAD # committed units git diff @{upstream}..HEAD # committed content git diff --cached # staged git diff # unstaged git ls-files --others --exclude-standard # untracked pathsState that this range is part of the change under preflight, not pre-existing baseline to reuse from — a helper just added there is a candidate for
duplication-extraction's search, not an existing helper the search should call. -
Spawn a fresh-context preflight subagent for the mechanical items. A fresh context removes the author's blindspot for what the planned scope actually implies, and keeps the item-body rule text out of main context.
Main context MUST NOT load a purely-mechanical item's body (the dual-lane
ported-code-attributionbody is the one exception, read in Step 3 for its contextual half). The subagent reads the index and those bodies in its own fresh context — it derives the mechanical-lane item set from the index itself; main only composes the prompt (scope description + the resolved paths) and dispatches.Resolve two absolute paths first:
<QUALITY_LIST_ROOT>, the repo/package root containing theskills/quality-list/directory, and<TARGET_ROOT>, the project this preflight is for (cwd) — they coincide only whenquality-listis vendored inside the target; in a marketplace / symlinked install they differ, and the subagent needs both.Use the
Agenttool withsubagent_type: "general-purpose"and a prompt of the following shape:You are running a PREFLIGHT (not an audit) against a planned change, under the `quality-list` quality rules. You have NO access to the conversation history that produced this scope and MUST NOT speculate about author intent beyond the scope description below. Judge from: - the literal scope description (provided below) - if the scope description names an already-materialized revision range, the code in that range — treat it as part of the change under preflight, not as pre-existing baseline - the literal text of the relevant `quality-list` item files (read them yourself from the paths below) - the literal text of the codebase at <TARGET_ROOT> you can read with your tools (existing helpers, current callers, paired-artifact surfaces) The scope description's characterizations of EXISTING code ("no helper for this exists yet", "sibling X already exposes a symmetric surface") are the author's working hypothesis — sanity-check them against what you can read in the codebase, and flag any discrepancy in your report. A characterization of the not-yet-written change itself has nothing to check against — take it as given. First read <QUALITY_LIST_ROOT>/skills/quality-list/SKILL.md and consult its Items index. Select every item whose lane is `mechanical`, including the mechanical half of any dual-lane item (an entry tagged `mechanical (+ contextual half)`, e.g. ported-code-attribution — handle only its declared-port signal; the undeclared-port signal is main context's job, but still return a row for the item even when its declared half is ⊘ N/A, so the coverage check sees it). Read each selected item's <QUALITY_LIST_ROOT>/skills/quality-list/items/<slug>.md in full. The language(s) Step 0 detected are stated below; load each corresponding addendum at <QUALITY_LIST_ROOT>/skills/quality-list/lang-<lang>.md that exists, loading them all when more than one applies. If none are stated, fall back to <TARGET_ROOT>/CLAUDE.md's `Language:` line (never <QUALITY_LIST_ROOT>/CLAUDE.md), then to the file extensions in the scope description. No language found, or a detected language with no addendum file, is not a concern — proceed on base rules. For each selected item return one of: - △ active — this item will apply to the finished diff; state the concrete preflight setup action (test fixture variants, guard locations, paired-artifact surfaces to sweep, existing-helper search results, etc.), grounded in the scope description and the codebase. - ⊘ N/A — using only the item's own N/A criterion as stated. - ? unknown — the body is read, but applicability turns on a scope fact not given; state the scope check that would decide it AND the resulting verdict for each possible answer, so it can be resolved later without re-reading the body. Report concisely: one row per item with Status + Setup action / N/A reason / scope check; then a final list of any discrepancies between the scope description and what you read in the codebase.Embed the scope description (Step 1), the language(s) Step 0 detected, and the two resolved paths. Do not embed item body text — the subagent reads the item files itself.
Start Step 3 immediately rather than waiting; the two run in parallel. Block on the subagent's return once you reach Step 4.
-
Process the contextual items in main context. Read
quality-list/SKILL.md's Items index and select every item whose lane iscontextual, including the contextual half of dual-lane items —ported-code-attribution's undeclared-port signal is main's job because it needs the conversation / research history the subagent lacks. These need plan / intent / review history, or command-execution planning against the working tree.For each selected contextual item,
Readitsquality-list/items/<slug>.mdbody — plus everylang-<lang>.mdaddendum section for a language Step 0 detected, self-loaded here — before deciding its status. Read only the contextual-lane bodies — plusported-code-attribution's own body, which the undeclared-port half is decided from even though the item is index-taggedmechanical (+ contextual half)— not a purely mechanical-lane item's body. For each, determine one of:- △ active — this item will apply to the finished diff; record the concrete setup action to do now (fixture variants, guard locations, paired-artifact surfaces, probes to thread through).
- ⊘ N/A — the item's own N/A criterion excludes the scope. State why.
- ? unknown — the body is read, but applicability turns on a scope fact not yet settled; record the scope check that would decide it.
-
Merge results. Integrate the mechanical-lane rows the subagent returned with the contextual-lane rows (Step 3) into a single table.
domain: every item in the `quality-list/SKILL.md` Items index coverage — the subagent's returned mechanical rows against the mechanical-lane slug set the index predicts. This applies to a full-set dispatch; a narrowed single-item return (Step 5) is exempt: exactly one row per predicted slug, and no others → proceed any other return (a slug missing, duplicated, or outside the predicted set), first occurrence → re-dispatch Step 2 with the prompt unchanged; re-check any other return, after that re-dispatch → surface to the user; do not proceed with the mechanical lane incomplete, and do not emit the table row rendering — one row per item, in index order: single-lane item → that lane's verdict dual-lane, either half △ → △ active; name which half dual-lane, both halves ⊘ → ⊘ N/A dual-lane, otherwise → ?A half left
?at merge time carries its scope check forward to Step 5, so the half's own setup action is not lost behind an active status.If the subagent returned a discrepancy list, adjudicate each: correct the affected row's setup action to match what the subagent found, or — if the scope description was right and the subagent's codebase read was the mistaken side — note that resolution instead rather than rewriting the row.
-
Resolve every
?before declaring preflight done.domain: every unsettled scope check — the one behind a single-lane `?` row, and one per unsettled half of any dual-lane row, which can therefore carry two. Each check belongs to exactly one lane; settle them one at a time. pass 1 — settle the scope fact, by the lane of the check being settled: mechanical lane, and the subagent stated a verdict per answer to its scope check → settle the fact; read the matching verdict off. If the settled answer is not one it enumerated, take the arm below mechanical lane, otherwise → narrowed re-dispatch (below) contextual lane → settle the scope check Step 3 recorded, in main context pass 2 — record the outcome: settled, single-lane `?` row → △ with a concrete setup action | ⊘ with a reason settled, a half of a dual-lane row → add that half's own setup action to the row's Setup action cell, or note the half N/A there with its reason, alongside whatever the other half already put there. The row's status is then Step 4's row-rendering rule over its two half-statuses, so a row already rendered △ stays △ could not be settled at preflight time → surface to the user, naming what the row already carries; do not declare preflight done, and do not emit the table always: never read a purely-mechanical item's body in main context. always: a setup action that names a command to run (e.g. `public-api-surface`'s `cargo public-api` baseline) is still a planning action — state that the command runs before implementation, don't run it now.Narrowed re-dispatch. Re-dispatch the subagent with the Step 2 prompt narrowed to that one item — replace its "Select every item whose lane is
mechanical…" sentence with "Process only<slug>", or forported-code-attributionwith "Process onlyported-code-attribution's declared-port signal (the undeclared-port signal stays main context's job)", keeping the sentence after it that tells the subagent to read the selected item's body in full. Its single-item return is exempt from Step 4's whole-set coverage check. -
Report the preflight table. Hand the △ rows to the implementation step as setup actions.
Preflight framing per item (quick reference)
These are how each quality-list item reads in preflight mode — a compressed mnemonic of the lens-shift from the item's audit question to a preflight setup action. A row is not the applicability authority and decides nothing: Step 3 reads each contextual item's body (quality-list/items/<slug>.md) plus any applicable addendum, and that — with the index as the item set — decides whether it applies. Consult a row for its setup framing once the body has marked the item active.
This list covers only the contextual-lane items (and the contextual half of the dual-lane item) that Step 3 processes. Mechanical-lane items have no row in this quick reference (they still get a row in the final preflight table, per Step 4): the subagent never reads this file, so a mnemonic for it would have no consumer.
invariant-derivation— Before patching, derive the full necessary-and-sufficient condition from first principles. List it in the plan.purpose-verification— Identify the input that exposes the purpose end-to-end. Plan to exercise it before declaring done.pattern-audit— Plan to re-derive any reused sibling pattern's correctness in the current context before relying on it.scope-discipline— Resolve to evaluate findings on their merits, not narrowed to the originating task.test-execution— Plan which test commands will be run, and capture the pre-existing failure baseline before any edit.completion-hygiene— Plan which lint / format / type-check / build commands will be run. Note any debug artifacts to strip.escape-hatch-necessity— Plan to derive any workaround's necessity before using it, treating it as a last resort rather than a default.docstring-drift— List the docstring / comment / README surfaces describing any behavior the change alters, and plan a cold-read re-verification of each against the new behavior, with an execution probe where the behavior becomes library-owned.discovery-surfacing— Extract any research plan'sInconclusiveitems into a watch list for the implementation phase.ported-code-attribution(undeclared-port half) — If research surfaced an external implementation this scope structurally follows but hasn't named, plan the attribution surface now even though no comment names it yet.
Output format
preflight: <task / unit description>
| Item | Status | Setup action / N/A reason |
|-------------------------------|----------|--------------------------------------------------------|
| invariant-derivation | △ active | derive condition for <invariant> from <constraint> |
| scope-discipline | ⊘ N/A | no findings raised yet |
| behavior-coverage | △ active | fixtures: 3-site MPS bulk variant, non-square 2×3 ... |
| implementation-guards | △ active | assert! at <site>; review siblings <a>, <b> |
| architectural-boundary | ⊘ N/A | no new imports / dep edges / pub widening |
| paired-artifact-drift | △ active | sweep: examples/foo.rs, README.md, doctests in <mod> |
| discovery-surfacing | △ active | watch: inconclusive[1] probe at <site>; branches X/Y |
Emit one row per item in the quality-list/SKILL.md Items index, in index order — the rows above illustrate the format and the status vocabulary (△ active / ⊘ N/A), not the full set. ? unknown is a working state that Step 5 resolves, so it never appears in the final table. Step 4 and Step 5 each also carry a halt path, and a halted preflight emits no table. The table merges the mechanical-lane rows (Step 2's subagent) with Step 3's contextual-lane rows, per Step 4. Hand the △ rows forward as the implementation setup.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.