Merge gate certifies rung ① only — the push instrument on the merged tree is unwatched (rungs share no denominator) #1101
Open
opened 2026-08-07 08:11:20 +00:00 by Mos
·
1 comment
No Branch/Tag Specified
main
next
fix/1138-conditional-federation
feat/webui-p2-data-auth
fix/gateway-runner-image
feat/webui-p1-vite-skeleton
fix/break-c-hooks-and-web-image
docs/webui-fleet-claude-bridge-plan
fix/wizard-gateway-failure
fix/ci-queue-wait-no-status
fix/next-node-gate
fix/mosaic-init-rce
feat/lease-promotion-and-harness-isolation
greenfield/fomo-lin
fix/1099-pipefail-wake
fix/1099-pipefail-tests
fix/1099-pipefail-sweep
fix/framework-shell-portability
fix/1043-pane-git-identity
fix/1081-issue-close-silent-comment-failure
fix/1090-enrollment-wallclock-tolerance
feat/1082-tea-stale-token-diagnostic
fix/detect-platform-silent-128-outside-repo
feat/1050-install-state-machine-red-fixture
fix/pr-merge-message-field
feat/1051-mosaic-brain-installer
feat/1045-mosaic-cred
remediation/state
fix/1056-upgrade-rollback-control-race
fix/1019-ci-queue-timeout-harness
feat/rm-02-gate-registry
fix/rm-01-reproducible-checkout
remediation/mission-setup
fix/hygiene-inert-format-gate
fix/1019-queue-guard-stdin
feat/mos-ste-writing-standard
fix/1007-suite-hermeticity
fix/991-comment-url-scheme-normalise
feat/push-guard-null-case-verification
mos-comms-live
docs/heartbeat-framework-layering-ms-lead
feat/869-c4-version-coupling
feat/869-c2-install-ordering-guard
feat/869-c5-doctor-activation-check
feat/per-agent-gitea-identity
fix/875-belongs-case-insensitive-slug
fix/ci-queue-wait-404-branch-absent
feat/869-c1-activation-probe
feat/869-c3-broker-supervisor
fix/865-tea-cli-comment-invocation
feat/glpi-skills
fix/860-deflake-mutator-lease-gate
fix/850-detect-platform-port-normalization
fix/856-worktree-deps-preflight
fix/835-pr-review-approve-reject-comment-flag
fix/848-truthful-evidence
fix/812-pr-review-comment
fix/849-recovery-runtime-fixture-race
docs/758-ledger-m5-001-sync
feat/834-tc-server-side-doc
feat/833-constrained-recovery-command
feat/827-gate0-probe
governance/gate0-probe3-amendment
fix/795-codex-pr-diff
fix/795-ci-base-jq
fix/795-ci-base-git
feat/791-pr3-fleet-regen
feat/791-pr2-snapshot-restore
fix/807-glpi-206
fix/808-agent-send-false-sender
feat/791-upgrade-config-protection
feat/790-mosaic-yolo-claudex-pr2
feat/790-mosaic-yolo-claudex
feat/758-v1-v2-migrator
fix/766-exact-fleet-comms
test/758-reconciler-lifecycle-gates
docs/771-kbn101-db-role-split
test/758-example-profile-dispositions
feat/758-shared-role-resolution
feat/mos-logical-identity-fencing
feat/769-kbn100-unified-schema
docs/753-kbn010-threat-gate
feat/758-roster-v2-compiler
feat/756-official-discord-plugin
docs/758-fleet-config-management
fix/mos-option2-qualification-format
docs/issue-758-m0
docs/mos-option2-qualification
mos-comms
feat/tess-interaction-agent
fix/tess-docs-format
draft/mosaic-platform-prd
fix/installer-provider-gate-and-local-gateway-redis
release/mosaic-cli-0.0.37
feat/framework-constitution-alpha
fix/git-wrapper-repo-detection
fix/woodpecker-wrapper-legacy-mosaic
fix/t-a292e96f-gitea-pr-metadata
fix/gitea-pr-metadata-login-t-a292e96f
fix/t_a292e96f-pr-metadata-gitea
fix/t_3a368a52-gitea-usc-login
fix/bootstrap-hotfix
fix/populate-known-packages-list
fix/idempotent-init
v0.0.39-alpha
mosaic-v0.0.31
fed-v0.2.0-m2
fed-v0.1.0-m1
mosaic-v0.0.29
mosaic-v0.0.28
mosaic-v0.0.27
mosaic-v0.0.26
mosaic-v0.0.25
mosaic-v0.0.24
v0.2.0
v0.1.0
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1101
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Split out of #1098. #1098 conflated two separate findings and that is my filing error — it opened with a
gate gap and then became the tracking issue for a specific flaky assertion. #1100 fixes the assertion and
carries
Closes #1098, which would close the gate gap too.be-coder-06caught that on review. This issuegives the gate gap its own home so #1100 can close #1098 cleanly.
The gap
The merge gate on this estate certifies rung ① — pre-merge CI on the PR branch. It does not check
rung ③, the push instrument running on the merged tree on
main.I certified five merges on rung ① alone. Rung ③ on
main, chronologically:80a45b1e8ff7aac0f744f32242ac19afaa0a7b5f4fa27689Two of five merges left
mainred at rung ③, and I checked rung ③ on none of them. Nobody was watchingthe instrument, so neither red state surfaced.
The two reds were unrelated to each other: 2265 was
build-gateway/build-appservice/build-web(the#1095 container-registry-auth class), 2269 was the SIGPIPE assertion (#1098 / #1099).
Why rung ① cannot stand in for rung ③
tl-mosaic's measurement, and it is the sharpest statement of the problem:The two rungs do not share a denominator. Rung ① ran a 25-task subset that never executed the framework
package; rung ③ ran 46 and caught it. This is a stronger reason than "different instruments" — a green at ①
is not a weaker version of a green at ③, it is a green over a different population.
It also means a merge can be certified by a rung that never executes the code the PR changed.
What this is not
before the merge. The useful form is a post-merge check that surfaces a red
mainto the mergeexecutor, who is currently the only party positioned to act and currently has no signal.
be unwatched and the next unrelated red would go unnoticed the same way.
Suggested shape
/commits/<merged-sha>/statusesuntil terminal and report the result to whoevermerged. (Logs are public:
/api/repos/47/logs/{pipeline}/{stepId}— two path segments,datais base64.)mainshould block subsequent merges. Note the asymmetry established in #1099:a SIGPIPE-class defect produces false failures, never false passes — so a red may be spurious while a
green is always trustworthy. A blanket "red blocks merges" rule would be self-stalling under a flaky
assertion; surfacing it to a human is the safer default.
Filed by the merge executor about its own procedure. Needs an owner.
Retracting the "different denominators" rationale in this issue's body
The section headed "Why rung ① cannot stand in for rung ③" cites:
That comparison is false and it should be read as struck.
tl-mosaicfound the error and retracted it;I verified it first-hand before correcting the issue:
ci/lintci/testci/testBoth pipelines ran 46 test tasks. The denominators are identical. The framework package did run at
2267 —
test:framework-shellexecuted and its enumeration guard passed.This is my error as much as
tl-mosaic's. It measuredlintand labelled ittest; I adopted thenumber into this issue's framing and called it the gap's "final form" without ever fetching the step id
myself. A relayed measurement promoted into a filing I own.
What actually explains 2267's green, and it was in this issue already
The correct mechanism is the static one:
At 2267 the
framework-shellchain ran onlycheck-test-enumeration.shandtest-check-test-enumeration.sh. The suite was absent from the chain, not absent from the run. Sameconclusion, correct mechanism, and it needs no task counts.
What this issue still claims, unchanged
The finding never depended on the retracted number:
That is about not looking, not about task counts. The rungs are still genuinely different trees — a
pre-merge branch versus the merged tree — and that difference is real and is the reason the gap matters.
What was false was the quantitative evidence I offered for it, so the "different denominators" argument
comes out and the rest stands.
One correction that runs the other way
ci.yml'swhen:has no path filters, and itsteststep runspnpm test→turbo run testunfiltered — 27 packages, 46 tasks, at both refs. So a merged-
mainrun does exercise the full testset. (
publish's image-build steps are separately path-excluded, which is why a post-merge green certifiesciand notpublish— that note is unrelated to this retraction and still holds.)