Repository navigation
feat: verifier v2 (APCA, ΔE2000, CVD, ANSI, wavelength scan, README tables) + tests + CI - #10
Conversation
…ables) + tests + CI - scripts/lib/color.mjs: sRGB/XYZ/Lab, WCAG, APCA 0.0.98G-4, CIEDE2000, Viénot CVD simulation, dominant wavelength — pure and unit-tested - scripts/lib/build.mjs: generator substitution/validation extracted from build-themes.mjs (output byte-identical); build-themes.mjs is now a thin CLI - scripts/lib/theme-roles.mjs, scripts/lib/readme.mjs: role extraction and marker-block/markdown-table helpers - verify-palette.mjs: APCA column + per-role floors (verify.apcaFloors override; Soft declares a scaled set), ΔE2000 on tight gaps, CVD pair table, ANSI pairwise ΔE2000, whole-theme λd scan, README marker rendering with --write-readme; new perceptual checks are warnings via POLICY - README: ladder / syntax / bracket / contrast (WCAG+APCA) / ANSI tables now verifier-rendered between <!-- verify:*:start/end --> markers - tests/ (node --test): colour math, generator rules, determinism, committed-JSON freshness, $schema, v1.2.0 snapshot parity, verifier smoke - .github/workflows/ci.yml (Node 20/22) + dependabot.yml; @vscode/vsce devDependency; npm test / npm run package; CHANGELOG [Unreleased] Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Reviewer's GuideIntroduces a v2 palette verifier with APCA, ΔE2000, CVD, ANSI, and wavelength scan checks; factors reusable color math and generator logic into testable libraries; wires README tables to be verifier-rendered; adds node:test coverage and a CI workflow that builds, verifies, tests, and packages the VSIX without changing the theme palette. Sequence diagram for CI build-verify-test-package workflowsequenceDiagram
participant GHA as GitHubActions
participant Node as setup-node
participant NPM as npm
participant VSCE as vsce
GHA->>Node: actions/setup-node@v4 (matrix 20,22)
GHA->>NPM: npm ci
GHA->>NPM: npm run build:themes
GHA->>GHA: git diff --exit-code -- themes/
GHA->>NPM: npm run verify
GHA->>NPM: npm test
GHA->>VSCE: npx vsce package --out alone.vsix
GHA->>GHA: upload-artifact alone.vsix (Node 22)
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've found 10 security issues, 1 other issue, and left some high level feedback:
Security issues:
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
- SEE LICENSE IN LICENSE.txt: Open-source license could not be identified (link)
General comments:
- scripts/verify-palette.mjs has grown quite large and multi-responsibility; consider splitting the individual checks (ladder/APCA/CVD/ANSI/wavelength/README) into separate modules or functions to keep the verifier easier to read and evolve.
- The README prose still embeds hard-coded numeric descriptions of ladder gaps (e.g. specific L* deltas) that are not verifier-rendered, so these can silently drift from the new computed ladder; it may be worth either making this prose non-literal or having the verifier emit those numbers too.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- scripts/verify-palette.mjs has grown quite large and multi-responsibility; consider splitting the individual checks (ladder/APCA/CVD/ANSI/wavelength/README) into separate modules or functions to keep the verifier easier to read and evolve.
- The README prose still embeds hard-coded numeric descriptions of ladder gaps (e.g. specific L* deltas) that are not verifier-rendered, so these can silently drift from the new computed ladder; it may be worth either making this prose non-literal or having the verifier emit those numbers too.
## Individual Comments
### Comment 1
<location path="scripts/lib/color.mjs" line_range="238" />
<code_context>
+ // Solve W + t·d = P1 + u·(P2 − P1). t > 0 → same side as the colour.
+ const t = ((x1 - WHITE_XY[0]) * ey - (y1 - WHITE_XY[1]) * ex) / den;
+ const u = ((x1 - WHITE_XY[0]) * dy - (y1 - WHITE_XY[1]) * dx) / den;
+ if (t > 0 && u >= 0 && u <= 1) {
+ best = { lambda: l1 + u * (l2 - l1), purity: 1 / t };
+ }
</code_context>
<issue_to_address>
**suggestion (bug_risk):** `dominantWavelength` returns excitation purity as `1 / t` without clamping, which can exceed 1 for near-locus colours.
Here purity is computed as `1 / t`, so for points near the spectral locus (small `t`) this can exceed 1 even though excitation purity is conventionally in [0, 1]. Callers currently only use `lambda`, but this may confuse future users relying on purity. Please either clamp to 1 or document that this is an unbounded radial factor rather than textbook excitation purity.
Suggested implementation:
```javascript
// Solve W + t·d = P1 + u·(P2 − P1). t > 0 → same side as the colour.
const t = ((x1 - WHITE_XY[0]) * ey - (y1 - WHITE_XY[1]) * ex) / den;
const u = ((x1 - WHITE_XY[0]) * dy - (y1 - WHITE_XY[1]) * dx) / den;
if (t > 0 && u >= 0 && u <= 1) {
// Clamp excitation purity to [0, 1] to match conventional definition.
best = { lambda: l1 + u * (l2 - l1), purity: Math.min(1, 1 / t) };
}
```
To implement the suggestion:
1. We keep the geometric meaning of `t` as the radial factor and continue using it to derive purity.
2. We clamp `1 / t` using `Math.min(1, 1 / t)` so that reported excitation purity is always in [0, 1], avoiding confusing values > 1 for near-locus colours.
3. A brief inline comment is added to clarify that this is textbook excitation purity and intentionally clamped.
</issue_to_address>
### Comment 2
<location path="package-lock.json" line_range="616-634" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 3
<location path="package-lock.json" line_range="635-648" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-alpine-arm64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 4
<location path="package-lock.json" line_range="649-662" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-alpine-x64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 5
<location path="package-lock.json" line_range="663-676" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-darwin-arm64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 6
<location path="package-lock.json" line_range="677-690" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-darwin-x64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 7
<location path="package-lock.json" line_range="691-704" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-linux-arm):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 8
<location path="package-lock.json" line_range="705-718" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-linux-arm64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 9
<location path="package-lock.json" line_range="719-732" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-linux-x64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 10
<location path="package-lock.json" line_range="733-746" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-win32-arm64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>
### Comment 11
<location path="package-lock.json" line_range="747-760" />
<code_context>
</code_context>
<issue_to_address>
**security (license/@vscode/vsce-sign-win32-x64):** SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the `SEE LICENSE IN LICENSE.txt` license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
*Source: trivy*
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
| "node_modules/@vscode/vsce-sign": { | ||
| "version": "2.1.0", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.1.0.tgz", | ||
| "integrity": "sha512-9AQrqazrBgTgRSuwleLVXUrIUphY02/SFCh2TKYoLV/xifJAdblhdmEmw5gUrYSPQ3sRwNs9iyCMD14sATEE6g==", | ||
| "dev": true, | ||
| "hasInstallScript": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optionalDependencies": { | ||
| "@vscode/vsce-sign-alpine-arm64": "2.0.6", | ||
| "@vscode/vsce-sign-alpine-x64": "2.0.6", | ||
| "@vscode/vsce-sign-darwin-arm64": "2.0.6", | ||
| "@vscode/vsce-sign-darwin-x64": "2.0.6", | ||
| "@vscode/vsce-sign-linux-arm": "2.0.6", | ||
| "@vscode/vsce-sign-linux-arm64": "2.0.6", | ||
| "@vscode/vsce-sign-linux-x64": "2.0.6", | ||
| "@vscode/vsce-sign-win32-arm64": "2.0.6", | ||
| "@vscode/vsce-sign-win32-x64": "2.0.6" | ||
| } | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-alpine-arm64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", | ||
| "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", | ||
| "cpu": [ | ||
| "arm64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "alpine" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-alpine-arm64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-alpine-x64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", | ||
| "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", | ||
| "cpu": [ | ||
| "x64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "alpine" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-alpine-x64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-darwin-arm64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", | ||
| "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", | ||
| "cpu": [ | ||
| "arm64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "darwin" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-darwin-arm64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-linux-arm": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", | ||
| "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", | ||
| "cpu": [ | ||
| "arm" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "linux" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-linux-arm): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-linux-arm64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", | ||
| "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", | ||
| "cpu": [ | ||
| "arm64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "linux" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-linux-arm64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-linux-x64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", | ||
| "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", | ||
| "cpu": [ | ||
| "x64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "linux" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-linux-x64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-win32-arm64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", | ||
| "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", | ||
| "cpu": [ | ||
| "arm64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "win32" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-win32-arm64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
| "node_modules/@vscode/vsce-sign-win32-x64": { | ||
| "version": "2.0.6", | ||
| "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", | ||
| "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", | ||
| "cpu": [ | ||
| "x64" | ||
| ], | ||
| "dev": true, | ||
| "license": "SEE LICENSE IN LICENSE.txt", | ||
| "optional": true, | ||
| "os": [ | ||
| "win32" | ||
| ] | ||
| }, |
There was a problem hiding this comment.
security (license/@vscode/vsce-sign-win32-x64): SEE LICENSE IN LICENSE.txt: Open-source license could not be identified
The obligations of the SEE LICENSE IN LICENSE.txt license for this code could not be determined automatically. Unknown licenses may carry obligations or restrictions and should be reviewed manually to ensure compliance
Source: trivy
Addresses sourcery-ai review on PR #10. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b7065e5ce6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| node: [20, 22] |
There was a problem hiding this comment.
Use a supported Node version for the packaging job
The Node 20 matrix leg installs and runs the newly locked VSCE dependency tree, but that tree includes multiple packages declaring Node >=22.0.0—for example @azure/abort-controller and @typespec/ts-http-runtime in package-lock.json lines 36–47 and 555–567. Consequently, this leg fails at npm ci wherever engine enforcement is enabled and otherwise packages with an unsupported runtime; pin Node-20-compatible transitive dependencies or run packaging only on Node 22.
Useful? React with 👍 / 👎.
|
Re the ten |
@vscode/vsce's transitive tree declares engines >=22 (@azure/abort-controller, @typespec/ts-http-runtime); Node 20 is past EOL. Addresses Codex review on PR #10. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Re Sourcery review 4957732175 general comments:
The purity clamp is in 3ef146a; the Node 20 → 22/24 matrix change (Codex) is in 2d2baab. |
… verifier hard-fail (#14) * feat(palette): 2.0.0 retune — neutrals, comments, ANSI, accents, CVD - Neutrals shifted at constant L* to drop residual blue-subpixel drive (fg #C4B8A4→#C8B89A, ops #D4C8B8→#D8C8A8, bright #E8DCD0→#EDDCC4, …). - Comments #5C544A→#6E665B (Lc 16→23), doc comments →#787062, line numbers →#56504A; Soft comments →#625A50. - Ghost text fg #6B635A + translucent bg (new tokenized editorGhostText.background). - Badge/remote fills #D4A048→#A87C34; defaultLibrary/this #B89860→#B08C50. - Numbers #E0A850→#DEA64E (Variables→Numbers gap ≥ 3 L*). - Parameters #BCA890→#B8AA9C (CVD vs Variables 4.7→6.6); Soft Functions #9A6D53→#976D56. - ANSI blue #9C948E, cyan #C08868, brightBlue #B2AAA3, brightCyan #CEA284 (normal-8 pairwise ΔE2000 ≥ 10); terminal/* mirrored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: verifier hard-fail policy, structural snapshot test, docs, v2.0.0 - POLICY: every check now `fail` (tightGap/apca/cvd/ansi/wavelengthScan). - pipeline test checks v1.2.0 snapshot structure (keys, rules, scopes, fontStyles) instead of hex equality; PALETTE_CHANGED gate removed. - README verifier blocks re-rendered; ladder/terminal prose updated. - CHANGELOG [2.0.0]; version bump. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: make ladder prose non-literal (numbers live in the verifier-rendered block) Addresses Sourcery general comment on PR #10. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: make snapshot check order-insensitive and additions-tolerant (Sourcery on PR #14) Compare the v1.2.0 snapshot by name-keyed rule signatures and colour-key membership instead of sorted-array deepEqual, so rule reordering and new VS Code colour keys/rules/selectors don't fail the test while drops and restyles still do. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: compare semantic-token style flags, not fontStyle (Codex on PR #14) semanticTokenColors entries carry italic/bold/underline/strikethrough as booleans, so the previous fontStyle read was always null and the style comparison was vacuous. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
PR 2 of
docs/plans/2026-08-18-audit-remediation.md. No palette changes; the generated themes are byte-identical.verify.apcaFloorsoverride; Soft declares a scaled set), ΔE2000 on tight gaps, CVD (protan/deutan/tritan) pair table, ANSI pairwise ΔE2000, whole-theme dominant-wavelength scan. New perceptual checks are warnings (14 on the current palette — exactly what PR 3 retunes); severities live in a one-linePOLICYmap so PR 3 flips them tofail.<!-- verify:<name>:start/end -->markers (ladder, syntax colours, brackets, contrast now WCAG and APCA, new ANSI table).--write-readmere-renders; the default run fails on drift.scripts/lib/color.mjs(sRGB/Lab, WCAG, APCA 0.0.98G-4, CIEDE2000, Viénot CVD, λd),scripts/lib/build.mjs(generator rules extracted frombuild-themes.mjs, output unchanged),theme-roles.mjs,readme.mjs.npm test,node:test, 26 cases): colour-math sanity, generator edge cases, determinism, committed-JSON freshness,$schema, v1.2.0 snapshot parity (PALETTE_CHANGED=1skips), verifier smoke run..github/workflows/ci.ymlon Node 20/22 —npm ci→ build →git diff --exit-code themes/→ verify → test →vsce package(artifact). Dependabot monthly.@vscode/vscedevDependency,npm run package.Test plan
npm run check— 0 failures, 14 warnings (expected pre-retune)npm test— 26/26npx vsce lsstill 12 files🤖 Generated with Claude Code
Summary by Sourcery
Strengthen palette quality assurance with perceptual verification, generated documentation, reusable validation modules, comprehensive tests, and CI packaging checks.
New Features:
Enhancements:
Build:
CI:
Documentation:
Tests: