Restore an explicit green test gate before ward releases #1225

Closed
opened 2026-07-14 02:19:17 +00:00 by coilyco-ops · 2 comments
Member

Problem:
ward currently has .forgejo/workflows/test.yml and .github/workflows/test.yml as PR-only. The current main/release path relies on .forgejo/workflows/promote.yml to run go vet, go test, and golangci-lint, then fast-forward release; .forgejo/workflows/release.yml no longer has its own explicit test job or needs: test dependency and assumes the promoted SHA was already vouched.

That makes the release pipeline's safety property indirect. If promotion is skipped, manually dispatched against the wrong ref, silently misconfigured, or otherwise bypassed, the tag/publish jobs can proceed without an in-pipeline green test dependency. This is critical because ward PRs regularly hit merge conflicts and bad merge queues, so main needs a hard gate before release artifacts move.

Observed on main, 2026-07-14:

  • test.yml is pull_request only.
  • promote.yml runs vet/test/lint on main, then pushes HEAD:release.
  • release.yml runs on release pushes and documents that it deliberately does not re-run the checks.

Done when:

  • It is mechanically impossible for ward's tag/create-release/publish jobs to run for a SHA unless go vet ./..., go test ./..., and golangci-lint run ./... passed for that exact SHA.
  • The gate is explicit in the workflow graph, not only implicit in comments or a separate branch-promotion convention.
  • The fix preserves the no-overlap release queue behavior that ward#1117 introduced, or replaces it with an equally explicit queued design.
  • The workflow mirror contract remains correct for .github/workflows/test.yml and .forgejo/workflows/test.yml.
  • docs/release.md and any workflow comments are updated so future agents do not remove the gate again.
  • Validation runs through ward's workflow lint/mirror checks and the normal Go test/lint path.
Problem: `ward` currently has `.forgejo/workflows/test.yml` and `.github/workflows/test.yml` as PR-only. The current main/release path relies on `.forgejo/workflows/promote.yml` to run `go vet`, `go test`, and `golangci-lint`, then fast-forward `release`; `.forgejo/workflows/release.yml` no longer has its own explicit test job or `needs: test` dependency and assumes the promoted SHA was already vouched. That makes the release pipeline's safety property indirect. If promotion is skipped, manually dispatched against the wrong ref, silently misconfigured, or otherwise bypassed, the tag/publish jobs can proceed without an in-pipeline green test dependency. This is critical because ward PRs regularly hit merge conflicts and bad merge queues, so main needs a hard gate before release artifacts move. Observed on main, 2026-07-14: - `test.yml` is `pull_request` only. - `promote.yml` runs vet/test/lint on `main`, then pushes `HEAD:release`. - `release.yml` runs on `release` pushes and documents that it deliberately does not re-run the checks. Done when: - It is mechanically impossible for ward's tag/create-release/publish jobs to run for a SHA unless `go vet ./...`, `go test ./...`, and `golangci-lint run ./...` passed for that exact SHA. - The gate is explicit in the workflow graph, not only implicit in comments or a separate branch-promotion convention. - The fix preserves the no-overlap release queue behavior that ward#1117 introduced, or replaces it with an equally explicit queued design. - The workflow mirror contract remains correct for `.github/workflows/test.yml` and `.forgejo/workflows/test.yml`. - `docs/release.md` and any workflow comments are updated so future agents do not remove the gate again. - Validation runs through ward's workflow lint/mirror checks and the normal Go test/lint path.
Author
Member

WARD-RESERVATION: held 🔒

reservation details

Holder: container engineer-codex-ward-1225 on host KAI-DESKTOP-TOWER.

Reserved by ward agent --harness codex (reserved 2026-07-14T02:19:43Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (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/ward#1225 · branch issue-1225 · harness codex · workflow pull-request-and-merge
  • Run: engineer-codex-ward-1225 · ward v0.666.0 · dispatched 2026-07-14T02:19:43Z
  • 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.666.0).

— Codex, via ward agent

<!-- ward-agent-reservation --> WARD-RESERVATION: held 🔒 <details><summary>reservation details</summary> Holder: container `engineer-codex-ward-1225` on host `KAI-DESKTOP-TOWER`. Reserved by `ward agent --harness codex` (reserved 2026-07-14T02:19:43Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (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/ward#1225` · branch `issue-1225` · harness `codex` · workflow `pull-request-and-merge` - **Run:** `engineer-codex-ward-1225` · ward `v0.666.0` · dispatched `2026-07-14T02:19:43Z` - **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.666.0). </details> </details> <!-- ward-agent-signature --> — Codex, via `ward agent`
Author
Member

WARD-OUTCOME: submitted

details

workflow: pull-request-and-merge; review summary: skipped (review gate intentionally skipped because the temporary ward default pending brokered QA)

Implementation felt mechanical. The only surprise was the docs/FEATURES.md size cap, which I backed out after the commit hook flagged it.

confidence: high
surprises: doc budget only
follow-ups: merge PR #1226 once the merge queue is ready

WARD-OUTCOME: submitted <details><summary>details</summary> workflow: pull-request-and-merge; review summary: skipped (review gate intentionally skipped because the temporary ward default pending brokered QA) Implementation felt mechanical. The only surprise was the `docs/FEATURES.md` size cap, which I backed out after the commit hook flagged it. confidence: high surprises: doc budget only follow-ups: merge PR #1226 once the merge queue is ready </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/ward#1225
No description provided.