cloud-native-prompt.md
c139 Phase 4, cloud session 1: Updates in the native app
For: New session → Cloud, repository qpoint-io/qnative, from its default branch. Written: 2026-11-13, after review stop 1 was walked. Paste everything below the rule as the session's prompt.
Build design c139's Phase 4 in this repository (qpoint-io/qnative, the GPUI native app): App Settings with its submenu, and the Settings › Updates page, with the tray's and the footer's parts, as qnative's next cycle (cycles/c<next>.updates/, the next free number on this branch, answering design:c139). Open a PR when done; don't merge it.
Read first (the design repo, qpoint-io/design on GitHub, main): cycles/c139.updates/plan.md (D1–D16, R1–R7, nine states, two eras), cycles/c139.updates/review-1.md, cycles/c139.updates/prior-art.md, the medium-A mocks app/pages/pages/native/settings-updates.vue, app/pages/pages/native/updates-tray.vue and app/data/c139-updates-mock.ts, and the sketch app/pages/cycles/design/sketches/c139-updates.vue.
Mark's rulings (2026-11-13; in review-1.md §Answered once pushed, so here in full):
- Automatically is the default, marked "(recommended)", with no first-run question.
- A quiet trace and nothing pushed: seven days of
v0.2.0 · updatedin the footer and on the tray's version line; the Updates page leads with what's new; no notification, toast or dialog. - The notes inline at partner altitude, each line citing its record; the trail one link away.
- No skip. "Not now" defers to the next quit or the next day.
- The notes are drafted automatically, summarised from the commit messages, with room for manual additions (engineering and design now, product later): render a notes block with the generated lines and a separate "Added by the team" section.
- One page and one Update; the app and qcontrol each in its own row with its own state; after a quiet install qcontrol's part waits on the page (it needs an administrator).
- Restart at quit, at the machine's restart, or after ten idle minutes with the window in the tray, only under D13's guard (no focus taken; no developer stream, mechanic session, open request from HQ, tour or capture running).
- The tag with the 7-character SHA in the partner era (
0.2.0 · a3f9e12), with Copy version info for bug reports. - An App Settings rail item with a submenu (the web layer's submenu pattern, NavVerticalSubmenu: a parent item with its pages nested under it) grouping General · Updates · Notifications · Data · Developer; ⌘, opens it; the tray menu gets "Check for updates…" and "Settings…". Only Updates is built in this cycle; the other four are stub pages that say what will live there (Data: the world switch; Developer: c138's toggle; Notifications points to Safety & Security → Settings, where design c147's noise control lives).
- Ask me first never prompts: it says how long the update has waited, "ready since Tuesday" in the tray and footer after three days; an install 60 days without an update gets one tray line, at most once a month, under any preference.
- The era comes from the feed (
channel,notes.audience), not from a flag in the app.
Tyler's six dependencies (T1 signing, T2 the updater, T3 the feed, T4 qcontrol's update, T5 a package manager or MDM, T6 restart mechanics) stay open. Build against an Updater trait with a fixture implementation that walks every state, and a feed fixture in the synthetic worlds (as the mock's sidecar has it). Don't implement downloading or replacing binaries; do keep the guard (call 7) and the state machine as tested logic.
Done means: the App Settings submenu and the Updates page in every state (up to date, checking, available, downloading, ready, installed, failed, offline, managed, and the later era's channel switch and policy slot), the tray menu items and the footer trace; a story per state per synthetic world with region-text tests, cargo test green; the cycle's CYCLE.md and its CYCLES.md entry; a PR whose description lists what was built, what is stubbed, and Tyler's six.
Merge risk: local work not yet on GitHub also touches the rail (crates/app/src/shell.rs, router.rs): qnative c13 (design c147, Safety & Security → Findings · Settings) and qnative c7's open PR (the rail restyled like the web app's). Keep your rail change small and in one place, and say so in the PR.