executing-plans: task-done ledgers the last log line as the test result, so `node --test` runs record `# duration_ms …` instead of pass/fail

Author: koreankopCreated Sep 19, 2026Updated Oct 1, 2026
Labelsskill:executing-plans
  • 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:

bash
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

  1. In a git repo on Node 22 with a passing node:test file, run task-start PLAN 1, make a commit.
  2. Run task-done PLAN 1 <BASE> -- node --test.
  3. Read the ledger: line it prints, or progress.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.