Expand description
Task readiness: a derived projection of the canonical status, and not a second vocabulary for it.
§Why there is one at all
crate::plan::ISSUE_STATUSES is the canonical vocabulary — READY, BLOCKED,
ACTIVE, VERIFY, DONE, CANCELLED — and it is right for what it is: the six words
lib/project.awk derives, held to byte equality with the shell engine by
test/cases/99_plan_capabilities.sh. Nothing here changes, replaces or renames any of
them; every TaskReadiness carries the canonical status it was derived from, so a caller
that wants the canonical word has it on the same object.
What it adds is exactly the distinctions the canonical six already make in the data and cannot express in the word:
BLOCKEDis two situations. The plan’s own derivation appendsmilestone:<id>to an issue’sblocked_bywhen the milestone gate holds it, on top of whatever issue dependencies it has. An issue with every dependencyDONE, held back only because the outcome it belongs to waits on another outcome, is not the same problem as an issue waiting on a peer: the first is resolved somewhere else entirely.TaskReadiness::Waitingis that case;TaskReadiness::Blockedis the other.VERIFYis two situations. The plan reachesVERIFYwhenverified_atorcompleted_atis set, and it emits theevidence_missingfinding for the second of those when the required evidence is not all there. SoVERIFYcovers both “the work is done and someone must confirm it” and “someone already declared it complete and the evidence does not back that up” — the second is a defect a person has to act on, the first is a queue.TaskReadiness::ReviewandTaskReadiness::CompletionBlocked.- an id the model does not have.
plan.issuescannot answer for one at all, and answeringBLOCKEDor an empty object for a typo is the one answer a work surface must never give.TaskReadiness::Undeclared.
and nothing else. There is no in_review, no needs_triage, no wontfix: three words
that no field of any canonical record could distinguish, which is what makes them
frontend strings rather than workflow.
§The mapping is total and one-way
Every canonical status maps to exactly one readiness, and TaskReadiness::canonical maps
back. The three added distinctions are refinements inside a canonical status, never
across two, so the round trip through canonical is lossless in the direction that
matters: no readiness can claim a canonical status the plan did not derive.
Structs§
- Blocker
- One thing standing between a task and being startable, with what to do about it.
Enums§
- Blocker
Kind - What kind of thing is holding a task back. The five are the five the canonical model can
actually produce; there is no
other. - Task
Readiness - Where a development task stands, as work.
Constants§
- MILESTONE_
BLOCKER - The prefix the plan’s own
blocked_byuses for the milestone gate. Stated once, because two readers of the same token is how a prefix quietly changes on one side only.