7.5 KiB
Multi-dimensional Roadmap state
Use this pattern when an Idea/Epic/Feature Roadmap must combine approval evidence, solution state, and the unified delivery status without conflating them.
Preserve orthogonal authority
Do not rename or overwrite one domain's state with another domain's state. Render the dimensions separately:
| Dimension | Owner | Example states |
|---|---|---|
| Approval gate | Scope | proposed/unapproved, Approved for Solution, rejected/deferred decision history |
| Solution | Architecture | Incomplete, Complete |
| Implementation approval | Architecture | Approved for Implementation, Not verified |
| Unified delivery | Scope roll-up + Kanban/Delivery/Releases evidence | Product: IN_BACKLOG, IN_DESIGN, IN_DELIVERY, TO_BE_RELEASED, DONE; Task: IN_BACKLOG, IN_PROGRESS, TO_BE_RELEASED, DONE |
Approved for Solution remains immutable gate evidence after solutioning. It is not a delivery status. A Roadmap that shows only the gate is incomplete, not evidence that work is blocked or delivered.
Fail-closed publication fields
The browser adapter must consume verifier-derived fields, not raw approval-shaped YAML. Publish a boolean such as implementation_approval_verified only after the build-time verifier binds the exact item, state, actor/authority, UTC decision time, evidence, conditions, immutable history, and baseline. Mutation-test the decision hash/evidence/actor so the public field becomes false.
Continue to consume only verifier-admitted exact Task status and validated required-child relationships for unified delivery roll-up.
Aggregate delivery
An Idea, Epic, or Feature displays a required-child roll-up without inventing an exact parent transition:
- Validate one direct roll-up set: Idea → resulting Epics/Features, Epic → required Features, Feature → required Tasks. Do not count an Epic and its descendant Feature for the same Idea outcome.
- Preserve exact Task states and direct no-child decisions with
status_source: EXACT; mark every product roll-upstatus_source: DERIVED. - Evaluate required children in this order:
- all non-empty children
DONE→ parentDONE; - otherwise all children in
{TO_BE_RELEASED, DONE}with at least oneTO_BE_RELEASED→ parentTO_BE_RELEASED; - otherwise any descendant in active or later execution → parent
IN_DELIVERY; - otherwise actively scoped/solutioned → parent
IN_DESIGN; - otherwise parent
IN_BACKLOG.
- all non-empty children
- Never derive
CANCELLED. Exclude a cancelled child only after an explicit Scope decision updates the required set. - Keep the internal
status_sourcetyped, but never exposeDERIVED,EXACT, or(derived)as reader status text. Render the canonical uppercase status unchanged and a separate Status basis value:Required-child roll-uporExact item evidence.
Never infer delivery from approval alone. Never let unverified raw Task state or an incomplete child set influence an aggregate.
Status-basis parity probe
Roadmap and Board/Focus often render through different label paths: Roadmap may read executionState, while lane views read flowState. Probe both paths after loading, validating, and publishing the real canonical database:
- Build Roadmap, Board, and Focus from the same public database.
- Select one aggregate Epic, one aggregate Feature, and one exact task.
- Assert the Epic and Feature expose the expected canonical state plus
Required-child roll-upin rows, nodes, and accessible labels. - Assert the exact Task exposes the expected canonical state plus
Exact item evidence. - Assert reader text contains no
(derived),DERIVED, orEXACTstatus labels while internal source flags remain correct.
Checking state equality alone is insufficient: IN_DELIVERY can be correct while its status basis is missing or misleading.
Epic solution and implementation summaries
For an active Epic:
- report solution complete only when every active child Feature has a complete canonical solution package;
- report implementation readiness as an aggregate such as
All active Features Approved for Implementationonly when every child Feature's implementation decision verifies; - do not fabricate an Epic-level Architecture decision when only Feature decisions exist.
Presentation contract
Each Roadmap node and same-adapter semantic row should expose:
- approval gate;
- solution status;
- implementation approval;
- canonical unified delivery status and separate plain-language Status basis.
Explain the dimensions before the visualization. Remove or explicitly date stale prose such as Delivery has not started; generated current state supersedes historical execution assertions without rewriting the historical checkpoint.
Visual QA is a governance check, not cosmetic polish:
- initial fit must show every node fully;
- all state values must be legible without mandatory first-use panning/zooming;
- graph and table values must match;
- no clipping or overflow;
- preserve square styling (
border-radius: 0).
A wide left-to-right dependency chain can force unreadable 25% zoom. Prefer a top-to-bottom governed sequence when it keeps the complete graph visible at a readable scale. Put fit options in tested adapter output rather than an untested component literal.
Cross-surface reconciliation
A Roadmap fix is incomplete until every sibling surface that repeats or interprets the same state has been checked. Sweep canonical Task evidence, required-child relations, Roadmap graph/table, Kanban Board and Focus prose, Architecture handoff pages, Delivery and release-readiness pages, and their prose-contract tests. Generated current-state components do not neutralize contradictory static prose below them.
Preserve immutable admission and approval events as explicitly dated historical snapshots. Add verifier-derived unified delivery beside them rather than rewriting their original conditions. When Releases establishes that an exact source revision was deployed, update mutable evidence summaries with the exact source, GitOps revision, and durable Releases evidence; move governed items only when the transition and roll-up rules are satisfied.
When YAML evidence prose contains #, do not use an unquoted plain scalar: Application PR #5 ... parses as only Application PR. Use a folded or quoted scalar and add a loader test against the parsed value so the decisive revision/message markers cannot be silently discarded.
RED-GREEN regressions
Add tests before adapter or reconciliation changes:
- verified implementation decisions publish true; a hash/evidence mutation publishes false;
- an active Task derives Feature, Epic, and linked Idea
IN_DELIVERY; - backlog-only required children derive
IN_BACKLOGunless the product item has exactIN_DESIGNevidence; - all required children
TO_BE_RELEASED/DONEderiveTO_BE_RELEASEDwhen at least one remainsTO_BE_RELEASED; - all required children
DONEderiveDONE; - cancelled children fail aggregation until an explicit Scope decision updates the required set;
- raw/unverified status does not render;
- graph nodes, semantic rows, Board, and Focus agree;
- Roadmap fit/layout configuration prevents initial clipping;
- real production pipeline probe:
loadDatabase -> validateDatabase -> publicDatabase -> Roadmap/Board adapterprints the exact state tuple for every rendered Epic/Feature.
Run full validators, TypeScript, strict build, browser QA, independent fail-closed review, exact-head CI, merge, and integrated-head CI before calling the correction published.