Repository navigation
feat: accessibility pass, perf budget ci and submission docs - #38
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Four issues in one pull request, because they share the same measurement setup and the same docs:
bun run perfnow takes--json, exits 1 over budget, and a newperfworkflow runs it in a pinned Chrome and uploads the report. The budgets live inclient/scripts/budgets.ts, so code anddocs/performance.mdcannot disagree.bun run a11y, wired into a newa11yworkflow), a contrast calculator (bun run contrast) anddocs/accessibility.mdwith the keyboard walkthrough and the contrast table.docs/threat-model.md, anddocs/submission-checklist.md.docs/architecture/nft-standard.mdcompares the delver interface with SEP-0050 and the OpenZeppelin module, and the contract README lists the deviations. No contract code changes.Why the accessibility fixes
The automated check found real problems, not only gaps in a list:
:focus-visible), so clicking Sound and carrying on still attacks with Enter. The check fails against the old handler withEnter on the focused Vault item opened "Forge your delver".role="log", the floor labelrole="status", the health bar has a spoken value that includes the low state, and the canvas has a name.--line-controltoken, the pending descent steps were 2.8:1, and the volume sliders and Sound toggle were under 44 px.h1, a labelled Run status region, and the previews now mount inside the real shell so the check sees the same document the game has.Findings worth a decision
GAH27KP7..., while the contract README and the boundary doc said it was locked. The key holder can issue the assets by payment, outside the contract. I corrected those two documents and described it in the threat model. Locking is part of the release deployment in Mainnet readiness: release deployment, locked issuer and player funding #22.cargo testis green: 63 tests and the 600 vectors. The contract README said 400 vectors in one place, now corrected.add-toolkit-claudeand.claude/has 169 tracked files. Both are listed as open items in the checklist.Verification
Run locally against the production build on 2026-10-10:
bun run typecheckandbun run build: pass.bun run perf(laptop profile): 939 KB transferred, CLS 0, no long tasks, 16.8 ms p99 at 1x and 4x throttle, within budget. With 2.2 MB of noise appended tologo-lockup.webpit exits 1 withCold load transfer is 3091 KB, budget is 1200 KB. The change was reverted.bun run a11y: eleven screens in desktop, 390 by 844 touch and reduced motion passes, plus the keyboard only run. No serious or critical findings, no control under 44 px, no looping animation with reduced motion. The first run found a failing slider size and a looping descent pulse, both fixed here.bun run contrast: every pair passes.CI on this pull request: all four checks are green. The first run of
perffailed, and that was useful: on a GitHub runner the 4x throttle gave a 49.9 ms p99 frame and a 126 ms load task for a build that holds 16.8 ms and no long task on the laptop. The runner has no GPU and a much slower CPU, so the throttle stacks on top of an already slow machine. Rather than loosen the laptop budgets, the harness now has two profiles,--profile=laptop(the default) and--profile=ci. Theciprofile samples frames at 1x and allows a 200 ms task during load, anddocs/performance.mdexplains why. Bytes and layout shift are identical in both. The green run measured 939 KB, a 68 ms longest task and a 16.8 ms p99 frame, so the longest task has a margin of about 3x and the frame time has none to spare against a 20 ms budget. Watch that number on the next few runs.Not done
docs/submission-checklist.md.Closes #21
Closes #19
Refs #25
Refs #23
Update, 2026-10-11
LICENSE, and the contract crate declaresApache-2.0.