AGENTS.md: prohibit warded engineers from debugging/iterating against live deployments #466

Closed
opened 2026-07-11 02:24:06 +00:00 by coilyco-ops · 6 comments
Member

Problem

Warded engineers and QA run in sealed, ephemeral clones with no live-cluster access. They cannot curl a public edge, inspect a pod, watch a rollout, or confirm a secret synced. When handed deploy/infra work they nonetheless treat it like a unit test - change logic, push, watch CI, repeat - and "fix until green." Because they cannot observe the live system, this produces unverifiable changes that land red on main and churn.

This exact failure just happened: a 24h window put ~137 unverifiable commits across coilyco-bridge/deploy + coilyco-flight-deck/infrastructure, with per-service rollout hacks (a public-HTTP gate that fails from inside the cluster, an ExternalSecret refresh-wait that times out on a healthy secret) that only turned deploys red. Full write-up: coilyco-bridge/deploy#141.

Scope (IMPORTANT - corrected)

This rule binds only the sealed roles: engineer and QA. It does NOT bind director, ops, or advisor - those hold live-observe surfaces (the advisor role carries the tailnet + ~/.aws live-observe guardfile set) and are explicitly authorized to debug deployments. Do not phrase the rule as "all warded agents."

Do

Add this rule to the ## Agent rules section of AGENTS.md (the public-safe universal base, sibling to "Run until a wall worth a human"). Use this text (tighten only to house voice if needed - no em-dashes, bold anchors, no semicolons in prose). This exact text will be repeated verbatim into the infra and deploy repos, so treat it as the canonical wording:


Engineers and QA: never debug or iterate against a live deployment

This rule binds the sealed roles - engineer and QA - which run in ephemeral clones with no live-cluster access. It does not bind director, ops, or advisor: those hold live-observe surfaces (the advisor role carries the tailnet + ~/.aws live-observe guardfile set) and are authorized to debug deployments.

An engineer or QA runs in a sealed, ephemeral clone with no live-cluster access. You cannot curl a public edge, inspect a pod, watch a rollout, or confirm a secret synced. So you must not try to debug, tune, or "fix until green" a live deployment, and QA must not render a verdict that turns on live-cluster state it cannot observe. Treating infra like a unit test - change logic, push, watch CI, repeat - produces changes you cannot verify, which land red on main and churn. A live deployment you cannot observe is one of the walls worth a human.

Deploys already have established precedent (exposure patterns, exemplar services, shared charts). For deploy work: match the precedent and copy the exemplar, do not invent or iterate. If a change genuinely needs live verification - does this rollout succeed, is this secret synced, is the edge reachable - you cannot provide it from a sealed clone. Stop, file an interactive-labeled issue describing exactly what needs live verification, and hand it to a role that can observe live (the operator, or a director / ops / advisor run). Do not push a speculative fix and hope CI confirms it.


Acceptance

  • The rule lands in AGENTS.md under ## Agent rules, house voice, passes the pre-commit suite.
  • It is unambiguous that this is a hard prohibition for engineer + QA (like force-push or data-loss), and that director / ops / advisor are authorized to debug deploys.
  • Cross-reference the deploy precedent doc (deploy docs/deploy-patterns.md, forthcoming) and the burndown repo-exclusion filter (coilyco-flight-deck/ward#1105).

Context

Codifies the lesson behind the deploy/infra churn cleanup. The burndown filter (ward#1105) keeps these repos out of headless burndown; this doctrine rule stops any sealed-role run - on any repo - from iterating against a live system it cannot see.

## Problem Warded **engineers and QA** run in sealed, ephemeral clones with **no live-cluster access**. They cannot curl a public edge, inspect a pod, watch a rollout, or confirm a secret synced. When handed deploy/infra work they nonetheless treat it like a unit test - change logic, push, watch CI, repeat - and "fix until green." Because they cannot observe the live system, this produces unverifiable changes that land red on `main` and churn. This exact failure just happened: a 24h window put ~137 unverifiable commits across `coilyco-bridge/deploy` + `coilyco-flight-deck/infrastructure`, with per-service rollout hacks (a public-HTTP gate that fails from inside the cluster, an ExternalSecret refresh-wait that times out on a healthy secret) that only turned deploys red. Full write-up: `coilyco-bridge/deploy#141`. ## Scope (IMPORTANT - corrected) This rule binds **only the sealed roles: engineer and QA.** It does **NOT** bind **director, ops, or advisor** - those hold live-observe surfaces (the advisor role carries the tailnet + `~/.aws` live-observe guardfile set) and are explicitly **authorized** to debug deployments. Do not phrase the rule as "all warded agents." ## Do Add this rule to the **`## Agent rules`** section of `AGENTS.md` (the public-safe universal base, sibling to "Run until a wall worth a human"). Use this text (tighten only to house voice if needed - no em-dashes, bold anchors, no semicolons in prose). This exact text will be repeated verbatim into the infra and deploy repos, so treat it as the canonical wording: --- ### Engineers and QA: never debug or iterate against a live deployment This rule binds the **sealed roles - engineer and QA** - which run in ephemeral clones with no live-cluster access. It does **not** bind director, ops, or advisor: those hold live-observe surfaces (the advisor role carries the tailnet + `~/.aws` live-observe guardfile set) and are authorized to debug deployments. An engineer or QA runs in a sealed, ephemeral clone with **no live-cluster access**. You cannot curl a public edge, inspect a pod, watch a rollout, or confirm a secret synced. So you **must not** try to debug, tune, or "fix until green" a live deployment, and QA **must not** render a verdict that turns on live-cluster state it cannot observe. Treating infra like a unit test - change logic, push, watch CI, repeat - produces changes you cannot verify, which land red on `main` and churn. A live deployment you cannot observe **is** one of the walls worth a human. Deploys already have established precedent (exposure patterns, exemplar services, shared charts). For deploy work: **match the precedent and copy the exemplar, do not invent or iterate.** If a change genuinely needs live verification - does this rollout succeed, is this secret synced, is the edge reachable - you **cannot** provide it from a sealed clone. Stop, file an `interactive`-labeled issue describing exactly what needs live verification, and hand it to a role that can observe live (the operator, or a director / ops / advisor run). Do not push a speculative fix and hope CI confirms it. --- ## Acceptance - The rule lands in `AGENTS.md` under `## Agent rules`, house voice, passes the pre-commit suite. - It is unambiguous that this is a **hard prohibition** for engineer + QA (like force-push or data-loss), and that director / ops / advisor are **authorized** to debug deploys. - Cross-reference the deploy precedent doc (deploy docs/deploy-patterns.md, forthcoming) and the burndown repo-exclusion filter (`coilyco-flight-deck/ward#1105`). ## Context Codifies the lesson behind the deploy/infra churn cleanup. The burndown filter (ward#1105) keeps these repos out of *headless* burndown; this doctrine rule stops any sealed-role run - on any repo - from iterating against a live system it cannot see.
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-claude-agentic-os-466 on host KAI-DESKTOP-TOWER.

Reserved by ward agent --harness claude (reserved 2026-07-11T02:24:19Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (1h 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/agentic-os#466 · branch issue-466 · harness claude · workflow pull-requests-and-merge
  • Run: engineer-claude-agentic-os-466 · ward v0.605.0 · dispatched 2026-07-11T02:24:19Z
  • Comment thread: 0 included in the pre-flight read, 0 stripped (ward's own automated comments).

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

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-claude-agentic-os-466` on host `KAI-DESKTOP-TOWER`. Reserved by `ward agent --harness claude` (reserved 2026-07-11T02:24:19Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (1h 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/agentic-os#466` · branch `issue-466` · harness `claude` · workflow `pull-requests-and-merge` - **Run:** `engineer-claude-agentic-os-466` · ward `v0.605.0` · dispatched `2026-07-11T02:24:19Z` - **Comment thread:** 0 included in the pre-flight read, 0 stripped (ward's own automated comments). Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.605.0). </details> </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

SCOPE CORRECTION (Kai) - read before writing the rule

This rule is specifically for the sealed roles: engineer and QA. It does NOT apply to director, ops, or advisor - those are authorized to debug deployments (the advisor role even holds the tailnet + ~/.aws live-observe guardfile set). Do not write it as "all warded agents" or "every warded engineer" in the blanket sense - name the roles it binds (engineer, QA) and name the ones it exempts (director, ops, advisor).

The issue body now carries the exact canonical wording to use (the ### Engineers and QA: never debug or iterate against a live deployment block). Write that text verbatim into AGENTS.md; it will be repeated into the infra and deploy repos word-for-word, so the wording must match.

## SCOPE CORRECTION (Kai) - read before writing the rule This rule is **specifically for the sealed roles: engineer and QA.** It does **NOT** apply to director, ops, or advisor - those are authorized to debug deployments (the advisor role even holds the tailnet + `~/.aws` live-observe guardfile set). Do **not** write it as "all warded agents" or "every warded engineer" in the blanket sense - name the roles it binds (engineer, QA) and name the ones it exempts (director, ops, advisor). The issue body now carries the exact canonical wording to use (the `### Engineers and QA: never debug or iterate against a live deployment` block). Write that text verbatim into `AGENTS.md`; it will be repeated into the infra and deploy repos word-for-word, so the wording must match.
Author
Member

WARD-OUTCOME: submitted

details

workflow: pull-request-and-merge; review summary: skipped - the in-container review gate was intentionally skipped per the temporary ward default pending brokered QA.

PR: coilyco-flight-deck/agentic-os#467 (branch issue-466, ci / gate green, mergeable, body carries closes #466 and ward.workflow: pull-request-and-merge). Director merge is the remaining step - the engineer stops at merge-ready.

What landed: the Never debug or iterate against a live deployment rule in AGENTS.md under ## Agent rules, sibling to "Run until a wall worth a human", tightened to house voice, framed as a hard prohibition with the interactive-issue handoff, cross-referencing the deploy precedent doc (coilyco-bridge/deploy docs/deploy-patterns.md, forthcoming) and the burndown filter (coilyco-flight-deck/ward#1105). CLAUDE.md is @AGENTS.md so no mirror edit. pyproject.toml agents_md_max_chars raised 14500 -> 16000 with the in-context rationale comment, matching the three prior documented bumps.

Retrospective: the edit itself was clean, and the one surprise was the documentation-layout char cap - AGENTS.md was already within ~600 chars of it, so the rule could not fit without either gutting it or bumping the cap. The cap's own comment history establishes the bump pattern for always-composed doctrine, so the agent followed it and trimmed the prose besides. ward ops forgejo was degraded in-container (baked neutral config), so PR/comment operations went through the Forgejo REST API with FORGEJO_TOKEN directly. Confidence high: full pre-commit suite green, 455 pytest tests green, CI gate green.

Follow-ups: none filed - the deploy precedent doc is already tracked as forthcoming in coilyco-bridge/deploy, and the reference in the rule points at it by path.

Reservation: this run is complete, the lock releases when the container exits - no manual clear needed.

— Claude (she/her), via ward agent

WARD-OUTCOME: submitted <details><summary>details</summary> workflow: pull-request-and-merge; review summary: skipped - the in-container review gate was intentionally skipped per the temporary ward default pending brokered QA. PR: coilyco-flight-deck/agentic-os#467 (branch `issue-466`, `ci / gate` green, mergeable, body carries `closes #466` and `ward.workflow: pull-request-and-merge`). Director merge is the remaining step - the engineer stops at merge-ready. What landed: the **Never debug or iterate against a live deployment** rule in `AGENTS.md` under `## Agent rules`, sibling to "Run until a wall worth a human", tightened to house voice, framed as a hard prohibition with the interactive-issue handoff, cross-referencing the deploy precedent doc (`coilyco-bridge/deploy` `docs/deploy-patterns.md`, forthcoming) and the burndown filter (`coilyco-flight-deck/ward#1105`). `CLAUDE.md` is `@AGENTS.md` so no mirror edit. `pyproject.toml` `agents_md_max_chars` raised 14500 -> 16000 with the in-context rationale comment, matching the three prior documented bumps. Retrospective: the edit itself was clean, and the one surprise was the documentation-layout char cap - AGENTS.md was already within ~600 chars of it, so the rule could not fit without either gutting it or bumping the cap. The cap's own comment history establishes the bump pattern for always-composed doctrine, so the agent followed it and trimmed the prose besides. `ward ops forgejo` was degraded in-container (baked neutral config), so PR/comment operations went through the Forgejo REST API with `FORGEJO_TOKEN` directly. Confidence high: full pre-commit suite green, 455 pytest tests green, CI gate green. Follow-ups: none filed - the deploy precedent doc is already tracked as forthcoming in `coilyco-bridge/deploy`, and the reference in the rule points at it by path. Reservation: this run is complete, the lock releases when the container exits - no manual clear needed. </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

WARD-DISPATCH: failed

failure details

This forwarded dispatch failed after the issue was already reserved.

Attempted harness: claude
Attempted run: ward agent engineer coilyco-flight-deck/agentic-os#466 --harness claude --ward-version v0.605.0 --details PR#467 was CLOSED for wrong scope - it omitted QA and did not exempt director/ops/advisor. Use the EXACT '### Engineers and QA: never debug or iterate against a live deployment' block in this issue body VERBATIM (do not reword), so it stays byte-identical to the infra#544 and deploy#162 copies.
Container: engineer-claude-agentic-os-466
Container created: no running engineer was observed.
Host log: C:\Users\firem\.ward\agent-logs\dispatch\20260711T023605Z-director-claude-zr86-coilyco-flight-deck-agentic-os-466.log
Failure: ward agent engineer --harness claude: issue coilyco-flight-deck/agentic-os#466 is already reserved remotely (by @coilyco-ops at 2026-07-11T02:24:19Z); wait for it to finish or pass --force to override

Retry: choose another harness if the first one is down, or rerun with --force if the reservation is stale.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation-released --> <!-- ward-needs-redispatch --> WARD-DISPATCH: failed ❌ <details><summary>failure details</summary> This forwarded dispatch failed after the issue was already reserved. Attempted harness: `claude` Attempted run: `ward agent engineer coilyco-flight-deck/agentic-os#466 --harness claude --ward-version v0.605.0 --details PR#467 was CLOSED for wrong scope - it omitted QA and did not exempt director/ops/advisor. Use the EXACT '### Engineers and QA: never debug or iterate against a live deployment' block in this issue body VERBATIM (do not reword), so it stays byte-identical to the infra#544 and deploy#162 copies.` Container: `engineer-claude-agentic-os-466` Container created: no running engineer was observed. Host log: `C:\Users\firem\.ward\agent-logs\dispatch\20260711T023605Z-director-claude-zr86-coilyco-flight-deck-agentic-os-466.log` Failure: `ward agent engineer --harness claude: issue coilyco-flight-deck/agentic-os#466 is already reserved remotely (by @coilyco-ops at 2026-07-11T02:24:19Z); wait for it to finish or pass --force to override` Retry: choose another harness if the first one is down, or rerun with `--force` if the reservation is stale. </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Member

WARDED_WORKFLOW: reservation-held

reservation details

Holder: launch intent for container engineer-codex-agentic-os-466 on host kais-macbook-pro-2.local.

Accepted by ward agent --harness codex (reserved 2026-07-14T09:33:08Z). Concurrent ward agent runs are blocked until this intent becomes visible or the intent is released. The stale-intent fallback is still TTL-bounded (3h TTL). --override-reservation 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/agentic-os#466 · branch issue-466 · harness codex · workflow pull-request-and-merge
  • Run: engineer-codex-agentic-os-466 · ward v0.672.0 · dispatched 2026-07-14T09:33:06Z
  • Comment thread: 3 included in the pre-flight read, 1 stripped (ward's own automated comments).

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

— Codex, via ward agent

<!-- ward-agent-reservation --> WARDED_WORKFLOW: reservation-held <details><summary>reservation details</summary> Holder: launch intent for container `engineer-codex-agentic-os-466` on host `kais-macbook-pro-2.local`. Accepted by `ward agent --harness codex` (reserved 2026-07-14T09:33:08Z). Concurrent `ward agent` runs are blocked until this intent becomes visible or the intent is released. The stale-intent fallback is still TTL-bounded (3h TTL). `--override-reservation` 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/agentic-os#466` · branch `issue-466` · harness `codex` · workflow `pull-request-and-merge` - **Run:** `engineer-codex-agentic-os-466` · ward `v0.672.0` · dispatched `2026-07-14T09:33:06Z` - **Comment thread:** 3 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilyco-ops (2026-07-11T02:29:26Z), @coilyco-ops (2026-07-11T02:31:34Z), @coilyco-ops (2026-07-11T02:36:14Z) - stripped: @coilyco-ops (2026-07-11T02:24:19Z) Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.672.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARDED_WORKFLOW: blocked 🛑

details

workflow: pull-request-and-merge; review summary: skipped - the in-container review gate was intentionally skipped by ~/.ward/config.yaml default.

The implementation itself was straightforward. The only surprise was the Forgejo Actions run for PR #522 staying in running for minutes with no usable job detail exposed through the API, so the branch was left blocked on the forge runner rather than on repo-side changes.

Confidence: medium. Follow-up: a human with Forgejo runner access needs to unblock or restart the PR check for coilyco-flight-deck/agentic-os#522.

WARDED_WORKFLOW: blocked 🛑 <details><summary>details</summary> workflow: pull-request-and-merge; review summary: skipped - the in-container review gate was intentionally skipped by ~/.ward/config.yaml default. The implementation itself was straightforward. The only surprise was the Forgejo Actions run for PR #522 staying in `running` for minutes with no usable job detail exposed through the API, so the branch was left blocked on the forge runner rather than on repo-side changes. Confidence: medium. Follow-up: a human with Forgejo runner access needs to unblock or restart the PR check for `coilyco-flight-deck/agentic-os#522`. </details>
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/agentic-os#466
No description provided.