Skip to content

base red: CI guard profile fails on base content - #31366

Merged
teamleaderleo merged 24 commits into
feat-cmux-nextfrom
lane/ciguard-base-red
Nov 2, 2026
Merged

teamleaderleo merged 24 commits into
feat-cmux-nextfrom
lane/ciguard-base-red

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

The cmux-next CI guard group job (the workflow guard profile) fails on the content of base. Every PR that touches .github/workflows runs that profile, so each one inherits these reds. Base pushes never run the profile, so the red-on-base classifier can't excuse them. Each fix also routes the profile, so a separate PR for each group would fail on the other groups' reds. This is why they land together.

Each group is its own commit set, and each names the PR that regressed it:

Done when the cmux-next CI guard group check on this PR is green.

Agent session: agent session

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Fixes the cmux-next CI guard group job so the workflow guard profile passes on base content. The profile runs on every PR that touches .github/workflows, so each PR currently inherits these reds; base pushes never run the profile, so the red-on-base classifier can't excuse them. All groups land together because each fix also routes the profile, and separate PRs would fail on the other groups' reds.

Runner trust and pools

Maps, media, determinism, and hygiene

Written for commit effc787. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 20 commits November 1, 2026 21:35
scripts/measure/fresh-home-launch.sh and workers/cmux-vm/scripts/test-mesh-label-compat.ts passed
--depth to a fetch in the caller's checkout, which turns a full clone shallow. Both now pass it only
when git rev-parse --is-shallow-repository says the checkout is already shallow.

Regressed by #30495 (fresh-home-launch.sh) and #30501 (test-mesh-label-compat.ts).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…MessageGroupRow.tsx (base red)

#29800 removed MessageGroupRow.tsx (every sent message is its own card); TurnRows.tsx now draws
each sent message row in order (SentMessageLine.tsx is already mapped), so chat-transcript maps it.

Regressed by #29800 (deleted the file #28698 had mapped).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
… red)

cmux-next-ios/verify/imsg-replies/GestureServerUITests.swift is an XCTest source outside every
TEST_ROOTS entry. Scan cmux-next-ios/verify/ (it has no errno use, so nothing else changes).

Regressed by 201101a (added the verify/imsg-replies rig; landed by a safe-push train, no PR).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…e red)

tests/test_ci_blacksmith_linux_sizes.py, test_ci_overflow_pick_reads_pool.py,
test_nightly_next_control_rescue.py and test_ci_cloud_probe_rescue.py read .github/workflows/
but are lane = "manual" in tests/test-execution.toml (no new CI tests; wiring them as linux-guard
reddened tooling-tests on every PR). They join UNWIRED with the same reason as the other
manual-lane entries, and each says when to run it by hand.

Regressed by #30360, #30878, #30657 and #30796 (each added its test without an UNWIRED entry).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
"ci: Validate fleet rule lints" failed on feat-cmux-next in three rules.

big-red: the personal machine's name left product code and tests. Doc
comments say "one lane VM" / "<host>"; the webview tests use my-vm (its
machine hue still differs from gpu-box's).
  Regressed by #28105 (peer_handshake_tests.rs, list_reply.rs,
  list_reply_tests.rs), #29495 (host_update_tests.rs), #29126
  (chatOpenPacedList.test.ts), #31108 (project-chooser-machine-tag).

pkill: the iOS verify rigs and the tool-evals remote daemon stop only
what they started. imsg-replies records the conversation-sim, the
recorders (simctl itself, not the xcrun shim) and the gesture servers in
pidfiles and signals those PIDs after checking the command line still
matches; pq_browser_events records its two site servers' PIDs; the
tool-evals remote stop kills the setsid group whose PID the launcher
recorded beside the socket.
  Regressed by 201101a (imsg-replies, first in #22328), #25915
  (pq_browser_events.py), #29080 (tool-evals/session.mjs).

Allowlisted as safe, with reasons: scripts/ci/macos-stubs/Security.tbd
(a linker stub listing symbol names, no keychain read; #27603) and
tests/tool-evals/cases/hard.ndjson (an eval case forbidding pkill;
#28738).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
… red)

Regressed by the commits introducing each assertion (see report).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…key (base red)

- Validate macOS jobs select a pinned Xcode: the nine flagged nightly.yml
  jobs already run select-ci-xcode.sh through the `- *select-xcode` step
  alias; the guard did not expand step aliases. It now resolves `- *name`
  to the `- &name` step, with self-tests for both an alias to the selector
  and an alias to another step. Regressed by #30471 (steps turned into
  aliases to keep nightly.yml under its size limit).
- Lint every workflow: drop the five sign-nightly-identity-legacy-* anchors
  left after the Blacksmith twin that aliased them was removed
  (a7b6a61, "legacy sign and deltas run on owned Macs only"; the twin
  came from #27357). No behaviour change.
- upload-artifact retention: the 14-day cmux-nightly-remote-daemon upload
  moved from build-nightly-app to build-nightly-remote-daemon in #25935
  with its retention unchanged; move the allowlist key with it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…base red)

Drop the unknown step key "record" (re-added after #26888 removed it by #27933 and f283a2e), the unimplemented top-level frameInterval in home-chief-shimmer (c022070), the focusLeft right after closePane in palette-chat-toggles (#25405), split pane-polish (31 steps) into pane-polish and pane-polish-themes, and give the app-store-consent-deploy state a synthetic host that is not an email shape (4a05792).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
… (base red)

Swift/web/tool-evals findings cannot be determinized without Mac or webview runs; each entry names its reason and adding PR.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…scued (base red)

- cmux-next-base-tier-kick, cmux-next-dev-kick and ios-internal-nightly-trigger waited on
  one fixed Blacksmith Linux size (!startsWith(LINUX_RUNNER) || overflow 8 || 2 vCPU). They
  now read fromJSON(vars.RUNNER_POOLS).linux after the fork branches. Their pinning tests
  (base tier, DEV kick, iOS internal builder) assert the pool read instead. Regressed by #30837.
- owned_pool_rescue.py: feat-cmux-next's UNRESCUED_WORKFLOW_PATHS records the secretless
  Linux pool readers the owned-pool sources test found unlisted (fast gates, gallery health,
  PR checks, cloud backend check, web validation, and the three kicks above), with the existing
  _POOL_READ_WHY. Regressed by #29844 and #31138.
- test_ci_linux_single_size.py: drop cmux-next-fast-gates.yml from FIXED_PAIR (moved by #31138);
  test_ci_overflow_pick_reads_pool.py: drop the two kicks from PICKS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…ac signing rule (base red)

Signing keychain guard (rule 7): accept owned-pool runner variables only where
safety is proven in the job itself:
- 7a: a job in glaeda's exclusive signing class whose first step is the
  verbatim claim gate may fall back to CI_NIGHTLY_NEXT_BUILD_RUNNER /
  CI_SIDE_LANE_RUNNER (nightly.yml sign-nightly-identity-legacy and
  generate-nightly-deltas, owned-only by design, Lawrence a7b6a61;
  deltas' Sparkle key added in #29261). test_ci_signing_owned_mac.py holds the
  claim script, always() keychain delete and twin/picker rules for them.
- 7b: stable-next.yml sign (#27898) reads every signing secret only under
  env.SIGN == 'developer-id', whose condition picks a literal Blacksmith label
  before any variable; its owned dry-run holds no key. Proven structurally.

Retry guard: cmux-next.yml swift-test/daemon-test/generated-files' side-lane
fallback (#29814) is now gated at run_attempt <= 3 for the bot, so the bot's
attempt 4 takes blacksmith-6vcpu-macos-26 like every other cmux-next fleet
fallback (#22565). The three owned-only nightly jobs are exempt while they keep
exactly their owned route. The textual check now forbids naming attempts after
2 (== 3+), as its comment says, instead of also == 2 (#29847 nightly.yml,
#29130 cmux-next-guards.yml name the bot's attempt 2, which may stay owned).

Regressed by #29814, #27898, #29261, #29847, #29130 and a7b6a61.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…ghtly step scripts for sentry-cli (base red)

check_no_self_hosted_fleet_runners
The guard told every workflow to "use a cloud label so required jobs never
land on a mini". That is outdated policy: owned fleet Macs now come first for
macOS jobs (Linux, then owned Macs through the picker, Blacksmith last),
release signing may run on owned Macs, display tests gate nothing, and the
NEXT nightly runs on the fleet with the nightly-only minis dedicated to it.
The guard kept up only through exact per-workflow selector strings, which
drifted with every routing change and turned the guard red on base:
- cmux-next.yml swift-test/daemon-test/generated-files: the glaeda-side
  deferred fallback (regressed by #29814) and the attempt-1 gui selector
  (#28605, #27853)
- cmux-next-base-autofix.yml / cmux-next-pr-autofix.yml: the gui selector
  gained a re-run predicate (#27853)
- nightly.yml sign/prepare jobs: owned pool as the final fleet fallback
  (#29154)

Fix the guard instead of moving those jobs to Blacksmith: an owned POOL label
(glaeda-[<lane>-]<class>-xcode-<version>, served by many minis, never one
host) is accepted as a quoted literal in a ${{ }} runs-on that routes through
the declared picker/vars pattern (reads needs.<job>.outputs.* or vars.*).
In a workflow a pull request can trigger, the fork pull request branch
(fork heads to Blacksmith) must still come first on the line, so fork code
never reaches an owned Mac (runner trust unchanged). Still refused: bare
self-hosted/macOS/ARM64, single-host labels (cmux-macos, mac-mini, slot-N,
tart-*, ...), macos-26 outside the fork branch, and an owned label named
directly with no picker or variable route. The exact gui selector strings are
replaced by this rule; self-tests cover each accept and refuse case.

check_sentry_cli_install_portability
#31013 moved nightly.yml's "Upload dSYMs to Sentry" body into
scripts/ci/nightly-steps/app-upload-dsyms.sh (size budget), so the guard no
longer saw the ./scripts/upload-sentry-dsyms.sh call. The guard now reads
the step's step script too. Regressed by #31013.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 34b5ed3: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr31366 -f ref=lane/ciguard-base-red -f platform=macos -f backend_mode=local

Gallery before/after for 34b5ed3: 16 states rendered, 2 images differ, 1139 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41360994369 -R manaflow-ai/cmux -n gallery-advisory-31366-34b5ed3b5eb95d7b7cd511e2ee8ee5de3d3619f8 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.access-offer/turn-no-credits Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.access-offer/turn-no-credits Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.access-offer/turn-low-credits Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.access-offer/turn-low-credits Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.access-offer/turn-no-offer Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.access-offer/turn-no-offer Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/environment Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/environment Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/sources Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/sources Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/directory Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/directory Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/keyboard Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/keyboard Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/browse-error Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.add-project-panel/browse-error Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.agent-start/slow-start Apple System Colors Light changed 0% same-folder chatOpenPacedList.test.ts
agent-pane.agent-start/slow-start Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.agent-start/starting Apple System Colors Light changed 0.0327% same-folder chatOpenPacedList.test.ts
agent-pane.agent-start/starting Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.agent-start/failed-start Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.agent-start/failed-start Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/single Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/single Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/grouped Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/grouped Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/single-multiedit Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/single-multiedit Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/grouped-multiedit Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/grouped-multiedit Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/single-long Apple System Colors Light unchanged 0% same-folder chatOpenPacedList.test.ts
agent-pane.approval-edits/single-long Apple System Colors unchanged 0% same-folder chatOpenPacedList.test.ts

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Probably yours: session-info-layout-still.test.ts, session-info-layout-still.test.ts, session-info-layout-still.test.ts and 5 more fails here but not on main's latest full suite.

CI failed on 34b5ed3b5e (run 41360994428 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (1) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • new in this PR session-info-layout-still.test.ts chromium: in a 560px pane, opening, folding and closing Session Info moves nothing else: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 900px pane, opening, folding and closing Session Info moves nothing else: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 1200px pane, opening, folding and closing Session Info moves nothing else: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 560px pane under a tab row, opening, folding and closing Session Info moves nothing e...: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 900px pane under a tab row, opening, folding and closing Session Info moves nothing e...: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 1200px pane under a tab row, opening, folding and closing Session Info moves nothing ...: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 560px pane beside a computer use card, opening, folding and closing Session Info move...: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 900px pane beside a computer use card, opening, folding and closing Session Info move...: failed (job)
Matched log lines
web / react-apps-base-check (1): (fail) chromium: in a 560px pane, opening, folding and closing Session Info moves nothing else [1783.99ms]

Not re-run automatically: web / react-apps-base-check (1), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 112ab1e to compare; do not merge until green; see lane-rules
red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (1); it named no new red test (setup or base replay failed; see its log); do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@blacksmith-sh

blacksmith-sh Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Found 8 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpft0ljo0y/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpkm3pqd1i/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
imported web bundle inputs are not routed:/imported web bundle inputs are not routed: View Logs
test_every_part_of_bun_run_check_runs_in_the_warn_branch (main.WebviewsWarnSplitCov
ersCheck.test_every_part_of_bun_run_check_runs_in_the_warn_branch)/
test_every_part_of_bun_run_check_runs_in_the_warn_branch (main.WebviewsWarnSplitCov
ersCheck.test_every_part_of_bun_run_check_runs_in_the_warn_branch)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at effc787

BLOCK at effc787

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] session.mjs records the PID of the background shell wrapping the && chain, not the setsid daemon group. The fallback at line 93 therefore signals a nonexistent process group and leaves remote daemons running when normal stop fails.

  2. [P1] [blocking] test_ci_self_hosted_guard.sh only checks that the fork-to-Blacksmith branch appears somewhere before the owned literal. A route such as needs.untrusted.outputs.runner || <fork branch> || 'glaeda-...' passes the guard, while a fork can resolve the untrusted output to an owned runner before the branch. The fork branch must be enforced as the first selector.

  3. [P2] [follow-up] pq_browser_events.py blindly kills the PID in a stale pidfile. Since serve() does not rewrite the pidfile when another run already owns the port, stop_site() can terminate another run’s server or a recycled unrelated process.

Follow-ups: #3 stale PID-file ownership in pq_browser_events.py.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
teamleaderleo and others added 3 commits November 1, 2026 22:39
…outing; helper walk skips non-running namers (base red)

- release-admission and remote-daemon-admission read fromJSON(vars.RUNNER_POOLS).linux by
  design since #30878; the two tests now assert that instead of vars.LINUX_RUNNER.
- fast-checks.yml's setup-bun reads the bun pin from webviews/package.json devEngines at run
  time (#29757); the setup-bun test accepts a steps.<id>.outputs.version whose step reads
  devEngines, and still requires the literal pin everywhere else.
- indexnow.yml pinned bun 1.3.14 when #30697 backported it; it now installs devEngines' 1.4.4.
- ci_helper_areas() failed open on files that name a helper without running it, so
  owned_pool_rescue.py, owned_build_state.py and e2e_warm_derived_data.py stopped routing by
  where they run. Regressed by #28528 (test_cmux_next_route.py names owned_pool_rescue.py as a
  routing input and itself), #28513 (docs/ci/cmux-next-tiers.md names that test), #30657
  (nightly_next_control_rescue.py's only test is manual-lane), #28568 (.github/warm-sources.json
  prose) and #30467 (base_red_excuse.py's guard-test table and its test's fixtures). The walk
  now ignores a test naming itself, docs, a Python test naming it only in a docstring, the
  listed path tables and warm-sources.json, and treats a test the registry declares in an inert
  lane that nothing imports as a dead end. An unregistered test nothing names still fails open.
- cache_restore_receipt.py now routes precisely (macOS + Release, via ci-macos.yml's
  cache-restore action) instead of failing open; its assertion says so.

python3 tests/test_ci_change_areas.py: 4 of 234 failed before, 0 after.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…ls, stale pidfiles)

- tests/tool-evals/session.mjs: the remote launcher recorded $! of the backgrounded && chain
  (the wrapping subshell), so the stop signalled a group that did not exist. setsid now starts
  a shell that writes its own PID and execs the daemon, so the recorded PID is the daemon's
  process group. Checked locally: the recorded PID equals the daemon's PGID and SID, and
  kill -TERM -- -PID stops it.
- tests/test_ci_self_hosted_guard.sh (security): the owned-pool exemption in pull request
  workflows only required the fork branch somewhere before the owned literal, so
  `needs.x.outputs.runner || <fork branch> || 'glaeda-...'` passed. The fork branch must now be
  the first selector of the expression (after only the hosted repository_owner clause). New
  negative self-tests for reordered expressions; red with the old match, green with the new.
- cmux-next-ios/verify/parity/pq_browser_events.py: stop_site() now stops only servers this run
  started (serve() reports each pidfile it wrote), kills a PID only while its command line is
  still that server's, and removes the pidfile after. Checked with a local stub harness.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
…ase red)

The helper runs-on expected string passed to awk -v carried `\&\&`, which gawk reads as `&&`
(with a warning) but mawk, the default awk on Ubuntu runners, keeps as `\&\&`, so the whole
expression never matched and "nightly must build and hand off the macOS 26 helper" failed.
Plain `&&` means the same in both. Regressed by #30824.

bash tests/test_nightly_universal_build.sh: FAIL before, PASS after (mawk 1.3.4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at 34b5ed3

Reviewer: codex gpt-6.1-sol xhigh, fast tier.

Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at 34b5ed3

Visual verdict: no images; Leo tries the build

  1. [P2][follow-up] The iOS verification helpers use shared PID files such as $HOME/imsgreply/pids/rec-$UDID.pid (pair.sh:12) and /tmp/imsgreply-sim.pid (devseed.sh:10). Concurrent runs overwrite each other’s records; _pid_stop then sees the other run’s matching command and terminates it (pair.sh:19).

  2. [P2][follow-up] Remote tool-eval cleanup trusts ${socket}.pid (session.mjs:75) and sends SIGTERM to that process group without verifying it is still the daemon (session.mjs:95). A stale or reused PID/PGID can terminate an unrelated process group.

Follow-ups:

  • [P2][follow-up] Isolate iOS PID files per run.
  • [P2][follow-up] Validate remote PID ownership before signaling.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base 112ab1e to this head): SHIP at 34b5ed3.

No P1/P2 findings.

@cmux-bot cmux-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cmux-bot approves 34b5ed3: an independent review passed this exact head (router-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@teamleaderleo
teamleaderleo merged commit 09726cf into feat-cmux-next Nov 2, 2026
266 of 276 checks passed
@teamleaderleo
teamleaderleo deleted the lane/ciguard-base-red branch November 2, 2026 01:16
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
* ci: run the workflow guard profile on base pushes that touch it

A feat-cmux-next push that touches .github/, tests/ or scripts/ci/ now runs the
cmux-next CI guard group at its tip (guards_new_reds.py --tip): no base
comparison, so every red step fails the push. Judged only against the previous
tip, a red that persisted stayed green, and 18 guard steps sat red on the
branch unseen until #31366. Other pushes and pull requests keep the comparison.

guards_new_reds.py prints each red step as a plain `guard red step (KIND): STEP`
line, and base_red_excuse.py judges a pull request's red in the guard group per
step: each step it calls new must be red at the newest base run of the job.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189

* ci: guard group verdict lines count only after the guard run finished

A base run cut short before run_ci_guards.py printed its closing line may still
show verdict lines quoted in a failing step's output; they are no evidence
(router-review finding on #31605).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc739fd2f4e557ae7189

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

3 inactive deployments
artifacts — 34b5ed3b Deployed Nov 1, 2026 by teamleaderleo via publish tree-addressed cmux-tui #97817
sentry-dsyms — 34b5ed3b Deployed Nov 1, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #97817
ci-routing-agent — 34b5ed3b Deployed Nov 1, 2026 by teamleaderleo via cmux-tui tree preflight #97817
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:high Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant