Phased Implementation with Plan-as-State
Using markdown plan tables as the task state machine with timestamp audit trails.
The Lesson
Using the plan document itself as the task state tracker — with timestamps written directly into markdown tables — enables strict one-commit-per-phase discipline and makes progress machine-readable without requiring external project management tools. The plan is both the specification and the status board.
Context
A 6-phase implementation of a static site was executed by an AI agent (Claude Code) following a phased release plan. Each phase had 5-8 tasks tracked in a markdown table with Status, Started (PST), and Completed (PST) columns. The same task table existed in two places: the master plan (final.plan.md) and the per-phase execution plan (plan/phase{NN}/plan.md). The agent updated both as it worked, committed once per phase, and never committed partial work.
What Happened
- The finalized plan defined 6 phases with task tables in
final.plan.md. Each task row had columns: No, Status, Started, Completed, Description. - The
expandstep generated per-phase plans with identical task tables plus detailed context (files to create, patterns to follow, import paths). - During execution, the agent flipped each task to “Started” with a PST timestamp, did the work, then flipped to “Completed” with another timestamp. Both files were updated.
- When all tasks in a phase reached Completed, the agent wrote a Phase Summary block, staged all changes (code + updated plan files), and committed with a phase-scoped message.
- Phase 00 task 00.7 (deploy to GitHub Pages) was marked “Blocked” because no remote repository was configured. The blocked state was recorded in the plan with a note explaining why.
Key Insights
- Markdown tables are a surprisingly good state machine. The Status column with defined transitions (Open -> Started -> Completed, with a Blocked branch) is a finite state machine encoded in a format humans can read and AI agents can parse. No database, no API, no project management tool required.
- Two-file state with an authority rule prevents drift. Having the task table in both
final.plan.md(master) andplan/phase{NN}/plan.md(detail) means you can see big-picture progress OR phase-level context. The rule “if they drift,final.plan.mdis authoritative” prevents ambiguity. - PST timestamps create an execution audit trail. Knowing that task 00.1 started at 3:45 PM and completed at 3:48 PM (3 minutes) vs. task 01.1 taking 12 minutes tells you where complexity actually lives.
- One commit per phase is enforceable when the plan is the tracker. The commit protocol says: “stage and commit when every task in the phase is Completed.” This is mechanically verifiable by reading the plan.
- Blocked states with notes prevent false-negative confusion. Without an explicit Blocked state, a task stuck at Open could mean “not started yet” or “can’t proceed.” The Blocked state with a note distinguishes intentional deferral from oversight.
Applicability
This pattern works well for: AI-agent-executed work (agents parse markdown reliably), solo projects without team coordination overhead, and any project where the plan is the only project-management tool.
It does NOT scale to: large teams needing concurrent task assignment (markdown merge conflicts), tasks with complex dependency graphs (the table can’t express DAGs), or workflows requiring notifications/integrations.