Agenda view: flat list, attachment deck that fans on hover and expands with titles on select #112

Closed
opened 2026-09-25 18:30:49 +00:00 by kayg · 15 comments
Owner

Branch job/agenda. DESIGN §38: no day cards; a day heading marks each day; each item one word-wrapped line; no coloured side bars; attachments on the next row as a deck ported from calternal.js that fans out on hover and expands horizontally with file titles when the item is selected; per-day actions move to hover/context menu (essentials only). Adversarial layouts (50 items, 30 attachments, long titles, RTL, 320 px, 200%).

Branch job/agenda. DESIGN §38: no day cards; a day heading marks each day; each item one word-wrapped line; no coloured side bars; attachments on the next row as a deck ported from calternal.js that fans out on hover and expands horizontally with file titles when the item is selected; per-day actions move to hover/context menu (essentials only). Adversarial layouts (50 items, 30 attachments, long titles, RTL, 320 px, 200%).
Author
Owner

Starting the remaining Agenda work on job/agenda. Base: 0e6c4289929dd450e2784f64359d6910f2912cde; starting head: a522499bdc09479278d0a8f6fd89d4c86ffab814. I am reviewing DESIGN §38 and the current seven-commit implementation before finishing the requested layout sweep and gates.

Starting the remaining Agenda work on `job/agenda`. Base: `0e6c4289929dd450e2784f64359d6910f2912cde`; starting head: `a522499bdc09479278d0a8f6fd89d4c86ffab814`. I am reviewing DESIGN §38 and the current seven-commit implementation before finishing the requested layout sweep and gates.
Author
Owner

The merged production layout sweep completed (checked 180 screens) and reported these non-SLOW failures:

FAIL calendar-day 390 collapsed paper: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (315×31 painted; -21,-21 hits div.col.svelte-7gegc4)
FAIL toast-calendar 390 collapsed paper: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (42×31 painted; -21,-21 hits div.col.svelte-7gegc4); hit area button.block.actual "Log entry 10:00 to 12:00" is under 44×44 (42×86 painted; 21,-21 hits div.col.svelte-7gegc4)
FAIL agenda-busy 390 collapsed paper: hit area button.line.log "09:00 Busy item 6 of the" is under 44×44 (313×44 painted; -21,21 hits nothing); hit area button.more.svelte-1dbltdz "Log entry actions" is under 44×44 (44×44 painted; -21,21 hits nothing)
FAIL header calendar-week 390 scale 1: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (42×31 painted; -21,-21 hits div.col.svelte-7gegc4); hit area button.block.actual "Log entry 10:00 to 12:00" is under 44×44 (42×86 painted; 21,-21 hits div.col.svelte-7gegc4)
FAIL header calendar-day 390 scale 1: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (315×31 painted; -21,-21 hits div.col.svelte-7gegc4)
FAIL header collapse calendar-month 390: a scroll did not collapse the header
FAIL pill photos 390: no mode tray
FAIL break-it calendar-day 320 scale 1: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (245×31 painted; -21,-21 hits div.col.svelte-7gegc4)

The Agenda rows and action target miss the lower-left edge of the 44px touch target on a 390px touch viewport. I am fixing that in the Agenda work. The other findings are in the Week/Day TimeGrid, the phone Calendar header collapse, and the Photos mode tray. WARN-only duplicate icons were also reported for “Signed-in devices” and “Agents”; those are warnings, not sweep failures.

The merged production layout sweep completed (`checked 180 screens`) and reported these non-SLOW failures: ``` FAIL calendar-day 390 collapsed paper: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (315×31 painted; -21,-21 hits div.col.svelte-7gegc4) FAIL toast-calendar 390 collapsed paper: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (42×31 painted; -21,-21 hits div.col.svelte-7gegc4); hit area button.block.actual "Log entry 10:00 to 12:00" is under 44×44 (42×86 painted; 21,-21 hits div.col.svelte-7gegc4) FAIL agenda-busy 390 collapsed paper: hit area button.line.log "09:00 Busy item 6 of the" is under 44×44 (313×44 painted; -21,21 hits nothing); hit area button.more.svelte-1dbltdz "Log entry actions" is under 44×44 (44×44 painted; -21,21 hits nothing) FAIL header calendar-week 390 scale 1: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (42×31 painted; -21,-21 hits div.col.svelte-7gegc4); hit area button.block.actual "Log entry 10:00 to 12:00" is under 44×44 (42×86 painted; 21,-21 hits div.col.svelte-7gegc4) FAIL header calendar-day 390 scale 1: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (315×31 painted; -21,-21 hits div.col.svelte-7gegc4) FAIL header collapse calendar-month 390: a scroll did not collapse the header FAIL pill photos 390: no mode tray FAIL break-it calendar-day 320 scale 1: hit area button.block.actual "Log entry 08:30 to 09:15" is under 44×44 (245×31 painted; -21,-21 hits div.col.svelte-7gegc4) ``` The Agenda rows and action target miss the lower-left edge of the 44px touch target on a 390px touch viewport. I am fixing that in the Agenda work. The other findings are in the Week/Day TimeGrid, the phone Calendar header collapse, and the Photos mode tray. WARN-only duplicate icons were also reported for “Signed-in devices” and “Agents”; those are warnings, not sweep failures.
Author
Owner

The calendar e2e reached its Agenda fixture after creating the overnight Log on today - 3 days. It then tried to upload 20260923-dailynote.md for the Agenda fixture to the same day and got the expected 412 Precondition Failed because the Daily note already existed. I am moving the fixture to an unused day and will rerun the calendar e2e.

The calendar e2e reached its Agenda fixture after creating the overnight Log on `today - 3 days`. It then tried to upload `20260923-dailynote.md` for the Agenda fixture to the same day and got the expected `412 Precondition Failed` because the Daily note already existed. I am moving the fixture to an unused day and will rerun the calendar e2e.
Author
Owner

Adversarial round finding (verification in progress): the real local server attack logged 30-second timeouts on the stale Journal-line fix, Reminders VTODO discovery and incremental sync, and the 14:00 log-rewrite seed write. It also reported all 5 template-create storm requests timing out, 6 of 16 bookmark-capture storm requests timing out (10/16 unique IDs), and 4/5 expected log-rewrite entries after the timeout. The server process stayed alive, and /readyz returned 200 in 0.651 s during the run. These are non-SLOW findings; the host had several concurrent Cargo builds and other probes, so I will replay the affected cases after this round before deciding whether to file a follow-up.

Adversarial round finding (verification in progress): the real local server attack logged 30-second timeouts on the stale Journal-line fix, Reminders VTODO discovery and incremental sync, and the 14:00 log-rewrite seed write. It also reported all 5 template-create storm requests timing out, 6 of 16 bookmark-capture storm requests timing out (10/16 unique IDs), and 4/5 expected log-rewrite entries after the timeout. The server process stayed alive, and `/readyz` returned 200 in 0.651 s during the run. These are non-SLOW findings; the host had several concurrent Cargo builds and other probes, so I will replay the affected cases after this round before deciding whether to file a follow-up.
Author
Owner

Finished

Built the flat Agenda from DESIGN §38 with day headings, wrapped one-line entries, per-day actions, and the ported attachment deck (fan on hover; horizontal expansion with titles on selection). Fixed Agenda touch hit testing. Screenshots: 16 production-build captures in /home/kayg/Developer/calternal/target/agenda-screens/ for the visual review.

Files: packages/ui/src/components/calendar/{AgendaList.svelte,AttachmentDeck.svelte,attachments.ts,MonthGrid.svelte,model.ts}; apps/web/src/lib/calendar/{data.ts,agenda.svelte.test.ts,attachments.test.ts,flip.ts,flip.test.ts}; apps/web/src/routes/calendar/[view]/[date]/+page.svelte; apps/web/e2e/{calendar.mjs,layout-sweep.mjs}; crates/plugins/calendar/src/view.rs; contracts/openapi.json; packages/api-client/src/generated.ts; tests/adversarial/attack.py; Cargo.lock.

Head: ae48cd11c78686e9c01ce2649a1791f529ef3dde (job/agenda, merged dev, no push).

Gates (verbatim output excerpts):

cargo fmt --check: exit_code=0 (no output)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 10m 47s
cargo test: exit_code=0
svelte-check found 0 errors and 0 warnings
Test Files  52 passed (52)
     Tests  387 passed (387)
  Duration  73.36s (transform 76%, environment 9%, import 9%, tests 5%)
✓ built in 1m 24s
> Using @sveltejs/adapter-static
Wrote site to "build"
✔ done
checked 16 screens
LAYOUT SWEEP PASSED
calendar e2e: all flows passed
Removed 17032 files, 13.8GiB total

The merged full layout sweep checked 180 screens and failed on broader dev issues: Calendar grid hit targets, month-header collapse, and Photos mode tray. It also exposed the Agenda phone hit target; that is fixed, and the 16-screen Agenda sweep passed after the fix.

The real-server adversarial runner completed but exited 1: ==== FINDINGS 99, ==== HOSTILE BYTES FINDINGS 0, ==== ROUND 2 FINDINGS 102, restart probe: 0 findings. Non-SLOW request timeouts and consistency observations under heavy shared-host load are recorded in #166; bookmark-storm evidence is also on #149. The server stayed alive. These API findings are outside the Agenda files and need follow-up before merge review.

Decisions not covered by §38: I moved the calendar e2e fixture from today - 3 to today - 4 because the overnight Log flow already creates the today - 3 Daily note and caused an expected 412 conflict. During the dev merge conflict, I kept the dev-wide layout sweep and integrated the Agenda scenarios and screenshots into it. No Agenda product behavior departs from §38.

## Finished Built the flat Agenda from DESIGN §38 with day headings, wrapped one-line entries, per-day actions, and the ported attachment deck (fan on hover; horizontal expansion with titles on selection). Fixed Agenda touch hit testing. Screenshots: 16 production-build captures in `/home/kayg/Developer/calternal/target/agenda-screens/` for the visual review. **Files:** `packages/ui/src/components/calendar/{AgendaList.svelte,AttachmentDeck.svelte,attachments.ts,MonthGrid.svelte,model.ts}`; `apps/web/src/lib/calendar/{data.ts,agenda.svelte.test.ts,attachments.test.ts,flip.ts,flip.test.ts}`; `apps/web/src/routes/calendar/[view]/[date]/+page.svelte`; `apps/web/e2e/{calendar.mjs,layout-sweep.mjs}`; `crates/plugins/calendar/src/view.rs`; `contracts/openapi.json`; `packages/api-client/src/generated.ts`; `tests/adversarial/attack.py`; `Cargo.lock`. **Head:** `ae48cd11c78686e9c01ce2649a1791f529ef3dde` (`job/agenda`, merged `dev`, no push). **Gates (verbatim output excerpts):** ```text cargo fmt --check: exit_code=0 (no output) Finished `dev` profile [unoptimized + debuginfo] target(s) in 10m 47s cargo test: exit_code=0 svelte-check found 0 errors and 0 warnings Test Files 52 passed (52) Tests 387 passed (387) Duration 73.36s (transform 76%, environment 9%, import 9%, tests 5%) ✓ built in 1m 24s > Using @sveltejs/adapter-static Wrote site to "build" ✔ done checked 16 screens LAYOUT SWEEP PASSED calendar e2e: all flows passed Removed 17032 files, 13.8GiB total ``` The merged full layout sweep checked 180 screens and failed on broader dev issues: Calendar grid hit targets, month-header collapse, and Photos mode tray. It also exposed the Agenda phone hit target; that is fixed, and the 16-screen Agenda sweep passed after the fix. The real-server adversarial runner completed but exited 1: `==== FINDINGS 99`, `==== HOSTILE BYTES FINDINGS 0`, `==== ROUND 2 FINDINGS 102`, `restart probe: 0 findings`. Non-SLOW request timeouts and consistency observations under heavy shared-host load are recorded in #166; bookmark-storm evidence is also on #149. The server stayed alive. These API findings are outside the Agenda files and need follow-up before merge review. **Decisions not covered by §38:** I moved the calendar e2e fixture from `today - 3` to `today - 4` because the overnight Log flow already creates the `today - 3` Daily note and caused an expected 412 conflict. During the `dev` merge conflict, I kept the dev-wide layout sweep and integrated the Agenda scenarios and screenshots into it. No Agenda product behavior departs from §38.
Author
Owner

Starting merge resolution for #112.
Branch: job/agenda
Base dev SHA: b74e772c6d
Branch HEAD: ae48cd11c7

Starting merge resolution for #112. Branch: job/agenda Base dev SHA: b74e772c6df6f45d187be8a456144c810630a6ca Branch HEAD: ae48cd11c78686e9c01ce2649a1791f529ef3dde
Author
Owner

The first bun run test after merging dev reported 53 files / 422 tests passing and one timeout: apps/web/src/lib/themes.test.ts → “keeps text inside every glass surface at 4.5:1 over the worst point of the mesh, with the least tint” exceeded Vitest's 5 s test limit (reported duration 7,089 ms). The theme test file is unchanged by this merge. I am isolating the test to check whether this is worker load or a repeatable gate failure.

The first `bun run test` after merging `dev` reported 53 files / 422 tests passing and one timeout: `apps/web/src/lib/themes.test.ts` → “keeps text inside every glass surface at 4.5:1 over the worst point of the mesh, with the least tint” exceeded Vitest's 5 s test limit (reported duration 7,089 ms). The theme test file is unchanged by this merge. I am isolating the test to check whether this is worker load or a repeatable gate failure.
Author
Owner

The adversarial runner could not build the merged server. cargo build -q -p calternal-server -p calternal-cli -p calternal-sync failed at crates/plugins/files/src/index.rs:620: record_once returns Result<bool, Failure>, but the new identical-row fast path returns Ok(()) (E0308, expected bool). Its doc says false means the file changed during hashing; this path is the successful unchanged case. I am checking existing coverage for the smallest correction.

The adversarial runner could not build the merged server. `cargo build -q -p calternal-server -p calternal-cli -p calternal-sync` failed at `crates/plugins/files/src/index.rs:620`: `record_once` returns `Result<bool, Failure>`, but the new identical-row fast path returns `Ok(())` (`E0308`, expected `bool`). Its doc says `false` means the file changed during hashing; this path is the successful unchanged case. I am checking existing coverage for the smallest correction.
Author
Owner

Fixed in commit 9fd9d18468d53a06c820975cc393b7a0ce07d1ee: the Files index no-op path now returns Ok(true), the result that means the unchanged file was recorded successfully. I added index_record_accepts_an_unchanged_indexed_file using the existing real FilesState fixture. cargo fmt --check -p calternal-plugin-files, cargo clippy -p calternal-plugin-files --all-targets -- -D warnings, and cargo test -p calternal-plugin-files pass; the test suite reports 89 passed.

Fixed in commit `9fd9d18468d53a06c820975cc393b7a0ce07d1ee`: the Files index no-op path now returns `Ok(true)`, the result that means the unchanged file was recorded successfully. I added `index_record_accepts_an_unchanged_indexed_file` using the existing real `FilesState` fixture. `cargo fmt --check -p calternal-plugin-files`, `cargo clippy -p calternal-plugin-files --all-targets -- -D warnings`, and `cargo test -p calternal-plugin-files` pass; the test suite reports 89 passed.
Author
Owner

Adversarial run finding (evidence, still verifying): tests/adversarial/attack.py bookmark capture storm sent 16 distinct URLs with a 10 s request timeout; statuses were [201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, -1, -1, 201, -1, -1], with 12/16 unique IDs. The server remained alive. The same run flagged slow responses across other endpoints under concurrent host load. tests/adversarial/attack2.py also observed HTTP 200 with an empty Photos timeline for an incoming shared Photos root after waiting 12 s. I am letting the round finish and checking whether those are reproducible state failures or timeouts/background indexing under the unusually contended shared build host before classifying the final result.

Adversarial run finding (evidence, still verifying): `tests/adversarial/attack.py` bookmark capture storm sent 16 distinct URLs with a 10 s request timeout; statuses were `[201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, -1, -1, 201, -1, -1]`, with 12/16 unique IDs. The server remained alive. The same run flagged slow responses across other endpoints under concurrent host load. `tests/adversarial/attack2.py` also observed HTTP 200 with an empty Photos timeline for an incoming shared Photos root after waiting 12 s. I am letting the round finish and checking whether those are reproducible state failures or timeouts/background indexing under the unusually contended shared build host before classifying the final result.
Author
Owner

Adversarial run update: tests/adversarial/attack2.py sync probe did not observe its initial 11 files in SyncRemote within its 25 s convergence window (a.txt and ten keep/k*.txt files). The daemon log for that phase recorded sync reconcile deferred: local file changed during scan; it did not panic. The server was still under heavy concurrent load. I will inspect the final remote state after this one round exits and report whether the failure persisted.

Adversarial run update: `tests/adversarial/attack2.py` sync probe did not observe its initial 11 files in `SyncRemote` within its 25 s convergence window (`a.txt` and ten `keep/k*.txt` files). The daemon log for that phase recorded `sync reconcile deferred: local file changed during scan`; it did not panic. The server was still under heavy concurrent load. I will inspect the final remote state after this one round exits and report whether the failure persisted.
Author
Owner

Adversarial run update: tests/adversarial/restart.mjs reported restart edit: edit not saved once after a graceful restart. It typed after restart one into the current live Note document, waited 4 s, then read the Note body; that body still contained only the baseline text. The probe is now checking crash/rebuild behavior. The local server remained alive before restart. This may be delayed persistence under host contention; I will report whether it survives the later state checks.

Adversarial run update: `tests/adversarial/restart.mjs` reported `restart edit: edit not saved once` after a graceful restart. It typed `after restart one` into the current live Note document, waited 4 s, then read the Note body; that body still contained only the baseline text. The probe is now checking crash/rebuild behavior. The local server remained alive before restart. This may be delayed persistence under host contention; I will report whether it survives the later state checks.
Author
Owner

Adversarial run completed with exit 1. Restart probe reported four findings: (1) after SIGTERM the client edit was absent after 4 s; (2) after SIGKILL the current client did not report stale within 20 s; (3) the body then differed from the pre-crash read by 19 bytes (44 -> 63); and (4) the legacy client synced after restart. The edit appearing only after the later restart check suggests delayed persistence under this run's high load, but the epoch/refusal assertions did not pass. The probe and server exited cleanly; this needs owner review before treating the server-side adversarial gate as clear.

Adversarial run completed with exit 1. Restart probe reported four findings: (1) after SIGTERM the client edit was absent after 4 s; (2) after SIGKILL the current client did not report stale within 20 s; (3) the body then differed from the pre-crash read by 19 bytes (`44 -> 63`); and (4) the legacy client synced after restart. The edit appearing only after the later restart check suggests delayed persistence under this run's high load, but the epoch/refusal assertions did not pass. The probe and server exited cleanly; this needs owner review before treating the server-side adversarial gate as clear.
Author
Owner

Finished: Agenda merge into dev

Merged dev into the Agenda branch and resolved the calendar conflicts with both Agenda and Week/Day grid behavior intact. The shared AttachmentDeck serves the Agenda and the grid preview. A merged Files indexing path also had a return-type error; I added a regression test and fixed unchanged indexed rows to return true.

Head SHA: 1d8859ab175b61424df5348ca71b7bb50952e4ba

Commits:

  • 23b9522d4f41966e445b8e336e9fc192f76e644c — merge dev into Agenda
  • 9fd9d18468d53a06c820975cc393b7a0ce07d1ee — fix unchanged Files index result and add regression test
  • 639816801283860a8bb109beb3a6d0f58d627061 — stabilize calendar E2E state
  • 1d8859ab175b61424df5348ca71b7bb50952e4ba — stabilize layout sweep offline route check

Files changed by this job:

  • apps/web/e2e/calendar.mjs
  • apps/web/e2e/layout-sweep.mjs
  • apps/web/src/lib/calendar/data.ts
  • packages/ui/src/components/calendar/AttachmentDeck.svelte
  • packages/ui/src/components/calendar/MonthGrid.svelte
  • crates/plugins/files/src/index.rs
  • crates/plugins/files/src/lib.rs
  • tests/adversarial/attack.py

Gate output

bun run check:

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

bun run test --maxWorkers=1:

$ vitest run "--maxWorkers=1"
Test Files  54 passed (54)
      Tests  423 passed (423)
   Duration  389.12s

bun run build (passed; Vite also printed its chunk-size warning):

✓ built in 2m 58s
✔ done

Calendar E2E:

$ bun e2e/calendar.mjs
calendar e2e: all flows passed

Layout sweep with production Agenda screenshots:

checked 196 screens
CLS settings-admin-cold: 0.000
CLS note-cold: 0.013
CLS note: 0.011
CLS admin-configuration: 0.000
WARN settings-account: list "Signed-in devices": 2 rows share an icon
WARN settings-ai: list "Agents": 2 rows share an icon
LAYOUT SWEEP PASSED

Rust gates for calternal-plugin-files:

cargo fmt --check -p calternal-plugin-files — exit 0, no output
cargo clippy -p calternal-plugin-files --all-targets -- -D warnings
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.68s

cargo test -p calternal-plugin-files
    Finished `test` profile [unoptimized + debuginfo] target(s) in 4.20s

    test result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 64.52s

   Doc-tests calternal_plugin_files

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

The web build output and Cargo artifacts were removed after the gates. git status is clean.

Adversarial findings and known gaps

bash tests/adversarial/run.sh exited 1. Most findings were SLOW responses under heavy shared-host load. The non-SLOW observations were posted as evidence in earlier comments on this issue and remain for owner review: bookmark-capture concurrency had four request timeouts; the shared Photos timeline returned an empty result after 12 seconds; a Sync initial upload had not appeared after 25 seconds and the daemon logged sync reconcile deferred: local file changed during scan; and the restart probe did not observe the expected stale-client response within its 20-second window. The server stayed alive and the journal race preserved integrity. These are filed follow-ups; the run was not repeated.

The layout sweep passed with two pre-existing icon warnings listed above. The production build passed with Vite's chunk-size warning.

Decisions where the design doc was silent

  • Kept one AttachmentDeck component for both Agenda and the grid; grid previews use the expanded presentation.
  • Calendar E2E waits for the popover transform to settle and for auth and saved zoom state to arrive before checking persisted behavior.
  • The offline-route E2E waits for the visible fallback message because outgoing and incoming route-content nodes briefly overlap during navigation.

Agenda screenshots

390px viewport, Paper:
Agenda at 390px, Paper

390px viewport, Tokyo Night:
Agenda at 390px, Tokyo Night

1440px viewport, Paper:
Agenda at 1440px, Paper

1440px viewport, Tokyo Night:
Agenda at 1440px, Tokyo Night

## Finished: Agenda merge into `dev` Merged `dev` into the Agenda branch and resolved the calendar conflicts with both Agenda and Week/Day grid behavior intact. The shared `AttachmentDeck` serves the Agenda and the grid preview. A merged Files indexing path also had a return-type error; I added a regression test and fixed unchanged indexed rows to return `true`. Head SHA: `1d8859ab175b61424df5348ca71b7bb50952e4ba` Commits: - `23b9522d4f41966e445b8e336e9fc192f76e644c` — merge `dev` into Agenda - `9fd9d18468d53a06c820975cc393b7a0ce07d1ee` — fix unchanged Files index result and add regression test - `639816801283860a8bb109beb3a6d0f58d627061` — stabilize calendar E2E state - `1d8859ab175b61424df5348ca71b7bb50952e4ba` — stabilize layout sweep offline route check Files changed by this job: - `apps/web/e2e/calendar.mjs` - `apps/web/e2e/layout-sweep.mjs` - `apps/web/src/lib/calendar/data.ts` - `packages/ui/src/components/calendar/AttachmentDeck.svelte` - `packages/ui/src/components/calendar/MonthGrid.svelte` - `crates/plugins/files/src/index.rs` - `crates/plugins/files/src/lib.rs` - `tests/adversarial/attack.py` ## Gate output `bun run check`: ```text 1.4.2 $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/agenda/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test --maxWorkers=1`: ```text $ vitest run "--maxWorkers=1" Test Files 54 passed (54) Tests 423 passed (423) Duration 389.12s ``` `bun run build` (passed; Vite also printed its chunk-size warning): ```text ✓ built in 2m 58s ✔ done ``` Calendar E2E: ```text $ bun e2e/calendar.mjs calendar e2e: all flows passed ``` Layout sweep with production Agenda screenshots: ```text checked 196 screens CLS settings-admin-cold: 0.000 CLS note-cold: 0.013 CLS note: 0.011 CLS admin-configuration: 0.000 WARN settings-account: list "Signed-in devices": 2 rows share an icon WARN settings-ai: list "Agents": 2 rows share an icon LAYOUT SWEEP PASSED ``` Rust gates for `calternal-plugin-files`: ```text cargo fmt --check -p calternal-plugin-files — exit 0, no output cargo clippy -p calternal-plugin-files --all-targets -- -D warnings Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.68s cargo test -p calternal-plugin-files Finished `test` profile [unoptimized + debuginfo] target(s) in 4.20s test result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 64.52s Doc-tests calternal_plugin_files running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The web build output and Cargo artifacts were removed after the gates. `git status` is clean. ## Adversarial findings and known gaps `bash tests/adversarial/run.sh` exited 1. Most findings were `SLOW` responses under heavy shared-host load. The non-`SLOW` observations were posted as evidence in earlier comments on this issue and remain for owner review: bookmark-capture concurrency had four request timeouts; the shared Photos timeline returned an empty result after 12 seconds; a Sync initial upload had not appeared after 25 seconds and the daemon logged `sync reconcile deferred: local file changed during scan`; and the restart probe did not observe the expected stale-client response within its 20-second window. The server stayed alive and the journal race preserved integrity. These are filed follow-ups; the run was not repeated. The layout sweep passed with two pre-existing icon warnings listed above. The production build passed with Vite's chunk-size warning. ## Decisions where the design doc was silent - Kept one `AttachmentDeck` component for both Agenda and the grid; grid previews use the expanded presentation. - Calendar E2E waits for the popover transform to settle and for auth and saved zoom state to arrive before checking persisted behavior. - The offline-route E2E waits for the visible fallback message because outgoing and incoming route-content nodes briefly overlap during navigation. ## Agenda screenshots 390px viewport, Paper: ![Agenda at 390px, Paper](https://git.kayg.org/attachments/7311ac7d-75c2-433e-897e-692262f2f7a2) 390px viewport, Tokyo Night: ![Agenda at 390px, Tokyo Night](https://git.kayg.org/attachments/66aab186-8e60-4f3d-8672-463d8a4715f6) 1440px viewport, Paper: ![Agenda at 1440px, Paper](https://git.kayg.org/attachments/2b0ba03c-7368-4bfc-b2fd-f2a5ec78c3b8) 1440px viewport, Tokyo Night: ![Agenda at 1440px, Tokyo Night](https://git.kayg.org/attachments/48fe2f70-9bd8-4435-9597-39caf37b3b6d)
kayg referenced this issue from a commit 2026-09-27 06:17:19 +00:00
Author
Owner

Merged into dev at 21ee397d: flat Agenda (Fraunces day heading, no cards, no coloured side bars, faint accent wash for selection), one shared AttachmentDeck with the grid. svelte-check 0 errors, 539 web tests pass. Deploy status on #203.

Merged into dev at 21ee397d: flat Agenda (Fraunces day heading, no cards, no coloured side bars, faint accent wash for selection), one shared AttachmentDeck with the grid. svelte-check 0 errors, 539 web tests pass. Deploy status on #203.
kayg closed this issue 2026-09-27 06:17:27 +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#112
No description provided.