Skip to content

fix(shell): the relay seam's test keeps to approvals of its own - #297

Merged
ymote merged 3 commits into
mainfrom
fix/flaky-approvals-store
Oct 2, 2026
Merged

ymote merged 3 commits into
mainfrom
fix/flaky-approvals-store

Conversation

@ymote

@ymote ymote commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Fixes the flaky app_chat::tests::the_panel_opens_a_sharing_context_and_sends_person_turns_there. Beside the approvals tests it fails every time:

panicked at crates/shell/src/app_chat/tests.rs:416:5:
assertion `left == right` failed
  left: Null
 right: "org-example-asktest-22a12f90"

Cause

The cause is shared global state. approvals::tests::the_relay_gets_decisions_made_before_it_was_installed began with approvals::init_memory(), which replaces the shell's process-wide approvals with empty ones. The app_chat test allows its app, then reads agents::line(), which gives a peer_slug only while the app is allowed. When the reset landed between those two steps, the consent was gone. The same approvals test also installed its RecordingRelay into the shared approvals, where it would take other tests' decisions (the real-kernel tests route theirs through the shared relay).

Fix

  • The relay seam (approval_requested, set_relay, bus_requested) is now methods on Approvals.
  • The free functions call those methods on the shell's approvals, so callers and behaviour are unchanged.
  • The test builds Approvals::memory() and never touches the shared approvals. No other approvals test did.

Evidence

All runs were on the Linux build host, using the shell test binary built at main (cc59e67) and at this branch.

Run main this branch
app_chat::tests::the_panel_opens_a_sharing_context_and_sends_person_turns_there approvals::, 50× 50 of 50 failed, all at tests.rs:416 with left: Null 0 of 50
app_chat:: approvals::, 50× 8 of 50 failed 0 of 50
Whole octosense-shell --lib suite with the real kernel, 30× this test failed twice never

The other failures in the whole-suite runs are not this flake. They are the catalog-test flake that #293 fixes, the Linux-only a_program_reached_through_a_link_outside_its_roots_starts (ETXTBSY), and real_kernel_an_app_agents_turn_calls_news_list_through_the_shells_relay, which failed once on main and not on this branch.

🤖 Generated with Claude Code

ymote and others added 3 commits October 2, 2026 13:57
The supervisor saw the kernel end (its stdout closing, or its exit
status) and read the stderr tail at once, but stderr is copied into the
tail by a task of its own. The line the kernel wrote just before it
exited could still be in the pipe, so the reason lost it: CI's
`a_kernel_that_dies_closes_its_connections_with_its_last_words` failed
with "the kernel closed its output: fake kernel up", without the
"asked to exit" the fake kernel wrote last.

The tail is now read after the kernel is stopped and the stderr task has
reached the end of the pipe (bounded at 2 s, for a process the kernel
started that still holds the pipe). Failed reasons get the same complete
tail. The test asks for the last words themselves, not just "exit".

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

The glance tile tests register probe system apps (os.glancetile,
os.glanceinput, os.glancequiet, os.glancesweep) in App Hub's
system-app registry. That registry is process-wide, has no removal, and
is the one `system_card_apps` lists, so a catalog test running after a
glance test in the same process saw the probes as launcher rows:
`bundled_apps_open_without_catalog_files_or_child_processes` failed its
catalog comparison 7 of 10 times beside `glance_card::` on main, and
`the_system_apps_ship_as_card_apps` compares the same list.

Tests now register their system apps through
`apps::test_system_apps::register`, which notes the id before it
registers it, and the tests of the build's own catalog leave noted ids
out. Production code is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`approvals::tests::the_relay_gets_decisions_made_before_it_was_installed`
began with `init_memory()`, which replaces the shell's process-wide
approvals with empty ones. Every consent a test running beside it had
given was gone. `app_chat::tests::the_panel_opens_a_sharing_context_and_sends_person_turns_there`
allows its app, then reads `agents::line()`, which reports a peer slug
only while the app is allowed. Beside `approvals::` it failed 50 of 50
runs with `peer_slug: null`. The same test also installed its recording
relay into the shared approvals, where it would take other tests'
decisions.

The relay seam (`approval_requested`, `set_relay`, `bus_requested`) is
now methods on `Approvals`. The free functions call them on the shell's
approvals, as before. The test builds `Approvals::memory()` and never
touches the shared one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ymote
ymote force-pushed the fix/flaky-approvals-store branch from 4c03ca0 to 967418c Compare October 2, 2026 20:57
@ymote
ymote merged commit 1fcc070 into main Oct 2, 2026
5 checks passed
@ymote

ymote commented Oct 2, 2026

Copy link
Copy Markdown
Contributor Author

Merged in a merge train; local CI (Mac with rom toolchain + --linux-host) passed on the train head 72e5d55, which contains this PR.

  • tools/ci-local.sh --only all --linux-host, started 2026-10-02T14:00:45: passed. Desktop, phone and apps passed on the Mac; apps services, kernel-security and linux-host / sandbox passed on the Linux build host. Its rom.yml steps were skipped on the Linux host, and the train doesn't trigger rom.yml.
  • tools/ci-local.sh --only all on the Mac with the rom toolchain (JDK 17, Android SDK, node 24), started 2026-10-02T14:51:21: 42/42 steps passed, none skipped.

The train was #291, #293, #297, #294, #298, #295, #296, #299, #300 and #292, on main f6678b5. After the last merge, main 301be0c has the tested head's tree.

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