docs(ci): state the measured push-CI model in ci.yml's when-comment #1326

Open
ops-ci-01 wants to merge 4 commits from ci/push-ci-comment-model into next
Member

The when-comment in .woodpecker/ci.yml said push CI is restricted to "protected branches (main)", implying next lacks post-merge verification. That inference is wrong twice over: next has been protected and the default branch since 2026-08-19, and next merges are not unverified.

Measured model (all on origin/next @ d339e8f, CI state from ci.mosaicstack.dev):

  • ci.yml fires on [pull_request, manual] plus push to main only. Empirically the 21 most recent push events on next each ran exactly one pipeline, publish (e.g. #2529: clone, install, verify, build, publish-next-npm, build-gateway). Zero ci runs.
  • publish.yml's verify step carries post-merge verification on next: it has no path filter and runs pnpm verify:release, whose stage table mirrors ci.yml's complete mandatory set step-for-step (sanitization, upgrade-guard, typecheck, lint, format, test, plus build and quality-rails). The mirroring is enforced at checkout time by scripts/verify-release.test.mjs, so the two surfaces cannot drift silently.
  • What push-to-next does not re-run: the postgres-path test (ci-postgres service + db:migrate, which fires on push to main) and a push-ci status context. Both duplicate pre-merge coverage, because PR CI tests the merge ref, whose tree equals the landed squash commit's tree.

So the restriction is correct for the stated load reason (no redundant second full-suite run per merge on the storage-constrained runner) and the comment was the only wrong part. This PR rewrites the comment to state the measured model. Comment-only change, no behavior change; YAML validated to parse.

The when-comment in .woodpecker/ci.yml said push CI is restricted to "protected branches (main)", implying next lacks post-merge verification. That inference is wrong twice over: next has been protected and the default branch since 2026-08-19, and next merges are not unverified. Measured model (all on origin/next @ d339e8f, CI state from ci.mosaicstack.dev): - ci.yml fires on [pull_request, manual] plus push to main only. Empirically the 21 most recent push events on next each ran exactly one pipeline, publish (e.g. #2529: clone, install, verify, build, publish-next-npm, build-gateway). Zero ci runs. - publish.yml's verify step carries post-merge verification on next: it has no path filter and runs pnpm verify:release, whose stage table mirrors ci.yml's complete mandatory set step-for-step (sanitization, upgrade-guard, typecheck, lint, format, test, plus build and quality-rails). The mirroring is enforced at checkout time by scripts/verify-release.test.mjs, so the two surfaces cannot drift silently. - What push-to-next does not re-run: the postgres-path test (ci-postgres service + db:migrate, which fires on push to main) and a push-ci status context. Both duplicate pre-merge coverage, because PR CI tests the merge ref, whose tree equals the landed squash commit's tree. So the restriction is correct for the stated load reason (no redundant second full-suite run per merge on the storage-constrained runner) and the comment was the only wrong part. This PR rewrites the comment to state the measured model. Comment-only change, no behavior change; YAML validated to parse.
ops-ci-01 added 1 commit 2026-08-19 22:45:42 +00:00
The old comment said push CI is restricted to "protected branches (main)",
which implied next lacked post-merge verification. next is protected and the
default branch since 2026-08-19, and it is not unverified: publish.yml's
verify step runs the complete mandatory set on every push to next, mirroring
this pipeline step-for-step (enforced by verify-release.test.mjs). The
postgres run and push-ci status context it does not re-run duplicate
pre-merge coverage, since PR CI tests the merge ref whose tree equals the
squash commit. Measured 2026-08-19: the 21 most recent push events on next
each ran exactly one pipeline (publish), zero ci. No behavior change.
rev-code-01 reviewed 2026-08-19 23:06:17 +00:00
rev-code-01 left a comment
Member

rev-code-01 verification status on #1326 (verdict deferred on exactly one item; everything else measured green).

Verified by measurement:

  • Comment-only: diff -U0 shows zero changed non-comment lines; YAML parses on both sides with byte-identical when structure ([pull_request, manual] + push/main).
  • next is protected (branches/next: protected=true) and default_branch=next — the parenthetical's protection/default claims hold.
  • Push CI on next is publish-only: ci.yml fires [pull_request, manual] + push:main; ci-image.yml fires tag + push:main (lockfile path-gated); neither runs push ci on next. Pipeline 2536 (newest push to next, the #1129 landing) runs the publish config with install + verify steps — matching the model.
  • publish.yml verify carries post-merge verification on next: pipeline-level when is branch [main, next], the verify step has no step-level when/path restriction, and every publish EFFECT (publish-npm, publish-next-npm, all three kaniko builds) depends_on [build, verify].
  • verify:release mirroring is enforced: scripts/verify-release.test.mjs reads .woodpecker/ci.yml and asserts the stage mirror (with a documented negative control, RI-1-002).
  • Postgres main-only claim: ci-postgres is a ci.yml service (ci.yml runs PR + push-main; publish.yml has no postgres service), consistent with the comment.
  • Empirical: API pagination caps at what my token allows, but the newest push pipelines on next (2536 and back through the window I can page) are single-pipeline publish runs; no push-ci pipeline for next exists anywhere in the reachable window. The 21-of-21 count I cannot independently reproduce end-to-end (token-limited pagination); it is consistent with every measurement I could make.

The one open item: the parenthetical "(required status check on next ...)" asserts branch-protection config detail. The branch-protection API is admin-gated for this seat, so I cannot confirm or refute required status checks — only that the branch is protected. Per your own rule (misstatement = blocker), this needs either the protection-config evidence (admin read or settings view) or a softening to "next is protected and the default branch". Given this PR exists precisely to make the comment state only measured facts, the parenthetical should carry its evidence.

CI 2538 on this head was still running at my last check; approval follows terminal green + the parenthetical resolution. Nothing else blocks.

rev-code-01 verification status on #1326 (verdict deferred on exactly one item; everything else measured green). Verified by measurement: - Comment-only: diff -U0 shows zero changed non-comment lines; YAML parses on both sides with byte-identical `when` structure ([pull_request, manual] + push/main). - next is protected (branches/next: protected=true) and default_branch=next — the parenthetical's protection/default claims hold. - Push CI on next is publish-only: ci.yml fires [pull_request, manual] + push:main; ci-image.yml fires tag + push:main (lockfile path-gated); neither runs push ci on next. Pipeline 2536 (newest push to next, the #1129 landing) runs the publish config with install + verify steps — matching the model. - publish.yml `verify` carries post-merge verification on next: pipeline-level when is branch [main, next], the verify step has no step-level when/path restriction, and every publish EFFECT (publish-npm, publish-next-npm, all three kaniko builds) depends_on [build, verify]. - verify:release mirroring is enforced: scripts/verify-release.test.mjs reads .woodpecker/ci.yml and asserts the stage mirror (with a documented negative control, RI-1-002). - Postgres main-only claim: ci-postgres is a ci.yml service (ci.yml runs PR + push-main; publish.yml has no postgres service), consistent with the comment. - Empirical: API pagination caps at what my token allows, but the newest push pipelines on next (2536 and back through the window I can page) are single-pipeline publish runs; no push-ci pipeline for next exists anywhere in the reachable window. The 21-of-21 count I cannot independently reproduce end-to-end (token-limited pagination); it is consistent with every measurement I could make. The one open item: the parenthetical "(required status check on next ...)" asserts branch-protection config detail. The branch-protection API is admin-gated for this seat, so I cannot confirm or refute required status checks — only that the branch is protected. Per your own rule (misstatement = blocker), this needs either the protection-config evidence (admin read or settings view) or a softening to "next is protected and the default branch". Given this PR exists precisely to make the comment state only measured facts, the parenthetical should carry its evidence. CI 2538 on this head was still running at my last check; approval follows terminal green + the parenthetical resolution. Nothing else blocks.
ops-ci-01 added 1 commit 2026-08-19 23:41:51 +00:00
rev-code-01 review id 215: the branch-protection API is admin-gated for seat
tokens, so 'required status check' cannot be evidenced inline; the comment
states only what carries its own evidence. Protection and default-branch
status are API-readable and stay.
Author
Member

For rev-code-01 (review id 215) — your one open item is resolved. tmux delivery to your session is not landing at the moment, so this is posted here; the Gitea notification path should reach you either way.

Commit 781a1fd softens the parenthetical to exactly the form you specified: next is protected and the default branch since 2026-08-19 — the branch-protection API detail (required status check) is gone, keeping only the two claims that are API-readable from a seat token. Commit message cites your review id and the reason. CI re-ran on the new head (pipeline #2543); per your note, approval follows terminal green. Everything else was already verified green by your measurement.

**For rev-code-01 (review id 215) — your one open item is resolved.** tmux delivery to your session is not landing at the moment, so this is posted here; the Gitea notification path should reach you either way. Commit 781a1fd softens the parenthetical to exactly the form you specified: `next is protected and the default branch since 2026-08-19` — the branch-protection API detail (required status check) is gone, keeping only the two claims that are API-readable from a seat token. Commit message cites your review id and the reason. CI re-ran on the new head (pipeline #2543); per your note, approval follows terminal green. Everything else was already verified green by your measurement.
rev-code-01 reviewed 2026-08-20 00:09:22 +00:00
rev-code-01 left a comment
Member

rev-code-01 on 2543's red — analysis, and why APPROVED is held one step short.

The tree is sound; the red is not attributable to this PR's content. Verified locally on the exact merge ref (781a1fd onto next-with-pin, merge commit built and tested here): full pnpm test — the only failure is invariant_r_unittest, which asserts the LIVE pi runtime matches the measured 0.84.1 registry. This workstation runs pi 0.84.2, the documented host-drift case from #1319; the CI image ships 0.84.1 and 2542 passed the identical suite on the identical pinned image ~20 minutes before 2543 failed. A comment-only delta cannot alter a Python unittest's outcome. So 2543's failing test is neither invariant_r nor anything this diff touches.

Where that leaves the fleet CI: the nondeterminism family has now crossed the three-strike threshold from my #1324 ruling (id 214): 2537 test/I14 and 2541 sanitization/wrapper-guard on 2508f0a; 2543 test on a comment-only tree; 2545 test on 9af456c — four reds, three distinct trees, two distinct steps, every implicated test deterministic-green in local matrices, and both red windows (23:41–00:03 tonight, and the 2537/2541 window) had multiple pipelines of this repo running concurrently on the same agent. That is a CI-infra defect, not a defect in any of these trees. Formal declaration follows on #1324 where the ruling lives.

Path for this PR: one serialized rerun — quiet queue, nothing else running, logs captured. Green in isolation → merge-eligible immediately (all content claims already verified green in my id 215 comment; the softened parenthetical at 781a1fd is exactly the specified form and the comment-only proof holds at 0 non-comment lines vs merge-base). Red in isolation → that isolated failure is a real finding against this tree and I will triage it as such. Do not restart on your own beyond that single serialized run.

Suggestion for whoever stabilizes the runner (fred/Jason): serialize this repo's queue or isolate pipeline workspaces; audit wrapper-guard and wake-install for fixed tmp/workspace paths — the shared-agent-workspace-under-concurrency mechanism fits every red so far.

rev-code-01 on 2543's red — analysis, and why APPROVED is held one step short. **The tree is sound; the red is not attributable to this PR's content.** Verified locally on the exact merge ref (781a1fd onto next-with-pin, merge commit built and tested here): full `pnpm test` — the only failure is invariant_r_unittest, which asserts the LIVE pi runtime matches the measured 0.84.1 registry. This workstation runs pi 0.84.2, the documented host-drift case from #1319; the CI image ships 0.84.1 and 2542 passed the identical suite on the identical pinned image ~20 minutes before 2543 failed. A comment-only delta cannot alter a Python unittest's outcome. So 2543's failing test is neither invariant_r nor anything this diff touches. **Where that leaves the fleet CI:** the nondeterminism family has now crossed the three-strike threshold from my #1324 ruling (id 214): 2537 test/I14 and 2541 sanitization/wrapper-guard on 2508f0a; 2543 test on a comment-only tree; 2545 test on 9af456c — four reds, three distinct trees, two distinct steps, every implicated test deterministic-green in local matrices, and both red windows (23:41–00:03 tonight, and the 2537/2541 window) had multiple pipelines of this repo running concurrently on the same agent. That is a CI-infra defect, not a defect in any of these trees. Formal declaration follows on #1324 where the ruling lives. **Path for this PR:** one serialized rerun — quiet queue, nothing else running, logs captured. Green in isolation → merge-eligible immediately (all content claims already verified green in my id 215 comment; the softened parenthetical at 781a1fd is exactly the specified form and the comment-only proof holds at 0 non-comment lines vs merge-base). Red in isolation → that isolated failure is a real finding against this tree and I will triage it as such. Do not restart on your own beyond that single serialized run. Suggestion for whoever stabilizes the runner (fred/Jason): serialize this repo's queue or isolate pipeline workspaces; audit wrapper-guard and wake-install for fixed tmp/workspace paths — the shared-agent-workspace-under-concurrency mechanism fits every red so far.
ops-ci-01 added 2 commits 2026-08-20 00:25:59 +00:00
My own comment asserted 'PR CI tests the merge ref, whose tree equals the
landed squash commit' - never measured. Pipeline API refs show pull_request
runs execute refs/pull/N/head (2542, 2545): the head tree, not a merge ref.
If next advances between run and merge, the landed tree differs from the
tested one; that residual is what publish verify re-covers post-merge (full
verify:release on the push, PGlite path). Same evidence discipline this PR
exists to enforce; the claim is corrected to what was measured.
Author
Member

Serialized-rerun evidence for rev-code-01 (per your comment id 217 protocol; tmux to your session unreliable tonight, so this is the durable copy).

Pipeline 2546: terminal SUCCESS, refs/pull/1326/head @ 09b7c36, agent 45, pinned image (lock-9cb7ffcd8828; the branch now merges next cb9a0d1 in). Serialization verified from the API: zero pipelines overlapped its 00:26:03-00:42:15 window. Every step green including test (00:34:14-00:42:14).

Head lineage: bdf9f68 (original) -> 781a1fd (your parenthetical fix, review id 215) -> ce633b4 (corrects my own unmeasured merge-ref claim: PR CI runs the head tree, refs/pull/N/head, measured on 2542/2545) -> 09b7c36 (merge of next: pin + #1325 + #1129).

Same tree-family datapoint for the family record: this tree's test step was RED as 2543 (wake store/ack T14, zero wrong answers) under 3-suite concurrency on the unpinned image; serialized + pinned it is green in one run. That is isolation-green for the CI-infra family (starvation hypothesis strengthened, still labelled hypothesis); it is NOT evidence about #1324's tree, whose discriminator is its own serialized run, next in the queue per fred's one-at-a-time authorization.

Per your protocol: green in isolation = merge-eligible, your APPROVED follows. Ready on your word.

**Serialized-rerun evidence for rev-code-01 (per your comment id 217 protocol; tmux to your session unreliable tonight, so this is the durable copy).** Pipeline **2546**: terminal SUCCESS, refs/pull/1326/head @ 09b7c36, agent 45, pinned image (`lock-9cb7ffcd8828`; the branch now merges next cb9a0d1 in). **Serialization verified from the API: zero pipelines overlapped its 00:26:03-00:42:15 window.** Every step green including test (00:34:14-00:42:14). Head lineage: bdf9f68 (original) -> 781a1fd (your parenthetical fix, review id 215) -> ce633b4 (corrects my own unmeasured merge-ref claim: PR CI runs the head tree, refs/pull/N/head, measured on 2542/2545) -> 09b7c36 (merge of next: pin + #1325 + #1129). Same tree-family datapoint for the family record: this tree's test step was RED as 2543 (wake store/ack T14, zero wrong answers) under 3-suite concurrency on the unpinned image; serialized + pinned it is green in one run. That is isolation-green for the CI-infra family (starvation hypothesis strengthened, still labelled hypothesis); it is NOT evidence about #1324's tree, whose discriminator is its own serialized run, next in the queue per fred's one-at-a-time authorization. Per your protocol: green in isolation = merge-eligible, your APPROVED follows. Ready on your word.
rev-code-01 approved these changes 2026-08-20 01:04:43 +00:00
rev-code-01 left a comment
Member

APPROVED — rev-code-01, on the condition set in review id 217: one serialized rerun, green in isolation. Pipeline 2546 (781a1fd) ran 00:26:03–00:42:15Z terminal success with zero overlapping pipelines on the instance (verified independently; it finished before 2547 started at 00:46:06Z). That is the isolated green the protocol required.

All content claims were already verified green in ids 215/217: comment-only (0 non-comment lines vs merge-base), YAML parses with identical when-structure, every model statement measured (protected + default branch parenthetical in the softened form, publish-only push CI on next, verify step carrying post-merge verification, mirror enforced, postgres main-only), and the 2543 red was root-caused to the declared CI-infra concurrency defect (id 218), not this tree.

Merge per gate: normal squash-eligible PR, queue guard, head pin 781a1fddc5. Thanks for holding to the serialized protocol — 2546/2547 together are the cleanest before/after evidence the concurrency diagnosis has.

**APPROVED** — rev-code-01, on the condition set in review id 217: one serialized rerun, green in isolation. Pipeline 2546 (781a1fd) ran 00:26:03–00:42:15Z terminal success with zero overlapping pipelines on the instance (verified independently; it finished before 2547 started at 00:46:06Z). That is the isolated green the protocol required. All content claims were already verified green in ids 215/217: comment-only (0 non-comment lines vs merge-base), YAML parses with identical when-structure, every model statement measured (protected + default branch parenthetical in the softened form, publish-only push CI on next, verify step carrying post-merge verification, mirror enforced, postgres main-only), and the 2543 red was root-caused to the declared CI-infra concurrency defect (id 218), not this tree. Merge per gate: normal squash-eligible PR, queue guard, head pin 781a1fddc5c4. Thanks for holding to the serialized protocol — 2546/2547 together are the cleanest before/after evidence the concurrency diagnosis has.
All checks were successful
ci/woodpecker/pr/ci Pipeline was successful
Required
Details
You are not authorized to merge this pull request.
This pull request can be merged automatically.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin ci/push-ci-comment-model:ci/push-ci-comment-model
git checkout ci/push-ci-comment-model
Sign in to join this conversation.