warded: rename the carry verbs - build (carry), pair (interactive), fold in task #283

Closed
opened 2026-06-24 16:46:35 +00:00 by coilyco-ops · 4 comments
Member

Follow-up to ward#282. That issue re-aims warded at ward agent and adds the bare-ref headless default + cwd repo inference, but it kept the surface verbs verbatim (work / headless / task / reply / ask). As warded <verb> those read poorly: headless is an implementation detail wearing a verb's clothes, work is a vague noun-verb, task is a noun. This renames them. Decided with Kai.

Depends on ward#282 - assumes warded already fronts ward agent with the bare-ref headless default and cwd inference in place. Land #282 first; this builds on that surface.

New verb surface

warded #98              # carry to merge, detached (default)
warded build #98        # same, explicit
warded build "fix the flaky test"   # prose, not a ref -> file the issue, then carry
warded pair #98         # carry, attached - watch it live, step in
warded ask "how is the audit log written?"   # one-shot answer, inline (unchanged)
warded reply #98        # one-shot answer, as an issue comment (unchanged)

Five verbs collapse to four named ones (build / pair / ask / reply), with the detached carry as the bare default.

Mapping (old -> new)

  • headless -> the bare default plus explicit build. Same behavior: detached, fire-and-forget, keeps the pre-flight GO/NO-GO gate and the "how it felt" reflection close.
  • work -> pair. Same behavior: attached/interactive, you watch and can step in, no pre-flight (a human is already there). --new-tab (sidequest) and --detach move here.
  • task -> folded into build "<prose>": build shape-dispatches on its argument - a ref (owner/repo#N, #N, issue URL) carries the existing issue; a prose string files an issue first (resolved repo = --repo or cwd git origin), then carries it. Preserve task's existing filing logic (title from first line, agent-filed provenance footer, the same pre-flight) under this prose form; the separate task verb goes away.
  • ask, reply -> unchanged.

Backward compat

Keep work, headless, task as hidden (deprecated) aliases on the ward agent umbrella for one cycle: headless->build, work->pair, task->build. Muscle memory and any existing ward agent <verb> references keep working while the new names take over. Hidden from help, no doc surface.

Changes

cmd/ward/agent.go

  • Rename the surface subcommands: agentSurfaceCommand("work", false) -> pair, agentSurfaceCommand("headless", true) -> build. The umbrella's bare-ref default already runs the headless (now build) action - keep that.
  • Add build's prose form: when the positional is not a parseable ref, route to the task filing path (reuse runAgentTask / runAgentTaskDirect + classifyTaskInvocation) instead of erroring. A ref goes to the carry path. Drop the standalone agentTaskCommand() from the umbrella's Commands (its logic survives under build).
  • Wire the deprecated aliases (work/headless/task) via cli.Command.Aliases or thin hidden commands mapping to the new actions. Mark Hidden: true.
  • Update labels/usage/agentCmdline so audit rows and error text read ward agent build / ward agent pair.

cmd/ward/main.go

  • No grammar change (warded already -> ward agent); refresh the shim comment to mention the build/pair surface.

Tests

  • Update agent_test.go / agent_route_test.go / agent_tab_test.go and any work/headless/task literals to the new verbs; add coverage that build <ref> carries and build "<prose>" files-then-carries (shape-dispatch), that pair is attached, and that the deprecated aliases still resolve.
  • go test ./... green.

Docs

  • docs/agent.md, docs/agent-subcommands.md, docs/agent-task.md (fold into build's prose form), docs/agent-work.md (-> pair), docs/FEATURES.md, README.md, and any ward agent work|headless|task reference across docs/. Lead with the warded-fronted build / pair / ask / reply surface. Note the deprecated aliases once, in docs/agent-subcommands.md.

Skill update (now in-repo via the relocation)

The ward agent dispatch skill (tooling-ward-agent) is being moved into the ward repo by #286. Land that first; then this verb rename updates the skill in this repo alongside the code - no cross-repo follow-up. If the relocation has not landed when this is carried, update the skill in its then-current location and note the drift.

Done condition

go build ./... and go test ./... green, pre-commit run --all-files clean, warded #N / warded build #N / warded build "<prose>" / warded pair #N all resolve correctly (verify with --print), deprecated aliases still work, merged to main.

Follow-up to ward#282. That issue re-aims `warded` at `ward agent` and adds the bare-ref headless default + cwd repo inference, but it **kept the surface verbs verbatim** (`work` / `headless` / `task` / `reply` / `ask`). As `warded <verb>` those read poorly: `headless` is an implementation detail wearing a verb's clothes, `work` is a vague noun-verb, `task` is a noun. This renames them. Decided with Kai. **Depends on ward#282** - assumes warded already fronts `ward agent` with the bare-ref headless default and cwd inference in place. Land #282 first; this builds on that surface. ## New verb surface ``` warded #98 # carry to merge, detached (default) warded build #98 # same, explicit warded build "fix the flaky test" # prose, not a ref -> file the issue, then carry warded pair #98 # carry, attached - watch it live, step in warded ask "how is the audit log written?" # one-shot answer, inline (unchanged) warded reply #98 # one-shot answer, as an issue comment (unchanged) ``` Five verbs collapse to four named ones (`build` / `pair` / `ask` / `reply`), with the detached carry as the bare default. ## Mapping (old -> new) - `headless` -> the **bare default** plus explicit **`build`**. Same behavior: detached, fire-and-forget, keeps the pre-flight GO/NO-GO gate and the "how it felt" reflection close. - `work` -> **`pair`**. Same behavior: attached/interactive, you watch and can step in, no pre-flight (a human is already there). `--new-tab` (sidequest) and `--detach` move here. - `task` -> folded into **`build "<prose>"`**: `build` shape-dispatches on its argument - a ref (`owner/repo#N`, `#N`, issue URL) carries the existing issue; a prose string files an issue first (resolved repo = `--repo` or cwd git origin), then carries it. Preserve task's existing filing logic (title from first line, agent-filed provenance footer, the same pre-flight) under this prose form; the separate `task` verb goes away. - `ask`, `reply` -> unchanged. ## Backward compat Keep `work`, `headless`, `task` as **hidden (deprecated) aliases** on the `ward agent` umbrella for one cycle: `headless`->`build`, `work`->`pair`, `task`->`build`. Muscle memory and any existing `ward agent <verb>` references keep working while the new names take over. Hidden from help, no doc surface. ## Changes **`cmd/ward/agent.go`** - Rename the surface subcommands: `agentSurfaceCommand("work", false)` -> `pair`, `agentSurfaceCommand("headless", true)` -> `build`. The umbrella's bare-ref default already runs the headless (now `build`) action - keep that. - Add `build`'s prose form: when the positional is not a parseable ref, route to the task filing path (reuse `runAgentTask` / `runAgentTaskDirect` + `classifyTaskInvocation`) instead of erroring. A ref goes to the carry path. Drop the standalone `agentTaskCommand()` from the umbrella's `Commands` (its logic survives under `build`). - Wire the deprecated aliases (`work`/`headless`/`task`) via `cli.Command.Aliases` or thin hidden commands mapping to the new actions. Mark `Hidden: true`. - Update labels/usage/`agentCmdline` so audit rows and error text read `ward agent build` / `ward agent pair`. **`cmd/ward/main.go`** - No grammar change (warded already -> `ward agent`); refresh the shim comment to mention the build/pair surface. **Tests** - Update `agent_test.go` / `agent_route_test.go` / `agent_tab_test.go` and any `work`/`headless`/`task` literals to the new verbs; add coverage that `build <ref>` carries and `build "<prose>"` files-then-carries (shape-dispatch), that `pair` is attached, and that the deprecated aliases still resolve. - `go test ./...` green. **Docs** - `docs/agent.md`, `docs/agent-subcommands.md`, `docs/agent-task.md` (fold into build's prose form), `docs/agent-work.md` (-> pair), `docs/FEATURES.md`, `README.md`, and any `ward agent work|headless|task` reference across `docs/`. Lead with the warded-fronted `build` / `pair` / `ask` / `reply` surface. Note the deprecated aliases once, in `docs/agent-subcommands.md`. ## Skill update (now in-repo via the relocation) The `ward agent` dispatch skill (`tooling-ward-agent`) is being moved into the ward repo by https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/286. Land that first; then this verb rename updates the skill **in this repo** alongside the code - no cross-repo follow-up. If the relocation has not landed when this is carried, update the skill in its then-current location and note the drift. ## Done condition `go build ./...` and `go test ./...` green, `pre-commit run --all-files` clean, `warded #N` / `warded build #N` / `warded build "<prose>"` / `warded pair #N` all resolve correctly (verify with `--print`), deprecated aliases still work, merged to main.
Author
Member

Re-triage (goose-triage method, claude-macos-kais-macbook-pro-2 as the judgment engine, 2026-06-24)

  • P2 - Decided-with-Kai verb rename, concrete surface, but gated behind #282 landing first.
  • interactive - Depends on the unlanded #282 surface and renames a user-facing verb set, so it starts and parks at the dependency/verify.
<!-- goose-triage --> **Re-triage** (goose-triage method, claude-macos-kais-macbook-pro-2 as the judgment engine, 2026-06-24) - **P2** - Decided-with-Kai verb rename, concrete surface, but gated behind #282 landing first. - **interactive** - Depends on the unlanded #282 surface and renames a user-facing verb set, so it starts and parks at the dependency/verify.
Author
Member

🔒 Reserved by ward agent --driver claude — container ward-ward-issue-283-claude-3e602514 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-06-24T17:55:42Z). 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-ward-issue-283-claude-3e602514` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-06-24T17:55:42Z). 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`
Author
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-ward-283 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-03T06:21:08Z). 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 `engineer-claude-ward-283` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-03T06:21:08Z). 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: blocked - this rename was overtaken by the ward#347 role-roster refactor (+ ward#356) two days after it was filed; the verb surface it renames no longer exists, and its two remaining asks reverse landed decisions - need Kai to pick close-as-superseded vs. re-brand-the-roster.

I carried this into the container, front-loaded the agent-dispatch docs and skill, then read the actual surface - and stopped before touching code, because the ground this issue was written on has moved.

What happened. #283 (filed 2026-06-24) renames verbs on the work/headless/task/ask/reply surface. The very next day ward#347 (7d77042, "rename the warded surface to a startup-role roster") replaced that verb surface with engineer/director/advisor roles, and the day after that ward#356 (6401888, "engineer is detached-only; interactive work funnels to director") deleted the interactive/attach mode outright. Every symbol #283's plan names is already gone: agentSurfaceCommand, the standalone agentTaskCommand, the verb Commands list, docs/agent-work.md, docs/agent-task.md.

The intent is mostly already delivered - under different names:

  • headless + task -> engineer, which already shape-dispatches exactly as #283's build wanted: a ref carries the issue detached, prose files an issue first then carries it (runAgentEngineer in cmd/ward/agent_engineer.go). The bare-ref default (#282) also routes here.
  • ask + reply -> advisor (the "unchanged" pair), a ref comments, freeform answers.

What actively conflicts, and is why I didn't just do it:

  • engineer -> build reverses the deliberate role-noun roster (ward#347/#348/#360, incl. the generated roster page and "you send in a role, not a verb" framing in docs/agent.md).
  • pair has no target: the interactive/attached mode it would rename was removed on purpose in ward#356. Reviving it re-adds a mode the maintainers just retired.

So implementing #283 as written means undoing two landed, deliberate refactors, not building on #282. That's a product call between two of your own decisions, and forcing the regressive read is the one costly-to-undo path here - which is why I'm parking it for you rather than guessing.

The decision I need, either is a few minutes of your time:

  • (a) Close as superseded - the role roster already achieves the readability win #283 was after (engineer/advisor read at least as well as build/pair, and pair's mode is gone by design). My recommendation.
  • (b) Still want the verb face (build/pair/...) - then this is a fresh design layered on the role roster (do the verbs alias the roles? does pair mean reviving interactive, or does it just alias the director surface?), not the agentSurfaceCommand rename #283 lists. I'll re-scope and carry that.

One genuinely-unshipped scrap of #283 regardless of a/b, if you want it as its own tiny issue: the old verbs (ward agent headless|work|task|ask|reply) currently hard-error - no deprecated aliases were left behind by ward#347 - so muscle-memory and any old references break silently. That's a clean, non-conflicting add I can file separately.

Confidence is high on the read (the git timeline and docs/agent.md are unambiguous), lower only on which resolution you'd prefer - hence the ask. Tree left clean, nothing half-landed.

WARD-OUTCOME: blocked - this rename was overtaken by the ward#347 role-roster refactor (+ ward#356) two days after it was filed; the verb surface it renames no longer exists, and its two remaining asks reverse landed decisions - need Kai to pick close-as-superseded vs. re-brand-the-roster. I carried this into the container, front-loaded the agent-dispatch docs and skill, then read the actual surface - and stopped before touching code, because the ground this issue was written on has moved. **What happened.** #283 (filed 2026-06-24) renames verbs on the `work`/`headless`/`task`/`ask`/`reply` surface. The very next day ward#347 (`7d77042`, "rename the warded surface to a startup-role roster") replaced that verb surface with `engineer`/`director`/`advisor` roles, and the day after that ward#356 (`6401888`, "engineer is detached-only; interactive work funnels to director") deleted the interactive/attach mode outright. Every symbol #283's plan names is already gone: `agentSurfaceCommand`, the standalone `agentTaskCommand`, the verb `Commands` list, `docs/agent-work.md`, `docs/agent-task.md`. **The intent is mostly already delivered - under different names:** - `headless` + `task` -> **`engineer`**, which already shape-dispatches exactly as #283's `build` wanted: a ref carries the issue detached, prose files an issue first then carries it (`runAgentEngineer` in `cmd/ward/agent_engineer.go`). The bare-ref default (#282) also routes here. - `ask` + `reply` -> **`advisor`** (the "unchanged" pair), a ref comments, freeform answers. **What actively conflicts, and is why I didn't just do it:** - `engineer` -> `build` reverses the deliberate role-noun roster (ward#347/#348/#360, incl. the generated roster page and "you send in a role, not a verb" framing in `docs/agent.md`). - `pair` has no target: the interactive/attached mode it would rename was removed on purpose in ward#356. Reviving it re-adds a mode the maintainers just retired. So implementing #283 as written means undoing two landed, deliberate refactors, not building on #282. That's a product call between two of your own decisions, and forcing the regressive read is the one costly-to-undo path here - which is why I'm parking it for you rather than guessing. **The decision I need, either is a few minutes of your time:** - **(a) Close as superseded** - the role roster already achieves the readability win #283 was after (`engineer`/`advisor` read at least as well as `build`/`pair`, and `pair`'s mode is gone by design). My recommendation. - **(b) Still want the verb face** (`build`/`pair`/...) - then this is a *fresh* design layered on the role roster (do the verbs alias the roles? does `pair` mean reviving interactive, or does it just alias the director surface?), not the `agentSurfaceCommand` rename #283 lists. I'll re-scope and carry that. One genuinely-unshipped scrap of #283 regardless of a/b, if you want it as its own tiny issue: the old verbs (`ward agent headless|work|task|ask|reply`) currently hard-error - no deprecated aliases were left behind by ward#347 - so muscle-memory and any old references break silently. That's a clean, non-conflicting add I can file separately. Confidence is high on the read (the git timeline and `docs/agent.md` are unambiguous), lower only on which resolution you'd prefer - hence the ask. Tree left clean, nothing half-landed.
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/ward#283
No description provided.