Work routed to a named session is invisible to its own hook: gc sling succeeds, gc hook --claim answers no_work #9

Open
opened 2026-09-02 18:25:19 +00:00 by forgejo-admin · 0 comments

A bead routed to a named session never becomes claimable. gc sling writes
gc.routed_to and reports success, bd shows the bead open, unassigned and
READY, and gc hook --claim on that very session answers
{"action":"drain","reason":"no_work"}. The work is invisible to the only agent
it was addressed to, and nothing anywhere reads as wrong.

This is ce-2qm's shape moved up one level. ce-2qm is an unrouted bead being
invisible to a pool. This is a routed bead being invisible to a named session,
which is worse, because the dispatcher did everything right and got a clean
receipt.

Measured

Gas City at /Users/pbanka/gc-scratch, 2026-09-02, agent crew
(session gs-wisp-amobhzd).

$ bd show ce-yjsg --json | jq '.metadata'
{ "gc.routed_to": "crew" }

$ bd dep tree ce-yjsg
ce-yjsg: ... [P1] (open) [READY]
# assignee empty, dependency_count 0

$ gc hook --claim --json
{"schema_version":"1","ok":true,"command":"hook","action":"drain","reason":"no_work"}

$ bd update ce-yjsg --assignee gs-wisp-amobhzd
$ gc hook --json
[{"id":"ce-yjsg", ...}]        # now visible

So routing alone does not put work on a named session's hook. Assignment does.
Two P1 beads were affected (ce-yjsg, ce-i0k), both routed to crew. ce-yjsg
was slung at 12:07 and was still invisible at 18:23, six hours later.

Scope

gc hook --help says it "finds routed work using the agent's work_query
config". agents/crew/agent.toml sets no work_query, so crew runs on the
built-in default, and that default does not match on gc.routed_to. Pool agents
work, so the pool path and the named-session path resolve demand differently.

I have not read the Go source. The observation above is what was measured; the
work_query sentence is where to start, not a diagnosis.

Look at: the default work_query for a [[named_session]] with no explicit one,
and the claim path in gc hook --claim that decides reason: no_work. Compare
against the pool path, which honours gc.routed_to correctly.

Acceptance

  • gc sling <named-session> <bead> makes the bead claimable by that session,
    with the assignee left empty, exactly as it does for a pool.
  • gc hook --claim on that session returns the bead rather than no_work.
  • A regression gate that FAILS on today's binary (Rule 7.6): sling a bead to
    a named session with no work_query, assert gc hook --claim claims it.
    The gate must be seen red before it is trusted, because "no work" is a
    well-formed answer and a green run proves nothing about reach.
  • If the intended design really is that named sessions require an explicit
    work_query, then gc sling to a session that has none must FAIL LOUDLY
    at sling time rather than write a receipt for work nobody can claim.
  • ce-2qm — the unrouted-bead-invisible-to-a-pool case this mirrors.
  • gascity#3 — gc session nudge refusing delivery to non-claude providers. Same
    family: a delivery path that answers successfully and delivers nothing.
A bead routed to a **named session** never becomes claimable. `gc sling` writes `gc.routed_to` and reports success, `bd` shows the bead open, unassigned and READY, and `gc hook --claim` on that very session answers `{"action":"drain","reason":"no_work"}`. The work is invisible to the only agent it was addressed to, and nothing anywhere reads as wrong. This is ce-2qm's shape moved up one level. ce-2qm is an unrouted bead being invisible to a pool. This is a *routed* bead being invisible to a named session, which is worse, because the dispatcher did everything right and got a clean receipt. ## Measured Gas City at `/Users/pbanka/gc-scratch`, 2026-09-02, agent `crew` (session `gs-wisp-amobhzd`). $ bd show ce-yjsg --json | jq '.metadata' { "gc.routed_to": "crew" } $ bd dep tree ce-yjsg ce-yjsg: ... [P1] (open) [READY] # assignee empty, dependency_count 0 $ gc hook --claim --json {"schema_version":"1","ok":true,"command":"hook","action":"drain","reason":"no_work"} $ bd update ce-yjsg --assignee gs-wisp-amobhzd $ gc hook --json [{"id":"ce-yjsg", ...}] # now visible So routing alone does not put work on a named session's hook. Assignment does. Two P1 beads were affected (`ce-yjsg`, `ce-i0k`), both routed to `crew`. ce-yjsg was slung at 12:07 and was still invisible at 18:23, six hours later. ## Scope `gc hook --help` says it "finds routed work using the agent's **work_query** config". `agents/crew/agent.toml` sets no `work_query`, so `crew` runs on the built-in default, and that default does not match on `gc.routed_to`. Pool agents work, so the pool path and the named-session path resolve demand differently. I have not read the Go source. The observation above is what was measured; the `work_query` sentence is where to start, not a diagnosis. Look at: the default `work_query` for a `[[named_session]]` with no explicit one, and the claim path in `gc hook --claim` that decides `reason: no_work`. Compare against the pool path, which honours `gc.routed_to` correctly. ## Acceptance - [ ] `gc sling <named-session> <bead>` makes the bead claimable by that session, with the assignee left empty, exactly as it does for a pool. - [ ] `gc hook --claim` on that session returns the bead rather than `no_work`. - [ ] A regression gate that FAILS on today's binary (Rule 7.6): sling a bead to a named session with no `work_query`, assert `gc hook --claim` claims it. The gate must be seen red before it is trusted, because "no work" is a well-formed answer and a green run proves nothing about reach. - [ ] If the intended design really is that named sessions require an explicit `work_query`, then `gc sling` to a session that has none must FAIL LOUDLY at sling time rather than write a receipt for work nobody can claim. ## Related - ce-2qm — the unrouted-bead-invisible-to-a-pool case this mirrors. - gascity#3 — `gc session nudge` refusing delivery to non-claude providers. Same family: a delivery path that answers successfully and delivers nothing.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
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
celilo/gascity#9
No description provided.