Repository navigation
fix: validate supported theme values at import and ZIP boundaries - #2
Merged
Merged
Conversation
…fix/r01-finite-validation # Conflicts: # .project/PROGRESS.md
hvab
marked this pull request as ready for review
October 19, 2026 11:11
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.
Problem and behavior
Theme JSON, shared URLs and saved sessions previously accepted values based on
JavaScript types alone. Unsupported parent themes, non-finite numbers and CSS
values outside the editor contract could reach theme generation. This change
validates known theme fields before applying imported state and rejects invalid
models atomically. ZIP generation also checks the same invariant for direct API
callers, in addition to the separate metadata gate.
The value contract remains the existing R01 policy:
basedOnisplain; colors are six-digit HEX (either case).14..24px, content width36..64rem, margins1..4rem;title scale is finite
1.2..2and text line height finite1.3..1.9.controls and boundary validation.
Unsupported custom font syntax is rejected at external boundaries.
ZIP stays unavailable until metadata is repaired. Invalid storage falls back
through the existing startup path.
CSS injection into the exported CSS is the relevant boundary risk; the audit did
not demonstrate JS/PHP execution or XSS.
Current-main integration
Merged main
b9452c172071ac0b85d48ce5aaf24f4dc8c351f4without rewriting theexisting fix branch. The only textual conflict was progress history; both sides
are retained. Production code merged cleanly and preserves R03 preferred/effective
panel sizing, hvab-blocks 0.3, and R05 snapshot-based idle-tab/lifecycle persistence.
Successful mounted URL imports still save synchronously before returning.
Validation
npm ci --cache <temporary-cache>succeeded on Node 24.22.0 / npm 11.19.1with the unchanged main lockfile, without configuration changes or copied
dependencies. The temporary cache avoids the sandbox-protected default cache.
npm test: 128/128; ESLint, stylelint, Prettier, production build andgit diff --checkpass. Build retains the two inherited VueUse PURE warnings.covering invalid File/URL/storage inputs, atomic rejection, direct ZIP guards,
editable metadata and repair, supported decimal endpoints, ordinary saves,
Reset, immediate exit, idle tabs, storage-write retry and default/non-default
URL-import persistence. No new repository tests were added in this refresh.
diff and independently repeated all 26 integration cases successfully.
76850e2passed Node 22/Linux CI.
This result covers the code commit, not a later documentation update. GitHub
reports PR fix: validate supported theme values at import and ZIP boundaries #2 mergeable against main
b9452c1.Live Aegea installation, real browser file-picker/download flow, Safari/BFCache,
Windows/forced-colors and screen-reader coverage remain unverified. V01–V04 remain
deferred. This PR does not deploy or change the Aegea preview contract.
PR #1 is closed as a duplicate; R02 is already in main. Next step: owner decision
whether to merge PR #2. No merge or deployment was performed.