The example-app trial made a gap obvious. Kodr could generate an app and verify it, but the only trace of the work was a prompt, a response, some writes, and test output. Fine for replay. Not enough for a longer run where the harness needs some notion of what it believes is done versus still pending.
So phase 19 adds a small task-plan primitive. Nothing clever - that’s the point.
What a plan is
A plan is a list of tasks, each with a stable id, a description, a status, and an optional note. The first tasks are always the boring-but-real ones: understand the request, inspect context. Proposed file paths turn into edit tasks. Verification and documentation are explicit tasks too, not afterthoughts.
kodr run now writes tasks.json alongside the other run artifacts and drops a taskCounts into summary.json. It is deliberately plain data, not an interactive task manager. That keeps it inspectable, replayable, and easy to hand to a later workflow or repair loop. The workflow primitive now carries the same plan, so staged work and todo-style planning describe one run instead of being two ideas that drift apart.
The plan is also reachable from the bounded tools: list_tasks returns the current plan, update_task flips a single task’s status with an optional note. That gives a ReAct loop a tiny task surface without me building a planner UI nobody asked for.
Early days
I’m calling this out plainly: phase 19 is a foundation, not a finished feature. Right now the plan is generated, persisted, and pokeable through tools - but the harness doesn’t yet do much with it. The interesting work is still ahead: using the plan to drive which stage runs next, to decide when a run is actually complete, to feed repair loops something better than “tests failed.” There’s a fair bit to go here.
For now it’s enough that a run can write down what it thinks it’s doing, in a file I can read. That’s the smallest honest version of planning, and the rest builds on it.
Links:
- Phase doc: phases/19-task-planning.md
- Kodr post: blog/19-task-planning.md
- The task-plan primitive: src/task-plan.mjs