Iris: "the organization of the rust rewrite is a mess right now... there shouldn't be anything related to the app inside of iris. Iris is supposed to be the UI framework alone." And, on the crate count: "I'm confused why the app only code needs more than one crate though." Nine cargo workspaces become three, and the port's project code -- which sat in five places, four of them inside the framework -- becomes one crate, `ai-app`, in `app-rust/`: client-core -> app-rust/src/client iris/transcript-ui -> app-rust/src/ui iris/transcript-fixture -> app-rust/src/ui/fixture.rs + tests/ + touch/ iris/desktop-app -> app-rust/src/desktop + src/bin_desktop.rs iris/android-app -> app-rust/src/android + android-project/ android-shell -> app-rust/src/shell iris/ keeps core, macro, the iris crate, tabs-ui and rig-input, and now mentions no session, transcript, setup or server anywhere. Only two of the old splits had a reason that survived reading. event-model stays a crate at the repo root because server/ depends on it too, so a crate is what makes the backend and the app agree by construction. The two Android .so names looked like a hard constraint -- a package produces one library artifact -- until P2 turned out to already plan merging those two Android apps into one; both faces now come out of libai_app.so, picked apart by features so `--no-default-features --features shell` keeps wgpu, parley and iris out of the Compose app's APK. docs/RUST.md's "One app crate" has the rest, including what each remaining feature is for. DECISIONS.md and SUBAGENTS.md move into docs/ with everything else. Verified: ./run-tests.sh and `cd iris && cargo test` green, clippy and fmt clean in all five workspaces, `cargo ndk -t x86_64` links libai_app.so, build-apk.sh produces an APK that installs and launches on this checkout's emulator (Gl ... virgl, as expected), and the phone-sized headless screenshot renders the transcript unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.3 KiB
Decisions awaiting review
Choices made while working autonomously, for Bryan to keep or change. Each says what was picked and why; the detail is in the design doc it names. Delete an entry once it has been looked at.
Subagent views (2026-09-05, SUBAGENTS.md)
Made on my own judgement, limited blast radius:
- A subagent is a transcript, not a session. It has no process,
controls or settings; it is addressed as
/sessions/{id}/subagents/{sub}and stored under the session's directory, so deleting the session takes it. Alternative rejected: registering it as a session of its own, which would give it a card in the main list and a driver that can do nothing. - Read-only view is the session screen minus its controls, rather than
a second, simpler transcript screen. Keeps paging, caching, selection
and rendering in one place. Cost: a
readOnlymode threaded throughSessionScreen. - The list only carries a count. Each session row says how many
subagents it has; their titles and statuses are fetched when the card is
expanded. Keeps
GET /sessionsfrom reading every subagent transcript. Consequence: an expanded card's statuses refresh with the list, not live. - Expanded/collapsed is remembered per session on the phone, not on the server. Collapsed by default, per the transcript convention that new things arrive collapsed.
- Subagents of imported sessions are not shown. The import path still
skips
isSidechainrecords; the CLI's ownsubagents/agent-*.jsonlfiles are not read. Only subagents run while this backend was watching exist. - Echo grows
/subagent [n]as the test rig, so nothing here needs a paid turn to exercise.
Deferred, because they reach further than this feature:
-
Live status on the list. Whether the session list should follow a stream at all (it refreshes on demand today) decides whether subagent status can ever be live there. Not changed.
-
Nested subagents. A subagent's own Task calls are shown as tool calls in its transcript and are not given transcripts of their own. Supporting that is the same mechanism one level down, but the UI would need nested expanders.
-
The subagent status row says "context unknown". Nothing measures a subagent's context; the row could leave it out rather than admit it.