Skip to content

feat(glance): retain full-screen app workspaces with contextual agent chat - #326

Merged
ymote merged 18 commits into
mainfrom
docs/adr-mail-composable-action-cards
Oct 5, 2026
Merged

ymote merged 18 commits into
mainfrom
docs/adr-mail-composable-action-cards

Conversation

@ymote

@ymote ymote commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Mail chat could claim to correct a reply while review still showed an older draft, and interactive Glance cards were constrained by the feed's item geometry. This implements ADR0007's durable Mail reply/approval path and gives every card publisher a resident full-screen workspace in the existing shell.

A compact summary expands to the root safe viewport. The feed supplies only the animation origin and receives no input while covered. Back dismisses the keyboard, review, then workspace. No other app/activity launches for presentation. Mail uses Email / Chat; other cards retain their original L0/Splash UI and use Card / Chat when the publisher declares an agent. Existing explicit sys.chat threads remain intact. Agent-enabled cards without one get a separate host-owned conversation, scoped to the original publication account and card, with bounded publication/L0 state context. First use opens the existing consent sheet. Context grants no additional tools or approval; Finance has no shipping app/agent.

The workspace retains local L0 changes, interacted Splash isolates and unsent chat outside the three-clean-workspace cache limit. Same-layout updates preserve local state; a new non-Mail layout is deferred while the workspace has local work. Expiry, withdrawal and account invalidation retire views. Retention is in-process, not generic durable storage. Theme refresh preserves readable controls and typed input. The isolated UX package uses Home's Android extension so Back does not finish the activity.

Mail's native editor and chat share the authoritative draft. Requested chat edits use a revision-scoped mail.suggest_reply capability; concurrent human edits are protected. Exact review shows the immutable recipient, subject and body. Only physical Android touchscreen approval can authorize SMTP. Generic ContextKind::Card conversations cannot obtain Mail's edit lease. Desktop/accessibility send approval remains deferred.

Validation:

  • 916 shell tests, 13 contextual-chat tests, and the final 3 native-chat draw tests passed. Desktop default/mobile-apps and phone checks, both shell dependency graphs, runtime-pin and personal-path checks, and Android packaging passed locally. Earlier backend validation passed 53 Mail-service tests, with two environment-dependent tests ignored.
  • OnePlus 6, twelve original model templates: DeepSeek turn-12 and MiniMax turn-14 Mail, Calendar, News, Finance, Photos and YouTube L0 cards were published without changing their source/data. All opened at the root 384 × 758 logical-point viewport and accepted their local actions. Unsent Mail chat survived visiting five other cards; MiniMax's typed generated reply and photo favorite also survived return. ADB drove the UI; models authored the templates. These are offline local-state prototypes, not proof of remote business effects. Calendar is now in the phone catalog; Finance used unprivileged test.finance with no Chat.
  • Real Calendar agents, fallbacks disabled: deepseek-v4-flash correctly read the card's Maybe RSVP; MiniMax-M3.1-Flash-Preview correctly read Going. Both correctly said nothing was sent. Ledger terminal messages confirm the actual providers. Different original event fixtures make this a context-handling check, not a model ranking.
  • Fresh bound-Mail regression on Lab 0466: DeepSeek saved Thursday at 2 pm as revision 4 with the other text unchanged. MiniMax saved Wednesday at 10 am as revision 5 but introduced literal backslash-n characters. After explicit chat feedback it corrected the line breaks in revision 6, also removing a dangling comma. This is a documented first-pass formatting failure, not a perfect preservation pass. Both final Email views and review payloads matched their saved drafts exactly. Back cancelled both reviews; no send approval or SMTP occurred. The Lab contains fictional mail and no copied Gmail credentials. These calls close the earlier offline model-validation gap.
  • Lab 0468 additionally checks declining first-use consent: the Enable assistant button disappears and sending remains unavailable. User test build 0469 preserves the real publication, draft, transcript, policy and provider configuration byte for byte at installation; publication, draft, transcript and provider remain unchanged after startup.

The previous 9/10 UX score remains withdrawn. DeepSeek's original Photos/YouTube captions still clip; MiniMax's Calendar response includes unnecessary implementation wording. This pass validates L0 templates, not every full Splash bundle. Repeated user acceptance, cold-open latency and the full IME/accessibility/account-switch/expiry/retry matrix remain open. Historical warm-transition measurements and physical SMTP evidence are documented separately; no new frame measurement, incoming-email trigger or send is claimed here.

Bilingual Mail workflow and current device evidence, architecture walkthroughs, phone READMEs and L0-chat docs explain the shared host versus Mail-specific boundary. Underlying L0 contracts: OctoScript #58 and OctoScript-Makepad #75.

@ymote ymote changed the title docs: propose ADR 0007 for composable Mail action cards feat(mail): compose durable reply cards with chat and host approval Oct 4, 2026
@ymote ymote changed the title feat(mail): compose durable reply cards with chat and host approval feat(mail): share a saved reply across native chat, editing and approval Oct 4, 2026
@ymote ymote changed the title feat(mail): share a saved reply across native chat, editing and approval feat(mail): expand Glance summaries into a shared reply workspace Oct 5, 2026
@ymote ymote changed the title feat(mail): expand Glance summaries into a shared reply workspace feat(mail): promote Glance cards into resident full-screen workspaces Oct 5, 2026
@ymote ymote changed the title feat(mail): promote Glance cards into resident full-screen workspaces feat(glance): retain full-screen app workspaces with contextual agent chat Oct 5, 2026
@ymote
ymote force-pushed the docs/adr-mail-composable-action-cards branch from f62496e to 8dd8f66 Compare October 5, 2026 05:17
@ymote

ymote commented Oct 5, 2026

Copy link
Copy Markdown
Contributor Author

Local CI passed on 8e3112f (tools/ci-local.sh --only all, 22m33s, Darwin arm64).

GitHub would run for this PR: desktop.yml, phone.yml, apps.yml, rom.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 45s
desktop.yml / desktop One copy of every shell source PASS -
desktop.yml / desktop Desktop tools and scripts PASS 20s
desktop.yml / desktop One Makepad, App Hub, octos and Rinx in the locked graph PASS 6s
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 Validate launcher icons and Apple asset catalogs PASS 10s
phone.yml / home Compile Home and its bundled modules PASS 1m42s
phone.yml / home Verify the single runtime graph PASS 1s
phone.yml / home The native apps' generated places match native-apps.json PASS 0s
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 3m05s
phone.yml / home Test Home, App Hub admission and runtime policy PASS 7m38s
phone.yml / home Two-lane scenario (real kernel, scripted model) PASS 30s
apps.yml / services python3 tools/setup.py PASS 1s
apps.yml / services Kernel service PASS 20s
apps.yml / services App peers PASS 24s
apps.yml / services AI providers config PASS 8s
apps.yml / services L0 in-card chat (sys.chat, host side) PASS 3s
apps.yml / services System toolbox (workflow templates) PASS 2m02s
apps.yml / kernel-security python3 tools/setup.py PASS 1s
apps.yml / kernel-security The pinned octos revision PASS 0s
apps.yml / kernel-security Build octos (unless cached) PASS -
apps.yml / kernel-security Real-kernel tests PASS 39s
apps.yml / apps python3 tools/setup.py PASS 0s
apps.yml / apps Host services (Mail, AI providers, News) PASS 1m02s
apps.yml / apps Shell AI services (crates/ai-host) PASS 1m42s
apps.yml / apps AppCard runtime setup safeguards PASS 0s
apps.yml / apps AppCard clippy (own crates; shared runtime compiles) PASS 42s
apps.yml / apps AppCard transport and store PASS 13s
apps.yml / apps One Makepad, App Hub, octos and Rinx in the locked graph PASS 10s
rom.yml / product python3 -m unittest discover -s tests -v PASS 36s
rom.yml / product Check generated Agent Binder client PASS 0s
rom.yml / product bash -n scripts/stage-forks.sh scripts/publish-release.sh scripts/apply-to-tree.sh scripts/build-rom.sh PASS -
rom.yml / web-installer npm ci --ignore-scripts --no-audit --no-fund PASS 5s
rom.yml / web-installer npm test PASS 1s
rom.yml / web-installer npx playwright install --with-deps chromium PASS 1s
rom.yml / web-installer npm run test:browser PASS 4s
rom.yml / web-installer python3 -m unittest discover -s tests -p test_installer_manifest.py -v PASS 0s
rom.yml / web-installer bash -n scripts/release.sh PASS -

Notes:

  • GitHub runs Python 3.12; this run used Python 3.9.6
  • apps.yml:services runs on ubuntu-latest in GitHub; here on macOS, so #[cfg(target_os = "linux")] code in it is not exercised (--linux-host runs it on Linux)
  • apps.yml:kernel-security runs on ubuntu-latest in GitHub; here on macOS, so #[cfg(target_os = "linux")] code in it is not exercised (--linux-host runs it on Linux)

@ymote
ymote merged commit a2a0524 into main Oct 5, 2026
7 checks passed
ymote added a commit that referenced this pull request Oct 5, 2026
#326 merged while the guides were being rewritten. These changes bring
its facts into the README and the guides, each checked in the code.

- Mail's agent can draft replies and propose sending them
  (mail.propose_reply, mail.draft, mail.suggest_reply,
  mail.propose_send). It has no tool that sends. Only the person
  sends, by approving the exact message on the host's review with a
  physical touch. Developer mode and standing rules cannot authorize
  a send, and desktop approval is not built yet.
- An opened card is a workspace: full screen on the phone, centred on
  the desktop. It has Card / Chat tabs for an app with an agent, or
  Email / Chat over one saved draft for a Mail reply. A phone
  notification opens its exact card.
- Calendar ships on the phone too.
- architecture.md has a Mail-sending paragraph in section 5, a new
  trust boundary, and the worked example marked as ADR 0004's sketch,
  which ADR 0007 superseded for sending. Its disagreement list notes
  that ADR 0004 still lets standing rules approve sends.
- The walkthrough adds card workspaces to where the person talks.
- ai-services has a card-chat row, and a turn started from a card's
  chat counts as the app's own run.
- mail-agent-events covers event turns that propose a reply draft, and
  draft-bound cards surviving a restart.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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