Skip to content

ci: attribution scores a lone suspect and reports app-host crashes apart - #14952

Merged
teamleaderleo merged 3 commits into
mainfrom
ci/attribution-crash-and-relevance
Sep 27, 2026
Merged

teamleaderleo merged 3 commits into
mainfrom
ci/attribution-crash-and-relevance

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Sep 27, 2026 •

Copy link
Copy Markdown
Collaborator

The main-regression attribution bot told #14922 that it broke RecoverableMainWindowLifecycleTests/closingRecoveredWindowUsesNormalCloseFinalization() in main run 36307768440. #14922 changed two localized values and two web tests. The test did not regress: the app host aborted under it (Cannot form weak reference to instance ... NSKVONotifying_NSWindow, fixed by #14925), xcodebuild recorded the test in flight as failed, and the same crash had hit every full-suite run since 02:04Z under a different test each time.

Three changes to scripts/ci/main_regression_attribution.py:

  • The only pull request in the range is scored like any other. It is named only when its diff edits the failing suite (test_impact.py) or changes code or strings the suite names (reverse_test_impact.py). At score 0 the failure is listed as unattributed with the reason: the lone PR could not be diffed, changes nothing the app host loads, or does not reach the suite. A changed .xcstrings entry now counts as a changed string: its key and changed values are followed like a changed Swift literal (reverse_test_impact.literal_suites). Keep agent brand names untranslated; tighten changelog and env-rejection tests #14922's values (Codex, OpenCode) are under the 8-character minimum, so running rank_inputs on its merge commit scores 0 and gives "the only pull request in the range does not reach this suite".
  • A crash victim is not a regression of the test. In a batch the accounting marked incomplete app-host run: app host restarted, only the test in flight at the restart is the crash's: it started in the live log and never finished. Swift Testing display names are mapped to functions from the cmuxTests/ sources. When the log cannot name that test, the batch's failures with no failed line of their own count as the crash's only if there are exactly as many as unexplained restarts. Every other failure in the batch stays an ordinary regression. The victim is reported as "the app host crashed while running it". The crash signature is the objc, Swift Fatal error or uncaught-exception message above the backtracer's Program crashed header, with addresses masked. When the log has no message, the line names the shard's cmux-app-host-diagnostics-* artifact instead. A PR hears about a victim only when its diff reaches the suite.
  • A recurring crash is not new. The attribution now keeps the restarts of the baseline and of runs it skipped on the way. A current crash is pre-existing only when those runs already showed every one of its signatures. A crash with no signature, or with any signature no earlier run showed, is new. A recurring crash is listed once per signature in the issue, as not new, pings nobody and stays out of the bisect data. A new crash's victims go into the bisect data with "crash": true, so a crash from a PR the ranking missed still gets bisected; main_regression_bisect.py queues them like any other entry.

The PR comment marker, the per-report caps and the DATA_PREFIX payload are unchanged; the payload's tests gains the optional crash flag. workflow_guard_groups.py routes the three scripts the attribution test now loads to the ci guard group.

Verification

Current catch-up head 5c1c0ee93bc6f3c2b32d64fbad70666a853bcaf8 passes 78 attribution/bisect tests, 31 reverse-impact tests and 66 local guard steps. Independent review found no concrete correctness defects. All required current-head checks passed (CI run). Catching up with main resolves the earlier stale registry failure; no new registry entry was needed.

  • python3 tests/test_ci_main_regression_attribution.py: 41 passed. New cases replay the Keep agent brand names untranslated; tighten changelog and env-rejection tests #14922 shape from a cut-down copy of the shard 7 log: a lone PR outside the suite, the victim of a host restart, and a crash the baseline also had. The issue section lists the crash once as not new, keeps the victim out of the table and bisect data, and plans no comment. Other new cases cover a crashed batch with a plain failure (the plain one is attributed and bisected), display-name mapping, the strict recurrence rule, the signature fallbacks, the artifact pointer, a new crash that pings only a PR that edits the suite, and the string catalog reach.
  • python3 tests/test_ci_main_regression_bisect.py (37, including a flagged crash entry being queued) and python3 tests/test_ci_reverse_test_impact.py (31) pass.
  • Parsing the real job log (108588769348) gives the victim above, the signature Cannot form weak reference to instance (0x*) of class NSKVONotifying_NSWindow and the artifact cmux-app-host-diagnostics-shard-7-run-1.

🤖 Generated with Claude Code

Changelog

none

Summary by CodeRabbit

  • New Features
    • CI reports now identify app-host crashes, the test in progress, crash signatures, and related diagnostic artifacts.
    • Crash details and artifact links are included in issue sections and pull-request comments.
  • Improvements
    • Recurring crashes are recognized by matching current signatures against earlier crashes. Previously seen crashes are kept separate from new regressions.
    • Pull-request attribution now considers whether changes reach the affected test suite, including through localized strings. Irrelevant changes are left unattributed.

The main-regression attribution blamed #14922, the only pull request in
its range, for a test the app host crashed under. The crash had hit every
full-suite run since 02:04Z under a different test.

The only pull request in the range is now scored like any other and left
unattributed, with the reason, when its diff reaches no suite. A changed
string catalog entry counts as a changed string. A failure a restarted
batch recorded is reported as the app host crashing while running it,
with the crash message from the log or the diagnostics artifact to read,
kept out of the bisect data, and pinged only when the diff reaches the
suite. A crash the baseline or a skipped run already had is listed once
as recurring and pings nobody.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: e8e2e0bc-569a-4565-a3b3-d9e56ac16b64

📥 Commits

Reviewing files that changed from the base of the PR and between ee2cda0 and 5c1c0ee.

📒 Files selected for processing (5)
  • scripts/ci/main_regression_attribution.py
  • scripts/ci/reverse_test_impact.py
  • scripts/ci/workflow_guard_groups.py
  • tests/test_ci_main_regression_attribution.py
  • tests/test_ci_main_regression_bisect.py
 _______________________________________________
< Caches are bugs waiting to happen. - Rob Pike >
 -----------------------------------------------
  \
   \   \
        \ /\
        ( )
      .( o ).
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Review of #14952: every failure of a restarted batch was treated as the
crash's, so a recurring crash hid genuine assertion failures from the
table, the pings and the bisect data. Only the test the live log saw
start and never finish is the crash's now; the rest stay regressions.

A crash is recurring only when earlier runs showed every one of its
signatures, and a new crash's victims go into the bisect data with a
crash flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Catch-up merge by scripts/ci/catch_up_pr.py (RFC #14631).
Merged by scripts/merge-main.sh: origin/main at ee2cda0.

Catch-up-previous-head: 9841a45
Catch-up-base: ee2cda0
@teamleaderleo
teamleaderleo merged commit 212e808 into main Sep 27, 2026
61 of 62 checks passed
@teamleaderleo
teamleaderleo deleted the ci/attribution-crash-and-relevance branch September 27, 2026 14:59
@github-actions

Copy link
Copy Markdown
Contributor

Merge receipt for 5c1c0ee93b: every check was green at merge (13 verified; 17 skipped by policy). Full suite runs on main after merge.

rustybret pushed a commit to rustybret/bmux that referenced this pull request Sep 27, 2026
648d5c1 Add a Paste Last Screenshot action with an unbound shortcut (manaflow-ai#14955)
ff61677 ci: avoid partial blobs in catch-up merges (manaflow-ai#15023)
4d0d112 ci: retry transient catch-up GraphQL failures (manaflow-ai#15021)
212e808 ci: attribution scores a lone suspect and reports app-host crashes apart (manaflow-ai#14952)
4cabdf4 test: settle the window before measuring the unread sidebar-row invalidation (manaflow-ai#14568)
12ec99b Add a release-media capture tool for changelog screenshots and clips (manaflow-ai#15010)
ee2cda0 Backfill Unreleased changelog and draft next release cards (manaflow-ai#14999)
be4adf8 Show a brief notice when Cmd+V fails on an oversized image or a timeout (manaflow-ai#14953)
23d22d7 ci: an owned pool the run starts on now beats an earlier one it queues on (manaflow-ai#14993)
05d0190 ci: catch-up posts once per head, says less, and merges inserted declarations (manaflow-ai#15018)
4ee4b21 ci: fail stalled Swift package tests instead of waiting out the job timeout (manaflow-ai#14997)
9ce512a merge-main: run local guards only when asked (manaflow-ai#15016)
d60108a ci: clear test-e2e's fixed DerivedData with clear-dirs.sh (manaflow-ai#14994)
1d7895e ci: run the shell and CLI no-socket lanes in parallel (manaflow-ai#14990)
6e7d25f Honor macOS Differentiate Without Color, Increase Contrast and Reduce Transparency (manaflow-ai#14991)
966b355 Stop interrupting focused work: sidebar jumps, Computer Use focus steal, quit dialog on logout (manaflow-ai#14961)
e1f1cb2 Strip control characters from feedback attachment filenames (manaflow-ai#14783)
0758c9f test: find the onboarding window the test presented, not a leftover (manaflow-ai#15015)
b35c540 fix(spm): resolve GhosttyKit/GhosttyRuntimeTestStubs target name collisions (manaflow-ai#10569)
ef33bed Map .purs artifacts to the Haskell highlight.js grammar (manaflow-ai#14202)
e2a167a Highlight Elixir and Erlang files in the file editor (manaflow-ai#13732)
972c449 fix: wrap Linux browser download card label (manaflow-ai#11157)
f563884 Add Aside to browser data import detection (manaflow-ai#13379)
091d0ea Add cmux send --paste and hint at it for large multi-line sends (manaflow-ai#14937)
3ffcdbb test(ios): keep folder-tap stat tests off the real 2 s deadline (manaflow-ai#15017)
68d3936 test: keep CmuxTerminal pasteboard tests off the cooperative pool (manaflow-ai#15006)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant