Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
728 commits
Select commit Hold shift + click to select a range
8d40f1f
docs: record bounded organization lineage export
seonghobae Aug 21, 2026
f48e4b4
ui: explain incomplete provider sync blockers
seonghobae Aug 21, 2026
285ec04
fix: accept resumable upload progress responses
seonghobae Aug 21, 2026
ee55149
fix: honor resumable upload acknowledgement semantics
seonghobae Aug 21, 2026
5fda919
docs: record fresh icloud materialization receipt
seonghobae Aug 21, 2026
1411c36
test: reject assumed OneDrive upload progress
seonghobae Aug 21, 2026
8b95a2d
fix: bind OneDrive resume offsets to server evidence
seonghobae Aug 21, 2026
cc693e4
docs: record scheduler oidc startup failure
seonghobae Aug 21, 2026
190239a
test: cover release SBOM Cargo manifest
seonghobae Aug 21, 2026
39ad42e
test: cover cache cleanup help without home
seonghobae Aug 21, 2026
80fd8c2
fix: terminate cache cleanup help before environment lookup
seonghobae Aug 21, 2026
26ca6e5
fix: bind release SBOM metadata to Rust manifest
seonghobae Aug 21, 2026
6140fec
test: reject disk-full numeric prefix collisions
seonghobae Aug 21, 2026
33eaee5
fix: bound provider disk-full numeric codes
seonghobae Aug 21, 2026
5bb576e
test: cover disk-full numeric marker boundaries
seonghobae Aug 21, 2026
98d4ca8
feat: add ontology-bound orphan cache cleanup (#245)
seonghobae Aug 21, 2026
64e58c9
fix: bound resumable upload no-progress loops
seonghobae Aug 21, 2026
682fff3
feat: add accessible Storybook UX contracts
seonghobae Aug 21, 2026
eb89d67
test: execute Storybook interaction contracts
seonghobae Aug 21, 2026
dc5a900
ci: install Chromium for Storybook checks
seonghobae Aug 21, 2026
9b7422a
fix: enforce Storybook accessibility edges
seonghobae Aug 21, 2026
5882c6e
test: assert mobile Storybook viewport
seonghobae Aug 21, 2026
f718620
fix: make Storybook checks test built output
seonghobae Aug 21, 2026
0a2c22d
docs: bind ADR to static Storybook checks
seonghobae Aug 21, 2026
e086965
test: isolate Storybook viewport state
seonghobae Aug 21, 2026
35e7005
fix: isolate Storybook viewport per story
seonghobae Aug 21, 2026
6a46a2c
refactor: use Svelte 5 layout children
seonghobae Aug 21, 2026
21b143d
docs: refresh Storybook test evidence
seonghobae Aug 21, 2026
0a1506a
test: keep checking state non-cancellable
seonghobae Aug 21, 2026
9317023
fix: keep checking provider state non-cancellable
seonghobae Aug 21, 2026
fcff463
fix: expose finder cancellation for provider errors
seonghobae Aug 21, 2026
fcb57a7
test: isolate design-system button styling
seonghobae Aug 21, 2026
c2dc2eb
fix: scope design-system button visuals
seonghobae Aug 21, 2026
3b13600
fix: opt scan actions into design controls
seonghobae Aug 21, 2026
9f2644a
fix: opt provider action into design controls
seonghobae Aug 21, 2026
800da44
docs: record exact-head ecosystem audit
seonghobae Aug 21, 2026
ef30368
docs: bind ecosystem audit to current head
seonghobae Aug 21, 2026
2a4ed38
fix: style provider card headings consistently
seonghobae Aug 21, 2026
2c57310
docs: refresh UX test evidence
seonghobae Aug 21, 2026
aa7437f
docs: bind ecosystem audit to latest UX head
seonghobae Aug 21, 2026
e13714e
docs: clarify implementation head binding
seonghobae Aug 21, 2026
8daf766
docs: point audit at UX implementation head
seonghobae Aug 21, 2026
0b4a1db
test: cover brctl summary without last sync
seonghobae Aug 21, 2026
0758690
fix: parse brctl sync token without last sync
seonghobae Aug 21, 2026
201dc9d
docs: record OneDrive provider stall evidence
seonghobae Aug 21, 2026
3704dd1
fix: isolate native cloud copy staging
seonghobae Aug 21, 2026
e6c6e34
docs: bind native staging hardening to live evidence
seonghobae Aug 21, 2026
957464d
Merge provider sync hardening into UX branch
seonghobae Aug 21, 2026
c14dfd1
docs: bind provider audit to exact PR head
seonghobae Aug 21, 2026
4cbccf2
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
9cf9665
fix: lock projection reads with paired writes
seonghobae Aug 21, 2026
81d5136
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
2e2d510
docs: record paired projection read locking
seonghobae Aug 21, 2026
e9db532
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
b710000
docs: record OneDrive post-headroom reconciliation
seonghobae Aug 21, 2026
57eef9d
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
a8247dd
test: require readable skip-link contrast
seonghobae Aug 21, 2026
4fe49d5
fix: preserve skip-link contrast in dark mode
seonghobae Aug 21, 2026
b0869e0
test: bind Storybook viewport runner to globals
seonghobae Aug 21, 2026
15cf8c3
fix: follow Storybook 10 viewport globals
seonghobae Aug 21, 2026
45a5a00
fix: use Storybook 10 viewport configuration
seonghobae Aug 21, 2026
49cd202
fix: select mobile viewport through Storybook globals
seonghobae Aug 21, 2026
fe9e21a
test: follow Storybook 10 viewport globals
seonghobae Aug 21, 2026
532bef3
fix: back off blocked provider probes
seonghobae Aug 21, 2026
4177b3b
fix: type Storybook viewport globals
seonghobae Aug 21, 2026
859bbfa
fix: back off blocked provider probes
seonghobae Aug 21, 2026
7b24f74
fix: disclose provider retry backoff
seonghobae Aug 21, 2026
5313f55
fix: disclose provider retry backoff
seonghobae Aug 21, 2026
8cc113d
merge: converge Storybook stack on provider probe owner
seonghobae Aug 21, 2026
c6cde11
test: keep control sizing opt-in
seonghobae Aug 21, 2026
25cf033
fix: read Storybook 10 viewport globals
seonghobae Aug 21, 2026
3f80c4b
fix: disclose all regenerable cache targets
seonghobae Aug 21, 2026
a66c456
feat: add accessible Storybook UX contracts
seonghobae Aug 21, 2026
16c3422
test: execute Storybook interaction contracts
seonghobae Aug 21, 2026
3ac4e42
ci: install Chromium for Storybook checks
seonghobae Aug 21, 2026
fc497ad
fix: enforce Storybook accessibility edges
seonghobae Aug 21, 2026
5e6a4a0
test: assert mobile Storybook viewport
seonghobae Aug 21, 2026
c7739ce
fix: make Storybook checks test built output
seonghobae Aug 21, 2026
533c22b
docs: bind ADR to static Storybook checks
seonghobae Aug 21, 2026
42273e4
test: isolate Storybook viewport state
seonghobae Aug 21, 2026
eba8610
fix: isolate Storybook viewport per story
seonghobae Aug 21, 2026
6d51fea
refactor: use Svelte 5 layout children
seonghobae Aug 21, 2026
0362c37
docs: refresh Storybook test evidence
seonghobae Aug 21, 2026
fc86557
test: keep checking state non-cancellable
seonghobae Aug 21, 2026
66ed175
fix: keep checking provider state non-cancellable
seonghobae Aug 21, 2026
3d79a39
test: isolate design-system button styling
seonghobae Aug 21, 2026
8c990b4
fix: scope design-system button visuals
seonghobae Aug 21, 2026
910a36e
fix: opt scan actions into design controls
seonghobae Aug 21, 2026
f771c1b
fix: opt provider action into design controls
seonghobae Aug 21, 2026
6caaa39
docs: record exact-head ecosystem audit
seonghobae Aug 21, 2026
ae93d00
docs: bind ecosystem audit to current head
seonghobae Aug 21, 2026
9baf095
fix: style provider card headings consistently
seonghobae Aug 21, 2026
7fb3748
docs: refresh UX test evidence
seonghobae Aug 21, 2026
dd0ccd2
docs: bind ecosystem audit to latest UX head
seonghobae Aug 21, 2026
3e8dae2
docs: clarify implementation head binding
seonghobae Aug 21, 2026
7bda7b3
docs: point audit at UX implementation head
seonghobae Aug 21, 2026
6d37714
docs: record OneDrive provider stall evidence
seonghobae Aug 21, 2026
0ee5b93
test: require readable skip-link contrast
seonghobae Aug 21, 2026
3ca39c6
fix: preserve skip-link contrast in dark mode
seonghobae Aug 21, 2026
800fe81
test: bind Storybook viewport runner to globals
seonghobae Aug 21, 2026
e5a5608
fix: follow Storybook 10 viewport globals
seonghobae Aug 21, 2026
1326ee1
fix: use Storybook 10 viewport configuration
seonghobae Aug 21, 2026
debeb5e
fix: select mobile viewport through Storybook globals
seonghobae Aug 21, 2026
e40bfec
test: follow Storybook 10 viewport globals
seonghobae Aug 21, 2026
538a40f
fix: back off blocked provider probes
seonghobae Aug 21, 2026
325bf03
fix: type Storybook viewport globals
seonghobae Aug 21, 2026
efd552e
test: keep control sizing opt-in
seonghobae Aug 21, 2026
eeca3d0
fix: read Storybook 10 viewport globals
seonghobae Aug 21, 2026
f265cc9
Merge remote-tracking branch 'origin/feat/storybook-ux-contracts' int…
seonghobae Aug 21, 2026
4677811
test: prove native finalize race safety
seonghobae Aug 21, 2026
b44dfb5
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
dbfaff7
fix: bind control size token to styled controls
seonghobae Aug 21, 2026
8703719
feat: classify iCloud sync exclusion stalls
seonghobae Aug 21, 2026
6508170
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
0a6bd39
fix: retain iCloud exclusion diagnostics
seonghobae Aug 21, 2026
c81f6fa
test: expose global control styling regression
seonghobae Aug 21, 2026
f97865c
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
99a3894
fix: keep legacy control sizing opt-in
seonghobae Aug 21, 2026
b69c342
Merge remote-tracking branch 'origin/feat/storybook-ux-contracts' int…
seonghobae Aug 21, 2026
f947dae
Merge remote-tracking branch 'origin/feat/storybook-ux-contracts' int…
seonghobae Aug 21, 2026
e9c7d9b
feat: version iCloud activity evidence
seonghobae Aug 21, 2026
6aae29f
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
4a548c2
feat: show iCloud exclusion stall evidence
seonghobae Aug 21, 2026
108bba0
docs: correct bounded provider dump comment
seonghobae Aug 21, 2026
2298bc6
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
9c4d679
feat: surface iCloud indexing backlog in UX
seonghobae Aug 21, 2026
52a0c22
feat: surface provider stall state in running UX
seonghobae Aug 21, 2026
94ecd07
docs: bind provider stall UX amendment
seonghobae Aug 21, 2026
b24549c
test: cover provider stall status rendering
seonghobae Aug 21, 2026
278b62b
docs: bind UX implementation head
seonghobae Aug 21, 2026
32e5222
docs: refresh exact-head provider and PR audit
seonghobae Aug 21, 2026
67fa7ed
docs: refresh current iCloud backlog evidence
seonghobae Aug 21, 2026
5126c87
docs: bind latest iCloud runtime receipt
seonghobae Aug 21, 2026
3a8ee65
docs: distinguish implementation and binding heads
seonghobae Aug 21, 2026
64b067d
fix: align provider stall duration with evidence time
seonghobae Aug 21, 2026
768c750
docs: record provider status card clock fix
seonghobae Aug 21, 2026
97533ad
fix(ux): keep provider status safe during probe and dark mode
seonghobae Aug 21, 2026
14e99fc
docs: bind UX and governance heads
seonghobae Aug 21, 2026
58db694
fix(ux): apply dark tokens to legacy panels
seonghobae Aug 21, 2026
b0c71f0
docs: record UX coverage evidence
seonghobae Aug 21, 2026
6281ea3
docs: distinguish functional and documentation heads
seonghobae Aug 21, 2026
117432f
test: protect newly written provider evidence during retention
seonghobae Aug 21, 2026
76ab80a
fix: preserve newly written provider evidence during retention
seonghobae Aug 21, 2026
33160c2
fix(ux): preserve iCloud admission blocker duration
seonghobae Aug 21, 2026
afce9f3
docs: record restart-safe iCloud UX duration
seonghobae Aug 21, 2026
7e3c28a
fix(ux): use provider observation time fallback
seonghobae Aug 21, 2026
eb553ed
docs: bind UX fallback to current head
seonghobae Aug 21, 2026
56de7f5
docs: refresh provider follow-up head
seonghobae Aug 21, 2026
bda817d
fix(ux): retain iCloud stall clock for legacy reports
seonghobae Aug 21, 2026
d6d3142
docs: record legacy iCloud stall compatibility
seonghobae Aug 21, 2026
8002e2c
test: preserve active-use signal after slow lsof
seonghobae Aug 21, 2026
d267ee9
fix: reserve active-use probe deadline slices
seonghobae Aug 21, 2026
e4c4e11
test: bound provider disk-full numeric markers
seonghobae Aug 21, 2026
fc9f4a4
fix(ux): reset stall clock when iCloud progress changes
seonghobae Aug 21, 2026
a37a1df
test: cover all provider disk-full numeric forms
seonghobae Aug 21, 2026
76479ed
fix: bound provider disk-full numeric markers
seonghobae Aug 21, 2026
fa5fbfc
fix(ux): keep iCloud stall warnings through counter churn
seonghobae Aug 21, 2026
0b77490
fix(scan): prefer local roots before filesystem root
seonghobae Aug 21, 2026
76d2189
fix(ux): keep iCloud admission card fail closed
seonghobae Aug 21, 2026
6b01f6f
fix(ci): keep readiness verifier includable
seonghobae Aug 21, 2026
51973c3
fix(ci): keep readiness verifier includable
seonghobae Aug 21, 2026
570924c
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
3e72277
test: use production cloud copy approval boundary
seonghobae Aug 21, 2026
b00c67e
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
741ab30
fix: kill timed-out lsof process groups
seonghobae Aug 21, 2026
a6ec6e2
fix: kill timed-out lsof process groups
seonghobae Aug 21, 2026
2b9833c
docs: record current Finder stall evidence
seonghobae Aug 21, 2026
0c2ca13
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae Aug 21, 2026
44756d1
fix: keep indexing backlog growth in stall clock
seonghobae Aug 21, 2026
b4bca2f
docs: record backlog stall clock semantics
seonghobae Aug 21, 2026
09a6391
docs: describe backlog stall semantics
seonghobae Aug 21, 2026
992894a
test: require destination-volume copy headroom
seonghobae Aug 21, 2026
06421c8
feat: bind copy headroom to destination filesystem
seonghobae Aug 21, 2026
3a925a9
fix: probe cloud copy destination headroom
seonghobae Aug 21, 2026
70a3ff6
repair: restore complete commands module
seonghobae Aug 21, 2026
f40bd90
fix: probe native copy destination headroom
seonghobae Aug 21, 2026
894624f
test: run active-use probes under coverage
seonghobae Aug 21, 2026
0584bcc
revert: keep coverage fix in canonical evidence owner
seonghobae Aug 21, 2026
1a4e3e1
test: carry destination headroom authority into UX stack
seonghobae Aug 22, 2026
2bf1dd2
test: preserve destination headroom regression in UX stack
seonghobae Aug 22, 2026
af92061
merge: advance Storybook UX onto provider headroom authority
seonghobae Aug 22, 2026
e869ba2
test: reject cancel affordance on clear provider state
seonghobae Aug 22, 2026
a822033
fix: suppress cancel action on clear provider state
seonghobae Aug 22, 2026
b2e5589
fix: remove duplicate list_roots tauri command definition
seonghobae Aug 22, 2026
36d7a8f
fix: stop mislabeling a failed provider probe as materialization-stalled
seonghobae Aug 22, 2026
476678c
fix: remove reintroduced shopping-domain wording in new module
seonghobae Aug 22, 2026
bbf5f4b
merge: resolve main conflicts for Storybook UX contracts
seonghobae Aug 24, 2026
61f779f
fix: restore known-green CloudArchive merge resolution
seonghobae Aug 24, 2026
9cf11c0
merge: converge Storybook UX with current main
seonghobae Aug 24, 2026
6e908d6
fix: keep product terminology customer-safe
seonghobae Aug 24, 2026
308be49
test: avoid dynamic token regex
seonghobae Aug 24, 2026
1972614
fix: retain coverage dead-code allowance for navigation
seonghobae Aug 24, 2026
b67ea3b
fix(cloud): expose indexing stall cancellation
seonghobae Aug 25, 2026
5eaeda1
docs(ux): record provider indexing cancel event
seonghobae Aug 25, 2026
2037c91
fix(cloud): reset stall clock after restart
seonghobae Aug 25, 2026
74f9f3f
fix(ui): preserve persisted iCloud stall age
seonghobae Aug 25, 2026
cf005f1
docs(adr): record persisted iCloud stall recovery
seonghobae Aug 25, 2026
2d39135
fix(ui): keep one provider cancel control
seonghobae Aug 25, 2026
976d930
docs: scope scan-root contract to non-windows
seonghobae Aug 25, 2026
3936cd9
docs(adr): record provider card ownership
seonghobae Aug 25, 2026
d38ed05
fix(ui): keep Finder cancel confirmation visible
seonghobae Aug 25, 2026
cbb9dc0
fix: adopt late iCloud blocker timestamps
seonghobae Aug 25, 2026
9ef6d21
fix: disable repeated provider cancel requests
seonghobae Aug 25, 2026
64a255b
fix: apply dark-mode text tokens to legacy panels
seonghobae Aug 25, 2026
9124e01
fix: distinguish transfer completion from progress
seonghobae Aug 25, 2026
1ae5a35
fix: show provider sync checking state
seonghobae Aug 25, 2026
57eb6c1
Merge branch 'main' into feat/storybook-ux-contracts
opencode-agent[bot] Aug 25, 2026
d7e4176
merge: sync Storybook UX branch with current main
seonghobae Aug 26, 2026
3402360
Merge origin/main into feat/storybook-ux-contracts (restack PR #246)
seonghobae Aug 26, 2026
6f47fdf
docs: assign Storybook UX decision ADR-0012
seonghobae Aug 26, 2026
3349f83
fix: enforce customer-safe action copy contract
seonghobae Aug 26, 2026
6c5e0c6
Merge remote-tracking branch 'refs/remotes/origin/pr-246' into HEAD
seonghobae Aug 26, 2026
7d34c6a
docs: record customer-action copy contract
seonghobae Aug 26, 2026
f8bb71d
fix: align customer copy and scan lifecycle
seonghobae Aug 26, 2026
b062255
fix: guard scan listeners during teardown
seonghobae Aug 26, 2026
51b2706
fix: keep Finder cancel available for iCloud blockers
seonghobae Aug 26, 2026
92b9d6b
fix: ignore late scan events after teardown
seonghobae Aug 26, 2026
73070c0
test: audit nested customer screens
seonghobae Aug 26, 2026
ccab8da
fix: preserve stall clock when provider timestamps are absent
seonghobae Aug 26, 2026
a6c6d53
fix: make cloud failure guidance customer actionable
seonghobae Aug 26, 2026
2616cef
fix: use theme tokens for form guidance
seonghobae Aug 26, 2026
293cc99
fix: verify Windows release artifact namespace
seonghobae Aug 26, 2026
9b8bf0e
fix: bind release artifacts to platform directories
seonghobae Aug 26, 2026
384f6f1
fix: verify tag artifacts before sbom
seonghobae Aug 26, 2026
7e5910d
fix: keep customer guidance implementation-neutral
seonghobae Aug 26, 2026
df3c231
test: lock customer-safe cloud status copy
seonghobae Aug 26, 2026
9d82358
fix(ui): keep customer guidance implementation-neutral
seonghobae Aug 26, 2026
276f674
chore: restore Storybook owner boundary
seonghobae Aug 27, 2026
ebbbc2f
test: reject raw duplicate-item errors
seonghobae Aug 27, 2026
1a8ca96
fix: keep duplicate errors customer-safe
seonghobae Aug 27, 2026
591c570
test(ux): keep terminology checks with canonical docs owner
seonghobae Aug 28, 2026
07333d4
test: scope customer copy contract to UX owner
seonghobae Aug 28, 2026
9b9f0ed
test: keep Storybook contracts inside UX ownership
seonghobae Aug 28, 2026
c958c0b
ci: exercise Storybook accessibility contract
seonghobae Aug 28, 2026
b085f9e
test(ci): require exact-head Storybook accessibility evidence
seonghobae Aug 28, 2026
fbe72f6
fix(ci): bind Storybook evidence to exact PR head
seonghobae Aug 28, 2026
5f17cad
chore(ux): return duplicates privacy to canonical owner
seonghobae Aug 28, 2026
eb5c248
chore(ux): return inventory privacy to canonical owner
seonghobae Aug 28, 2026
fc0fa9f
test(ux): scope customer copy contract to owned screens
seonghobae Aug 28, 2026
04352bc
chore(ux): return Homebrew feedback to canonical owner
seonghobae Aug 28, 2026
8636c47
chore(ux): return worktree feedback to canonical owner
seonghobae Aug 28, 2026
220bfcd
chore(ux): return organize feedback to canonical owner
seonghobae Aug 28, 2026
b265899
test(ux): exclude canonical feedback owners
seonghobae Aug 28, 2026
8a67252
test(a11y): require a focusable skip-link target
seonghobae Aug 28, 2026
9814109
fix(a11y): wire skip link to main content
seonghobae Aug 28, 2026
3f4f878
chore(ux): drop orphaned iCloud stall-clock test
seonghobae Aug 28, 2026
e1856c0
chore(ux): drop orphaned iCloud stall clock
seonghobae Aug 28, 2026
6fdd1d7
fix: keep Storybook guidance customer-facing
seonghobae Aug 29, 2026
36b8d2d
Merge remote-tracking branch 'origin/main' into pr246
seonghobae Aug 29, 2026
6571447
fix(a11y): announce provider recovery guidance
seonghobae Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/workflows/storybook-accessibility.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Storybook Accessibility

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

concurrency:
group: storybook-accessibility-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
storybook-accessibility:
runs-on: ubuntu-latest
timeout-minutes: 15
env:
EXPECTED_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
SOURCE_REPOSITORY: ${{ github.event.pull_request.head.repo.full_name || github.repository }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: ${{ env.SOURCE_REPOSITORY }}
ref: ${{ env.EXPECTED_HEAD_SHA }}
persist-credentials: false
- name: Verify exact source checkout
shell: bash
run: |
set -euo pipefail
actual_head="$(git rev-parse HEAD)"
test "$actual_head" = "$EXPECTED_HEAD_SHA"
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 20.19.0
cache: npm
- run: npm ci
- name: Build static Storybook
run: npm run build-storybook
- name: Install Chromium for Storybook interaction tests
run: npx playwright install --with-deps chromium
- name: Run Storybook accessibility and interaction tests
shell: bash
run: |
set -euo pipefail
python3 -m http.server 6006 --directory storybook-static >/tmp/disksage-storybook.log 2>&1 &
server_pid=$!
trap 'kill "$server_pid" 2>/dev/null || true' EXIT

for attempt in {1..30}; do
if curl --fail --silent --show-error http://127.0.0.1:6006/ >/dev/null; then
break
fi
if [[ "$attempt" == "30" ]]; then
cat /tmp/disksage-storybook.log
exit 1
fi
sleep 1
done

npm run test-storybook -- --url http://127.0.0.1:6006
15 changes: 15 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { StorybookConfig } from "@storybook/sveltekit";

const config: StorybookConfig = {
stories: ["../src/**/*.stories.@(js|ts|svelte)"],
addons: ["@storybook/addon-a11y"],
framework: {
name: "@storybook/sveltekit",
options: {},
},
docs: {
autodocs: "tag",
},
};

export default config;
25 changes: 25 additions & 0 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import type { Preview } from "storybook";
import "../src/lib/ui/design-tokens.css";

const preview: Preview = {
parameters: {
a11y: {
test: "error",
},
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
controls: {
expanded: true,
},
viewport: {
options: {
desktop: { name: "Desktop", styles: { width: "1280px", height: "800px" } },
mobile: { name: "Mobile", styles: { width: "375px", height: "812px" } },
},
},
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
},
initialGlobals: {
viewport: { value: "desktop", isRotated: false },
},
tags: ["autodocs"],
};

export default preview;
20 changes: 20 additions & 0 deletions .storybook/test-runner.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { getStoryContext, type TestRunnerConfig } from "@storybook/test-runner";

const MOBILE_VIEWPORT = { width: 375, height: 812 };
const DESKTOP_VIEWPORT = { width: 1280, height: 800 };
type StoryGlobals = { viewport?: { value?: string } };
type StoryContextWithGlobals = { storyGlobals?: StoryGlobals };

const config: TestRunnerConfig = {
async preVisit(page, story) {
const context = await getStoryContext(page, story);
const storyGlobals = (context as unknown as StoryContextWithGlobals).storyGlobals;
const viewport =
storyGlobals?.viewport?.value === "mobile"
? MOBILE_VIEWPORT
: DESKTOP_VIEWPORT;
await page.setViewportSize(viewport);
Comment thread
seonghobae marked this conversation as resolved.
},
Comment thread
seonghobae marked this conversation as resolved.
};
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.

export default config;
77 changes: 77 additions & 0 deletions docs/architecture/adr/0012-accessible-storybook-ux-contracts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# ADR-0012: Accessible Storybook UX contracts and design tokens

**Status:** Proposed
**Date:** 2026-08-21
**Figma File ID:** N/A — no Figma artifact was supplied for this slice; the token file and
Storybook scenes are the reviewable design source until a Figma handoff is approved.

## Context

DiskSage's desktop shell had repeated raw spacing, color, focus, and control styles spread across
Svelte components. The provider-stall incident also needs a stable, testable visual state for
`provider-sync-incomplete`, `materialization-stalled`, and `checking`, not a color-only warning.
The existing cloud and eviction authority must not be moved into the browser layer.

## Decision

1. Keep computation, provider evidence, and destructive authority in Rust and existing Tauri
commands. The UI only renders state and emits bounded callbacks.
2. Adopt a three-level CSS token hierarchy (primitive → semantic → component) in
`src/lib/ui/design-tokens.css`, with dark preference, forced-colors focus, reduced-motion, and
44px control minimums.
3. Add `ProviderStatusCard` as a pure state renderer and maintain one Storybook story per clear,
incomplete, stalled, checking, action, narrow-layout, and feedback edge state.
4. Run Storybook's accessibility addon in error mode against the built static output. The
Chromium test runner must prove the cancel callback, disabled checking state, and 375px mobile
viewport; stories do not call providers or mutate user files.
5. Keep Figma optional for this change because no approved Figma file exists. When a visual handoff
is supplied, record its File ID in a superseding ADR and reconcile tokens before implementation.

## Consequences

- Every new customer-facing status can be reviewed at desktop and mobile widths before it is wired
to a provider receipt.
- Keyboard, screen-reader, reduced-motion, dark-mode, and forced-colors behavior has one reusable
contract instead of per-component guesses.
- Storybook and its dependencies increase development tooling size; they are dev-only and never
become a runtime cloud or LLM dependency.
- Automated a11y is a first pass, not proof of complete WCAG conformance; VoiceOver, keyboard,
zoom, and real File Provider states remain release acceptance work.

## Rejected alternatives

- Adding a UI framework solely for buttons/cards: existing Svelte and CSS custom properties cover
the required surface with less runtime and dependency risk.
- Making the browser decide whether a provider is safe to evict: this would violate the existing
receipt/identity/approval boundary.
- Treating Storybook green output as a substitute for hosted exact-head checks: stories only prove
the rendered UI contract and event wiring.

## Standards and research basis (APA 7th)

World Wide Web Consortium. (2024, December 12). *Web Content Accessibility Guidelines (WCAG) 2.2*.
https://www.w3.org/TR/2024/REC-WCAG22-20241212/

World Wide Web Consortium. (n.d.). *ARIA Authoring Practices Guide*. Retrieved August 21, 2026,
from https://www.w3.org/WAI/ARIA/apg/

Design Tokens Community Group. (2025, October 28). *Design Tokens Format Module 2025.10*.
https://www.w3.org/community/reports/design-tokens/CG-FINAL-format-20251028/

Storybook. (n.d.). *Accessibility tests*. Retrieved August 21, 2026, from
https://storybook.js.org/docs/writing-tests/accessibility-testing

## Amendment: provider-indexing cancellation event (2026-08-25 11:31 +0900)

The provider status contract includes `provider-global-sync-indexing-pending` in the existing
bounded Finder-cancel event path. This keeps the Storybook event model aligned with the runtime
provider-global blocker set without granting the browser cloud-write or source-eviction authority.
The exact-head contract and Svelte checks pass at `b67ea3be`.

## Amendment: customer-action copy contract (2026-08-26)

Customer screens must describe the next safe action without exposing Rust command names, provider
internals, ontology identifiers, receipt/attestation fields, or implementation-only error text.
`cleanupCustomerCopyContract.test.ts` scans every Svelte customer surface, including dynamic
messages and static warnings, and requires bounded recovery guidance. Technical evidence remains
available to the backend and audit records; it is not rendered as customer instruction.
1 change: 1 addition & 0 deletions docs/architecture/adr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ new numbered record rather than rewriting history.
| [0009](0009-path-free-lineage-relation-graph.md) | Export a path-free lineage relation graph | Accepted |
| [0010](0010-rooted-organize-destinations.md) | Require rooted, process-independent organize destinations | Accepted |
| [0011](0011-cloud-transfer-failure-and-materialization.md) | Durable failed-copy evidence and placeholder-safe adoption | Accepted |
| [0012](0012-accessible-storybook-ux-contracts.md) | Accessible Storybook UX contracts and design tokens | Proposed |

New records must state context, decision, consequences, rejected alternatives, and the evidence or
standard that led to the decision. A record never grants cloud-write or source-eviction authority;
Expand Down
72 changes: 72 additions & 0 deletions docs/design/storybook-event-inventory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# DiskSage UI/UX and Storybook event inventory

**Status:** In progress, exact source head `feat/storybook-ux-contracts`
**Scope:** desktop Svelte shell and provider-status feedback states
**Visual source:** no Figma file was supplied for this product slice; the code token file is the
reviewable source of truth until a Figma handoff exists.

This inventory turns customer-visible states into repeatable Storybook scenes. It is not cloud or
eviction authority: every destructive action remains behind the Rust evidence and approval gates.

## Story and event matrix

| Story | Trigger/event | Expected customer action | Accessibility and edge assertion |
| --- | --- | --- | --- |
| `Clear` | Provider observation is complete and quiet | Continue to per-file review; do not assume eviction | Status is announced politely; no destructive action is shown |
| `IncompleteEvidence` | Cloud status is missing or stale | Check the cloud app and connection, then recheck | State is text, not color alone; last-check time is visible |
| `MaterializationStalled` | File preparation has stopped | Cancel the Finder copy, then recheck; do not retry immediately | Cancel button has an accessible name and invokes one bounded callback |
| `CheckingWithoutAction` | A read-only provider probe is running | Wait; do not cancel an operation that has no cancel authority | Action is disabled and exposes `aria-disabled` |
| Scan start | Scan button activates | Review progress and wait for completion | Root is labelled; unavailable roots disable the action |
| Scan failure | IPC/start or post-scan load fails | Read the error and retry | `role=alert` presents the next action; no `alert()` steals focus |
| Navigation | Breadcrumb or directory button activates | Move to the selected directory | Landmark and button names are keyboard reachable |
| Reduced motion | `prefers-reduced-motion: reduce` is enabled | Use the same controls without animation | Global token contract disables transitions/animations |
| Narrow viewport | 375px viewport | Scroll and operate controls without horizontal clipping | Controls become full width and retain 44px touch targets |

## Required review dimensions

- **Accessibility:** WCAG 2.2 AA target; semantic headings, labels, skip link, focus-visible ring,
live regions, keyboard operation, non-color status text, and forced-colors support.
- **Touch & interaction:** controls use the shared minimum size token; every async action has a
disabled/loading state and a bounded, reversible next action.
- **Performance:** the shell does not poll during a scan; provider polling/backoff remains in the
existing CloudArchive state machine; CSS uses no new runtime animation or layout library.
- **Style selection:** primitive, semantic, and component tokens live in one CSS contract; raw
colors are not introduced in the new shell paths.
- **Layout & responsive:** mobile-first wrapping is tested by Storybook's mobile viewport and the
shell has a readable max width.
- **Typography & color:** system font stack, semantic text colors, dark preference, and contrast
review are centralized in `design-tokens.css`.
- **Animation:** reduced-motion media query is a global contract; no status relies on motion.
- **Forms & feedback:** labels precede controls; errors use `role=alert`; progress uses polite
status text and never hides the actionable reason.
- **Navigation patterns:** skip link, `main` landmark, and labelled breadcrumb navigation are
present; directory navigation remains a button rather than a mouse-only gesture.
- **Charts & data:** existing treemap and tabular summaries remain text-backed; future chart
changes must provide a table or equivalent text summary in the same story.

## Running the review scenes

```bash
npm run storybook
npm run build-storybook
python3 -m http.server 6006 --directory storybook-static
npm run test-storybook -- --ci --url http://127.0.0.1:6006 --browsers chromium --testTimeout 30000
```

The a11y addon is configured with `a11y.test = "error"`. The interaction stories assert the
materialization-stall cancel event and the disabled checking state. A real VoiceOver/keyboard and
375px/200% zoom pass is still required before a release claim.

## References (APA 7th)

World Wide Web Consortium. (2024, December 12). *Web Content Accessibility Guidelines (WCAG) 2.2*.
https://www.w3.org/TR/2024/REC-WCAG22-20241212/

World Wide Web Consortium. (n.d.). *ARIA Authoring Practices Guide*. Retrieved August 21, 2026,
from https://www.w3.org/WAI/ARIA/apg/

Design Tokens Community Group. (2025, October 28). *Design Tokens Format Module 2025.10*.
https://www.w3.org/community/reports/design-tokens/CG-FINAL-format-20251028/

Storybook. (n.d.). *Accessibility tests*. Retrieved August 21, 2026, from
https://storybook.js.org/docs/writing-tests/accessibility-testing
Loading
Loading