Repository navigation
fix(developer-license): sign every Pro feature and no image digests - #122
Merged
Merged
Conversation
The issuer signed Features = 511 (the 9 feature bits that existed when it was written) while Pro requires the full canonical set for the Developer tier (LicenseFeature.All, 12 bits = 4095), so every free licence validated Invalid. The bits are now listed by name, mirroring Pro's LicenseFeature, and ALL is computed from that list; a unit test pins the 12 names and values. It also stops embedding AuthorizedImageDigests (PDR-0003 amendment C6). The field is omitted, not empty: Pro serializes it WhenWritingNull, so an empty array breaks the signature. The release digest ledger stays for the drift check. Proven end to end: an issued licence validates Valid in Pro's real LicenseValidator; the old code validates Invalid.
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
verbara-website | d1e9e04 | Commit Preview URL Branch Preview URL |
Oct 03 2026, 11:39 PM |
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.
Summary
The free Tier 0.5 developer licence validated
Invalidin Pro, so nobody evaluating Verbara saw any Pro feature.Features = 511(the 9 bits that existed when it was written). Pro requires the Developer tier to carry the full canonical set (LicenseFeature.All, 12 bits = 4095). The bits are now listed by name infunctions/api/developer-license/license-features.ts, mirroring Pro'sLicenseFeature, andFEATURES_ALLis computed from that list.tests/unit/license-features.test.tspins the 12 names, values and order.AuthorizedImageDigestsis no longer embedded. The field is omitted (not[]): Pro serializes itWhenWritingNull, so an empty array breaks the signature. The release digest ledger (data/authorized-digests.json,loadRegistry) stays for the drift check; the unused 6-digest selection is removed.features= 4095;authorized_image_digeststakes its'[]'default.data/README.md,docs/operations/issuer-setup.md(Features: 4095, no digests),gates.yaml. Test stubs now match URLs by exact hostname.coverage-floor.json:lines_valid_min300 → 290 (dead code removed; 296 lines measured; reason in_comment).Proven end to end: a licence issued through the real
onRequestPost(ephemeral test key) validates Valid in Pro's actualLicenseValidator(Features = All, no digests key); the previous code validates Invalid; a.licwith"AuthorizedImageDigests": []added by hand validates Invalid.Not fixed here (separate, pre-existing): a licensee containing
+,&or non-ASCII characters still validates Invalid — Pro's canonical JSON escapes them (System.Text.Json default encoder) andJSON.stringifydoes not. The deployed Worker version cannot be checked from here.Test plan
npm run check,lint,test:i18n,validate:digests,npm test(91),build,validate:html, script suites, coverage floor + patch (100 %) + exclusion baselineCsatRunner→ 4 tests red; writingAuthorizedImageDigests: []→ 2 tests redLicenseValidator(implementer and an independent verifier, separate harnesses)codeql-branchstampedd1e9e04b🤖 Generated with Claude Code