Composer one-row header + icon pill; Settings row alignment audit #158

Closed
opened 2026-09-26 09:35:06 +00:00 by kayg · 16 comments
Owner

Owner 2026-09-26.

Composer (the palette-capsule composer, DESIGN §38):

  • Collapse rows 1 and 2 into one header row: NLP chips (Today, 12:15 – 14:00, …) at the top LEFT, the mode switch (Log/Task/Note/Event) at the top RIGHT as an icon-only segmented pill; each mode's name shows in the warm tooltip on hover/focus (with its shortcut) and stays the accessible name.
  • The bottom action icons (#, add photo, attach, voice) become one pill (same pill material as other icon pills), left; Send stays right.
  • The surface uses the shared overlay glass (a sibling job is making that shared surface more transparent: consume its token, don't fork it).
  • Narrow widths: when chips + mode pill don't fit on one row, the chips wrap under; the mode pill never shrinks or overlaps.

Alignment audit (Settings and every list row with a leading icon/avatar):

  • Profile row: the avatar circle must be vertically centred on the two-line text block (name + username); the trailing action (Edit) centred on the same axis. Same for Passkeys rows (key icon vs 'Chrome on macOS' / 'Added … · not used yet', Rename). Today the icon sits high and the action sits low.
  • Sweep all Settings sections and similar rows (sessions, devices, members, shares, plugins) for the same bug; fix it once in the shared row component (reuse gate).
  • Add a layout-sweep check that asserts leading-icon centre ≈ text-block centre ≈ trailing-action centre (±1px) for these rows.

Screenshots light + dark, 1440 and 390, attached for Claude's review.

Owner 2026-09-26. Composer (the palette-capsule composer, DESIGN §38): - Collapse rows 1 and 2 into one header row: NLP chips (Today, 12:15 – 14:00, …) at the top LEFT, the mode switch (Log/Task/Note/Event) at the top RIGHT as an icon-only segmented pill; each mode's name shows in the warm tooltip on hover/focus (with its shortcut) and stays the accessible name. - The bottom action icons (#, add photo, attach, voice) become one pill (same pill material as other icon pills), left; Send stays right. - The surface uses the shared overlay glass (a sibling job is making that shared surface more transparent: consume its token, don't fork it). - Narrow widths: when chips + mode pill don't fit on one row, the chips wrap under; the mode pill never shrinks or overlaps. Alignment audit (Settings and every list row with a leading icon/avatar): - Profile row: the avatar circle must be vertically centred on the two-line text block (name + username); the trailing action (Edit) centred on the same axis. Same for Passkeys rows (key icon vs 'Chrome on macOS' / 'Added … · not used yet', Rename). Today the icon sits high and the action sits low. - Sweep all Settings sections and similar rows (sessions, devices, members, shares, plugins) for the same bug; fix it once in the shared row component (reuse gate). - Add a layout-sweep check that asserts leading-icon centre ≈ text-block centre ≈ trailing-action centre (±1px) for these rows. Screenshots light + dark, 1440 and 390, attached for Claude's review.
Author
Owner

Started #158 on branch job/composer-align at base c2a81aeab9fd6090cb4eba448af5835c4877e7de; dev points to the same SHA. I am inspecting the existing composer, shared row component, and layout sweep before making the UI changes.

Started #158 on branch `job/composer-align` at base `c2a81aeab9fd6090cb4eba448af5835c4877e7de`; `dev` points to the same SHA. I am inspecting the existing composer, shared row component, and layout sweep before making the UI changes.
Author
Owner

Finding: AccountRow is the shared row for Profile, Passkeys, Sessions, devices, plugins, and other Settings lists. Its current grid top-aligns the icon, while the action group centers on the text; below 360px, actions move to a second row. With the new 1px layout-sweep assertion, the real-server production run bun e2e/layout-sweep.mjs --only settings-account checked 4 screens and reported icon/text/action center drift of 11.7px on desktop and up to 68.2px at 390px. I am fixing the shared row so the icon and actions stay centered on the title-plus-meta block, then I will rerun the full sweep.

Finding: `AccountRow` is the shared row for Profile, Passkeys, Sessions, devices, plugins, and other Settings lists. Its current grid top-aligns the icon, while the action group centers on the text; below 360px, actions move to a second row. With the new 1px layout-sweep assertion, the real-server production run `bun e2e/layout-sweep.mjs --only settings-account` checked 4 screens and reported icon/text/action center drift of 11.7px on desktop and up to 68.2px at 390px. I am fixing the shared row so the icon and actions stay centered on the title-plus-meta block, then I will rerun the full sweep.
Author
Owner

Composer finding: the production E2E run failed before saving an entry because the current .composer-head contains only the mode picker; “Recognized details” is a separate row. The mode labels are also enabled on desktop, and the footer actions do not use the shared pill group. I have a regression assertion for the single header row, icon-only radios, warm tooltip keys, and shared action pill.

Composer finding: the production E2E run failed before saving an entry because the current `.composer-head` contains only the mode picker; “Recognized details” is a separate row. The mode labels are also enabled on desktop, and the footer actions do not use the shared pill group. I have a regression assertion for the single header row, icon-only radios, warm tooltip keys, and shared action pill.
Author
Owner

Build note: the first green-path browser run still saw the old composer because the #157 server binary embeds that worktree's static build. The current web production build and svelte-check are ready. I am building this worktree's calternal-server so the final Playwright runs use the production SPA for #158.

Build note: the first green-path browser run still saw the old composer because the #157 server binary embeds that worktree's static build. The current web production build and `svelte-check` are ready. I am building this worktree's `calternal-server` so the final Playwright runs use the production SPA for #158.
Author
Owner

Production Composer E2E confirmed the new keyboard sequence: Shift+Tab from the text reaches “Log mode”, then the final Tag chip. The chips precede the mode pill in the visual and DOM order, so I kept that order and updated the E2E expectation to cover both stops.

Evidence on this production build:

  • bun e2e/composer.mjs: composer e2e: all flows passed; screenshots in /home/kayg/Developer/calternal-wt/composer-align-review
  • bun e2e/layout-sweep.mjs --only settings-account: checked 4 screens; LAYOUT SWEEP PASSED (with the pre-existing duplicate “Signed-in devices” icon warning).
Production Composer E2E confirmed the new keyboard sequence: Shift+Tab from the text reaches “Log mode”, then the final Tag chip. The chips precede the mode pill in the visual and DOM order, so I kept that order and updated the E2E expectation to cover both stops. Evidence on this production build: - `bun e2e/composer.mjs`: `composer e2e: all flows passed; screenshots in /home/kayg/Developer/calternal-wt/composer-align-review` - `bun e2e/layout-sweep.mjs --only settings-account`: `checked 4 screens`; `LAYOUT SWEEP PASSED` (with the pre-existing duplicate “Signed-in devices” icon warning).
Author
Owner

Resuming #158 after the planned VM restart. Worktree is clean at 5b6086fc917a82951aab53e8c8db727b99eea54b on job/composer-align; local dev is 44b15bec4f4e78e788c85b7ec60d54892a293b84. The prior comments record the composer and targeted Settings checks passing. I am checking the committed changes, merging current dev before the final gates, then I will post the final SHA and verbatim gate output.

Resuming #158 after the planned VM restart. Worktree is clean at `5b6086fc917a82951aab53e8c8db727b99eea54b` on `job/composer-align`; local `dev` is `44b15bec4f4e78e788c85b7ec60d54892a293b84`. The prior comments record the composer and targeted Settings checks passing. I am checking the committed changes, merging current `dev` before the final gates, then I will post the final SHA and verbatim gate output.
Author
Owner

Finished #158 on job/composer-align.

Built:

  • Composer NLP chips and an icon-only mode pill share one header row. Chips wrap under on narrow widths. Footer actions use the shared PillGroup.
  • Shared Settings AccountRow centres its leading icon and trailing actions on the title-plus-meta block. The layout sweep checks centre drift within 1 px.
  • Composer and layout-sweep E2E assertions cover these contracts. §38 now records the implementation rules.

Files: apps/web/src/lib/composer/Composer.svelte, packages/ui/src/components/composer/ModePill.svelte, apps/web/src/routes/settings/parts/AccountRow.svelte, apps/web/e2e/composer.mjs, apps/web/e2e/layout-sweep.mjs, docs/DESIGN.md.

Commits: 65379df0 (composer), 2e113401 (Settings row), ebfb31eb (design note). Final head: ebfb31ebb6da3541f1900d2938b06d4764c06e32.

Gate results (all commands exited 0; excerpts below are verbatim):

cargo fmt --check
(no stdout or stderr)

cargo clippy --all-targets -- -D warnings
Finished `dev` profile [unoptimized + debuginfo] target(s) in 98m 03s

cargo test
Finished `test` profile [unoptimized + debuginfo] target(s) in 27m 11s
test result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 145.95s
test result: ok. 87 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 83.87s

bun run check
$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/composer-align/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run test
Not implemented: Window's scrollTo() method
 Test Files  53 passed (53)
      Tests  417 passed (417)
   Start at  16:26:07
   Duration  73.25s (transform 69%, environment 13%, import 12%, tests 5%)

Production E2E from the earlier run passed: composer e2e: all flows passed; screenshots in /home/kayg/Developer/calternal-wt/composer-align-review; the Settings sweep reported checked 4 screens and LAYOUT SWEEP PASSED. The review directory contains Composer screenshots at 1440 px and 390 px in paper and tokyo-night themes.

Known gaps: tests that require downloaded model assets, manual performance measurements, or the separate live-app process runner remain intentionally ignored. The Settings sweep reported a pre-existing duplicate “Signed-in devices” icon warning.

Decision for owner confirmation: mode tooltips show ArrowRight as the shortcut hint for each radio option. The Composer mode control already supports arrow-key navigation; the design doc did not define per-mode shortcuts.

Cleanup: cargo clean reported Removed 15892 files, 12.8GiB total; web .svelte-kit, build, and .vite output was removed. Worktree is clean. No API changed, so no adversarial API probe was needed.

Finished #158 on `job/composer-align`. Built: - Composer NLP chips and an icon-only mode pill share one header row. Chips wrap under on narrow widths. Footer actions use the shared `PillGroup`. - Shared Settings `AccountRow` centres its leading icon and trailing actions on the title-plus-meta block. The layout sweep checks centre drift within 1 px. - Composer and layout-sweep E2E assertions cover these contracts. §38 now records the implementation rules. Files: `apps/web/src/lib/composer/Composer.svelte`, `packages/ui/src/components/composer/ModePill.svelte`, `apps/web/src/routes/settings/parts/AccountRow.svelte`, `apps/web/e2e/composer.mjs`, `apps/web/e2e/layout-sweep.mjs`, `docs/DESIGN.md`. Commits: `65379df0` (composer), `2e113401` (Settings row), `ebfb31eb` (design note). Final head: `ebfb31ebb6da3541f1900d2938b06d4764c06e32`. Gate results (all commands exited 0; excerpts below are verbatim): ```text cargo fmt --check (no stdout or stderr) cargo clippy --all-targets -- -D warnings Finished `dev` profile [unoptimized + debuginfo] target(s) in 98m 03s cargo test Finished `test` profile [unoptimized + debuginfo] target(s) in 27m 11s test result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 145.95s test result: ok. 87 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 83.87s bun run check $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/composer-align/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings bun run test Not implemented: Window's scrollTo() method Test Files 53 passed (53) Tests 417 passed (417) Start at 16:26:07 Duration 73.25s (transform 69%, environment 13%, import 12%, tests 5%) ``` Production E2E from the earlier run passed: `composer e2e: all flows passed; screenshots in /home/kayg/Developer/calternal-wt/composer-align-review`; the Settings sweep reported `checked 4 screens` and `LAYOUT SWEEP PASSED`. The review directory contains Composer screenshots at 1440 px and 390 px in `paper` and `tokyo-night` themes. Known gaps: tests that require downloaded model assets, manual performance measurements, or the separate live-app process runner remain intentionally ignored. The Settings sweep reported a pre-existing duplicate “Signed-in devices” icon warning. Decision for owner confirmation: mode tooltips show `ArrowRight` as the shortcut hint for each radio option. The Composer mode control already supports arrow-key navigation; the design doc did not define per-mode shortcuts. Cleanup: `cargo clean` reported `Removed 15892 files, 12.8GiB total`; web `.svelte-kit`, `build`, and `.vite` output was removed. Worktree is clean. No API changed, so no adversarial API probe was needed.
Author
Owner

Claude review of 390-tokyo-night-log-chips.png: (1) the time range splits across lines ('09:00 –' then '10:00' on the next line): a range is one unbreakable unit (start – end chip group). (2) On narrow widths the chips wrap into two lines beside the mode pill; the issue asked for: mode pill stays top-right on row 1, chips move to their own row under it when they don't fit on row 1 next to it (all chips on one scrollable-free wrapping row, never squeezed beside the pill). (3) Mode tooltips show 'ArrowRight' as a shortcut: remove it; show the mode name only (a real shortcut comes from #159's registry if one is assigned). (4) The mode pill still has an outer border; use the shared segmented pill without outer border (same rule as the upcoming Appearance change). Desktop 1440 looks right.

Claude review of 390-tokyo-night-log-chips.png: (1) the time range splits across lines ('09:00 –' then '10:00' on the next line): a range is one unbreakable unit (start – end chip group). (2) On narrow widths the chips wrap into two lines beside the mode pill; the issue asked for: mode pill stays top-right on row 1, chips move to their own row under it when they don't fit on row 1 next to it (all chips on one scrollable-free wrapping row, never squeezed beside the pill). (3) Mode tooltips show 'ArrowRight' as a shortcut: remove it; show the mode name only (a real shortcut comes from #159's registry if one is assigned). (4) The mode pill still has an outer border; use the shared segmented pill without outer border (same rule as the upcoming Appearance change). Desktop 1440 looks right.
Author
Owner

Started continuation work for #158 on branch job/composer-align at HEAD ebfb31ebb6da3541f1900d2938b06d4764c06e32, based on dev merge-base 44b15bec4f4e78e788c85b7ec60d54892a293b84. I am reproducing the latest review findings before making one commit per fix.

Started continuation work for #158 on branch `job/composer-align` at HEAD `ebfb31ebb6da3541f1900d2938b06d4764c06e32`, based on dev merge-base `44b15bec4f4e78e788c85b7ec60d54892a293b84`. I am reproducing the latest review findings before making one commit per fix.
Author
Owner

Finding: the four review symptoms map to the current implementation. In Composer.svelte, start time, separator and end time are sibling flex items, so the flex row can split the range; .chips is constrained to grid column 1 beside the mode control, so its contents wrap alongside the pill. In ModePill.svelte, the tooltip assigns ['ArrowRight'] directly. The shared SegmentedControl recessed variant paints border: 1px solid var(--control-boundary). I will keep the shared control and remove only that composer border.

Finding: the four review symptoms map to the current implementation. In `Composer.svelte`, start time, separator and end time are sibling flex items, so the flex row can split the range; `.chips` is constrained to grid column 1 beside the mode control, so its contents wrap alongside the pill. In `ModePill.svelte`, the tooltip assigns `['ArrowRight']` directly. The shared `SegmentedControl` recessed variant paints `border: 1px solid var(--control-boundary)`. I will keep the shared control and remove only that composer border.
Author
Owner

Finding after merging dev: cargo build -p calternal-server stopped at crates/plugins/files/src/index.rs:620 with expected bool, found (). The merged record_once contract says it returns false only when the file changed during hashing; the adjacent dev change and comment say an already-correct row is a successful record. I am correcting that early return to Ok(true) and running the Files plugin crate test before resuming the server build.

Finding after merging `dev`: `cargo build -p calternal-server` stopped at `crates/plugins/files/src/index.rs:620` with `expected bool, found ()`. The merged `record_once` contract says it returns `false` only when the file changed during hashing; the adjacent dev change and comment say an already-correct row is a successful record. I am correcting that early return to `Ok(true)` and running the Files plugin crate test before resuming the server build.
Author
Owner

Adversarial round finding (2026-09-26): tests/adversarial/attack2.py created a Photos share, opted the second user into Shared/{owner}/Photos, then polled /api/v1/photos/timeline?before=2024-06-03&days=7&tiles_per_day=10 for 12 seconds. Every response remained 200 {"days":[],"next_before":null} and the probe reported Photos shared timeline: active shared photo never appeared. This is a non-SLOW cross-plugin visibility inconsistency. It is outside the composer-owned UI files, so I did not change Photos/API behavior in this job; please triage with the Photos owner.

The main sweep also had two -1 timeouts in a 16-request bookmark-create burst (14 requests returned 201 with unique IDs). The server remained alive, and other concurrent requests in the same round were repeatedly marked SLOW. I am recording that result as host-load evidence rather than claiming a product defect.

Adversarial round finding (2026-09-26): `tests/adversarial/attack2.py` created a Photos share, opted the second user into `Shared/{owner}/Photos`, then polled `/api/v1/photos/timeline?before=2024-06-03&days=7&tiles_per_day=10` for 12 seconds. Every response remained `200 {"days":[],"next_before":null}` and the probe reported `Photos shared timeline: active shared photo never appeared`. This is a non-SLOW cross-plugin visibility inconsistency. It is outside the composer-owned UI files, so I did not change Photos/API behavior in this job; please triage with the Photos owner. The main sweep also had two `-1` timeouts in a 16-request bookmark-create burst (14 requests returned 201 with unique IDs). The server remained alive, and other concurrent requests in the same round were repeatedly marked SLOW. I am recording that result as host-load evidence rather than claiming a product defect.
Author
Owner

Additional adversarial result: attack2.py's journal log-rewrite storm sent repeated PATCHes with the same entry ETags. It reported status set [-1, 200, 412]; -1 is the probe's 30-second HTTP timeout. The following checks reported no entry-count, line-count, or joined-line change. The same round had sustained multi-second SLOW responses and the server stayed alive. I am filing the timeout because it is not labeled SLOW-only; it appears load-related, but needs triage outside the composer-owned files.

Additional adversarial result: `attack2.py`'s journal log-rewrite storm sent repeated PATCHes with the same entry ETags. It reported status set `[-1, 200, 412]`; `-1` is the probe's 30-second HTTP timeout. The following checks reported no entry-count, line-count, or joined-line change. The same round had sustained multi-second SLOW responses and the server stayed alive. I am filing the timeout because it is not labeled SLOW-only; it appears load-related, but needs triage outside the composer-owned files.
Author
Owner

Additional adversarial finding: tests/adversarial/attack2.py uploaded ZebraPrivate/zebracorn-private.txt with body zebracorn sentinel private, then polled the owner's /api/v1/search?q=zebracorn&limit=50 for 30 seconds. The owner still had no matching private file ([]), and the probe reported search access setup: the owner does not find their own file. This is a non-SLOW Files/Search indexing visibility issue, outside the composer-owned UI files; please triage with those API owners.

Additional adversarial finding: `tests/adversarial/attack2.py` uploaded `ZebraPrivate/zebracorn-private.txt` with body `zebracorn sentinel private`, then polled the owner's `/api/v1/search?q=zebracorn&limit=50` for 30 seconds. The owner still had no matching private file (`[]`), and the probe reported `search access setup: the owner does not find their own file`. This is a non-SLOW Files/Search indexing visibility issue, outside the composer-owned UI files; please triage with those API owners.
Author
Owner

Forgejo #158 — final report

Built

  • The Composer header has one row, with NLP chips on the left and an icon-only mode pill on the right. At narrow widths, the chip group moves below the pill. Parsed time ranges stay together. Tooltips use the mode name and only show a shortcut when the registry provides one. Footer actions use the shared PillGroup.
  • The shared Settings AccountRow centres the leading icon, title-plus-meta text and trailing actions on one vertical axis. The layout sweep checks drift within 1 px.
  • Composer E2E checks cover header layout, narrow stacking, time ranges, accessible names and tooltips. The layout sweep now reuses the shared Playwright resolver; this fixes its failure when no temporary bunx package exists.
  • Merged current dev at 2527f0d0 in merge commit 49e1d1ed before final gates. Commit 43af360c keeps the unchanged Files Index row as a successful record, matching the merged dev fix.

Files

  • apps/web/src/lib/composer/Composer.svelte
  • apps/web/src/lib/composer/Composer.svelte.test.ts
  • packages/ui/src/components/composer/ModePill.svelte
  • apps/web/src/routes/settings/parts/AccountRow.svelte
  • apps/web/e2e/composer.mjs
  • apps/web/e2e/layout-sweep.mjs
  • crates/plugins/files/src/index.rs
  • docs/DESIGN.md

Head: 93210d87758cac0e721c152dc2fe1b93bac1b312 (test(layout): reuse shared Playwright resolver). Worktree clean. No push or deploy.

Gates and rendered checks

cargo fmt --check
(no stdout or stderr)

cargo clippy --all-targets -- -D warnings
Finished `dev` profile [unoptimized + debuginfo] target(s) in 19m 41s

RUST_TEST_THREADS=1 cargo test
Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 11s
test result: ok. 99 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 147.00s
test result: ok. 476 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.40s

bun run check
$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/composer-align/apps/web
Getting Svelte diagnostics...
svelte-check found 0 errors and 0 warnings

bun run test
Not implemented: Window's scrollTo() method
 Test Files  55 passed (55)
      Tests  433 passed (433)
   Start at  21:48:36
   Duration  38.34s (transform 76%, import 11%, environment 8%, tests 5%)

composer e2e: all flows passed; screenshots in /home/kayg/Developer/calternal-wt/composer-align-review-final

checked 4 screens
WARN settings-account: list "Signed-in devices": 2 rows share an icon
LAYOUT SWEEP PASSED

cargo clean
Removed 2050 files, 324.6MiB total

The full Rust test gate ran serially because the shared host had concurrent Cargo jobs. An earlier cargo test -p calternal-plugin-files run had 98 passes and one load-sensitive timeout test failure; the focused timeout test passed, and the serial full workspace run also passed that test. This matches the load behavior already documented in #151. bun run test repeats the existing Window's scrollTo() environment warning.

Playwright screenshots (paper and Tokyo Night, 1440 and 390 px) are in /home/kayg/Developer/calternal-wt/composer-align-review-final. The Browser plugin was unavailable, so the repo's configured Playwright runner was used.

Adversarial findings

  • Shared Photos timeline visibility is already tracked in #187 and #188.
  • This round's Journal and bookmark timeout evidence is added to #205.
  • The owner could not find a newly uploaded private file with Search; filed as #208. These API findings are outside #158's UI scope and were not changed here.

Known gaps

  • The layout sweep still warns that two “Signed-in devices” rows share an icon. It is a warning; the sweep passes.
  • The Search, shared Photos timeline, and concurrent timeout findings need their API owners to reproduce and resolve them.

Decision not specified in DESIGN.md

The chip group stays before the mode pill in DOM and keyboard order for accessibility, while CSS places the icon-only pill on the right. The design defines the visual positions but not this DOM order.

# Forgejo #158 — final report ## Built - The Composer header has one row, with NLP chips on the left and an icon-only mode pill on the right. At narrow widths, the chip group moves below the pill. Parsed time ranges stay together. Tooltips use the mode name and only show a shortcut when the registry provides one. Footer actions use the shared `PillGroup`. - The shared Settings `AccountRow` centres the leading icon, title-plus-meta text and trailing actions on one vertical axis. The layout sweep checks drift within 1 px. - Composer E2E checks cover header layout, narrow stacking, time ranges, accessible names and tooltips. The layout sweep now reuses the shared Playwright resolver; this fixes its failure when no temporary `bunx` package exists. - Merged current `dev` at `2527f0d0` in merge commit `49e1d1ed` before final gates. Commit `43af360c` keeps the unchanged Files Index row as a successful record, matching the merged `dev` fix. ## Files - `apps/web/src/lib/composer/Composer.svelte` - `apps/web/src/lib/composer/Composer.svelte.test.ts` - `packages/ui/src/components/composer/ModePill.svelte` - `apps/web/src/routes/settings/parts/AccountRow.svelte` - `apps/web/e2e/composer.mjs` - `apps/web/e2e/layout-sweep.mjs` - `crates/plugins/files/src/index.rs` - `docs/DESIGN.md` Head: `93210d87758cac0e721c152dc2fe1b93bac1b312` (`test(layout): reuse shared Playwright resolver`). Worktree clean. No push or deploy. ## Gates and rendered checks ```text cargo fmt --check (no stdout or stderr) cargo clippy --all-targets -- -D warnings Finished `dev` profile [unoptimized + debuginfo] target(s) in 19m 41s RUST_TEST_THREADS=1 cargo test Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 11s test result: ok. 99 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 147.00s test result: ok. 476 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.40s bun run check $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/composer-align/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings bun run test Not implemented: Window's scrollTo() method Test Files 55 passed (55) Tests 433 passed (433) Start at 21:48:36 Duration 38.34s (transform 76%, import 11%, environment 8%, tests 5%) composer e2e: all flows passed; screenshots in /home/kayg/Developer/calternal-wt/composer-align-review-final checked 4 screens WARN settings-account: list "Signed-in devices": 2 rows share an icon LAYOUT SWEEP PASSED cargo clean Removed 2050 files, 324.6MiB total ``` The full Rust test gate ran serially because the shared host had concurrent Cargo jobs. An earlier `cargo test -p calternal-plugin-files` run had 98 passes and one load-sensitive timeout test failure; the focused timeout test passed, and the serial full workspace run also passed that test. This matches the load behavior already documented in #151. `bun run test` repeats the existing `Window's scrollTo()` environment warning. Playwright screenshots (paper and Tokyo Night, 1440 and 390 px) are in `/home/kayg/Developer/calternal-wt/composer-align-review-final`. The Browser plugin was unavailable, so the repo's configured Playwright runner was used. ## Adversarial findings - Shared Photos timeline visibility is already tracked in #187 and #188. - This round's Journal and bookmark timeout evidence is added to #205. - The owner could not find a newly uploaded private file with Search; filed as #208. These API findings are outside #158's UI scope and were not changed here. ## Known gaps - The layout sweep still warns that two “Signed-in devices” rows share an icon. It is a warning; the sweep passes. - The Search, shared Photos timeline, and concurrent timeout findings need their API owners to reproduce and resolve them. ## Decision not specified in DESIGN.md The chip group stays before the mode pill in DOM and keyboard order for accessibility, while CSS places the icon-only pill on the right. The design defines the visual positions but not this DOM order.
Author
Owner

Merged into dev at a31e4ee0 after Claude's review of the 390/1440 screenshots (range unbroken, chips below the borderless mode pill on phones). Deploy status on #203.

Merged into dev at a31e4ee0 after Claude's review of the 390/1440 screenshots (range unbroken, chips below the borderless mode pill on phones). Deploy status on #203.
kayg closed this issue 2026-09-26 19:56:04 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#158
No description provided.