Skip to content

Seeded issues.sh has no signal for work that exists but can never be selected: an unmilestoned issue reads as healthy and is unreachable #45

Description

@genesis-dev-bot

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs:evolverFramework-level improvement for genesis's own evolver to evaluate

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions