Scaffolded issues.sh gives a dev system six unconditional summary sections, and every one of them keys on a state of distress: it failed (failure-streaks), it's blocked, it's gated (gates), it's red (red-prs), nobody answered (unanswered-comments), it's mergeable (ready-prs).
None of them keys on whether the loop's own work-selection rules can ever choose an item at all.
The failure mode
The scaffolded orchestrator's hard rules say milestone work outranks discretionary improvement, and that a discretionary finding is "filed and moved on" from. So an issue filed with no milestone:N label is filed and then never selected by anything. It sits under Open Issues looking completely healthy, because by every question the existing nets ask, it is.
Measured in Sayfan-AI/MaKlaude on 2026-08-15 — three issues died that way in a single day:
- MaKlaude #167 dropped out of milestone 5 when the label came off and sat untouched until a human re-added it.
- MaKlaude #186 was filed unmilestoned and was never picked up.
- MaKlaude #202 was filed unmilestoned, and became selectable only because the human labelled it by hand.
The adjacent case is the same defect one step later: an open issue whose milestone has already been signed off. The completion gate is closed, the loop has moved on, nothing comes back for it.
Why it needs a detector rather than a better prompt
The evidence is an absence spread over days — no run failed, no check went red, nothing looped — so no single agent cycle holds the history to notice "this has been unselectable since Tuesday". That's the same reason a 21-day stale plan gate went unnoticed in MaKlaude until a nudge fired by chance (MaKlaude #84): the answer there was a deterministic check, not sharper judgment.
The instruction half already exists — genesis 89239fb tells the orchestrator to label every issue it files. This is the half that works when the instruction is forgotten, which is the prevention/detection split genesis applies everywhere else.
Proposal
Add an unselectable-work subcommand to seeded issues.sh, printed unconditionally by summary, in the shape the whole family already uses — derived from repo state, stalest first, empty means all-clear:
- open issue with no
milestone:N label;
- open issue all of whose milestones have a closed
Milestone N complete gate.
Exclusions matter more than detections here, since it prints on every tick: needs:human (already in the Gates section, and it also covers escalate.sh's automation:failure issues, which carry both labels), genesis:onboarding (issue #1 produces the roadmap, so it predates every milestone by construction), and wontfix/duplicate/invalid ("deliberately not doing this" is a legitimate third answer). Every unknown should resolve toward silence: an open completion gate means the milestone is live, one active milestone on a multi-labelled issue is enough, and an unreadable issue list must say it didn't run rather than print nothing.
Reference implementation, landed in MaKlaude, ~140 lines of issues.sh plus 14 tests with one case per exclusion: Sayfan-AI/MaKlaude PR #205 (.genesis/scripts/issues.sh, test/devsystem/unselectable_test.go).
Why this is framework-level
Nothing about it is MaKlaude-specific — it falls out of the scaffolded orchestrator's own priority rules, so every dev system genesis stands up will rediscover it from its own abandoned backlog. Checked existing genesis issues first: #41 is the nearest analog and covers a person having spoken, not reachability of work; #8 and #10 are about duplicate issues, not unselectable ones.
Scaffolded
issues.shgives a dev system six unconditionalsummarysections, and every one of them keys on a state of distress: it failed (failure-streaks), it's blocked, it's gated (gates), it's red (red-prs), nobody answered (unanswered-comments), it's mergeable (ready-prs).None of them keys on whether the loop's own work-selection rules can ever choose an item at all.
The failure mode
The scaffolded orchestrator's hard rules say milestone work outranks discretionary improvement, and that a discretionary finding is "filed and moved on" from. So an issue filed with no
milestone:Nlabel is filed and then never selected by anything. It sits under Open Issues looking completely healthy, because by every question the existing nets ask, it is.Measured in
Sayfan-AI/MaKlaudeon 2026-08-15 — three issues died that way in a single day:The adjacent case is the same defect one step later: an open issue whose milestone has already been signed off. The completion gate is closed, the loop has moved on, nothing comes back for it.
Why it needs a detector rather than a better prompt
The evidence is an absence spread over days — no run failed, no check went red, nothing looped — so no single agent cycle holds the history to notice "this has been unselectable since Tuesday". That's the same reason a 21-day stale plan gate went unnoticed in MaKlaude until a nudge fired by chance (MaKlaude #84): the answer there was a deterministic check, not sharper judgment.
The instruction half already exists — genesis
89239fbtells the orchestrator to label every issue it files. This is the half that works when the instruction is forgotten, which is the prevention/detection split genesis applies everywhere else.Proposal
Add an
unselectable-worksubcommand to seededissues.sh, printed unconditionally bysummary, in the shape the whole family already uses — derived from repo state, stalest first, empty means all-clear:milestone:Nlabel;Milestone N completegate.Exclusions matter more than detections here, since it prints on every tick:
needs:human(already in the Gates section, and it also coversescalate.sh'sautomation:failureissues, which carry both labels),genesis:onboarding(issue #1 produces the roadmap, so it predates every milestone by construction), andwontfix/duplicate/invalid("deliberately not doing this" is a legitimate third answer). Every unknown should resolve toward silence: an open completion gate means the milestone is live, one active milestone on a multi-labelled issue is enough, and an unreadable issue list must say it didn't run rather than print nothing.Reference implementation, landed in MaKlaude, ~140 lines of
issues.shplus 14 tests with one case per exclusion: Sayfan-AI/MaKlaude PR #205 (.genesis/scripts/issues.sh,test/devsystem/unselectable_test.go).Why this is framework-level
Nothing about it is MaKlaude-specific — it falls out of the scaffolded orchestrator's own priority rules, so every dev system genesis stands up will rediscover it from its own abandoned backlog. Checked existing genesis issues first: #41 is the nearest analog and covers a person having spoken, not reachability of work; #8 and #10 are about duplicate issues, not unselectable ones.