Files
2026-05-27 23:29:53 +01:00

3.7 KiB
Raw Permalink Blame History

Tasks — enterprise-license

All checkboxes ticked reflect work done in this change. Package was implemented in one session; spec authored after impl per "collapse to one change" decision (matches §13 reconciliation pattern).

1. Spec authoring

  • 1.1 Read ../suaveplan/enterprise/license.md end-to-end
  • 1.2 Read upstream index.ts / index.types.ts / bitpack.ts / obfuscation.ts
  • 1.3 Draft proposal + spec delta (one terse ### Requirement per feature module, every Verified-by line points at a real it(...) or describe(...) title)

2. Implementation (port-main verbatim + enterprise stack)

  • 2.1 Scaffold: package.json v0.1.0, 16 subpath exports, tsconfig + tsconfig.lib, vite.config, vitest.config (pool: forks, provider: istanbul, 100/100/100/100), tests/setup/polyfills
  • 2.2 src/error-codes.ts + .md — 12-code LICENSE.* registry + LicenseError extends SuaveplanError<LicenseErrorCode>
  • 2.3 src/constants/constants.ts + .md — LICENSE_VERSION, FULL_SIGNATURE_BYTES, SIGNATURE_BYTES, MIN_SIGNATURE_BYTES, BASE32_ALPHABET, LICENSE_SCHEMA, FIELD_BITS, PAYLOAD_BYTES
  • 2.4 src/types/license.ts + .md — every enum/interface/type from upstream index.types.ts verbatim
  • 2.5 src/codec/base32/base32.{ts,test.ts,md}
  • 2.6 src/codec/bitpack/bitpack.{ts,test.ts,md}
  • 2.7 src/codec/payload/payload.{ts,test.ts,md}
  • 2.8 src/codec/obfuscation/obfuscation.{ts,test.ts,md}
  • 2.9 src/time/time.{ts,test.ts,md} — Clock injection
  • 2.10 src/flags/flags.{ts,test.ts,md}
  • 2.11 src/schemas/schemas.{ts,test.ts,md} — Zod boundary schemas
  • 2.12 src/otel/instruments.{ts,test.ts,md} — counters + histogram + attributes
  • 2.13 src/generate/generate.{ts,test.ts,md} — generateLicense, createPayload, parseLicense; OTel, Zod, AbortSignal, Rng/Clock injection
  • 2.14 src/validate/validate.{ts,test.ts,md} — full + truncated sig paths; OTel; AbortSignal
  • 2.15 src/manager/manager.{ts,test.ts,md} — full LicenseManager surface incl. revoke / isRevoked
  • 2.16 src/revocation/revocation-store/revocation-store.{ts,test.ts,md} — RevocationStore interface + createMemoryRevocationStore (LRU) + fingerprintLicense
  • 2.17 src/index.ts — named re-exports only
  • 2.18 README.md
  • 2.19 src/__benchmarks__/license.bench.ts (mitata)
  • 2.20 tests/property.test.ts (fast-check), tests/dep-graph.test.ts, src/license.spec-conformance.test.ts

3. Gates

  • 3.1 bunx turbo lint typecheck test --filter=@suaveplan/license — 11/11 green, 15 test files, 158 tests pass
  • 3.2 bunx turbo test:coverage --filter=@suaveplan/license — 100/100/100/100 across every module
  • 3.3 bunx turbo build --filter=@suaveplan/license — green
  • 3.4 bun scripts/openspec-conformance.ts @suaveplan/license — PASS (0 errors, 3 informational warnings about schemas-invoked-via-wrapper false positive)
  • 3.5 Banned-pattern grep — clean (3 hits are the word "any" in JSDoc prose, not type annotations)
  • 3.6 No export * in any feature barrel
  • 3.7 No direct vitest/bun:test imports
  • 3.8 Every implementation .ts has a sibling .md (≥200 words)

Note: bun run check (monorepo-wide Biome) reports 1619 errors / 14 warnings but all are pre-existing in other packages; bunx turbo lint --filter=@suaveplan/license is clean.

4. Archive

  • 4.1 Fold specs/license/spec.md → openspec/specs/license/spec.md
  • 4.2 Move openspec/changes/enterprise-license/ → openspec/archive/2026-05-17-enterprise-license/
  • 4.3 Refresh MANIFEST.md (bun scripts/folder-reorg/generate-manifest.ts)
  • 4.4 Update root STATUS.md — @suaveplan/license – → ✅ enterprise