feat(backlog-loop): fold triage into the loop (surface + optional --triage auto-run) #278

Closed
opened 2026-06-25 08:55:33 +00:00 by coilyco-ops · 3 comments
Member

select already counts the untriaged lane (15 issues in ward this session, 7 headless-eligible in cli-guard), but populating the headless lane requires running ward exec goose-triage as a separate manual hop first. cli-guard had an empty headless lane until I ran triage by hand.

Add:

  • select prints a one-line hint when the untriaged lane is non-empty ("N untriaged - run ward exec goose-triage").
  • select --triage runs goose-triage inline, then re-selects, so the loop owns its own inputs.

Pairs with the multi-repo scope issue: a scope of repos should triage and select together.

`select` already counts the untriaged lane (15 issues in ward this session, 7 headless-eligible in cli-guard), but populating the headless lane requires running `ward exec goose-triage` as a **separate manual hop** first. cli-guard had an empty headless lane until I ran triage by hand. **Add**: - `select` prints a one-line hint when the untriaged lane is non-empty ("N untriaged - run `ward exec goose-triage`"). - `select --triage` runs goose-triage inline, then re-selects, so the loop owns its own inputs. Pairs with the multi-repo scope issue: a scope of repos should triage and select together.
Author
Member

🔁 backlog-loop dispatch - this issue was auto-dispatched by the supervised backlog loop.

When you finish, your final issue comment must start with exactly one of:

  • WARD-OUTCOME: done - landed/merged, nothing more needed.
  • WARD-OUTCOME: blocked - <the specific decision or information you need from a human>
  • WARD-OUTCOME: failed - <why, briefly>

Put your candid retrospective on the line(s) below it. The supervising loop reads this
line to decide whether to close you out, ask a human to unblock you, or retry. If you
are blocked, be concrete about the single thing you need - that is what gets answered.

<!-- backlog-loop:dispatch --> 🔁 **backlog-loop dispatch** - this issue was auto-dispatched by the supervised backlog loop. When you finish, your **final issue comment** must start with exactly one of: - `WARD-OUTCOME: done` - landed/merged, nothing more needed. - `WARD-OUTCOME: blocked - <the specific decision or information you need from a human>` - `WARD-OUTCOME: failed - <why, briefly>` Put your candid retrospective on the line(s) below it. The supervising loop reads this line to decide whether to close you out, ask a human to unblock you, or retry. If you are blocked, be concrete about the single thing you need - that is what gets answered.
Author
Member

🔒 Reserved by ward agent --driver claude — container ward-agentic-os-issue-278-claude-f2bc666f on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-06-25T09:51:27Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `ward-agentic-os-issue-278-claude-f2bc666f` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-06-25T09:51:27Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Owner

WARD-OUTCOME: done

Small, clean feature - the loop already had every seam I needed, so this was mostly wiring: a --triage flag that shells ward exec goose-triage per repo before the re-select, and an untriaged-lane nudge that names the loop's own missing input. The deterministic core made it easy to test the new bits with everything stubbed.

The only thing that fought back was the 4000-char documentation-layout cap: both docs/backlog-loop.md and the skill were sitting at exactly 3999 chars, so any new sentence blew the budget and I had to claw back room by tightening prose elsewhere. Tedious but harmless. One cut I'm slightly uneasy about - I trimmed a couple of cross-references (the #246 dispatch-ceiling-gate mention stays, but I leaned out some surrounding prose) to fit; the references still live in the script docstring.

Confident in the result: 463 tests green, full pre-commit suite clean, merged to main. The one thing not exercised live is an actual goose-triage run end-to-end (the engine call is stubbed in tests), so the inline path is correct by construction but unproven against a real triage. Worth a follow-up to confirm the timeout and the re-select handoff behave on a genuine backlog.

WARD-OUTCOME: done Small, clean feature - the loop already had every seam I needed, so this was mostly wiring: a `--triage` flag that shells `ward exec goose-triage` per repo before the re-select, and an untriaged-lane nudge that names the loop's own missing input. The deterministic core made it easy to test the new bits with everything stubbed. The only thing that fought back was the 4000-char documentation-layout cap: both `docs/backlog-loop.md` and the skill were sitting at exactly 3999 chars, so any new sentence blew the budget and I had to claw back room by tightening prose elsewhere. Tedious but harmless. One cut I'm slightly uneasy about - I trimmed a couple of cross-references (the #246 dispatch-ceiling-gate mention stays, but I leaned out some surrounding prose) to fit; the references still live in the script docstring. Confident in the result: 463 tests green, full pre-commit suite clean, merged to main. The one thing not exercised live is an actual `goose-triage` run end-to-end (the engine call is stubbed in tests), so the inline path is correct by construction but unproven against a real triage. Worth a follow-up to confirm the timeout and the re-select handoff behave on a genuine backlog.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-flight-deck/agentic-os#278
No description provided.