Commit Graph
11 Commits
Author SHA1 Message Date
mrhid6 059949674d chore: replace em dashes with hyphens, add no-em-dash rule to CLAUDE.md 2026-09-10 09:18:58 +00:00
mrhid6 759d36e85d feat: add the mcp licence feature constant 2026-09-08 13:27:54 +00:00
mrhid6 85d4c40ccb feat: status page schema, licence feature and indexes 2026-08-24 14:00:00 +00:00
mrhid6 6e8f384782 feat: vuln_scanning entitlement and documentation
Adds license.FeatureVulnScanning as the one name for the feature and a
catalogue row per deployment/tier, following console and oidc: features
are opt-in per customer, so no plan bundles it.

Documents the subsystem in CLAUDE.md, including that ScopedCollections is
the canonical registry instance deletion derives from — there is no
separate deletion list, which the plan had wrong.
2026-08-06 14:44:11 +01:00
mrhid6andClaude Opus 5 ae503c2d3b feat(license): two deployments times three tiers, and two new limits
Plans are keyed on (deployment, tier) rather than tier alone, which is what
ends Free being cloud-only by construction - there is a self-hosted Free
plan now, so the one-per-account rule has to be enforced per deployment
instead of falling out of the plan table.

tier self_hosted becomes a legacy value no new licence carries.
NormaliseTier maps it to self-hosted Professional, which is what it always
granted, so blobs we cannot re-sign keep working.

Limits.FillUnset exists because a licence signed before a field existed
decodes it as 0, and 0 would read as no monitors and an audit log trimmed
to nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 23:41:43 +01:00
mrhid6andClaude Opus 5 df603c7219 fix(admin): licence and plan features serialise as [], never null
Free has no features, so a nil Go slice served "features": null. The
portal's type said string[], called .length on it, and took the page down.

The guarantee lives on a named Features type with its own MarshalJSON
rather than at each of the six places a licence or plan is serialised,
because the seventh is the one that would have been forgotten. Applying it
at marshal time also fixes rows already holding null in Mongo, which a
write-side fix alone would not.

Same class, found while checking the rest: staffListInstances built its
expiring filter from a nil []string, marshalling to $in: null, which Mongo
rejects — so the quiet week when nothing is expiring is precisely when the
staff Operations page's own query would have failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 18:10:07 +01:00
mrhid6 d7ada3eb76 fix(server): add the lk go.sum entry the workspace was masking
go build inside the Docker image runs outside the workspace, so server/go.sum
needed the hyperboloide/lk entry that GOWORK resolution was supplying locally.
Caught by the image build, not by go build.
2026-07-24 15:35:01 +01:00
mrhid6 fbd0b17ca3 feat(license): trust the production signing key 2026-07-24 15:01:03 +01:00
mrhid6 b26472dfe8 feat(license): add offline verification 2026-07-24 14:58:25 +01:00
mrhid6 5b25797d77 feat(license): add signing and the trusted key list 2026-07-24 14:57:52 +01:00
mrhid6 b1a932b765 feat(license): add the licence payload and tier seed table 2026-07-24 14:57:21 +01:00