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

3.7 KiB

Tasks — @suaveplan/api-loader

Every checkbox MUST reflect work actually done in this change.

0. Pre-flight (non-negotiable)

  • 0.1 Confirm clean working tree and accounted-for worktrees (verified in worktree-isolated dispatch)
  • 0.2 Worktree discipline — agent ran in isolated .claude/worktrees/agent-*/
  • 0.3 Package set tracked via MANIFEST.md regen (post-merge)

1. Spec authoring

  • 1.1 Read design doc §8.1, §8.1a, §8.2
  • 1.2 Confirmed openspec/specs/api-loader/spec.md is net-new
  • 1.3 Read openspec/AGENTS.md
  • 1.4 proposal.md
  • 1.5 Source-mapping table
  • 1.6 specs/api-loader/spec.md
  • 1.7 **Verified by:** line on every requirement

2. Implementation

  • 2.1 Package scaffolded at packages/api-stack/api/api-loader/ (0.1.0, sideEffects: false; deps @suaveplan/api-types, @suaveplan/error, tslib, zod)
  • 2.2 src/resolver/ — ModuleResolver, ModuleHandle, ResolveOptions, ModuleResolverFactory types
  • 2.3 src/cache-bust/ — bustSpecifier(url, version) pure helper using WHATWG URL
  • 2.4 src/rollback-journal/ — RollbackJournal interface + reference createRollbackJournal(depth) ring-buffer
  • 2.5 src/journal-entry/ — rollbackJournalEntryPersistedSchema (strict Zod, sha256 regex)
  • 2.6 src/native-binding-detector/ — NativeBindingDetector type, assertNoNativeBindings, LoaderError subclass
  • 2.7 src/error-codes/ — LOADER_CODES registry (4 entries)
  • 2.8 src/testing/ — runLoaderConformance + runRollbackJournalConformance harnesses
  • 2.9 src/index.ts — explicit named re-exports
  • 2.10 package.json exports with 8 subpaths

3. Tests

  • 3.1 Unit tests for cache-bust, journal-entry, native-binding-detector, error-codes, rollback-journal
  • 3.2 Spec-conformance type tests for resolver (interface-only expectTypeOf)
  • 3.3 Property-style sweep on bustSpecifier (monotonic series, replace-not-concat)
  • 3.4 Every it(...) carries { timeout: 5000 }

4. Documentation

  • 4.1 Sibling .md for every implementation .ts (7 docs)
  • 4.2 README.md linking every .md
  • 4.3 No CLAUDE.md update

5. Pre-archive verification

  • 5.1 bunx turbo lint --filter=@suaveplan/api-loader — green
  • 5.2 bunx turbo typecheck --filter=@suaveplan/api-loader — green
  • 5.3 bunx turbo test:coverage --filter=@suaveplan/api-loader — 100/100/100/100
  • 5.4 bun scripts/lint/check-feature-layout.ts + check-test-runner-imports.ts — green
  • 5.5 bunx turbo build --filter=@suaveplan/api-loader — green
  • 5.6 bun run docs:check — 7/7 (100%)

6. Pre-archive 7-row checklist

  • 6.1 Generics on ModuleResolver<M> and ModuleHandle<M>; expectTypeOf proves resolve/dispose/walkNativeBindings shapes
  • 6.2 Zod wired at journal-entry boundary (.strict() + sha256 regex)
  • 6.3 Every LOADER_CODES entry referenced — NATIVE_BINDING_HELD thrown by assertNoNativeBindings; MODULE_IMPORT_FAILED documented in resolver contract + harness; JOURNAL_FULL / JOURNAL_ENTRY_INVALID reserved for host-side impls (documented in error-codes.md)
  • 6.4 Ring-buffer overflow + boundary behaviors tested (capacity eviction, depth=5 custom, peek(0), peek > length, clear-then-push)
  • 6.5 OTel — N/A at contract level (concrete loader emits)
  • 6.6 Lifecycle dedup — N/A at contract level
  • 6.7 No retroactive tick

7. Archive

  • 7.1 Spec delta folded into openspec/specs/api-loader/spec.md
  • 7.2 Moved to openspec/archive/2026-05-25-api-loader/
  • 7.3 Umbrella tick (1.11) — left for parent orchestrator
  • 7.4 MANIFEST.md regen — left for parent orchestrator (post-merge)