I3971 — Work in an open pull request or under a live branch claim is reported taken and is never the next issue
The one next-issue function I3754 builds (plan.rs ranking, then delivery at the trunk) gains a second, observed pass: a READY candidate whose delivery stage is pr_open (plan/delivery.rs, from the recorded forge observation) or branch with a live claim on the mesh board (read from mesh/state.rs) is passed over as taken and listed with the pull request or claim that put it there and the time of that observation. Taken is a readiness refinement inside READY (devtask/readiness.rs TaskReadiness::Taken), neither a seventh canonical status nor TaskReadiness::Review, which already means VERIFY (readiness.rs:25-27): ISSUE_STATUSES and lib/project.awk stay byte-equal, and readiness.rs's note that no record field can distinguish such a word is amended to say that delivery, an observation, now does. plan next, plan ready and plan.status's next_ready answer the same. The shell's plan next (mj_pj_next_ready, lib/plan.sh:230, 262, 337) cannot read the forge cache or the board, so it asks the executable for the observed pass, and when the executable is absent answers the stamps-only pick labelled as such. plan next --at <rev> keeps I3754's answer that depends on the commit alone.
BLOCKED wave 4 · p0 · implementation profile · runs alone
Blocked. This issue cannot start until I3754 is done. The status is derived from that, not declared.
Objective
The one next-issue function I3754 builds (plan.rs ranking, then delivery at the trunk) gains a second, observed pass: a READY candidate whose delivery stage is pr_open (plan/delivery.rs, from the recorded forge observation) or branch with a live claim on the mesh board (read from mesh/state.rs) is passed over as taken and listed with the pull request or claim that put it there and the time of that observation. Taken is a readiness refinement inside READY (devtask/readiness.rs TaskReadiness::Taken), neither a seventh canonical status nor TaskReadiness::Review, which already means VERIFY (readiness.rs:25-27): ISSUE_STATUSES and lib/project.awk stay byte-equal, and readiness.rs's note that no record field can distinguish such a word is amended to say that delivery, an observation, now does. plan next, plan ready and plan.status's next_ready answer the same. The shell's plan next (mj_pj_next_ready, lib/plan.sh:230, 262, 337) cannot read the forge cache or the board, so it asks the executable for the observed pass, and when the executable is absent answers the stamps-only pick labelled as such. plan next --at <rev> keeps I3754's answer that depends on the commit alone.
Why
Sessions on 2026-10-22 were handed issues whose work was already in an open pull request (I3910 and I3916 were each announced taken while plan next still offered them), so two workers started the same work; the plan reads only stamps, and delivery, which knows of the pull request, is not consulted.
Current state
Verified at 355a0cee79a: plan.rs:567-580 ranks READY issues by wave, priority and id; plan/delivery.rs derives pr_open from the forge cache (delivery.rs:487-529); devtask/readiness.rs:32 states there is no in_review; ISSUE_STATUSES is plan.rs:51, held to lib/project.awk by case 99_plan_capabilities. I3754 (one next function reading delivery at the trunk only) is BLOCKED and not started.
Desired state
plan next never names an issue with an open pull request or a live branch claim; plan ready lists it as taken with its evidence; the canonical six statuses are unchanged.
Scope
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/src/plan/delivery.rs
- apps/majordomus-cli/src/devtask/readiness.rs
- apps/majordomus-cli/src/capability/builtin/plan.rs
- lib/plan.sh
- lib/project.sh
- apps/majordomus-cli/src/mesh/state.rs
- apps/majordomus-cli/tests/plan_delivery.rs
- test/cases/99_plan_capabilities.sh
- .ai/repo/project/issues/I3971.yaml
Out of scope
- A new canonical issue status
- Writing any stamp from an observation; the record stays the person's or the lifecycle's
Dependencies
Acceptance criteria
- With a forge fixture holding an open pull request naming the top READY issue, plan next answers the second and lists the first as taken with the pull request number and the observation time (case work_in_an_open_pull_request_is_not_next)
- A live branch claim on the board passes an issue over the same way; an expired claim does not
- The shell's plan next answers the same through the executable, and labels a stamps-only answer when the executable is absent
- plan next --at <rev> answers from the commit alone, as I3754 defines
- ISSUE_STATUSES and lib/project.awk are unchanged and case 99_plan_capabilities passes
Validation
- bin/majordomus plan validate
- env -u MAJORDOMUS_SHARE cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib -- plan::
- env -u MAJORDOMUS_SHARE cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test plan_delivery
- env -u MAJORDOMUS_SHARE bash test/run.sh 99_plan_capabilities
Evidence required
- work_in_review_is_not_next
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/I3971.yaml. Read it back with majordomus plan show I3971.