feat(train)!: every project rides the release train #2035

Merged
sean merged 1 commit from feat/train-everywhere into trunk 2026-08-13 14:59:33 +00:00
Owner

All 21 project CRs now carry integrationMode: release — the bytey pilot graduates to the fleet. A green PR no longer merges on its own: declaring a release merges every open green change in PR order, then freezes the result. Trunk merge whitelist admits only pipeline-bot (R6); machine PRs propose instead of merging (R9).

The trap this PR also closes: a bare release integrates nothing (the train queue is built from spec.integrate/integrateAllGreen). The dashboard and MCP set neither field, so on a release-gated project they would forever re-release stale trunk while green changes wait. The release API now declares integrateAllGreen: true exactly when the project is release-gated; pipectl release --change N stays the precise instrument. Test: TestReleaseAPIDeclaresAllGreenIntakeForReleaseGatedProjects covers both directions.

Surfaces updated to tell the truth: MCP release tool description, embedded overview.md/releasing.md resources, dashboard confirm text, AGENTS.md item 6 (was "accepted but not started" — false since 08-07), RELEASING.md rule 5 (merge serialization now belongs to the Release act), RELEASE-TRAIN status header (fleet flip + R7 graduation + R10 supersession recorded).

Known risk, boarded deliberately: zelnet, zdns, zerotea have a release leg that failed on its last attempt (2026-08-07). On the train that blocks merging, not just releasing. Fix their ship leg next.

Pre-existing defect flagged, not fixed here: the checked-in pipelinedeploys CRD has a CEL rule on resolvedTarget.kubernetesImage referencing a top-level namespace the schema does not define — envtest 1.30/1.31 apiservers refuse to compile it, so the controller suite cannot run on a laptop. Green in CI; deserves its own fix.

Verification: go build/vet clean; 13 Go test packages pass locally; 129/129 guards pass — including one honest catch: the lexicon guard rejected the word "land" in my own new prose, which I corrected to "merge". Render gate covers all 21 flipped CRs.

This is the last change that lands through continuous mode. Every change after this one rides the train it builds.

All 21 project CRs now carry `integrationMode: release` — the `bytey` pilot graduates to the fleet. A green PR no longer merges on its own: **declaring a release merges every open green change in PR order, then freezes the result.** Trunk merge whitelist admits only pipeline-bot (R6); machine PRs propose instead of merging (R9). **The trap this PR also closes:** a bare release integrates nothing (the train queue is built from `spec.integrate`/`integrateAllGreen`). The dashboard and MCP set neither field, so on a release-gated project they would forever re-release stale trunk while green changes wait. The release API now declares `integrateAllGreen: true` exactly when the project is release-gated; `pipectl release --change N` stays the precise instrument. Test: `TestReleaseAPIDeclaresAllGreenIntakeForReleaseGatedProjects` covers both directions. **Surfaces updated to tell the truth:** MCP `release` tool description, embedded `overview.md`/`releasing.md` resources, dashboard confirm text, AGENTS.md item 6 (was "accepted but not started" — false since 08-07), RELEASING.md rule 5 (merge serialization now belongs to the Release act), RELEASE-TRAIN status header (fleet flip + R7 graduation + R10 supersession recorded). **Known risk, boarded deliberately:** `zelnet`, `zdns`, `zerotea` have a release leg that failed on its last attempt (2026-08-07). On the train that blocks *merging*, not just releasing. Fix their ship leg next. **Pre-existing defect flagged, not fixed here:** the checked-in pipelinedeploys CRD has a CEL rule on `resolvedTarget.kubernetesImage` referencing a top-level `namespace` the schema does not define — envtest 1.30/1.31 apiservers refuse to compile it, so the controller suite cannot run on a laptop. Green in CI; deserves its own fix. Verification: `go build`/`vet` clean; 13 Go test packages pass locally; **129/129 guards pass** — including one honest catch: the lexicon guard rejected the word "land" in my own new prose, which I corrected to "merge". Render gate covers all 21 flipped CRs. This is the last change that lands through continuous mode. Every change after this one rides the train it builds.
feat(train)!: every project rides the release train
All checks were successful
pipeline/ci CI green @ 15ee3c428b44
15ee3c428b
All 21 project CRs now carry `integrationMode: release`. The `bytey` pilot
graduates to the fleet: a pull request with green checks no longer merges on
its own. Declaring a release merges every open green change into trunk, in
pull-request order, and then freezes the result. Trunk's merge whitelist
admits only pipeline-bot (R6), and machine pull requests propose instead of
merging (R9).

The flip alone would have set a trap: the train's queue is built from
spec.integrate / spec.integrateAllGreen, so a bare release integrates
nothing. The dashboard button and the MCP release tool set neither field,
so on a release-gated project they would forever re-release a stale trunk
while green changes wait as open pull requests. The release API therefore
declares `integrateAllGreen: true` exactly when the project is
release-gated. `pipectl release --change N` remains the precise instrument,
and continuous projects (none remain, but the mode survives) are unchanged.

The MCP resource docs, the release tool description, and the dashboard
confirm text now describe the train. AGENTS.md item 6 stops calling the
direction "accepted but not started" — six phases of it have shipped and now
the whole fleet rides it. RELEASING.md rule 5 transfers merge serialization
from Forgejo to the Release act. The RELEASE-TRAIN doc's status header
records the fleet flip, the R7 pilot graduation, and R10's supersession.

Known risk, accepted deliberately: zelnet, zdns, and zerotea board with a
release leg that failed on its last attempt (2026-08-07: one version-claim
conflict, two ship-run compile failures). On the train a broken release path
blocks merging, not only releasing, so those three repos cannot merge
changes until it is fixed. The doc header records this.

The controller envtest suite does not run on this laptop: the checked-in
pipelinedeploys CRD carries a CEL rule on resolvedTarget.kubernetesImage
that references a top-level `namespace` field the schema does not define,
and the 1.30/1.31 envtest apiservers refuse to compile it. Pre-existing,
untouched by this change, green in CI. It deserves its own fix.
sean merged commit 15ee3c428b into trunk 2026-08-13 14:59:33 +00:00
Sign in to join this conversation.
No reviewers
No labels
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
sean/pipelines!2035
No description provided.