ward agent: accept both --harness and --agent for the harness pick (retire --driver to deprecated alias) #660

Closed
opened 2026-07-08 03:40:46 +00:00 by coilyco-ops · 7 comments
Member

DECIDED (Kai, final): ward agent accepts BOTH --harness and --agent as equal, first-class spellings for the harness pick. --agent is NOT rejected. --driver retires to a deprecated hidden alias for one release cycle.

Correction notice

The first #660 run landed the opposite of this decision - it made --harness canonical and rejected --agent (commit feat(agent): --harness is the canonical harness pick), following this issue's original recommendation before Kai settled it. This body is rewritten to be unambiguous, and the run is re-dispatched to add --agent as an equal accepted spelling.

Do

  • ward agent accepts all three spellings on every role (engineer, director, advisor, director-consult, and the internal surface): --harness, --agent, and (deprecated, hidden) --driver. All resolve to the same value.
  • --harness and --agent are both first-class and permanent - neither is preferred over the other in acceptance. Document --harness first in help text only because the concept is already named "the harness" there, but --agent is equally supported and must not be rejected or hidden.
  • Keep the already-landed pieces: --driver deprecated alias, "explicit spelling wins when set", the invalid-value error naming whichever spelling the caller used, and the broker validator approving every spelling for skew-safety. Extend all of these to also cover --agent.
  • The --agent / ward agent / roster-noun overlap is accepted - Kai is fine living with it.
  • Update docs/agent.md, docs/agent-drivers.md, and the warded examples so --agent appears as an accepted spelling, not a rejected one.
  • Coordinate the eventual --driver retirement with the #539 caller sweep.

Filed from the read-only director surface (she/her).

**DECIDED (Kai, final): `ward agent` accepts BOTH `--harness` and `--agent` as equal, first-class spellings for the harness pick. `--agent` is NOT rejected.** `--driver` retires to a deprecated hidden alias for one release cycle. ## Correction notice The first #660 run landed the **opposite** of this decision - it made `--harness` canonical and **rejected `--agent`** (commit `feat(agent): --harness is the canonical harness pick`), following this issue's original recommendation before Kai settled it. This body is rewritten to be unambiguous, and the run is re-dispatched to add `--agent` as an equal accepted spelling. ## Do * `ward agent` accepts **all three** spellings on every role (engineer, director, advisor, director-consult, and the internal surface): `--harness`, `--agent`, and (deprecated, hidden) `--driver`. All resolve to the same value. * `--harness` and `--agent` are **both first-class and permanent** - neither is preferred over the other in acceptance. Document `--harness` first in help text only because the concept is already named "the harness" there, but `--agent` is equally supported and must not be rejected or hidden. * Keep the already-landed pieces: `--driver` deprecated alias, "explicit spelling wins when set", the invalid-value error naming whichever spelling the caller used, and the broker validator approving every spelling for skew-safety. Extend all of these to also cover `--agent`. * The `--agent` / `ward agent` / roster-noun overlap is **accepted** - Kai is fine living with it. * Update `docs/agent.md`, `docs/agent-drivers.md`, and the `warded` examples so `--agent` appears as an accepted spelling, not a rejected one. * Coordinate the eventual `--driver` retirement with the #539 caller sweep. Filed from the read-only director surface (she/her).
coilyco-ops changed title from ward agent: rename --driver -> --harness (keep --driver as deprecated alias) to ward agent: accept both --harness and --agent for the harness pick (retire --driver to deprecated alias) 2026-07-08 03:45:33 +00:00
Author
Member

Decided (Kai): accept both --harness and --agent as equal spellings for the harness pick, not one canonical over the other. --driver retires to a deprecated hidden alias for one cycle.

So ward agent takes any of --harness / --agent / (deprecated) --driver, all resolving to the same value. Document --harness first in the help text since the concept is already named 'the harness' there, but both are first-class and supported permanently. The --agent/ward agent overlap Kai is fine to live with. Filed from the read-only director surface (she/her).

**Decided (Kai):** accept **both** `--harness` and `--agent` as equal spellings for the harness pick, not one canonical over the other. `--driver` retires to a deprecated hidden alias for one cycle. So `ward agent` takes any of `--harness` / `--agent` / (deprecated) `--driver`, all resolving to the same value. Document `--harness` first in the help text since the concept is already named 'the harness' there, but both are first-class and supported permanently. The `--agent`/`ward agent` overlap Kai is fine to live with. Filed from the read-only director surface (she/her).
Author
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-ward-660 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-08T03:46:01Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#660 · branch issue-660 · driver claude · workflow direct-main
  • Run: engineer-claude-ward-660 · ward v0.439.0 · dispatched 2026-07-08T03:46:01Z
  • Comment thread: 1 included in the pre-flight read, 0 stripped (ward's own automated comments).

Issue body as seeded:

Raised by Kai alongside the fleet-config smart-defaults thread (#650 / #659). CLI ergonomics, separable from the config-resolve work.

## The ask

Rename `ward agent`'s `--driver` flag. Kai offered `[ --agent | --harness ]`.

## Recommendation: `--harness`

* `ward agent --help` already says the flag "picks the harness (claude|codex|opencode|goose)" - the concept is **called** the harness in the code and docs, so `--harness` is the exact rename, not a re-coining.
* `--agent` **collides** on two fronts: the fleet.kdl roster noun is `agent <name> { }`, and the command itself is `ward agent`. `ward agent engineer --agent claude` reads as agent-agent and blurs the harness (claude/codex) against the role (engineer/director/advisor) and the roster entry.

## Do

* Add `--harness` as the canonical flag on `ward agent`.
* Keep `--driver` as a **deprecated hidden alias** for one release cycle so infra / ward-kdl callers do not hard-break (coordinate the caller sweep with #539).
* Update `docs/agent.md`, the help text, and the `warded` face examples.

Small and reversible. If Kai prefers `--agent`, or wants both accepted permanently, flip the canonical name - the alias mechanism is the same either way. Filed from the read-only director surface (she/her).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.439.0).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-ward-660` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-08T03:46:01Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#660` · branch `issue-660` · driver `claude` · workflow `direct-main` - **Run:** `engineer-claude-ward-660` · ward `v0.439.0` · dispatched `2026-07-08T03:46:01Z` - **Comment thread:** 1 included in the pre-flight read, 0 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-08T03:45:33Z) **Issue body as seeded:** ``` Raised by Kai alongside the fleet-config smart-defaults thread (#650 / #659). CLI ergonomics, separable from the config-resolve work. ## The ask Rename `ward agent`'s `--driver` flag. Kai offered `[ --agent | --harness ]`. ## Recommendation: `--harness` * `ward agent --help` already says the flag "picks the harness (claude|codex|opencode|goose)" - the concept is **called** the harness in the code and docs, so `--harness` is the exact rename, not a re-coining. * `--agent` **collides** on two fronts: the fleet.kdl roster noun is `agent <name> { }`, and the command itself is `ward agent`. `ward agent engineer --agent claude` reads as agent-agent and blurs the harness (claude/codex) against the role (engineer/director/advisor) and the roster entry. ## Do * Add `--harness` as the canonical flag on `ward agent`. * Keep `--driver` as a **deprecated hidden alias** for one release cycle so infra / ward-kdl callers do not hard-break (coordinate the caller sweep with #539). * Update `docs/agent.md`, the help text, and the `warded` face examples. Small and reversible. If Kai prefers `--agent`, or wants both accepted permanently, flip the canonical name - the alias mechanism is the same either way. Filed from the read-only director surface (she/her). ``` Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.439.0). </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

⚠️ Reopened: this run's work did not land on main

An ephemeral ward container (claude mode) dispatched for this issue finished but its work was not merged to main, so the reaper preserved it on a branch before teardown and reopened the issue (its closes #660 never reached main). Recover from the salvage branch below.

  • Repo: coilyco-flight-deck/ward
  • Salvage branch: ward-salvage/ward-9c289e1b
  • Reason: missing same-repo closing reference
  • Container uptime at reap: 17m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token)

Reap diagnostics

--- reap diagnostics ---
ward version:      v0.439.0
version source:    pinned via WARD_VERSION/--ward-version (v0.439.0)
HEAD:              365468858a2f
origin/main:       8428c38db29f
ancestry:          HEAD is NOT yet on origin/main - residual work remains to land
decision gate:     missing same-repo closing reference
reason:            missing same-repo closing reference
provenance:        present
run-owned landed:  yes
working tree:      1 dirty path(s)
container uptime:  17m (baked Forgejo PAT age proxy)
--- end reap diagnostics ---

Recover

git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-9c289e1b
git checkout -b ward-salvage/ward-9c289e1b FETCH_HEAD

Working tree at reap time

?? .ward-run-provenance.json

— Claude (she/her), via ward agent

## ⚠️ Reopened: this run's work did not land on `main` An ephemeral `ward container` (claude mode) dispatched for this issue finished but its work was **not merged to `main`**, so the reaper preserved it on a branch before teardown and reopened the issue (its `closes #660` never reached `main`). Recover from the salvage branch below. - **Repo:** `coilyco-flight-deck/ward` - **Salvage branch:** `ward-salvage/ward-9c289e1b` - **Reason:** missing same-repo closing reference - **Container uptime at reap:** 17m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token) ## Reap diagnostics ``` --- reap diagnostics --- ward version: v0.439.0 version source: pinned via WARD_VERSION/--ward-version (v0.439.0) HEAD: 365468858a2f origin/main: 8428c38db29f ancestry: HEAD is NOT yet on origin/main - residual work remains to land decision gate: missing same-repo closing reference reason: missing same-repo closing reference provenance: present run-owned landed: yes working tree: 1 dirty path(s) container uptime: 17m (baked Forgejo PAT age proxy) --- end reap diagnostics --- ``` ## Recover ```bash git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-9c289e1b git checkout -b ward-salvage/ward-9c289e1b FETCH_HEAD ``` ## Working tree at reap time ``` ?? .ward-run-provenance.json ``` <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

Re-opened for correction. The first run landed --agent rejected, which is the opposite of Kai's 'both' decision - it followed this issue's stale original body over the decision comment. Body rewritten above to be unambiguous (--agent is first-class, not rejected), re-dispatching an engineer to add --agent acceptance on top of the already-landed --harness/--driver work. Filed from the read-only director surface (she/her).

Re-opened for correction. The first run landed `--agent` **rejected**, which is the opposite of Kai's 'both' decision - it followed this issue's stale original body over the decision comment. Body rewritten above to be unambiguous (`--agent` is first-class, not rejected), re-dispatching an engineer to add `--agent` acceptance on top of the already-landed `--harness`/`--driver` work. Filed from the read-only director surface (she/her).
Author
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-ward-660 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-08T04:17:20Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-flight-deck/ward#660 · branch issue-660 · driver claude · workflow direct-main
  • Run: engineer-claude-ward-660 · ward v0.439.0 · dispatched 2026-07-08T04:17:20Z
  • Comment thread: 3 included in the pre-flight read, 1 stripped (ward's own automated comments).

Issue body as seeded:

**DECIDED (Kai, final): `ward agent` accepts BOTH `--harness` and `--agent` as equal, first-class spellings for the harness pick. `--agent` is NOT rejected.** `--driver` retires to a deprecated hidden alias for one release cycle.

## Correction notice

The first #660 run landed the **opposite** of this decision - it made `--harness` canonical and **rejected `--agent`** (commit `feat(agent): --harness is the canonical harness pick`), following this issue's original recommendation before Kai settled it. This body is rewritten to be unambiguous, and the run is re-dispatched to add `--agent` as an equal accepted spelling.

## Do

* `ward agent` accepts **all three** spellings on every role (engineer, director, advisor, director-consult, and the internal surface): `--harness`, `--agent`, and (deprecated, hidden) `--driver`. All resolve to the same value.
* `--harness` and `--agent` are **both first-class and permanent** - neither is preferred over the other in acceptance. Document `--harness` first in help text only because the concept is already named "the harness" there, but `--agent` is equally supported and must not be rejected or hidden.
* Keep the already-landed pieces: `--driver` deprecated alias, "explicit spelling wins when set", the invalid-value error naming whichever spelling the caller used, and the broker validator approving every spelling for skew-safety. Extend all of these to also cover `--agent`.
* The `--agent` / `ward agent` / roster-noun overlap is **accepted** - Kai is fine living with it.
* Update `docs/agent.md`, `docs/agent-drivers.md`, and the `warded` examples so `--agent` appears as an accepted spelling, not a rejected one.
* Coordinate the eventual `--driver` retirement with the #539 caller sweep.

Filed from the read-only director surface (she/her).

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.439.0).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-ward-660` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-08T04:17:20Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-flight-deck/ward#660` · branch `issue-660` · driver `claude` · workflow `direct-main` - **Run:** `engineer-claude-ward-660` · ward `v0.439.0` · dispatched `2026-07-08T04:17:20Z` - **Comment thread:** 3 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-08T03:45:33Z), @coilyco-ops (2026-07-08T04:04:09Z), @coilyco-ops (2026-07-08T04:16:27Z) - stripped: @coilyco-ops (2026-07-08T03:46:08Z) **Issue body as seeded:** ``` **DECIDED (Kai, final): `ward agent` accepts BOTH `--harness` and `--agent` as equal, first-class spellings for the harness pick. `--agent` is NOT rejected.** `--driver` retires to a deprecated hidden alias for one release cycle. ## Correction notice The first #660 run landed the **opposite** of this decision - it made `--harness` canonical and **rejected `--agent`** (commit `feat(agent): --harness is the canonical harness pick`), following this issue's original recommendation before Kai settled it. This body is rewritten to be unambiguous, and the run is re-dispatched to add `--agent` as an equal accepted spelling. ## Do * `ward agent` accepts **all three** spellings on every role (engineer, director, advisor, director-consult, and the internal surface): `--harness`, `--agent`, and (deprecated, hidden) `--driver`. All resolve to the same value. * `--harness` and `--agent` are **both first-class and permanent** - neither is preferred over the other in acceptance. Document `--harness` first in help text only because the concept is already named "the harness" there, but `--agent` is equally supported and must not be rejected or hidden. * Keep the already-landed pieces: `--driver` deprecated alias, "explicit spelling wins when set", the invalid-value error naming whichever spelling the caller used, and the broker validator approving every spelling for skew-safety. Extend all of these to also cover `--agent`. * The `--agent` / `ward agent` / roster-noun overlap is **accepted** - Kai is fine living with it. * Update `docs/agent.md`, `docs/agent-drivers.md`, and the `warded` examples so `--agent` appears as an accepted spelling, not a rejected one. * Coordinate the eventual `--driver` retirement with the #539 caller sweep. Filed from the read-only director surface (she/her). ``` Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.439.0). </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

⚠️ Reopened: this run's work did not land on main

An ephemeral ward container (claude mode) dispatched for this issue finished but its work was not merged to main, so the reaper preserved it on a branch before teardown and reopened the issue (its closes #660 never reached main). Recover from the salvage branch below.

  • Repo: coilyco-flight-deck/ward
  • Salvage branch: ward-salvage/ward-11906072
  • Reason: missing same-repo closing reference
  • Container uptime at reap: 12m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token)

Reap diagnostics

--- reap diagnostics ---
ward version:      v0.439.0
version source:    pinned via WARD_VERSION/--ward-version (v0.439.0)
HEAD:              ef38e785aed6
origin/main:       961d04ef9c78
ancestry:          HEAD is NOT yet on origin/main - residual work remains to land
decision gate:     missing same-repo closing reference
reason:            missing same-repo closing reference
provenance:        present
run-owned landed:  yes
working tree:      1 dirty path(s)
container uptime:  12m (baked Forgejo PAT age proxy)
--- end reap diagnostics ---

Recover

git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-11906072
git checkout -b ward-salvage/ward-11906072 FETCH_HEAD

Working tree at reap time

?? .ward-run-provenance.json

— Claude (she/her), via ward agent

## ⚠️ Reopened: this run's work did not land on `main` An ephemeral `ward container` (claude mode) dispatched for this issue finished but its work was **not merged to `main`**, so the reaper preserved it on a branch before teardown and reopened the issue (its `closes #660` never reached `main`). Recover from the salvage branch below. - **Repo:** `coilyco-flight-deck/ward` - **Salvage branch:** `ward-salvage/ward-11906072` - **Reason:** missing same-repo closing reference - **Container uptime at reap:** 12m (age of the baked Forgejo PAT snapshot; a long-lived container is likelier to carry a rotated token) ## Reap diagnostics ``` --- reap diagnostics --- ward version: v0.439.0 version source: pinned via WARD_VERSION/--ward-version (v0.439.0) HEAD: ef38e785aed6 origin/main: 961d04ef9c78 ancestry: HEAD is NOT yet on origin/main - residual work remains to land decision gate: missing same-repo closing reference reason: missing same-repo closing reference provenance: present run-owned landed: yes working tree: 1 dirty path(s) container uptime: 12m (baked Forgejo PAT age proxy) --- end reap diagnostics --- ``` ## Recover ```bash git fetch https://forgejo.coilysiren.me/coilyco-flight-deck/ward.git ward-salvage/ward-11906072 git checkout -b ward-salvage/ward-11906072 FETCH_HEAD ``` ## Working tree at reap time ``` ?? .ward-run-provenance.json ``` <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

Re-closing: this run's work landed on main (closes #660 commit is present). The reopen was the reaper regression captured in #662 - it committed the untracked .ward-run-provenance.json as a trailing residual and salvaged+reopened despite run-owned landed: yes. The salvage branch holds only that provenance-file residual, no lost work. Closing. Filed from the read-only director surface (she/her).

Re-closing: this run's work landed on `main` (`closes #660` commit is present). The reopen was the reaper regression captured in #662 - it committed the untracked `.ward-run-provenance.json` as a trailing residual and salvaged+reopened despite `run-owned landed: yes`. The salvage branch holds only that provenance-file residual, no lost work. Closing. Filed from the read-only director surface (she/her).
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#660
No description provided.