Remove the label-driven dispatch gate: ward stops deriving executable authority from issue labels #1672

Open
opened 2026-08-17 01:55:15 +00:00 by coilyco-ops · 0 comments
Member

Filed by Darren (director seat), 2026-08-16, from Kai's directive in an umbra triage consult round. Carrying coilyco-flight-deck/umbra#292 here, which was filed on umbra but names code that lives in this repo.

The directive, verbatim

remove the entire chain of features where ward needs to work off labels as a 1st class construct

Everything below is my reading of what that reaches. The words above are Kai's.

What exists today

All in cmd/ward/agent.go, read from main:

  • modeCeilingLevels = []string{"consult", "interactive", "headless"} at :1330
  • autonomyScopePrefix = "autonomy/" at :1334, and the autonomyAliases map under it
  • modeCeilingLevel(label string) (int, bool) at :1348
  • issueModeCeiling(labels []string) (int, string) at :1360 - already dead, only a test calls it
  • issueHasModeLabel(labels []string, want string) bool at :1376
  • autonomyName(label string) string at :1387
  • Two live call sites, :1102 and :1164, both surface == "engineer" && issueHasModeLabel(issue.Labels, "interactive"), returning dispatchDeclineErr(dispatchModeCeiling, "mode-ceiling", ...)

Plus docs/ward-agent-dispatch.md, the dispatchModeCeiling decline code, and the tests pinning all of it. Prior issues: ward#663 established the gate, ward#246 the lowest-takes-precedence rule.

Why this is the right shape rather than a retreat

The gate matched labels by literal string. On 2026-08-15 the taxonomy was renamed at org scope and every comparison stopped matching, silently, because a name that matches nothing is a false rather than an error. umbra#292 documents that, and Angie's fix added an alias map so both spellings resolve.

An alias map is a patch on the underlying property: executable authority was keyed off a string a human edits in a tracker UI. The next rename breaks it the same way, and the failure is invisible in the dangerous direction - a guard that quietly stops guarding. Removing the chain removes the class of failure rather than the instance.

The labels themselves stay. priority/*, autonomy/*, and role/* remain triage metadata for humans and for the seats reading a backlog. What ends is ward deriving a dispatch decision from them.

The consequence, stated rather than buried

After this lands, an issue labelled autonomy/live-collab dispatches to an autonomous engineer with no refusal. That is the same behaviour Angie's fix restored the gate against, and it is being chosen deliberately here rather than regressed into. Whatever bounds an autonomous engineer afterwards is not a label, and this issue does not claim a replacement exists.

If a replacement is wanted, it is a separate decision and wants a construct that is not a mutable string: an explicit flag at dispatch, a field in .ward/ward.yaml, or nothing at all.

Scope

  1. Delete the symbols listed above and their tests.
  2. Delete both call sites, so resolveDispatchIssue no longer consults issue.Labels.
  3. Retire dispatchModeCeiling and its decline path if nothing else uses it.
  4. Update docs/ward-agent-dispatch.md to describe a dispatch path that does not read labels, rather than leaving a doc for a gate that no longer exists.
  5. Note the supersession on ward#663 and ward#246 so neither reads as current.

Acceptance

  • No code path in cmd/ward/ reads an issue label to decide whether work may dispatch.
  • grep -r "autonomy/" cmd/ returns nothing.
  • The docs describe the real behaviour, including that an issue's autonomy label no longer affects dispatch.
  • ward#663 and ward#246 are marked superseded.
  • coilyco-flight-deck/umbra#292 - where this was filed, closing in favour of this issue. Its thread carries Angie's confirmation of the matcher and the fail-open finding, worth reading before deleting anything.
  • The open acceptance criterion in umbra#292 asking what autonomy/epic should do at the gate is answered by this issue: there is no gate, so it does nothing.
**Filed by Darren (director seat), 2026-08-16, from Kai's directive in an umbra triage consult round.** Carrying `coilyco-flight-deck/umbra#292` here, which was filed on umbra but names code that lives in this repo. ## The directive, verbatim > remove the entire chain of features where ward needs to work off labels as a 1st class construct Everything below is my reading of what that reaches. The words above are Kai's. ## What exists today All in `cmd/ward/agent.go`, read from `main`: * `modeCeilingLevels = []string{"consult", "interactive", "headless"}` at :1330 * `autonomyScopePrefix = "autonomy/"` at :1334, and the `autonomyAliases` map under it * `modeCeilingLevel(label string) (int, bool)` at :1348 * `issueModeCeiling(labels []string) (int, string)` at :1360 - **already dead**, only a test calls it * `issueHasModeLabel(labels []string, want string) bool` at :1376 * `autonomyName(label string) string` at :1387 * Two live call sites, :1102 and :1164, both `surface == "engineer" && issueHasModeLabel(issue.Labels, "interactive")`, returning `dispatchDeclineErr(dispatchModeCeiling, "mode-ceiling", ...)` Plus `docs/ward-agent-dispatch.md`, the `dispatchModeCeiling` decline code, and the tests pinning all of it. Prior issues: ward#663 established the gate, ward#246 the lowest-takes-precedence rule. ## Why this is the right shape rather than a retreat The gate matched labels by literal string. On 2026-08-15 the taxonomy was renamed at org scope and every comparison stopped matching, silently, because a name that matches nothing is a `false` rather than an error. umbra#292 documents that, and Angie's fix added an alias map so both spellings resolve. An alias map is a patch on the underlying property: **executable authority was keyed off a string a human edits in a tracker UI.** The next rename breaks it the same way, and the failure is invisible in the dangerous direction - a guard that quietly stops guarding. Removing the chain removes the class of failure rather than the instance. The labels themselves stay. `priority/*`, `autonomy/*`, and `role/*` remain triage metadata for humans and for the seats reading a backlog. What ends is ward deriving a dispatch decision from them. ## The consequence, stated rather than buried After this lands, **an issue labelled `autonomy/live-collab` dispatches to an autonomous engineer with no refusal.** That is the same behaviour Angie's fix restored the gate against, and it is being chosen deliberately here rather than regressed into. Whatever bounds an autonomous engineer afterwards is not a label, and this issue does not claim a replacement exists. If a replacement is wanted, it is a separate decision and wants a construct that is not a mutable string: an explicit flag at dispatch, a field in `.ward/ward.yaml`, or nothing at all. ## Scope 1. Delete the symbols listed above and their tests. 2. Delete both call sites, so `resolveDispatchIssue` no longer consults `issue.Labels`. 3. Retire `dispatchModeCeiling` and its decline path if nothing else uses it. 4. Update `docs/ward-agent-dispatch.md` to describe a dispatch path that does not read labels, rather than leaving a doc for a gate that no longer exists. 5. Note the supersession on ward#663 and ward#246 so neither reads as current. ## Acceptance * No code path in `cmd/ward/` reads an issue label to decide whether work may dispatch. * `grep -r "autonomy/" cmd/` returns nothing. * The docs describe the real behaviour, including that an issue's autonomy label no longer affects dispatch. * ward#663 and ward#246 are marked superseded. ## Related * `coilyco-flight-deck/umbra#292` - where this was filed, closing in favour of this issue. Its thread carries Angie's confirmation of the matcher and the fail-open finding, worth reading before deleting anything. * The open acceptance criterion in umbra#292 asking what `autonomy/epic` should do at the gate is answered by this issue: there is no gate, so it does nothing.
Sign in to join this conversation.
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
coilyco-flight-deck/ward#1672
No description provided.