Living plan
The plan changes constantly while work happens: tasks get added, scrapped,
replaced, or moved elsewhere. Today tasks.md is a flat checklist, so this churn
is invisible — a reviewer sees only the current boxes, not that the plan evolved
or why. And capturing a mid-work discovery means stopping to decide where it
goes, which breaks flow, so discoveries get dropped.
This change makes the plan's evolution legible and cheap to capture, without
demanding up-front planning and without noisy diffs. It is the task-level analog
of OpenSpec's intent history: not "what the patch was" but "how the plan moved."
Solution
1. Discovery capture — a holding pen. A ## Discoveries section agents
append to mid-work without triaging:
specsync note -slug <slug> "auth refresh races with logout"
It is a managed section (rendered into the issue like ## Tasks / ## Related,
stripped on pull so it never pollutes proposal.md). Capture now, triage later
— promote a discovery to a task (in scope) or specsync spinoff it (out of
scope).
2. Preserved original intent. When a change starts from an issue, pull
seeds an ## Original ask block in proposal.md from the first issue body.
specsync treats it as read-only on sync — never overwritten on push or
re-pull, only displayed — so the spec winning everything else can never quietly
erase the intent you originally agreed to. When intent genuinely shifts mid-work,
you append a dated "Revised scope: … (was: …)" note rather than mutating the
block. That is the intent-history anchor the two-way reconcile policy depends on.
3. Churn-legible task states. Extend the checkbox vocabulary so scrapped and
moved tasks stay visible instead of vanishing from git:
- [ ] todo
- [x] done
- [~] dropped: superseded by the new client
- [>] moved: rate-limit-bug
specsync renders the live checklist from [ ]/[x] only, and adds a compact
Plan changes footer to the issue — e.g. +3 added · 2 done · 1 dropped · 1 moved — so a reviewer sees the plan evolved and why, at a glance. Dropped and
moved lines never count against progress.
Non-goals
- Full task database, dependencies, or
bd ready semantics — that is Beads, via
beads-memory-bridge. This change stays plain-markdown and render-only.
- Two-way reconcile of checkbox state edited on the issue — separate change
(two-way-reconcile); this change only adds the ## Original ask anchor it
relies on.
- Deciding scope for a discovery — that is the human/agent's call at triage.
Tasks
Living plan
The plan changes constantly while work happens: tasks get added, scrapped,
replaced, or moved elsewhere. Today
tasks.mdis a flat checklist, so this churnis invisible — a reviewer sees only the current boxes, not that the plan evolved
or why. And capturing a mid-work discovery means stopping to decide where it
goes, which breaks flow, so discoveries get dropped.
This change makes the plan's evolution legible and cheap to capture, without
demanding up-front planning and without noisy diffs. It is the task-level analog
of OpenSpec's intent history: not "what the patch was" but "how the plan moved."
Solution
1. Discovery capture — a holding pen. A
## Discoveriessection agentsappend to mid-work without triaging:
It is a managed section (rendered into the issue like
## Tasks/## Related,stripped on
pullso it never pollutesproposal.md). Capture now, triage later— promote a discovery to a task (in scope) or
specsync spinoffit (out ofscope).
2. Preserved original intent. When a change starts from an issue,
pullseeds an
## Original askblock inproposal.mdfrom the first issue body.specsync treats it as read-only on sync — never overwritten on push or
re-pull, only displayed — so the spec winning everything else can never quietly
erase the intent you originally agreed to. When intent genuinely shifts mid-work,
you append a dated "Revised scope: … (was: …)" note rather than mutating the
block. That is the intent-history anchor the two-way reconcile policy depends on.
3. Churn-legible task states. Extend the checkbox vocabulary so scrapped and
moved tasks stay visible instead of vanishing from git:
specsync renders the live checklist from
[ ]/[x]only, and adds a compactPlan changes footer to the issue — e.g.
+3 added · 2 done · 1 dropped · 1 moved— so a reviewer sees the plan evolved and why, at a glance. Dropped andmoved lines never count against progress.
Non-goals
bd readysemantics — that is Beads, viabeads-memory-bridge. This change stays plain-markdown and render-only.(
two-way-reconcile); this change only adds the## Original askanchor itrelies on.
Tasks
- [~] dropped: <reason>and- [>] moved: <slug-or-#>alongside[ ]/[x][ ]/[x]only; exclude dropped/moved from progress count+N added · M done · K dropped · J moved)## Original askas a preserved section:pullseeds it from the first issue body; treated as read-only on sync (never overwritten on push or re-pull, only rendered)## Original askbyte-identical; intent changes go in appended "Revised scope:" notes, not edits to the block## Discoveriesas a managed section: rendered into the issue, stripped insplitBodyon pull (like## Tasks/## Related)specsync note -slug <slug> "<text>"to append a line to## Discoveries+author marker) — keep it lightweightnote: show the would-append line, write nothing## Discoveriesround-trips (rendered, then stripped on pull);noteappend is idempotent-safe## Discoveries, andspecsync notein the skill + README-dry-run