Skip to content

Ask <app>: a question has one surface, the open panel, not a modal card over it - #279

Merged
ymote merged 1 commit into
mainfrom
fix/ask-panel-question-once
Oct 2, 2026
Merged

ymote merged 1 commit into
mainfrom
fix/ask-panel-question-once

Conversation

@ymote

@ymote ymote commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

A headless instrument run of the desktop shell (main f52620c, scenario S8, frame 22) found a question from News's agent in the person's lane drawn twice while "Ask News" was open. It showed in the panel, with its Team/Everyone buttons, and again as the approvals overlay's modal card over everything. While that card was up, approvals::pointer took every press, so the panel's own buttons did nothing and no answer reached the model. Only typing the answer in the panel worked.

Cause. approvals::view::frame() gave the card the oldest open question of any app's conversation (questions::open_in_apps()). It did that whether or not the app's open panel already showed the question: app_chat::snapshot() lists the same open questions.

Fix. app_chat and the README ("Talking to an app's agent yourself") already say where these questions belong: questions from turns the person or the app started are shown and answered in the panel. So the card now leaves them to the panel.

  • approvals::view::card_question(open, app_chat::shown_app()) picks the oldest open app question that is not the open panel's app's.
  • Another app's question still gets the card. So does this one, as soon as the panel closes.
  • questions (the model, its routing, the one answer path) and the approval routing are unchanged.
  • The docs of approvals::view, questions and app_chat now say this.

Tests (Linux build host, from phone/; this branch alone):

  • cargo test --locked --features mobile-apps -p octosense-shell approvals: 59 passed, including the new the_overlay_leaves_the_open_panels_questions_to_the_panel.
  • … app_chat: 9 passed. shown_app follows open and close (reopening_the_panel_keeps_the_persons_rows_and_the_live_follower).
  • … system_chat: 65 passed. … questions: 10 passed.
  • The whole shell suite as phone.yml runs it (cargo test --locked --features mobile-apps -p octosense-shell, with OCTOS_SHELL_TEST_KERNEL): 776 passed.
  • The two-lane scenario against the real kernel (pinned ae230ce, OCTOS_SCENARIO_TEST_KERNEL=… --lib host_tools::scenario_tests -- --test-threads=1): 5 passed. The main scenario now checks that the person-lane question has a card while no panel is open, and none while Ask News is open.

Instrument (the same harness and scenarios as the report, on the Linux build host; before = main, after = this branch):

  • Before (main 4f73ab3, S8; the same on f52620c): the question was in the panel and on a modal card. The overlay's scrim dimmed the whole screen: the wallpaper's luminance was 0.55 of what it was before the question. A press on the panel's own "Team" reached nothing, and the answer had to be typed (free_text).
  • After (this PR's head, S8 PASS; the same on f52620c): the question shows once, in the panel. There is no scrim (luminance 1.00), and the panel's own "Team" button answered it: selected_labels: ["Team"] reached the model (frames 22–23). The system agent's question still goes to the system chat (frames 24–25).
  • Harness note: on this main, System apps: every one has its own agent that can notify #274 gave Photos an agent, so the harness now uses AI providers as its app without one (S2). Its S9 step presses the switch on the third agent row in Settings, which is now Maps's rather than News's, so S9 fails on main and on every branch alike.

Overlap. This branch is on main 4f73ab3, after #272, #273 and #274 merged; the rebase had no conflicts. #274 added asserts to other tests in app_chat/tests.rs. The open #230 and #255 also touch the approvals code, in other hunks; both merge with this branch cleanly. The four fixes from the same run are independent, and each pair merges without conflicts: this one, #280, #281 and #282.

🤖 Generated with Claude Code

…anel

A question from a turn the person or the app started (the app's
conversation, G11) was drawn twice while its "Ask <app>" panel was open:
in the panel, with its option buttons, and as the approvals overlay's
modal card over everything. While that card was up, approvals::pointer
took every press, so the panel's own buttons answered nothing; only typing
the answer in the panel worked (instrument run, scenario S8, frame 22).

As app_chat and the README document, the panel shows and answers its
conversation's questions. The overlay's card now leaves them to it:
approvals::view::card_question picks the oldest open app question except
those of the app whose panel is open (app_chat::shown_app). The card still
asks another app's question, and this one as soon as the panel closes. The
question model and its routing are unchanged.

Tests: approvals (the card's choice with and without an open panel),
app_chat (shown_app follows open and close), and the two-lane scenario
(the real kernel's person-lane question has no card while Ask News is
open).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ymote
ymote force-pushed the fix/ask-panel-question-once branch from 81aaccb to 1c9621c Compare October 2, 2026 18:09
@ymote

ymote commented Oct 2, 2026

Copy link
Copy Markdown
Contributor Author

Local CI passed on 1c9621c (tools/ci-local.sh --only all --linux-host, 15m38s, Darwin arm64; the ubuntu jobs on the Linux build host, Linux x86_64).

GitHub would run for this PR: desktop.yml, phone.yml, apps.yml. Merged on this local pass (macOS runner queue); GitHub CI runs on the merge commit on main.

Job Step Result Time
ci-local / drift The local mapping fits the workflows PASS -
desktop.yml / desktop Prepare the pinned framework sources PASS 1s
desktop.yml / desktop Compile the desktop with the shared runtime PASS 1m46s
desktop.yml / desktop One copy of every shell source PASS -
desktop.yml / desktop Desktop tools and scripts PASS 8s
desktop.yml / desktop One Makepad, App Hub, octos and Rinx in the locked graph PASS 1s
desktop.yml / desktop The native apps' generated places match native-apps.json PASS 0s
phone.yml / home Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home Compile Home and its bundled modules PASS 1m25s
phone.yml / home Verify the single runtime graph PASS 1s
phone.yml / home The native apps' generated places match native-apps.json PASS -
phone.yml / home The pinned octos revision PASS -
phone.yml / home Build octos (unless cached) PASS -
phone.yml / home Build Home, App Hub admission and runtime policy tests PASS 2m12s
phone.yml / home Test Home, App Hub admission and runtime policy PASS 6m26s
phone.yml / home Two-lane scenario (real kernel, scripted model) PASS 28s
apps.yml / services (linux) python3 tools/setup.py PASS 0s
apps.yml / services (linux) Kernel service PASS 14s
apps.yml / services (linux) App peers PASS 33s
apps.yml / services (linux) AI providers config PASS 5s
apps.yml / services (linux) L0 in-card chat (sys.chat, host side) PASS 10s
apps.yml / services (linux) System toolbox (workflow templates) PASS 1m53s
apps.yml / kernel-security (linux) python3 tools/setup.py PASS 1s
apps.yml / kernel-security (linux) The pinned octos revision PASS -
apps.yml / kernel-security (linux) Build octos (unless cached) PASS -
apps.yml / kernel-security (linux) Real-kernel tests PASS 39s
apps.yml / apps python3 tools/setup.py PASS 0s
apps.yml / apps Host services (Mail, AI providers, News) PASS 1m00s
apps.yml / apps Shell AI services (crates/ai-host) PASS 1m44s
apps.yml / apps AppCard runtime setup safeguards PASS 0s
apps.yml / apps AppCard clippy (own crates; shared runtime compiles) PASS 12s
apps.yml / apps AppCard transport and store PASS 11s
apps.yml / apps One Makepad, App Hub, octos and Rinx in the locked graph PASS 2s
rom.yml / product (linux) python3 -m unittest discover -s tests -v SKIPPED (!) -
rom.yml / product (linux) Check generated Agent Binder client SKIPPED (!) -
rom.yml / product (linux) bash -n scripts/stage-forks.sh scripts/publish-release.sh scripts/apply-to-tree.sh scripts/build-rom.sh PASS -
rom.yml / web-installer (linux) npm ci --ignore-scripts --no-audit --no-fund SKIPPED (!) -
rom.yml / web-installer (linux) npm test SKIPPED (!) -
rom.yml / web-installer (linux) npx playwright install --with-deps chromium SKIPPED (!) -
rom.yml / web-installer (linux) npm run test:browser SKIPPED (!) -
rom.yml / web-installer (linux) python3 -m unittest discover -s tests -p test_installer_manifest.py -v SKIPPED (!) -
rom.yml / web-installer (linux) bash -n scripts/release.sh SKIPPED (!) -
linux-host / sandbox (linux) python3 tools/setup.py PASS 0s
linux-host / sandbox (linux) Process sandbox on Linux (Landlock, seccomp) PASS 1m54s

Skipped (these did NOT pass; (!) marks a skip that blocks tools/ci-local-merge.sh):

  • rom.yml / product (linux): python3 -m unittest discover -s tests -v: javac -version does not work here: install a JDK (17 or newer) and put its bin/ on PATH or set JAVA_HOME
  • rom.yml / product (linux): Check generated Agent Binder client: needs build-tools/35.0.0/aidl, platforms/android-35/framework.aidl in the Android SDK (no Android SDK found): install the SDK packages 'build-tools;35.0.0' and 'platforms;android-35' (sdkmanager) and set ANDROID_HOME
  • rom.yml / web-installer (linux): npm ci --ignore-scripts --no-audit --no-fund: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm test: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npx playwright install --with-deps chromium: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm run test:browser: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): python3 -m unittest discover -s tests -p test_installer_manifest.py -v: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): bash -n scripts/release.sh: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH

Notes:

  • GitHub runs Python 3.12; this run used Python 3.9.6
  • GitHub runs Python 3.12; the Linux host used Python 3.14.4

@ymote
ymote merged commit a7c746c into main Oct 2, 2026
4 of 5 checks passed
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