ward container verb family (transparent interactive v0) #98

Closed
opened 2026-06-16 01:58:48 +00:00 by coilysiren · 1 comment
Owner

Part of epic coilyco-flight-deck/agentic-os#220

ward container verb family (transparent interactive v0)

ward owns driving the dev container: the wrapper that replaces the 10-20 word bash aliases layered over docker compose. It references the aos-published image by tag and generates the compose itself, because the mount set is a host/runtime fact.

Depends on the aos image publish and the aos eligibility manifest (siblings under #220).

v0 scope - transparent interactive

  • ward container up / exec / down - bring up the single all-repos dev container and run a command (default claude) inside it. Transparent: repos bind-mounted, edits + git + ~/.aws persist on host, the container is invisible plumbing.
  • Generated embedded compose - ward computes the mount list from the aos eligibility manifest (always-on repos like lore included) and emits the compose. Not hand-authored.
  • Mount + env computation - the fiddly part: volume mounts and the ~/.aws / SSM credential passthrough so coily ops aws ssm works inside the container. This is the real cost of the effort, scope it carefully here.
  • Image by tag - pull dev-base:<tag>. Add a --build escape hatch pointing at the aos checkout when present, for image iteration.
  • Repo selection - interactive defaults to mount-everything-eligible, optionally scoped to cwd's repo. For dispatch-driven runs the repo is already named by the issue ref (localRepoPath in cmd/ward/dispatch.go resolves it) - no new pre-flight needed.

Deferred (not this ticket)

  • Headless / cascade dispatch surfaces running inside the container (opaque model). Highest payoff but iterating on headless is annoying. File a follow-up when v0 lands.

Notes

  • Follow the existing dispatch seam shape: reusable logic could later move to cli-guard if a second consumer appears, but keep v0 as a ward host-seam. Do not pre-factor.
Part of epic https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os/issues/220 ## `ward container` verb family (transparent interactive v0) ward owns driving the dev container: the wrapper that replaces the 10-20 word bash aliases layered over docker compose. It references the aos-published image by tag and generates the compose itself, because the mount set is a host/runtime fact. Depends on the aos image publish and the aos eligibility manifest (siblings under #220). ### v0 scope - transparent interactive - **`ward container up / exec / down`** - bring up the single all-repos dev container and run a command (default `claude`) inside it. Transparent: repos bind-mounted, edits + git + `~/.aws` persist on host, the container is invisible plumbing. - **Generated embedded compose** - ward computes the mount list from the aos eligibility manifest (always-on repos like lore included) and emits the compose. Not hand-authored. - **Mount + env computation** - the fiddly part: volume mounts and the `~/.aws` / SSM credential passthrough so `coily ops aws ssm` works inside the container. This is the real cost of the effort, scope it carefully here. - **Image by tag** - pull `dev-base:<tag>`. Add a `--build` escape hatch pointing at the aos checkout when present, for image iteration. - **Repo selection** - interactive defaults to mount-everything-eligible, optionally scoped to cwd's repo. For dispatch-driven runs the repo is already named by the issue ref (`localRepoPath` in `cmd/ward/dispatch.go` resolves it) - no new pre-flight needed. ### Deferred (not this ticket) - **Headless / cascade dispatch surfaces running inside the container** (opaque model). Highest payoff but iterating on headless is annoying. File a follow-up when v0 lands. ### Notes - Follow the existing dispatch seam shape: reusable logic could later move to `cli-guard` if a second consumer appears, but keep v0 as a ward host-seam. Do not pre-factor.
coilysiren changed title from ward devcontainer verb family (transparent interactive v0) to ward container verb family (transparent interactive v0) 2026-06-16 02:01:53 +00:00
Author
Owner

v0 landed — reframed to a least-access, multi-container, fresh-clone model

The ward container verb family shipped in c2cb54c (release run#139 green: release + publish-binaries + bump-tap-formula). It deliberately departs from the transparent/shared/bind-mounted v0 described above, per a design call to make least-access the default:

  • One container per up, many at once (ward-<repo>-<rand>) — no singleton "dev container." Running several at once is the default mode, the whole point.
  • Fresh clone inside, never on the host — the target repo is cloned inside the container from forgejo, cached in a shared ward-gitcache named volume (bare mirror, refreshed per run). Not bind-mounted. Behaves like a worktree without needing one.
  • Least access — the only default host bind is the cwd (read-only, for operating context) plus ward's embedded entrypoint+doctrine. ~/.aws (broad SSM read) is opt-in via --aws.
  • Modes claude|codex|qwen ride a progressively-less-context ladder mirroring agent-compose's per-harness slices.
  • No second image — the entrypoint + agent doctrine are embedded in the ward binary (go:embed) and bind-mounted into the unmodified aos dev-base image; ward is downloaded as a release binary (new publish-binaries job).
  • Feature-lifetime autonomy — the in-container doctrine (cmd/ward/containerassets/AGENTS.container.md) overrides the host harness's hold-backs so the container commits, merges to main, resolves conflicts, and pushes on its own.

Verbs: up [owner/name], exec <name> -- <cmd>, down <name>, ls. --print dry-runs the docker invocation. See docs/container.md.

Runtime not yet exercised end-to-end — built and dry-run-verified (docker was unavailable in the authoring sandbox). First live ward container up is the remaining acceptance step.

Deferred items tracked in the follow-up issue: codex/qwen agent binaries in the dev-base image (ladder plumbing is wired; binaries aren't there yet), the headless/cascade-in-container surface, and a --build escape hatch.

## v0 landed — reframed to a least-access, multi-container, fresh-clone model The `ward container` verb family shipped in c2cb54c (release run#139 green: `release` + `publish-binaries` + `bump-tap-formula`). It deliberately **departs from the transparent/shared/bind-mounted v0** described above, per a design call to make least-access the default: - **One container per `up`, many at once** (`ward-<repo>-<rand>`) — no singleton "dev container." Running several at once is the default mode, the whole point. - **Fresh clone inside, never on the host** — the target repo is cloned inside the container from forgejo, cached in a shared `ward-gitcache` named volume (bare mirror, refreshed per run). Not bind-mounted. Behaves like a worktree without needing one. - **Least access** — the only default host bind is the **cwd** (read-only, for operating context) plus ward's embedded entrypoint+doctrine. `~/.aws` (broad SSM read) is opt-in via `--aws`. - **Modes `claude|codex|qwen`** ride a progressively-less-context ladder mirroring agent-compose's per-harness slices. - **No second image** — the entrypoint + agent doctrine are embedded in the ward binary (`go:embed`) and bind-mounted into the unmodified aos dev-base image; ward is downloaded as a release binary (new `publish-binaries` job). - **Feature-lifetime autonomy** — the in-container doctrine (`cmd/ward/containerassets/AGENTS.container.md`) overrides the host harness's hold-backs so the container commits, merges to `main`, resolves conflicts, and pushes on its own. Verbs: `up [owner/name]`, `exec <name> -- <cmd>`, `down <name>`, `ls`. `--print` dry-runs the docker invocation. See [docs/container.md](https://forgejo.coilysiren.me/coilyco-flight-deck/ward/src/branch/main/docs/container.md). **Runtime not yet exercised end-to-end** — built and dry-run-verified (docker was unavailable in the authoring sandbox). First live `ward container up` is the remaining acceptance step. Deferred items tracked in the follow-up issue: codex/qwen agent binaries in the dev-base image (ladder plumbing is wired; binaries aren't there yet), the headless/cascade-in-container surface, and a `--build` escape hatch.
coilysiren added
P2
and removed
P1
labels 2026-06-17 08:39:11 +00:00
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#98
No description provided.