docs: give the Port agent an Each iteration section (it had none) #20

Merged
fabi merged 1 commits from fix/port-loop-iteration into main 2026-09-10 17:09:42 +00:00
Owner

The Port agent's brief has never had an Each iteration section. decoder-loop.md has
had one since 2026-09-04, ending in "Commit, push-work, open the PR, label the issue
state/needs-human, and stop."
port-loop.md states the equivalent rules — "you
cannot close your own work", work reaches main "through pull requests" — but never gives
the steps.

Two of the missing steps are exactly GITEA-SETUP.md Phase 7's check items:

Phase 7 check decoder-loop port-loop (before this PR)
1 · reads its notifications first step 1 absent
2 · opens a PR and labels the issue step 7 absent

Check 1's failure mode is silent. Notifications are polled and nothing pushes them, so
an agent that never reads them looks quiet rather than broken — indistinguishable from
"nothing addressed to me yet".

Check 2 has a trap worth naming in the brief itself: docker/port/bin/push-work
only pushes — verified by reading it, no /pulls call, no Closes #, no label; its
refusals (no main, no force-push) are intact. propose-work is still unbuilt, and
GITEA-SETUP.md's own words are "the other two thirds being manual is how they get
skipped."
The capability is present — pull_request_write and issue_write are both in
the pinned MCP tool set — so this is an instruction gap, not a permissions one.

Written to mirror the Decoder's shape while using the Port's own vocabulary: a gate is an
artifact rather than "it compiles", verify against captures of the real game rather than
our renderer, state the expected number first, authored/ entries carry a why, and never
ship an invented number where a measured one is pending.

Docs-only; no code, no CI surface touched.

Provenance: found by the Pi agent while answering a Phase 7 readiness question I
raised. My own check had been decoder-only, which is precisely why the asymmetry survived
it — I verified the brief I had asked about and not its sibling.

🤖 Generated with Claude Code

The Port agent's brief has never had an `Each iteration` section. `decoder-loop.md` has had one since 2026-09-04, ending in *"Commit, `push-work`, **open the PR**, label the issue `state/needs-human`, and stop."* `port-loop.md` states the equivalent **rules** — "you cannot close your own work", work reaches `main` "through pull requests" — but never gives the **steps**. Two of the missing steps are exactly `GITEA-SETUP.md` Phase 7's check items: | Phase 7 check | decoder-loop | port-loop (before this PR) | |---|---|---| | 1 · reads its notifications first | step 1 | **absent** | | 2 · opens a PR and labels the issue | step 7 | **absent** | **Check 1's failure mode is silent.** Notifications are polled and nothing pushes them, so an agent that never reads them looks *quiet* rather than broken — indistinguishable from "nothing addressed to me yet". **Check 2 has a trap worth naming in the brief itself:** `docker/port/bin/push-work` **only pushes** — verified by reading it, no `/pulls` call, no `Closes #`, no label; its refusals (no `main`, no force-push) are intact. `propose-work` is still unbuilt, and `GITEA-SETUP.md`'s own words are *"the other two thirds being manual is how they get skipped."* The capability is present — `pull_request_write` and `issue_write` are both in the pinned MCP tool set — so this is an **instruction gap, not a permissions one**. Written to mirror the Decoder's shape while using the Port's own vocabulary: a gate is an artifact rather than "it compiles", verify against captures of the real game rather than our renderer, state the expected number first, `authored/` entries carry a `why`, and never ship an invented number where a measured one is pending. Docs-only; no code, no CI surface touched. **Provenance:** found by the Pi agent while answering a Phase 7 readiness question I raised. My own check had been decoder-only, which is precisely why the asymmetry survived it — I verified the brief I had asked about and not its sibling. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fabi added 1 commit 2026-09-09 17:37:42 +00:00
docs: give the Port agent an Each iteration section (it had none)
All checks were successful
CI / Native — linux (pull_request) Successful in 33m29s
CI / WASM — Web (pull_request) Successful in 29m48s
CI / Formatting (pull_request) Successful in 54s
8eafb77377
`decoder-loop.md` has had `## Each iteration` since 2026-09-04, ending in

  7. Commit, `push-work`, open the PR, label the issue `state/needs-human`,
     and stop.

`port-loop.md` has never had that section at all. It states the rules -- "you
cannot close your own work", "you move an item to state/needs-human", work
reaches main "through pull requests" -- but nowhere gives the STEPS that carry
them out. The Port agent was told the rule and never the procedure.

Two steps were missing entirely, and both are Phase 7 check items:

  * READ YOUR NOTIFICATIONS first. They are polled and nothing pushes them, so
    an agent that skips this never receives anything addressed to it -- and the
    symptom is silence, not an error. That is GITEA-SETUP.md Phase 7 check 1.
  * OPEN THE PR AND SET THE LABEL. That is Phase 7 check 2.

The second carries a trap worth naming in the brief rather than in a runbook:
`docker/port/bin/push-work` ONLY PUSHES. Verified by reading it -- no /pulls
call, no `Closes #`, no label; its refusals (no main, no force-push) are
intact. `propose-work`, which would do all three, is still unbuilt --
GITEA-SETUP.md's own words are "the other two thirds being manual is how they
get skipped". The capability is there (`pull_request_write` and `issue_write`
are both in the pinned MCP tool set), so this is an instruction gap, not a
permissions one.

Written to mirror the Decoder's shape while using the Port's own vocabulary --
a gate is an artifact, verify against captures rather than our renderer, state
the expected number first, `authored/` entries carry a `why`, never an invented
number where a measured one is pending.

Found by the Pi agent while answering a Phase 7 readiness question. My own
check had been decoder-only, which is why the asymmetry survived it.

Refs #11

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fabi merged commit 4ca0b8ec85 into main 2026-09-10 17:09:42 +00:00
Sign in to join this conversation.