feat(container): publish ward as a devcontainer Feature + customizations.ward #113

Closed
opened 2026-06-17 17:25:56 +00:00 by coilysiren · 4 comments
Owner

Goal

Invert the image relationship: instead of ward container wrapping one aos dev-base image, publish ward as a devcontainer Feature so any repo's existing .devcontainer opts into agent-driving via "features": { "ward": {...} }. This is the move that makes ward and "true devcontainers" genuinely the same system rather than two parallel container stacks.

The Feature

Package as one installable containers.dev Feature:

  • the embedded entrypoint (forgejo auth, ward install, clone, context compose, launch, reap),
  • the substrate warmer (preclone-repos.txt tiers into /substrate),
  • the doctrine composer (AGENTS.container.md + the mode ladder),
  • the permission policy (bypassPermissions + force-push deny).

Then ward stops owning the base image. Any repo declaring its own image/Dockerfile/features adds the ward Feature and gets agent-driving for free.

customizations.ward namespace

Add a customizations.ward block to carry per-repo ward policy in the same file humans already maintain:

  • mode ladder (claude/codex/qwen),
  • substrate tier selection,
  • --aws opt-in,
  • egress allowlist additions (pairs with the firewall issue).

This mirrors how [tool.agentic-os.*] carries per-repo hook opt-outs today: policy lives next to the thing it configures, not in ward's global defaults.

Sequence

Third of three. After the egress firewall and after .devcontainer/ consumption (separate issues). Bigger lift, but it is the endgame where ward and the open spec converge.

Refs the ward container epic agentic-os#220, ward#98.

## Goal Invert the image relationship: instead of `ward container` **wrapping** one aos dev-base image, **publish ward as a devcontainer Feature** so any repo's existing `.devcontainer` opts into agent-driving via `"features": { "ward": {...} }`. This is the move that makes ward and "true devcontainers" genuinely the same system rather than two parallel container stacks. ## The Feature Package as one installable containers.dev Feature: - the embedded entrypoint (forgejo auth, ward install, clone, context compose, launch, reap), - the substrate warmer (`preclone-repos.txt` tiers into `/substrate`), - the doctrine composer (`AGENTS.container.md` + the mode ladder), - the permission policy (`bypassPermissions` + force-push deny). Then ward stops owning the base image. Any repo declaring its own image/Dockerfile/features adds the ward Feature and gets agent-driving for free. ## `customizations.ward` namespace Add a `customizations.ward` block to carry **per-repo ward policy** in the same file humans already maintain: - mode ladder (`claude`/`codex`/`qwen`), - substrate tier selection, - `--aws` opt-in, - egress allowlist additions (pairs with the firewall issue). This mirrors how `[tool.agentic-os.*]` carries per-repo hook opt-outs today: policy lives next to the thing it configures, not in ward's global defaults. ## Sequence Third of three. After the egress firewall and after `.devcontainer/` consumption (separate issues). Bigger lift, but it is the endgame where ward and the open spec converge. Refs the `ward container` epic agentic-os#220, ward#98.
Member

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

  • P3 - Publish ward as a devcontainer Feature, big real feature, committed-ish direction, kept.
  • consult - Large design (image relationship inversion), human-gated start.
<!-- goose-triage --> **Re-triage** (goose-triage method, claude-macos-kais-macbook-pro-2 as the judgment engine, 2026-06-24) - **P3** - Publish ward as a devcontainer Feature, big real feature, committed-ish direction, kept. - **consult** - Large design (image relationship inversion), human-gated start.
Member

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

  • P3 - Publish ward as a devcontainer Feature, big real feature, committed-ish direction, kept.
  • consult - Large design (image relationship inversion), human-gated start.
<!-- goose-triage --> **Re-triage** (goose-triage method, claude-macos-kais-macbook-pro-2 as the judgment engine, 2026-06-24) - **P3** - Publish ward as a devcontainer Feature, big real feature, committed-ish direction, kept. - **consult** - Large design (image relationship inversion), human-gated start.
Member

Flipped headless: concrete goal (publish ward as a devcontainer Feature). Pairs with #112 (consume devcontainer.json) - sequence 112 first so the Feature consumes the same contract it publishes. Recorded by Claude Code (Fable) during the 2026-07-01 ward launch triage session with Kai.

Flipped headless: concrete goal (publish ward as a devcontainer Feature). Pairs with #112 (consume devcontainer.json) - sequence 112 first so the Feature consumes the same contract it publishes. Recorded by Claude Code (Fable) during the 2026-07-01 ward launch triage session with Kai.
Author
Owner

Similarly to the other devcomtainer feat - I will think about it if someone wants this

Similarly to the other devcomtainer feat - I will think about it if someone wants this
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#113
No description provided.