Skip to content

I3267 — One read-only evaluator says what accepting an issue would unblock, from plan.next's own readiness rules

Add plan.impact: for hypothetical accepted issues, return direct and transitive dependents, immediate unlocks (issues that become READY), remaining blockers, milestone state changes and wave changes, with the graph fingerprint and source commit, computed by applying the readiness function of plan.rs to a copy of the plan.

READY wave 0 · p1 · deep-work profile · parallel safe

Part of the-plan-says-what-a-fix-unblocks — The plan says what finishing an issue unblocks, and why each blocked issue is blocked.

Ready. Every dependency is done, so majordomus plan start I3267 will be accepted.

Objective

Add plan.impact: for hypothetical accepted issues, return direct and transitive dependents, immediate unlocks (issues that become READY), remaining blockers, milestone state changes and wave changes, with the graph fingerprint and source commit, computed by applying the readiness function of plan.rs to a copy of the plan.

Why

Owner order 2026-10-17; the number of downstream dependants is not the number newly unblocked (an issue with two prerequisites is not READY after one). /proceed's ranking (I2973) needs the same count and must not grow a second one. On 2026-10-18 f6 settled the overlap on the mesh: I2973 owns the derivation of what a fix unblocks, Plan::unblocks in plan.rs, and orders READY issues by it in plan.rs and lib/project.sh together (case 99); this evaluator projects that one function over CLI, MCP and the snapshot. It waits on in-flight work not yet on master: I2973. Proposed in ADR 0195 (What accepting an issue unblocks is answered by one counterfactual evaluator over the plan graph) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c284#5.

Current state

plan.rs computes readiness, waves and the active milestone; nothing counts what an issue unblocks (no 'unblock' term in plan.rs or capability/builtin/plan.rs).

Desired state

One pure function, exposed on CLI, MCP and HTTP, consumed by I2973 and the Pages page.

Scope

  • apps/majordomus-cli/src/plan.rs
  • apps/majordomus-cli/src/capability/builtin/plan.rs

Dependencies

None. This issue is a root of the graph.

What waits on this

Acceptance criteria

  • Chain, diamond, multi-prerequisite, already-READY and zero-unlock cases are tested
  • Property: no write, order-independent, no duplicate unlock
  • A cyclic or dangling graph fails plan validate before the evaluator runs
  • plan.impact's count of what an issue unblocks is Plan::unblocks, the function I2973 adds to plan.rs (distinct unfinished transitive dependents, each counted once); the evaluator is its read-only projection and computes no second count

Validation

  • majordomus plan validate
  • majordomus intent validate

Evidence required

  • test_what_a_fix_unblocks_is_derived

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I3267.yaml. Read it back with majordomus plan show I3267.

Searches the titles and descriptions of every page this site publishes.