Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
80fd8c8
docs(computer-use): approach - replicate the mobile-use stack on desktop
siddWednesday Aug 11, 2026
3739d6e
docs(computer-use): build plan with dated timeline
siddWednesday Aug 11, 2026
562f2ee
docs(computer-use): compress timeline for solo AI-assisted development
siddWednesday Aug 11, 2026
a9ac675
docs(computer-use): phase 0 shared-repo setup + mobile sequencing note
siddWednesday Aug 11, 2026
34d0290
docs(computer-use): record decision status; break out the after-v1 mo…
siddWednesday Aug 11, 2026
259095c
docs(computer-use): per-phase repo column + write-access dependency
siddWednesday Aug 11, 2026
eb96d1c
docs(computer-use): agent-browser rail, reuse list, brand guidelines,…
siddWednesday Aug 12, 2026
0a4e563
feat(actions): transport-agnostic approval seam with risk classes
siddWednesday Aug 12, 2026
2aa9411
feat(packaging): TCC usage strings for the computer-use semantic rail
siddWednesday Aug 12, 2026
8f4cfc4
docs(computer-use): lock @offgrid/use package name (lead confirmed)
siddWednesday Aug 12, 2026
614b79f
feat(actions): native helper invoker + EventKit calendar backend
siddWednesday Aug 12, 2026
acb0f0a
feat(actions): wire calendar tools into the chat loop, gated + shipped
siddWednesday Aug 12, 2026
45b7283
feat(actions): add Reminders to the semantic rail
siddWednesday Aug 12, 2026
85e88c2
feat(actions): add Contacts lookup to the semantic rail
siddWednesday Aug 12, 2026
421b9df
feat(actions): add Messages and Mail send to the semantic rail
siddWednesday Aug 12, 2026
0fde34b
feat(actions): add open_url to the semantic rail
siddWednesday Aug 12, 2026
c5205ec
build(mac): stage the native actions helper in local builds
siddWednesday Aug 12, 2026
4fa6ec6
fix(actions): accept timezone-less local times in the helper
siddWednesday Aug 12, 2026
ab803db
Merge remote-tracking branch 'origin/main' into feat/computer-use
siddWednesday Aug 12, 2026
c5fb3c6
docs(computer-use): reframe around the proactive assistant model
siddWednesday Aug 12, 2026
493212d
docs(computer-use): compress the plan to a 2-week sprint
siddWednesday Aug 12, 2026
9c7b3e7
docs(computer-use): design brief for the proactive-assistant demo
siddWednesday Aug 12, 2026
5f7bd02
docs(computer-use): ground the demo brief in the real app
siddWednesday Aug 12, 2026
ba3b95c
docs(computer-use): competitive + prior-art research
siddWednesday Aug 12, 2026
50025ec
docs(computer-use): add PBD research blueprint + two sharper lessons
siddWednesday Aug 12, 2026
e94f6d9
docs(computer-use): make the demo brief match the real app + add evid…
siddWednesday Aug 12, 2026
9926bca
docs(assistant): high-level act-pipeline architecture + decisions + o…
siddWednesday Aug 13, 2026
11d9bd5
docs(assistant): name the actuation layer 'the rails' (canonical)
siddWednesday Aug 13, 2026
6644d4b
docs(assistant): add the brain-and-rails component diagram (ports and…
siddWednesday Aug 13, 2026
1329fe7
docs(assistant): TRD/PRD diagrams - C4 sys arch, swimlane, user flows
siddWednesday Aug 13, 2026
ed8ba94
docs(assistant): fold C4/swimlane/user-flow diagrams into the archite…
siddWednesday Aug 13, 2026
6f7780a
docs(assistant): reshape plan to release-led + Windows from day 1
siddWednesday Aug 13, 2026
27d01bb
docs(assistant): make it a 12-day plan (Windows heavy-rail parity as …
siddWednesday Aug 13, 2026
40fd7cc
docs(assistant): port-from map (incl. mobile) + shorten to a 10-day plan
siddWednesday Aug 13, 2026
6dc8c01
docs(assistant): deep port-vs-bespoke research map across the whole s…
siddWednesday Aug 13, 2026
a2d65a3
docs(plan): name the specific ports per release (from PORTING_MAP)
siddWednesday Aug 13, 2026
acb9699
docs: sanitize the assistant doc set; crown the plan as the build doc
siddWednesday Aug 13, 2026
db3185b
docs(r1): execution checklist - 19 commit-sized boxes with done-when …
siddWednesday Aug 13, 2026
c24ff46
feat(use): consume @offgrid/use from the shared sibling (R1 box 1)
siddWednesday Aug 13, 2026
1b43ed3
docs(r1): tick box 1 - @offgrid/use scaffolded and consumed
siddWednesday Aug 13, 2026
b91dbc5
chore(use): record @offgrid/use's zod dependency in the lock
siddWednesday Aug 13, 2026
6621b93
docs(r1): tick box 2 - the Action contract is in; box 1 wording match…
siddWednesday Aug 13, 2026
84deb91
chore(use): record @offgrid/use's xstate dependency in the lock
siddWednesday Aug 13, 2026
b8c89b8
docs(r1): tick box 3 - the lifecycle machine is in with crash-resume …
siddWednesday Aug 13, 2026
fa345b8
chore(use): lock refresh for @offgrid/use manifest
siddWednesday Aug 13, 2026
bfc7a12
docs(r1): tick box 4 - the durable queue is in; Day 1 of R1 complete
siddWednesday Aug 13, 2026
3372941
chore(use): record @offgrid/use's @noble/hashes dependency in the lock
siddWednesday Aug 13, 2026
1c2eeac
docs(r1): tick boxes 5 and 6 - retry policy and the bound gate are in
siddWednesday Aug 13, 2026
85f23ac
docs: three fixes from external review - offline scope, escalation ru…
siddWednesday Aug 13, 2026
cf68106
docs(r1): tick box 7 - the port, the registry, and the effect journal…
siddWednesday Aug 13, 2026
5ad4f4b
docs(porting): evaluate OpenWorkflow - right shape, wrong storage, st…
siddWednesday Aug 13, 2026
0b4538e
docs(r1): tick box 8 - the engine checkpoint passes; Day 2 of R1 comp…
siddWednesday Aug 13, 2026
260a05a
feat(actions): the use-engine storage adapter on the app database (R1…
siddWednesday Aug 13, 2026
f19caf9
docs(r1): tick box 9 - the engine runs on the app database
siddWednesday Aug 13, 2026
9189ee7
feat(actions): the semantic rail behind the DeviceController port (R1…
siddWednesday Aug 13, 2026
894bb4e
docs(r1): tick box 10 - the semantic rail is mapped and guarded
siddWednesday Aug 13, 2026
be3bfcd
feat(actions): the gate host - the engine's approval callback on the …
siddWednesday Aug 13, 2026
2363fa5
docs(r1): tick box 11 - the gate host bridges the engine to the appro…
siddWednesday Aug 13, 2026
92d4a37
feat(actions): emission hardening - schema wire, SAP repair ladder, b…
siddWednesday Aug 13, 2026
01a49fa
docs(r1): tick box 12 - emission hardening is in
siddWednesday Aug 13, 2026
78d6827
feat(actions): chat mutations run through the durable engine (R1 box 13)
siddWednesday Aug 13, 2026
3cc40b6
docs(r1): tick box 13 - chat mutations are durable; app-testable on m…
siddWednesday Aug 13, 2026
e216c4f
feat(tools): assistant actions are Tools, on by default; Connectors s…
siddWednesday Aug 13, 2026
2b023f9
feat(actions): read-back verification - done means observed (R1 box 14)
siddWednesday Aug 13, 2026
e1b5f9d
docs(r1): tick box 14 - read-back verification is live
siddWednesday Aug 13, 2026
15021fc
test(e2e): the R1 golden path - a chat ask becomes a durable, verifie…
siddWednesday Aug 13, 2026
51f2b39
docs(r1): tick box 15 - golden-path evidence captured and validated
siddWednesday Aug 13, 2026
35f2320
fix(test): green the suite in core-only + Electron-hosted environment…
siddWednesday Aug 14, 2026
cdd4aba
fix(test): await startModelServer before fetching it - a scheduling race
siddWednesday Aug 14, 2026
0fc8c9c
test(actions): close the new-code coverage gaps - all four floors met
siddWednesday Aug 14, 2026
7da5867
chore(pro): stop tracking six pro test files that belong to desktop-pro
siddWednesday Aug 14, 2026
32d7147
ci(win): windows-build checks out shared; both workflows build @offgr…
siddWednesday Aug 14, 2026
58340a7
feat(actions): the Windows semantic rail - local Outlook first (R1 bo…
siddWednesday Aug 14, 2026
9a7f212
docs(r1): tick box 16 - the Windows CI build of this branch is green
siddWednesday Aug 14, 2026
e83198a
fix(tools): break the tools <-> extension-select cycle structurally
siddWednesday Aug 14, 2026
763439e
docs(plan): the re-cut - R2 is full rails + Approval UX v2; reasoning…
siddWednesday Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,17 @@ jobs:
mkdir -p resources/bin
cp scripts/dictation-hotkey/dictation-hotkey resources/bin/dictation-hotkey
chmod +x resources/bin/dictation-hotkey
# Compile the native actions helper (EventKit) and stage it into resources/bin so
# extraResources bundles it at Contents/Resources/bin — the path runNativeAction
# resolves. Self-contained: no committed binary, built fresh against the pinned
# target. If it ever fails to ship, the calendar tools report "not available" and
# the rest of the app is unaffected, so it can't break a release.
- name: Build native actions helper (computer use, semantic rail)
run: |
bash scripts/build-actions-helper.sh
mkdir -p resources/bin
cp scripts/actions-helper/actions-helper resources/bin/actions-helper
chmod +x resources/bin/actions-helper
# Stage the Parakeet STT runtime (sherpa-onnx CLI + ONNX model) into
# resources/bin/parakeet. Additive: with SHERPA_ONNX_URL / PARAKEET_MODEL_URL
# unset this is a no-op and transcription stays on whisper, so it can't break a
Expand Down Expand Up @@ -228,6 +239,10 @@ jobs:
# drifted lock stops the release instead of resolving a graph nobody committed.
npm --prefix ../shared ci
npm --prefix ../shared/packages/sync run build
# @offgrid/use (the durable action engine) is consumed the same way as sync
# and needs the same explicit build - file-dep prepare alone does not emit
# its dist/ types before the typecheck runs.
npm --prefix ../shared/packages/use run build
- name: Install dependencies
run: npm ci
# Stamp the resolved version into package.json so electron-builder picks the
Expand Down Expand Up @@ -468,6 +483,10 @@ jobs:
# drifted lock stops the release instead of resolving a graph nobody committed.
npm --prefix ../shared ci
npm --prefix ../shared/packages/sync run build
# @offgrid/use (the durable action engine) is consumed the same way as sync
# and needs the same explicit build - file-dep prepare alone does not emit
# its dist/ types before the typecheck runs.
npm --prefix ../shared/packages/use run build
- name: Install dependencies
run: npm ci
- name: Fetch Windows native binaries (llama/whisper/sd/ffmpeg)
Expand Down
37 changes: 37 additions & 0 deletions .github/workflows/windows-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,43 @@ jobs:
with:
python-version: '3.12'

# `@offgrid/sync` and `@offgrid/use` are file: dependencies on the shared
# monorepo, so it must sit BESIDE this checkout before `npm ci` runs -
# mirrors release.yml's build-win. The branch ref decides the shared ref:
# a build from an integration branch takes the shared branch of the same
# name when one exists, else shared main.
- name: Checkout shared at the matching ref
id: shared_branch
continue-on-error: true
uses: actions/checkout@v4

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 security Mutable action handles build credentials

The new shared-repository checkout uses mutable actions/checkout@v4 while receiving CI_CROSS_REPO_TOKEN, leaving branch packaging credentials and installer output exposed to an upstream tag repoint; pin this step and its fallback to the immutable checkout SHA already used in release.yml.

How this was verified: The changed checkout steps pass CI_CROSS_REPO_TOKEN to actions/checkout@v4, while the equivalent release steps use a full commit SHA.

with:
repository: off-grid-ai/shared
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
ref: ${{ github.ref_name }}
path: _shared
persist-credentials: false
- name: Fall back to shared main
if: ${{ steps.shared_branch.outcome != 'success' }}
continue-on-error: true
uses: actions/checkout@v4
with:
repository: off-grid-ai/shared
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: _shared
persist-credentials: false
- name: Put shared beside this checkout
shell: bash
run: |
if [ ! -d _shared ]; then
echo "::error::off-grid-ai/shared was not checked out - @offgrid/sync and @offgrid/use cannot resolve. Check CI_CROSS_REPO_TOKEN."
exit 1
fi
rm -rf ../shared
mv _shared ../shared
npm --prefix ../shared ci
npm --prefix ../shared/packages/sync run build
npm --prefix ../shared/packages/use run build

- name: Install dependencies
run: npm ci

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ test-results/
# Marketing material (dev.to drafts, emails, assets) — publishing, not app code
/marketing/
scripts/dictation-hotkey/dictation-hotkey
scripts/actions-helper/actions-helper

# Local demo profile — synthetic-data run target for `npm run demo` (never real userData)
.demo-profile/
Expand Down
320 changes: 320 additions & 0 deletions docs/ASSISTANT_ARCHITECTURE.md

Large diffs are not rendered by default.

115 changes: 115 additions & 0 deletions docs/COMPETITIVE_RESEARCH.md

Large diffs are not rendered by default.

202 changes: 202 additions & 0 deletions docs/COMPUTER_USE.md

Large diffs are not rendered by default.

118 changes: 118 additions & 0 deletions docs/COMPUTER_USE_PLAN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# The proactive assistant - build plan and timeline

Companion to `COMPUTER_USE.md` (the product model), `ASSISTANT_ARCHITECTURE.md` (the system design), and `PORTING_MAP.md` (the port-vs-bespoke research).

> **This is the doc to build from.** Work release by release, top to bottom: a release is not done until its checkpoint passes, and the next release does not start until it does. The other three docs are references. Adjust the plan here at each checkpoint; never fork a second plan.

**Re-cut (August 14, 2026 - the lead's steer + R1 field feedback).** The release after R1 is **all four rails, chat-driven, on both platforms**, plus the approval UX rebuild the R1 pro-path test demanded. The reasoning engine (proactive) and routines move after it. R1 itself is done: 17/19 checklist boxes, both PRs open and green (OGAD #81, shared #4).

**Standing assumptions**

- Solo developer, AI authoring the code end to end.
- Release-led: each release is a real, demoable, shippable increment. Desktop = macOS + Windows.
- **Port the plumbing, build the product** - each release names its ports (all MIT / Apache-2.0 / BSD, all in-process); the full map is `PORTING_MAP.md`.
- **Offline scope, stated precisely.** The brain runs with zero network on every platform. An action whose effect lives on an external service needs that service reachable at execution time - so the rails prefer local apps whose writes land locally and sync later (EventKit / Mail on macOS, local Outlook on Windows), and online-only actions are labeled honestly.
- **Reliability rules the router must honor** (architecture doc, Section 4): effect-verification lives in the engine; a cross-rail escalation is a re-fire under the same retry policy - a non-retryable action never escalates. The DeviceController routing is a thin layer over these.
- Checkpoint discipline: a checkpoint is a verifiable, demoable milestone.

## Build guidelines (standing, all releases)

- **Design** - `off-grid-ai/brand` `DESIGN_PHILOSOPHY.md`: brutalist/terminal, Menlo, emerald-only accent, black/white base, hierarchy by size and weight not color, no gradients, no emojis. All values from `@offgrid/design` tokens. Desktop density per `docs/DESIGN.md`.
- **Copy** - `off-grid-ai/brand` `brand_tone_voice.md` + outcomes-first: no em dashes, no curly quotes, no exclamation marks, banned-word list applies.
- **Cross-platform from the seam.** Callers depend on the `DeviceController` port and the shared engine, never on a concrete OS.
- **Port before writing.** Check `PORTING_MAP.md` / `COMPUTER_USE.md` Section 9 first; verify the license at the point of adoption; honor the AGPL / source-available avoid-list.

## Releases

| Release | What ships | Status |
| --- | --- | --- |
| **R1. Chat actions on the durable engine** | The semantic rail in chat on macOS (reminders, calendar, messages, mail, open, lookups) through the `@offgrid/use` engine: durable queue, payload-hash gate, retry-once-with-verify, read-back verification, effect journal. Windows toolchain green (installer artifact); the Windows semantic rail (local Outlook COM) built behind the port. | **Done.** PRs: OGAD #81, shared #4. Record: `R1_CHECKLIST.md` |
| **R2. Full rails in chat, both platforms + Approval UX v2** | Windows chat exposure; the browser rail (watched web tasks, takeover at login); the vision rail (supervised GUI actions, UI-TARS-1.5-7B); the approval experience rebuilt (inline in chat, outcome feedback, risk-tiered auto-run); the safety pass. ~5-6 working days. | **next** |
| **R3. Notices you** (was R2) | Reasoning + resolve + gate: commitment/gap detection over Replay, memory-resolved slots with confidence, the proactive Day surface. Cross-platform (memory + LLM). Pro-side code lands in desktop-pro (access in place). ~3 days. | after R2 |
| **R4. Routines** (was R3) | Record-by-showing + self-healing, per-step-verified replay (OpenAdapt design). macOS-first; the Windows UIA adapter as the fast-follow (napi-rs over the `uiautomation` crate + SendInput, Terminator head-start). ~2-3 days + fast-follow. | after R3 |

The split: `shared` holds the durable cross-platform brain (`@offgrid/use`, reused by mobile later); this repo holds the rails, surfaces, and product integration; pro business logic lands in `desktop-pro`.

## R1 - chat actions on the durable engine (DONE)

Shipped scope, guarantees, and evidence live in `R1_CHECKLIST.md` and the PR bodies. Merge order: **shared #4 before OGAD #81** (main's CI resolves `@offgrid/use` from shared main). The release DISPATCH waits for R2 per the re-cut - one versioned release ships both.

**R1 field verdicts driving R2** (from the pro-path smoke test):

- Approving a card gives no completion feedback - the chat message says "pending" forever and nothing reports the run. (The engine path already reports verified outcomes; the legacy pro path is the old system.)
- Reversible simple actions (a reminder) should not need a human gate at all.
- Chat-originated approvals belong INLINE in the conversation, not on a separate screen; the Actions screen's job is unattended actions (proactive, scheduled) plus the audit log.

## R2 - full rails in chat, both platforms + Approval UX v2 (~5-6 days)

Everything chat-drivable on both OSes, honestly tiered, with an approval experience that reads like a conversation instead of a queue.

### A. Windows chat exposure (~1 day)

- Per-platform tool specs: win32 exposes the engine-routed set the Outlook rail supports (calendar_create_event, reminders_create, mail_send, open_url); reads stay macOS-only until the Outlook read verbs land.
- A win32 inline runner for open/navigate; the engine path handles mutations end to end (the rail shipped in R1).
- Outlook read-back verifiers (list verbs mirroring the mac ones) so Windows gets verified outcomes too.

### B. Approval UX v2 (~1-1.5 days, core + desktop-pro)

- **Inline approval card in chat**: resolved values + Approve / Edit / Reject in the conversation flow, driven by the engine gate (`resolveActionGate`). The Actions screen remains the queue for unattended actions plus the audit log.
- **Outcome feedback everywhere**: approve -> the engine executes -> the verified result lands back in the chat turn and on the card ("Created - verified", or the honest failure). This is the pro approval-executor migration: pro's queue resolves the engine gate instead of running its own executor, so payload binding and verification hold on the pro path too.
- **Risk-tiered gating** (decision 8.3's lean, now policy): reads/navigate free; reversible mutations (reminder, calendar) auto-run with a verified confirmation and an Undo affordance; sends and irreversible actions keep the gate.

### C. The browser rail (~1.5-2 days) - cross-platform on arrival

- Embedded pane over Electron's `webContents.debugger` (raw CDP): **nanobrowser's** TS dom module + overlay as starting code, **browser-use's** snapshot + AX-merge + numeric-index as the algorithm, **Stagehand's** act/observe/extract + Zod as the API.
- Chat-drivable web tasks (check-in, ordering) - watched live, takeover at any login/identity step, gated at the identity boundary.

### D. The vision rail (~1.5-2 days) - the supervised tier, labeled so

- **UI-TARS-1.5-7B** catalog entry (Apache-2.0, GGUF + mmproj published; a ~5GB download via the Models screen); **OmniParser v3** (MIT) set-of-marks fallback for the bundled model.
- The operator spine from **@ui-tars/sdk** (nut.js swapped for **@nut-tree-fork**/robotjs); mac input via CGEvent, Windows via SendInput.
- Supervised UX: the ScreenMarker-style overlay, pause-on-user-input, the kill switch (Esc halts with the keypress consumed).
- The WhatsApp file-share recipe as the showcase (behind the gate).

### E. Safety pass + the release

- Injection-resistance review (screen content is untrusted input), kill-switch e2e, per-rail verification depth honored, release-readiness checklist.
- **Checkpoint / release dispatch:** on macOS AND Windows - a semantic action, a watched web task with takeover, and a supervised vision action all run from chat, gated by tier, with verified outcomes reported inline. One versioned release: the signed/notarized .dmg + the Windows NSIS .exe (unsigned until the cert - decision open with the lead).

**R2 risks:** the vision tier on a 7B local grounder is best-effort - ship it labeled supervised or not at all; Windows browser/vision needs a human on a real Windows machine (CI proves builds, not clicks); the model download adds a Models-screen surface; Approval UX v2 touches the live chat surface (the R1 lesson stands - behavior tests per branch, the plain path untouched for non-action turns).

## R3 - notices you (was R2, ~3 days)

Scope unchanged: commitment and gap detection over the Replay observation + entity spine; the resolve layer (RAG over memory returning value + confidence); proposals surfacing on the Day feed and executing through the same engine and inline approval UX. Ports: sqlite-vec (inside the app DB), LlamaIndex.TS memory blocks, Mem0's dedup loop, Orama hybrid ranking; techniques: HippoRAG PageRank, bi-temporal facts, the WSDM commitment rubric. Pro-side code (reasoning, resolve policy, feed UI) lands in desktop-pro. Checkpoint: on a seeded profile, on both OSes, an un-actioned commitment surfaces and "send the deck I promised" resolves from context and runs, gated by tier.

## R4 - routines (was R3, ~2-3 days + the Windows fast-follow)

Record-by-showing + faithful replay per the OpenAdapt design (compiled-step schema, resolution ladder, postconditions, repair-as-diff); Playwright codegen for the browser lane; memory-resolved variable slots; the plain-language review UI. macOS AX-as-eyes with actuation capped at press/set-value; the Windows UIA adapter (reader + SendInput) as the fast-follow. Checkpoint: record a routine once; it replays per-step-verified with a slot resolved from memory at run time.

## Dependencies

| What | Needed by | Note |
| --- | --- | --- |
| shared #4 merged before OGAD #81 | now | main's CI resolves `@offgrid/use` from shared main |
| Windows signing cert | R2 release | wiring exists (WIN_CSC_LINK secrets); publishes unsigned until then |
| A human on a real Windows machine | R2 | browser/vision click-through + the model-load smoke (`WINDOWS_TEST_PLAN.md`) |
| UI-TARS-1.5-7B GGUF + mmproj catalog entry | R2-D | the vision model install |
| desktop-pro access | R2-B, R3 | in place (cloned at pro/) |
| Seeded memory fixtures | R3 | detection + resolution tests without a live profile |
| OpenAdapt trace/replay port + the `axuielement` napi addon | R4 | the recorder + the mac AX read |

## Risks

| Risk | Mitigation |
| --- | --- |
| Vision reliability (the frontier ceiling) on a local 7B | supervised tier, labeled; cheapest-rail-first routing; set-of-marks fallback; the gate on everything consequential |
| Approval UX v2 touches the live chat surface | behavior tests per branch; the plain path stays untouched for non-action turns |
| The Windows human-testing gap | recorded dependency; release notes honest about machine-verified vs human-verified |
| Solo schedule | releases independently valuable; scope trims at the tail (the vision showcase, Windows polish), never the shipped core |

## Out of scope (unchanged)

The mobile adapter (post-v1: Appium/WebdriverIO + DroidRun Portal + GUI-Owl-1.5/Qwen3-VL), background/headless autonomous runs, store distribution.

## Tracking

- R1 record: `R1_CHECKLIST.md`. R2 gets its own checklist when it starts.
- Small commits per verified unit, merge not squash. PR evidence rules apply.
- Checkpoint review against this doc at each release; plan changes are edits here.
Loading
Loading