I3439 — Now and next are derived once, and every plan surface names the same two
One function derives the milestones in flight (now) and the milestone the graph allows next, plan.flight answers from it, plan.roadmap stops answering a now and a next of its own, and every surface that names now or next (/ui/roadmap, the Overview, the observatory, the shell's plan roadmap) reads that one answer under a caption that says exactly what next is.
BLOKOVÁNO vlna 1 · p1 · profil implementation · běží samostatně
Blocked. This issue cannot start until I3442 is done. The status is derived from that, not declared.
Cíl
One function derives the milestones in flight (now) and the milestone the graph allows next, plan.flight answers from it, plan.roadmap stops answering a now and a next of its own, and every surface that names now or next (/ui/roadmap, the Overview, the observatory, the shell's plan roadmap) reads that one answer under a caption that says exactly what next is.
Proč
On 2026-10-19 the owner asked that /roadmap be correct and connected. Review finding P3: plan.flight and plan.roadmap disagree on now and next (the review read now M004 plus 5 other milestones with next M002 from plan.flight, against now M002 and next M003 from plan.roadmap), and the /ui/roadmap caption saying next is the first milestone the graph allows 'after them' is false, because a milestone with no prerequisite at all qualifies. The work starts only after the exclusive mesh claim another session holds on apps/majordomus-cli/src/plan/flight.rs, apps/majordomus-cli/src/ui/roadmap.rs and apps/majordomus-cli/tests/ui_roadmap.rs is released or handed over.
Aktuální stav
Three derivations of now and next exist. plan.flight (apps/majordomus-cli/src/plan/flight.rs:350-379) puts in now every open milestone holding an issue in flight and takes as next the first open milestone not in now whose blocked_by all lie in now (flight.rs:378), which an empty blocked_by satisfies vacuously, so next can be an idle milestone ordered before everything in flight. plan.roadmap (apps/majordomus-cli/src/capability/builtin/plan.rs:447-478) takes the first open unblocked milestone as now and the following open one as next; read over MCP at master 9904000d2df on 2026-10-19 it answered now M002, next M003. lib/plan.sh:122-176 derives a third pair from the stamps for the shell's plan roadmap. The /ui/roadmap hero and Now panel read plan.flight (apps/majordomus-cli/src/ui/roadmap.rs:86-87, 262-267) under the caption at roadmap.rs:291-293 ('next is the first one the graph allows after them'); the Overview prints plan.roadmap's pair as 'First open in the plan's order' (apps/majordomus-cli/src/ui/dashboard.rs:137-146) because plan.flight is too slow for its first paint; the observatory hands plan.roadmap's now and next to its graph (apps/majordomus-cli/src/ui/observatory.rs:644-645). test/cases/3104_the_ui_roadmap_reads_delivery.sh:111 pins 'Now M2 · next M1', a next ordered before the milestone in flight.
Cílový stav
plan.flight's derivation is the only one: now is every open milestone with work in flight; next is the first open milestone in the graph's order that is not in flight and whose unfinished prerequisites are all in flight or done, and the answer says whether it waits on a milestone in flight. plan.roadmap no longer carries now or next, its description says so, and its projections are regenerated. The Overview, the observatory and lib/plan.sh read plan.flight's pair or name none; the /ui/roadmap caption states the rule next was chosen by and says 'after them' only when next waits on a milestone in flight.
Rozsah
- apps/majordomus-cli/src/plan/flight.rs
- apps/majordomus-cli/src/capability/builtin/plan.rs
- apps/majordomus-cli/src/ui/roadmap.rs
- apps/majordomus-cli/src/ui/dashboard.rs
- apps/majordomus-cli/src/ui/observatory.rs
- apps/majordomus-cli/tests/ui_roadmap.rs
- apps/majordomus-cli/tests/dashboard.rs
- lib/plan.sh
- test/cases/3104_the_ui_roadmap_reads_delivery.sh
- test/cases/99_plan_capabilities.sh
- docs/PLANNING.md
- .claude/skills/mj-plan/SKILL.md
- docs/generated/capabilities.md
- docs/generated/modules/plan.md
- docs/generated/openapi.json
- docs/generated/openapi.yaml
- docs/generated/registry.json
- docs/generated/registry.yaml
- site/data/generated/openapi.json
- site/data/registry/registry.json
- site/content/registry/capabilities/plan-roadmap.md
Mimo rozsah
- Changing what puts an issue in flight (an open pull request, a live mesh claim, an ACTIVE status).
- The milestone order itself (rank, then order): that is I3441's question of what the reader is shown.
- Caching plan.flight: I3442.
Závislosti
Co na tom čeká
Kritéria přijetí
- One function computes now and next; plan.flight answers from it and no other module computes a now or a next (a grep for a second derivation in plan.rs, capability/builtin/plan.rs and lib/plan.sh finds none)
- plan.roadmap's answer carries no now and no next, and majordomus generate --check passes with its regenerated projections
- /ui/roadmap, the Overview and the observatory name the same now and next as plan.flight on one fixture; a fixture where plan.roadmap's old rule and plan.flight disagree shows only plan.flight's pair on every one of them
- A next whose prerequisites are all done is not captioned as coming after the milestones in flight; a next that waits on a milestone in flight is
- With nothing in flight, every surface says nothing is in flight and none names the plan's first open milestone as now
Validace
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib plan::flight
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test ui_roadmap
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test dashboard
- bash test/run.sh 3104_the_ui_roadmap_reads_delivery 99_plan_capabilities
- bin/majordomus generate --check
- bin/majordomus plan validate
Požadované důkazy
- now_and_next_derived_once
Důkazy
Nic nezaznamenáno. Za každým tokenem výše musí stát příkaz nebo artefakt, než lze tento úkol dokončit; vyprávění se odmítá.
Časová osa
- zahájeno
- —
- ověřeno
- —
- dokončeno
- —
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Canonical record: .ai/repo/project/issues/I3439.yaml. Read it back with majordomus plan show I3439.