Prune Iris TODO and prioritize color correctness
This commit is contained in:
1 parent
8c6e2ed9cf
commit
5428cd75c9
4 files changed
+123
-335
No files matched your search
+56
-45
@@ -44,7 +44,7 @@ the log of settling it. Currency means this file says where things *are*,
|
||||
not how they got here. What survives a prune is what cannot be cheaply
|
||||
re-derived: measurements, dead ends, invariants and their reasons.
|
||||
|
||||
## Where things stand (2026-09-08)
|
||||
## Where things stand (2026-09-09)
|
||||
|
||||
- **The framework is decided and built on.** iris draws the transcript
|
||||
screen on the desktop, on this checkout's emulator and on Iris's phone.
|
||||
@@ -56,8 +56,8 @@ re-derived: measurements, dead ends, invariants and their reasons.
|
||||
`app-rust/`, and `iris/` is the UI framework alone. See "One app crate"
|
||||
at the end -- it is the layout everything else here assumes.
|
||||
- **Open across the rest of the docs**: `docs/IRIS_TODO.md` is iris's own
|
||||
list (streaming re-layout is the live one), `docs/TODO.md` is the Compose
|
||||
app's.
|
||||
list (colour-space correctness is the live one), `docs/TODO.md` is the
|
||||
Compose app's.
|
||||
|
||||
## Desktop and phone share the code (Iris, 2026-09-07)
|
||||
|
||||
@@ -795,6 +795,13 @@ device.
|
||||
repository; adding the component here or pushing only `ai-app-2` is the
|
||||
wrong delivery path.
|
||||
|
||||
**Bench-only cleanup still open**: the diagnostics report pane draws
|
||||
over transcript rows. Reproduced on the emulator on 2026-09-09 by
|
||||
opening the named `Diagnostics` control. `REPORT_MAX_HEIGHT_DP`
|
||||
constrains its claimed height, but the pane is neither masked nor
|
||||
scrollable despite its construction comment saying it is both. This is
|
||||
an `app-rust` bench-screen defect, not an iris framework item.
|
||||
|
||||
- [ ] **P1 — session screen parity.** **Started 2026-09-06, on Iris's
|
||||
word**: "just continue with the plan for now; try to move towards
|
||||
feature parity for the transcript screen so that the test can be
|
||||
@@ -814,6 +821,13 @@ device.
|
||||
group, each card carries its state and summary, and the five
|
||||
`ToolState` values each have their own appearance.
|
||||
`tool.rs`'s module doc has what was chosen.
|
||||
- [ ] **Before the next parity slice — make iris's colour pipeline
|
||||
correct.** Raised by Iris on 2026-09-09 as something to settle
|
||||
sooner rather than later. Both backends currently prefer an
|
||||
sRGB surface while the shader returns palette/image bytes as
|
||||
linear values; `IRIS_TODO.md` has the measured mismatch and
|
||||
pass condition. Do this before judging or centralising the
|
||||
app's styling. It is correctness, not cosmetic polish.
|
||||
- [ ] **P1c — history paging and jump-to-latest.** Wire
|
||||
`client::transcript_source` into `src/ui`:
|
||||
the opening page, paging back on scroll with the cushion
|
||||
@@ -836,14 +850,12 @@ device.
|
||||
recomposition-equivalent per keyboard toggle (the
|
||||
`iris insets:` log line count).
|
||||
|
||||
History paging backward (with the
|
||||
page-boundary healing `app-rust`'s `client` does not have yet, below),
|
||||
`TranscriptSource`-backed cache/server stitching, jump-to-latest,
|
||||
tool-call cards and grouping, the session settings dialog, composer
|
||||
attachments, and the keyboard/insets behaviours AGENTS.md's "Things
|
||||
that have bitten" names (the floating-composer bug, `adjustResize`,
|
||||
the `imePadding`-vs-raw-inset rule). This is the highest-risk step:
|
||||
it is the screen the app is used for, every hour of the day.
|
||||
The remaining screen work is history paging and jump-to-latest, the
|
||||
session settings and usage dialogs, images and composer attachments,
|
||||
and the keyboard/insets behaviours AGENTS.md's "Things that have
|
||||
bitten" names (the floating-composer bug, `adjustResize`, the
|
||||
`imePadding`-vs-raw-inset rule). This is the highest-risk step: it is
|
||||
the screen the app is used for, every hour of the day.
|
||||
|
||||
**Kotlin it replaces**: `SessionScreen.kt`, `TranscriptList.kt`,
|
||||
`SessionSettingsDialog.kt`, `ToolInput.kt`, `ToolRows.kt`,
|
||||
@@ -856,29 +868,30 @@ device.
|
||||
already covers the row/markdown/selection/composer core these sit
|
||||
on top of or beside.)
|
||||
|
||||
**`app-rust`'s `client` needed, and what is not yet covered and must be
|
||||
ported first** (`CLIENT_CORE.md`): `TranscriptSource.kt` (deciding
|
||||
cache vs. server per page and stitching them — "not started"),
|
||||
`TranscriptItems.kt`'s `joinPages`/`healSplitMessage`/`adoptRun`
|
||||
(page-boundary healing — "not ported," and paging backward is
|
||||
exactly what exercises it), the markdown *block* model beyond
|
||||
syntax spans (headings/lists/tables/fences as distinct nodes —
|
||||
"not started," needed for `CodeFence`/`MarkdownPieces`' equivalents),
|
||||
and the attachments route (`/sessions/{id}/attachments` — "not
|
||||
covered" in `api.rs`, needed for `PendingAttachments`/`Attachment`).
|
||||
**`app-rust`'s `client` needed** (`CLIENT_CORE.md`): the paging half
|
||||
is ready — `transcript_source`, `join_pages` with seam healing, and
|
||||
`markdown_blocks` are all ported. The remaining client gap in P1 is
|
||||
the attachments route (`/sessions/{id}/attachments`), needed by P1d's
|
||||
`PendingAttachments`/`Attachment`.
|
||||
|
||||
**iris widgets missing, → `IRIS_TODO.md`'s new "Build (for the
|
||||
port)" section**: row-level accessibility names and the tappable
|
||||
link / background-chip primitive (both already listed under I5's
|
||||
leftovers — this step is what needs them, not a new ask); a
|
||||
history-paging cushion measured in on-screen viewports rather than
|
||||
a row count (the `HISTORY_SCREENS` lesson in "Things that have
|
||||
bitten," which iris's `List` has no equivalent of yet); a scaled
|
||||
thumbnail/image widget for `SessionImage`'s in-transcript images; a
|
||||
modal/dialog primitive for the session settings dialog and
|
||||
`UsageDialog` (iris has none today — check before building a second
|
||||
one for P3/P5); a horizontal gauge/bar widget for
|
||||
`SessionUsageBar`.
|
||||
**iris widgets missing, → `IRIS_TODO.md`'s "Build (for the port)"
|
||||
section**: the distance-to-unloaded-edge query P1c needs for its
|
||||
viewport-sized history cushion; per-range text backgrounds for inline
|
||||
code; a fitted image widget; one modal/dialog primitive reused by the
|
||||
settings and usage dialogs; and a horizontal gauge for
|
||||
`SessionUsageBar`. Tappable links already exist. Row accessibility
|
||||
names are app content applied through iris's existing `.label()` API,
|
||||
not a missing framework widget.
|
||||
|
||||
**`app-rust` UI defect still open**: tool-card text is not selectable.
|
||||
A `TranscriptRow::Tools` has no markdown blocks, so cards can number
|
||||
their own texts from zero without colliding with the row selection
|
||||
keys. The risk is lifecycle: every card rebuild path must unregister
|
||||
the old `TextEdit` handles before registering replacements, or the next
|
||||
long press can find a freed handle. Cover result arrival, group toggle,
|
||||
a call joining a run and the per-card widget swap with stale-handle
|
||||
tests. This uses iris's existing selection API; it is not a framework
|
||||
widget gap.
|
||||
|
||||
**Pass condition**: `app/ui-sandbox.sh`'s fixtures driven by
|
||||
`ui-trace record --do "tap '<label>'"` — a session with the big
|
||||
@@ -945,15 +958,12 @@ device.
|
||||
listed "not covered" in `api.rs`'s table and none started; each is
|
||||
real work, not a stub, per `CLIENT_CORE.md`'s own caveat.
|
||||
|
||||
**iris widgets missing**: a `BusyItem` equivalent — a row dimmed,
|
||||
drained of colour, labelled with the operation in progress, that
|
||||
does **not** block the list's own scroll/drag the way an overlay
|
||||
did on the Compose side (AGENTS.md's "Shared appearance"); a
|
||||
`uniqueItems` equivalent is logic, not a widget, and ports directly
|
||||
into `src/ui` itself; a confirmation dialog with a toggle switch,
|
||||
for the delete-with-`deleteForeign` flow, needs the same modal
|
||||
primitive P1 flagged — build it once, here or in P1, whichever
|
||||
lands first.
|
||||
**UI still needed**: `BusyItem` is app-specific appearance — a row
|
||||
dimmed, drained of colour and labelled with the operation in progress
|
||||
without blocking the list's scroll — so it belongs in `src/ui`, not
|
||||
iris. `uniqueItems` is app logic there too. Iris itself still needs
|
||||
the modal primitive P1 flagged and a toggle switch for the
|
||||
delete-with-`deleteForeign` flow.
|
||||
|
||||
**Pass condition**: `ui-trace` tap-by-name on all four tabs against
|
||||
`ui-sandbox.sh`'s fixtures; the two-copies-of-one-session-id
|
||||
@@ -1043,9 +1053,10 @@ push, in the session that picked the task up.
|
||||
`main` and not in `ai-app`. Nothing on this branch is production until
|
||||
Iris says so. Commit and push as you go.
|
||||
3. The E- and I-steps (the framework decision) are done — iris won,
|
||||
decided 2026-09-05. Take the next unchecked P-box in "## The
|
||||
port, in order (decided 2026-09-05)"; **P1 — session screen parity —
|
||||
is next.**
|
||||
decided 2026-09-05. **Fix iris's colour-space pipeline first**, as Iris
|
||||
requested on 2026-09-09; then take P1c, history paging and
|
||||
jump-to-latest. The client-side paging pieces it needs are already
|
||||
ported.
|
||||
4. Every step ends with its measurement written into this file beside the
|
||||
box, and the box ticked or the reason it could not be written in its
|
||||
place. A step that is blocked says by what, not "later". Write it as you
|
||||
|
||||
Reference in new issue
Block a user