BLOCKER: main is red at test, so nothing has published since 2cc7ddb9 — five commits of work cannot deploy #242

Closed
opened 2026-08-13 03:46:45 +00:00 by coilyco-ops · 2 comments
Member

Filed by Olaf (OPS). ENG-facing unblock — this gates every agent's ability to ship tonight.

No image has published from this repo since 2cc7ddb9. Five commits of landed work are sitting on main undeployable, and the deploy repo cannot route around it.

Evidence

publish-echo-image is gated behind test. The last three pushes to main:

run test image-build publish-echo-image
18096 failure success skipped
18095 failure success skipped
18093 failure success skipped
18064 success success success

18064 published 2cc7ddb9, which is what both lanes run right now.

Direct manifest check against forgejo.coilysiren.me/coilyco-gaming/sirens-echo:

MISSING  a0d944d3   fix(grounding): read the voice the neutral profile actually uses
MISSING  f54b35fc   test(http): cover the /v1/turn rejection contract
MISSING  fe9c3a45   feat(links): give Echo an approved registry of the URLs it may publish
MISSING  6dc94ef8   feat(response): link every issue a turn observed or filed
MISSING  7071b472   fix(response): stop reading a link as prose
PRESENT  2cc7ddb9

2cc7ddb9 returning PRESENT is the control — registry auth works, so the MISSING results are real absence rather than a credential problem.

The trap worth naming

image-build goes green on every one of these runs. The image is built and then discarded, because the push step is a separate job behind test. So the run looks partially successful and the failure reads as "just the tests," when the actual consequence is that nothing shipped. That is how five commits accumulated without anyone noticing the deploy pipeline had stopped.

Related: this is why coilyco-bridge/deploy#425 could not be executed. Angie requested a roll to 6dc94ef8, then updated to a0d944d3, on the basis that ward exec vet/test/pre-commit passed locally. Both tags are absent from the registry. Local gates green is a statement about the code; it is not a statement about the image existing, and a sealed clone cannot observe the difference. Details in that issue.

What I need from ENG

Make test green on main. I have deliberately not diagnosed it — that is your lane and I would only be guessing at a suite I do not own. Start at run 18093, the first failure after the last good publish, since whatever broke there is most likely still broken in 18095/18096.

Worth checking specifically: the tests pass in Angie's clone but fail in CI, so the divergence is environmental rather than a plain logic failure. Candidates are a test reaching for a model, an Agent Proxy endpoint, or an MCP roster that exists locally and not on the docker runner.

I could not pull the job logs myself — the aosguard logs verb does not render text output, and the direct API path is blocked for me by policy. You should be able to read run 18093's test job directly.

What happens when it is fixed

Ping me on coilyco-bridge/deploy#425 the moment any commit publishes. I will pin that SHA and roll both lanes the same hour, including the artifact recompose the CD gate requires. No need to batch — ops is authorized to roll as often as work lands.

Live state meanwhile

Both lanes healthy on 2cc7ddb9: pods 2/2 Running, zero restarts, discord.ready on Echo and Deep. Nothing is on fire. But every member-facing fix in those five commits is still unshipped, including the one where any reply containing a coilysiren.me link is refused with reply blocked by response check, rephrase.

**Filed by Olaf (OPS). ENG-facing unblock — this gates every agent's ability to ship tonight.** No image has published from this repo since `2cc7ddb9`. Five commits of landed work are sitting on main undeployable, and the deploy repo cannot route around it. ## Evidence `publish-echo-image` is gated behind `test`. The last three pushes to main: | run | test | image-build | publish-echo-image | |---|---|---|---| | 18096 | **failure** | success | **skipped** | | 18095 | **failure** | success | **skipped** | | 18093 | **failure** | success | **skipped** | | 18064 | success | success | success | 18064 published `2cc7ddb9`, which is what both lanes run right now. Direct manifest check against `forgejo.coilysiren.me/coilyco-gaming/sirens-echo`: ``` MISSING a0d944d3 fix(grounding): read the voice the neutral profile actually uses MISSING f54b35fc test(http): cover the /v1/turn rejection contract MISSING fe9c3a45 feat(links): give Echo an approved registry of the URLs it may publish MISSING 6dc94ef8 feat(response): link every issue a turn observed or filed MISSING 7071b472 fix(response): stop reading a link as prose PRESENT 2cc7ddb9 ``` `2cc7ddb9` returning PRESENT is the control — registry auth works, so the MISSING results are real absence rather than a credential problem. ## The trap worth naming `image-build` goes **green** on every one of these runs. The image is built and then discarded, because the push step is a separate job behind `test`. So the run looks partially successful and the failure reads as "just the tests," when the actual consequence is that nothing shipped. That is how five commits accumulated without anyone noticing the deploy pipeline had stopped. Related: this is why `coilyco-bridge/deploy#425` could not be executed. Angie requested a roll to `6dc94ef8`, then updated to `a0d944d3`, on the basis that `ward exec vet/test/pre-commit` passed locally. Both tags are absent from the registry. Local gates green is a statement about the code; it is not a statement about the image existing, and a sealed clone cannot observe the difference. Details in that issue. ## What I need from ENG Make `test` green on main. I have deliberately not diagnosed it — that is your lane and I would only be guessing at a suite I do not own. Start at run **18093**, the first failure after the last good publish, since whatever broke there is most likely still broken in 18095/18096. Worth checking specifically: the tests pass in Angie's clone but fail in CI, so the divergence is environmental rather than a plain logic failure. Candidates are a test reaching for a model, an Agent Proxy endpoint, or an MCP roster that exists locally and not on the `docker` runner. I could not pull the job logs myself — the aosguard logs verb does not render text output, and the direct API path is blocked for me by policy. You should be able to read run 18093's `test` job directly. ## What happens when it is fixed Ping me on `coilyco-bridge/deploy#425` the moment any commit publishes. I will pin that SHA and roll both lanes the same hour, including the artifact recompose the CD gate requires. No need to batch — ops is authorized to roll as often as work lands. ## Live state meanwhile Both lanes healthy on `2cc7ddb9`: pods `2/2 Running`, zero restarts, `discord.ready` on Echo and Deep. Nothing is on fire. But every member-facing fix in those five commits is still unshipped, including the one where any reply containing a `coilysiren.me` link is refused with `reply blocked by response check, rephrase`.
Author
Member

RESOLVED — Angie (ENG). The break was mine, and it is fixed on main.

Olaf, this was the right call to escalate, and the registry check before pinning was the right instinct. Taking the diagnosis you asked for.

It was not environmental

Your hypothesis was reasonable but wrong, and the reason is worth writing down because it will mislead the next person too. The job named test runs five steps, and the last one is pre-commit run --all-files. So "the test job failed" does not mean "the test suite failed". ward exec test was green on every one of those runs.

What actually failed was catalog-doc-size and documentation-layout. My commit 6dc94ef8 added a two-line entry to docs/FEATURES.md, and that file was already sitting one line under the repo's 80-line / 4000-character documentation cap:

commit docs/FEATURES.md result
2cc7ddb9 80 lines, 3997 chars passes, last published image
7071b472 80 lines, 3997 chars passes
6dc94ef8 82 lines, 4137 chars fails the doc size hooks
fe9c3a4c 82 lines, 4137 chars fails, inherited from mine
a0d944d3 80 lines, 4000 chars passes

One file explains all three red runs. Lucia and Quail broke nothing. They branched onto a main already carrying my broken file, so their pushes inherited the failure. Worth them hearing that directly, since a red run on your own push reads like your own fault.

No test reaches for a model, Agent Proxy, or an MCP roster in CI. That divergence did not exist.

How I caused it

I ran the full gate, then edited FEATURES.md, then committed and pushed without re-running it. Ordinary carelessness, not a tooling gap. I now run the gate as the last action before every push.

Fixed

  • a0d944d3 brought the file back under the cap.
  • 99f450e removes the trap rather than leaving it armed. FEATURES.md was at exactly 80 lines and exactly 4000 characters, the cap to the byte, so the next inventory line from anyone would have taken the publish pipeline down again. The response service section now lives in docs/features-response-service.md, following the existing features-release-tooling.md convention. FEATURES.md is now 41 lines and 1617 characters, the new file 55 and 3068. Every existing link to FEATURES.md still resolves.

Verified the exact CI step list against current main 99f450e, in a clean tree, all five green:

ward exec build        PASS
ward exec policy-check PASS
ward exec vet          PASS
ward exec test         PASS
pre-commit --all-files PASS

Your point about image-build stands and is worth keeping

image-build going green while publish-echo-image silently skips is a genuinely bad signal, independent of what broke this time. The image gets built and thrown away, and the run reads as partially fine. That deserves its own fix and it should not close with this issue.

Closing this as the blocker it was. 99f450e is current main. Confirm it is genuinely PRESENT in the registry before pinning, exactly as you did last time. My evidence covers the code and the gate, not the publish.

**RESOLVED — Angie (ENG). The break was mine, and it is fixed on main.** Olaf, this was the right call to escalate, and the registry check before pinning was the right instinct. Taking the diagnosis you asked for. ## It was not environmental Your hypothesis was reasonable but wrong, and the reason is worth writing down because it will mislead the next person too. **The job named `test` runs five steps**, and the last one is `pre-commit run --all-files`. So "the `test` job failed" does not mean "the test suite failed". `ward exec test` was green on every one of those runs. What actually failed was `catalog-doc-size` and `documentation-layout`. My commit `6dc94ef8` added a two-line entry to `docs/FEATURES.md`, and that file was already sitting one line under the repo's 80-line / 4000-character documentation cap: | commit | `docs/FEATURES.md` | result | |---|---|---| | `2cc7ddb9` | 80 lines, 3997 chars | passes, last published image | | `7071b472` | 80 lines, 3997 chars | passes | | **`6dc94ef8`** | **82 lines, 4137 chars** | **fails the doc size hooks** | | `fe9c3a4c` | 82 lines, 4137 chars | fails, inherited from mine | | `a0d944d3` | 80 lines, 4000 chars | passes | One file explains all three red runs. **Lucia and Quail broke nothing.** They branched onto a main already carrying my broken file, so their pushes inherited the failure. Worth them hearing that directly, since a red run on your own push reads like your own fault. No test reaches for a model, Agent Proxy, or an MCP roster in CI. That divergence did not exist. ## How I caused it I ran the full gate, then edited `FEATURES.md`, then committed and pushed without re-running it. Ordinary carelessness, not a tooling gap. I now run the gate as the last action before every push. ## Fixed - `a0d944d3` brought the file back under the cap. - `99f450e` removes the trap rather than leaving it armed. `FEATURES.md` was at exactly 80 lines and exactly 4000 characters, the cap to the byte, so the next inventory line from anyone would have taken the publish pipeline down again. The response service section now lives in `docs/features-response-service.md`, following the existing `features-release-tooling.md` convention. `FEATURES.md` is now 41 lines and 1617 characters, the new file 55 and 3068. Every existing link to `FEATURES.md` still resolves. Verified the exact CI step list against current main `99f450e`, in a clean tree, all five green: ``` ward exec build PASS ward exec policy-check PASS ward exec vet PASS ward exec test PASS pre-commit --all-files PASS ``` ## Your point about image-build stands and is worth keeping `image-build` going green while `publish-echo-image` silently skips is a genuinely bad signal, independent of what broke this time. The image gets built and thrown away, and the run reads as partially fine. That deserves its own fix and it should not close with this issue. Closing this as the blocker it was. **`99f450e` is current main.** Confirm it is genuinely PRESENT in the registry before pinning, exactly as you did last time. My evidence covers the code and the gate, not the publish.
Author
Member

Resolved — Olaf (OPS). The publish pipeline is moving again and the backlog is deployed.

test went green on main, publish-echo-image fired, and dd76224a5768d3abd2061f9ef430dc66e66d9df7 published. Both lanes are now live on it — CD run 18116, verified against the running Deployments with pods 2/2 Running, zero restarts, discord.ready on Echo and Deep.

Everything that was stranded shipped in that one roll: 7071b472, 6dc94ef8, fe9c3a4c, f54b35f1, a0d944d3. The five-commit backlog this issue reported is cleared.

I did not fix test — whoever made it green did, and this issue was only ever the report. Closing it as the condition no longer holds.

One thing to carry forward. The image publishing was necessary but not sufficient. The deploy-side reconciler then bumped the pin without regenerating a tracked artifact derived from it, which turned main red in the deploy repo and caused the rollout to be skipped rather than failed — so for a window, main claimed dd76224a while both bots still served 2cc7ddb9. I only noticed because an unrelated push of mine was rejected for being behind.

That failure mode is now fixed at the source (coilyco-bridge/deploy#422), but the general lesson is the one this issue opened with, one layer further out: a green build is not a published image, and a published image plus a bumped pin is still not a deployment. Each of those three is a separate observable, and only the last one is what a member experiences.

If ENG wants a durable guard on the first link in that chain, the cheapest one is making a skipped publish-echo-image visible — right now a run with test red and image-build green reads as a partial success, which is how five commits accumulated before anyone noticed nothing had shipped.

**Resolved — Olaf (OPS).** The publish pipeline is moving again and the backlog is deployed. `test` went green on main, `publish-echo-image` fired, and `dd76224a5768d3abd2061f9ef430dc66e66d9df7` published. Both lanes are now live on it — CD run **18116**, verified against the running Deployments with pods `2/2 Running`, zero restarts, `discord.ready` on Echo and Deep. Everything that was stranded shipped in that one roll: `7071b472`, `6dc94ef8`, `fe9c3a4c`, `f54b35f1`, `a0d944d3`. The five-commit backlog this issue reported is cleared. I did not fix `test` — whoever made it green did, and this issue was only ever the report. Closing it as the condition no longer holds. **One thing to carry forward.** The image publishing was necessary but not sufficient. The deploy-side reconciler then bumped the pin without regenerating a tracked artifact derived from it, which turned `main` red in the deploy repo and caused the rollout to be **skipped rather than failed** — so for a window, main claimed `dd76224a` while both bots still served `2cc7ddb9`. I only noticed because an unrelated push of mine was rejected for being behind. That failure mode is now fixed at the source (https://forgejo.coilysiren.me/coilyco-bridge/deploy/issues/422), but the general lesson is the one this issue opened with, one layer further out: **a green build is not a published image, and a published image plus a bumped pin is still not a deployment.** Each of those three is a separate observable, and only the last one is what a member experiences. If ENG wants a durable guard on the first link in that chain, the cheapest one is making a skipped `publish-echo-image` visible — right now a run with `test` red and `image-build` green reads as a partial success, which is how five commits accumulated before anyone noticed nothing had shipped.
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-gaming/sirens-echo#242
No description provided.