Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Persistent TODO scratch pad for tracking tasks across sessions. Use when user says "add to TODO", "what's on the TODO", "mark X done", "show TODO list", "remove from TODO", or asks about pending tasks. Also triggers on heartbeat to remind about stale items.
.claude/skills/jdrhyne-todo-tracker/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 553% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -34% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -15% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -33% | 0% |
Maintain a portable Markdown task file without a service or database. Use the bundled script for every operation; do not edit task lines with ad hoc regex commands.
Runtime requirements: Bash and standard awk, cp, chmod, mkdir, mktemp, and mv utilities. Tasks are stored in a user-configurable local Markdown file.
TODO_FILE selects the task file. Default: TODO.md in the current workspace.{baseDir} so execution does not depend on the current directory.600, and a recoverable previous-state backup at ${TODO_FILE}.bak.${TODO_FILE}.next-id is an adjacent mode-600 monotonic ID counter. Keep it with the task file when moving or restoring the tracker; backup rotation must not replace or delete it.bashTODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" list
Do not use a machine-specific path. Quote TODO_FILE, IDs, and item text.
New tasks receive monotonic IDs such as T000001. Task text is matched literally and exactly, never as a regex or substring.
${TODO_FILE}.bak, and any valid existing counter. It reserves and atomically persists the next counter value before publishing a task-file mutation, so a crash may create an ID gap but cannot reuse an ID.0600 counter fails closed; do not delete or reset it to bypass the check.done and always use an ID for approved removal.bashTODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" list TODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" list high TODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" summary
If the file does not exist, list reports that fact and summary returns zero counts. Neither creates state.
bashTODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" add high "Review launch checklist"
Priority must be high, medium, or low. Capture the returned stable ID.
bashTODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" done T000001
Exact text is accepted only when it identifies one open task. Completion preserves the stable ID and moves the task to Done.
Removal is destructive and requires an exact preview plus action-time approval.
${TODO_FILE}.bak, and no task is removed:bash TODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" remove "exact task text"
The command exits without removal and prints the exact stable ID. Repeating the operation uses the persisted ID rather than migrating or advancing the counter again.
bash TODO_FILE="$PWD/TODO.md" bash "{baseDir}/scripts/todo.sh" remove T000001 --confirm T000001
Never infer approval from a partial name, prior unrelated removal, or a bulk request. Remove tasks one exact stable ID at a time.
Heartbeat access is off by default. Enable it only when the user explicitly opts in by configuring TODO_HEARTBEAT_ENABLED=1 for that heartbeat workflow.
bashTODO_FILE="$PWD/TODO.md" TODO_HEARTBEAT_ENABLED=1 \ bash "{baseDir}/scripts/todo.sh" heartbeat
Heartbeat output contains counts only: total, high, medium, low, and stale. It never prints task titles or notes. Do not create a schedule merely because this skill is installed.
markdown# TODO Tracker *Last updated: 2026-08-29* ## 🔴 High Priority - [ ] [T000001] Review launch checklist (added: 2026-08-29) ## 🟡 Medium Priority ## 🟢 Nice to Have ## ✅ Done - [x] [T000002] Verify release notes (done: 2026-08-29)
If a write fails because the lock exists, do not remove the lock while another process may be active. Investigate the writer and retry only after the lock is known to be stale.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 12,131 | 31,351 | +158% | 1 | 1 | 0% | 637 | 1,755 | +176% | 0 | 0 | — |
case-15 | fail→pass | 16,607 | 9,878 | -41% | 1 | 1 | 0% | 1,591 | 2,140 | +35% | 0 | 0 | — |
case-02 | fail→fail | 12,417 | 31,769 | +156% | 1 | 1 | 0% | 1,098 | 2,034 | +85% | 0 | 0 | — |
case-03 | fail→fail | 7,049 | 17,523 | +149% | 1 | 1 | 0% | 269 | 1,727 | +542% | 0 | 0 | — |
case-04 | fail→pass | 11,342 | 34,195 | +201% | 1 | 1 | 0% | 924 | 6,034 | +553% | 0 | 0 | — |
case-05 | fail→fail | 12,939 | 8,280 | -36% | 1 | 1 | 0% | 1,199 | 1,891 | +58% | 0 | 0 | — |
case-06 | fail→pass | 30,241 | 8,329 | -72% | 1 | 1 | 0% | 2,792 | 1,856 | -34% | 0 | 0 | — |
case-07 | fail→pass | 28,814 | 8,438 | -71% | 1 | 1 | 0% | 1,949 | 1,659 | -15% | 0 | 0 | — |
case-08 | pass→pass | 13,821 | 9,731 | -30% | 1 | 1 | 0% | 1,264 | 1,765 | +40% | 0 | 0 | — |
case-09 | pass→pass | 15,984 | 9,235 | -42% | 1 | 1 | 0% | 1,394 | 1,972 | +41% | 0 | 0 | — |
case-10 | fail→fail | 12,490 | 8,362 | -33% | 1 | 1 | 0% | 1,082 | 1,914 | +77% | 0 | 0 | — |
case-11 | fail→pass | 23,042 | 8,767 | -62% | 1 | 1 | 0% | 2,503 | 1,689 | -33% | 0 | 0 | — |
case-12 | fail→pass | 16,798 | 10,487 | -38% | 1 | 1 | 0% | 1,640 | 1,683 | +3% | 0 | 0 | — |
case-13 | pass→pass | 19,267 | 21,816 | +13% | 1 | 1 | 0% | 1,796 | 2,142 | +19% | 0 | 0 | — |
case-14 | fail→pass | 11,328 | 8,989 | -21% | 1 | 1 | 0% | 1,638 | 1,936 | +18% | 0 | 0 | — |
case-16 | pass→pass | 16,504 | 8,803 | -47% | 1 | 1 | 0% | 1,727 | 1,821 | +5% | 0 | 0 | — |
case-17 | pass→pass | 15,786 | 7,902 | -50% | 1 | 1 | 0% | 1,643 | 1,775 | +8% | 0 | 0 | — |
case-18 | fail→pass | 18,023 | 9,149 | -49% | 1 | 1 | 0% | 1,554 | 2,101 | +35% | 0 | 0 | — |
case-19 | fail→pass | 29,303 | 8,183 | -72% | 1 | 1 | 0% | 1,979 | 1,829 | -8% | 0 | 0 | — |
case-20 | pass→pass | 11,394 | 5,931 | -48% | 1 | 1 | 0% | 1,134 | 2,255 | +99% | 0 | 0 | — |
case-21 | pass→pass | 7,214 | 5,889 | -18% | 1 | 1 | 0% | 1,381 | 2,251 | +63% | 0 | 0 | — |
case-22 | pass→pass | 8,563 | 15,548 | +82% | 1 | 1 | 0% | 1,684 | 2,551 | +51% | 0 | 0 | — |
case-23 | pass→pass | 12,882 | 7,151 | -44% | 1 | 1 | 0% | 1,336 | 2,350 | +76% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +39 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/24/2026 | — |
Other measured skills in the registry, with their headline benchmark lift.