Let summoned @coilyco-ops Goose file/move issues (top use case: route issues out of the inbox) #376
Labels
No labels
burndown-2026-06
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
coilyco-flight-deck/infrastructure#376
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
The top-tier use case for
@coilyco-opsis moving issues out ofcoilysiren/inbox- read an intake issue, decide the right repo, and re-file it there (the same triage/routing a human does by hand). That requires summoned Goose to write to trackers, not just advise.Today it can't. The summon run (
scripts/coilyco_ops_summon.py, #374) is deliberately advisory-only: its system prompt says "do not push, open PRs, or treat your checkout as something to ship - a human reads your reply and decides," andrun_goosedoesn't even put a Forgejo credential in Goose's environment. The bot token already haswrite:issue(it posts comments with it), but the Goose run has no authority and no tool to use it.This issue is the controlled expansion: let summoned Goose create / move / annotate issues, scoped tightly, with the inbox-routing workflow as the first concrete recipe.
What
A summon like
@coilyco-ops route this to the right repo(or@coilyco-ops file this in coilyco-flight-deck/ward) on an inbox issue results in:Idempotent: a re-summon must not double-file (check for an existing backlink / the
<!-- coilyco-ops-summon -->marker before creating).Capability changes required
coily- instruct Goose to runcoily ops forgejo issue create --repo <owner/name> --title ... --body-file .... coily self-authenticates (the/forgejo/api-token, authors ascoilysiren). No token plumbing. Simplest.COILYCO_OPS_TOKENintorun_goose's subprocessenv=and have Goose hit the API directly (authors ascoilyco-ops, which reads as "filed by automation").main. The line moves from "never write anything" to "tracker writes yes, code/repo writes no."apps/extensionmanagertoolset and had no shell or file tools (Tool 'read' not found). With that profile it cannot runcoilyor read the repo at all, so issue-filing is impossible until Goose runs with the developer/shell extension (the--no-profile+ pinned-extension approach thegoose-triageharness uses). This is a hard prerequisite.Security posture (this is a real expansion - call it out)
#374's whole NO-GO answer was "advisory only, blast radius one disposable clone, never mutates anything." This widens it to tracker mutations. The guardrails that keep it acceptable:
COILYCO_OPS_SUMMON_ALLOWauthors can summon (currently justcoilysiren), so the blast radius is "what an authorized human asked for."write:issueonly - nowrite:repositorycode paths, nomainmutation, no admin. Goose can touch issues/comments/labels, nothing that ships.Open decisions (flag, don't guess)
coilysiren(path a) orcoilyco-ops(path b)?Done when
@coilyco-ops route thison an inbox issue files it in the correct repo with a backlink + attribution, annotates/closes the source, and replies with the new URL - end to end, logged.mainmutation.refs #374, #375
Decision (Kai): the write path is
ward-kdl, authoring as thecoilyco-opsbot. This resolves the "via coily vs via bot token" open question - both are dropped.And it turns out the write surface already exists in ward-kdl, so this issue shrinks a lot.
cmd/ward-kdl/ward-kdl.forgejo.guardfile.kdl(ward#151) already:coilyco-opsvia SSM/forgejo/coilyco-ops/api-token(deliberately off the operator's personal PAT, so automated ops attribute to the bot - exactly what we want).issue create / edit / comment / close / reopenandissue-label add/set/remove, scoped tocoily*owners (coilysiren/inboxmatchescoily*).action move-issue <source owner/name> <index> <target owner/name>that is the inbox-routing recipe: view the source, create the issue in the target, comment the new URL back onto the source as a back-link, then close the source. Never deletes (mirrorsnever delete issue).Confirmed live on this host:
ward-kdl v0.70.0,ward-kdl ops forgejo action move-issueandward-kdl ops forgejo issue create <owner> <repo> --title ... --body ...both resolve.So the remaining work is only:
ward-kdl ops forgejo ...- depends on the Goose-profile fix in #375 (today Goose loads the apps/extension toolset with no shell or file tools, so it cannot runward-kdlat all). Hard prerequisite, unchanged.ward-kdlmust also be on the Goose host's PATH.run_goosewith one that tells Goose it may route/file issues usingward-kdl ops forgejo action move-issueandissue create, while still forbidding code push /mainmutation.No new ward verb, no token plumbing, no coily-as-
coilysiren. The "capability changes" section above is superseded by this: drop option (a)/(b), the path is ward-kdl as the bot, and the move-issue action already carries the recipe (label/milestone carry-over is the one piece it defers).Open decisions still standing: explicit-target-only vs Goose repo-guessing, and whether to keep the source open after a cross-file (move-issue closes it by default).
Triage:
P3/interactive- Goose file/move-issues feature; some design + agent-channel work.(goose-style pass; claude as the judgment engine, applied 2026-06-23)