executing-plans: task-done ledgers the last log line as the test result, so `node --test` runs record `# duration_ms …` instead of pass/fail
- I searched existing issues and this is not a duplicate
Searched open and closed issues and PRs for task-done, ledger, duration_ms, "last non-blank", and "test result". The nearest are #2267, #2293 and #2253, which are about what the ledger omits (discoveries, in-flight tasks, deferred findings). None covers the content of the tests: … → <result> field.
Environment (required)
| Field | Value |
|---|---|
| Superpowers version | 6.4.1 (also checked dev and main today: the line in question is unchanged on both) |
| Harness (Claude Code, Cursor, etc.) | Claude Code |
| Harness version | 2.1.278 |
| Your model + version | Claude Fable 5.1 (claude-fable-5-1) |
| All plugins installed | Enabled: superpowers 6.4.1, caveman 2.7.0, typescript-lsp 1.0.0, vercel 0.49.2. Other plugins are installed but disabled and were not loaded in this session. |
| OS + shell | macOS 26.6.2, zsh 5.9 (scripts ran under bash via their shebang) |
This issue was written and filed by the agent above at its human partner's request. It comes from a real session: a smoke test of executing-plans 6.4.1 against a throwaway three-task plan (Node 22, node --test), run end to end including the final review.
Is this a Superpowers issue or a platform issue?
- I confirmed this issue does not occur without Superpowers installed
The behavior is in skills/executing-plans/scripts/task-done, which Superpowers ships, so there is nothing to reproduce without it.
What happened?
task-done fills the ledger's result field with the last non-blank line of the test log:
last=$(grep -v '^[[:space:]]*$' "$log" | tail -n 1)
line="Task $n: complete (commits …, tests: $cmd → $last)"For node --test with stdout redirected to a file, the last line is the duration, not the pass/fail summary. Every completion line in the run recorded a duration as the test result.
This is not a correctness bug. task-done gates on the exit status, so a failing run still records nothing. The cost is that the ledger line stops being evidence. SKILL.md tells the executor to trust the ledger over its own recollection after compaction, and the example there shows tests: npm test -- hooks → 1/1 pass. With node --test the same field says nothing about whether tests passed or how many ran. The final reviewer in this run flagged it independently: "progress.md lines 6, 8 and 9 cite the # duration_ms line as test evidence, which does not show pass or fail."
Steps to reproduce
- In a git repo on Node 22 with a passing
node:testfile, runtask-start PLAN 1, make a commit. - Run
task-done PLAN 1 <BASE> -- node --test. - Read the
ledger:line it prints, orprogress.md.
Expected behavior
The result field shows the outcome, as in the skill's own example (→ 1/1 pass), or at minimum something that distinguishes a passing run from any other run.
Actual behavior
The result field shows # duration_ms <n>.
Debug log or conversation transcript
task-done output for Task 1 (the tail -n 5 of the log, then the ledger line):
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 52.464833
ledger: Task 1: complete (commits 0be76af..63193f5, tests: node --test test/slugify.test.js → # duration_ms 52.464833)The other two tasks in the same run:
ledger: Task 2: complete (commits 63193f5..c3f4f53, tests: node --test test/unique-slug.test.js → # duration_ms 44.363458)
ledger: Task 3: complete (commits c3f4f53..070d351, tests: node --test → # duration_ms 159.210958)The full logs had # pass 4, # pass 5 and # pass 12 a few lines above the duration line.
I only hit this with node --test. I have not checked other runners, so I am not claiming anything about them.
One possible direction, offered as a starting point only: record the exit status in the line (→ exit 0; <last line>), so the field carries a runner-independent fact even when the last line is not a summary.
Source: obra/superpowers