fleet: fold per-agent signing identity (name+pronouns) into ward-kdl.fleet.kdl, kill the agentIdentity() switch + pronoun drift #603

Closed
opened 2026-07-04 09:09:51 +00:00 by coilysiren · 0 comments
Owner

Follow-up carved out of coilyco-flight-deck/agentic-os#306 (design) and its superseding umbrella aos#310. Filed by the #306 engineer run (she/her). Depends on cli-guard#189 (the grammar prerequisite).

Context

aos#310 reversed #306's original "aos-authored agents.yaml" premise and rehomed the agent config in ward-kdl dialect 2, embedded + cli-guard-validated. That has largely shipped: ward-kdl.fleet.kdl now authors the roster, default agent, per-agent model / endpoint / provider / codex tuning, and the git-commit attribution, and container_bootstrap.go sources its env-defaults from it (env still overrides per-run). The aos-side roster duplication is gone too - scripts/agent-compat.py reads ward agents list --json (aos#310 issue 5).

The one config-shaped slice #306 named that has NOT moved is the per-agent signing identity:

  • agentIdentity() switch in cmd/ward/agent_signature.go - Codex/Qwen/Goose bare, Claude she/her, unknown -> Claude she/her.
  • The same values restated a second time as per-package attribution.Identity{} structs in internal/agents/claude|codex|opencode|goose/*.go (used by each Agent.Signer()). Two authoritative copies of the same identity data now.
  • The signing-attribution shape in agentSigner(): Via: "via \ward agent`"andEmail: fmt.Sprintf("%s@ward.agent", m)`.

Live drift to fix in the same pass

docs/harness-selection.md assigns Codex=he/him, OpenCode=they/them, Goose=she/her, Claude=she/her, but agentIdentity() returns empty pronouns for Codex/Goose/OpenCode. The doc and the code disagree today (flagged on aos#306 and in the aos#308 audit). Folding identity into the manifest is the single-source fix: author the pronouns once in ward-kdl.fleet.kdl and the drift cannot recur.

Note: these are the agent-persona pronouns (per harness-selection.md), distinct from the she/her-always rule that governs Kai's own artifacts.

Ask (once cli-guard#189 lands)

  1. Author identity name=... pronouns=... on each agent in ward-kdl.fleet.kdl, and the via + signing email-domain on the defaults/signing node. Re-run make sync-fleet-assets.
  2. Collapse agentIdentity() into a loadFleetConfig() lookup, and delete the per-package attribution.Identity{} literals so each Agent.Signer() reads its identity from the one manifest.
  3. Source agentSigner()'s Via and Email domain from the manifest defaults instead of the Go literals.
  4. Extend the fleet<->parseMode contract test to pin identity + pronouns + signing shape, so manifest and any remaining code path cannot silently diverge during the cutover. Delete the Go copies once green.

Not in scope

The git-commit fleet identity (coilyco-ops) already lives in defaults.attribution - unchanged. visionCapable() and other behavioral flags stay code, not manifest data.

Follow-up carved out of coilyco-flight-deck/agentic-os#306 (design) and its superseding umbrella aos#310. Filed by the #306 engineer run (she/her). Depends on cli-guard#189 (the grammar prerequisite). ## Context aos#310 reversed #306's original "aos-authored agents.yaml" premise and rehomed the agent config in **ward-kdl dialect 2**, embedded + cli-guard-validated. That has largely shipped: `ward-kdl.fleet.kdl` now authors the roster, default agent, per-agent model / endpoint / provider / codex tuning, and the git-commit attribution, and `container_bootstrap.go` sources its env-defaults from it (env still overrides per-run). The aos-side roster duplication is gone too - `scripts/agent-compat.py` reads `ward agents list --json` (aos#310 issue 5). The one config-shaped slice #306 named that has NOT moved is the **per-agent signing identity**: - `agentIdentity()` switch in `cmd/ward/agent_signature.go` - Codex/Qwen/Goose bare, Claude she/her, unknown -> Claude she/her. - The same values restated a second time as per-package `attribution.Identity{}` structs in `internal/agents/claude|codex|opencode|goose/*.go` (used by each `Agent.Signer()`). Two authoritative copies of the same identity data now. - The signing-attribution shape in `agentSigner()`: `Via: "via \`ward agent\`"` and `Email: fmt.Sprintf("%s@ward.agent", m)`. ## Live drift to fix in the same pass `docs/harness-selection.md` assigns Codex=he/him, OpenCode=they/them, Goose=she/her, Claude=she/her, but `agentIdentity()` returns **empty** pronouns for Codex/Goose/OpenCode. The doc and the code disagree today (flagged on aos#306 and in the aos#308 audit). Folding identity into the manifest is the single-source fix: author the pronouns once in `ward-kdl.fleet.kdl` and the drift cannot recur. Note: these are the agent-persona pronouns (per harness-selection.md), distinct from the she/her-always rule that governs Kai's own artifacts. ## Ask (once cli-guard#189 lands) 1. Author `identity name=... pronouns=...` on each agent in `ward-kdl.fleet.kdl`, and the `via` + signing email-domain on the defaults/signing node. Re-run `make sync-fleet-assets`. 2. Collapse `agentIdentity()` into a `loadFleetConfig()` lookup, and delete the per-package `attribution.Identity{}` literals so each `Agent.Signer()` reads its identity from the one manifest. 3. Source `agentSigner()`'s `Via` and `Email` domain from the manifest defaults instead of the Go literals. 4. Extend the fleet<->parseMode contract test to pin identity + pronouns + signing shape, so manifest and any remaining code path cannot silently diverge during the cutover. Delete the Go copies once green. ## Not in scope The git-commit fleet identity (`coilyco-ops`) already lives in `defaults.attribution` - unchanged. `visionCapable()` and other behavioral flags stay code, not manifest data.
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#603
No description provided.