AUDIT: app-wide chrome consistency (headers, blur, breadcrumbs, pills, links, type scale) #237

Closed
opened 2026-09-27 12:44:12 +00:00 by kayg · 20 comments
Owner

Owner (2026-09-27), after seeing the Settings sheet: "the settings header needs progressive blur. what it has right now is fade and not progressive blur. … Settings pill looks pretty horrible. We should just show breadcrumbs there like we do in Files and Notes with everything being the same font size. please grill me and find any inconsistencies in the app like that."

This job is a read-only audit (no product code changes). Output feeds the orchestrator's grill with the owner.

Deliver

  1. Screenshot matrix from a production build of current dev: every route and sub-view (Home, Calendar day/week/month/agenda/year, Files + recent/shared/trash, Photos timeline/albums/viewer, Notes list + note, Tasks, Analytics, Ask, Search palette + full view, Settings every section, Admin, public share page, login/signup), at phone (390×844) and desktop (1440×900), light and dark, top and scrolled. Collapsed and open sidebar on desktop. Crop consistently so headers can be compared side by side. Save under artifacts/consistency-audit/ and build ONE contact sheet per theme×width (grid of header crops) so differences are visible at a glance.
  2. Inventory (markdown table, artifacts/consistency-audit/REPORT.md) of every instance of each chrome pattern with file:line and screenshot:
    • page headers/titles: which component (ModeHeader vs custom), font/size/weight, large-title vs compact, breadcrumb vs title vs back button/pill;
    • blur/translucency: every backdrop-filter use, classify as the shared progressive stack (ModeHeader), glass surface (OverlaySurface/FloatingSurface), fade/gradient only, or one-off; note blur radius/tint differences;
    • back/up navigation: pills, chevrons, breadcrumbs, swipe;
    • Copy link affordances: header button, per-item icon, menu item, per-heading icon;
    • pills/segmented controls: sizes, borders/outlines vs fill-only, radius;
    • borders/outlines and side highlights (owner rules: no outside borders, tint not border for selection);
    • type scale: any size not on the one rem scale; mixed crumb sizes; Fraunces vs UI font use per heading level;
    • empty states, loading states (skeleton vs spinner vs nothing), toasts, confirmation dialogs;
    • icon set/size/stroke inconsistencies; tooltip presence with shortcut on toolbar actions;
    • spacing: header heights, gutters, list row heights across modes;
    • same action with different names/icons in different places (e.g. Copy link vs Share link, Delete vs Move to Trash).
  3. For each inconsistency: the options seen, which one matches docs/DESIGN.md (§33, §34, §40–42) and the chrome rules, and a recommended single pattern. Group into a numbered list ready to become grill questions; mark ones already decided by DESIGN as "decided, just fix".

Do not fix anything. Post the REPORT on this issue and attach the contact sheets.

Owner (2026-09-27), after seeing the Settings sheet: "the settings header needs progressive blur. what it has right now is fade and not progressive blur. … Settings pill looks pretty horrible. We should just show breadcrumbs there like we do in Files and Notes with everything being the same font size. please grill me and find any inconsistencies in the app like that." This job is a **read-only audit** (no product code changes). Output feeds the orchestrator's grill with the owner. ## Deliver 1. **Screenshot matrix** from a production build of current `dev`: every route and sub-view (Home, Calendar day/week/month/agenda/year, Files + recent/shared/trash, Photos timeline/albums/viewer, Notes list + note, Tasks, Analytics, Ask, Search palette + full view, Settings every section, Admin, public share page, login/signup), at phone (390×844) and desktop (1440×900), light and dark, top and scrolled. Collapsed and open sidebar on desktop. Crop consistently so headers can be compared side by side. Save under `artifacts/consistency-audit/` and build ONE contact sheet per theme×width (grid of header crops) so differences are visible at a glance. 2. **Inventory** (markdown table, `artifacts/consistency-audit/REPORT.md`) of every instance of each chrome pattern with file:line and screenshot: - page headers/titles: which component (ModeHeader vs custom), font/size/weight, large-title vs compact, breadcrumb vs title vs back button/pill; - blur/translucency: every backdrop-filter use, classify as the shared progressive stack (ModeHeader), glass surface (OverlaySurface/FloatingSurface), fade/gradient only, or one-off; note blur radius/tint differences; - back/up navigation: pills, chevrons, breadcrumbs, swipe; - Copy link affordances: header button, per-item icon, menu item, per-heading icon; - pills/segmented controls: sizes, borders/outlines vs fill-only, radius; - borders/outlines and side highlights (owner rules: no outside borders, tint not border for selection); - type scale: any size not on the one rem scale; mixed crumb sizes; Fraunces vs UI font use per heading level; - empty states, loading states (skeleton vs spinner vs nothing), toasts, confirmation dialogs; - icon set/size/stroke inconsistencies; tooltip presence with shortcut on toolbar actions; - spacing: header heights, gutters, list row heights across modes; - same action with different names/icons in different places (e.g. Copy link vs Share link, Delete vs Move to Trash). 3. For each inconsistency: the options seen, which one matches docs/DESIGN.md (§33, §34, §40–42) and the chrome rules, and a recommended single pattern. Group into a numbered list ready to become grill questions; mark ones already decided by DESIGN as "decided, just fix". Do not fix anything. Post the REPORT on this issue and attach the contact sheets.
Author
Owner

Starting read-only consistency audit on branch job/ui-audit.

Base SHA: f1c0766907d5d1a0a3a7ea0ae807e43dd2caf9f0 (merge base with dev). I am checking the production-build capture path, then I will commit the matrix runner and report without committing the PNGs.

Starting read-only consistency audit on branch `job/ui-audit`. Base SHA: `f1c0766907d5d1a0a3a7ea0ae807e43dd2caf9f0` (merge base with `dev`). I am checking the production-build capture path, then I will commit the matrix runner and report without committing the PNGs.
Author
Owner

Audit finding — Photos albums are not in the current product surface. docs/DESIGN.md §33 (lines 928–930) says albums are not built; apps/web/src/lib/photos/PhotosSidebar.svelte (lines 2–5) says albums come when the API has them; and apps/web/src/lib/navigation.ts (lines 60–64) lists only All photos, Videos, and Stacks. I will record the requested album screen as not built and use the real unavailable state for the route capture; I will not seed a fake album.

Audit finding — Photos albums are not in the current product surface. `docs/DESIGN.md` §33 (lines 928–930) says albums are not built; `apps/web/src/lib/photos/PhotosSidebar.svelte` (lines 2–5) says albums come when the API has them; and `apps/web/src/lib/navigation.ts` (lines 60–64) lists only All photos, Videos, and Stacks. I will record the requested album screen as not built and use the real unavailable state for the route capture; I will not seed a fake album.
Author
Owner

Audit finding — Calendar photo pile counts use an 11px font. packages/ui/src/components/calendar/GridColumn.svelte:886–900 defines .count with font-size: 11px; the real Calendar capture is artifacts/consistency-audit/screenshots/calendar-week-1440-paper-sidebar-open-top.png. docs/DESIGN.md §34, lines 984–988, sets captions to at least 0.75rem (12px) and says components use the rem type tokens instead of raw pixel font sizes. Recommendation: use the shared caption token. This is decided by DESIGN; just fix. The audit makes no product change.

Audit finding — Calendar photo pile counts use an 11px font. `packages/ui/src/components/calendar/GridColumn.svelte:886–900` defines `.count` with `font-size: 11px`; the real Calendar capture is `artifacts/consistency-audit/screenshots/calendar-week-1440-paper-sidebar-open-top.png`. `docs/DESIGN.md` §34, lines 984–988, sets captions to at least 0.75rem (12px) and says components use the rem type tokens instead of raw pixel font sizes. Recommendation: use the shared caption token. This is decided by DESIGN; just fix. The audit makes no product change.
Author
Owner

Audit finding — Settings does not use the shared mode header or a progressive header blur. apps/web/src/routes/settings/[...path]/+page.svelte:233–271 wraps Settings in OverlaySurface; its narrow detail header renders a Pill named “Settings” above a LinkedHeading. The wide content uses .scroll-fade-end at line 256; the class applies a bottom-edge mask gradient (packages/ui/src/tokens.css:471–480), not blur. The shared progressive 1/2/4/8/16px stack is in packages/ui/src/components/ModeHeader.svelte:238–247, 536–568. Recommendation: use that layered pattern at the Settings content header and replace the back pill with a Settings → section breadcrumb whose crumbs share one type size. Keep the OverlaySurface scrim material intact. DESIGN does not state whether the inner header and full-screen scrim are separate blur stacks; I treat them as separate because they blur different content layers, and list that as an owner grill question. Read-only audit; no product code changed.

Audit finding — Settings does not use the shared mode header or a progressive header blur. `apps/web/src/routes/settings/[...path]/+page.svelte:233–271` wraps Settings in `OverlaySurface`; its narrow detail header renders a `Pill` named “Settings” above a `LinkedHeading`. The wide content uses `.scroll-fade-end` at line 256; the class applies a bottom-edge mask gradient (`packages/ui/src/tokens.css:471–480`), not blur. The shared progressive 1/2/4/8/16px stack is in `packages/ui/src/components/ModeHeader.svelte:238–247, 536–568`. Recommendation: use that layered pattern at the Settings content header and replace the back pill with a Settings → section breadcrumb whose crumbs share one type size. Keep the OverlaySurface scrim material intact. DESIGN does not state whether the inner header and full-screen scrim are separate blur stacks; I treat them as separate because they blur different content layers, and list that as an owner grill question. Read-only audit; no product code changed.
Author
Owner

Audit finding — Photos uses “Move to Trash” for the toolbar/menu action, but “Delete” for the confirmation title and member choices for RAW+JPEG, Live Photo and burst stacks. apps/web/src/lib/photos/PhotosView.svelte:390–403 shows the wording; the dialog body says the files move to Trash, and runTrash calls the shared trashItems operation at lines 433–438. The ordinary Photos toolbar and ⋯ menu say “Move to Trash” at lines 735 and 527. DESIGN §28 says pair/stack deletion asks which members (lines 733–734), but it does not name the reversible action. Recommendation: use “Move to Trash” for the dialog title and choices, and keep “Delete” for irreversible operations. The photos-stacks matrix screenshot shows the resting screen; this confirmation state is source-inventoried, not captured. Read-only audit; no product code changed.

Audit finding — Photos uses “Move to Trash” for the toolbar/menu action, but “Delete” for the confirmation title and member choices for RAW+JPEG, Live Photo and burst stacks. `apps/web/src/lib/photos/PhotosView.svelte:390–403` shows the wording; the dialog body says the files move to Trash, and `runTrash` calls the shared `trashItems` operation at lines 433–438. The ordinary Photos toolbar and ⋯ menu say “Move to Trash” at lines 735 and 527. DESIGN §28 says pair/stack deletion asks which members (lines 733–734), but it does not name the reversible action. Recommendation: use “Move to Trash” for the dialog title and choices, and keep “Delete” for irreversible operations. The `photos-stacks` matrix screenshot shows the resting screen; this confirmation state is source-inventoried, not captured. Read-only audit; no product code changed.
Author
Owner

Merged dev source review: the glass refactor centralizes blur recipes in packages/ui/src/tokens.css. Current roles are .glass-chrome at 10px/1.5, .glass-overlay at 16px/1.5, the bounded Analytics readout at 40px/1.6, and the shared 1/2/4/8/16px progressive stack. The 8px scrim remains the live blur owner. The audit report now reflects the source at dev 74d60726. Rebuilding the production SPA and server before the fresh screenshot matrix.

Merged dev source review: the glass refactor centralizes blur recipes in packages/ui/src/tokens.css. Current roles are .glass-chrome at 10px/1.5, .glass-overlay at 16px/1.5, the bounded Analytics readout at 40px/1.6, and the shared 1/2/4/8/16px progressive stack. The 8px scrim remains the live blur owner. The audit report now reflects the source at dev 74d60726. Rebuilding the production SPA and server before the fresh screenshot matrix.
Author
Owner

Audit tooling finding: the first CONSISTENCY_PRIMARY list used settings-admin-users and similar names, but routes() emits admin-users, admin-invitations, admin-sign-in, admin-configuration and admin-backups. Those five Admin routes would have been omitted. Fixed the route names and added matrix merging for a focused rerun. The current capture has reached 364 screenshots; after it writes its manifest, I will capture the missing Admin groups and regenerate all contact sheets from the merged manifest.

Audit tooling finding: the first CONSISTENCY_PRIMARY list used `settings-admin-users` and similar names, but `routes()` emits `admin-users`, `admin-invitations`, `admin-sign-in`, `admin-configuration` and `admin-backups`. Those five Admin routes would have been omitted. Fixed the route names and added matrix merging for a focused rerun. The current capture has reached 364 screenshots; after it writes its manifest, I will capture the missing Admin groups and regenerate all contact sheets from the merged manifest.
Author
Owner

The first combined capture wrote 456 full screenshots and 456 header crops, then exited before creating its matrix/contacts. Evidence: the existing offline navigation assertion at apps/web/e2e/layout-sweep.mjs:1898 raised offlineMessage.isVisible() === false after the route expected the offline message. I did not change product code. Added --consistency-only --resume-consistency so the screenshot matrix can complete without the unrelated layout assertion; rerunning from existing images now.

The first combined capture wrote 456 full screenshots and 456 header crops, then exited before creating its matrix/contacts. Evidence: the existing offline navigation assertion at apps/web/e2e/layout-sweep.mjs:1898 raised `offlineMessage.isVisible() === false` after the route expected the offline message. I did not change product code. Added `--consistency-only --resume-consistency` so the screenshot matrix can complete without the unrelated layout assertion; rerunning from existing images now.
Author
Owner

Source consistency finding: docs/DESIGN.md §34 says Search opens from its button or Cmd/Ctrl+/. The shortcut registry assigns app.search to Cmd/Ctrl+K (apps/web/src/lib/shortcuts/registry.ts:127–134), while its adjacent comments name both slash and K. Recommendation in REPORT.md: align the registry and generated tooltip/help text with the documented slash shortcut. The audit opens the palette through the Search button.

Source consistency finding: docs/DESIGN.md §34 says Search opens from its button or Cmd/Ctrl+/. The shortcut registry assigns `app.search` to Cmd/Ctrl+K (`apps/web/src/lib/shortcuts/registry.ts:127–134`), while its adjacent comments name both slash and K. Recommendation in REPORT.md: align the registry and generated tooltip/help text with the documented slash shortcut. The audit opens the palette through the Search button.
Author
Owner

Adversarial evidence from the local server built at dev SHA 0558cc4eca:

  • The editor history probe (seed 25608414) sent 500 undo and 500 redo actions after hostile paste and Unicode input. It did not save the three expected unique block anchors within 30 seconds. The saved body still had repeated source ^duplicate-id anchors. I will check this against the newer dev tree before deciding whether to file a product issue.
  • The bookmark capture probe sent 16 concurrent POST requests. Four returned no HTTP response; the other 12 returned 429. The server stayed running. I will repeat this after merging current dev to separate product behavior from shared-host load.
  • The live-editor restart probe saved its edit once, then reported browser 502s while the test runner had deliberately stopped the backend. This looks like the probe counts the expected outage as an error; it did not show data loss.
  • Other findings so far are labeled SLOW and count as load under the owner rule.

The full round is still running.

Adversarial evidence from the local server built at dev SHA 0558cc4ecaeb7f51af1e06acd31870b5f87b9f00: - The editor history probe (seed 25608414) sent 500 undo and 500 redo actions after hostile paste and Unicode input. It did not save the three expected unique block anchors within 30 seconds. The saved body still had repeated source `^duplicate-id` anchors. I will check this against the newer dev tree before deciding whether to file a product issue. - The bookmark capture probe sent 16 concurrent POST requests. Four returned no HTTP response; the other 12 returned 429. The server stayed running. I will repeat this after merging current dev to separate product behavior from shared-host load. - The live-editor restart probe saved its edit once, then reported browser 502s while the test runner had deliberately stopped the backend. This looks like the probe counts the expected outage as an error; it did not show data loss. - Other findings so far are labeled SLOW and count as load under the owner rule. The full round is still running.
Author
Owner

Final pass resumed on branch job/ui-audit. Pre-merge head: 6b6a9126e4. Merged current dev once at ac048aa4b8; merge head: 5b90709f31. The existing 552-capture matrix and four local contact sheets are from source 0558cc4eca. I am finishing the report with that evidence and will mark the post-capture UI changes and uncaptured states as not covered. No product source changes.

Final pass resumed on branch job/ui-audit. Pre-merge head: 6b6a9126e4bc2c54d217a0dfcc3aeefab0092452. Merged current dev once at ac048aa4b8828ada23e2e6145739a70e146af1df; merge head: 5b90709f3183949bbb7cdb869aae4245f676aba5. The existing 552-capture matrix and four local contact sheets are from source 0558cc4ecaeb7f51af1e06acd31870b5f87b9f00. I am finishing the report with that evidence and will mark the post-capture UI changes and uncaptured states as not covered. No product source changes.
Author
Owner

Coverage finding — the existing matrix has 552 screenshots and 552 header crops from 0558cc4. The single required merge brought in dev ac048aa4, which changes visible app-shell, ModeHeader, ChromeActions, Calendar, Files, Photos, Notes, Settings → Photos and toast components. The capture was not repeated. REPORT.md now marks these current-HEAD surfaces as not covered and retains the old snapshot as the evidence baseline. The four contact sheets remain attached above; no screenshots were committed.

Coverage finding — the existing matrix has 552 screenshots and 552 header crops from 0558cc4. The single required merge brought in dev ac048aa4, which changes visible app-shell, ModeHeader, ChromeActions, Calendar, Files, Photos, Notes, Settings → Photos and toast components. The capture was not repeated. REPORT.md now marks these current-HEAD surfaces as not covered and retains the old snapshot as the evidence baseline. The four contact sheets remain attached above; no screenshots were committed.
Author
Owner

Final report

Continued Forgejo #237 on job/ui-audit. Merged current dev once at ac048aa4b8828ada23e2e6145739a70e146af1df (merge commit 5b90709f3183949bbb7cdb869aae4245f676aba5). Report update commit and pushed head: c847af8d355aa9f117af4c97a5d4f02e9ee954de.

Delivered

  • Updated artifacts/consistency-audit/REPORT.md with the capture snapshot, coverage counts, four contact sheets, findings, decisions outside DESIGN, and an explicit not-covered list.
  • The matrix has 552 full screenshots and 552 header crops across 47 capture names and 46 URL paths. Four contact sheets and the portable matrix are attached.
  • No product source files changed. Screenshot PNGs remain uncommitted.

Contact sheets: paper 390, paper 1440, Tokyo Night 390, Tokyo Night 1440. Portable matrix.

Gate output

  • cargo fmt --check: passed, exit 0; no stdout or stderr.
  • cargo clippy --all-targets -- -D warnings: passed, exit 0.
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 20m 56s
  • cargo test: failed in calternal-collab.
---- concurrent_clients_and_external_writer_converge stdout ----

thread 'concurrent_clients_and_external_writer_converge' (453025) panicked at crates/calternal-collab/tests/two_clients.rs:224:5:
---
calternal-id: 558eb4a8-4b10-493b-ae43-741c0c31e4a0
title: Live
---

first

second

external

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.00s

error: test failed, to rerun `-p calternal-collab --test two_clients`

The clients converged in memory, but the final file lacked both client edits. The assertion reads after a fixed 900 ms; the flush code allows MAX_FLUSH_WAIT = 3s. A targeted diagnostic rerun timed out after 180 seconds during compilation, before the test ran. This may be a slow flush, but persistence is not verified. Finding recorded here for follow-up; this audit made no product change.

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

svelte-check found 0 errors and 0 warnings
  • bun run test: passed.
Test Files  82 passed (82)
     Tests  593 passed (593)
   Duration  92.52s (transform 64%, import 14%, environment 12%, tests 7%, setup 2%)
  • Adversarial round: incomplete. The first harness attempt failed before server startup because sccache used a removed fonts/target/tmp. The bounded current-source retry built the server and reached fixture setup; finish, login and installation returned 200, then /api/v1/auth/app-passwords returned ECONNRESET as the eight-minute limit stopped the run (exit 124). No adversarial probes completed.

Not covered / remaining work

  • The screenshot matrix is from dev SHA 0558cc4ecaeb7f51af1e06acd31870b5f87b9f00. The later merge to ac048aa4 changed the app shell, header, Calendar, Files, Photos, Notes, Settings → Photos and toast surfaces; recapture these before treating this as current-HEAD visual coverage.
  • Photos albums are not implemented; the matrix records the unavailable route, not an album view.
  • Toasts, confirmations, empty/loading states, the open phone sidebar, keyboard/screen-reader/focus behavior, reduced motion and broad layout assertions were not covered by screenshots.
  • Reproduce and resolve or separately track the Collab persistence test failure. Complete the current-source adversarial probe round with a healthy setup.

Decisions outside DESIGN

  • Settings header: this report treats the progressive inner header and full-screen scrim as separate blur stacks because they blur different content layers. DESIGN does not define how they compose; confirm during the owner grill.
  • Photos confirmation: recommend “Move to Trash” to match the reversible operation and toolbar wording. DESIGN does not specify the confirmation label.

Existing report: artifacts/consistency-audit/REPORT.md. Contact sheets are attached above and were not committed.

# Final report Continued Forgejo #237 on `job/ui-audit`. Merged current `dev` once at `ac048aa4b8828ada23e2e6145739a70e146af1df` (merge commit `5b90709f3183949bbb7cdb869aae4245f676aba5`). Report update commit and pushed head: `c847af8d355aa9f117af4c97a5d4f02e9ee954de`. ## Delivered - Updated `artifacts/consistency-audit/REPORT.md` with the capture snapshot, coverage counts, four contact sheets, findings, decisions outside DESIGN, and an explicit not-covered list. - The matrix has 552 full screenshots and 552 header crops across 47 capture names and 46 URL paths. Four contact sheets and the portable matrix are attached. - No product source files changed. Screenshot PNGs remain uncommitted. Contact sheets: [paper 390](https://git.kayg.org/attachments/8706e4dd-9a3e-43c0-b87a-c788f0d9b861), [paper 1440](https://git.kayg.org/attachments/8a78960f-71d8-4953-9b1e-69dea6d2024c), [Tokyo Night 390](https://git.kayg.org/attachments/c66f93e0-6c7c-4980-baaa-80ca68446bf5), [Tokyo Night 1440](https://git.kayg.org/attachments/d0c9a74b-c843-43a0-99a3-93fa7826bede). [Portable matrix](https://git.kayg.org/attachments/9f7364c2-2a62-43ca-8695-6178dc65d1f8). ## Gate output - `cargo fmt --check`: passed, exit 0; no stdout or stderr. - `cargo clippy --all-targets -- -D warnings`: passed, exit 0. ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 20m 56s ``` - `cargo test`: failed in `calternal-collab`. ```text ---- concurrent_clients_and_external_writer_converge stdout ---- thread 'concurrent_clients_and_external_writer_converge' (453025) panicked at crates/calternal-collab/tests/two_clients.rs:224:5: --- calternal-id: 558eb4a8-4b10-493b-ae43-741c0c31e4a0 title: Live --- first second external test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.00s error: test failed, to rerun `-p calternal-collab --test two_clients` ``` The clients converged in memory, but the final file lacked both client edits. The assertion reads after a fixed 900 ms; the flush code allows `MAX_FLUSH_WAIT = 3s`. A targeted diagnostic rerun timed out after 180 seconds during compilation, before the test ran. This may be a slow flush, but persistence is not verified. Finding recorded here for follow-up; this audit made no product change. - `bun run check`: passed. ```text $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/ui-audit/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` - `bun run test`: passed. ```text Test Files 82 passed (82) Tests 593 passed (593) Duration 92.52s (transform 64%, import 14%, environment 12%, tests 7%, setup 2%) ``` - Adversarial round: incomplete. The first harness attempt failed before server startup because sccache used a removed `fonts/target/tmp`. The bounded current-source retry built the server and reached fixture setup; `finish`, login and installation returned 200, then `/api/v1/auth/app-passwords` returned `ECONNRESET` as the eight-minute limit stopped the run (exit 124). No adversarial probes completed. ## Not covered / remaining work - The screenshot matrix is from `dev` SHA `0558cc4ecaeb7f51af1e06acd31870b5f87b9f00`. The later merge to `ac048aa4` changed the app shell, header, Calendar, Files, Photos, Notes, Settings → Photos and toast surfaces; recapture these before treating this as current-HEAD visual coverage. - Photos albums are not implemented; the matrix records the unavailable route, not an album view. - Toasts, confirmations, empty/loading states, the open phone sidebar, keyboard/screen-reader/focus behavior, reduced motion and broad layout assertions were not covered by screenshots. - Reproduce and resolve or separately track the Collab persistence test failure. Complete the current-source adversarial probe round with a healthy setup. ## Decisions outside DESIGN - Settings header: this report treats the progressive inner header and full-screen scrim as separate blur stacks because they blur different content layers. DESIGN does not define how they compose; confirm during the owner grill. - Photos confirmation: recommend “Move to Trash” to match the reversible operation and toolbar wording. DESIGN does not specify the confirmation label. Existing report: `artifacts/consistency-audit/REPORT.md`. Contact sheets are attached above and were not committed.
Author
Owner

Triaged by the orchestrator; follow-up #261237 folds the capture script and report into dev and fixes the clear items. Closing.

Triaged by the orchestrator; follow-up #261237 folds the capture script and report into dev and fixes the clear items. Closing.
kayg closed this issue 2026-09-27 19:16:41 +00:00
Author
Owner

Starting weekly consistency hunt on branch job/hunt-20260928, based on dev at c9ec6aff84a9ec810124a2cfbdd07c189eea1b9c. I read CLAUDE.md, docs/DESIGN.md, and CONTEXT.md. Issue #237 is closed and contains a prior app-wide chrome audit; this run follows the current job scope and will add a source inventory audit plus comments/issues for current actionable findings.

Starting weekly consistency hunt on branch `job/hunt-20260928`, based on `dev` at `c9ec6aff84a9ec810124a2cfbdd07c189eea1b9c`. I read `CLAUDE.md`, `docs/DESIGN.md`, and `CONTEXT.md`. Issue #237 is closed and contains a prior app-wide chrome audit; this run follows the current job scope and will add a source inventory audit plus comments/issues for current actionable findings.
Author
Owner

Docs drift found 2026-09-28 (for the consistency hunt): DESIGN.md §26 (lines 395, 404, 1504) still says daily notes live in Notes/Journal/YYYYMMDD-dailynote.md. Commit 25320b1a (2026-09-26, the flat layout) moved them to Notes/YYYYMMDD-dailynote.md and identifies them by filename anywhere in Home; CONTEXT.md was updated, DESIGN.md was not. Production also has an empty leftover Notes/Journal/ folder. Fix: update DESIGN §26 to match, and stop creating or remove the empty Journal/ folder (only if it is empty and was created by calternal).

Docs drift found 2026-09-28 (for the consistency hunt): DESIGN.md §26 (lines 395, 404, 1504) still says daily notes live in `Notes/Journal/YYYYMMDD-dailynote.md`. Commit 25320b1a (2026-09-26, the flat layout) moved them to `Notes/YYYYMMDD-dailynote.md` and identifies them by filename anywhere in Home; CONTEXT.md was updated, DESIGN.md was not. Production also has an empty leftover `Notes/Journal/` folder. Fix: update DESIGN §26 to match, and stop creating or remove the empty `Journal/` folder (only if it is empty and was created by calternal).
Author
Owner

Weekly consistency hunt report

Branch: job/hunt-20260928
Scanned source SHA: c9ec6aff84a9ec810124a2cfbdd07c189eea1b9c
Merged dev once before the final gates at 6c1e5062c781feb87a85a70825a69661239bc855. That merge adds documentation only; the application and package sources have no changes since the scan.
Head SHA: 8fc4db28 (docs: record merged dev source scope).
Push: Everything up-to-date.

Work

  • Added docs/audits/consistency-2026-09-28.md with literal counts, source evidence, primitive and formatter reuse findings, glossary drift and limitations. The prior report has no comparable numeric counts, so the report records previous counts as “not recorded” and deltas as “N/A”.
  • Removed six redundant theme-variable fallbacks. Every theme defines --danger and --on-accent (ab59c3d6).
  • Replaced workspace with the glossary term Home in the three route error messages (7d8f6323). The wording consolidation in #312 remains open.

Files changed for this hunt:

  • docs/audits/consistency-2026-09-28.md
  • apps/web/src/lib/components/search-dialog.svelte
  • apps/web/src/lib/notes/NoteView.svelte
  • apps/web/src/routes/settings/appearance/FontsGroup.svelte
  • packages/ui/src/components/notes/NoteProperties.svelte
  • apps/web/src/routes/+layout.svelte
  • apps/web/src/routes/+error.svelte
  • apps/web/src/routes/[...path]/+page.svelte

Findings

Created #307–#312:

  • #307: role-based spacing and layer tokens
  • #308: one shared .sr-only utility
  • #309: shared tooltip for gradient values
  • #310: shared attachment and duration formatters
  • #311: one Notes collaborator fallback colour
  • #312: route error wording and shared message ownership; the glossary term is fixed on this branch, and message consolidation remains open

Added evidence to existing #287, #299, #291 and #73 instead of duplicating those issues. No new screenshot evidence was collected for #253, so I did not add a comment there. No API changed, so no adversarial round applied.

Final gates

cargo fmt --check — exit 0; no output.

cargo clippy --all-targets -- -D warnings — exit 0. Verbatim output:

   Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/hunt-20260928/crates/calternal-server)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 14.15s

cargo test — exit 0. Verbatim completion and test summaries:

    Finished `test` profile [unoptimized + debuginfo] target(s) in 18m 52s

test result: ok. 50 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 30.20s
test result: ok. 486 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s
test result: ok. 117 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 36.01s
test result: ok. 100 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 58.51s

bun run check — exit 0. Verbatim output:

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

svelte-check found 0 errors and 0 warnings

bun run test — exit 0. Vitest reported:

 Test Files  107 passed (107)
      Tests  701 passed (701)
   Start at  10:25:17
   Duration  125.70s (transform 61%, environment 15%, import 13%, tests 7%, setup 3%)

The test output also showed non-failing jsdom scrollTo() notices and one CSS parse warning. The first clippy attempt stopped because apps/web/build/ did not exist. bun run build created the required embedded frontend output, clippy was rerun and passed, then the web build output was removed. cargo clean removed 13,957 files (10.9 GiB).

Known gaps and decisions

  • The previous report has no numeric baseline. This hunt cannot claim source-count growth or decline against it.
  • This is a source audit, not a production screenshot review. It does not verify all modes, hover and selection behavior, context menus, empty and transient states, keyboard and screen-reader behavior, focus rings, touch or cap-height alignment. #253 remains open.
  • Add spacing and layer tokens by role; keep local values where no shared role fits.
  • Keep one app-level .sr-only utility. Extend the shared tooltip for dynamic gradient values.
  • Preserve the recorder duration display’s floor-to-seconds and M:SS behavior when sharing formatting.
  • Keep the collaborator fallback colour in one Notes-owned location.
  • Use Home in these route errors. Keep the shared message ownership work in #312 open.
## Weekly consistency hunt report Branch: `job/hunt-20260928` Scanned source SHA: `c9ec6aff84a9ec810124a2cfbdd07c189eea1b9c` Merged `dev` once before the final gates at `6c1e5062c781feb87a85a70825a69661239bc855`. That merge adds documentation only; the application and package sources have no changes since the scan. Head SHA: `8fc4db28` (`docs: record merged dev source scope`). Push: `Everything up-to-date`. ### Work - Added `docs/audits/consistency-2026-09-28.md` with literal counts, source evidence, primitive and formatter reuse findings, glossary drift and limitations. The prior report has no comparable numeric counts, so the report records previous counts as “not recorded” and deltas as “N/A”. - Removed six redundant theme-variable fallbacks. Every theme defines `--danger` and `--on-accent` (`ab59c3d6`). - Replaced `workspace` with the glossary term `Home` in the three route error messages (`7d8f6323`). The wording consolidation in #312 remains open. Files changed for this hunt: - `docs/audits/consistency-2026-09-28.md` - `apps/web/src/lib/components/search-dialog.svelte` - `apps/web/src/lib/notes/NoteView.svelte` - `apps/web/src/routes/settings/appearance/FontsGroup.svelte` - `packages/ui/src/components/notes/NoteProperties.svelte` - `apps/web/src/routes/+layout.svelte` - `apps/web/src/routes/+error.svelte` - `apps/web/src/routes/[...path]/+page.svelte` ### Findings Created #307–#312: - #307: role-based spacing and layer tokens - #308: one shared `.sr-only` utility - #309: shared tooltip for gradient values - #310: shared attachment and duration formatters - #311: one Notes collaborator fallback colour - #312: route error wording and shared message ownership; the glossary term is fixed on this branch, and message consolidation remains open Added evidence to existing #287, #299, #291 and #73 instead of duplicating those issues. No new screenshot evidence was collected for #253, so I did not add a comment there. No API changed, so no adversarial round applied. ### Final gates `cargo fmt --check` — exit 0; no output. `cargo clippy --all-targets -- -D warnings` — exit 0. Verbatim output: ```text Compiling calternal-server v0.0.1 (/home/kayg/Developer/calternal-wt/hunt-20260928/crates/calternal-server) Finished `dev` profile [unoptimized + debuginfo] target(s) in 14.15s ``` `cargo test` — exit 0. Verbatim completion and test summaries: ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 18m 52s test result: ok. 50 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 30.20s test result: ok. 486 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s test result: ok. 117 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 36.01s test result: ok. 100 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 58.51s ``` `bun run check` — exit 0. Verbatim output: ```text $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/hunt-20260928/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test` — exit 0. Vitest reported: ```text Test Files 107 passed (107) Tests 701 passed (701) Start at 10:25:17 Duration 125.70s (transform 61%, environment 15%, import 13%, tests 7%, setup 3%) ``` The test output also showed non-failing jsdom `scrollTo()` notices and one CSS parse warning. The first clippy attempt stopped because `apps/web/build/` did not exist. `bun run build` created the required embedded frontend output, clippy was rerun and passed, then the web build output was removed. `cargo clean` removed 13,957 files (10.9 GiB). ### Known gaps and decisions - The previous report has no numeric baseline. This hunt cannot claim source-count growth or decline against it. - This is a source audit, not a production screenshot review. It does not verify all modes, hover and selection behavior, context menus, empty and transient states, keyboard and screen-reader behavior, focus rings, touch or cap-height alignment. #253 remains open. - Add spacing and layer tokens by role; keep local values where no shared role fits. - Keep one app-level `.sr-only` utility. Extend the shared tooltip for dynamic gradient values. - Preserve the recorder duration display’s floor-to-seconds and `M:SS` behavior when sharing formatting. - Keep the collaborator fallback colour in one Notes-owned location. - Use `Home` in these route errors. Keep the shared message ownership work in #312 open.
Author
Owner

Started consistency hunt on branch job/hunt-20260930 at base SHA 55a2f90feb (origin/dev). I will run the glass/responsive guard, audit current dev foundations and cross-user isolation, record evidence in docs/audits/consistency-2026-09-30.md, and report findings here.

Started consistency hunt on branch job/hunt-20260930 at base SHA 55a2f90feb8a52d91f8bbc1347889b509af02260 (origin/dev). I will run the glass/responsive guard, audit current dev foundations and cross-user isolation, record evidence in docs/audits/consistency-2026-09-30.md, and report findings here.
Author
Owner

Starting consistency hunt on job/hunt-20260930 at 55a2f90feb. The worktree has a pre-existing apps/web/package.json change for test:e2e:consistency; I will preserve it. I will merge origin/dev once before the final gates and report the resulting head SHA.

Starting consistency hunt on job/hunt-20260930 at 55a2f90feb8a52d91f8bbc1347889b509af02260. The worktree has a pre-existing apps/web/package.json change for test:e2e:consistency; I will preserve it. I will merge origin/dev once before the final gates and report the resulting head SHA.
Author
Owner

Consistency hunt complete for branch job/hunt-20260930.

Audit: consistency-2026-09-30.md
Head: ab66086e80d7031fae4476b936dea3fb37095995

Findings and follow-ups

  • Style scan counts and top files are in the audit. Direct motion values grew from 142 to 167; direct easing values grew from 105 to 124. Follow-up: #477. Other style and shared-primitive evidence was added to existing issues #299, #307–#312, #319 and #73.
  • The production route matrix has 44 routes and no Mail or Money route. Follow-up: #478.
  • The visible “Vault health” label conflicts with CONTEXT.md; #312 has the evidence. No implementation of the three OPEN design decisions was found.
  • The two-User probe classified all 308 operations. It found no denial failure or new cross-User leak. Fifteen identifier routes still have no local fixture factory, unchanged from the previous hunt.
  • The production browser guard stopped at the 80-minute timebox with exit code 130. It saved 658 screenshots and header crops, but did not write contact sheets or a manifest. It did not reach the menu-blur or touch probes, and it did not run the phone pass. Treat the browser result as incomplete.

Eight real-build screenshots are attached above: Home and Files at 1440 px and 820 px, in light and dark themes. The screenshots are not committed.

Gate output

cargo fmt --check exited 0 with no output.

bun run check output:

$ node scripts/check-type-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Text sizes use shared role tokens.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/hunt-20260930/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run test output included non-failing Not implemented: Window's scrollTo() method and Could not parse CSS stylesheet messages. The result was:

 Test Files  136 passed (136)
      Tests  877 passed (877)
   Start at  08:17:56
   Duration  315.53s (transform 63%, environment 15%, import 11%, tests 7%, setup 4%)

  Transform  |component| transforming modules took 589.74s · 52% of tracked time, re-done on every run

The two-User probe output:

Cross-User classification gate: 308 operations classified
Two-User OpenAPI matrix: 308 operations classified; 153 operations replayed; 549 A-ID vs missing-ID comparisons across B, C, D and anonymous; 15 identifier routes classified with no local fixture factory; median absolute timing delta 9.0 ms
Job/Mail/quota ownership checks: 77 comparisons; 0 denial failures

cargo clippy --workspace --all-targets -- -D warnings was stopped at the job timebox after about 50 minutes, with exit code 130 and no diagnostic. cargo test --workspace was not run. The job changed only the audit document, so no Rust crate source changed.

cargo clean output: Removed 10428 files, 5.2GiB total. The web build output was deleted.

Decisions

  • Keep a local drawing value when no shared role token fits. Route repeated motion values through packages/ui/src/motion.ts.
  • Keep Mail and Files size-unit policy explicit if they share a formatter.
  • Use “Notes health” for the visible label, per CONTEXT.md.
  • Add Mail and Money to the production consistency matrix.

Commits: ea4f8d77, a9280e14, 110b5e3f, ab66086e. The existing uncommitted apps/web/package.json script change was present before this audit and remains untouched.

Consistency hunt complete for branch `job/hunt-20260930`. Audit: [consistency-2026-09-30.md](https://git.kayg.org/kayg/calternal/src/branch/job/hunt-20260930/docs/audits/consistency-2026-09-30.md) Head: `ab66086e80d7031fae4476b936dea3fb37095995` **Findings and follow-ups** - Style scan counts and top files are in the audit. Direct motion values grew from 142 to 167; direct easing values grew from 105 to 124. Follow-up: #477. Other style and shared-primitive evidence was added to existing issues #299, #307–#312, #319 and #73. - The production route matrix has 44 routes and no Mail or Money route. Follow-up: #478. - The visible “Vault health” label conflicts with CONTEXT.md; #312 has the evidence. No implementation of the three OPEN design decisions was found. - The two-User probe classified all 308 operations. It found no denial failure or new cross-User leak. Fifteen identifier routes still have no local fixture factory, unchanged from the previous hunt. - The production browser guard stopped at the 80-minute timebox with exit code 130. It saved 658 screenshots and header crops, but did not write contact sheets or a manifest. It did not reach the menu-blur or touch probes, and it did not run the phone pass. Treat the browser result as incomplete. Eight real-build screenshots are attached above: Home and Files at 1440 px and 820 px, in light and dark themes. The screenshots are not committed. **Gate output** `cargo fmt --check` exited 0 with no output. `bun run check` output: ```text $ node scripts/check-type-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Text sizes use shared role tokens. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/hunt-20260930/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test` output included non-failing `Not implemented: Window's scrollTo() method` and `Could not parse CSS stylesheet` messages. The result was: ```text Test Files 136 passed (136) Tests 877 passed (877) Start at 08:17:56 Duration 315.53s (transform 63%, environment 15%, import 11%, tests 7%, setup 4%) Transform |component| transforming modules took 589.74s · 52% of tracked time, re-done on every run ``` The two-User probe output: ```text Cross-User classification gate: 308 operations classified Two-User OpenAPI matrix: 308 operations classified; 153 operations replayed; 549 A-ID vs missing-ID comparisons across B, C, D and anonymous; 15 identifier routes classified with no local fixture factory; median absolute timing delta 9.0 ms Job/Mail/quota ownership checks: 77 comparisons; 0 denial failures ``` `cargo clippy --workspace --all-targets -- -D warnings` was stopped at the job timebox after about 50 minutes, with exit code 130 and no diagnostic. `cargo test --workspace` was not run. The job changed only the audit document, so no Rust crate source changed. `cargo clean` output: `Removed 10428 files, 5.2GiB total`. The web build output was deleted. **Decisions** - Keep a local drawing value when no shared role token fits. Route repeated motion values through `packages/ui/src/motion.ts`. - Keep Mail and Files size-unit policy explicit if they share a formatter. - Use “Notes health” for the visible label, per CONTEXT.md. - Add Mail and Money to the production consistency matrix. Commits: `ea4f8d77`, `a9280e14`, `110b5e3f`, `ab66086e`. The existing uncommitted `apps/web/package.json` script change was present before this audit and remains untouched.
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#237
No description provided.