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

79 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks — `@suaveplan/api-ws-bun`
> Every checkbox MUST reflect work actually done in this change.
## 0. Pre-flight (non-negotiable)
- [x] 0.1 Confirm clean working tree (`git status` reports nothing) and no in-flight worktrees with uncommitted work (`git worktree list` then `git status` in each)
- [x] 0.2 If any worktrees exist under `.claude/worktrees/`, account for each one: still-active agent, work-pending-merge, or stale-and-prune. Stale worktrees MUST be removed (`git worktree remove`) before opening a new one — code that has been lost twice on main is the failure mode this guards against.
- [x] 0.3 Confirm the package set in `MANIFEST.md` matches `find packages -maxdepth 3 -name package.json` count. Drift here means a prior change archived without regenerating the manifest.
## 1. Spec authoring
- [x] 1.1 Read design doc §11 end-to-end
- [x] 1.2 Read umbrella Stage 7 acceptance
- [x] 1.3 Read design doc §14 open questions (reconnect event-buffer storage)
- [x] 1.4 Read `openspec/AGENTS.md` Sections 13 and 14
- [x] 1.5 Draft `proposal.md`
- [x] 1.6 Draft `specs/api-ws-bun/spec.md`
- [x] 1.7 Every requirement carries a `**Verified by:**` line
## 2. Implementation
- [x] 2.1 Scaffold `packages/api/api-ws-bun/`
- [x] 2.2 `src/options/options.ts` — `BunWsEngineOptions` Zod schema
- [x] 2.3 `src/engine/bun-ws-engine.ts` — `createBunWsEngine(opts)`
- [x] 2.4 `src/handshake/handshake.ts` — pipeline steps 1–7 wiring; principal freezing
- [x] 2.5 `src/registry/connection-registry.ts` — tenant-indexed registry; cross-tenant fan-out gate
- [x] 2.6 `src/backpressure/backpressure.ts` — `maxQueuedMessages` enforcement; `BACKPRESSURE_EVICTED` close frame
- [x] 2.7 `src/heartbeat/heartbeat.ts` — ping/pong schedule; missed-pong-limit drop
- [x] 2.8 `src/limits/tenant-cap.ts` — `maxConnectionsPerTenant` enforcement at handshake
- [x] 2.9 `src/reconnect/reconnect-token.ts` — HMAC token issue/validate via `@suaveplan/crypto-hash`
- [x] 2.10 `src/reconnect/event-buffer.ts` — strategy `"auto"` resolves to broker-backed when wired, in-memory otherwise
- [x] 2.11 `src/subscription/subscription-bus.ts` — `conn.subscribe(topic, { tenant?, filter? })` + `bus.broadcast` fan-out
- [x] 2.12 `src/principal/principal-expiry.ts` — emit `connection.principal_expired` on mid-connection token expiry
- [x] 2.13 `src/instruments/instruments.ts` — every OTel instrument from §11.7
- [x] 2.14 `src/error-codes.ts` — 10 `WS_BUN_*` codes
- [x] 2.15 `./testing` subpath — re-export `runWsEngineConformance` bound to factory
- [x] 2.16 `src/index.ts` — explicit named re-exports
## 3. Tests
- [x] 3.1 Unit tests, every `it(...)` `{ timeout: 5000 }`
- [x] 3.2 Conformance test runs `runWsEngineConformance`
- [x] 3.3 Heartbeat test uses `FakeClock` (`{ timeout: 5000 }`)
- [x] 3.4 Reconnect-token test pins issue + validate + expiry + replay-rejection
- [x] 3.5 Event-buffer strategy test pins broker-when-Redis / memory-otherwise default
- [x] 3.6 End-to-end test against real `Bun.serve` (`{ timeout: 30000 }`)
- [x] 3.7 All tests import from `@suaveplan/testing/runner`
## 4. Documentation
- [x] 4.1 Sibling `.md` per implementation file
- [x] 4.2 `README.md` with `## Modules`; document defaults table (`maxQueuedMessages`, `heartbeatMs`, `missedPongLimit`, `reconnectTokenTtlMs`, `reconnectEventBufferStrategy`)
## 5. Pre-archive verification
- [x] 5.1 `bun run check` — 0/0/0
- [x] 5.2 `bunx turbo lint typecheck test --filter=@suaveplan/api-ws-bun` — green
- [x] 5.3 `bunx turbo test:coverage --filter=@suaveplan/api-ws-bun` — 100/100/100/100
- [x] 5.4 `bun scripts/openspec-conformance.ts @suaveplan/api-ws-bun` — exit 0
- [x] 5.5 `bunx turbo build --filter=@suaveplan/api-ws-bun` — green
## 6. Pre-archive 7-row checklist
- [x] 6.1 Generics on `Connection<TPrincipal>`; `expectTypeOf` on literal-type claims
- [x] 6.2 Zod schemas at every config boundary; reconnect-token payload schema'd
- [x] 6.3 Every `WS_BUN_*` code thrown by a production path
- [x] 6.4 Strict-mode tested (heartbeat on vs off; cross-tenant fan-out capability gate on vs off)
- [x] 6.5 OTel instruments asserted against in-memory `MeterProvider`
- [x] 6.6 Lifecycle dedup: re-`onConnect` after reconnect-resume does not re-mint state — uses resumed subscription set
- [x] 6.7 No retroactive tick
## 7. Archive
- [x] 7.1 Fold spec delta into `openspec/specs/api-ws-bun/spec.md`
- [x] 7.2 Move to `openspec/archive/<yyyy-mm-dd>-api-ws-bun/`
- [x] 7.3 Tick Stage-7 row in umbrella tasks
- [x] 7.4 Refresh `MANIFEST.md`