Delivery Planning
Roadmap, Initiatives and Work Items cover strategy, grouping and execution. Delivery Planning adds two optional canonical artifacts for coordinating complex delivery without burying milestones and responsibilities in ad-hoc Markdown:
- a Delivery Plan (
PLAN-xxx) — how a strategic intent becomes phases, with milestones, exit criteria, dependencies, success criteria and risks; - an Epic (
EP-xxx) — a significant outcome spanning several Work Items or fronts of work.
Model
Roadmap └── Delivery Plan (PLAN-xxx) └── Milestone (RM-xx) └── Epic (EP-xxx) └── Initiative (INI-xxx) └── Work ItemsAssociations are declared one way and never duplicated: initiative.epic → EP, epic.plan +
epic.milestone → PLAN/RM, work_item.epic optional. An Epic or Plan derives its Initiatives and
Work Items — it never stores a list of them (no second source of truth). Milestones are checkpoints
defined inside the Plan (id, title, exit criteria); they carry no independent lifecycle state.
Progress — kept separate
Progress is computed from the real state of related elements, never a single arbitrary percentage:
- Planning coverage — Initiatives and candidates (materialized vs pending).
- Delivery progress — Work Items by lifecycle state, and how many are blocked.
- Completion readiness — success criteria, blocking dependencies and whether committed work is
complete.
meetsCompletionPreconditionsis a structural signal only; the canonical readiness is the evidence-based evaluation below. Closing a Plan or Epic always requires human approval — an Epic is never “done” just because its Work Items are; the outcome’s criteria must also be verified.
Lifecycle & evidence-based completion
Plans and Epics have a real, human-gated lifecycle. Kaddo separates work finished (all Work Items done) from outcome achieved (the declared success criteria verified with evidence).
Transitions. draft/planned → in-progress → completed / cancelled. Starting and cancelling
are ordinary transitions; completing is a dedicated, gated operation — the general transition
refuses → completed and points to the completion command. Transitions preserve the id, relations,
unknown frontmatter and Markdown body, and use the same revision fingerprint for optimistic concurrency.
Outcome verification. Each declared success criterion (and each milestone exit criterion) can carry
a verification record — status (passed / failed / not-verified / manual-review-required), evidence
(what it shows, not just a checkbox), reference (file, test, ADR, report), method and verified_by
— stored canonically in outcome_verifications on the Plan/Epic and in each milestone’s
exit_verifications. Evidence is matched to a criterion by its text: reordering is safe, and
editing a criterion leaves the old evidence stale (surfaced, never silently reattributed or
auto-passed). Criteria that collide in text must be disambiguated before evidence can be attributed.
Completion readiness is one of READY_TO_COMPLETE, READY_WITH_EXCEPTIONS, NEEDS_WORK or
BLOCKED, with reasons and findings. It is conservative: no outcome, no criteria, unverified or failed
criteria, incomplete committed work, invalid references or a blocking dependency all keep it from being
ready. A READY_* status never completes anything — completion is an explicit human action that
records a completion_decision (readiness, who decided, when, and why). An accepted completion
exception can waive a specific criterion (with a reason), but never a blocking dependency, incomplete
work, missing deliverables or a data-integrity error.
kaddo epic start EP-001kaddo epic evidence EP-001 --criterion "SSO works end to end" --status passed \ --evidence "Verified against Okta/Azure AD" --reference reports/sso.md --method manual --by dev-akaddo epic verify EP-001 --json # read-only readinesskaddo epic complete EP-001 --by lead # human-gated; refuses unless READY
kaddo plan start PLAN-001kaddo plan evidence PLAN-001 --milestone RM-01 --criterion "Go-live checklist signed" --status passedkaddo plan verify PLAN-001kaddo plan complete PLAN-001MCP exposes the same via kaddo_verify_plan / kaddo_verify_epic (read-only), kaddo_record_plan_evidence
/ kaddo_record_epic_evidence, kaddo_transition_plan / kaddo_transition_epic, and
kaddo_complete_plan / kaddo_complete_epic (preview → confirm). A confirm: true flag is a
confirmation step, not by itself proof of human approval.
Ownership
An Initiative can declare owners and contributors — planning metadata only, never authorization and
never inferred from Git. Kaddo distinguishes Declared Responsibility (these fields) from Observed
Git Activity (a future, read-only capability; not implemented here).
Dependencies
depends_on relates Epics to Epics (and reuses Work Item depends_on). Core validates the planning
graph deterministically: invalid references, dependency cycles, duplicate milestones and pending
(blocking) dependencies. A dependency never changes another element’s lifecycle.
CLI
kaddo plan listkaddo plan show PLAN-001kaddo plan progress PLAN-001kaddo plan create
kaddo epic listkaddo epic show EP-001kaddo epic progress EP-001kaddo epic createkaddo epic associate EP-001 INI-010MCP
Read: kaddo_list_plans, kaddo_get_plan, kaddo_get_plan_progress, kaddo_list_epics,
kaddo_get_epic, kaddo_get_epic_progress, kaddo_validate_planning. Mutations
(kaddo_create_plan, kaddo_create_epic, kaddo_associate_initiative_epic) follow the
preview/confirm pattern and write only under knowledge/delivery/.
Admin — Planning Explorer and Management
Kaddo Admin includes a Planning section (/planning) to explore a plan end to end: Plan →
milestones → Epics → Initiatives → Work Items, with derived progress, dependency blocks and declared
responsibilities, and links into Work Item and Initiative detail.
From the same space you can also build and maintain the planning structure without the CLI:
- Create a Delivery Plan (Overview, the Delivery Plans tab, or the empty state) — Kaddo generates
the id and sets status
draft. - Edit a Plan (title, objective, success criteria, risks, dependencies, references) and manage its milestones (add, edit, remove) from the plan detail.
- Create an Epic (independent or under a Plan and one of its milestones) and edit it (outcome, plan, milestone, success criteria, dependencies, related capabilities, decisions).
- Associate, reassign or remove an Initiative on an Epic, and manage the same association from the Initiative’s Planning Context.
Every change goes through Core (the same contracts used by the CLI and MCP), so artifacts stay canonical and interoperable. Edits are metadata only: they never change a lifecycle state, and completion of a Plan or Epic always stays human-gated. References are validated (invalid or circular Epic dependencies and milestones not defined in the selected Plan are rejected), a milestone still referenced by an Epic cannot be removed or renamed, and a concurrent edit to the same artifact is detected via a revision fingerprint so a stale form is never saved silently.
Associating an Initiative with an Epic is also available from the CLI (
kaddo epic associate) and MCP (kaddo_associate_initiative_epic).
Execution Insights
The Planning Overview also presents a read-only execution view that turns the signals Core already computes into decisions, without inventing metrics or duplicating domain rules. It answers how are we doing?, what needs attention?, what outcomes have we demonstrated? — and never writes anything.
It keeps the three dimensions separate (there is no single project percentage or health score):
- Planning Coverage — Initiative candidates materialized vs total.
- Delivery Progress — distinct Work Items by lifecycle state (deduplicated by id across Initiative/Epic/Plan associations; independent Work Items are counted separately, never forced into a hierarchy).
- Outcome Verification — declared success criteria vs recorded evidence (reusing the WI-078/WI-079
verification engine — no parallel verifier), with
passed/failed/not-verified/manual-review/ambiguous/stalekept distinct. A completed delivery whose outcome is unverified is not done.
Three attention indicators summarize distinct families (never summed together): blocking issues (blocked dependencies, broken relations and provenance), outcome needs verification, and milestones needing review (exit criteria pending, failed or ambiguous — never inferred from the Epic’s status).
A Needs attention queue lists deterministic, explained signals — dependency,
incomplete-delivery, pending-candidates (a coverage signal, not an execution blocker),
unverified-outcome, provenance and declared risk (declared risks are a separate category from
detected blockers; there is no invented risk score). Each entry carries its artifact, a concrete
reason and a link to the canonical detail, and is filterable by signal type and artifact type.
Completion readiness (READY_TO_COMPLETE / READY_WITH_EXCEPTIONS / NEEDS_WORK / BLOCKED) is
shown distinct from lifecycle completed — “ready” means human approval can be requested, not that
the entity is closed. When a denominator is zero, the view shows “no data” instead of a fabricated 0%.
On the Overview the queue is a compact summary — at most five findings or groups up front, with the
honest total of findings and affected artifacts — so Delivery Plans, Epics and Initiatives stay visible.
View all findings opens a read-only attention explorer (an in-place drawer, no new route) that
filters by signal type, artifact type and severity, groups by artifact without losing individual
findings, and keeps the counts honest when filtered. Each finding shows its artifact, a diagnostic, an
impact and a concrete next step (Review Initiative, Inspect reference, Review outcome evidence…) — a review action, never an auto-fix. There is no dismiss, resolve or state change.
Provenance diagnostics
A candidate’s materialized_as is a 1:1 reference — exactly one canonical Work Item id. Core
classifies each one (reusing the WI-078/WI-079 engine, no parallel verifier) rather than string-matching
the whole value:
- valid — resolves to one existing, consistently-associated Work Item;
- missing — a single canonical id that does not exist → blocking integrity defect;
- mismatch — the Work Item exists but belongs to another Initiative → blocking;
- ambiguous (legacy) — a value that is not a single canonical id (e.g. a historical composite like
AN-005, AN-006, AN-007) → a warning, never claimed as a missing Work Item.
An ambiguous reference is never rewritten, split or migrated, and recognizing its shape never marks
it validated: it is not counted as validated coverage and keeps the Initiative out of READY
(NEEDS_WORK) until inspected. Genuine missing/mismatch defects stay blocking. materialized_as stays
1:1 — this is a diagnosis, not a contract change.
Honest coverage. Planning Coverage distinguishes declared materialization (materialized, the
field is set) from validated references (validated, the reference resolves). When they differ the
Overview shows both (“41 declared · 38 validated”) with unresolved = materialized − validated; a
declared reference is never presented as verified integrity.
The projection is served read-only at GET /api/v1/admin/planning/insights.
Knowledge Graph
Plans, milestones and Epics appear as graph nodes; declared relations become belongs_to edges
(epic→plan, milestone→plan, initiative→epic) and depends_on edges between Epics — declared relations
only, never inferred.