@rotorsoft/act-tck 1.27.20 → 1.27.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.cjs +7 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache-differential-tck.ts","../src/fixtures/helpers.ts","../src/cache-tck.ts","../src/fixtures/events.ts","../src/logger-differential-tck.ts","../src/logger-tck.ts","../src/stability-tck.ts","../src/store-differential-tck.ts","../src/store-property-tck.ts","../src/store-tck.ts"],"sourcesContent":["import type { Cache, CacheEntry } from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport { uid } from \"./fixtures/helpers.js\";\n\n/**\n * One {@link Cache} implementation to feed into\n * {@link runCacheDifferentialTck}. The harness drives the identical\n * generated workload against all of them, then compares the observable\n * `get()` snapshot after every operation.\n */\nexport type DifferentialCache = {\n /** Display name used in assertion messages and the describe block. */\n readonly name: string;\n /**\n * Produces the cache under test. Called once in `beforeAll`; the\n * harness owns its lifecycle (`dispose`). Must return an empty cache\n * with capacity for at least {@link CacheDifferentialTckOptions.streams}\n * entries so nothing is evicted mid-comparison.\n */\n readonly factory: () => Cache | Promise<Cache>;\n};\n\n/**\n * Options for {@link runCacheDifferentialTck}.\n */\nexport type CacheDifferentialTckOptions = {\n /** Display name for the differential suite. */\n readonly name: string;\n /**\n * Two or more caches to drive in lockstep and compare. The first entry\n * is the reference; every other cache's observable `get()` snapshot\n * must match it exactly after every operation.\n */\n readonly caches: ReadonlyArray<DifferentialCache>;\n /**\n * Base PRNG seed. Workload `r` of {@link CacheDifferentialTckOptions.runs}\n * is built from `seed + r`, so the campaign is reproducible. Default\n * `0xcac`.\n */\n readonly seed?: number;\n /**\n * Number of distinct streams (cache keys) per workload. Kept small so a\n * bounded cache never evicts during the comparison. Default `6`.\n */\n readonly streams?: number;\n /**\n * How many independent randomized workloads to generate and compare,\n * each from a distinct seed. Default `8`.\n */\n readonly runs?: number;\n};\n\n/**\n * Deterministic 32-bit PRNG (mulberry32). Seeded, so the entire workload\n * is reproducible across runs and across the caches under comparison.\n */\nconst mulberry32 = (seed: number): (() => number) => {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\ntype Entry = CacheEntry<Record<string, unknown>>;\n\n/** An operation in the generated, replayable cache workload. */\ntype CacheOp =\n | { readonly t: \"set\"; readonly stream: string; readonly entry: Entry }\n | { readonly t: \"invalidate\"; readonly stream: string }\n | { readonly t: \"clear\" };\n\n/** The full generated workload, built once and replayed per cache. */\ntype CachePlan = {\n readonly streams: string[];\n readonly ops: CacheOp[];\n};\n\n/**\n * Build a deterministic, seeded cache workload with a randomized operation\n * sequence. Opens by `set`-ting every stream (so `get()` snapshots start\n * populated), then a seeded shuffle of `set` / `invalidate` / `clear`\n * across random streams. The same seed reproduces the same sequence.\n */\nconst build_cache_plan = (seed: number, stream_count: number): CachePlan => {\n const rng = mulberry32(seed);\n const prefix = `cdiff-${uid()}-`;\n const streams = Array.from(\n { length: stream_count },\n (_, i) => `${prefix}${i}`\n );\n\n const make_entry = (): Entry => {\n const v = Math.floor(rng() * 1000);\n return {\n stream: `e-${v}`,\n state: { count: v, label: `k${v % 7}` },\n version: v,\n event_id: v,\n patches: 1 + Math.floor(rng() * 5),\n snaps: Math.floor(rng() * 3),\n };\n };\n const pick_stream = (): string => streams[Math.floor(rng() * streams.length)];\n\n const ops: CacheOp[] = [];\n // Opening: populate every stream so the first snapshots aren't all-empty.\n for (const stream of streams)\n ops.push({ t: \"set\", stream, entry: make_entry() });\n\n // Randomized middle: seeded set / invalidate / clear. Length varies by\n // seed so the operation count is part of the explored input space.\n const middle = 6 + Math.floor(rng() * 14);\n for (let i = 0; i < middle; i++) {\n const kind = Math.floor(rng() * 3);\n if (kind === 0)\n ops.push({ t: \"set\", stream: pick_stream(), entry: make_entry() });\n else if (kind === 1) ops.push({ t: \"invalidate\", stream: pick_stream() });\n else ops.push({ t: \"clear\" });\n }\n\n return { streams, ops };\n};\n\n/** Apply one operation to a single cache. */\nconst apply_op = async (cache: Cache, op: CacheOp): Promise<void> => {\n if (op.t === \"set\") await cache.set(op.stream, op.entry);\n else if (op.t === \"invalidate\") await cache.invalidate(op.stream);\n else await cache.clear();\n};\n\n/** The observable state of a cache reduced to a stream→entry map. */\nconst snapshot = async (\n cache: Cache,\n streams: string[]\n): Promise<Record<string, Entry | undefined>> => {\n const out: Record<string, Entry | undefined> = {};\n for (const stream of streams)\n out[stream] = await cache.get<Record<string, unknown>>(stream);\n return out;\n};\n\n/**\n * Cross-implementation differential contract for the {@link Cache} port\n * (#1057).\n *\n * Where {@link runCacheTck} pins each method's contract against a single\n * implementation, this harness drives a **family of randomized, seeded\n * workloads** (`set` / `invalidate` / `clear`) against two or more caches\n * in lockstep and asserts their observable `get()` snapshot is identical\n * after **every** operation. A cache that mishandles overwrite ordering,\n * leaks an invalidated key, or clears partially diverges from the\n * reference on the exact operation that broke it — with the seed in the\n * describe block for replay.\n *\n * Streams stay within the cache's capacity, so eviction (an adapter\n * policy, not a contract guarantee) never enters the comparison.\n *\n * @example\n * ```ts\n * import { runCacheDifferentialTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryCache } from \"@rotorsoft/act\";\n * import { RedisCache } from \"../src/index.js\";\n *\n * runCacheDifferentialTck({\n * name: \"InMemory vs Redis\",\n * caches: [\n * { name: \"InMemoryCache\", factory: () => new InMemoryCache({ maxSize: 1000 }) },\n * { name: \"RedisCache\", factory: () => new RedisCache({ url: process.env.REDIS_URL }) },\n * ],\n * });\n * ```\n */\nexport const runCacheDifferentialTck = (\n options: CacheDifferentialTckOptions\n): void => {\n describe(`TCK / Cache differential / ${options.name}`, () => {\n const base_seed = options.seed ?? 0xcac;\n const stream_count = options.streams ?? 6;\n const plans = Array.from({ length: options.runs ?? 8 }, (_, r) =>\n build_cache_plan(base_seed + r, stream_count)\n );\n const live: Array<{ name: string; cache: Cache }> = [];\n\n beforeAll(async () => {\n for (const spec of options.caches) {\n live.push({ name: spec.name, cache: await spec.factory() });\n }\n });\n\n afterAll(async () => {\n for (const { cache } of live) await cache.dispose();\n });\n\n plans.forEach((plan, run) => {\n const seed_hex = `0x${(base_seed + run).toString(16)}`;\n it(`agrees on get() after every op (workload ${run}, seed ${seed_hex})`, async () => {\n for (const op of plan.ops) {\n // Apply the same op to every cache, then compare snapshots — so a\n // divergence is pinned to the exact operation that introduced it.\n for (const { cache } of live) await apply_op(cache, op);\n const reference = await snapshot(live[0].cache, plan.streams);\n for (let i = 1; i < live.length; i++) {\n const actual = await snapshot(live[i].cache, plan.streams);\n expect(\n actual,\n `${live[i].name} diverged from ${live[0].name} after ${op.t}`\n ).toEqual(reference);\n }\n }\n });\n });\n });\n};\n","import { randomUUID } from \"node:crypto\";\nimport type {\n Committed,\n EventMeta,\n Message,\n Store,\n} from \"@rotorsoft/act/types\";\nimport type { CounterEvents } from \"./events.js\";\n\nexport type CounterMessage = Message<CounterEvents, keyof CounterEvents>;\nexport type CommittedCounterEvent = Committed<\n CounterEvents,\n keyof CounterEvents\n>;\n\n/**\n * Per-test unique identifier suffix. Use to namespace streams so tests\n * running in parallel against the same shared store (e.g., a real Postgres\n * instance) don't collide on stream names.\n */\nexport const uid = (): string => randomUUID().slice(0, 8);\n\nexport const actor = (name = \"tester\") => ({ id: randomUUID(), name });\n\n/** Build an EventMeta with a correlation id and optional action causation. */\nexport const make_meta = (\n opts: { correlation?: string; stream?: string; action?: string } = {}\n): EventMeta => ({\n correlation: opts.correlation ?? randomUUID(),\n causation: opts.stream\n ? {\n action: {\n name: opts.action ?? \"Test\",\n stream: opts.stream,\n actor: actor(),\n },\n }\n : {},\n});\n\nexport const inc = (amount = 1): CounterMessage => ({\n name: \"Incremented\",\n data: { amount },\n});\n\nexport const dec = (amount = 1): CounterMessage => ({\n name: \"Decremented\",\n data: { amount },\n});\n\nexport const reset = (): CounterMessage => ({ name: \"Reset\", data: {} });\n\n/**\n * Commit `count` Incremented events to `stream` on the given store, each\n * within its own commit transaction (so they receive distinct event ids).\n */\nexport const seed_stream = async (\n store: Store,\n stream: string,\n count: number,\n correlation?: string\n): Promise<CommittedCounterEvent[]> => {\n const out: CommittedCounterEvent[] = [];\n for (let i = 0; i < count; i++) {\n const committed = await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ correlation, stream })\n );\n out.push(...(committed as CommittedCounterEvent[]));\n }\n return out;\n};\n\n/**\n * Drain a `query` call into an array. Convenience wrapper for assertions.\n */\nexport const collect = async (\n store: Store,\n query: Parameters<Store[\"query\"]>[1]\n): Promise<CommittedCounterEvent[]> => {\n const out: CommittedCounterEvent[] = [];\n await store.query<CounterEvents>((e) => {\n out.push(e as CommittedCounterEvent);\n }, query);\n return out;\n};\n","import type { Cache, CacheEntry } from \"@rotorsoft/act/types\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\n\n/**\n * Options for {@link runCacheTck}.\n */\nexport type CacheTckOptions = {\n /**\n * Display name for the implementation under test. Becomes the\n * top-level `describe` block in the vitest run.\n */\n readonly name: string;\n /**\n * Factory invoked before each test. Must return a fresh, empty cache\n * — tests assume zero starting entries. Any per-implementation tuning\n * (max size, TTL, etc.) is the factory's responsibility, but the TCK\n * itself sets ≤ 8 entries in any single test, so a default max of\n * `≥ 8` is safe.\n */\n readonly factory: () => Cache;\n};\n\nconst entry = (\n event_id: number,\n state: Record<string, unknown> = {},\n stream = `s-${event_id}`\n): CacheEntry<Record<string, unknown>> => ({\n stream,\n state,\n version: event_id,\n event_id,\n patches: 1,\n snaps: 0,\n});\n\n/**\n * Runs the Cache contract test compatibility kit against the\n * implementation produced by `options.factory`.\n *\n * Covers the full {@link Cache} surface defined in\n * `libs/act/src/types/ports.ts`:\n * - get/set round-trip\n * - get on a missing key returns undefined\n * - invalidate removes a single stream without affecting others\n * - clear wipes all entries\n * - dispose is idempotent and awaitable\n * - cross-stream isolation\n *\n * Adapter-specific behavior (LRU ordering, TTL, size limits, …) stays\n * in the adapter's own test suite — the TCK only asserts the contract\n * every Cache must honor.\n *\n * @example\n * ```ts\n * import { runCacheTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryCache } from \"@rotorsoft/act\";\n *\n * runCacheTck({\n * name: \"InMemoryCache\",\n * factory: () => new InMemoryCache({ maxSize: 1000 }),\n * });\n * ```\n */\nexport const runCacheTck = (options: CacheTckOptions): void => {\n describe(`TCK / Cache / ${options.name}`, () => {\n let cache: Cache;\n\n beforeEach(() => {\n cache = options.factory();\n });\n\n afterEach(async () => {\n await cache.dispose();\n });\n\n it(\"returns undefined for an unset stream\", async () => {\n expect(await cache.get(\"missing\")).toBeUndefined();\n });\n\n it(\"set then get round-trips an entry\", async () => {\n const e = entry(1, { count: 7 });\n await cache.set(\"s1\", e);\n expect(await cache.get(\"s1\")).toEqual(e);\n });\n\n it(\"set overwrites a prior entry on the same stream\", async () => {\n await cache.set(\"s1\", entry(1, { count: 1 }));\n await cache.set(\"s1\", entry(2, { count: 2 }));\n const got = await cache.get<Record<string, unknown>>(\"s1\");\n expect(got?.event_id).toBe(2);\n expect(got?.state).toEqual({ count: 2 });\n });\n\n it(\"invalidate removes one stream and leaves others\", async () => {\n await cache.set(\"a\", entry(1));\n await cache.set(\"b\", entry(2));\n await cache.invalidate(\"a\");\n expect(await cache.get(\"a\")).toBeUndefined();\n expect(await cache.get(\"b\")).toBeDefined();\n });\n\n it(\"invalidate on an unknown stream is a no-op\", async () => {\n await expect(cache.invalidate(\"never-set\")).resolves.toBeUndefined();\n });\n\n it(\"clear empties every stream\", async () => {\n await cache.set(\"a\", entry(1));\n await cache.set(\"b\", entry(2));\n await cache.set(\"c\", entry(3));\n await cache.clear();\n expect(await cache.get(\"a\")).toBeUndefined();\n expect(await cache.get(\"b\")).toBeUndefined();\n expect(await cache.get(\"c\")).toBeUndefined();\n });\n\n it(\"clear on an empty cache is a no-op\", async () => {\n await expect(cache.clear()).resolves.toBeUndefined();\n });\n\n it(\"entries are isolated per stream\", async () => {\n const ea = entry(1, { id: \"a\" });\n const eb = entry(2, { id: \"b\" });\n await cache.set(\"a\", ea);\n await cache.set(\"b\", eb);\n expect(await cache.get(\"a\")).toEqual(ea);\n expect(await cache.get(\"b\")).toEqual(eb);\n });\n\n it(\"dispose is idempotent\", async () => {\n await cache.set(\"a\", entry(1));\n await cache.dispose();\n await expect(cache.dispose()).resolves.toBeUndefined();\n });\n });\n};\n","import { z } from \"zod\";\n\nexport const Incremented = z.object({ amount: z.number().int() });\nexport const Decremented = z.object({ amount: z.number().int() });\nexport const Reset = z.object({});\n\nexport const CounterSchemas = {\n Incremented,\n Decremented,\n Reset,\n} as const;\n\nexport type CounterEvents = {\n Incremented: z.infer<typeof Incremented>;\n Decremented: z.infer<typeof Decremented>;\n Reset: z.infer<typeof Reset>;\n};\n\nexport const COUNTER_EVENT_NAMES = [\n \"Incremented\",\n \"Decremented\",\n \"Reset\",\n] as const;\n","import type { Logger } from \"@rotorsoft/act/types\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\n\n/**\n * One {@link Logger} implementation to feed into\n * {@link runLoggerDifferentialTck}. The harness drives the identical call\n * sequence against all of them and compares the **portable** observable\n * contract — robustness (does a call throw?) and structural conformance\n * (is `level` a non-empty string, does `child()` satisfy the contract).\n */\nexport type DifferentialLogger = {\n /** Display name used in assertion messages and the describe block. */\n readonly name: string;\n /**\n * Produces the logger under test. Called before each test; the harness\n * owns its lifecycle (`dispose`).\n */\n readonly factory: () => Logger;\n};\n\n/**\n * Options for {@link runLoggerDifferentialTck}.\n */\nexport type LoggerDifferentialTckOptions = {\n /** Display name for the differential suite. */\n readonly name: string;\n /**\n * Two or more loggers to drive in lockstep and compare. The first entry\n * is the reference; every other logger must uphold the same portable\n * observable contract under the identical call sequence.\n */\n readonly loggers: ReadonlyArray<DifferentialLogger>;\n};\n\nconst LEVELS = [\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"] as const;\n\n/**\n * Drive a logger through the full call surface and return a vector of\n * **observable, portable** outcomes. A logger's formatted output is\n * adapter-specific by design (pino JSON vs console text vs a file sink),\n * so the only thing two implementations can be held to byte-for-byte is:\n *\n * - whether each call **throws** (robustness parity — a logger that\n * blows up on a cyclic or null payload the reference tolerates is a\n * real divergence);\n * - whether `level` is a non-empty string;\n * - whether `child()` returns something that itself satisfies the\n * contract (and can spawn a further child).\n *\n * The vector is order-stable, so a single `toEqual` pins any divergence to\n * the exact call that broke parity.\n */\nconst drive = (logger: Logger): boolean[] => {\n const out: boolean[] = [];\n const ok = (fn: () => void): void => {\n try {\n fn();\n out.push(true);\n } catch {\n out.push(false);\n }\n };\n\n out.push(typeof logger.level === \"string\" && logger.level.length > 0);\n for (const level of LEVELS) {\n ok(() => logger[level](\"message\"));\n ok(() => logger[level]({ k: \"v\", n: 1 }));\n ok(() => logger[level]({ k: \"v\" }, \"context\"));\n }\n ok(() => logger.info(null, \"null payload\"));\n ok(() => {\n const cyclic: Record<string, unknown> = { name: \"loop\" };\n cyclic.self = cyclic;\n logger.info(cyclic, \"cycle\");\n });\n\n // Child conformance: a child must satisfy the same contract and be able\n // to spawn its own child — recorded as observable booleans, not asserted\n // here, so a non-conforming child surfaces as a vector divergence.\n const child = logger.child({ request_id: \"abc\" });\n out.push(typeof child.level === \"string\" && child.level.length > 0);\n out.push(LEVELS.every((level) => typeof child[level] === \"function\"));\n out.push(typeof child.child === \"function\");\n ok(() => child.child({ nested: true }).info(\"nested\"));\n\n return out;\n};\n\n/**\n * Cross-implementation differential contract for the {@link Logger} port\n * (#1057).\n *\n * A logger has no portable return value to byte-compare — its output\n * format is adapter-specific by design, which is exactly why\n * {@link runLoggerTck} checks shape rather than bytes. The meaningful\n * differential is therefore **robustness and structural parity**: driven\n * through the identical call sequence (every level, both overloads, null\n * and cyclic payloads, child spawning), do two implementations agree on\n * what throws and what conforms? They must. A logger that throws on a\n * cyclic payload the reference tolerates, or returns a non-conforming\n * child, diverges from the reference vector.\n *\n * @example\n * ```ts\n * import { runLoggerDifferentialTck } from \"@rotorsoft/act-tck\";\n * import { ConsoleLogger } from \"@rotorsoft/act\";\n * import { PinoLogger } from \"../src/index.js\";\n *\n * runLoggerDifferentialTck({\n * name: \"Console vs Pino\",\n * loggers: [\n * { name: \"ConsoleLogger\", factory: () => new ConsoleLogger({ level: \"trace\" }) },\n * { name: \"PinoLogger\", factory: () => new PinoLogger({ level: \"trace\" }) },\n * ],\n * });\n * ```\n */\nexport const runLoggerDifferentialTck = (\n options: LoggerDifferentialTckOptions\n): void => {\n describe(`TCK / Logger differential / ${options.name}`, () => {\n let live: Array<{ name: string; logger: Logger }> = [];\n let original_stdout: typeof process.stdout.write;\n\n // Silence stdout while driving the loggers — we compare observable\n // outcomes, not formatted output, and chatty sinks would spam the run.\n beforeEach(() => {\n live = options.loggers.map((spec) => ({\n name: spec.name,\n logger: spec.factory(),\n }));\n original_stdout = process.stdout.write.bind(process.stdout);\n process.stdout.write = (() => true) as typeof process.stdout.write;\n });\n\n afterEach(async () => {\n process.stdout.write = original_stdout;\n for (const { logger } of live) await logger.dispose();\n });\n\n it(\"agrees on robustness and structural parity across the call surface\", () => {\n const reference = drive(live[0].logger);\n for (let i = 1; i < live.length; i++) {\n const actual = drive(live[i].logger);\n expect(actual, `${live[i].name} diverged from ${live[0].name}`).toEqual(\n reference\n );\n }\n });\n });\n};\n","import type { Logger } from \"@rotorsoft/act/types\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\n\n/**\n * Options for {@link runLoggerTck}.\n */\nexport type LoggerTckOptions = {\n /**\n * Display name for the implementation under test.\n */\n readonly name: string;\n /**\n * Factory invoked before each test. Must return a fresh logger\n * instance — tests do not assume any starting state.\n */\n readonly factory: () => Logger;\n};\n\nconst LEVELS = [\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"] as const;\n\n/**\n * Runs the Logger contract test compatibility kit against the\n * implementation produced by `options.factory`.\n *\n * The {@link Logger} contract is intentionally narrow: implementations\n * are pluggable wrappers around pino, winston, bunyan, console, etc.\n * The TCK verifies the **shape** of the contract, not the format of\n * the output (which is adapter-specific by design):\n * - every level method exists and is callable in both overload forms\n * `(msg)` and `(obj, msg?)`\n * - `child(bindings)` returns something that satisfies the same\n * contract and can itself spawn children\n * - `level` is a non-empty string\n * - `dispose` is awaitable and idempotent\n * - cyclic payloads must not throw (sinks may choose any fallback)\n *\n * Anything more (output format, level gating, color, file routing) is\n * adapter-specific and stays in the adapter's own test suite.\n *\n * @example\n * ```ts\n * import { runLoggerTck } from \"@rotorsoft/act-tck\";\n * import { ConsoleLogger } from \"@rotorsoft/act\";\n *\n * runLoggerTck({\n * name: \"ConsoleLogger\",\n * factory: () => new ConsoleLogger({ level: \"trace\" }),\n * });\n * ```\n */\nexport const runLoggerTck = (options: LoggerTckOptions): void => {\n describe(`TCK / Logger / ${options.name}`, () => {\n let logger: Logger;\n let original_stdout: typeof process.stdout.write;\n\n // Silence stdout during the TCK — we don't assert on output, and\n // chatty implementations would otherwise spam test runs. Loggers\n // that route elsewhere (stderr, files) won't appear in the test\n // report; checking their formatted output is the adapter's own\n // responsibility.\n beforeEach(() => {\n logger = options.factory();\n original_stdout = process.stdout.write.bind(process.stdout);\n process.stdout.write = (() => true) as typeof process.stdout.write;\n });\n\n afterEach(async () => {\n process.stdout.write = original_stdout;\n await logger.dispose();\n });\n\n it(\"exposes a non-empty `level` string\", () => {\n expect(typeof logger.level).toBe(\"string\");\n expect(logger.level.length).toBeGreaterThan(0);\n });\n\n for (const level of LEVELS) {\n it(`${level}(msg) does not throw`, () => {\n expect(() => logger[level](\"hello\")).not.toThrow();\n });\n\n it(`${level}(obj) does not throw`, () => {\n expect(() => logger[level]({ k: \"v\" })).not.toThrow();\n });\n\n it(`${level}(obj, msg) does not throw`, () => {\n expect(() => logger[level]({ k: \"v\" }, \"context\")).not.toThrow();\n });\n }\n\n it(\"accepts a null payload\", () => {\n expect(() => logger.info(null, \"null payload\")).not.toThrow();\n });\n\n it(\"accepts a cyclic payload without throwing\", () => {\n const cyclic: Record<string, unknown> = { name: \"loop\" };\n cyclic.self = cyclic;\n expect(() => logger.info(cyclic, \"cycle\")).not.toThrow();\n });\n\n it(\"child(bindings) returns a Logger satisfying the same contract\", () => {\n const child = logger.child({ request_id: \"abc\" });\n expect(typeof child.level).toBe(\"string\");\n for (const level of LEVELS) {\n expect(typeof child[level]).toBe(\"function\");\n }\n expect(typeof child.child).toBe(\"function\");\n expect(typeof child.dispose).toBe(\"function\");\n });\n\n it(\"child loggers can themselves spawn children\", () => {\n const c1 = logger.child({ a: 1 });\n const c2 = c1.child({ b: 2 });\n expect(() => c2.info(\"nested\")).not.toThrow();\n });\n\n it(\"dispose is idempotent and awaitable\", async () => {\n await expect(logger.dispose()).resolves.toBeUndefined();\n await expect(logger.dispose()).resolves.toBeUndefined();\n });\n });\n};\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { describe, expect, it } from \"vitest\";\n\n/**\n * Options for {@link runStabilityTck}.\n *\n * @property name - Display name for the snapshot suite (e.g., the package\n * name). Used as the `describe` block label so failing snapshots are\n * attributable at a glance.\n * @property entryPoints - Map of subpath → entry source file. The TCK\n * reads each entry, follows its relative re-exports recursively, and\n * snapshots the resulting surface text. Empty-string subpaths label\n * the root entry; everything else is rendered with its key (e.g.\n * `\"/receiver\"`).\n */\nexport type StabilityTckOptions = {\n readonly name: string;\n readonly entryPoints: Readonly<Record<string, string>>;\n};\n\n/**\n * Snapshot-based public-API stability check. Walks each entry's source\n * file plus everything it re-exports through relative imports, and\n * compares the concatenated text against a committed Vitest snapshot.\n *\n * Catches accidental rename / removal / signature drift on the public\n * surface before a build merges. Any change that affects re-exports\n * shows up as a snapshot diff in the PR; reviewers either accept the\n * change (update the snapshot deliberately) or push back.\n *\n * The TCK reads source (`.ts`) rather than built declarations so it\n * doesn't need a prior `pnpm build`. It follows `from \"./relative.js\"`\n * re-exports transitively; non-relative paths (other packages, `node:`)\n * stop the walk — drift in another package's surface is that package's\n * stability TCK to catch.\n *\n * @example\n * ```ts\n * import path from \"node:path\";\n * import { runStabilityTck } from \"@rotorsoft/act-tck\";\n *\n * runStabilityTck({\n * name: \"@rotorsoft/act-http\",\n * entryPoints: {\n * \"/api\": path.resolve(\"src/api/index.ts\"),\n * \"/webhook\": path.resolve(\"src/webhook/index.ts\"),\n * \"/sse\": path.resolve(\"src/sse/index.ts\"),\n * \"/receiver\": path.resolve(\"src/receiver/index.ts\"),\n * },\n * });\n * ```\n *\n * @param options - See {@link StabilityTckOptions}.\n */\nexport function runStabilityTck(options: StabilityTckOptions): void {\n describe(`${options.name} — public API stability`, () => {\n for (const [subpath, entry] of Object.entries(options.entryPoints)) {\n const label = subpath || \"(root)\";\n it(`stable public surface for ${label}`, async () => {\n const surface = await load_surface(entry);\n expect(surface).toMatchSnapshot();\n });\n }\n });\n}\n\n/**\n * Load and concatenate the public surface of an entry source file.\n * Recursively walks relative re-exports, deduplicating visited files\n * and sorting visited paths so cosmetic file-order changes don't shift\n * the snapshot.\n */\nasync function load_surface(entry: string): Promise<string> {\n const visited = new Map<string, string>();\n\n async function walk(file: string): Promise<void> {\n const abs = path.resolve(file);\n if (visited.has(abs)) return;\n\n const content = await fs.readFile(abs, \"utf8\");\n visited.set(abs, content);\n\n // Match top-of-line `import`/`export ... from \"./relative.js\"` statements\n // only, so JSDoc strings and example code in comments don't get walked.\n const re_export =\n /^\\s*(?:import|export)\\b[^\"';]*\\bfrom\\s+[\"'](\\.[^\"']+)[\"']/gm;\n for (const m of content.matchAll(re_export)) {\n const rel = m[1].replace(/\\.js$/, \".ts\");\n const target = path.resolve(path.dirname(abs), rel);\n await walk(target);\n }\n }\n\n await walk(entry);\n\n // Sort by basename for stable ordering across machines.\n const sorted = [...visited.entries()].sort(([a], [b]) =>\n path.basename(a).localeCompare(path.basename(b))\n );\n return sorted\n .map(([abs, content]) => {\n const rel = path.basename(abs);\n return `// === ${rel} ===\\n${content}`;\n })\n .join(\"\\n\");\n}\n","import { SNAP_EVENT } from \"@rotorsoft/act\";\nimport type {\n BlockedLease,\n Committed,\n Lease,\n Schemas,\n Store,\n} from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport type { CounterEvents } from \"./fixtures/events.js\";\nimport {\n type CounterMessage,\n dec,\n inc,\n make_meta,\n reset as reset_event,\n uid,\n} from \"./fixtures/helpers.js\";\n\n/**\n * One {@link Store} implementation to feed into\n * {@link runStoreDifferentialTck}. The harness drops + seeds each store,\n * replays the identical generated workload against all of them, then\n * compares their normalized outputs.\n */\nexport type DifferentialStore = {\n /** Display name used in assertion messages and the describe block. */\n readonly name: string;\n /**\n * Produces the store under test. Called once in `beforeAll`; the\n * harness owns its lifecycle (`drop` + `seed`, then `dispose`).\n */\n readonly factory: () => Store | Promise<Store>;\n};\n\n/**\n * Known cross-adapter divergences the caller wants the differential to\n * skip until the backing fix lands. Each flag suppresses exactly the\n * assertions that a currently-filed bug makes red, so the differential\n * stays green on master and the gate un-gates itself (delete the flag)\n * when the fix merges. Every flag names its issue so the reason is\n * auditable at the call site.\n */\nexport type DifferentialSkips = {\n /**\n * #1197 — SQLite `LIKE` is ASCII-case-insensitive, so a **mixed-case\n * regex pattern** filter overmatches vs PG (`~`) / InMemory (`RegExp`),\n * which are case-sensitive. Skips only the pattern-driven mixed-case\n * assertions; exact-match (`stream_exact`) mixed-case still runs, since\n * that path is case-exact on every adapter. Un-gate when #1197 lands.\n */\n readonly caseInsensitivePatterns?: boolean;\n /**\n * #1199 — `names: []` and falsy-zero `before`/`after: 0` guards differ\n * across adapters (`names: []` → PG returns all, InMemory/SQLite return\n * none; `before: 0` / `after: 0` are dropped by some adapters' truthy\n * guards). Skips only those specific edge-input query assertions.\n * Un-gate when #1199 lands.\n */\n readonly queryEdgeInputs?: boolean;\n};\n\n/**\n * Options for {@link runStoreDifferentialTck}.\n */\nexport type StoreDifferentialTckOptions = {\n /** Display name for the differential suite. */\n readonly name: string;\n /**\n * Two or more stores to drive in lockstep and compare. The first\n * entry is the reference; every other store's normalized output must\n * match it exactly. Pass `InMemoryStore` as the reference and the\n * durable adapter(s) as the comparands.\n */\n readonly stores: ReadonlyArray<DifferentialStore>;\n /**\n * Base PRNG seed. Workload `r` of {@link StoreDifferentialTckOptions.runs}\n * is built from `seed + r`, so the whole fuzz campaign is reproducible:\n * the same `seed` ⇒ the same family of workloads ⇒ any divergence is\n * deterministically replayable. Default `0xac7`.\n */\n readonly seed?: number;\n /**\n * Number of distinct event-bearing streams per workload.\n * Default `4`.\n */\n readonly streams?: number;\n /**\n * How many independent randomized workloads to generate and compare,\n * each from a distinct seed (`seed`, `seed + 1`, …, `seed + runs - 1`).\n * More runs widen the slice of the input space the differential\n * explores; fewer keep durable-adapter suites fast. Default `8`.\n */\n readonly runs?: number;\n /**\n * Whether the comparand adapters support the optional {@link Store.forget_pii}\n * surface (and the `pii` field on commit). When `true`, the workload\n * commits PII-bearing events and the differential asserts that\n * `forget_pii` wipes them identically across adapters. All in-tree\n * adapters implement it, so it defaults to `true`; a third-party store\n * that opts out sets it `false`. Default `true`.\n */\n readonly piiIsolation?: boolean;\n /**\n * Known-divergence gates — see {@link DifferentialSkips}. Each flag\n * suppresses the assertions a currently-filed bug makes red so the\n * differential stays green until the fix merges. Default: nothing\n * skipped.\n */\n readonly skip?: DifferentialSkips;\n};\n\n/**\n * Deterministic 32-bit PRNG (mulberry32). Seeded, so the entire workload\n * is reproducible across runs and across the stores under comparison.\n */\nconst mulberry32 = (seed: number): (() => number) => {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\n/** A single committed event reduced to its store-independent identity. */\ntype NormalizedEvent = {\n readonly stream: string;\n readonly version: number;\n readonly name: string;\n readonly data: unknown;\n /** `true` when the event carried PII on load, `false`/absent otherwise. */\n readonly pii?: boolean;\n};\n\n/**\n * Strip the fields that legitimately differ between adapters — absolute\n * event `id`, `created` timestamp, and `meta` (correlation/causation\n * uuids) — leaving only what defines \"the right events in the right\n * order\": stream, version, name, data, and whether PII was present. Event\n * ordering is preserved by the position of each normalized event in the\n * collected array.\n *\n * PII is normalized to a boolean presence flag rather than its plaintext:\n * the differential's job is \"did `forget_pii` erase the same rows on every\n * adapter\", not \"does every adapter round-trip the same ciphertext\" (which\n * the per-adapter `pii_isolation` suite already pins).\n */\nconst normalize_event = (\n e: Committed<Schemas, keyof Schemas>\n): NormalizedEvent => ({\n stream: e.stream,\n version: e.version,\n name: e.name,\n data: e.data,\n pii: e.pii != null,\n});\n\n/**\n * Identity-only view (no PII flag). `query_stats` head/tail is a\n * stream-shape summary — whether an adapter hydrates the isolated PII\n * column on the head/tail rows it returns is not part of that contract\n * (the per-adapter `pii_isolation` suite pins hydration on `query` /\n * `commit`, not on `query_stats`). Comparing PII presence here would\n * over-specify and flag a legitimate adapter freedom as a divergence.\n */\nconst normalize_identity = (\n e: Committed<Schemas, keyof Schemas>\n): Omit<NormalizedEvent, \"pii\"> => ({\n stream: e.stream,\n version: e.version,\n name: e.name,\n data: e.data,\n});\n\n/** An operation in the generated, replayable workload. */\ntype PlanOp =\n | {\n readonly t: \"commit\";\n readonly stream: string;\n readonly msgs: CounterMessage[];\n /** When set, the batch's first message carries this PII payload. */\n readonly pii?: Record<string, unknown>;\n }\n | { readonly t: \"snapshot\"; readonly stream: string; readonly count: number }\n | { readonly t: \"truncate\"; readonly stream: string; readonly count: number }\n // Windowed truncate: prefix-delete below the closest safe boundary\n // snapshot with `created < before` (and `id <= max_id` when set). The\n // op writes a snapshot first (in `apply_plan`) so a boundary always\n // exists, making the prune deterministic across adapters.\n | {\n readonly t: \"truncate_windowed\";\n readonly stream: string;\n readonly max_id: boolean;\n }\n // Lease lifecycle against a subscription stream (indexed into\n // `plan.subs`). `claim` leases every claimable stream under a fresh\n // holder; `apply_plan` records which holder now owns each stream so the\n // finalize verbs (`ack` / `defer` / `block`) target the *real* current\n // holder on each adapter. That makes the durable outcome (watermark,\n // retry, blocked, error, deferred) a deterministic function of the op\n // sequence — independent of the exact holder UUID (normalized away) and\n // of any adapter's claim-frontier tie-break. A verb whose target stream\n // is not currently held is a no-op on every adapter, identically.\n | { readonly t: \"claim\"; readonly millis: number }\n | { readonly t: \"ack\"; readonly sub: number }\n | { readonly t: \"defer\"; readonly sub: number; readonly due: number }\n | { readonly t: \"block\"; readonly sub: number; readonly error: string }\n | { readonly t: \"unblock\"; readonly sub: number }\n | { readonly t: \"reset_sub\"; readonly sub: number }\n | {\n readonly t: \"prioritize\";\n readonly sub: number;\n readonly priority: number;\n };\n\n/** A subscription registered for the `query_streams` comparison. */\ntype SubSpec = {\n readonly stream: string;\n readonly source: string;\n readonly lane: string;\n readonly priority: number;\n};\n\n/** A query-option matrix entry compared under a global forward scan. */\ntype QueryCase = {\n readonly label: string;\n readonly query: Record<string, unknown>;\n /**\n * When set, this case is only well-defined once the named fix lands;\n * the harness skips it while the matching {@link DifferentialSkips}\n * flag is on.\n */\n readonly gated?: keyof DifferentialSkips;\n};\n\n/** The full generated workload, built once and replayed per store. */\ntype Plan = {\n readonly event_prefix: string;\n readonly event_streams: string[];\n readonly sub_prefix: string;\n readonly ops: PlanOp[];\n readonly subs: SubSpec[];\n readonly correlation: string;\n readonly pii_stream: string;\n readonly query_cases: QueryCase[];\n /** The single event name guaranteed to appear (for `names` filters). */\n readonly filter_name: string;\n};\n\n/**\n * Build a deterministic, seeded workload with a **randomized** operation\n * sequence. Unlike a fixed script, the middle of each plan is a seeded\n * shuffle of `commit` / `snapshot` / `truncate` (full + windowed) plus the\n * **lease lifecycle** (`claim` / `ack` / `defer` / `block` / `unblock` /\n * `reset` / `prioritize`) across random streams, so different seeds probe\n * different interleavings — pre/post-snapshot commits, a claim landing\n * between two truncates, a block-then-unblock, and so on. The same seed\n * always reproduces the same sequence, so any divergence the fuzz finds is\n * replayable.\n *\n * Stream names carry **mixed case** so a case-sensitivity divergence in a\n * pattern filter surfaces as a diff (the whole point of #1197's coverage).\n *\n * Two invariants are pinned regardless of seed so the comparison stays\n * well-defined across adapters:\n *\n * - an **opening** commit per stream — every stream is non-empty before\n * a snapshot or truncate can reference it;\n * - a **closing** commit per stream — every stream ends with real\n * (non-snapshot) events, so `query_stats` head/tail are defined even\n * when a truncate was the last randomized touch.\n *\n * Event types cycle inc → dec → reset via a shared cursor, so all three\n * payload shapes appear in every plan.\n */\nconst build_plan = (\n seed: number,\n stream_count: number,\n pii_isolation: boolean\n): Plan => {\n const rng = mulberry32(seed);\n const tag = uid();\n // Mixed-case prefixes: an upper-cased segment lands inside every stream\n // and subscription name, so a case-insensitive pattern filter (SQLite\n // LIKE, #1197) overmatches and diverges from the case-sensitive\n // reference. A lower-only corpus can never surface that class of bug.\n const event_prefix = `Diff-${tag}-Evt-`;\n const sub_prefix = `Diff-${tag}-Sub-`;\n const event_streams = Array.from(\n { length: stream_count },\n (_, i) => `${event_prefix}S${i}`\n );\n const correlation = `corr-${tag}`;\n\n let type_cursor = 0;\n const next_msg = (): CounterMessage => {\n const kind = type_cursor++ % 3;\n const amount = 1 + Math.floor(rng() * 9);\n return kind === 0 ? inc(amount) : kind === 1 ? dec(amount) : reset_event();\n };\n const batch = (): CounterMessage[] =>\n Array.from({ length: 1 + Math.floor(rng() * 3) }, next_msg);\n const pick_stream = (): string =>\n event_streams[Math.floor(rng() * event_streams.length)];\n // Each subscription consumes from its **own dedicated source stream**\n // that only ever receives a single opening commit and is never truncated.\n // Decoupling the lease sources from the truncate-churned `event_streams`\n // is what makes `claim` eligibility identical across adapters: every\n // subscription has exactly one unit of work at watermark -1, so a wide-\n // budget claim leases the same set on every store — the lease-lifecycle\n // diff then reflects only the ack/block/unblock/reset ops, not adapter\n // differences in \"does this source still have events after a truncate\".\n const lanes = [\"default\", \"slow\", \"fast\"];\n const lease_prefix = `Diff-${tag}-Src-`;\n const lease_sources = event_streams.map((_, i) => `${lease_prefix}S${i}`);\n const subs: SubSpec[] = lease_sources.map((source, i) => ({\n stream: `${sub_prefix}S${i}`,\n source,\n lane: lanes[i % lanes.length],\n priority: i % 4,\n }));\n const pick_sub = (): number => Math.floor(rng() * subs.length);\n\n const ops: PlanOp[] = [];\n // Opening: every stream commits a batch so it exists before any\n // snapshot/truncate references it. The first stream's opening batch\n // carries PII (when the adapter supports it) so `forget_pii` has\n // something to erase.\n const pii_stream = event_streams[0];\n event_streams.forEach((stream, i) => {\n ops.push({\n t: \"commit\",\n stream,\n msgs: batch(),\n pii:\n pii_isolation && i === 0\n ? { email: `u-${tag}@example.com`, name: \"Ursula\" }\n : undefined,\n });\n });\n // One commit per lease source so every subscription starts with exactly\n // one unit of work at watermark -1. These streams are never truncated.\n for (const src of lease_sources)\n ops.push({ t: \"commit\", stream: src, msgs: [inc(1)] });\n\n // Register every subscription up front so the lease-lifecycle ops in the\n // middle have claimable streams. A fresh subscription's watermark is -1.\n // (Applied via `subscribe` before the ops loop in `apply_plan`.)\n\n // Randomized middle: a seeded sequence over the full op vocabulary.\n const middle = 12 + Math.floor(rng() * 20);\n for (let i = 0; i < middle; i++) {\n const kind = Math.floor(rng() * 10);\n if (kind === 0) {\n ops.push({ t: \"commit\", stream: pick_stream(), msgs: batch() });\n } else if (kind === 1) {\n ops.push({\n t: \"snapshot\",\n stream: pick_stream(),\n count: Math.floor(rng() * 1000),\n });\n } else if (kind === 2) {\n ops.push({\n t: \"truncate\",\n stream: pick_stream(),\n count: Math.floor(rng() * 1000),\n });\n } else if (kind === 3) {\n ops.push({\n t: \"truncate_windowed\",\n stream: pick_stream(),\n max_id: rng() < 0.5,\n });\n } else if (kind === 4) {\n // Large lease window so the claim holds; retry counters advance\n // deterministically (claim increments, ack resets).\n ops.push({ t: \"claim\", millis: 100_000 });\n } else if (kind === 5) {\n ops.push({ t: \"ack\", sub: pick_sub() });\n } else if (kind === 6) {\n // Deterministic due-time relative to a fixed epoch so `deferred_at`\n // is identical on every adapter. Far in the future so the deferred\n // stream stays held-out.\n ops.push({\n t: \"defer\",\n sub: pick_sub(),\n due: 4_102_444_800_000 + Math.floor(rng() * 1000),\n });\n } else if (kind === 7) {\n ops.push({\n t: \"block\",\n sub: pick_sub(),\n error: `boom-${Math.floor(rng() * 100)}`,\n });\n } else if (kind === 8) {\n ops.push({ t: \"unblock\", sub: pick_sub() });\n } else {\n // reset / prioritize share the last bucket via a sub-toss.\n if (rng() < 0.5) ops.push({ t: \"reset_sub\", sub: pick_sub() });\n else\n ops.push({\n t: \"prioritize\",\n sub: pick_sub(),\n priority: Math.floor(rng() * 10),\n });\n }\n }\n\n // Closing: every stream commits a final batch so it ends with real\n // events — keeps query_stats head/tail well-defined after any truncate.\n const filter_name = \"Incremented\";\n for (const stream of event_streams)\n ops.push({ t: \"commit\", stream, msgs: [inc(1)] });\n\n // Query-option matrix compared under a global forward/backward scan.\n // Each case exercises a distinct filter dimension; the normalized event\n // list must match across adapters. Edge-input cases (`names: []`,\n // falsy-zero bounds) are gated behind #1199 until the guards converge.\n const query_cases: QueryCase[] = [\n {\n label: \"names filter (single event name)\",\n query: { stream: `^${event_prefix}`, names: [filter_name] },\n },\n {\n label: \"correlation filter\",\n query: { stream: `^${event_prefix}`, correlation },\n },\n {\n label: \"limit bound\",\n query: { stream: `^${event_prefix}`, limit: 3 },\n },\n {\n label: \"backward + limit\",\n query: { stream: `^${event_prefix}`, backward: true, limit: 4 },\n },\n // Absolute `id` bounds (`after`/`before` with positive ids) are\n // deliberately absent: event ids are the canonical \"legitimately\n // differs between adapters\" field (see `normalize_event`), and full\n // truncates renumber them differently per store, so a positive id\n // bound selects a different absolute window on each adapter. The\n // gated falsy-zero cases below compare only the *guard* behavior\n // (filter applied → subset, vs filter dropped → all), which stays a\n // well-defined divergence regardless of the concrete id values.\n // #1199 edge inputs — opposite semantics across adapters today.\n {\n label: \"empty names filter\",\n query: { stream: `^${event_prefix}`, names: [] as string[] },\n gated: \"queryEdgeInputs\",\n },\n {\n label: \"before: 0 (falsy-zero guard)\",\n query: { stream: `^${event_prefix}`, before: 0 },\n gated: \"queryEdgeInputs\",\n },\n {\n label: \"backward + after: 0 (falsy-zero guard)\",\n query: { stream: `^${event_prefix}`, backward: true, after: 0 },\n gated: \"queryEdgeInputs\",\n },\n ];\n\n return {\n event_prefix,\n event_streams,\n sub_prefix,\n ops,\n subs,\n correlation,\n pii_stream,\n query_cases,\n filter_name,\n };\n};\n\n/** Replay the generated workload against a single store. */\nconst apply_plan = async (\n store: Store,\n plan: Plan,\n pii_isolation: boolean\n): Promise<void> => {\n // Register subscriptions first so the lease-lifecycle ops have targets.\n await store.subscribe(\n plan.subs.map((s) => ({\n stream: s.stream,\n source: s.source,\n lane: s.lane,\n priority: s.priority,\n }))\n );\n\n // Adapter-local map of the lease holder currently owning each of *this\n // plan's* subscription streams, kept in sync from `claim` results. The\n // finalize verbs read the real current holder so their durable effect is\n // a deterministic function of the op sequence — the holder UUID itself is\n // an adapter detail (normalized away in the assertions). A verb whose\n // target isn't held is skipped, exactly as an unheld `ack`/`block` would\n // no-op inside the adapter.\n const held = new Map<string, string>();\n const owned = new Set(plan.subs.map((s) => s.stream));\n\n for (const op of plan.ops) {\n if (op.t === \"commit\") {\n const msgs =\n op.pii && pii_isolation\n ? op.msgs.map((m, i) => (i === 0 ? { ...m, pii: op.pii } : m))\n : op.msgs;\n await store.commit<CounterEvents>(\n op.stream,\n msgs as CounterMessage[],\n make_meta({ stream: op.stream, correlation: plan.correlation })\n );\n } else if (op.t === \"snapshot\") {\n await store.commit(\n op.stream,\n [{ name: SNAP_EVENT, data: { count: op.count } }],\n make_meta({ stream: op.stream, correlation: plan.correlation })\n );\n } else if (op.t === \"truncate\") {\n await store.truncate([\n { stream: op.stream, snapshot: { count: op.count } },\n ]);\n } else if (op.t === \"truncate_windowed\") {\n // Write a boundary snapshot, then prefix-delete below it. `before`\n // sits just after the snapshot's commit time; `max_id` (when set) is\n // wide so it never excludes the boundary. Deterministic across\n // adapters: the boundary is a real event the workload wrote.\n await store.commit(\n op.stream,\n [{ name: SNAP_EVENT, data: { count: 1 } }],\n make_meta({ stream: op.stream, correlation: plan.correlation })\n );\n await store.truncate([\n {\n stream: op.stream,\n before: new Date(Date.now() + 60_000),\n // A wide cap that still fits a 32-bit event-id column, so it\n // never excludes the boundary snapshot on any adapter.\n ...(op.max_id ? { max_id: 2_147_483_647 } : {}),\n },\n ]);\n } else if (op.t === \"claim\") {\n // Budget wide enough to lease every claimable stream in one call, so\n // *which* streams get leased never depends on an adapter's frontier\n // tie-break order — every unleased, unblocked, non-deferred stream is\n // claimed under a fresh holder. Record the new holder for this plan's\n // streams; the finalize verbs read it back.\n const by = uid();\n const leased = await store.claim(100_000, 100_000, by, op.millis);\n for (const l of leased) if (owned.has(l.stream)) held.set(l.stream, by);\n } else if (op.t === \"ack\") {\n const stream = plan.subs[op.sub].stream;\n const by = held.get(stream);\n if (by) {\n // Advance the watermark to 0 (the opening event) and release.\n await store.ack([{ stream, at: 0, by, retry: 0, lagging: true }]);\n held.delete(stream);\n }\n } else if (op.t === \"defer\") {\n const stream = plan.subs[op.sub].stream;\n const by = held.get(stream);\n if (by) {\n const lease: Lease = {\n stream,\n at: 0,\n by,\n retry: 0,\n lagging: true,\n due: op.due,\n };\n await store.ack([lease]);\n held.delete(stream);\n }\n } else if (op.t === \"block\") {\n const stream = plan.subs[op.sub].stream;\n const by = held.get(stream);\n if (by) {\n const lease: BlockedLease = {\n stream,\n at: 0,\n by,\n retry: 0,\n lagging: true,\n error: op.error,\n };\n await store.block([lease]);\n held.delete(stream);\n }\n } else if (op.t === \"unblock\") {\n const stream = plan.subs[op.sub].stream;\n await store.unblock([stream]);\n held.delete(stream);\n } else if (op.t === \"reset_sub\") {\n const stream = plan.subs[op.sub].stream;\n await store.reset([stream]);\n held.delete(stream);\n } else {\n await store.prioritize(\n { stream: plan.subs[op.sub].stream, stream_exact: true },\n op.priority\n );\n }\n }\n};\n\n/**\n * Cross-adapter differential contract (#1030, fuzz workloads #1057,\n * lease/truncate/pii/query fuzz #1200).\n *\n * Adapters can drift in ways per-adapter cases don't catch — event\n * ordering, the `with_snaps` snapshot floor, the exact shape of\n * `query_stats` / `query_streams` output, the lease lifecycle's effect on\n * a stream's `retry`/`blocked`/`error`, windowed-truncate boundaries,\n * `forget_pii` erasure, and query-option edge cases. This harness drives a\n * **family of randomized, seeded workloads** — commits (some PII-bearing),\n * inline + windowed truncates, subscriptions, and the full lease lifecycle\n * (`claim` / `ack` / `defer` / `block` / `unblock` / `reset` /\n * `prioritize`) — against every store in `options.stores`, then asserts\n * their **normalized** outputs are byte-for-byte identical for every\n * workload.\n *\n * Each workload is its own seeded plan (`seed`, `seed + 1`, …): the\n * operation sequence — and even its length — varies by seed, so divergence\n * is hunted across a slice of the input space rather than one fixed script.\n * The seeds are deterministic, so a failing workload is always replayable.\n *\n * Normalization drops only the fields that legitimately differ between\n * stores (absolute event ids, `created` timestamps, correlation/causation\n * uuids, lease holder UUIDs, and wall-clock lease expiries) and keeps\n * everything that defines correctness (stream, version, name, data,\n * emission order, and the durable subscription state a lease op leaves\n * behind: watermark, retry, blocked, error, priority, lane). Stream names\n * carry mixed case so a case-insensitive pattern filter (#1197) surfaces as\n * a diff.\n *\n * Wire it with the in-memory store as the reference and one or more\n * durable adapters as comparands:\n *\n * @example\n * ```ts\n * import { runStoreDifferentialTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryStore } from \"@rotorsoft/act\";\n * import { PostgresStore } from \"../src/index.js\";\n *\n * runStoreDifferentialTck({\n * name: \"InMemory vs Postgres\",\n * runs: 6, // durable adapter: fewer workloads keep the suite fast\n * stores: [\n * { name: \"InMemoryStore\", factory: () => new InMemoryStore() },\n * { name: \"PostgresStore\", factory: () => new PostgresStore({ ... }) },\n * ],\n * });\n * ```\n */\nexport const runStoreDifferentialTck = (\n options: StoreDifferentialTckOptions\n): void => {\n describe(`TCK / Store differential / ${options.name}`, () => {\n const base_seed = options.seed ?? 0xac7;\n const stream_count = options.streams ?? 4;\n const pii_isolation = options.piiIsolation ?? true;\n // Spread-merge (not `?? {}`) so an absent `skip` carries no branch: the\n // spread of `undefined` yields `{}` with nothing for coverage to owe —\n // mirrors `store-tck.ts`'s `{ ...options.capabilities }`.\n const skip: DifferentialSkips = { ...options.skip };\n const plans = Array.from({ length: options.runs ?? 8 }, (_, r) =>\n build_plan(base_seed + r, stream_count, pii_isolation)\n );\n const live: Array<{ name: string; store: Store }> = [];\n\n beforeAll(async () => {\n for (const spec of options.stores) {\n const store = await spec.factory();\n await store.drop();\n await store.seed();\n // Each plan namespaces its streams with a unique tag, so every\n // workload coexists in one store — a single drop+seed per store\n // keeps the durable-adapter cost flat regardless of `runs`.\n for (const plan of plans) await apply_plan(store, plan, pii_isolation);\n live.push({ name: spec.name, store });\n }\n });\n\n afterAll(async () => {\n for (const { store } of live) await store.dispose();\n });\n\n /**\n * Run `produce` against every store and assert each comparand's\n * result deep-equals the reference (the first store). The store name\n * rides along in the assertion message so a divergence names the\n * culprit.\n */\n const assert_identical = async <T>(\n label: string,\n produce: (store: Store) => Promise<T>\n ): Promise<void> => {\n const reference = await produce(live[0].store);\n for (let i = 1; i < live.length; i++) {\n const actual = await produce(live[i].store);\n expect(\n actual,\n `${live[i].name} diverged from ${live[0].name} on \"${label}\"`\n ).toEqual(reference);\n }\n };\n\n plans.forEach((plan, run) => {\n const seed_hex = `0x${(base_seed + run).toString(16)}`;\n describe(`workload ${run} (seed ${seed_hex})`, () => {\n it(\"yields identical event order under a global forward query\", async () => {\n await assert_identical(\"forward query\", async (store) => {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream: `^${plan.event_prefix}` }\n );\n return out;\n });\n });\n\n it(\"yields identical snapshot floors under with_snaps\", async () => {\n await assert_identical(\"with_snaps floor\", async (store) => {\n const by_stream: Record<string, NormalizedEvent[]> = {};\n for (const stream of plan.event_streams) {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream, stream_exact: true, with_snaps: true }\n );\n by_stream[stream] = out;\n }\n return by_stream;\n });\n });\n\n it(\"yields identical order under backward traversal\", async () => {\n await assert_identical(\"backward query\", async (store) => {\n const by_stream: Record<string, NormalizedEvent[]> = {};\n for (const stream of plan.event_streams) {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream, stream_exact: true, backward: true }\n );\n by_stream[stream] = out;\n }\n return by_stream;\n });\n });\n\n // Query-option matrix (#1200): each filter dimension must select\n // the same normalized events on every adapter. Gated edge-input\n // cases (#1199) are skipped while the matching flag is on.\n plan.query_cases.forEach((qc) => {\n const gated = qc.gated && skip[qc.gated];\n it.skipIf(gated)(\n `yields identical events under ${qc.label}`,\n async () => {\n await assert_identical(`query / ${qc.label}`, async (store) => {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>((e) => {\n out.push(normalize_event(e));\n }, qc.query);\n return out;\n });\n }\n );\n });\n\n it(\"yields identical query_stats output (head/tail/count/names)\", async () => {\n await assert_identical(\"query_stats\", async (store) => {\n const stats = await store.query_stats<Schemas>(\n { stream: `^${plan.event_prefix}` },\n { tail: true, count: true, names: true }\n );\n // Capture key order (query_stats filter form orders by stream\n // name — a contract) alongside normalized per-stream content.\n const keys = [...stats.keys()];\n const content: Record<\n string,\n {\n head: Omit<NormalizedEvent, \"pii\">;\n tail: Omit<NormalizedEvent, \"pii\">;\n count: number | undefined;\n names: Readonly<Record<string, number>> | undefined;\n }\n > = {};\n for (const [stream, s] of stats) {\n // `tail: true` is requested, so every returned stream carries\n // a tail. A store that omits it is itself a divergence — let\n // the non-null access surface it loudly rather than masking it\n // with a fallback the workload can never otherwise reach.\n content[stream] = {\n head: normalize_identity(s.head),\n tail: normalize_identity(\n s.tail as Committed<Schemas, keyof Schemas>\n ),\n count: s.count,\n names: s.names as Record<string, number> | undefined,\n };\n }\n return { keys, content };\n });\n });\n\n it(\"yields identical query_streams output (incl. lease-lifecycle state)\", async () => {\n await assert_identical(\"query_streams\", async (store) => {\n const rows: Array<{\n stream: string;\n source: string | undefined;\n at: number;\n blocked: boolean;\n priority: number;\n lane: string | undefined;\n retry: number;\n error: string;\n // Lease holder UUID + expiry are non-portable; normalize to\n // a presence flag so \"is this stream currently leased\" is\n // compared without depending on the exact holder/clock.\n leased: boolean;\n }> = [];\n const { count } = await store.query_streams(\n (p) => {\n rows.push({\n stream: p.stream,\n source: p.source,\n at: p.at,\n blocked: p.blocked,\n priority: p.priority,\n lane: p.lane,\n retry: p.retry,\n error: p.error,\n leased: p.leased_by != null,\n });\n },\n { stream: `^${plan.sub_prefix}`, limit: 1000 }\n );\n // Branchless, locale-stable ordering so the comparison is\n // independent of whatever order each adapter streams rows in.\n rows.sort((a, b) => a.stream.localeCompare(b.stream));\n return { count, rows };\n });\n });\n\n // Case-sensitivity of the pattern filter (#1197): the subscription\n // streams are mixed-case (`Diff-…-Sub-S{i}`); filtering with the\n // **lower-cased** form of the same pattern must select the *same*\n // set on every adapter. On case-sensitive engines (PG `~`, InMemory\n // `RegExp`) that set is empty — the case doesn't match. SQLite's\n // ASCII-case-insensitive `LIKE` overmatches and returns the whole\n // family, so the differential goes red until #1197 flips it to a\n // case-sensitive matcher. Gated behind `caseInsensitivePatterns`.\n it.skipIf(skip.caseInsensitivePatterns)(\n \"matches case-sensitively under a lower-cased pattern filter\",\n async () => {\n await assert_identical(\n \"query_streams lower-cased pattern\",\n async (store) => {\n const collect_streams = async (\n pattern: string\n ): Promise<string[]> => {\n const streams: string[] = [];\n await store.query_streams(\n (p) => {\n streams.push(p.stream);\n },\n { stream: pattern, limit: 1000 }\n );\n streams.sort((a, b) => a.localeCompare(b));\n return streams;\n };\n // Correctly-cased control: returns the whole sub family on\n // every adapter (exercises the match path). Lower-cased\n // discriminator: empty on a case-sensitive matcher,\n // overmatched to the full family on SQLite's LIKE. Both\n // ride in the compared payload so the control proves the\n // corpus is matchable while the discriminator surfaces\n // #1197.\n const matched = await collect_streams(`^${plan.sub_prefix}S`);\n const lowered = await collect_streams(\n `^${plan.sub_prefix.toLowerCase()}s`\n );\n return { matched, lowered };\n }\n );\n }\n );\n\n // Exact-match mixed-case: case-exact on every adapter, so it runs\n // unconditionally — the control that proves the mixed-case corpus\n // itself round-trips even where the pattern path is gated.\n it(\"yields identical events under an exact mixed-case stream lookup\", async () => {\n await assert_identical(\"query exact mixed-case\", async (store) => {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream: plan.event_streams[0], stream_exact: true }\n );\n return out;\n });\n });\n\n // forget_pii erasure (#1200): wipe PII on the seeded stream and\n // assert every adapter reports the same erased-count and that the\n // reload shows PII gone identically. Only runs when the adapters\n // implement the optional surface.\n it.skipIf(!pii_isolation)(\n \"erases pii identically via forget_pii\",\n async () => {\n await assert_identical(\"forget_pii erase\", async (store) => {\n // forget_pii is capability-gated on the port; the caller\n // declared support via `piiIsolation`, so it is present.\n // Call it as a method (not a detached reference) so adapters\n // that read `this` keep their binding.\n const erased = await store.forget_pii!(plan.pii_stream);\n const after: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n after.push(normalize_event(e));\n },\n { stream: plan.pii_stream, stream_exact: true }\n );\n return { erased, after };\n });\n }\n );\n });\n });\n });\n};\n","import { fc, test } from \"@fast-check/vitest\";\nimport type { Store } from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect } from \"vitest\";\nimport type { CounterEvents } from \"./fixtures/events.js\";\nimport { collect, inc, make_meta } from \"./fixtures/helpers.js\";\n\n/**\n * Property-based contract for the store-level invariants the drain pipeline\n * depends on — commit version monotonicity, claim/lease no-leak, watermark\n * monotonicity, and block exclusion. These ran only against `InMemoryStore`\n * before ACT-982; running them against the durable adapters too is the only\n * way to catch a divergence the example-based TCK cases miss.\n *\n * Each predicate resets the store (`drop` + `seed`) so randomized runs are\n * isolated. Durable adapters should pass a reduced `numRuns` and their own\n * dedicated schema/file so a parallel test worker can't clobber the table.\n */\nexport type StorePropertyTckOptions = {\n /** Adapter name for the describe block. */\n name: string;\n /** Produces the store under test (created once, reset between runs). */\n factory: () => Store | Promise<Store>;\n /** fast-check runs per property. Default 100; lower for durable adapters. */\n numRuns?: number;\n};\n\nconst streamArb = fc.constantFrom(\"s1\", \"s2\", \"s3\");\nconst commitArb = fc.record({\n stream: streamArb,\n count: fc.integer({ min: 1, max: 3 }),\n});\n\nconst claimStreamArb = fc.constantFrom(\"a\", \"b\", \"c\");\nconst opArb = fc.oneof(\n fc.record({ kind: fc.constant(\"commit\" as const), stream: claimStreamArb }),\n fc.record({ kind: fc.constant(\"claim\" as const) }),\n fc.record({ kind: fc.constant(\"ack-all\" as const) }),\n fc.record({ kind: fc.constant(\"block-all\" as const) })\n);\n\nconst events = (count: number) => Array.from({ length: count }, () => inc(1));\n\nexport const runStorePropertyTck = (options: StorePropertyTckOptions): void => {\n const numRuns = options.numRuns ?? 100;\n\n describe(`TCK / Store properties / ${options.name}`, () => {\n let store: Store;\n\n beforeAll(async () => {\n store = await options.factory();\n await store.seed();\n });\n afterAll(async () => {\n await store.dispose();\n });\n\n // Clean slate per randomized run. claim() spans every claimable stream\n // in the table, so namespacing alone can't isolate the claim properties;\n // a full reset is the only safe option.\n const reset = async () => {\n await store.drop();\n await store.seed();\n };\n\n describe(\"commit version invariants\", () => {\n test.prop([fc.array(commitArb, { minLength: 0, maxLength: 30 })], {\n numRuns,\n })(\n \"per-stream versions are 0..N-1 in commit order, regardless of interleaving\",\n async (commits) => {\n await reset();\n const expected = new Map<string, number>();\n for (const { stream, count } of commits) {\n const before = expected.get(stream) ?? -1;\n const committed = await store.commit<CounterEvents>(\n stream,\n events(count),\n make_meta({ stream })\n );\n committed.forEach((e, i) => {\n expect(e.version).toBe(before + 1 + i);\n });\n expected.set(stream, before + count);\n }\n for (const stream of new Set(commits.map((c) => c.stream))) {\n const seen = await collect(store, { stream, stream_exact: true });\n seen.forEach((e, i) => {\n expect(e.version).toBe(i);\n });\n }\n }\n );\n\n test.prop([fc.array(commitArb, { minLength: 1, maxLength: 20 })], {\n numRuns,\n })(\n \"bad expectedVersion throws and commits no events\",\n async (commits) => {\n await reset();\n for (const { stream, count } of commits) {\n await store.commit<CounterEvents>(\n stream,\n events(count),\n make_meta({ stream })\n );\n }\n const stream = commits[0].stream;\n const before = await collect(store, { stream, stream_exact: true });\n // Actual head is before.length - 1, so before.length is wrong.\n await expect(\n store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream }),\n before.length\n )\n ).rejects.toThrow();\n const after = await collect(store, { stream, stream_exact: true });\n expect(after.length).toBe(before.length);\n }\n );\n });\n\n describe(\"claim/lease lifecycle invariants\", () => {\n test.prop([fc.array(opArb, { minLength: 1, maxLength: 30 })], {\n numRuns,\n })(\n \"no leaks: claims are always acked or blocked, never lost\",\n async (ops) => {\n await reset();\n await store.subscribe([\n { stream: \"a\" },\n { stream: \"b\" },\n { stream: \"c\" },\n ]);\n let totalClaims = 0;\n let totalResolved = 0;\n let pending: Awaited<ReturnType<Store[\"claim\"]>> = [];\n for (const op of ops) {\n if (op.kind === \"commit\") {\n await store.commit<CounterEvents>(\n op.stream,\n [inc(1)],\n make_meta({ stream: op.stream })\n );\n } else if (op.kind === \"claim\") {\n const claimed = await store.claim(5, 5, \"worker\", 60_000);\n totalClaims += claimed.length;\n pending = [...pending, ...claimed];\n } else if (op.kind === \"ack-all\") {\n const acked = await store.ack(pending);\n totalResolved += acked.length;\n pending = pending.filter(\n (p) => !acked.find((a) => a.stream === p.stream)\n );\n } else {\n const blocked = await store.block(\n pending.map((p) => ({ ...p, error: \"test\" }))\n );\n totalResolved += blocked.length;\n pending = pending.filter(\n (p) => !blocked.find((b) => b.stream === p.stream)\n );\n }\n }\n expect(totalResolved + pending.length).toBe(totalClaims);\n }\n );\n\n test.prop(\n [\n fc.array(claimStreamArb, { minLength: 1, maxLength: 5 }),\n fc.array(claimStreamArb, { minLength: 0, maxLength: 5 }),\n ],\n { numRuns }\n )(\n \"ack advances the watermark monotonically per stream\",\n async (commitsA, commitsB) => {\n await reset();\n const all = [...new Set([...commitsA, ...commitsB, \"a\", \"b\", \"c\"])];\n await store.subscribe(all.map((stream) => ({ stream })));\n for (const stream of commitsA) {\n await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const acked1 = await store.ack(\n await store.claim(10, 10, \"worker\", 60_000)\n );\n // Seed every subscribed stream at -1 so the comparison below is\n // unconditional — streams not acked in batch 1 just compare\n // against -1, keeping the property branch-free for coverage.\n const watermark1 = new Map(all.map((stream) => [stream, -1]));\n for (const l of acked1) watermark1.set(l.stream, l.at);\n for (const stream of commitsB) {\n await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const acked2 = await store.ack(\n await store.claim(10, 10, \"worker\", 60_000)\n );\n for (const lease of acked2) {\n expect(lease.at).toBeGreaterThanOrEqual(\n watermark1.get(lease.stream) as number\n );\n }\n }\n );\n\n test.prop([fc.array(claimStreamArb, { minLength: 1, maxLength: 5 })], {\n numRuns,\n })(\"blocked streams cannot be claimed again\", async (commits) => {\n await reset();\n const streams = [...new Set(commits)];\n await store.subscribe(streams.map((stream) => ({ stream })));\n for (const stream of commits) {\n await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const claimed = await store.claim(10, 10, \"worker\", 60_000);\n await store.block(claimed.map((l) => ({ ...l, error: \"test\" })));\n const blockedSet = new Set(claimed.map((l) => l.stream));\n // A control stream committed *after* the first claim is guaranteed\n // claimable, so the re-claim is non-empty and the exclusion check\n // below actually runs — while still proving no blocked stream\n // reappears.\n await store.subscribe([{ stream: \"ctrl\" }]);\n await store.commit<CounterEvents>(\n \"ctrl\",\n [inc(1)],\n make_meta({ stream: \"ctrl\" })\n );\n const reclaim = await store.claim(10, 10, \"worker2\", 60_000);\n for (const l of reclaim) expect(blockedSet.has(l.stream)).toBe(false);\n });\n });\n });\n};\n","import {\n act,\n ConcurrencyError,\n InMemoryCache,\n SNAP_EVENT,\n TOMBSTONE_EVENT,\n ValidationError,\n} from \"@rotorsoft/act\";\nimport type {\n BlockedLease,\n Committed,\n EventSource,\n Lease,\n ScanOptions,\n ScanResult,\n Schemas,\n Store,\n StoreNotification,\n} from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport type { CounterEvents } from \"./fixtures/events.js\";\nimport {\n type CommittedCounterEvent,\n collect,\n dec,\n inc,\n make_meta,\n reset as reset_event,\n seed_stream,\n uid,\n} from \"./fixtures/helpers.js\";\n\n/**\n * Optional features a {@link Store} implementation may or may not\n * support. Default to `false` — only enable a flag when the adapter\n * exposes the corresponding surface and you want the TCK to cover it.\n */\nexport type StoreCapabilities = {\n /**\n * Adapter implements {@link Store.notify}. When `true`, the TCK runs\n * the cross-instance conformance cases: a listener receives commits\n * from a *sibling* instance produced by the same `factory`, never its\n * own commits (the port's self-filtering MUST), and exactly one\n * notification per commit transaction carrying the full event batch.\n * Requires the `factory` to produce instances sharing one backing\n * store — e.g. two PostgresStores on the same schema/table, or two\n * `withBroker` decorators on one broker. True cross-*process*\n * LISTEN/NOTIFY plumbing needs two processes and stays in the\n * adapter's own suite.\n */\n readonly notify?: boolean;\n /**\n * Adapter implements {@link Store.restore}. When `true`, the TCK\n * runs the full restore suite — empty-source / single-stream /\n * multi-stream happy paths, ISO-string `created`, pre-existing\n * wipe, subscription clearing, causation remap, and atomic\n * rollback on mid-iteration throw.\n */\n readonly restore?: boolean;\n /**\n * Adapter supports sensitive-data isolation (#566): accepts the\n * optional `pii` field on commit messages, returns it on load\n * outputs, and implements {@link Store.forget_pii}. When `true`,\n * the TCK runs the PII isolation suite — commit-with-pii\n * round-trip, commit-without-pii passthrough, `forget_pii` happy\n * path, idempotency, and isolation across streams.\n */\n readonly pii_isolation?: boolean;\n /**\n * Adapter supports competing consumers — two workers may call\n * `claim()` concurrently and the store hands each stream to at most\n * one of them (PostgreSQL via `FOR UPDATE SKIP LOCKED`; the in-memory\n * store via single-threaded atomic claim). When `true`, the TCK runs\n * the concurrency suite. Single-writer embedded stores (e.g. SQLite,\n * where concurrent write transactions raise `SQLITE_BUSY` rather than\n * serializing) leave this `false`: their deployment model is a single\n * drain worker per database file.\n */\n readonly concurrent_claim?: boolean;\n /**\n * Adapter implements the {@link QueryStreams.source_matches} reverse-\n * match filter — \"subscriptions whose stored `source` pattern matches\n * at least one of these names\" (`name ~ source`). When `true`, the TCK\n * runs the `source_matches` suite. Stores that can't express reverse-\n * regex (e.g. an anchor-aware `LIKE` approximation) leave it `false`;\n * the close-cycle safety probe then falls back to an unfiltered scan,\n * so correctness never depends on this flag — only probe cost.\n */\n readonly source_matches?: boolean;\n /**\n * Adapter matches a **pattern** reaction `source` (one carrying regex\n * metacharacters, e.g. the calculator's `^(A|B)$`) as a full RegExp in\n * claim()'s has-work probe, so a stream whose max event id exceeds the\n * subscription watermark is claimed when its name matches the pattern.\n * When `true`, the TCK runs the pattern-source claim suite. Literal\n * sources stay exact everywhere regardless of this flag — the fast,\n * index-friendly path.\n *\n * Stores that cannot run an arbitrary regex against candidate streams\n * (e.g. SQLite, whose libsql build has no `REGEXP` and whose portable\n * `LIKE` grammar cannot express alternation/grouping) leave this\n * `false` and instead reject a non-portable claim source at\n * {@link subscribe} time — see {@link rejects_nonportable_claim_source}.\n */\n readonly pattern_claim_source?: boolean;\n /**\n * Adapter cannot faithfully match every regex claim `source`, so it\n * fails loud at registration: {@link subscribe} throws\n * {@link ValidationError} for a source outside its portable subset\n * (alternation/grouping like `^(A|B)$`), rather than silently never\n * claiming the stream. When `true`, the TCK runs the reject-at-subscribe\n * case. Currently only SQLite sets this — its message points operators\n * to InMemory/PG for full regex claim sources.\n */\n readonly rejects_nonportable_claim_source?: boolean;\n};\n\n/**\n * Options for {@link runStoreTck}.\n */\nexport type StoreTckOptions = {\n /**\n * Display name for the implementation under test.\n */\n readonly name: string;\n /**\n * Returns the {@link Store} instance under test. Called once during\n * `beforeAll`. The TCK does not assume a fresh store per test — each\n * test namespaces its streams via {@link uid} so they don't collide.\n * The TCK calls `store.seed()` once before any test runs and\n * `store.dispose()` after all tests, with `store.drop()` in between\n * if any test needs it.\n */\n readonly factory: () => Store | Promise<Store>;\n /**\n * Optional capabilities flags — see {@link StoreCapabilities}.\n */\n readonly capabilities?: StoreCapabilities;\n};\n\n/**\n * Runs the Store contract test compatibility kit against the\n * implementation produced by `options.factory`.\n *\n * The TCK is the executable definition of the {@link Store} contract.\n * Every method on the interface in `libs/act/src/types/ports.ts` has\n * matching cases here:\n *\n * - `commit` — single + multi-event commits, optimistic concurrency\n * - `query` — stream, names, correlation, before, after, created_after,\n * created_before, limit, with_snaps, stream_exact, backward traversal\n * - stream filter grammar — the portable regex subset (`^`, `$`, `.`,\n * `.*`, literal characters) matches identically everywhere; richer\n * patterns either match with full regex semantics or throw\n * `ValidationError` — never a silent approximation\n * - `subscribe` — idempotent re-subscribe, watermark return value\n * - `claim` / `ack` — lease lifecycle, dual frontiers, leased streams\n * not double-claimed, exact-source has-work matching, timed-out-lease\n * retry accounting\n * - `block` — blocked streams hidden from claim, only same-drainer can block\n * - `reset` — restart watermarks (including blocked), no-op for missing\n * - `prioritize` — bulk priority updates by filter\n * - `truncate` — snapshot vs tombstone seeding, empty inputs, missing\n * streams; windowed boundaries (`before`/`max_id`) — prefix deleted\n * behind the closest safe snapshot, tail + subscriptions kept,\n * no-snapshot no-op, mixed full + windowed targets\n * - `query_streams` — filters, exact-match, pagination, blocked\n * - `notify` (capability-gated) — cross-instance delivery, self-filtering\n * (an instance never receives its own commits), one notification per\n * commit transaction with the full event batch\n *\n * Tests namespace their streams with a per-test {@link uid} so the\n * suite is parallel-safe against a shared backing store (e.g., a real\n * Postgres instance running tests for the whole monorepo concurrently).\n *\n * @example\n * ```ts\n * import { runStoreTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryStore } from \"@rotorsoft/act\";\n *\n * runStoreTck({\n * name: \"InMemoryStore\",\n * factory: () => new InMemoryStore(),\n * });\n * ```\n */\nexport const runStoreTck = (options: StoreTckOptions): void => {\n describe(`TCK / Store / ${options.name}`, () => {\n let store: Store;\n // Spread (rather than `?? {}`) so the default-empty path doesn't\n // create a branch every adapter has to disprove. `{ ...undefined }`\n // is a runtime no-op that yields `{}`.\n const caps: StoreCapabilities = { ...options.capabilities };\n\n beforeAll(async () => {\n store = await options.factory();\n await store.drop();\n await store.seed();\n });\n\n afterAll(async () => {\n await store.dispose();\n });\n\n describe(\"commit\", () => {\n it(\"returns committed events with sequenced ids and versions\", async () => {\n const s = `commit-seq-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), dec(3)],\n make_meta({ stream: s })\n );\n expect(committed).toHaveLength(3);\n expect(committed[0].version).toBe(0);\n expect(committed[1].version).toBe(1);\n expect(committed[2].version).toBe(2);\n expect(committed[0].name).toBe(\"Incremented\");\n expect(committed[2].data).toEqual({ amount: 3 });\n for (let i = 1; i < committed.length; i++) {\n expect(committed[i].id).toBeGreaterThan(committed[i - 1].id);\n }\n });\n\n it(\"attaches correlation and stream metadata\", async () => {\n const s = `commit-meta-${uid()}`;\n const correlation = `cor-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s, correlation })\n );\n expect(committed[0].stream).toBe(s);\n expect(committed[0].meta.correlation).toBe(correlation);\n });\n\n it(\"throws ConcurrencyError when expectedVersion is wrong\", async () => {\n const s = `commit-cc-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s }),\n 0\n );\n await expect(\n store.commit<CounterEvents>(s, [inc(1)], make_meta({ stream: s }), 0)\n ).rejects.toBeInstanceOf(ConcurrencyError);\n });\n\n it(\"preserves prior events when a concurrent commit is rejected\", async () => {\n const s = `commit-cc-preserve-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2)],\n make_meta({ stream: s })\n );\n await expect(\n store.commit<CounterEvents>(s, [inc(3)], make_meta({ stream: s }), 0)\n ).rejects.toBeInstanceOf(ConcurrencyError);\n const found = await collect(store, { stream: s, stream_exact: true });\n expect(found).toHaveLength(2);\n });\n });\n\n describe(\"query\", () => {\n it(\"filters by stream, names, correlation, limit, with_snaps\", async () => {\n const s1 = `q-s1-${uid()}`;\n const s2 = `q-s2-${uid()}`;\n const cor = `q-cor-${uid()}`;\n await store.commit<CounterEvents>(\n s1,\n [inc(1), dec(1)],\n make_meta({ stream: s1, correlation: cor })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(2), dec(2), reset_event()],\n make_meta({ stream: s2, correlation: cor })\n );\n\n const by_stream = await collect(store, {\n stream: s1,\n stream_exact: true,\n });\n expect(by_stream).toHaveLength(2);\n\n const by_name = await collect(store, {\n stream: s2,\n stream_exact: true,\n names: [\"Reset\"],\n });\n expect(by_name).toHaveLength(1);\n expect(by_name[0].name).toBe(\"Reset\");\n\n const by_correlation = await collect(store, { correlation: cor });\n expect(by_correlation).toHaveLength(5);\n\n const limited = await collect(store, {\n correlation: cor,\n limit: 2,\n });\n expect(limited).toHaveLength(2);\n });\n\n it(\"with_snaps resumes from the latest snapshot per stream\", async () => {\n const s = `q-snap-${uid()}`;\n // 2 pre-snapshot domain events ...\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n // ... a snapshot ...\n const [snap] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n // ... and 3 events after it.\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1), inc(1)],\n make_meta({ stream: s })\n );\n\n // with_snaps resumes AT the latest snapshot: snapshot + the 3 after\n // it, never the 2 pre-snapshot events.\n const from_snap = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(from_snap).toHaveLength(4);\n expect(from_snap[0].name).toBe(SNAP_EVENT);\n\n // Without with_snaps: the 5 domain events, snapshot excluded.\n const domain = await collect(store, { stream: s, stream_exact: true });\n expect(domain).toHaveLength(5);\n\n // An explicit `after` overrides the snapshot floor.\n const after_snap = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: snap.id,\n });\n expect(after_snap).toHaveLength(3);\n\n // A stream with no snapshot returns its full history under with_snaps.\n const s2 = `q-nosnap-${uid()}`;\n await store.commit<CounterEvents>(\n s2,\n [inc(1), inc(1)],\n make_meta({ stream: s2 })\n );\n const full = await collect(store, {\n stream: s2,\n stream_exact: true,\n with_snaps: true,\n });\n expect(full).toHaveLength(2);\n });\n\n it(\"with_snaps applies the resume floor on a backward scan too\", async () => {\n const s = `q-snap-back-${uid()}`;\n // 2 pre-snapshot events, a snapshot, then 3 after it.\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n const [snap] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1), inc(1)],\n make_meta({ stream: s })\n );\n\n // The floor is direction-agnostic: forward resumes AT the snapshot,\n // backward stops AT it. Either way, only the snapshot + the 3 events\n // after it — never the 2 pre-snapshot events.\n const backward = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n backward: true,\n });\n expect(backward).toHaveLength(4);\n // DESC → the snapshot (lowest id in the floored set) comes last.\n expect(backward[backward.length - 1].name).toBe(SNAP_EVENT);\n expect(backward.every((e) => e.id >= snap.id)).toBe(true);\n\n // No snapshot → full history under with_snaps + backward.\n const s2 = `q-nosnap-back-${uid()}`;\n await store.commit<CounterEvents>(\n s2,\n [inc(1), inc(1)],\n make_meta({ stream: s2 })\n );\n const full = await collect(store, {\n stream: s2,\n stream_exact: true,\n with_snaps: true,\n backward: true,\n });\n expect(full).toHaveLength(2);\n });\n\n it(\"supports backward traversal\", async () => {\n const s = `q-back-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: s })\n );\n const forward = await collect(store, { stream: s, stream_exact: true });\n const backward = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n });\n expect(forward.map((e) => e.id)).toEqual(committed.map((c) => c.id));\n expect(backward.map((e) => e.id)).toEqual(\n [...committed].reverse().map((c) => c.id)\n );\n\n // Backward + limit — exercises the limit-break branch in the\n // backward-traversal path. Latest event only.\n const latest = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n limit: 1,\n });\n expect(latest).toHaveLength(1);\n expect(latest[0].id).toBe(committed.at(-1)!.id);\n });\n\n it(\"after/before bound the id range\", async () => {\n const s = `q-bounds-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3), inc(4)],\n make_meta({ stream: s })\n );\n const after_first = await collect(store, {\n stream: s,\n stream_exact: true,\n after: committed[0].id,\n });\n expect(after_first.map((e) => e.id)).toEqual(\n committed.slice(1).map((c) => c.id)\n );\n const before_last = await collect(store, {\n stream: s,\n stream_exact: true,\n before: committed[committed.length - 1].id,\n });\n expect(before_last.map((e) => e.id)).toEqual(\n committed.slice(0, -1).map((c) => c.id)\n );\n });\n\n // #1199: `names: []` means \"match no event names\" on every adapter.\n // An empty allow-list is an explicit \"nothing passes\" — the opposite\n // of an omitted `names` (which matches all). PG historically dropped\n // the empty filter (returned ALL); this pins the sane semantics.\n it(\"names:[] matches no events\", async () => {\n const s = `q-names-empty-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), dec(1)],\n make_meta({ stream: s })\n );\n const none = await collect(store, {\n stream: s,\n stream_exact: true,\n names: [],\n });\n expect(none).toHaveLength(0);\n // Omitting `names` still returns everything — the contrast case.\n const all = await collect(store, { stream: s, stream_exact: true });\n expect(all).toHaveLength(2);\n });\n\n // #1199: falsy-zero `after`/`before` are honored, not dropped by a\n // truthy guard. `after: 0` means strictly \"id > 0\"; `before: 0`\n // means strictly \"id < 0\" (matches nothing). InMemory ids start at\n // 0, so a truthy `if (after)` guard would leak id 0 on the backward\n // path — this pins `!== undefined` semantics across adapters.\n it(\"after:0 and before:0 are honored as id bounds\", async () => {\n const s = `q-zero-bound-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: s })\n );\n // before:0 → nothing has an id below 0.\n expect(\n await collect(store, { stream: s, stream_exact: true, before: 0 })\n ).toHaveLength(0);\n // before:0 on the backward path is equally empty.\n expect(\n await collect(store, {\n stream: s,\n stream_exact: true,\n before: 0,\n backward: true,\n })\n ).toHaveLength(0);\n // after:0 → strictly id > 0. On adapters whose ids start at 0 the\n // first event (id 0) is excluded; on 1-based adapters every event\n // survives. Either way no event with id <= 0 is returned.\n const forward = await collect(store, {\n stream: s,\n stream_exact: true,\n after: 0,\n });\n expect(forward.every((e) => e.id > 0)).toBe(true);\n // Backward path with after:0 must apply the same exclusive bound —\n // never leak an id-0 event.\n const backward = await collect(store, {\n stream: s,\n stream_exact: true,\n after: 0,\n backward: true,\n });\n expect(backward.every((e) => e.id > 0)).toBe(true);\n });\n\n it(\"created_after/created_before filter by timestamp\", async () => {\n const s = `q-ts-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Build the window from the event's OWN `created` (whatever clock\n // the store stamped it with) so the assertion can't flake on a\n // skew between the store's clock and the test runner's clock.\n const ts = committed[0].created.getTime();\n const before = new Date(ts - 60_000);\n const future = new Date(ts + 60_000);\n const in_window = await collect(store, {\n stream: s,\n stream_exact: true,\n created_after: before,\n created_before: future,\n });\n expect(in_window.length).toBe(1);\n const out_of_window = await collect(store, {\n stream: s,\n stream_exact: true,\n created_after: future,\n });\n expect(out_of_window.length).toBe(0);\n });\n\n it(\"backward traversal short-circuits at `after` id boundary\", async () => {\n const s = `q-back-after-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: s })\n );\n // Backward from the end, but only events newer than committed[0].id.\n const got = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n after: committed[0].id,\n });\n expect(got.map((e) => e.id)).toEqual([\n committed[2].id,\n committed[1].id,\n ]);\n });\n\n it(\"backward traversal short-circuits at `created_after` boundary\", async () => {\n const s = `q-back-cafter-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Asking backward with created_after = now+1m should short-circuit\n // immediately because the only event was created before that bound.\n const future = new Date(Date.now() + 60_000);\n const got = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n created_after: future,\n });\n expect(got).toHaveLength(0);\n });\n\n it(\"backward traversal honors created_before by skipping newer events\", async () => {\n const s = `q-back-ts-${uid()}`;\n // `make_meta()` with no stream — exercises the meta builder's\n // no-causation branch alongside the backward + created_before\n // path inside the adapter.\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta()\n );\n // `created_before` strictly before the event's own timestamp, so\n // it must be skipped — relative to the store's clock, not the\n // host's, to avoid clock-skew flakiness.\n const past = new Date(committed[0].created.getTime() - 60_000);\n const got = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n created_before: past,\n });\n expect(got).toHaveLength(0);\n });\n\n it(\"stream_exact disables regex matching\", async () => {\n const tag = uid();\n const a = `q-exact-${tag}`;\n const b = `q-exact-${tag}-extra`;\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [inc(2)],\n make_meta({ stream: b })\n );\n const exact = await collect(store, { stream: a, stream_exact: true });\n expect(exact).toHaveLength(1);\n expect(exact[0].data).toEqual({ amount: 1 });\n });\n\n // Regex anchor contract — same across every Store. Caller controls\n // anchors. `^foo` for prefix, `foo$` for suffix, `^foo$` for whole-\n // string. A plain `foo` is a substring match. Auto-anchoring by the\n // adapter is a contract violation.\n it(\"plain regex without anchors is a substring match\", async () => {\n const tag = uid();\n const inner = `qr-${tag}-inner`;\n const longer = `qr-${tag}-inner-extra`;\n await store.commit<CounterEvents>(\n inner,\n [inc(1)],\n make_meta({ stream: inner })\n );\n await store.commit<CounterEvents>(\n longer,\n [inc(2)],\n make_meta({ stream: longer })\n );\n const got = await collect(store, { stream: `qr-${tag}-inner` });\n expect(got.map((e) => e.stream).sort()).toEqual([inner, longer].sort());\n });\n\n it(\"caller-anchored `^name$` matches only the whole string\", async () => {\n const tag = uid();\n const inner = `qr-${tag}-anchor`;\n const longer = `qr-${tag}-anchor-extra`;\n await store.commit<CounterEvents>(\n inner,\n [inc(1)],\n make_meta({ stream: inner })\n );\n await store.commit<CounterEvents>(\n longer,\n [inc(2)],\n make_meta({ stream: longer })\n );\n const got = await collect(store, { stream: `^qr-${tag}-anchor$` });\n expect(got).toHaveLength(1);\n expect(got[0].stream).toBe(inner);\n });\n\n it(\"caller-anchored `^prefix` matches by prefix\", async () => {\n const tag = uid();\n const a = `qr-${tag}-pfx-a`;\n const b = `qr-${tag}-pfx-b`;\n const other = `zz-${tag}-other`;\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [inc(2)],\n make_meta({ stream: b })\n );\n await store.commit<CounterEvents>(\n other,\n [inc(3)],\n make_meta({ stream: other })\n );\n const got = await collect(store, { stream: `^qr-${tag}-pfx-` });\n expect(got.map((e) => e.stream).sort()).toEqual([a, b].sort());\n });\n });\n\n // Stream-filter grammar conformance. The portable subset — `^` / `$`\n // anchors, `.` (any single character), `.*` (any run), and literal\n // characters — must produce identical matches on every adapter\n // (PG POSIX `~`, InMemory `RegExp`, SQLite anchor-aware `LIKE`).\n // Richer regex is adapter-optional: an adapter either matches it\n // with full regex semantics or throws `ValidationError`. Silently\n // returning wrong rows (e.g. from a lossy LIKE approximation) is a\n // contract violation — and the worst one available when the filter\n // drives `reset` / `unblock`.\n describe(\"stream filter grammar\", () => {\n const seed_streams = async (streams: string[]) => {\n for (const s of streams)\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n };\n\n const streams_matching = async (pattern: string) =>\n (await collect(store, { stream: pattern })).map((e) => e.stream).sort();\n\n // A non-portable pattern must never silently mis-match: the store\n // either returns exactly the full-regex-semantics result set or\n // throws ValidationError at the call site.\n const match_exactly_or_throw = async (\n pattern: string,\n expected: string[]\n ) => {\n let matched: string[] | undefined;\n let error: unknown;\n try {\n matched = await streams_matching(pattern);\n } catch (e) {\n error = e;\n }\n if (error !== undefined) expect(error).toBeInstanceOf(ValidationError);\n else expect(matched).toEqual(expected.sort());\n };\n\n it(\"portable subset: anchors, `.`, and `.*` match identically\", async () => {\n const tag = uid();\n const plain = `g-${tag}-plain`;\n const dotted = `g-${tag}.dot`;\n const scored = `g-${tag}_us`;\n const pct = `g-${tag}%pc`;\n await seed_streams([plain, dotted, scored, pct]);\n\n // ^prefix — all four, regex-significant literals included\n expect(await streams_matching(`^g-${tag}`)).toEqual(\n [plain, dotted, scored, pct].sort()\n );\n // suffix$ — one\n expect(await streams_matching(`${tag}-plain$`)).toEqual([plain]);\n // ^exact$ — one\n expect(await streams_matching(`^g-${tag}-plain$`)).toEqual([plain]);\n // single `.` is a one-character wildcard: matches the literal\n // dot in `dotted` and the `-` in `plain`\n expect(await streams_matching(`^g-${tag}.dot$`)).toEqual([dotted]);\n expect(await streams_matching(`^g-${tag}.plain$`)).toEqual([plain]);\n // `.*` — any run\n expect(await streams_matching(`^g-${tag}.*dot$`)).toEqual([dotted]);\n });\n\n it(\"literal `_` and `%` in patterns are not wildcards\", async () => {\n const tag = uid();\n const scored = `u-${tag}_x`;\n const scored_decoy = `u-${tag}Zx`;\n const pct = `p-${tag}%y`;\n const pct_decoy = `p-${tag}ZZy`;\n await seed_streams([scored, scored_decoy, pct, pct_decoy]);\n\n // `_` is a literal in the regex grammar — a store translating to\n // LIKE must escape it or it single-char-wildcards into the decoy\n expect(await streams_matching(`^u-${tag}_x$`)).toEqual([scored]);\n // `%` is a literal in the regex grammar — unescaped LIKE would\n // any-run-wildcard into the decoy\n expect(await streams_matching(`^p-${tag}%y$`)).toEqual([pct]);\n });\n\n it(\"portable subset applies to stream-position filters\", async () => {\n const tag = uid();\n const scored = `sf-${tag}_a`;\n const decoy = `sf-${tag}Za`;\n await store.subscribe([{ stream: scored }, { stream: decoy }]);\n\n const got: string[] = [];\n await store.query_streams((p) => got.push(p.stream), {\n stream: `^sf-${tag}_a$`,\n });\n expect(got).toEqual([scored]);\n });\n\n it(\"non-portable patterns match with full regex semantics or throw\", async () => {\n const tag = uid();\n const a = `np-${tag}-a`;\n const b = `np-${tag}-b`;\n const c = `np-${tag}-c`;\n const one = `np-${tag}-1`;\n const aaa = `np-${tag}-aaa`;\n const dot = `e-${tag}.d`;\n const dot_decoy = `e-${tag}xd`;\n await seed_streams([a, b, c, one, aaa, dot, dot_decoy]);\n\n // alternation\n await match_exactly_or_throw(`^np-${tag}-(a|b)$`, [a, b]);\n // character class\n await match_exactly_or_throw(`^np-${tag}-[0-9]$`, [one]);\n // quantifier\n await match_exactly_or_throw(`^np-${tag}-a+$`, [a, aaa]);\n // escaped dot — a literal-dot match, not a one-char wildcard\n await match_exactly_or_throw(`^e-${tag}\\\\.d$`, [dot]);\n });\n\n it(\"bulk stream ops reject non-portable filters instead of mis-matching\", async () => {\n const tag = uid();\n const s = `bo-${tag}-a`;\n await store.subscribe([{ stream: s }]);\n\n let count: number | undefined;\n let error: unknown;\n try {\n count = await store.reset({ stream: `^bo-${tag}-(a|b)$` });\n } catch (e) {\n error = e;\n }\n if (error !== undefined) expect(error).toBeInstanceOf(ValidationError);\n else expect(count).toBe(1);\n });\n\n // #1197: stream filters are case-SENSITIVE across every adapter.\n // PG (`~`) and InMemory (RegExp) are case-sensitive; a store that\n // translates to `LIKE` must not let SQLite's ASCII-insensitive LIKE\n // overmatch a differently-cased sibling. A `^order-` prefix must\n // match `order-x` but never `Order-x`.\n it(\"stream filters match case-sensitively (query)\", async () => {\n const tag = uid();\n const lower = `order-${tag}`;\n const upper = `Order-${tag}`;\n await seed_streams([lower, upper]);\n\n // ^prefix — only the lower-cased stream, never the capitalized one\n expect(await streams_matching(`^order-${tag}`)).toEqual([lower]);\n // ^exact$ — the capitalized name never matches a lower-cased pattern\n expect(await streams_matching(`^Order-${tag}$`)).toEqual([upper]);\n // contains — case-sensitive substring\n expect(await streams_matching(`order-${tag}`)).toEqual([lower]);\n });\n\n it(\"stream filters match case-sensitively (position filters)\", async () => {\n const tag = uid();\n const lower = `csp-order-${tag}`;\n const upper = `csp-Order-${tag}`;\n await store.subscribe([{ stream: lower }, { stream: upper }]);\n\n const got: string[] = [];\n await store.query_streams((p) => got.push(p.stream), {\n stream: `^csp-order-${tag}`,\n });\n expect(got).toEqual([lower]);\n });\n\n it(\"bulk stream ops match case-sensitively\", async () => {\n const tag = uid();\n const lower = `bcs-order-${tag}`;\n const upper = `bcs-Order-${tag}`;\n await store.subscribe([{ stream: lower }, { stream: upper }]);\n\n // reset by pattern touches only the exactly-cased stream\n const count = await store.reset({ stream: `^bcs-order-${tag}` });\n expect(count).toBe(1);\n });\n });\n\n describe(\"subscribe + claim + ack\", () => {\n it(\"subscribes new streams and is idempotent on repeat\", async () => {\n const s = `sub-${uid()}`;\n const first = await store.subscribe([{ stream: s }]);\n expect(first.subscribed).toBe(1);\n const second = await store.subscribe([{ stream: s }]);\n expect(second.subscribed).toBe(0);\n });\n\n // Backs the port-doc contract on `subscribe`'s `priority` param:\n // \"When the same stream is subscribed by multiple reactions with\n // different priorities, implementations must keep the maximum so\n // the highest-priority reaction wins.\" Without this test the merge\n // could silently regress to last-write-wins on any adapter.\n it(\"keeps the maximum priority when a stream is re-subscribed\", async () => {\n const s = `sub-pri-${uid()}`;\n const read = async () => {\n const got: { priority?: number } = {};\n await store.query_streams(\n (p) => {\n got.priority = p.priority;\n },\n { stream: s, stream_exact: true }\n );\n return got.priority;\n };\n\n await store.subscribe([{ stream: s, priority: 3 }]);\n expect(await read()).toBe(3);\n\n // Higher priority wins.\n await store.subscribe([{ stream: s, priority: 10 }]);\n expect(await read()).toBe(10);\n\n // Lower priority must NOT lower the stored value.\n await store.subscribe([{ stream: s, priority: 1 }]);\n expect(await read()).toBe(10);\n\n // Default priority (0, omitted) must NOT lower it either.\n await store.subscribe([{ stream: s }]);\n expect(await read()).toBe(10);\n });\n\n it(\"claims a subscribed stream and ack releases the lease\", async () => {\n const s = `claim-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const by = `worker-${uid()}`;\n const leased = await store.claim(100, 0, by, 10_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n expect(mine!.by).toBe(by);\n await store.ack([{ ...(mine as Lease), at: mine!.at + 1 }]);\n });\n\n it(\"does not double-claim a held lease\", async () => {\n const s = `claim-held-${uid()}`;\n const other = `claim-other-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leasedA = await store.claim(100, 0, `wA-${uid()}`, 100_000);\n const targetA = leasedA.find((l) => l.stream === s);\n expect(targetA).toBeDefined();\n // Subscribe + commit `other` only AFTER A's claim — fresh\n // subscriptions report `at=-1` which adapters treat as\n // claimable. We want `other` to be visible only to B so the\n // negative assertion below runs through a populated array.\n await store.subscribe([{ stream: other }]);\n await store.commit<CounterEvents>(\n other,\n [inc(2)],\n make_meta({ stream: other })\n );\n const leasedB = await store.claim(100, 0, `wB-${uid()}`, 100_000);\n expect(leasedB.length).toBeGreaterThan(0);\n expect(leasedB.find((l) => l.stream === s)).toBeUndefined();\n expect(leasedB.find((l) => l.stream === other)).toBeDefined();\n });\n\n it(\"supports dual frontiers (lagging + leading)\", async () => {\n const s = `claim-dual-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2)],\n make_meta({ stream: s })\n );\n const first = await store.claim(100, 0, `w-${uid()}`, 1);\n const mine = first.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await store.ack([{ ...(mine as Lease), at: (mine as Lease).at + 1 }]);\n const second = await store.claim(0, 100, `w-${uid()}`, 1);\n expect(second.find((l) => l.stream === s)).toBeDefined();\n });\n\n it(\"does not starve a default-priority lagging stream under sustained high-priority load (ACT-1223)\", async () => {\n // A fresh adapter so only these streams compete for the frontier.\n // Six priority-100 streams that always have fresh work plus one\n // never-processed priority-0 stream. The lagging selection orders\n // by priority DESC, at ASC, so without a fairness reserve the four\n // lagging slots are forever taken by the high-priority streams and\n // the low one starves. The reserve (ACT-1223) carves one slot for\n // pure watermark order, so the most-behind stream is claimed within\n // a bounded window regardless of priority.\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const suffix = uid();\n const highs = Array.from(\n { length: 6 },\n (_, i) => `hi-${i}-${suffix}`\n );\n const low = `lo-${suffix}`;\n await fresh.subscribe([\n ...highs.map((stream) => ({ stream, priority: 100 })),\n { stream: low, priority: 0 },\n ]);\n for (const stream of highs)\n await fresh.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n await fresh.commit<CounterEvents>(\n low,\n [inc(1)],\n make_meta({ stream: low })\n );\n\n const by = `w-${uid()}`;\n let low_claimed = false;\n const MAX_CYCLES = 20;\n for (let cycle = 0; cycle < MAX_CYCLES && !low_claimed; cycle++) {\n const leases = await fresh.claim(4, 0, by, 1000);\n if (leases.some((l) => l.stream === low)) {\n low_claimed = true;\n break;\n }\n // Ack each high stream forward, then commit a fresh event so it\n // is lagging again next cycle — sustained high-priority load.\n for (const l of leases) {\n await fresh.ack([{ ...l, at: l.at + 1 }]);\n await fresh.commit<CounterEvents>(\n l.stream,\n [inc(1)],\n make_meta({ stream: l.stream })\n );\n }\n }\n\n expect(low_claimed).toBe(true);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"dedupes when both frontiers would return the same stream\", async () => {\n const s = `claim-dedup-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Asking for both frontiers with overlapping budgets must not\n // return the same stream twice.\n const claimed = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const matches = claimed.filter((l) => l.stream === s);\n expect(matches).toHaveLength(1);\n });\n\n it(\"silently ignores ack from the wrong holder\", async () => {\n const s = `ack-wrong-${uid()}`;\n const sibling = `ack-sibling-${uid()}`;\n await store.subscribe([{ stream: s }, { stream: sibling }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n sibling,\n [inc(2)],\n make_meta({ stream: sibling })\n );\n const leased = await store.claim(100, 0, `right-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n const sibling_lease = leased.find((l) => l.stream === sibling);\n expect(mine).toBeDefined();\n expect(sibling_lease).toBeDefined();\n // Mix a correctly-held lease with an imposter ack so `acked`\n // ends up with one entry (the sibling) and the predicate runs.\n const acked = await store.ack([\n { ...(mine as Lease), by: \"imposter\" },\n sibling_lease as Lease,\n ]);\n expect(acked.length).toBeGreaterThan(0);\n expect(acked.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"ack with a stale (lower) watermark does not throw\", async () => {\n const s = `ack-stale-${uid()}`;\n await store.subscribe([{ stream: s }]);\n const by = `w-${uid()}`;\n const leased = await store.claim(100, 0, by, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await expect(\n store.ack([{ ...(mine as Lease), at: -5 }])\n ).resolves.toBeDefined();\n });\n\n it(\"claim with no subscribed streams returns an empty array\", async () => {\n // Use a fresh adapter instance — the parent store is shared across\n // the suite and has subscribed streams already.\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const claimed = await fresh.claim(1, 1, `w-${uid()}`, 1000);\n expect(claimed).toEqual([]);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n // ACT-980: the TCK previously asserted only the *shape* of claim()\n // results, letting adapters diverge on `Lease.retry` and `Lease.lagging`\n // — the two signals the drain controller reads to time `blockOnError`\n // and to balance frontiers. These cases pin the *semantics* so every\n // adapter is interchangeable, not merely structurally conformant.\n describe(\"lease semantics\", () => {\n // Frontier budgets (`lagging`/`leading`) apply across every claimable\n // stream in the store, so these cases run against a fresh, isolated\n // instance with exactly one subscribed stream — that makes the\n // budgets deterministic regardless of what the shared suite left\n // behind.\n it(\"returns retry=0 on first claim and increments on re-claim without ack\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `lease-retry-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n await fresh.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // First claim = first attempt. A 0ms lease is released\n // immediately, so the re-claim below sees a claimable stream\n // deterministically (no wall-clock race on lease expiry).\n const first = await fresh.claim(1, 0, `w-${uid()}`, 0);\n const f = first.find((l) => l.stream === s);\n expect(f).toBeDefined();\n expect(f!.retry).toBe(0);\n // Re-claim without an intervening ack = the first retry.\n const second = await fresh.claim(1, 0, `w-${uid()}`, 100_000);\n const sec = second.find((l) => l.stream === s);\n expect(sec).toBeDefined();\n expect(sec!.retry).toBe(1);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"reports lagging=true from the lagging frontier and false from the leading frontier\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `lease-lag-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n await fresh.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Lagging-only budget: the stream is claimed from the lagging\n // frontier → lagging must be true.\n const lag = await fresh.claim(1, 0, `w-${uid()}`, 0);\n expect(lag.find((l) => l.stream === s)?.lagging).toBe(true);\n // Leading-only budget on the released lease: claimed from the\n // leading frontier → lagging must be false. `lagging` is\n // frontier membership, not a function of the stream's watermark.\n const lead = await fresh.claim(0, 1, `w-${uid()}`, 100_000);\n expect(lead.find((l) => l.stream === s)?.lagging).toBe(false);\n } finally {\n await fresh.dispose();\n }\n });\n\n // ACT-1183: a lease timeout is not a free pass. Every claim()\n // increments the stream's retry counter and only ack resets it, so\n // a stream whose workers keep dying marches toward `blockOnError`\n // exactly like one whose handlers keep throwing — repeated worker\n // deaths on one stream are poison-adjacent, and quarantining beats\n // an infinite crash loop. The 0ms lease is the deterministic\n // stand-in for \"worker died mid-lease\" (no wall-clock race).\n it(\"counts a timed-out lease reclaimed by another worker against the retry budget; ack resets it\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `lease-timeout-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n const [e1] = await seed_stream(fresh, s, 1);\n // Worker A claims and \"dies\" — its 0ms lease is already expired.\n const a = await fresh.claim(1, 0, `wA-${uid()}`, 0);\n expect(a.find((l) => l.stream === s)?.retry).toBe(0);\n // Worker B reclaims after the timeout: the budget marches.\n const b = await fresh.claim(1, 0, `wB-${uid()}`, 30_000);\n const b_lease = b.find((l) => l.stream === s);\n expect(b_lease).toBeDefined();\n expect(b_lease!.retry).toBe(1);\n // Ack resets the budget: the next claim is a first attempt again.\n await fresh.ack([{ ...(b_lease as Lease), at: e1.id }]);\n await seed_stream(fresh, s, 1);\n const c = await fresh.claim(1, 0, `wC-${uid()}`, 30_000);\n expect(c.find((l) => l.stream === s)?.retry).toBe(0);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n // ACT-1182: a subscription's `source` is an **exact stream name** in\n // claim()'s has-work probe — never a regex, LIKE pattern, or substring.\n // Every shipped resolver (autoclose, dynamic per-aggregate reactions)\n // produces exact names, and exact equality keeps the probe on the\n // adapter's stream index. Pattern matching belongs to the StreamFilter\n // surfaces (`query_streams`, `reset`, `unblock`), not to claim. Before\n // these cases, InMemory compiled `source` into an unanchored RegExp and\n // SQLite into a contains-LIKE — both silently overmatched sibling\n // streams sharing a prefix.\n describe(\"claim source matching\", () => {\n it(\"treats source as an exact stream name — no substring or pattern overmatch\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const base = `src-${uid()}`;\n const sibling = `${base}2`; // `base` is a strict prefix of `sibling`\n const target = `agg-${uid()}`;\n const control = `ctl-${uid()}`;\n await fresh.subscribe([\n { stream: target, source: base },\n // Control subscription sourced from the sibling — it DOES see\n // the sibling commit below, so the negative assertion runs\n // through a populated claim result.\n { stream: control, source: sibling },\n ]);\n // Advance the watermarks past -1 first — fresh subscriptions are\n // claimable unconditionally on some adapters.\n const [seeded] = await seed_stream(fresh, base, 1);\n const [ctl_seeded] = await seed_stream(fresh, sibling, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const mine = first.find((l) => l.stream === target);\n const ctl = first.find((l) => l.stream === control);\n expect(mine).toBeDefined();\n expect(ctl).toBeDefined();\n await fresh.ack([\n { ...(mine as Lease), at: seeded.id },\n { ...(ctl as Lease), at: ctl_seeded.id },\n ]);\n // New events land only on the *sibling* stream. An exact-source\n // subscription on `base` must not see them as work; the control\n // sourced from the sibling must.\n await seed_stream(fresh, sibling, 1);\n const second = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n expect(second.find((l) => l.stream === control)).toBeDefined();\n expect(second.find((l) => l.stream === target)).toBeUndefined();\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"receives exactly its source stream's events\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const base = `src-${uid()}`;\n const target = `agg-${uid()}`;\n await fresh.subscribe([{ stream: target, source: base }]);\n const [e1] = await seed_stream(fresh, base, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const f = first.find((l) => l.stream === target);\n expect(f).toBeDefined();\n expect(f!.source).toBe(base);\n await fresh.ack([{ ...(f as Lease), at: e1.id }]);\n // A fresh commit on the exact source makes the stream claimable\n // again, and the fetch window (source + after watermark) yields\n // exactly the new event.\n const [e2] = await seed_stream(fresh, base, 1);\n const second = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const sec = second.find((l) => l.stream === target);\n expect(sec).toBeDefined();\n expect(sec!.at).toBe(e1.id);\n const events = await collect(fresh, {\n stream: sec!.source,\n after: sec!.at,\n });\n expect(events.map((e) => e.id)).toEqual([e2.id]);\n } finally {\n await fresh.dispose();\n }\n });\n\n // ACT-1220: an exact (literal) source must never fetch events from a\n // sibling stream sharing its prefix. Guards the drain fetch path: an\n // exact source `s1` claimed as work must, when queried, receive only\n // `s1`'s events — not `s12`'s. Pre-#1215 fetch treated `source` as an\n // unanchored regex, so `s1` would have pulled `s12`'s events into the\n // handler.\n it(\"fetches only the exact source stream's events, never a sibling prefix\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const base = `fx-${uid()}`;\n const sibling = `${base}2`;\n const target = `agg-${uid()}`;\n await fresh.subscribe([{ stream: target, source: base }]);\n const [b1] = await seed_stream(fresh, base, 1);\n await seed_stream(fresh, sibling, 1);\n const claimed = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const lease = claimed.find((l) => l.stream === target);\n expect(lease).toBeDefined();\n const events = await collect(fresh, {\n stream: lease!.source,\n stream_exact: true,\n after: -1,\n });\n expect(events.map((e) => e.stream)).toEqual([base]);\n expect(events.map((e) => e.id)).toEqual([b1.id]);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n // ACT-1220: a **pattern** source (one carrying regex metacharacters) is\n // matched as a full RegExp against candidate streams. This restores the\n // calculator's shipped `source: \"^(A|B)$\"` static reaction, which\n // #1215's exact-only claim contract silently broke — the Board\n // projection stopped being claimed because `_max_event_id_by_stream.get(\n // \"^(A|B)$\")` is always undefined. Literal sources keep the fast exact\n // path; only sources with metacharacters compile to a RegExp.\n describe.skipIf(!caps.pattern_claim_source)(\n \"claim pattern source matching (capability)\",\n () => {\n it(\"claims a pattern-source target when any matched stream has work (^(A|B)$)\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const a = `A-${uid()}`;\n const b = `B-${uid()}`;\n const target = `board-${uid()}`;\n const pattern = `^(${a}|${b})$`;\n await fresh.subscribe([{ stream: target, source: pattern }]);\n // Commit to A only — the pattern must match it and claim.\n const [ea] = await seed_stream(fresh, a, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const l1 = first.find((s) => s.stream === target);\n expect(l1).toBeDefined();\n await fresh.ack([{ ...(l1 as Lease), at: ea.id }]);\n // Now commit to B — the same pattern-source target must claim\n // again for the second matched stream.\n const [eb] = await seed_stream(fresh, b, 1);\n const second = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n expect(second.find((s) => s.stream === target)).toBeDefined();\n expect(eb.stream).toBe(b);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"does not claim a pattern-source target when no matched stream has work\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const a = `A-${uid()}`;\n const b = `B-${uid()}`;\n const other = `Z-${uid()}`;\n const target = `board-${uid()}`;\n const control = `ctl-${uid()}`;\n const pattern = `^(${a}|${b})$`;\n // The control target sources from `other` (a literal). It DOES\n // see the `other` commit below, so the second claim is\n // non-empty and the negative assertion runs through a\n // populated result — the pattern target must simply be absent.\n await fresh.subscribe([\n { stream: target, source: pattern },\n { stream: control, source: other },\n ]);\n // Advance the target's watermark past -1 first: a fresh\n // subscription is claimable unconditionally on some adapters,\n // so the negative assertion must run against a settled stream.\n const [ea] = await seed_stream(fresh, a, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const l1 = first.find((s) => s.stream === target);\n expect(l1).toBeDefined();\n // Ack both the pattern target and the fresh control lease so\n // neither is held into the second claim; the control becomes\n // claimable again only when `other` gets a commit below. Both\n // are fresh subscriptions, so both are in the first claim.\n const c1 = first.find((s) => s.stream === control);\n expect(c1).toBeDefined();\n await fresh.ack([\n { ...(l1 as Lease), at: ea.id },\n { ...(c1 as Lease), at: -1 },\n ]);\n // Now activity on a stream the pattern does NOT match must not\n // make the target claimable again — but the control sourced\n // from that stream must.\n await seed_stream(fresh, other, 1);\n const claimed = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const streams = claimed.map((s) => s.stream);\n expect(streams).toContain(control);\n expect(streams).not.toContain(target);\n } finally {\n await fresh.dispose();\n }\n });\n }\n );\n\n // ACT-1220: adapters that cannot faithfully run an arbitrary regex in\n // claim reject a non-portable claim source loudly at subscribe() —\n // failing at registration, not silently never claiming the stream.\n describe.skipIf(!caps.rejects_nonportable_claim_source)(\n \"claim source registration (capability)\",\n () => {\n it(\"throws at subscribe for a non-portable (alternation) claim source\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n await expect(\n fresh.subscribe([\n { stream: `board-${uid()}`, source: `^(${uid()}|${uid()})$` },\n ])\n ).rejects.toThrow(ValidationError);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"accepts a portable-subset pattern claim source (^prefix.*) and claims on match\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const prefix = `pfx${uid()}`.replace(/-/g, \"\");\n const matched = `${prefix}child`;\n const target = `board-${uid()}`;\n await fresh.subscribe([{ stream: target, source: `^${prefix}.*` }]);\n const [e] = await seed_stream(fresh, matched, 1);\n const claimed = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n expect(claimed.find((s) => s.stream === target)).toBeDefined();\n expect(e.stream).toBe(matched);\n } finally {\n await fresh.dispose();\n }\n });\n }\n );\n\n // ACT-982: competing-consumer correctness was previously proven only by\n // the PG-specific multi-process stress harness. This makes it a portable\n // contract for adapters that support concurrent claimers (gated by\n // `concurrent_claim`): two distinct workers claiming the same candidate\n // set concurrently must never both lease the same stream within the\n // lease window. Single-writer stores (SQLite) opt out — see the\n // capability docs.\n describe.skipIf(!caps.concurrent_claim)(\"concurrency (capability)\", () => {\n it(\"never double-leases a stream across concurrent claimers\", async () => {\n // Fresh isolated instance: the two workers below claim with large\n // budgets across every claimable stream, so a shared store would\n // both perturb this test and leave 60s leases that pollute later\n // suites. Mirrors the lease-semantics cases.\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const streams = Array.from(\n { length: 8 },\n () => `concurrent-${uid()}`\n );\n await fresh.subscribe(streams.map((stream) => ({ stream })));\n for (const stream of streams) {\n await fresh.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const owned = new Set(streams);\n // Overlapping budgets so both workers target the same set;\n // SKIP LOCKED (pg) / atomic lease (in-memory) must hand each\n // stream to at most one worker.\n const [a, b] = await Promise.all([\n fresh.claim(100, 100, `wA-${uid()}`, 60_000),\n fresh.claim(100, 100, `wB-${uid()}`, 60_000),\n ]);\n // Combine both workers' leases. Operating on the union (rather\n // than per-worker sets) keeps the callbacks covered even when one\n // worker wins every stream and the other comes back empty.\n const claimed = [...a, ...b]\n .map((l) => l.stream)\n .filter((stream) => owned.has(stream));\n // No stream leased twice (no double-lease across workers)...\n expect(new Set(claimed).size).toBe(claimed.length);\n // ...and every stream leased exactly once (none lost).\n expect(claimed.length).toBe(owned.size);\n } finally {\n await fresh.dispose();\n }\n });\n\n // ACT-1184: lease expiry under competing claimers. An unexpired\n // lease is invisible to every other worker; an expired one is\n // handed to exactly one of them.\n it(\"does not hand an unexpired lease to a competing claimer\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `unexpired-${uid()}`;\n const other = `unexpired-other-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n await seed_stream(fresh, s, 1);\n const a = await fresh.claim(100, 100, `wA-${uid()}`, 60_000);\n expect(a.find((l) => l.stream === s)).toBeDefined();\n // Subscribe `other` only AFTER A's claim so B's claim comes back\n // populated and the negative assertion runs through a non-empty\n // array (mirrors \"does not double-claim a held lease\").\n await fresh.subscribe([{ stream: other }]);\n await seed_stream(fresh, other, 1);\n const b = await fresh.claim(100, 100, `wB-${uid()}`, 60_000);\n expect(b.find((l) => l.stream === other)).toBeDefined();\n expect(b.find((l) => l.stream === s)).toBeUndefined();\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"hands an expired lease to exactly one competing claimer, with retry accounting shared across workers\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `expired-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n const [e1] = await seed_stream(fresh, s, 1);\n // The original holder \"dies\": a 0ms lease is expired on arrival.\n const dead = await fresh.claim(100, 0, `wDead-${uid()}`, 0);\n expect(dead.find((l) => l.stream === s)?.retry).toBe(0);\n // Two workers race for the expired lease — exactly one wins,\n // and the shared retry counter (ACT-1183) reflects the reclaim\n // regardless of which worker performs it.\n const [b, c] = await Promise.all([\n fresh.claim(100, 100, `wB-${uid()}`, 60_000),\n fresh.claim(100, 100, `wC-${uid()}`, 60_000),\n ]);\n const winners = [...b, ...c].filter((l) => l.stream === s);\n expect(winners).toHaveLength(1);\n expect(winners[0].retry).toBe(1);\n // Ack by the winning worker resets the shared budget.\n await fresh.ack([{ ...winners[0], at: e1.id }]);\n await seed_stream(fresh, s, 1);\n const again = await fresh.claim(100, 0, `wNext-${uid()}`, 60_000);\n expect(again.find((l) => l.stream === s)?.retry).toBe(0);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n describe(\"block\", () => {\n it(\"hides blocked streams from claim\", async () => {\n const s = `block-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n const blocked = await store.block([\n { ...(mine as Lease), error: \"boom\" },\n ]);\n expect(blocked).toHaveLength(1);\n expect(blocked[0].error).toBe(\"boom\");\n const again = await store.claim(100, 100, `w2-${uid()}`, 100_000);\n expect(again.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"rejects block calls from a different holder\", async () => {\n const s = `block-wrong-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `right-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n const blocked = await store.block([\n { ...(mine as Lease), by: \"imposter\", error: \"no\" },\n ]);\n expect(blocked).toHaveLength(0);\n });\n\n it(\"re-blocking an already-blocked stream is a no-op (#1263)\", async () => {\n const s = `block-twice-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await store.ack(leased.filter((l) => l.stream !== s));\n const first = await store.block([\n { ...(mine as Lease), error: \"boom\" },\n ]);\n expect(first).toHaveLength(1);\n // Second block of the same already-blocked lease affects nothing —\n // no spurious duplicate `blocked` event.\n const second = await store.block([\n { ...(mine as Lease), error: \"boom\" },\n ]);\n expect(second).toHaveLength(0);\n });\n });\n\n describe(\"defer\", () => {\n it(\"hides a stream from claim until its deferred_at passes\", async () => {\n const s = `defer-${uid()}`;\n // A claimable control stream guarantees the claim result is non-empty,\n // so the membership checks below actually run (and prove `s` is the one\n // being skipped, not that nothing was claimable).\n const ctl = `defer-ctl-${uid()}`;\n await store.subscribe([{ stream: s }, { stream: ctl }]);\n for (const st of [s, ctl])\n await store.commit<CounterEvents>(\n st,\n [inc(1)],\n make_meta({ stream: st })\n );\n // Defer far into the future — claim must skip it.\n expect(await store.defer([s], Date.now() + 3_600_000)).toBe(1);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(leased.find((l) => l.stream === ctl)).toBeDefined();\n expect(leased.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"makes a stream claimable once the deferred_at is in the past\", async () => {\n const s = `defer-past-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // A due-time already in the past is not a constraint.\n expect(await store.defer([s], Date.now() - 1_000)).toBe(1);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n // ack clears the schedule and does not bump retry past the claim.\n await store.ack(\n leased.filter((l) => l.stream !== s).concat(mine as Lease)\n );\n });\n\n it(\"does not bump retry while a stream is deferred\", async () => {\n const s = `defer-retry-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.defer([s], Date.now() + 3_600_000);\n // Several claim attempts while deferred — none should touch the row.\n await store.claim(100, 100, `w1-${uid()}`, 100_000);\n await store.claim(100, 100, `w2-${uid()}`, 100_000);\n // Re-defer into the past so it becomes claimable, then observe retry.\n await store.defer([s], Date.now() - 1_000);\n const leased = await store.claim(100, 100, `w3-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n // First real claim → retry 0, proving the deferred claims didn't bump it.\n expect(mine!.retry).toBe(0);\n await store.ack(\n leased.filter((l) => l.stream !== s).concat(mine as Lease)\n );\n });\n\n it(\"reset clears a pending defer\", async () => {\n const s = `defer-reset-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.defer([s], Date.now() + 3_600_000);\n expect(await store.reset([s])).toBe(1);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(leased.find((l) => l.stream === s)).toBeDefined();\n });\n\n it(\"exposes a future deferred_at via query_streams (#1221)\", async () => {\n // The cold-start defer re-seed reads the persisted schedule back\n // through query_streams: a stream with a future deferred_at must\n // surface the ms-since-epoch value so the orchestrator can re-arm\n // the drain at the due-time. A stream with no active defer omits it.\n const deferred = `defer-qs-${uid()}`;\n const plain = `defer-qs-plain-${uid()}`;\n await store.subscribe([{ stream: deferred }, { stream: plain }]);\n for (const s of [deferred, plain])\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const due = Date.now() + 3_600_000;\n await store.defer([deferred], due);\n\n const seen = new Map<string, number | undefined>();\n await store.query_streams((p) => {\n if (p.stream === deferred || p.stream === plain)\n seen.set(p.stream, p.deferred_at);\n });\n // The deferred stream reports its schedule; adapters persist at\n // second/ms precision, so allow a small rounding tolerance.\n const got = seen.get(deferred);\n expect(got).toBeDefined();\n expect(Math.abs((got as number) - due)).toBeLessThan(2_000);\n // The undeferred stream omits the field.\n expect(seen.get(plain)).toBeUndefined();\n });\n\n it(\"defers streams matching a filter and counts matches\", async () => {\n const tag = uid();\n const a = `deferfilter-${tag}-a`;\n const b = `deferfilter-${tag}-b`;\n await store.subscribe([{ stream: a }, { stream: b }]);\n for (const s of [a, b])\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // A claimable control stream outside the filter keeps the claim result\n // non-empty, so the membership checks below run against real rows.\n const ctl = `defer-filterctl-${tag}`;\n await store.subscribe([{ stream: ctl }]);\n await store.commit<CounterEvents>(\n ctl,\n [inc(1)],\n make_meta({ stream: ctl })\n );\n const n = await store.defer(\n { stream: `^deferfilter-${tag}-`, stream_exact: false },\n Date.now() + 3_600_000\n );\n expect(n).toBe(2);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(leased.find((l) => l.stream === ctl)).toBeDefined();\n expect(leased.find((l) => l.stream === a)).toBeUndefined();\n expect(leased.find((l) => l.stream === b)).toBeUndefined();\n });\n\n it(\"returns 0 for unknown streams and empty input\", async () => {\n expect(await store.defer([`missing-${uid()}`], Date.now())).toBe(0);\n expect(await store.defer([], Date.now())).toBe(0);\n });\n });\n\n describe(\"ack finalize (due-marked leases)\", () => {\n it(\"defers a due-marked lease instead of acking it\", async () => {\n // One finalize call carries both outcomes: the control stream acks\n // (watermark advances), the due-marked stream defers (schedule set,\n // watermark held). Deferred entries are not part of the return value.\n const s = `ackdefer-${uid()}`;\n const ctl = `ackdefer-ctl-${uid()}`;\n await store.subscribe([{ stream: s }, { stream: ctl }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const [ctl_head] = await store.commit<CounterEvents>(\n ctl,\n [inc(1)],\n make_meta({ stream: ctl })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const s_lease = leased.find((l) => l.stream === s)!;\n const ctl_lease = leased.find((l) => l.stream === ctl)!;\n const acked = await store.ack([\n { ...ctl_lease, at: ctl_head.id },\n { ...s_lease, due: Date.now() + 3_600_000 },\n ]);\n expect(acked.find((l) => l.stream === ctl)).toBeDefined();\n expect(acked.find((l) => l.stream === s)).toBeUndefined();\n // The schedule holds: claim skips the deferred stream. A fresh\n // commit on the control keeps the claim result non-empty, so the\n // membership check proves the deferred stream is the one skipped.\n await store.commit<CounterEvents>(\n ctl,\n [inc(2)],\n make_meta({ stream: ctl })\n );\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(again.find((l) => l.stream === ctl)).toBeDefined();\n expect(again.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"holds the watermark and resets retry on an explicit-defer due lease (retry: -1)\", async () => {\n // A due-time already in the past makes the stream immediately\n // re-claimable — proving the finalize released the lease. The lease\n // carries `at` = the claim watermark (no events handled), so the\n // advance is a no-op and the watermark holds. An explicit defer passes\n // `retry: -1` (a defer is not a failure), so the persisted retry resets\n // and the next claim bumps it to 0.\n const s = `ackdefer-past-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n await store.ack([{ ...mine, due: Date.now() - 1_000, retry: -1 }]);\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const re = again.find((l) => l.stream === s);\n expect(re).toBeDefined();\n expect(re!.at).toBe(mine.at); // watermark held — events still pending\n expect(re!.retry).toBe(0); // reset by the defer, bumped by claim\n await store.ack([{ ...re!, at: 1_000_000 }]);\n });\n\n it(\"persists the lease's retry on a backoff-style due lease (#1262)\", async () => {\n // A retry-with-backoff passes the climbing counter (not -1) on the\n // due-marked lease, so the retry budget survives the defer window —\n // the persisted value plus the next claim's bump keep it accruing\n // toward the block threshold across windows.\n const s = `ackdefer-retry-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n // Persist retry 3 with a past due-time so it's immediately re-claimable.\n // `at` = the claim watermark (no progress), so the advance is a no-op.\n await store.ack([{ ...mine, due: Date.now() - 1_000, retry: 3 }]);\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const re = again.find((l) => l.stream === s);\n expect(re).toBeDefined();\n expect(re!.at).toBe(mine.at); // watermark unchanged — no-op advance\n expect(re!.retry).toBe(4); // persisted 3, bumped to 4 by claim\n await store.ack([{ ...re!, at: 1_000_000 }]);\n });\n\n it(\"advances the watermark to `at` while persisting the schedule on a partial-progress due lease (#1278)\", async () => {\n // Advance and defer are independent ack legs: a partial-progress\n // backoff/defer moves the watermark past the events handled this cycle\n // (`at`) AND persists the window in one call, so the handled prefix\n // never re-runs. Distinct from the hold cases above, which pass\n // `at` = the claim watermark (a no-op advance).\n const s = `ackadvance-${uid()}`;\n await store.subscribe([{ stream: s }]);\n // e1 is the \"handled prefix\"; a second event keeps the stream pending.\n const [e1] = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n expect(mine.at).toBeLessThan(e1.id); // fresh stream — floor below e1\n // Advance to e1 (last succeeded) AND defer with a past due-time (so it's\n // immediately re-claimable) carrying the climbing retry.\n await store.ack([\n { ...mine, at: e1.id, due: Date.now() - 1_000, retry: 2 },\n ]);\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const re = again.find((l) => l.stream === s);\n expect(re).toBeDefined();\n expect(re!.at).toBe(e1.id); // advanced past the succeeded event, NOT held\n expect(re!.retry).toBe(3); // persisted 2, bumped by claim\n await store.ack([{ ...re!, at: 1_000_000 }]);\n });\n\n it(\"ignores due-marked entries from a non-holder\", async () => {\n // Same ownership rule as plain acks: only the lease holder can\n // finalize, so a stale worker cannot overwrite a live schedule.\n const s = `ackdefer-owner-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n await store.ack([\n { ...mine, by: `stale-${uid()}`, due: Date.now() + 3_600_000 },\n ]);\n // No schedule was written: the holder can still finalize normally.\n const acked = await store.ack([{ ...mine, at: 1_000_000 }]);\n expect(acked.find((l) => l.stream === s)).toBeDefined();\n });\n });\n\n describe(\"reset\", () => {\n it(\"rewinds a stream watermark to -1\", async () => {\n const s = `reset-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await store.ack([{ ...(mine as Lease), at: 99 }]);\n expect(await store.reset([s])).toBe(1);\n const after = await store.claim(100, 0, `w2-${uid()}`, 100_000);\n const back = after.find((l) => l.stream === s);\n expect(back).toBeDefined();\n expect(back!.at).toBe(-1);\n });\n\n it(\"clears blocked status when resetting\", async () => {\n const s = `reset-blk-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n await store.block([{ ...(mine as Lease), error: \"boom\" }]);\n expect(await store.reset([s])).toBe(1);\n const after = await store.claim(100, 0, `w2-${uid()}`, 100_000);\n expect(after.find((l) => l.stream === s)).toBeDefined();\n });\n\n it(\"returns 0 for unknown streams and empty input\", async () => {\n expect(await store.reset([`missing-${uid()}`])).toBe(0);\n expect(await store.reset([])).toBe(0);\n });\n });\n\n describe(\"unblock\", () => {\n it(\"clears blocked flag and preserves the watermark\", async () => {\n const s = `unblock-${uid()}`;\n await store.subscribe([{ stream: s }]);\n // Two events so the watermark advances past 0 before block.\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(2)],\n make_meta({ stream: s })\n );\n\n // First lease + ack first event → watermark advances.\n const first = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m1 = first.find((l) => l.stream === s);\n await store.ack([{ ...(m1 as Lease), at: m1!.at }]);\n\n // Capture watermark before block.\n const before_block = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m2 = before_block.find((l) => l.stream === s);\n expect(m2).toBeDefined();\n const watermark_before = m2!.at;\n await store.block([{ ...(m2 as Lease), error: \"permanent\" }]);\n\n // Stream is now blocked — query_streams must report it as such.\n // (Asserting on `claim()` would be flaky: an empty result is the\n // same as \"s not in the result,\" which short-circuits a find()\n // callback and leaves it uncovered when no other streams happen\n // to be claimable in the fixture.)\n let blocked_flag: boolean | undefined;\n await store.query_streams(\n (p) => {\n blocked_flag = p.blocked;\n },\n { stream: s, stream_exact: true, limit: 1 }\n );\n expect(blocked_flag).toBe(true);\n\n // Unblock — claim picks it back up at the same watermark.\n expect(await store.unblock([s])).toBe(1);\n const after = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const back = after.find((l) => l.stream === s);\n expect(back).toBeDefined();\n expect(back!.at).toBe(watermark_before);\n expect(back!.retry).toBe(0);\n });\n\n it(\"returns 0 when the stream is not blocked\", async () => {\n const s = `unblock-noop-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Stream exists but isn't blocked.\n expect(await store.unblock([s])).toBe(0);\n });\n\n it(\"returns 0 for unknown streams and empty input\", async () => {\n expect(await store.unblock([`missing-${uid()}`])).toBe(0);\n expect(await store.unblock([])).toBe(0);\n });\n\n it(\"only counts streams that were actually blocked\", async () => {\n const s1 = `unblock-mix-a-${uid()}`;\n const s2 = `unblock-mix-b-${uid()}`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m1 = leased.find((l) => l.stream === s1);\n const others = leased.filter((l) => l.stream !== s1);\n await store.ack(others);\n // Block only s1.\n await store.block([{ ...(m1 as Lease), error: \"boom\" }]);\n expect(await store.unblock([s1, s2])).toBe(1);\n });\n\n it(\"filter form: unblocks by stream pattern\", async () => {\n const tag = uid();\n const s1 = `unblock-filter-${tag}-a`;\n const s2 = `unblock-filter-${tag}-b`;\n const s3 = `other-${tag}`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }, { stream: s3 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n await store.commit<CounterEvents>(\n s3,\n [inc(1)],\n make_meta({ stream: s3 })\n );\n // Block all three.\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const blockable: BlockedLease[] = leased\n .filter((l) => l.stream === s1 || l.stream === s2 || l.stream === s3)\n .map((l) => ({ ...(l as Lease), error: \"boom\" }));\n // Ack any other leases the test fixture's shared store left\n // outstanding so they don't pollute counts below.\n await store.ack(\n leased.filter(\n (l) => !(l.stream === s1 || l.stream === s2 || l.stream === s3)\n )\n );\n await store.block(blockable);\n\n // Filter targets only `unblock-filter-${tag}-` prefix → 2 of 3.\n const count = await store.unblock({\n stream: `^unblock-filter-${tag}-`,\n });\n expect(count).toBe(2);\n\n // s3 is still blocked.\n const after = await store.claim(100, 0, `w-${uid()}`, 100_000);\n expect(after.find((l) => l.stream === s3)).toBeUndefined();\n // s1 and s2 are unblocked and claimable.\n expect(after.find((l) => l.stream === s1)).toBeDefined();\n expect(after.find((l) => l.stream === s2)).toBeDefined();\n });\n\n it(\"filter form: empty filter unblocks every blocked stream\", async () => {\n // Set up an isolated set of blocked streams using a unique tag,\n // then assert the filter unblocks every one. We can't use the\n // truly empty filter `{}` across the shared TCK fixture because\n // other tests may leave blocked rows behind; use the tag as a\n // narrow proxy for \"everything in my scope.\"\n const tag = uid();\n const s1 = `unblock-empty-${tag}-a`;\n const s2 = `unblock-empty-${tag}-b`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.filter((l) => l.stream === s1 || l.stream === s2);\n await store.ack(leased.filter((l) => !mine.includes(l)));\n await store.block(\n mine.map((l) => ({ ...(l as Lease), error: \"boom\" }))\n );\n const count = await store.unblock({\n stream: `^unblock-empty-${tag}-`,\n });\n expect(count).toBe(2);\n });\n\n it(\"filter form: explicit blocked:false matches nothing\", async () => {\n // The implementation forces `blocked = true` regardless of what\n // the caller passed — operators can't accidentally \"unblock\"\n // already-unblocked streams.\n const tag = uid();\n const s = `unblock-blocked-false-${tag}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Stream is registered but not blocked.\n expect(\n await store.unblock({\n stream: `^unblock-blocked-false-${tag}`,\n blocked: false,\n })\n ).toBe(0);\n });\n });\n\n describe(\"reset filter form\", () => {\n it(\"resets streams matching a stream pattern\", async () => {\n const tag = uid();\n const s1 = `reset-filter-${tag}-a`;\n const s2 = `reset-filter-${tag}-b`;\n const other = `other-reset-${tag}`;\n await store.subscribe([\n { stream: s1 },\n { stream: s2 },\n { stream: other },\n ]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n await store.commit<CounterEvents>(\n other,\n [inc(1)],\n make_meta({ stream: other })\n );\n // Advance watermarks for all three so the reset is observable.\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.filter(\n (l) => l.stream === s1 || l.stream === s2 || l.stream === other\n );\n await store.ack(mine.map((l) => ({ ...(l as Lease), at: l.at + 100 })));\n\n // Filter targets only `reset-filter-${tag}-` prefix → 2 of 3.\n const count = await store.reset({ stream: `^reset-filter-${tag}-` });\n expect(count).toBe(2);\n\n // Inspect via query_streams (doesn't lease, no regex alternation\n // assumptions on SQLite's LIKE-pattern path) — fetch each name\n // by exact match and check the watermark independently.\n const position_for = async (name: string): Promise<number | null> => {\n let at: number | null = null;\n await store.query_streams(\n (p) => {\n at = p.at;\n },\n { stream: name, stream_exact: true, limit: 1 }\n );\n return at;\n };\n expect(await position_for(s1)).toBe(-1);\n expect(await position_for(s2)).toBe(-1);\n expect(await position_for(other)).toBeGreaterThan(-1);\n });\n\n it(\"filter form: resets only blocked streams when blocked:true\", async () => {\n const tag = uid();\n const s1 = `reset-blocked-${tag}-blocked`;\n const s2 = `reset-blocked-${tag}-fine`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m1 = leased.find((l) => l.stream === s1);\n await store.ack(leased.filter((l) => l.stream !== s1));\n await store.block([{ ...(m1 as Lease), error: \"boom\" }]);\n\n const count = await store.reset({\n stream: `^reset-blocked-${tag}-`,\n blocked: true,\n });\n expect(count).toBe(1);\n });\n });\n\n describe(\"prioritize\", () => {\n it(\"sets priority directly, overriding subscribe's max() rule\", async () => {\n const tag = uid();\n const s1 = `pri-${tag}-a`;\n const s2 = `pri-${tag}-b`;\n await store.subscribe([\n { stream: s1, priority: 5 },\n { stream: s2, priority: 5 },\n ]);\n const updated = await store.prioritize(\n { stream: s1, stream_exact: true },\n 3\n );\n expect(updated).toBe(1);\n const got1: { priority?: number } = {};\n const got2: { priority?: number } = {};\n await store.query_streams(\n (p) => {\n if (p.stream === s1) got1.priority = p.priority;\n if (p.stream === s2) got2.priority = p.priority;\n },\n { stream: `pri-${tag}-.*`, limit: 100 }\n );\n expect(got1.priority).toBe(3);\n expect(got2.priority).toBe(5);\n });\n });\n\n // ACT-1103: drain lanes. The Store contract now carries lane on\n // every persisted-and-returned stream surface. Adapters that\n // haven't migrated will fail these cases — the signal is\n // intentional (\"the contract changed, your adapter needs to\n // surface lane\"). Lane mutability across subscribe calls is the\n // load-bearing case: the builder config wins on every restart, so\n // operators can move a stream by editing config and restarting\n // without a manual data migration.\n describe(\"lanes\", () => {\n it(\"subscribe defaults lane to 'default' when omitted\", async () => {\n const s = `lane-default-${uid()}`;\n await store.subscribe([{ stream: s }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.lane as string), {\n stream: s,\n stream_exact: true,\n });\n expect(seen).toEqual([\"default\"]);\n });\n\n it(\"subscribe records the lane passed in\", async () => {\n const s = `lane-set-${uid()}`;\n await store.subscribe([{ stream: s, lane: \"slow\" }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.lane as string), {\n stream: s,\n stream_exact: true,\n });\n expect(seen).toEqual([\"slow\"]);\n });\n\n it(\"subscribe re-lanes existing streams on subsequent calls\", async () => {\n const s = `lane-upsert-${uid()}`;\n await store.subscribe([{ stream: s, lane: \"slow\" }]);\n await store.subscribe([{ stream: s, lane: \"fast\" }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.lane as string), {\n stream: s,\n stream_exact: true,\n });\n expect(seen).toEqual([\"fast\"]);\n });\n\n it(\"claim() filters by lane when supplied and returns lane on the Lease\", async () => {\n const tag = uid();\n const src1 = `lane-claim-src1-${tag}`;\n const src2 = `lane-claim-src2-${tag}`;\n const sub_default = `lane-claim-def-${tag}`;\n const sub_slow = `lane-claim-slow-${tag}`;\n await store.commit<CounterEvents>(\n src1,\n [inc(1)],\n make_meta({ stream: src1 })\n );\n await store.commit<CounterEvents>(\n src2,\n [inc(1)],\n make_meta({ stream: src2 })\n );\n await store.subscribe([\n { stream: sub_default, source: src1 },\n { stream: sub_slow, source: src2, lane: \"slow\" },\n ]);\n\n const slow = await store.claim(50, 0, `w-slow-${tag}`, 1_000, \"slow\");\n const slow_mine = slow.filter(\n (l) => l.stream === sub_default || l.stream === sub_slow\n );\n expect(slow_mine.map((l) => l.stream)).toEqual([sub_slow]);\n expect(slow_mine[0]?.lane).toBe(\"slow\");\n await store.ack(slow_mine.map((l) => ({ ...l, at: l.at + 1 })));\n\n const all = await store.claim(50, 0, `w-all-${tag}`, 1_000);\n const all_mine = all\n .filter((l) => l.stream === sub_default || l.stream === sub_slow)\n .map((l) => ({ stream: l.stream, lane: l.lane }));\n expect(all_mine).toEqual(\n expect.arrayContaining([\n { stream: sub_default, lane: \"default\" },\n { stream: sub_slow, lane: \"slow\" },\n ])\n );\n });\n\n it(\"query_streams filters by lane\", async () => {\n const tag = uid();\n const a = `lane-q-a-${tag}`;\n const b = `lane-q-b-${tag}`;\n const c = `lane-q-c-${tag}`;\n await store.subscribe([\n { stream: a, lane: \"qslow\" },\n { stream: b, lane: \"qfast\" },\n { stream: c, lane: \"qslow\" },\n ]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n lane: \"qslow\",\n stream: `lane-q-.*-${tag}`,\n limit: 100,\n });\n expect(seen.sort()).toEqual([a, c]);\n });\n\n it(\"prioritize filters by lane\", async () => {\n const tag = uid();\n const a = `lane-pri-a-${tag}`;\n const b = `lane-pri-b-${tag}`;\n await store.subscribe([\n { stream: a, lane: `pslow-${tag}` },\n { stream: b, lane: `pfast-${tag}` },\n ]);\n const updated = await store.prioritize({ lane: `pslow-${tag}` }, 7);\n expect(updated).toBe(1);\n const seen = new Map<string, number>();\n await store.query_streams((p) => seen.set(p.stream, p.priority), {\n stream: `lane-pri-.*-${tag}`,\n limit: 100,\n });\n expect(seen.get(a)).toBe(7);\n expect(seen.get(b)).toBe(0);\n });\n\n it(\"reset filters by lane\", async () => {\n const tag = uid();\n const src = `lane-reset-src-${tag}`;\n const a = `lane-reset-a-${tag}`;\n const b = `lane-reset-b-${tag}`;\n await store.commit<CounterEvents>(\n src,\n [inc(1)],\n make_meta({ stream: src })\n );\n await store.subscribe([\n { stream: a, source: src, lane: `rslow-${tag}` },\n { stream: b, source: src, lane: `rfast-${tag}` },\n ]);\n const leases = await store.claim(50, 0, `w-${tag}`, 5_000);\n const mine = leases.filter((l) => l.stream === a || l.stream === b);\n await store.ack(mine.map((l) => ({ ...l, at: l.at + 1 })));\n\n const count = await store.reset({ lane: `rslow-${tag}` });\n expect(count).toBe(1);\n // Fetch each stream by exact match — keeps the contract test\n // adapter-agnostic (PG `~` and SQLite anchor-aware LIKE both\n // honor `stream_exact: true` identically).\n const ats = new Map<string, number>();\n for (const name of [a, b]) {\n await store.query_streams((p) => ats.set(p.stream, p.at), {\n stream: name,\n stream_exact: true,\n });\n }\n expect(ats.get(a)).toBe(-1);\n expect(ats.get(b)).toBeGreaterThanOrEqual(0);\n });\n\n it(\"unblock filters by lane\", async () => {\n const tag = uid();\n const src = `lane-ub-src-${tag}`;\n const a = `lane-ub-a-${tag}`;\n const b = `lane-ub-b-${tag}`;\n await store.commit<CounterEvents>(\n src,\n [inc(1)],\n make_meta({ stream: src })\n );\n await store.subscribe([\n { stream: a, source: src, lane: `uslow-${tag}` },\n { stream: b, source: src, lane: `ufast-${tag}` },\n ]);\n const leases = await store.claim(50, 0, `w-${tag}`, 5_000);\n const mine = leases.filter((l) => l.stream === a || l.stream === b);\n await store.block(mine.map((l) => ({ ...l, error: \"boom\" })));\n\n const count = await store.unblock({ lane: `uslow-${tag}` });\n expect(count).toBe(1);\n const blocked = new Map<string, boolean>();\n for (const name of [a, b]) {\n await store.query_streams((p) => blocked.set(p.stream, p.blocked), {\n stream: name,\n stream_exact: true,\n });\n }\n expect(blocked.get(a)).toBe(false);\n expect(blocked.get(b)).toBe(true);\n });\n });\n\n describe(\"truncate\", () => {\n it(\"seeds a tombstone when no snapshot is provided\", async () => {\n const s = `trunc-tomb-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2)],\n make_meta({ stream: s })\n );\n const result = await store.truncate([{ stream: s }]);\n expect(result.get(s)?.deleted).toBe(2);\n const remaining: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n remaining.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(remaining).toHaveLength(1);\n expect((remaining[0] as unknown as { name: string }).name).toBe(\n \"__tombstone__\"\n );\n });\n\n it(\"seeds a snapshot when one is provided\", async () => {\n const s = `trunc-snap-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const result = await store.truncate([\n { stream: s, snapshot: { count: 7 } },\n ]);\n expect(result.get(s)?.deleted).toBe(1);\n const remaining: CommittedCounterEvent[] = [];\n await store.query<CounterEvents>(\n (e) => {\n remaining.push(e as CommittedCounterEvent);\n },\n { stream: s, stream_exact: true, with_snaps: true }\n );\n expect(remaining).toHaveLength(1);\n expect((remaining[0] as unknown as { name: string }).name).toBe(\n \"__snapshot__\"\n );\n expect(remaining[0].data).toEqual({ count: 7 });\n });\n\n it(\"returns an empty map for empty input\", async () => {\n const result = await store.truncate([]);\n expect(result.size).toBe(0);\n });\n\n it(\"returns 0 deleted for streams that don't exist\", async () => {\n const s = `trunc-missing-${uid()}`;\n const result = await store.truncate([{ stream: s }]);\n expect(result.get(s)?.deleted).toBe(0);\n });\n\n // Windowed truncation (#1011): a `before` boundary prunes the\n // prefix below the closest safe `__snapshot__` — a pure prefix\n // delete behind a real snapshot; no seed, no tombstone.\n describe(\"windowed (before boundary)\", () => {\n // Layout: inc, inc, snapA{2}, inc, snapB{3}, inc — returns the\n // stream name plus the two snapshot events for boundary asserts.\n async function seed_windowed(s: string) {\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n const [snap_a] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const [snap_b] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 3 } }],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n return { snap_a, snap_b };\n }\n\n it(\"deletes the prefix below the closest safe snapshot and keeps the snapshot + tail\", async () => {\n const s = `trunc-win-${uid()}`;\n const { snap_b } = await seed_windowed(s);\n const before = new Date(Date.now() + 60_000);\n const result = await store.truncate([{ stream: s, before }]);\n const entry = result.get(s);\n // 4 events below snapB: inc, inc, snapA, inc\n expect(entry?.deleted).toBe(4);\n // committed is the SURVIVING boundary snapshot, not a new seed\n expect(entry?.committed.id).toBe(snap_b.id);\n expect(entry?.committed.name).toBe(SNAP_EVENT);\n expect(entry?.committed.data).toEqual({ count: 3 });\n // windowed entries echo the boundary\n expect(entry?.before).toEqual(before);\n const remaining = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: -1,\n });\n expect(remaining.map((e) => e.name)).toEqual([\n SNAP_EVENT,\n \"Incremented\",\n ]);\n expect(remaining[0].id).toBe(snap_b.id);\n });\n\n it(\"honors the max_id cap — boundary never rises past a lagging consumer\", async () => {\n const s = `trunc-win-cap-${uid()}`;\n const { snap_a, snap_b } = await seed_windowed(s);\n const before = new Date(Date.now() + 60_000);\n const result = await store.truncate([\n { stream: s, before, max_id: snap_a.id },\n ]);\n const entry = result.get(s);\n // snapB is newer but above the cap — snapA is the closest safe\n expect(entry?.committed.id).toBe(snap_a.id);\n expect(entry?.deleted).toBe(2);\n const remaining = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: -1,\n });\n expect(remaining.map((e) => e.id)).toContain(snap_b.id);\n expect(remaining[0].id).toBe(snap_a.id);\n expect(remaining).toHaveLength(4);\n });\n\n it(\"no-ops when no snapshot qualifies — stream absent from the result, events untouched\", async () => {\n const s = `trunc-win-noop-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n // no snapshot at all\n const none = await store.truncate([\n { stream: s, before: new Date(Date.now() + 60_000) },\n ]);\n expect(none.has(s)).toBe(false);\n // snapshot exists but the cutoff predates it\n await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n const too_early = await store.truncate([\n { stream: s, before: new Date(0) },\n ]);\n expect(too_early.has(s)).toBe(false);\n // missing stream no-ops too\n const missing = await store.truncate([\n { stream: `trunc-win-missing-${uid()}`, before: new Date() },\n ]);\n expect(missing.size).toBe(0);\n const remaining = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: -1,\n });\n expect(remaining).toHaveLength(3);\n });\n\n it(\"leaves subscriptions untouched, unlike a full truncate\", async () => {\n const s = `trunc-win-subs-${uid()}`;\n await seed_windowed(s);\n await store.subscribe([{ stream: s }]);\n await store.truncate([\n { stream: s, before: new Date(Date.now() + 60_000) },\n ]);\n const positions: string[] = [];\n await store.query_streams((p) => positions.push(p.stream), {\n stream: s,\n stream_exact: true,\n });\n expect(positions).toEqual([s]);\n });\n\n it(\"mixes full and windowed targets in one call\", async () => {\n const w = `trunc-win-mix-w-${uid()}`;\n const f = `trunc-win-mix-f-${uid()}`;\n const { snap_b } = await seed_windowed(w);\n await store.commit<CounterEvents>(\n f,\n [inc(1)],\n make_meta({ stream: f })\n );\n const result = await store.truncate([\n { stream: w, before: new Date(Date.now() + 60_000) },\n { stream: f },\n ]);\n expect(result.get(w)?.committed.id).toBe(snap_b.id);\n expect(result.get(w)?.before).toBeInstanceOf(Date);\n expect(result.get(f)?.deleted).toBe(1);\n expect(result.get(f)?.committed.name).toBe(\"__tombstone__\");\n expect(result.get(f)?.before).toBeUndefined();\n });\n\n it(\"keeps the stream writable and readable after a prune\", async () => {\n const s = `trunc-win-cont-${uid()}`;\n const { snap_b } = await seed_windowed(s);\n await store.truncate([\n { stream: s, before: new Date(Date.now() + 60_000) },\n ]);\n // versions continue from the surviving tail; ids never reuse\n // a pruned id\n const [next] = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n expect(next.version).toBe(6);\n expect(next.id).toBeGreaterThan(snap_b.id);\n // with_snaps replay anchors on the surviving boundary snapshot\n const replay = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(replay[0].id).toBe(snap_b.id);\n expect(replay).toHaveLength(3);\n });\n });\n });\n\n describe(\"query_streams\", () => {\n it(\"returns positions filtered by stream regex, exact, source, and source_exact\", async () => {\n const tag = uid();\n const proj1 = `qs-${tag}-projection-tickets`;\n const proj2 = `qs-${tag}-projection-users`;\n const dyn1 = `qs-${tag}-stats-1`;\n const dyn2 = `qs-${tag}-stats-2`;\n const src1 = `qs-${tag}-src-1`;\n const src2 = `qs-${tag}-src-2`;\n await store.subscribe([\n { stream: proj1 },\n { stream: proj2 },\n { stream: dyn1, source: src1 },\n { stream: dyn2, source: src2 },\n ]);\n\n const all: Array<{ stream: string; source?: string }> = [];\n const all_result = await store.query_streams(\n (p) => all.push({ stream: p.stream, source: p.source }),\n { stream: `qs-${tag}-.*` }\n );\n expect(all_result.count).toBe(4);\n expect(all_result.maxEventId).toBeGreaterThanOrEqual(-1);\n expect(all.map((p) => p.stream).sort()).toEqual(\n [proj1, proj2, dyn1, dyn2].sort()\n );\n\n const projections: string[] = [];\n await store.query_streams((p) => projections.push(p.stream), {\n stream: `qs-${tag}-projection-.*`,\n });\n expect(projections.sort()).toEqual([proj1, proj2].sort());\n\n const exact: string[] = [];\n await store.query_streams((p) => exact.push(p.stream), {\n stream: dyn1,\n stream_exact: true,\n });\n expect(exact).toEqual([dyn1]);\n\n const by_source: string[] = [];\n await store.query_streams((p) => by_source.push(p.stream), {\n stream: `qs-${tag}-.*`,\n source: `qs-${tag}-src-.*`,\n });\n expect(by_source.sort()).toEqual([dyn1, dyn2].sort());\n\n const exact_source: string[] = [];\n await store.query_streams((p) => exact_source.push(p.stream), {\n stream: `qs-${tag}-.*`,\n source: src2,\n source_exact: true,\n });\n expect(exact_source).toEqual([dyn2]);\n });\n\n it(\"paginates with limit + after (keyset)\", async () => {\n const tag = uid();\n const streams = [\n `qp-${tag}-a`,\n `qp-${tag}-b`,\n `qp-${tag}-c`,\n `qp-${tag}-d`,\n ];\n await store.subscribe(streams.map((stream) => ({ stream })));\n const page1: string[] = [];\n await store.query_streams((p) => page1.push(p.stream), {\n stream: `qp-${tag}-.*`,\n limit: 2,\n });\n expect(page1).toHaveLength(2);\n const page2: string[] = [];\n await store.query_streams((p) => page2.push(p.stream), {\n stream: `qp-${tag}-.*`,\n limit: 2,\n after: page1.at(-1),\n });\n expect(page2).toHaveLength(2);\n expect([...page1, ...page2].sort()).toEqual([...streams].sort());\n });\n\n it(\"filters by blocked status\", async () => {\n const tag = uid();\n const s = `qb-${tag}`;\n const sibling = `qb-${tag}-other`;\n await store.subscribe([{ stream: s }, { stream: sibling }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n await store.block([{ ...(mine as Lease), error: \"boom\" }]);\n\n const blocked: Array<{ stream: string; error: string }> = [];\n await store.query_streams(\n (p) => blocked.push({ stream: p.stream, error: p.error }),\n { stream: `qb-${tag}.*`, blocked: true }\n );\n expect(blocked).toHaveLength(1);\n expect(blocked[0].error).toBe(\"boom\");\n\n // blocked: false — must exclude the blocked one but include\n // the sibling, exercising the other arm of the conditional.\n const unblocked: string[] = [];\n await store.query_streams((p) => unblocked.push(p.stream), {\n stream: `qb-${tag}.*`,\n blocked: false,\n });\n expect(unblocked).toEqual([sibling]);\n });\n });\n\n describe(\"query_stats\", () => {\n it(\"array input — returns head per stream, absent when not in input\", async () => {\n const tag = uid();\n const sA = `qst-${tag}-a`;\n const sB = `qst-${tag}-b`;\n const sUnasked = `qst-${tag}-unasked`;\n await store.commit<CounterEvents>(\n sA,\n [inc(1), inc(2)],\n make_meta({ stream: sA })\n );\n await store.commit<CounterEvents>(\n sB,\n [dec(5)],\n make_meta({ stream: sB })\n );\n await store.commit<CounterEvents>(\n sUnasked,\n [inc(99)],\n make_meta({ stream: sUnasked })\n );\n\n const stats = await store.query_stats<CounterEvents>([sA, sB]);\n expect(stats.size).toBe(2);\n expect(stats.get(sA)?.head.name).toBe(\"Incremented\");\n expect((stats.get(sA)?.head.data as { amount: number }).amount).toBe(2);\n expect(stats.get(sB)?.head.name).toBe(\"Decremented\");\n expect((stats.get(sB)?.head.data as { amount: number }).amount).toBe(5);\n expect(stats.has(sUnasked)).toBe(false);\n\n // Empty input — empty result.\n const empty = await store.query_stats([]);\n expect(empty.size).toBe(0);\n\n // Unknown stream name — absent, not an error.\n const unknown = await store.query_stats([`qst-${tag}-missing`]);\n expect(unknown.size).toBe(0);\n });\n\n it(\"tail returns the earliest event per stream\", async () => {\n const tag = uid();\n const s = `qst-tail-${tag}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(2)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(3)],\n make_meta({ stream: s })\n );\n\n const stats = await store.query_stats<CounterEvents>([s], {\n tail: true,\n });\n const r = stats.get(s);\n expect(r?.head.name).toBe(\"Incremented\");\n expect((r?.head.data as { amount: number }).amount).toBe(3);\n expect(r?.tail?.name).toBe(\"Incremented\");\n expect((r?.tail?.data as { amount: number }).amount).toBe(1);\n });\n\n it(\"count + names — full aggregates including framework markers\", async () => {\n const tag = uid();\n const s = `qst-cn-${tag}`;\n // 1 inc, then truncate (wipes + seeds snap), then 2 more incs + 1 dec\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.truncate([{ stream: s, snapshot: { count: 99 } }]);\n await store.commit<CounterEvents>(\n s,\n [inc(2), inc(3), dec(1)],\n make_meta({ stream: s })\n );\n\n const stats = await store.query_stats<CounterEvents>([s], {\n count: true,\n names: true,\n });\n const r = stats.get(s);\n // Post-truncate live events: snap + inc + inc + dec = 4\n expect(r?.count).toBe(4);\n expect(r?.names?.[SNAP_EVENT]).toBe(1);\n expect(r?.names?.Incremented).toBe(2);\n expect(r?.names?.Decremented).toBe(1);\n // Snapshot count is derivable from the names map — no separate field needed.\n expect(r?.names?.[SNAP_EVENT]).toBe(1);\n });\n\n it(\"exclude shifts head past filtered events; stream absent when all filtered\", async () => {\n const tag = uid();\n const s = `qst-excl-${tag}`;\n const sAllOut = `qst-allout-${tag}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), dec(2), inc(3)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n sAllOut,\n [inc(7)],\n make_meta({ stream: sAllOut })\n );\n\n // Without exclude — head is the latest Incremented.\n const all = await store.query_stats<CounterEvents>([s]);\n expect(all.get(s)?.head.name).toBe(\"Incremented\");\n expect((all.get(s)?.head.data as { amount: number }).amount).toBe(3);\n\n // Exclude Incremented — head is now Decremented (the next-latest).\n const excl = await store.query_stats<CounterEvents>([s], {\n exclude: [\"Incremented\"],\n });\n expect(excl.get(s)?.head.name).toBe(\"Decremented\");\n expect((excl.get(s)?.head.data as { amount: number }).amount).toBe(2);\n\n // Exclude every name on a stream — that stream is absent from result.\n const wipe = await store.query_stats<CounterEvents>([sAllOut], {\n exclude: [\"Incremented\", \"Decremented\", \"Reset\"],\n });\n expect(wipe.has(sAllOut)).toBe(false);\n\n // Framework markers are typed in EventName<E> too — close-cycle pattern.\n const no_tomb = await store.query_stats<CounterEvents>([s], {\n exclude: [TOMBSTONE_EVENT],\n });\n expect(no_tomb.get(s)?.head.name).toBe(\"Incremented\");\n });\n\n it(\"before — time travel narrows head/tail/count\", async () => {\n const tag = uid();\n const s = `qst-tt-${tag}`;\n const c1 = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const c2 = await store.commit<CounterEvents>(\n s,\n [inc(2)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(3)],\n make_meta({ stream: s })\n );\n\n // Cutoff at id of c2's event — only c1's event is < cutoff\n const before = c2[0].id;\n const stats = await store.query_stats<CounterEvents>([s], {\n tail: true,\n count: true,\n before,\n });\n const r = stats.get(s);\n expect(r?.count).toBe(1);\n expect(r?.head.id).toBe(c1[0].id);\n expect(r?.tail?.id).toBe(c1[0].id);\n\n // Cutoff before any event — stream absent\n const empty = await store.query_stats<CounterEvents>([s], {\n before: 0,\n });\n expect(empty.has(s)).toBe(false);\n });\n\n it(\"filter form — stream regex, stream_exact, empty {} match\", async () => {\n const tag = uid();\n const sA = `qsf-${tag}-orders-1`;\n const sB = `qsf-${tag}-orders-2`;\n const sOther = `qsf-${tag}-users-1`;\n await store.commit<CounterEvents>(\n sA,\n [inc(1)],\n make_meta({ stream: sA })\n );\n await store.commit<CounterEvents>(\n sB,\n [inc(2)],\n make_meta({ stream: sB })\n );\n await store.commit<CounterEvents>(\n sOther,\n [inc(3)],\n make_meta({ stream: sOther })\n );\n\n // Regex match — restrict to this tag's orders.\n const orders = await store.query_stats<CounterEvents>({\n stream: `^qsf-${tag}-orders-`,\n });\n expect([...orders.keys()].sort()).toEqual([sA, sB].sort());\n\n // Exact match — single stream.\n const exact = await store.query_stats<CounterEvents>({\n stream: sA,\n stream_exact: true,\n });\n expect([...exact.keys()]).toEqual([sA]);\n\n // Empty filter — matches every event-bearing stream visible to\n // this test's tag (filtered down to avoid sibling-test pollution).\n const all = await store.query_stats<CounterEvents>({\n stream: `^qsf-${tag}-`,\n });\n expect([...all.keys()].sort()).toEqual([sA, sB, sOther].sort());\n });\n\n it(\"compose with query_streams for subscription-level filters\", async () => {\n // `query_stats` only accepts event-stream selection. For\n // \"stats for blocked subscriptions\" etc., compose with\n // `query_streams` and pipe the names through. This test asserts\n // that two-call pattern works end-to-end.\n const tag = uid();\n const a = `qsc-${tag}-a`;\n const b = `qsc-${tag}-b`;\n await store.subscribe([{ stream: a }, { stream: b }]);\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [inc(2)],\n make_meta({ stream: b })\n );\n\n // Block stream `a` via the standard claim → block path.\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === a);\n expect(mine).toBeDefined();\n const others = leased.filter((l) => l.stream !== a);\n await store.ack(others);\n await store.block([{ ...(mine as Lease), error: \"boom\" }]);\n\n // Step 1: subscription-level filter via query_streams.\n const blocked_names: string[] = [];\n await store.query_streams((p) => blocked_names.push(p.stream), {\n stream: `^qsc-${tag}-`,\n blocked: true,\n });\n expect(blocked_names).toEqual([a]);\n\n // Step 2: event-level stats for those streams.\n const stats = await store.query_stats<CounterEvents>(blocked_names);\n expect(stats.get(a)?.head.name).toBe(\"Incremented\");\n expect(stats.has(b)).toBe(false);\n });\n\n it(\"empty filter {} — matches every event-bearing stream\", async () => {\n const tag = uid();\n const a = `qse-${tag}-a`;\n const b = `qse-${tag}-b`;\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [dec(2)],\n make_meta({ stream: b })\n );\n\n // {} matches all event-bearing streams globally — the TCK runs\n // against a shared store, so we only assert that this tag's\n // streams are present (other tests' streams may also appear).\n const all = await store.query_stats<CounterEvents>({});\n expect(all.has(a)).toBe(true);\n expect(all.has(b)).toBe(true);\n });\n\n it(\"stat-flag combinations — count-only, names-only, tail-only\", async () => {\n const tag = uid();\n const s = `qsfl-${tag}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), dec(3)],\n make_meta({ stream: s })\n );\n\n // count only → no names, no tail in result.\n const c = await store.query_stats<CounterEvents>([s], {\n count: true,\n });\n expect(c.get(s)?.count).toBe(3);\n expect(c.get(s)?.names).toBeUndefined();\n expect(c.get(s)?.tail).toBeUndefined();\n\n // names only → no count, no tail.\n const n = await store.query_stats<CounterEvents>([s], {\n names: true,\n });\n expect(n.get(s)?.names).toEqual({ Incremented: 2, Decremented: 1 });\n expect(n.get(s)?.count).toBeUndefined();\n expect(n.get(s)?.tail).toBeUndefined();\n\n // tail only → no count, no names. Cheap path (no full scan).\n const t = await store.query_stats<CounterEvents>([s], { tail: true });\n expect(t.get(s)?.tail?.name).toBe(\"Incremented\");\n expect((t.get(s)?.tail?.data as { amount: number }).amount).toBe(1);\n expect(t.get(s)?.count).toBeUndefined();\n expect(t.get(s)?.names).toBeUndefined();\n });\n\n it(\"paginates with limit + after (keyset), ordered by stream name\", async () => {\n const tag = uid();\n const streams = [\n `qsp-${tag}-a`,\n `qsp-${tag}-b`,\n `qsp-${tag}-c`,\n `qsp-${tag}-d`,\n ];\n for (const s of streams) {\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n }\n\n const page1 = await store.query_stats<CounterEvents>(\n { stream: `qsp-${tag}-.*` },\n { limit: 2 }\n );\n const k1 = [...page1.keys()];\n expect(k1).toEqual([`qsp-${tag}-a`, `qsp-${tag}-b`]);\n\n const page2 = await store.query_stats<CounterEvents>(\n { stream: `qsp-${tag}-.*` },\n { limit: 2, after: k1.at(-1) }\n );\n const k2 = [...page2.keys()];\n expect(k2).toEqual([`qsp-${tag}-c`, `qsp-${tag}-d`]);\n\n // Final short page signals the end.\n const page3 = await store.query_stats<CounterEvents>(\n { stream: `qsp-${tag}-.*` },\n { limit: 2, after: k2.at(-1) }\n );\n expect(page3.size).toBe(0);\n\n // Unbounded (no limit) returns every matching stream in one call.\n const all = await store.query_stats<CounterEvents>({\n stream: `qsp-${tag}-.*`,\n });\n expect([...all.keys()].sort()).toEqual([...streams].sort());\n });\n });\n\n // Reverse-match probe filter (#1010): restrict to subscriptions whose\n // stored `source` pattern matches at least one of the supplied names.\n // Gated — stores that can't express reverse-regex omit it and callers\n // fall back to an unfiltered scan.\n describe.skipIf(!caps.source_matches)(\n \"query_streams source_matches (capability)\",\n () => {\n it(\"returns only subscriptions whose source pattern matches a name\", async () => {\n const tag = uid();\n // Two dynamic subscriptions with concrete sources, one with a\n // regex source matching a family of streams.\n const subConcreteA = `sm-${tag}-sub-a`;\n const subConcreteB = `sm-${tag}-sub-b`;\n const subRegex = `sm-${tag}-sub-regex`;\n const subNoSource = `sm-${tag}-sub-nosource`;\n const srcA = `sm-${tag}-order-1`;\n const srcB = `sm-${tag}-order-2`;\n const srcRegex = `^sm-${tag}-order-`;\n await store.subscribe([\n { stream: subConcreteA, source: srcA },\n { stream: subConcreteB, source: srcB },\n { stream: subRegex, source: srcRegex },\n // No source = no source constraint = matches every name.\n { stream: subNoSource },\n ]);\n\n // Closing srcA: the concrete-A sub (source === srcA), the regex\n // sub (source matches srcA), and the no-source sub (always)\n // qualify; concrete-B does not.\n const matched: string[] = [];\n await store.query_streams((p) => matched.push(p.stream), {\n stream: `sm-${tag}-sub-.*`,\n source_matches: [srcA],\n });\n expect(matched.sort()).toEqual(\n [subConcreteA, subRegex, subNoSource].sort()\n );\n\n // A name no concrete/regex source matches → only the\n // no-source sub (which always qualifies) comes back.\n const none: string[] = [];\n await store.query_streams((p) => none.push(p.stream), {\n stream: `sm-${tag}-sub-.*`,\n source_matches: [`sm-${tag}-unrelated`],\n });\n expect(none).toEqual([subNoSource]);\n\n // Multiple names → union of matching subscriptions, plus the\n // always-matching no-source sub.\n const both: string[] = [];\n await store.query_streams((p) => both.push(p.stream), {\n stream: `sm-${tag}-sub-.*`,\n source_matches: [srcA, srcB],\n });\n expect(both.sort()).toEqual(\n [subConcreteA, subConcreteB, subRegex, subNoSource].sort()\n );\n });\n }\n );\n\n describe(\"query_streams anchor contract\", () => {\n // Same regex-anchor rules as `query`. Auto-anchoring by an adapter\n // is a contract violation — every store must honor caller-supplied\n // anchors identically.\n it(\"plain regex without anchors is a substring match\", async () => {\n const tag = uid();\n const inner = `qsr-${tag}-inner`;\n const longer = `qsr-${tag}-inner-extra`;\n const other = `zz-${tag}-other`;\n await store.subscribe([\n { stream: inner },\n { stream: longer },\n { stream: other },\n ]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n stream: `qsr-${tag}-inner`,\n });\n expect(seen.sort()).toEqual([inner, longer].sort());\n });\n\n it(\"caller-anchored `^name$` matches only the whole string\", async () => {\n const tag = uid();\n const inner = `qsr-${tag}-anchor`;\n const longer = `qsr-${tag}-anchor-extra`;\n await store.subscribe([{ stream: inner }, { stream: longer }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n stream: `^qsr-${tag}-anchor$`,\n });\n expect(seen).toEqual([inner]);\n });\n\n it(\"caller-anchored `^prefix` matches by prefix\", async () => {\n const tag = uid();\n const a = `qsr-${tag}-pfx-a`;\n const b = `qsr-${tag}-pfx-b`;\n const other = `zz-${tag}-pfx-c`;\n await store.subscribe([\n { stream: a },\n { stream: b },\n { stream: other },\n ]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n stream: `^qsr-${tag}-pfx-`,\n });\n expect(seen.sort()).toEqual([a, b].sort());\n });\n });\n\n describe(\"prioritize anchor contract\", () => {\n it(\"caller-anchored `^name$` filter matches only the whole string\", async () => {\n const tag = uid();\n const inner = `pr-${tag}-anchor`;\n const longer = `pr-${tag}-anchor-extra`;\n await store.subscribe([\n { stream: inner, priority: 0 },\n { stream: longer, priority: 0 },\n ]);\n const updated = await store.prioritize(\n { stream: `^pr-${tag}-anchor$` },\n 7\n );\n expect(updated).toBe(1);\n const seen = new Map<string, number>();\n await store.query_streams((p) => seen.set(p.stream, p.priority), {\n stream: `pr-${tag}-anchor`,\n });\n expect(seen.get(inner)).toBe(7);\n expect(seen.get(longer)).toBe(0);\n });\n });\n\n describe(\"query_streams head\", () => {\n it(\"maxEventId tracks the highest committed id\", async () => {\n const s = `head-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const positions: string[] = [];\n const { maxEventId } = await store.query_streams(\n (p) => positions.push(p.stream),\n { stream: s, stream_exact: true, limit: 1 }\n );\n expect(maxEventId).toBeGreaterThanOrEqual(0);\n expect(positions).toEqual([s]);\n });\n });\n\n describe(\"seed_stream helper coverage\", () => {\n it(\"commits N events with monotonically increasing ids\", async () => {\n const s = `seed-${uid()}`;\n const committed = await seed_stream(store, s, 3);\n expect(committed).toHaveLength(3);\n for (let i = 1; i < committed.length; i++) {\n expect(committed[i].id).toBeGreaterThan(committed[i - 1].id);\n }\n });\n });\n\n // Use `describe.skipIf` rather than `if (caps.restore) { describe(...) }`\n // so the gating lives inside vitest's skip mechanism instead of an\n // `if` branch every consumer would have to disprove (all three\n // in-tree adapters opt in to restore).\n describe.skipIf(!caps.restore)(\"restore (capability)\", () => {\n // Restore wipes the whole store — every test starts from a\n // freshly-dropped + seeded baseline so no test inherits\n // another's post-restore state and so subsequent TCK blocks\n // (notify) get a predictable empty store.\n beforeEach(async () => {\n await store.drop();\n await store.seed();\n });\n\n /**\n * Adapt an event array into the {@link EventSource} contract.\n * The test source's `query` walks the array and calls the\n * callback per event, exactly like a real `Store.query`. The\n * `await Promise.resolve(callback(...))` mirrors the adapter\n * pattern so async-callback backpressure stays exercised\n * even from this synthetic source.\n */\n const as_source = (\n events: Committed<Schemas, keyof Schemas>[]\n ): EventSource => ({\n async query(callback) {\n // The cast widens our concrete schema-erased event back\n // into the generic `E` slot the EventSource.query contract\n // is parametrized over. Safe — the synthetic test source\n // is intentionally schema-agnostic.\n for (const e of events)\n await Promise.resolve(\n (callback as (event: Committed<Schemas, keyof Schemas>) => void)(\n e\n )\n );\n return events.length;\n },\n async dispose() {\n // no-op — synthetic in-memory source\n },\n });\n\n /**\n * Build a {@link Committed} event with stub meta + the given\n * created date. `original_id` populates `id` — used by the\n * orchestrator's scan to key the causation remap. Tests pass\n * arbitrary values (often a counter) since they're only\n * consumed by the map.\n */\n const event = (\n original_id: number,\n stream: string,\n version: number,\n name: string,\n created: Date,\n data: Record<string, unknown> = {}\n ): Committed<Schemas, keyof Schemas> => ({\n id: original_id,\n name,\n data,\n stream,\n version,\n created,\n meta: { correlation: \"restore-tck\", causation: {} },\n });\n\n /**\n * Test-side helper that routes through the public `Act.restore`\n * orchestrator path bound to the store-under-test via the\n * scoped-ports bag. Validates that the adapter's `restore` HOF\n * integrates correctly with the framework's scan loop without\n * importing the framework's internal scan symbol directly.\n */\n const restore = async (\n source: EventSource,\n opts: ScanOptions = {}\n ): Promise<ScanResult> => {\n const cache = new InMemoryCache();\n const app = act().build({ scoped: { store, cache } });\n try {\n return await app.restore(source, opts);\n } finally {\n // Dispose the source first, then the cache — mirrors how\n // a production caller would tear down ephemeral resources.\n // Also keeps the synthetic-source `dispose` no-op\n // exercised by every test that runs `restore`.\n await source.dispose();\n await cache.dispose();\n }\n };\n\n it(\"returns kept=0 on an empty source\", async () => {\n const result = await restore(as_source([]));\n expect(result.kept).toBe(0);\n expect(result.duration_ms).toBeGreaterThanOrEqual(0);\n expect(result.dropped).toEqual({\n closed_streams: 0,\n snapshots: 0,\n });\n // Store ends empty.\n const events = await collect(store, { limit: 10 });\n expect(events).toHaveLength(0);\n });\n\n it(\"rebuilds a single stream and preserves `created` verbatim\", async () => {\n const s = `restore-single-${uid()}`;\n const t0 = new Date(\"2020-01-01T00:00:00.000Z\");\n const t1 = new Date(\"2020-01-02T00:00:00.000Z\");\n const t2 = new Date(\"2020-01-03T00:00:00.000Z\");\n const events = [\n event(1, s, 0, \"Incremented\", t0, { amount: 1 }),\n event(2, s, 1, \"Incremented\", t1, { amount: 2 }),\n event(3, s, 2, \"Decremented\", t2, { amount: 1 }),\n ];\n const result = await restore(as_source(events));\n expect(result.kept).toBe(3);\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back).toHaveLength(3);\n expect(\n back.map((e) => ({\n stream: e.stream,\n version: e.version,\n name: e.name,\n created: e.created.toISOString(),\n data: e.data,\n }))\n ).toEqual([\n {\n stream: s,\n version: 0,\n name: \"Incremented\",\n created: t0.toISOString(),\n data: { amount: 1 },\n },\n {\n stream: s,\n version: 1,\n name: \"Incremented\",\n created: t1.toISOString(),\n data: { amount: 2 },\n },\n {\n stream: s,\n version: 2,\n name: \"Decremented\",\n created: t2.toISOString(),\n data: { amount: 1 },\n },\n ]);\n });\n\n it(\"rebuilds multiple streams interleaved\", async () => {\n const a = `restore-multi-a-${uid()}`;\n const b = `restore-multi-b-${uid()}`;\n const t = new Date(\"2020-06-01T00:00:00.000Z\");\n const events = [\n event(1, a, 0, \"Incremented\", t, { amount: 10 }),\n event(2, b, 0, \"Incremented\", t, { amount: 20 }),\n event(3, a, 1, \"Decremented\", t, { amount: 5 }),\n event(4, b, 1, \"Incremented\", t, { amount: 30 }),\n ];\n const result = await restore(as_source(events));\n expect(result.kept).toBe(4);\n const aBack: Committed<CounterEvents, keyof CounterEvents>[] = [];\n const bBack: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n aBack.push(e);\n },\n { stream: a, stream_exact: true }\n );\n await store.query<CounterEvents>(\n (e) => {\n bBack.push(e);\n },\n { stream: b, stream_exact: true }\n );\n expect(aBack.map((e) => e.version)).toEqual([0, 1]);\n expect(bBack.map((e) => e.version)).toEqual([0, 1]);\n });\n\n it(\"preserves Date `created` verbatim\", async () => {\n const s = `restore-isoc-${uid()}`;\n const iso = \"2021-07-15T12:34:56.789Z\";\n await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n created: new Date(iso),\n meta: { correlation: \"restore-tck\", causation: {} },\n },\n ])\n );\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back).toHaveLength(1);\n expect(back[0].created.toISOString()).toBe(iso);\n });\n\n it(\"wipes pre-existing events before inserting\", async () => {\n const old = `restore-old-${uid()}`;\n await store.commit<CounterEvents>(\n old,\n [inc(1), inc(2)],\n make_meta({ stream: old })\n );\n const fresh = `restore-fresh-${uid()}`;\n const t = new Date(\"2020-01-01T00:00:00.000Z\");\n await restore(\n as_source([event(1, fresh, 0, \"Incremented\", t, { amount: 99 })])\n );\n // The old stream is gone.\n const old_back = await collect(store, {\n stream: old,\n stream_exact: true,\n });\n expect(old_back).toHaveLength(0);\n // Only the fresh stream remains.\n const fresh_back = await collect(store, {\n stream: fresh,\n stream_exact: true,\n });\n expect(fresh_back).toHaveLength(1);\n });\n\n it(\"clears subscription/stream-position metadata\", async () => {\n const sub = `restore-sub-${uid()}`;\n await store.subscribe([{ stream: sub, source: \"anything\" }]);\n const collect_streams = async () => {\n const out: string[] = [];\n await store.query_streams((p) => {\n out.push(p.stream);\n });\n return out;\n };\n const before = await collect_streams();\n expect(before.includes(sub)).toBe(true);\n await restore(as_source([]));\n const after = await collect_streams();\n expect(after.includes(sub)).toBe(false);\n });\n\n it(\"preserves snapshot events through restore\", async () => {\n // SNAP_EVENT is a framework marker — restore writes it\n // through but skips updating the max-non-snap-id indexes.\n // Covers the `event.name !== SNAP_EVENT` false branch.\n const s = `restore-snap-${uid()}`;\n const t = new Date(\"2020-04-01T00:00:00.000Z\");\n await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: SNAP_EVENT,\n data: { count: 42 },\n created: t,\n meta: { correlation: \"snap\", causation: {} },\n },\n ])\n );\n const back = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(back).toHaveLength(1);\n expect((back[0] as { name: string }).name).toBe(SNAP_EVENT);\n });\n\n it(\"rewrites causation refs through the old→new id map\", async () => {\n // Sparse source ids (5, 7, 9) — adapter renumbers densely;\n // the event whose causation pointed at original id 5 must end\n // up pointing at the new id assigned to that same row.\n const s = `restore-caus-${uid()}`;\n const t = new Date(\"2020-08-01T00:00:00.000Z\");\n const events: Committed<Schemas, keyof Schemas>[] = [\n {\n id: 5,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n created: t,\n meta: { correlation: \"c\", causation: {} },\n },\n {\n id: 7,\n stream: s,\n version: 1,\n name: \"Incremented\",\n data: { amount: 2 },\n created: t,\n meta: {\n correlation: \"c\",\n causation: {\n event: { id: 5, name: \"Incremented\", stream: s },\n },\n },\n },\n {\n id: 9,\n stream: s,\n version: 2,\n name: \"Decremented\",\n data: { amount: 1 },\n created: t,\n meta: {\n correlation: \"c\",\n causation: {\n event: { id: 7, name: \"Incremented\", stream: s },\n },\n },\n },\n ];\n await restore(as_source(events));\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back).toHaveLength(3);\n // First row's causation is empty.\n expect(back[0].meta.causation.event).toBeUndefined();\n // Second row's causation pointed at original id 5 → new id of row 0.\n expect(back[1].meta.causation.event?.id).toBe(back[0].id);\n // Third row's causation pointed at original id 7 → new id of row 1.\n expect(back[2].meta.causation.event?.id).toBe(back[1].id);\n });\n\n it(\"leaves causation refs unmapped when the target isn't in the source\", async () => {\n const s = `restore-orphan-${uid()}`;\n const t = new Date(\"2020-09-01T00:00:00.000Z\");\n await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n created: t,\n meta: {\n correlation: \"c\",\n causation: {\n event: { id: 999, name: \"Phantom\", stream: \"ghost\" },\n },\n },\n },\n ])\n );\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back[0].meta.causation.event?.id).toBe(999);\n });\n\n it(\"rolls back atomically when the source throws mid-iteration\", async () => {\n // Pre-seed some events the rollback must restore.\n const original = `restore-pre-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n original,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: original })\n );\n // EventSource that fires one event then throws — exercises\n // the rollback path on the destination store. Implemented as\n // a query method (not an iterable) since EventSource is the\n // shape Act.restore takes.\n const explosive: EventSource = {\n async query(callback) {\n await Promise.resolve(\n (callback as (event: Committed<Schemas, keyof Schemas>) => void)(\n event(\n 1,\n `restore-explode-${uid()}`,\n 0,\n \"Incremented\",\n new Date(),\n { amount: 1 }\n )\n )\n );\n throw new Error(\"boom\");\n },\n async dispose() {\n // no-op\n },\n };\n await expect(restore(explosive)).rejects.toThrow(\"boom\");\n // Pre-call events still there.\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: original, stream_exact: true }\n );\n expect(back).toHaveLength(3);\n expect(back.map((e) => e.id)).toEqual(committed.map((c) => c.id));\n });\n\n // ACT-1125 — compaction toggles + dry-run blocker scan + progress.\n\n it(\"drop_snapshots: skips SNAP_EVENT rows and counts them\", async () => {\n const s = `restore-drop-snap-${uid()}`;\n const t = new Date(\"2020-10-01T00:00:00.000Z\");\n const result = await restore(\n as_source([\n event(1, s, 0, \"Incremented\", t, { amount: 1 }),\n {\n id: 2,\n stream: s,\n version: 1,\n name: SNAP_EVENT,\n data: { count: 1 },\n created: t,\n meta: { correlation: \"snap\", causation: {} },\n },\n event(3, s, 2, \"Incremented\", t, { amount: 2 }),\n ]),\n { drop_snapshots: true }\n );\n expect(result.kept).toBe(2);\n expect(result.dropped.snapshots).toBe(1);\n // Verify the snapshot is gone from the rebuilt store.\n const back = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(back).toHaveLength(2);\n expect(\n back.every((e) => (e as { name: string }).name !== SNAP_EVENT)\n ).toBe(true);\n });\n\n it(\"on_progress fires once per event (caller throttles)\", async () => {\n const calls: number[] = [];\n const s = `restore-progress-${uid()}`;\n const t = new Date(\"2021-02-01T00:00:00.000Z\");\n await restore(\n as_source([\n event(1, s, 0, \"Incremented\", t, { amount: 1 }),\n event(2, s, 1, \"Incremented\", t, { amount: 2 }),\n ]),\n { on_progress: (p) => calls.push(p.processed) }\n );\n // One callback per event; values monotonic.\n expect(calls).toEqual([1, 2]);\n });\n\n // #1258: `created` bounds are pure WHERE filters, never early-breaks.\n // Restore preserves the source `created` verbatim, so a restored\n // dataset whose timestamp order diverges from id order proves the\n // scan must not short-circuit on the first out-of-order event.\n it(\"query created bounds are filters, not id-ordered breaks\", async () => {\n const s = `restore-created-order-${uid()}`;\n // id 0 = newest, id 1 = oldest → created order ≠ id order.\n const newest = new Date(\"2020-06-01T00:00:00.000Z\");\n const oldest = new Date(\"2020-01-01T00:00:00.000Z\");\n await restore(\n as_source([\n event(1, s, 0, \"Incremented\", newest, { amount: 10 }),\n event(2, s, 1, \"Incremented\", oldest, { amount: 20 }),\n ])\n );\n const cutoff = new Date(\"2020-03-01T00:00:00.000Z\");\n // Forward: the newest event (id 0) is scanned first and fails\n // `created_before`; the older event (id 1) must still be found.\n const fwd: number[] = [];\n await store.query<CounterEvents>(\n (e) => {\n fwd.push((e.data as { amount: number }).amount);\n },\n { stream: s, stream_exact: true, created_before: cutoff }\n );\n expect(fwd).toEqual([20]);\n // Backward: the oldest event (id 1) is scanned first and fails\n // `created_after`; the newer event (id 0) must still be found.\n const bwd: number[] = [];\n await store.query<CounterEvents>(\n (e) => {\n bwd.push((e.data as { amount: number }).amount);\n },\n {\n stream: s,\n stream_exact: true,\n created_after: cutoff,\n backward: true,\n }\n );\n expect(bwd).toEqual([10]);\n });\n\n // Note (RFC 1274): floor-vs-time-bound suppression is no longer a\n // store-level concern. The store applies the resume floor whenever\n // `with_snaps` is set; the orchestrator is the single owner of floor\n // eligibility and never combines `with_snaps` with an `asOf` bound. The\n // suppression contract (#1261 `created_*`, #1267 `before`, #1274 `limit`)\n // is now enforced at the orchestrator level in\n // `libs/act/test/time-travel.spec.ts`.\n\n // #1257: restore must split `pii` into the isolated store so\n // `forget_pii` erases it — otherwise restored PII stays inline and\n // erasure silently no-ops. Only meaningful when the adapter also\n // isolates PII, so gate the assertion on that capability.\n it.skipIf(!caps.pii_isolation)(\n \"isolates restored pii so forget_pii erases it\",\n async () => {\n const s = `restore-pii-${uid()}`;\n const t = new Date(\"2020-05-01T00:00:00.000Z\");\n // Two PII events on the same stream so isolation must survive\n // across events, not just the first.\n const result = await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"first@example.com\" },\n created: t,\n meta: { correlation: \"restore-tck\", causation: {} },\n },\n {\n id: 2,\n stream: s,\n version: 1,\n name: \"Incremented\",\n data: { amount: 2 },\n pii: { email: \"second@example.com\" },\n created: t,\n meta: { correlation: \"restore-tck\", causation: {} },\n },\n ])\n );\n expect(result.kept).toBe(2);\n // PII round-trips on read after restore.\n const before: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n before.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(before.map((e) => e.pii)).toEqual([\n { email: \"first@example.com\" },\n { email: \"second@example.com\" },\n ]);\n // forget_pii sees the restored PII and wipes every event's copy.\n const wiped = await store.forget_pii!.call(store, s);\n expect(wiped).toBe(2);\n const after: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n after.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(after).toHaveLength(2);\n for (const e of after) expect(e.pii == null).toBe(true);\n expect(after.map((e) => e.data)).toEqual([\n { amount: 1 },\n { amount: 2 },\n ]);\n }\n );\n });\n\n // PII isolation — sensitive-data epic (#566). Same `skipIf` pattern as\n // restore: gated on `caps.pii_isolation`, exercises commit-with-pii\n // round-trip, the no-pii passthrough, `forget_pii` happy path +\n // idempotency, and isolation across streams.\n describe.skipIf(!caps.pii_isolation)(\"pii_isolation (capability)\", () => {\n it(\"commits and loads pii alongside data\", async () => {\n const s = `pii-roundtrip-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"u@example.com\", name: \"Ursula\" },\n },\n ],\n make_meta({ stream: s })\n );\n expect(committed).toHaveLength(1);\n expect(committed[0].pii).toEqual({\n email: \"u@example.com\",\n name: \"Ursula\",\n });\n\n // Re-read via query to confirm the adapter persists pii.\n const seen: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n seen.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(seen).toHaveLength(1);\n expect(seen[0].pii).toEqual({ email: \"u@example.com\", name: \"Ursula\" });\n // Non-pii fields untouched.\n expect(seen[0].data).toEqual({ amount: 1 });\n });\n\n it(\"query_stats head/tail never carry pii — introspection surface is pii-safe (#1294)\", async () => {\n const s = `pii-stats-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"head@example.com\" },\n },\n {\n name: \"Incremented\",\n data: { amount: 2 },\n pii: { email: \"tail@example.com\" },\n },\n ],\n make_meta({ stream: s })\n );\n\n // `query_stats` has no actor context and no disclosure gate, so it\n // must not surface pii — regardless of adapter or at-rest encryption.\n // Both code paths: heads-only (no count/names) and full-scan.\n const heads = await store.query_stats<CounterEvents>([s], {\n tail: true,\n });\n const h = heads.get(s);\n expect(h?.head?.pii == null).toBe(true);\n expect(h?.tail?.pii == null).toBe(true);\n\n const full = await store.query_stats<CounterEvents>([s], {\n tail: true,\n count: true,\n names: true,\n });\n const f = full.get(s);\n expect(f?.head?.pii == null).toBe(true);\n expect(f?.tail?.pii == null).toBe(true);\n expect(f?.count).toBe(2);\n });\n\n it(\"passes through events without pii (pii is null or undefined on load)\", async () => {\n const s = `pii-none-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const seen: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n seen.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(seen).toHaveLength(1);\n // Either undefined or null is acceptable — adapters that store\n // `pii TEXT NULL` round-trip as null; in-memory may return\n // undefined for the missing key. Both forms mean \"no PII.\"\n expect(seen[0].pii == null).toBe(true);\n });\n\n it(\"wipes pii for every event on the stream via forget_pii\", async () => {\n const s = `pii-forget-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"a@example.com\" },\n },\n {\n name: \"Incremented\",\n data: { amount: 2 },\n pii: { email: \"b@example.com\" },\n },\n ],\n make_meta({ stream: s })\n );\n\n const forget = store.forget_pii;\n expect(forget).toBeDefined();\n const wiped = await forget!.call(store, s);\n expect(wiped).toBe(2);\n\n const seen: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n seen.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(seen).toHaveLength(2);\n // PII is gone — adapters return null. Data is intact.\n for (const e of seen) {\n expect(e.pii == null).toBe(true);\n expect(e.data).toBeDefined();\n }\n });\n\n it(\"is idempotent — second forget_pii returns 0, no error\", async () => {\n const s = `pii-forget-idem-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"u@example.com\" },\n },\n ],\n make_meta({ stream: s })\n );\n const forget = store.forget_pii!;\n const first = await forget.call(store, s);\n expect(first).toBe(1);\n const second = await forget.call(store, s);\n expect(second).toBe(0);\n });\n\n it(\"only wipes the targeted stream — siblings untouched\", async () => {\n const sA = `pii-iso-a-${uid()}`;\n const sB = `pii-iso-b-${uid()}`;\n await store.commit<CounterEvents>(\n sA,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"alice@example.com\" },\n },\n ],\n make_meta({ stream: sA })\n );\n await store.commit<CounterEvents>(\n sB,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"bob@example.com\" },\n },\n ],\n make_meta({ stream: sB })\n );\n await store.forget_pii!.call(store, sA);\n\n const a: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n a.push(e);\n },\n { stream: sA, stream_exact: true }\n );\n expect(a[0].pii == null).toBe(true);\n\n const b: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n b.push(e);\n },\n { stream: sB, stream_exact: true }\n );\n expect(b[0].pii).toEqual({ email: \"bob@example.com\" });\n });\n\n it(\"forget_pii on a stream with no pii events returns 0\", async () => {\n const s = `pii-forget-empty-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const wiped = await store.forget_pii!.call(store, s);\n expect(wiped).toBe(0);\n });\n });\n\n if (caps.notify) {\n // ACT-1184: the notify conformance suite. `factory` must produce\n // sibling instances that share one backing store — the TCK's\n // standing pattern (two PostgresStores on the same schema/table,\n // two withBroker decorators on one broker). These cases enforce\n // the port's MUSTs: cross-instance delivery, self-filtering\n // (\"implementations must skip their own commits\"), and one\n // notification per commit transaction carrying the full batch.\n describe(\"notify (capability)\", () => {\n it(\"delivers a notification when a different instance commits\", async () => {\n // Self-filtering contract: an instance does not see its own\n // commits. So we listen on `store` and write through a fresh\n // sibling instance pointing at the same backend.\n const notify = store.notify;\n expect(notify).toBeDefined();\n const received: StoreNotification[] = [];\n let resolve_arrived!: () => void;\n const arrived = new Promise<void>((res) => {\n resolve_arrived = res;\n });\n const disposer = await notify!.call(store, (n) => {\n received.push(n);\n resolve_arrived();\n });\n const writer = await options.factory();\n try {\n const stream = `notify-${uid()}`;\n await writer.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n // No explicit timeout — vitest's default test timeout\n // bounds the wait. If notify silently fails to deliver,\n // the test will surface that as a clear timeout failure.\n await arrived;\n expect(received.length).toBeGreaterThanOrEqual(1);\n expect(received[0].stream).toBe(stream);\n expect(received[0].events.length).toBeGreaterThanOrEqual(1);\n } finally {\n await writer.dispose();\n await Promise.resolve(disposer());\n }\n });\n\n it(\"does not deliver an instance's own commits (self-filtering)\", async () => {\n const received: StoreNotification[] = [];\n let resolve_sentinel!: () => void;\n const sentinel_arrived = new Promise<void>((res) => {\n resolve_sentinel = res;\n });\n const own = `notify-self-${uid()}`;\n const remote = `notify-remote-${uid()}`;\n const sentinel = `notify-sentinel-${uid()}`;\n const disposer = await store.notify!.call(store, (n) => {\n received.push(n);\n if (n.stream === sentinel) resolve_sentinel();\n });\n const writer = await options.factory();\n try {\n // Commit through the *listening* instance first, then through\n // a sibling (a plain remote commit, then the sentinel).\n // Notifications are delivered in commit order, so once the\n // sentinel arrives the own-commit notification would already\n // have been delivered were it not filtered.\n await store.commit<CounterEvents>(\n own,\n [inc(1)],\n make_meta({ stream: own })\n );\n await writer.commit<CounterEvents>(\n remote,\n [inc(1)],\n make_meta({ stream: remote })\n );\n await writer.commit<CounterEvents>(\n sentinel,\n [inc(1)],\n make_meta({ stream: sentinel })\n );\n await sentinel_arrived;\n expect(received.find((n) => n.stream === own)).toBeUndefined();\n expect(received.find((n) => n.stream === remote)).toBeDefined();\n expect(received.find((n) => n.stream === sentinel)).toBeDefined();\n } finally {\n await writer.dispose();\n await Promise.resolve(disposer());\n }\n });\n\n it(\"delivers one notification per commit transaction carrying the full event batch\", async () => {\n const received: StoreNotification[] = [];\n let resolve_sentinel!: () => void;\n const sentinel_arrived = new Promise<void>((res) => {\n resolve_sentinel = res;\n });\n const batch = `notify-batch-${uid()}`;\n const sentinel = `notify-batch-sentinel-${uid()}`;\n const disposer = await store.notify!.call(store, (n) => {\n received.push(n);\n if (n.stream === sentinel) resolve_sentinel();\n });\n const writer = await options.factory();\n try {\n // One commit transaction, three events. The sentinel commit\n // bounds the wait: delivered in commit order, its arrival\n // proves any duplicate batch notification would already be in\n // `received`.\n await writer.commit<CounterEvents>(\n batch,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: batch })\n );\n await writer.commit<CounterEvents>(\n sentinel,\n [inc(1)],\n make_meta({ stream: sentinel })\n );\n await sentinel_arrived;\n const batch_notifications = received.filter(\n (n) => n.stream === batch\n );\n expect(batch_notifications).toHaveLength(1);\n const events = batch_notifications[0].events;\n expect(events).toHaveLength(3);\n // The batch arrives ordered with id + name per entry.\n expect(events.map((e) => e.name)).toEqual([\n \"Incremented\",\n \"Incremented\",\n \"Incremented\",\n ]);\n expect([...events.map((e) => e.id)].sort((a, b) => a - b)).toEqual(\n events.map((e) => e.id)\n );\n } finally {\n await writer.dispose();\n await Promise.resolve(disposer());\n }\n });\n });\n }\n });\n};\n"],"mappings":"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","names":["beforeEach","describe","expect","it","afterEach","beforeEach","describe","expect","it","afterEach","beforeEach","describe","expect","it","LEVELS","describe","expect","it","entry","afterAll","beforeAll","describe","expect","it","mulberry32","describe","beforeAll","afterAll","expect","it","afterAll","beforeAll","describe","expect","describe","beforeAll","afterAll","reset","expect","stream","SNAP_EVENT","afterAll","beforeAll","describe","expect","it","describe","beforeAll","afterAll","it","expect","SNAP_EVENT","events","entry"]}
|
|
1
|
+
{"version":3,"sources":["../src/cache-differential-tck.ts","../src/fixtures/helpers.ts","../src/cache-tck.ts","../src/fixtures/events.ts","../src/logger-differential-tck.ts","../src/logger-tck.ts","../src/stability-tck.ts","../src/store-differential-tck.ts","../src/store-property-tck.ts","../src/store-tck.ts"],"sourcesContent":["import type { Cache, CacheEntry } from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport { uid } from \"./fixtures/helpers.js\";\n\n/**\n * One {@link Cache} implementation to feed into\n * {@link runCacheDifferentialTck}. The harness drives the identical\n * generated workload against all of them, then compares the observable\n * `get()` snapshot after every operation.\n */\nexport type DifferentialCache = {\n /** Display name used in assertion messages and the describe block. */\n readonly name: string;\n /**\n * Produces the cache under test. Called once in `beforeAll`; the\n * harness owns its lifecycle (`dispose`). Must return an empty cache\n * with capacity for at least {@link CacheDifferentialTckOptions.streams}\n * entries so nothing is evicted mid-comparison.\n */\n readonly factory: () => Cache | Promise<Cache>;\n};\n\n/**\n * Options for {@link runCacheDifferentialTck}.\n */\nexport type CacheDifferentialTckOptions = {\n /** Display name for the differential suite. */\n readonly name: string;\n /**\n * Two or more caches to drive in lockstep and compare. The first entry\n * is the reference; every other cache's observable `get()` snapshot\n * must match it exactly after every operation.\n */\n readonly caches: ReadonlyArray<DifferentialCache>;\n /**\n * Base PRNG seed. Workload `r` of {@link CacheDifferentialTckOptions.runs}\n * is built from `seed + r`, so the campaign is reproducible. Default\n * `0xcac`.\n */\n readonly seed?: number;\n /**\n * Number of distinct streams (cache keys) per workload. Kept small so a\n * bounded cache never evicts during the comparison. Default `6`.\n */\n readonly streams?: number;\n /**\n * How many independent randomized workloads to generate and compare,\n * each from a distinct seed. Default `8`.\n */\n readonly runs?: number;\n};\n\n/**\n * Deterministic 32-bit PRNG (mulberry32). Seeded, so the entire workload\n * is reproducible across runs and across the caches under comparison.\n */\nconst mulberry32 = (seed: number): (() => number) => {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\ntype Entry = CacheEntry<Record<string, unknown>>;\n\n/** An operation in the generated, replayable cache workload. */\ntype CacheOp =\n | { readonly t: \"set\"; readonly stream: string; readonly entry: Entry }\n | { readonly t: \"invalidate\"; readonly stream: string }\n | { readonly t: \"clear\" };\n\n/** The full generated workload, built once and replayed per cache. */\ntype CachePlan = {\n readonly streams: string[];\n readonly ops: CacheOp[];\n};\n\n/**\n * Build a deterministic, seeded cache workload with a randomized operation\n * sequence. Opens by `set`-ting every stream (so `get()` snapshots start\n * populated), then a seeded shuffle of `set` / `invalidate` / `clear`\n * across random streams. The same seed reproduces the same sequence.\n */\nconst build_cache_plan = (seed: number, stream_count: number): CachePlan => {\n const rng = mulberry32(seed);\n const prefix = `cdiff-${uid()}-`;\n const streams = Array.from(\n { length: stream_count },\n (_, i) => `${prefix}${i}`\n );\n\n const make_entry = (): Entry => {\n const v = Math.floor(rng() * 1000);\n return {\n stream: `e-${v}`,\n state: { count: v, label: `k${v % 7}` },\n version: v,\n event_id: v,\n patches: 1 + Math.floor(rng() * 5),\n snaps: Math.floor(rng() * 3),\n };\n };\n const pick_stream = (): string => streams[Math.floor(rng() * streams.length)];\n\n const ops: CacheOp[] = [];\n // Opening: populate every stream so the first snapshots aren't all-empty.\n for (const stream of streams)\n ops.push({ t: \"set\", stream, entry: make_entry() });\n\n // Randomized middle: seeded set / invalidate / clear. Length varies by\n // seed so the operation count is part of the explored input space.\n const middle = 6 + Math.floor(rng() * 14);\n for (let i = 0; i < middle; i++) {\n const kind = Math.floor(rng() * 3);\n if (kind === 0)\n ops.push({ t: \"set\", stream: pick_stream(), entry: make_entry() });\n else if (kind === 1) ops.push({ t: \"invalidate\", stream: pick_stream() });\n else ops.push({ t: \"clear\" });\n }\n\n return { streams, ops };\n};\n\n/** Apply one operation to a single cache. */\nconst apply_op = async (cache: Cache, op: CacheOp): Promise<void> => {\n if (op.t === \"set\") await cache.set(op.stream, op.entry);\n else if (op.t === \"invalidate\") await cache.invalidate(op.stream);\n else await cache.clear();\n};\n\n/** The observable state of a cache reduced to a stream→entry map. */\nconst snapshot = async (\n cache: Cache,\n streams: string[]\n): Promise<Record<string, Entry | undefined>> => {\n const out: Record<string, Entry | undefined> = {};\n for (const stream of streams)\n out[stream] = await cache.get<Record<string, unknown>>(stream);\n return out;\n};\n\n/**\n * Cross-implementation differential contract for the {@link Cache} port\n * (#1057).\n *\n * Where {@link runCacheTck} pins each method's contract against a single\n * implementation, this harness drives a **family of randomized, seeded\n * workloads** (`set` / `invalidate` / `clear`) against two or more caches\n * in lockstep and asserts their observable `get()` snapshot is identical\n * after **every** operation. A cache that mishandles overwrite ordering,\n * leaks an invalidated key, or clears partially diverges from the\n * reference on the exact operation that broke it — with the seed in the\n * describe block for replay.\n *\n * Streams stay within the cache's capacity, so eviction (an adapter\n * policy, not a contract guarantee) never enters the comparison.\n *\n * @example\n * ```ts\n * import { runCacheDifferentialTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryCache } from \"@rotorsoft/act\";\n * import { RedisCache } from \"../src/index.js\";\n *\n * runCacheDifferentialTck({\n * name: \"InMemory vs Redis\",\n * caches: [\n * { name: \"InMemoryCache\", factory: () => new InMemoryCache({ maxSize: 1000 }) },\n * { name: \"RedisCache\", factory: () => new RedisCache({ url: process.env.REDIS_URL }) },\n * ],\n * });\n * ```\n */\nexport const runCacheDifferentialTck = (\n options: CacheDifferentialTckOptions\n): void => {\n describe(`TCK / Cache differential / ${options.name}`, () => {\n const base_seed = options.seed ?? 0xcac;\n const stream_count = options.streams ?? 6;\n const plans = Array.from({ length: options.runs ?? 8 }, (_, r) =>\n build_cache_plan(base_seed + r, stream_count)\n );\n const live: Array<{ name: string; cache: Cache }> = [];\n\n beforeAll(async () => {\n for (const spec of options.caches) {\n live.push({ name: spec.name, cache: await spec.factory() });\n }\n });\n\n afterAll(async () => {\n for (const { cache } of live) await cache.dispose();\n });\n\n plans.forEach((plan, run) => {\n const seed_hex = `0x${(base_seed + run).toString(16)}`;\n it(`agrees on get() after every op (workload ${run}, seed ${seed_hex})`, async () => {\n for (const op of plan.ops) {\n // Apply the same op to every cache, then compare snapshots — so a\n // divergence is pinned to the exact operation that introduced it.\n for (const { cache } of live) await apply_op(cache, op);\n const reference = await snapshot(live[0].cache, plan.streams);\n for (let i = 1; i < live.length; i++) {\n const actual = await snapshot(live[i].cache, plan.streams);\n expect(\n actual,\n `${live[i].name} diverged from ${live[0].name} after ${op.t}`\n ).toEqual(reference);\n }\n }\n });\n });\n });\n};\n","import { randomUUID } from \"node:crypto\";\nimport type {\n Committed,\n EventMeta,\n Message,\n Store,\n} from \"@rotorsoft/act/types\";\nimport type { CounterEvents } from \"./events.js\";\n\nexport type CounterMessage = Message<CounterEvents, keyof CounterEvents>;\nexport type CommittedCounterEvent = Committed<\n CounterEvents,\n keyof CounterEvents\n>;\n\n/**\n * Per-test unique identifier suffix. Use to namespace streams so tests\n * running in parallel against the same shared store (e.g., a real Postgres\n * instance) don't collide on stream names.\n */\nexport const uid = (): string => randomUUID().slice(0, 8);\n\nexport const actor = (name = \"tester\") => ({ id: randomUUID(), name });\n\n/** Build an EventMeta with a correlation id and optional action causation. */\nexport const make_meta = (\n opts: { correlation?: string; stream?: string; action?: string } = {}\n): EventMeta => ({\n correlation: opts.correlation ?? randomUUID(),\n causation: opts.stream\n ? {\n action: {\n name: opts.action ?? \"Test\",\n stream: opts.stream,\n actor: actor(),\n },\n }\n : {},\n});\n\nexport const inc = (amount = 1): CounterMessage => ({\n name: \"Incremented\",\n data: { amount },\n});\n\nexport const dec = (amount = 1): CounterMessage => ({\n name: \"Decremented\",\n data: { amount },\n});\n\nexport const reset = (): CounterMessage => ({ name: \"Reset\", data: {} });\n\n/**\n * Commit `count` Incremented events to `stream` on the given store, each\n * within its own commit transaction (so they receive distinct event ids).\n */\nexport const seed_stream = async (\n store: Store,\n stream: string,\n count: number,\n correlation?: string\n): Promise<CommittedCounterEvent[]> => {\n const out: CommittedCounterEvent[] = [];\n for (let i = 0; i < count; i++) {\n const committed = await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ correlation, stream })\n );\n out.push(...(committed as CommittedCounterEvent[]));\n }\n return out;\n};\n\n/**\n * Drain a `query` call into an array. Convenience wrapper for assertions.\n */\nexport const collect = async (\n store: Store,\n query: Parameters<Store[\"query\"]>[1]\n): Promise<CommittedCounterEvent[]> => {\n const out: CommittedCounterEvent[] = [];\n await store.query<CounterEvents>((e) => {\n out.push(e as CommittedCounterEvent);\n }, query);\n return out;\n};\n","import type { Cache, CacheEntry } from \"@rotorsoft/act/types\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\n\n/**\n * Options for {@link runCacheTck}.\n */\nexport type CacheTckOptions = {\n /**\n * Display name for the implementation under test. Becomes the\n * top-level `describe` block in the vitest run.\n */\n readonly name: string;\n /**\n * Factory invoked before each test. Must return a fresh, empty cache\n * — tests assume zero starting entries. Any per-implementation tuning\n * (max size, TTL, etc.) is the factory's responsibility, but the TCK\n * itself sets ≤ 8 entries in any single test, so a default max of\n * `≥ 8` is safe.\n */\n readonly factory: () => Cache;\n};\n\nconst entry = (\n event_id: number,\n state: Record<string, unknown> = {},\n stream = `s-${event_id}`\n): CacheEntry<Record<string, unknown>> => ({\n stream,\n state,\n version: event_id,\n event_id,\n patches: 1,\n snaps: 0,\n});\n\n/**\n * Runs the Cache contract test compatibility kit against the\n * implementation produced by `options.factory`.\n *\n * Covers the full {@link Cache} surface defined in\n * `libs/act/src/types/ports.ts`:\n * - get/set round-trip\n * - get on a missing key returns undefined\n * - invalidate removes a single stream without affecting others\n * - clear wipes all entries\n * - dispose is idempotent and awaitable\n * - cross-stream isolation\n *\n * Adapter-specific behavior (LRU ordering, TTL, size limits, …) stays\n * in the adapter's own test suite — the TCK only asserts the contract\n * every Cache must honor.\n *\n * @example\n * ```ts\n * import { runCacheTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryCache } from \"@rotorsoft/act\";\n *\n * runCacheTck({\n * name: \"InMemoryCache\",\n * factory: () => new InMemoryCache({ maxSize: 1000 }),\n * });\n * ```\n */\nexport const runCacheTck = (options: CacheTckOptions): void => {\n describe(`TCK / Cache / ${options.name}`, () => {\n let cache: Cache;\n\n beforeEach(() => {\n cache = options.factory();\n });\n\n afterEach(async () => {\n await cache.dispose();\n });\n\n it(\"returns undefined for an unset stream\", async () => {\n expect(await cache.get(\"missing\")).toBeUndefined();\n });\n\n it(\"set then get round-trips an entry\", async () => {\n const e = entry(1, { count: 7 });\n await cache.set(\"s1\", e);\n expect(await cache.get(\"s1\")).toEqual(e);\n });\n\n it(\"set overwrites a prior entry on the same stream\", async () => {\n await cache.set(\"s1\", entry(1, { count: 1 }));\n await cache.set(\"s1\", entry(2, { count: 2 }));\n const got = await cache.get<Record<string, unknown>>(\"s1\");\n expect(got?.event_id).toBe(2);\n expect(got?.state).toEqual({ count: 2 });\n });\n\n it(\"invalidate removes one stream and leaves others\", async () => {\n await cache.set(\"a\", entry(1));\n await cache.set(\"b\", entry(2));\n await cache.invalidate(\"a\");\n expect(await cache.get(\"a\")).toBeUndefined();\n expect(await cache.get(\"b\")).toBeDefined();\n });\n\n it(\"invalidate on an unknown stream is a no-op\", async () => {\n await expect(cache.invalidate(\"never-set\")).resolves.toBeUndefined();\n });\n\n it(\"clear empties every stream\", async () => {\n await cache.set(\"a\", entry(1));\n await cache.set(\"b\", entry(2));\n await cache.set(\"c\", entry(3));\n await cache.clear();\n expect(await cache.get(\"a\")).toBeUndefined();\n expect(await cache.get(\"b\")).toBeUndefined();\n expect(await cache.get(\"c\")).toBeUndefined();\n });\n\n it(\"clear on an empty cache is a no-op\", async () => {\n await expect(cache.clear()).resolves.toBeUndefined();\n });\n\n it(\"entries are isolated per stream\", async () => {\n const ea = entry(1, { id: \"a\" });\n const eb = entry(2, { id: \"b\" });\n await cache.set(\"a\", ea);\n await cache.set(\"b\", eb);\n expect(await cache.get(\"a\")).toEqual(ea);\n expect(await cache.get(\"b\")).toEqual(eb);\n });\n\n it(\"dispose is idempotent\", async () => {\n await cache.set(\"a\", entry(1));\n await cache.dispose();\n await expect(cache.dispose()).resolves.toBeUndefined();\n });\n });\n};\n","import { z } from \"zod\";\n\nexport const Incremented = z.object({ amount: z.number().int() });\nexport const Decremented = z.object({ amount: z.number().int() });\nexport const Reset = z.object({});\n\nexport const CounterSchemas = {\n Incremented,\n Decremented,\n Reset,\n} as const;\n\nexport type CounterEvents = {\n Incremented: z.infer<typeof Incremented>;\n Decremented: z.infer<typeof Decremented>;\n Reset: z.infer<typeof Reset>;\n};\n\nexport const COUNTER_EVENT_NAMES = [\n \"Incremented\",\n \"Decremented\",\n \"Reset\",\n] as const;\n","import type { Logger } from \"@rotorsoft/act/types\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\n\n/**\n * One {@link Logger} implementation to feed into\n * {@link runLoggerDifferentialTck}. The harness drives the identical call\n * sequence against all of them and compares the **portable** observable\n * contract — robustness (does a call throw?) and structural conformance\n * (is `level` a non-empty string, does `child()` satisfy the contract).\n */\nexport type DifferentialLogger = {\n /** Display name used in assertion messages and the describe block. */\n readonly name: string;\n /**\n * Produces the logger under test. Called before each test; the harness\n * owns its lifecycle (`dispose`).\n */\n readonly factory: () => Logger;\n};\n\n/**\n * Options for {@link runLoggerDifferentialTck}.\n */\nexport type LoggerDifferentialTckOptions = {\n /** Display name for the differential suite. */\n readonly name: string;\n /**\n * Two or more loggers to drive in lockstep and compare. The first entry\n * is the reference; every other logger must uphold the same portable\n * observable contract under the identical call sequence.\n */\n readonly loggers: ReadonlyArray<DifferentialLogger>;\n};\n\nconst LEVELS = [\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"] as const;\n\n/**\n * Drive a logger through the full call surface and return a vector of\n * **observable, portable** outcomes. A logger's formatted output is\n * adapter-specific by design (pino JSON vs console text vs a file sink),\n * so the only thing two implementations can be held to byte-for-byte is:\n *\n * - whether each call **throws** (robustness parity — a logger that\n * blows up on a cyclic or null payload the reference tolerates is a\n * real divergence);\n * - whether `level` is a non-empty string;\n * - whether `child()` returns something that itself satisfies the\n * contract (and can spawn a further child).\n *\n * The vector is order-stable, so a single `toEqual` pins any divergence to\n * the exact call that broke parity.\n */\nconst drive = (logger: Logger): boolean[] => {\n const out: boolean[] = [];\n const ok = (fn: () => void): void => {\n try {\n fn();\n out.push(true);\n } catch {\n out.push(false);\n }\n };\n\n out.push(typeof logger.level === \"string\" && logger.level.length > 0);\n for (const level of LEVELS) {\n ok(() => logger[level](\"message\"));\n ok(() => logger[level]({ k: \"v\", n: 1 }));\n ok(() => logger[level]({ k: \"v\" }, \"context\"));\n }\n ok(() => logger.info(null, \"null payload\"));\n ok(() => {\n const cyclic: Record<string, unknown> = { name: \"loop\" };\n cyclic.self = cyclic;\n logger.info(cyclic, \"cycle\");\n });\n\n // Child conformance: a child must satisfy the same contract and be able\n // to spawn its own child — recorded as observable booleans, not asserted\n // here, so a non-conforming child surfaces as a vector divergence.\n const child = logger.child({ request_id: \"abc\" });\n out.push(typeof child.level === \"string\" && child.level.length > 0);\n out.push(LEVELS.every((level) => typeof child[level] === \"function\"));\n out.push(typeof child.child === \"function\");\n ok(() => child.child({ nested: true }).info(\"nested\"));\n\n return out;\n};\n\n/**\n * Cross-implementation differential contract for the {@link Logger} port\n * (#1057).\n *\n * A logger has no portable return value to byte-compare — its output\n * format is adapter-specific by design, which is exactly why\n * {@link runLoggerTck} checks shape rather than bytes. The meaningful\n * differential is therefore **robustness and structural parity**: driven\n * through the identical call sequence (every level, both overloads, null\n * and cyclic payloads, child spawning), do two implementations agree on\n * what throws and what conforms? They must. A logger that throws on a\n * cyclic payload the reference tolerates, or returns a non-conforming\n * child, diverges from the reference vector.\n *\n * @example\n * ```ts\n * import { runLoggerDifferentialTck } from \"@rotorsoft/act-tck\";\n * import { ConsoleLogger } from \"@rotorsoft/act\";\n * import { PinoLogger } from \"../src/index.js\";\n *\n * runLoggerDifferentialTck({\n * name: \"Console vs Pino\",\n * loggers: [\n * { name: \"ConsoleLogger\", factory: () => new ConsoleLogger({ level: \"trace\" }) },\n * { name: \"PinoLogger\", factory: () => new PinoLogger({ level: \"trace\" }) },\n * ],\n * });\n * ```\n */\nexport const runLoggerDifferentialTck = (\n options: LoggerDifferentialTckOptions\n): void => {\n describe(`TCK / Logger differential / ${options.name}`, () => {\n let live: Array<{ name: string; logger: Logger }> = [];\n let original_stdout: typeof process.stdout.write;\n\n // Silence stdout while driving the loggers — we compare observable\n // outcomes, not formatted output, and chatty sinks would spam the run.\n beforeEach(() => {\n live = options.loggers.map((spec) => ({\n name: spec.name,\n logger: spec.factory(),\n }));\n original_stdout = process.stdout.write.bind(process.stdout);\n process.stdout.write = (() => true) as typeof process.stdout.write;\n });\n\n afterEach(async () => {\n process.stdout.write = original_stdout;\n for (const { logger } of live) await logger.dispose();\n });\n\n it(\"agrees on robustness and structural parity across the call surface\", () => {\n const reference = drive(live[0].logger);\n for (let i = 1; i < live.length; i++) {\n const actual = drive(live[i].logger);\n expect(actual, `${live[i].name} diverged from ${live[0].name}`).toEqual(\n reference\n );\n }\n });\n });\n};\n","import type { Logger } from \"@rotorsoft/act/types\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\n\n/**\n * Options for {@link runLoggerTck}.\n */\nexport type LoggerTckOptions = {\n /**\n * Display name for the implementation under test.\n */\n readonly name: string;\n /**\n * Factory invoked before each test. Must return a fresh logger\n * instance — tests do not assume any starting state.\n */\n readonly factory: () => Logger;\n};\n\nconst LEVELS = [\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"] as const;\n\n/**\n * Runs the Logger contract test compatibility kit against the\n * implementation produced by `options.factory`.\n *\n * The {@link Logger} contract is intentionally narrow: implementations\n * are pluggable wrappers around pino, winston, bunyan, console, etc.\n * The TCK verifies the **shape** of the contract, not the format of\n * the output (which is adapter-specific by design):\n * - every level method exists and is callable in both overload forms\n * `(msg)` and `(obj, msg?)`\n * - `child(bindings)` returns something that satisfies the same\n * contract and can itself spawn children\n * - `level` is a non-empty string\n * - `dispose` is awaitable and idempotent\n * - cyclic payloads must not throw (sinks may choose any fallback)\n *\n * Anything more (output format, level gating, color, file routing) is\n * adapter-specific and stays in the adapter's own test suite.\n *\n * @example\n * ```ts\n * import { runLoggerTck } from \"@rotorsoft/act-tck\";\n * import { ConsoleLogger } from \"@rotorsoft/act\";\n *\n * runLoggerTck({\n * name: \"ConsoleLogger\",\n * factory: () => new ConsoleLogger({ level: \"trace\" }),\n * });\n * ```\n */\nexport const runLoggerTck = (options: LoggerTckOptions): void => {\n describe(`TCK / Logger / ${options.name}`, () => {\n let logger: Logger;\n let original_stdout: typeof process.stdout.write;\n\n // Silence stdout during the TCK — we don't assert on output, and\n // chatty implementations would otherwise spam test runs. Loggers\n // that route elsewhere (stderr, files) won't appear in the test\n // report; checking their formatted output is the adapter's own\n // responsibility.\n beforeEach(() => {\n logger = options.factory();\n original_stdout = process.stdout.write.bind(process.stdout);\n process.stdout.write = (() => true) as typeof process.stdout.write;\n });\n\n afterEach(async () => {\n process.stdout.write = original_stdout;\n await logger.dispose();\n });\n\n it(\"exposes a non-empty `level` string\", () => {\n expect(typeof logger.level).toBe(\"string\");\n expect(logger.level.length).toBeGreaterThan(0);\n });\n\n for (const level of LEVELS) {\n it(`${level}(msg) does not throw`, () => {\n expect(() => logger[level](\"hello\")).not.toThrow();\n });\n\n it(`${level}(obj) does not throw`, () => {\n expect(() => logger[level]({ k: \"v\" })).not.toThrow();\n });\n\n it(`${level}(obj, msg) does not throw`, () => {\n expect(() => logger[level]({ k: \"v\" }, \"context\")).not.toThrow();\n });\n }\n\n it(\"accepts a null payload\", () => {\n expect(() => logger.info(null, \"null payload\")).not.toThrow();\n });\n\n it(\"accepts a cyclic payload without throwing\", () => {\n const cyclic: Record<string, unknown> = { name: \"loop\" };\n cyclic.self = cyclic;\n expect(() => logger.info(cyclic, \"cycle\")).not.toThrow();\n });\n\n it(\"child(bindings) returns a Logger satisfying the same contract\", () => {\n const child = logger.child({ request_id: \"abc\" });\n expect(typeof child.level).toBe(\"string\");\n for (const level of LEVELS) {\n expect(typeof child[level]).toBe(\"function\");\n }\n expect(typeof child.child).toBe(\"function\");\n expect(typeof child.dispose).toBe(\"function\");\n });\n\n it(\"child loggers can themselves spawn children\", () => {\n const c1 = logger.child({ a: 1 });\n const c2 = c1.child({ b: 2 });\n expect(() => c2.info(\"nested\")).not.toThrow();\n });\n\n it(\"dispose is idempotent and awaitable\", async () => {\n await expect(logger.dispose()).resolves.toBeUndefined();\n await expect(logger.dispose()).resolves.toBeUndefined();\n });\n });\n};\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { describe, expect, it } from \"vitest\";\n\n/**\n * Options for {@link runStabilityTck}.\n *\n * @property name - Display name for the snapshot suite (e.g., the package\n * name). Used as the `describe` block label so failing snapshots are\n * attributable at a glance.\n * @property entryPoints - Map of subpath → entry source file. The TCK\n * reads each entry, follows its relative re-exports recursively, and\n * snapshots the resulting surface text. Empty-string subpaths label\n * the root entry; everything else is rendered with its key (e.g.\n * `\"/receiver\"`).\n */\nexport type StabilityTckOptions = {\n readonly name: string;\n readonly entryPoints: Readonly<Record<string, string>>;\n};\n\n/**\n * Snapshot-based public-API stability check. Walks each entry's source\n * file plus everything it re-exports through relative imports, and\n * compares the concatenated text against a committed Vitest snapshot.\n *\n * Catches accidental rename / removal / signature drift on the public\n * surface before a build merges. Any change that affects re-exports\n * shows up as a snapshot diff in the PR; reviewers either accept the\n * change (update the snapshot deliberately) or push back.\n *\n * The TCK reads source (`.ts`) rather than built declarations so it\n * doesn't need a prior `pnpm build`. It follows `from \"./relative.js\"`\n * re-exports transitively; non-relative paths (other packages, `node:`)\n * stop the walk — drift in another package's surface is that package's\n * stability TCK to catch.\n *\n * @example\n * ```ts\n * import path from \"node:path\";\n * import { runStabilityTck } from \"@rotorsoft/act-tck\";\n *\n * runStabilityTck({\n * name: \"@rotorsoft/act-http\",\n * entryPoints: {\n * \"/api\": path.resolve(\"src/api/index.ts\"),\n * \"/webhook\": path.resolve(\"src/webhook/index.ts\"),\n * \"/sse\": path.resolve(\"src/sse/index.ts\"),\n * \"/receiver\": path.resolve(\"src/receiver/index.ts\"),\n * },\n * });\n * ```\n *\n * @param options - See {@link StabilityTckOptions}.\n */\nexport function runStabilityTck(options: StabilityTckOptions): void {\n describe(`${options.name} — public API stability`, () => {\n for (const [subpath, entry] of Object.entries(options.entryPoints)) {\n const label = subpath || \"(root)\";\n it(`stable public surface for ${label}`, async () => {\n const surface = await load_surface(entry);\n expect(surface).toMatchSnapshot();\n });\n }\n });\n}\n\n/**\n * Load and concatenate the public surface of an entry source file.\n * Recursively walks relative re-exports, deduplicating visited files\n * and sorting visited paths so cosmetic file-order changes don't shift\n * the snapshot.\n */\nasync function load_surface(entry: string): Promise<string> {\n const visited = new Map<string, string>();\n\n async function walk(file: string): Promise<void> {\n const abs = path.resolve(file);\n if (visited.has(abs)) return;\n\n const content = await fs.readFile(abs, \"utf8\");\n visited.set(abs, content);\n\n // Match top-of-line `import`/`export ... from \"./relative.js\"` statements\n // only, so JSDoc strings and example code in comments don't get walked.\n const re_export =\n /^\\s*(?:import|export)\\b[^\"';]*\\bfrom\\s+[\"'](\\.[^\"']+)[\"']/gm;\n for (const m of content.matchAll(re_export)) {\n const rel = m[1].replace(/\\.js$/, \".ts\");\n const target = path.resolve(path.dirname(abs), rel);\n await walk(target);\n }\n }\n\n await walk(entry);\n\n // Sort by basename for stable ordering across machines.\n const sorted = [...visited.entries()].sort(([a], [b]) =>\n path.basename(a).localeCompare(path.basename(b))\n );\n return sorted\n .map(([abs, content]) => {\n const rel = path.basename(abs);\n return `// === ${rel} ===\\n${content}`;\n })\n .join(\"\\n\");\n}\n","import { SNAP_EVENT } from \"@rotorsoft/act\";\nimport type {\n BlockedLease,\n Committed,\n Lease,\n Schemas,\n Store,\n} from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport type { CounterEvents } from \"./fixtures/events.js\";\nimport {\n type CounterMessage,\n dec,\n inc,\n make_meta,\n reset as reset_event,\n uid,\n} from \"./fixtures/helpers.js\";\n\n/**\n * One {@link Store} implementation to feed into\n * {@link runStoreDifferentialTck}. The harness drops + seeds each store,\n * replays the identical generated workload against all of them, then\n * compares their normalized outputs.\n */\nexport type DifferentialStore = {\n /** Display name used in assertion messages and the describe block. */\n readonly name: string;\n /**\n * Produces the store under test. Called once in `beforeAll`; the\n * harness owns its lifecycle (`drop` + `seed`, then `dispose`).\n */\n readonly factory: () => Store | Promise<Store>;\n};\n\n/**\n * Known cross-adapter divergences the caller wants the differential to\n * skip until the backing fix lands. Each flag suppresses exactly the\n * assertions that a currently-filed bug makes red, so the differential\n * stays green on master and the gate un-gates itself (delete the flag)\n * when the fix merges. Every flag names its issue so the reason is\n * auditable at the call site.\n */\nexport type DifferentialSkips = {\n /**\n * #1197 — SQLite `LIKE` is ASCII-case-insensitive, so a **mixed-case\n * regex pattern** filter overmatches vs PG (`~`) / InMemory (`RegExp`),\n * which are case-sensitive. Skips only the pattern-driven mixed-case\n * assertions; exact-match (`stream_exact`) mixed-case still runs, since\n * that path is case-exact on every adapter. Un-gate when #1197 lands.\n */\n readonly caseInsensitivePatterns?: boolean;\n /**\n * #1199 — `names: []` and falsy-zero `before`/`after: 0` guards differ\n * across adapters (`names: []` → PG returns all, InMemory/SQLite return\n * none; `before: 0` / `after: 0` are dropped by some adapters' truthy\n * guards). Skips only those specific edge-input query assertions.\n * Un-gate when #1199 lands.\n */\n readonly queryEdgeInputs?: boolean;\n};\n\n/**\n * Options for {@link runStoreDifferentialTck}.\n */\nexport type StoreDifferentialTckOptions = {\n /** Display name for the differential suite. */\n readonly name: string;\n /**\n * Two or more stores to drive in lockstep and compare. The first\n * entry is the reference; every other store's normalized output must\n * match it exactly. Pass `InMemoryStore` as the reference and the\n * durable adapter(s) as the comparands.\n */\n readonly stores: ReadonlyArray<DifferentialStore>;\n /**\n * Base PRNG seed. Workload `r` of {@link StoreDifferentialTckOptions.runs}\n * is built from `seed + r`, so the whole fuzz campaign is reproducible:\n * the same `seed` ⇒ the same family of workloads ⇒ any divergence is\n * deterministically replayable. Default `0xac7`.\n */\n readonly seed?: number;\n /**\n * Number of distinct event-bearing streams per workload.\n * Default `4`.\n */\n readonly streams?: number;\n /**\n * How many independent randomized workloads to generate and compare,\n * each from a distinct seed (`seed`, `seed + 1`, …, `seed + runs - 1`).\n * More runs widen the slice of the input space the differential\n * explores; fewer keep durable-adapter suites fast. Default `8`.\n */\n readonly runs?: number;\n /**\n * Whether the comparand adapters support the optional {@link Store.forget_pii}\n * surface (and the `pii` field on commit). When `true`, the workload\n * commits PII-bearing events and the differential asserts that\n * `forget_pii` wipes them identically across adapters. All in-tree\n * adapters implement it, so it defaults to `true`; a third-party store\n * that opts out sets it `false`. Default `true`.\n */\n readonly piiIsolation?: boolean;\n /**\n * Known-divergence gates — see {@link DifferentialSkips}. Each flag\n * suppresses the assertions a currently-filed bug makes red so the\n * differential stays green until the fix merges. Default: nothing\n * skipped.\n */\n readonly skip?: DifferentialSkips;\n};\n\n/**\n * Deterministic 32-bit PRNG (mulberry32). Seeded, so the entire workload\n * is reproducible across runs and across the stores under comparison.\n */\nconst mulberry32 = (seed: number): (() => number) => {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\n/** A single committed event reduced to its store-independent identity. */\ntype NormalizedEvent = {\n readonly stream: string;\n readonly version: number;\n readonly name: string;\n readonly data: unknown;\n /** `true` when the event carried PII on load, `false`/absent otherwise. */\n readonly pii?: boolean;\n};\n\n/**\n * Strip the fields that legitimately differ between adapters — absolute\n * event `id`, `created` timestamp, and `meta` (correlation/causation\n * uuids) — leaving only what defines \"the right events in the right\n * order\": stream, version, name, data, and whether PII was present. Event\n * ordering is preserved by the position of each normalized event in the\n * collected array.\n *\n * PII is normalized to a boolean presence flag rather than its plaintext:\n * the differential's job is \"did `forget_pii` erase the same rows on every\n * adapter\", not \"does every adapter round-trip the same ciphertext\" (which\n * the per-adapter `pii_isolation` suite already pins).\n */\nconst normalize_event = (\n e: Committed<Schemas, keyof Schemas>\n): NormalizedEvent => ({\n stream: e.stream,\n version: e.version,\n name: e.name,\n data: e.data,\n pii: e.pii != null,\n});\n\n/**\n * Identity-only view (no PII flag). `query_stats` head/tail is a\n * stream-shape summary — whether an adapter hydrates the isolated PII\n * column on the head/tail rows it returns is not part of that contract\n * (the per-adapter `pii_isolation` suite pins hydration on `query` /\n * `commit`, not on `query_stats`). Comparing PII presence here would\n * over-specify and flag a legitimate adapter freedom as a divergence.\n */\nconst normalize_identity = (\n e: Committed<Schemas, keyof Schemas>\n): Omit<NormalizedEvent, \"pii\"> => ({\n stream: e.stream,\n version: e.version,\n name: e.name,\n data: e.data,\n});\n\n/** An operation in the generated, replayable workload. */\ntype PlanOp =\n | {\n readonly t: \"commit\";\n readonly stream: string;\n readonly msgs: CounterMessage[];\n /** When set, the batch's first message carries this PII payload. */\n readonly pii?: Record<string, unknown>;\n }\n | { readonly t: \"snapshot\"; readonly stream: string; readonly count: number }\n | { readonly t: \"truncate\"; readonly stream: string; readonly count: number }\n // Windowed truncate: prefix-delete below the closest safe boundary\n // snapshot with `created < before` (and `id <= max_id` when set). The\n // op writes a snapshot first (in `apply_plan`) so a boundary always\n // exists, making the prune deterministic across adapters.\n | {\n readonly t: \"truncate_windowed\";\n readonly stream: string;\n readonly max_id: boolean;\n }\n // Lease lifecycle against a subscription stream (indexed into\n // `plan.subs`). `claim` leases every claimable stream under a fresh\n // holder; `apply_plan` records which holder now owns each stream so the\n // finalize verbs (`ack` / `defer` / `block`) target the *real* current\n // holder on each adapter. That makes the durable outcome (watermark,\n // retry, blocked, error, deferred) a deterministic function of the op\n // sequence — independent of the exact holder UUID (normalized away) and\n // of any adapter's claim-frontier tie-break. A verb whose target stream\n // is not currently held is a no-op on every adapter, identically.\n | { readonly t: \"claim\"; readonly millis: number }\n | { readonly t: \"ack\"; readonly sub: number }\n | { readonly t: \"defer\"; readonly sub: number; readonly due: number }\n | { readonly t: \"block\"; readonly sub: number; readonly error: string }\n | { readonly t: \"unblock\"; readonly sub: number }\n | { readonly t: \"reset_sub\"; readonly sub: number }\n | {\n readonly t: \"prioritize\";\n readonly sub: number;\n readonly priority: number;\n };\n\n/** A subscription registered for the `query_streams` comparison. */\ntype SubSpec = {\n readonly stream: string;\n readonly source: string;\n readonly lane: string;\n readonly priority: number;\n};\n\n/** A query-option matrix entry compared under a global forward scan. */\ntype QueryCase = {\n readonly label: string;\n readonly query: Record<string, unknown>;\n /**\n * When set, this case is only well-defined once the named fix lands;\n * the harness skips it while the matching {@link DifferentialSkips}\n * flag is on.\n */\n readonly gated?: keyof DifferentialSkips;\n};\n\n/** The full generated workload, built once and replayed per store. */\ntype Plan = {\n readonly event_prefix: string;\n readonly event_streams: string[];\n readonly sub_prefix: string;\n readonly ops: PlanOp[];\n readonly subs: SubSpec[];\n readonly correlation: string;\n readonly pii_stream: string;\n readonly query_cases: QueryCase[];\n /** The single event name guaranteed to appear (for `names` filters). */\n readonly filter_name: string;\n};\n\n/**\n * Build a deterministic, seeded workload with a **randomized** operation\n * sequence. Unlike a fixed script, the middle of each plan is a seeded\n * shuffle of `commit` / `snapshot` / `truncate` (full + windowed) plus the\n * **lease lifecycle** (`claim` / `ack` / `defer` / `block` / `unblock` /\n * `reset` / `prioritize`) across random streams, so different seeds probe\n * different interleavings — pre/post-snapshot commits, a claim landing\n * between two truncates, a block-then-unblock, and so on. The same seed\n * always reproduces the same sequence, so any divergence the fuzz finds is\n * replayable.\n *\n * Stream names carry **mixed case** so a case-sensitivity divergence in a\n * pattern filter surfaces as a diff (the whole point of #1197's coverage).\n *\n * Two invariants are pinned regardless of seed so the comparison stays\n * well-defined across adapters:\n *\n * - an **opening** commit per stream — every stream is non-empty before\n * a snapshot or truncate can reference it;\n * - a **closing** commit per stream — every stream ends with real\n * (non-snapshot) events, so `query_stats` head/tail are defined even\n * when a truncate was the last randomized touch.\n *\n * Event types cycle inc → dec → reset via a shared cursor, so all three\n * payload shapes appear in every plan.\n */\nconst build_plan = (\n seed: number,\n stream_count: number,\n pii_isolation: boolean\n): Plan => {\n const rng = mulberry32(seed);\n const tag = uid();\n // Mixed-case prefixes: an upper-cased segment lands inside every stream\n // and subscription name, so a case-insensitive pattern filter (SQLite\n // LIKE, #1197) overmatches and diverges from the case-sensitive\n // reference. A lower-only corpus can never surface that class of bug.\n const event_prefix = `Diff-${tag}-Evt-`;\n const sub_prefix = `Diff-${tag}-Sub-`;\n const event_streams = Array.from(\n { length: stream_count },\n (_, i) => `${event_prefix}S${i}`\n );\n const correlation = `corr-${tag}`;\n\n let type_cursor = 0;\n const next_msg = (): CounterMessage => {\n const kind = type_cursor++ % 3;\n const amount = 1 + Math.floor(rng() * 9);\n return kind === 0 ? inc(amount) : kind === 1 ? dec(amount) : reset_event();\n };\n const batch = (): CounterMessage[] =>\n Array.from({ length: 1 + Math.floor(rng() * 3) }, next_msg);\n const pick_stream = (): string =>\n event_streams[Math.floor(rng() * event_streams.length)];\n // Each subscription consumes from its **own dedicated source stream**\n // that only ever receives a single opening commit and is never truncated.\n // Decoupling the lease sources from the truncate-churned `event_streams`\n // is what makes `claim` eligibility identical across adapters: every\n // subscription has exactly one unit of work at watermark -1, so a wide-\n // budget claim leases the same set on every store — the lease-lifecycle\n // diff then reflects only the ack/block/unblock/reset ops, not adapter\n // differences in \"does this source still have events after a truncate\".\n const lanes = [\"default\", \"slow\", \"fast\"];\n const lease_prefix = `Diff-${tag}-Src-`;\n const lease_sources = event_streams.map((_, i) => `${lease_prefix}S${i}`);\n const subs: SubSpec[] = lease_sources.map((source, i) => ({\n stream: `${sub_prefix}S${i}`,\n source,\n lane: lanes[i % lanes.length],\n priority: i % 4,\n }));\n const pick_sub = (): number => Math.floor(rng() * subs.length);\n\n const ops: PlanOp[] = [];\n // Opening: every stream commits a batch so it exists before any\n // snapshot/truncate references it. The first stream's opening batch\n // carries PII (when the adapter supports it) so `forget_pii` has\n // something to erase.\n const pii_stream = event_streams[0];\n event_streams.forEach((stream, i) => {\n ops.push({\n t: \"commit\",\n stream,\n msgs: batch(),\n pii:\n pii_isolation && i === 0\n ? { email: `u-${tag}@example.com`, name: \"Ursula\" }\n : undefined,\n });\n });\n // One commit per lease source so every subscription starts with exactly\n // one unit of work at watermark -1. These streams are never truncated.\n for (const src of lease_sources)\n ops.push({ t: \"commit\", stream: src, msgs: [inc(1)] });\n\n // Register every subscription up front so the lease-lifecycle ops in the\n // middle have claimable streams. A fresh subscription's watermark is -1.\n // (Applied via `subscribe` before the ops loop in `apply_plan`.)\n\n // Randomized middle: a seeded sequence over the full op vocabulary.\n const middle = 12 + Math.floor(rng() * 20);\n for (let i = 0; i < middle; i++) {\n const kind = Math.floor(rng() * 10);\n if (kind === 0) {\n ops.push({ t: \"commit\", stream: pick_stream(), msgs: batch() });\n } else if (kind === 1) {\n ops.push({\n t: \"snapshot\",\n stream: pick_stream(),\n count: Math.floor(rng() * 1000),\n });\n } else if (kind === 2) {\n ops.push({\n t: \"truncate\",\n stream: pick_stream(),\n count: Math.floor(rng() * 1000),\n });\n } else if (kind === 3) {\n ops.push({\n t: \"truncate_windowed\",\n stream: pick_stream(),\n max_id: rng() < 0.5,\n });\n } else if (kind === 4) {\n // Large lease window so the claim holds; retry counters advance\n // deterministically (claim increments, ack resets).\n ops.push({ t: \"claim\", millis: 100_000 });\n } else if (kind === 5) {\n ops.push({ t: \"ack\", sub: pick_sub() });\n } else if (kind === 6) {\n // Deterministic due-time relative to a fixed epoch so `deferred_at`\n // is identical on every adapter. Far in the future so the deferred\n // stream stays held-out.\n ops.push({\n t: \"defer\",\n sub: pick_sub(),\n due: 4_102_444_800_000 + Math.floor(rng() * 1000),\n });\n } else if (kind === 7) {\n ops.push({\n t: \"block\",\n sub: pick_sub(),\n error: `boom-${Math.floor(rng() * 100)}`,\n });\n } else if (kind === 8) {\n ops.push({ t: \"unblock\", sub: pick_sub() });\n } else {\n // reset / prioritize share the last bucket via a sub-toss.\n if (rng() < 0.5) ops.push({ t: \"reset_sub\", sub: pick_sub() });\n else\n ops.push({\n t: \"prioritize\",\n sub: pick_sub(),\n priority: Math.floor(rng() * 10),\n });\n }\n }\n\n // Closing: every stream commits a final batch so it ends with real\n // events — keeps query_stats head/tail well-defined after any truncate.\n const filter_name = \"Incremented\";\n for (const stream of event_streams)\n ops.push({ t: \"commit\", stream, msgs: [inc(1)] });\n\n // Query-option matrix compared under a global forward/backward scan.\n // Each case exercises a distinct filter dimension; the normalized event\n // list must match across adapters. Edge-input cases (`names: []`,\n // falsy-zero bounds) are gated behind #1199 until the guards converge.\n const query_cases: QueryCase[] = [\n {\n label: \"names filter (single event name)\",\n query: { stream: `^${event_prefix}`, names: [filter_name] },\n },\n {\n label: \"correlation filter\",\n query: { stream: `^${event_prefix}`, correlation },\n },\n {\n label: \"limit bound\",\n query: { stream: `^${event_prefix}`, limit: 3 },\n },\n {\n label: \"backward + limit\",\n query: { stream: `^${event_prefix}`, backward: true, limit: 4 },\n },\n // Absolute `id` bounds (`after`/`before` with positive ids) are\n // deliberately absent: event ids are the canonical \"legitimately\n // differs between adapters\" field (see `normalize_event`), and full\n // truncates renumber them differently per store, so a positive id\n // bound selects a different absolute window on each adapter. The\n // gated falsy-zero cases below compare only the *guard* behavior\n // (filter applied → subset, vs filter dropped → all), which stays a\n // well-defined divergence regardless of the concrete id values.\n // #1199 edge inputs — opposite semantics across adapters today.\n {\n label: \"empty names filter\",\n query: { stream: `^${event_prefix}`, names: [] as string[] },\n gated: \"queryEdgeInputs\",\n },\n {\n label: \"before: 0 (falsy-zero guard)\",\n query: { stream: `^${event_prefix}`, before: 0 },\n gated: \"queryEdgeInputs\",\n },\n {\n label: \"backward + after: 0 (falsy-zero guard)\",\n query: { stream: `^${event_prefix}`, backward: true, after: 0 },\n gated: \"queryEdgeInputs\",\n },\n ];\n\n return {\n event_prefix,\n event_streams,\n sub_prefix,\n ops,\n subs,\n correlation,\n pii_stream,\n query_cases,\n filter_name,\n };\n};\n\n/** Replay the generated workload against a single store. */\nconst apply_plan = async (\n store: Store,\n plan: Plan,\n pii_isolation: boolean\n): Promise<void> => {\n // Register subscriptions first so the lease-lifecycle ops have targets.\n await store.subscribe(\n plan.subs.map((s) => ({\n stream: s.stream,\n source: s.source,\n lane: s.lane,\n priority: s.priority,\n }))\n );\n\n // Adapter-local map of the lease holder currently owning each of *this\n // plan's* subscription streams, kept in sync from `claim` results. The\n // finalize verbs read the real current holder so their durable effect is\n // a deterministic function of the op sequence — the holder UUID itself is\n // an adapter detail (normalized away in the assertions). A verb whose\n // target isn't held is skipped, exactly as an unheld `ack`/`block` would\n // no-op inside the adapter.\n const held = new Map<string, string>();\n const owned = new Set(plan.subs.map((s) => s.stream));\n\n for (const op of plan.ops) {\n if (op.t === \"commit\") {\n const msgs =\n op.pii && pii_isolation\n ? op.msgs.map((m, i) => (i === 0 ? { ...m, pii: op.pii } : m))\n : op.msgs;\n await store.commit<CounterEvents>(\n op.stream,\n msgs as CounterMessage[],\n make_meta({ stream: op.stream, correlation: plan.correlation })\n );\n } else if (op.t === \"snapshot\") {\n await store.commit(\n op.stream,\n [{ name: SNAP_EVENT, data: { count: op.count } }],\n make_meta({ stream: op.stream, correlation: plan.correlation })\n );\n } else if (op.t === \"truncate\") {\n await store.truncate([\n { stream: op.stream, snapshot: { count: op.count } },\n ]);\n } else if (op.t === \"truncate_windowed\") {\n // Write a boundary snapshot, then prefix-delete below it. `before`\n // sits just after the snapshot's commit time; `max_id` (when set) is\n // wide so it never excludes the boundary. Deterministic across\n // adapters: the boundary is a real event the workload wrote.\n await store.commit(\n op.stream,\n [{ name: SNAP_EVENT, data: { count: 1 } }],\n make_meta({ stream: op.stream, correlation: plan.correlation })\n );\n await store.truncate([\n {\n stream: op.stream,\n before: new Date(Date.now() + 60_000),\n // A wide cap that still fits a 32-bit event-id column, so it\n // never excludes the boundary snapshot on any adapter.\n ...(op.max_id ? { max_id: 2_147_483_647 } : {}),\n },\n ]);\n } else if (op.t === \"claim\") {\n // Budget wide enough to lease every claimable stream in one call, so\n // *which* streams get leased never depends on an adapter's frontier\n // tie-break order — every unleased, unblocked, non-deferred stream is\n // claimed under a fresh holder. Record the new holder for this plan's\n // streams; the finalize verbs read it back.\n const by = uid();\n const leased = await store.claim(100_000, 100_000, by, op.millis);\n for (const l of leased) if (owned.has(l.stream)) held.set(l.stream, by);\n } else if (op.t === \"ack\") {\n const stream = plan.subs[op.sub].stream;\n const by = held.get(stream);\n if (by) {\n // Advance the watermark to 0 (the opening event) and release.\n await store.ack([{ stream, at: 0, by, retry: 0, lagging: true }]);\n held.delete(stream);\n }\n } else if (op.t === \"defer\") {\n const stream = plan.subs[op.sub].stream;\n const by = held.get(stream);\n if (by) {\n const lease: Lease = {\n stream,\n at: 0,\n by,\n retry: 0,\n lagging: true,\n due: op.due,\n };\n await store.ack([lease]);\n held.delete(stream);\n }\n } else if (op.t === \"block\") {\n const stream = plan.subs[op.sub].stream;\n const by = held.get(stream);\n if (by) {\n const lease: BlockedLease = {\n stream,\n at: 0,\n by,\n retry: 0,\n lagging: true,\n error: op.error,\n };\n await store.block([lease]);\n held.delete(stream);\n }\n } else if (op.t === \"unblock\") {\n const stream = plan.subs[op.sub].stream;\n await store.unblock([stream]);\n held.delete(stream);\n } else if (op.t === \"reset_sub\") {\n const stream = plan.subs[op.sub].stream;\n await store.reset([stream]);\n held.delete(stream);\n } else {\n await store.prioritize(\n { stream: plan.subs[op.sub].stream, stream_exact: true },\n op.priority\n );\n }\n }\n};\n\n/**\n * Cross-adapter differential contract (#1030, fuzz workloads #1057,\n * lease/truncate/pii/query fuzz #1200).\n *\n * Adapters can drift in ways per-adapter cases don't catch — event\n * ordering, the `with_snaps` snapshot floor, the exact shape of\n * `query_stats` / `query_streams` output, the lease lifecycle's effect on\n * a stream's `retry`/`blocked`/`error`, windowed-truncate boundaries,\n * `forget_pii` erasure, and query-option edge cases. This harness drives a\n * **family of randomized, seeded workloads** — commits (some PII-bearing),\n * inline + windowed truncates, subscriptions, and the full lease lifecycle\n * (`claim` / `ack` / `defer` / `block` / `unblock` / `reset` /\n * `prioritize`) — against every store in `options.stores`, then asserts\n * their **normalized** outputs are byte-for-byte identical for every\n * workload.\n *\n * Each workload is its own seeded plan (`seed`, `seed + 1`, …): the\n * operation sequence — and even its length — varies by seed, so divergence\n * is hunted across a slice of the input space rather than one fixed script.\n * The seeds are deterministic, so a failing workload is always replayable.\n *\n * Normalization drops only the fields that legitimately differ between\n * stores (absolute event ids, `created` timestamps, correlation/causation\n * uuids, lease holder UUIDs, and wall-clock lease expiries) and keeps\n * everything that defines correctness (stream, version, name, data,\n * emission order, and the durable subscription state a lease op leaves\n * behind: watermark, retry, blocked, error, priority, lane). Stream names\n * carry mixed case so a case-insensitive pattern filter (#1197) surfaces as\n * a diff.\n *\n * Wire it with the in-memory store as the reference and one or more\n * durable adapters as comparands:\n *\n * @example\n * ```ts\n * import { runStoreDifferentialTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryStore } from \"@rotorsoft/act\";\n * import { PostgresStore } from \"../src/index.js\";\n *\n * runStoreDifferentialTck({\n * name: \"InMemory vs Postgres\",\n * runs: 6, // durable adapter: fewer workloads keep the suite fast\n * stores: [\n * { name: \"InMemoryStore\", factory: () => new InMemoryStore() },\n * { name: \"PostgresStore\", factory: () => new PostgresStore({ ... }) },\n * ],\n * });\n * ```\n */\nexport const runStoreDifferentialTck = (\n options: StoreDifferentialTckOptions\n): void => {\n describe(`TCK / Store differential / ${options.name}`, () => {\n const base_seed = options.seed ?? 0xac7;\n const stream_count = options.streams ?? 4;\n const pii_isolation = options.piiIsolation ?? true;\n // Spread-merge (not `?? {}`) so an absent `skip` carries no branch: the\n // spread of `undefined` yields `{}` with nothing for coverage to owe —\n // mirrors `store-tck.ts`'s `{ ...options.capabilities }`.\n const skip: DifferentialSkips = { ...options.skip };\n const plans = Array.from({ length: options.runs ?? 8 }, (_, r) =>\n build_plan(base_seed + r, stream_count, pii_isolation)\n );\n const live: Array<{ name: string; store: Store }> = [];\n\n beforeAll(async () => {\n for (const spec of options.stores) {\n const store = await spec.factory();\n await store.drop();\n await store.seed();\n // Each plan namespaces its streams with a unique tag, so every\n // workload coexists in one store — a single drop+seed per store\n // keeps the durable-adapter cost flat regardless of `runs`.\n for (const plan of plans) await apply_plan(store, plan, pii_isolation);\n live.push({ name: spec.name, store });\n }\n });\n\n afterAll(async () => {\n for (const { store } of live) await store.dispose();\n });\n\n /**\n * Run `produce` against every store and assert each comparand's\n * result deep-equals the reference (the first store). The store name\n * rides along in the assertion message so a divergence names the\n * culprit.\n */\n const assert_identical = async <T>(\n label: string,\n produce: (store: Store) => Promise<T>\n ): Promise<void> => {\n const reference = await produce(live[0].store);\n for (let i = 1; i < live.length; i++) {\n const actual = await produce(live[i].store);\n expect(\n actual,\n `${live[i].name} diverged from ${live[0].name} on \"${label}\"`\n ).toEqual(reference);\n }\n };\n\n plans.forEach((plan, run) => {\n const seed_hex = `0x${(base_seed + run).toString(16)}`;\n describe(`workload ${run} (seed ${seed_hex})`, () => {\n it(\"yields identical event order under a global forward query\", async () => {\n await assert_identical(\"forward query\", async (store) => {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream: `^${plan.event_prefix}` }\n );\n return out;\n });\n });\n\n it(\"yields identical snapshot floors under with_snaps\", async () => {\n await assert_identical(\"with_snaps floor\", async (store) => {\n const by_stream: Record<string, NormalizedEvent[]> = {};\n for (const stream of plan.event_streams) {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream, stream_exact: true, with_snaps: true }\n );\n by_stream[stream] = out;\n }\n return by_stream;\n });\n });\n\n it(\"yields identical order under backward traversal\", async () => {\n await assert_identical(\"backward query\", async (store) => {\n const by_stream: Record<string, NormalizedEvent[]> = {};\n for (const stream of plan.event_streams) {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream, stream_exact: true, backward: true }\n );\n by_stream[stream] = out;\n }\n return by_stream;\n });\n });\n\n // Query-option matrix (#1200): each filter dimension must select\n // the same normalized events on every adapter. Gated edge-input\n // cases (#1199) are skipped while the matching flag is on.\n plan.query_cases.forEach((qc) => {\n const gated = qc.gated && skip[qc.gated];\n it.skipIf(gated)(\n `yields identical events under ${qc.label}`,\n async () => {\n await assert_identical(`query / ${qc.label}`, async (store) => {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>((e) => {\n out.push(normalize_event(e));\n }, qc.query);\n return out;\n });\n }\n );\n });\n\n it(\"yields identical query_stats output (head/tail/count/names)\", async () => {\n await assert_identical(\"query_stats\", async (store) => {\n const stats = await store.query_stats<Schemas>(\n { stream: `^${plan.event_prefix}` },\n { tail: true, count: true, names: true }\n );\n // Capture key order (query_stats filter form orders by stream\n // name — a contract) alongside normalized per-stream content.\n const keys = [...stats.keys()];\n const content: Record<\n string,\n {\n head: Omit<NormalizedEvent, \"pii\">;\n tail: Omit<NormalizedEvent, \"pii\">;\n count: number | undefined;\n names: Readonly<Record<string, number>> | undefined;\n }\n > = {};\n for (const [stream, s] of stats) {\n // `tail: true` is requested, so every returned stream carries\n // a tail. A store that omits it is itself a divergence — let\n // the non-null access surface it loudly rather than masking it\n // with a fallback the workload can never otherwise reach.\n content[stream] = {\n head: normalize_identity(s.head),\n tail: normalize_identity(\n s.tail as Committed<Schemas, keyof Schemas>\n ),\n count: s.count,\n names: s.names as Record<string, number> | undefined,\n };\n }\n return { keys, content };\n });\n });\n\n it(\"yields identical query_streams output (incl. lease-lifecycle state)\", async () => {\n await assert_identical(\"query_streams\", async (store) => {\n const rows: Array<{\n stream: string;\n source: string | undefined;\n at: number;\n blocked: boolean;\n priority: number;\n lane: string | undefined;\n retry: number;\n error: string;\n // Lease holder UUID + expiry are non-portable; normalize to\n // a presence flag so \"is this stream currently leased\" is\n // compared without depending on the exact holder/clock.\n leased: boolean;\n }> = [];\n const { count } = await store.query_streams(\n (p) => {\n rows.push({\n stream: p.stream,\n source: p.source,\n at: p.at,\n blocked: p.blocked,\n priority: p.priority,\n lane: p.lane,\n retry: p.retry,\n error: p.error,\n leased: p.leased_by != null,\n });\n },\n { stream: `^${plan.sub_prefix}`, limit: 1000 }\n );\n // Branchless, locale-stable ordering so the comparison is\n // independent of whatever order each adapter streams rows in.\n rows.sort((a, b) => a.stream.localeCompare(b.stream));\n return { count, rows };\n });\n });\n\n // Case-sensitivity of the pattern filter (#1197): the subscription\n // streams are mixed-case (`Diff-…-Sub-S{i}`); filtering with the\n // **lower-cased** form of the same pattern must select the *same*\n // set on every adapter. On case-sensitive engines (PG `~`, InMemory\n // `RegExp`) that set is empty — the case doesn't match. SQLite's\n // ASCII-case-insensitive `LIKE` overmatches and returns the whole\n // family, so the differential goes red until #1197 flips it to a\n // case-sensitive matcher. Gated behind `caseInsensitivePatterns`.\n it.skipIf(skip.caseInsensitivePatterns)(\n \"matches case-sensitively under a lower-cased pattern filter\",\n async () => {\n await assert_identical(\n \"query_streams lower-cased pattern\",\n async (store) => {\n const collect_streams = async (\n pattern: string\n ): Promise<string[]> => {\n const streams: string[] = [];\n await store.query_streams(\n (p) => {\n streams.push(p.stream);\n },\n { stream: pattern, limit: 1000 }\n );\n streams.sort((a, b) => a.localeCompare(b));\n return streams;\n };\n // Correctly-cased control: returns the whole sub family on\n // every adapter (exercises the match path). Lower-cased\n // discriminator: empty on a case-sensitive matcher,\n // overmatched to the full family on SQLite's LIKE. Both\n // ride in the compared payload so the control proves the\n // corpus is matchable while the discriminator surfaces\n // #1197.\n const matched = await collect_streams(`^${plan.sub_prefix}S`);\n const lowered = await collect_streams(\n `^${plan.sub_prefix.toLowerCase()}s`\n );\n return { matched, lowered };\n }\n );\n }\n );\n\n // Exact-match mixed-case: case-exact on every adapter, so it runs\n // unconditionally — the control that proves the mixed-case corpus\n // itself round-trips even where the pattern path is gated.\n it(\"yields identical events under an exact mixed-case stream lookup\", async () => {\n await assert_identical(\"query exact mixed-case\", async (store) => {\n const out: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n out.push(normalize_event(e));\n },\n { stream: plan.event_streams[0], stream_exact: true }\n );\n return out;\n });\n });\n\n // forget_pii erasure (#1200): wipe PII on the seeded stream and\n // assert every adapter reports the same erased-count and that the\n // reload shows PII gone identically. Only runs when the adapters\n // implement the optional surface.\n it.skipIf(!pii_isolation)(\n \"erases pii identically via forget_pii\",\n async () => {\n await assert_identical(\"forget_pii erase\", async (store) => {\n // forget_pii is capability-gated on the port; the caller\n // declared support via `piiIsolation`, so it is present.\n // Call it as a method (not a detached reference) so adapters\n // that read `this` keep their binding.\n const erased = await store.forget_pii!(plan.pii_stream);\n const after: NormalizedEvent[] = [];\n await store.query<Schemas>(\n (e) => {\n after.push(normalize_event(e));\n },\n { stream: plan.pii_stream, stream_exact: true }\n );\n return { erased, after };\n });\n }\n );\n });\n });\n });\n};\n","import { fc, test } from \"@fast-check/vitest\";\nimport type { Store } from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect } from \"vitest\";\nimport type { CounterEvents } from \"./fixtures/events.js\";\nimport { collect, inc, make_meta } from \"./fixtures/helpers.js\";\n\n/**\n * Property-based contract for the store-level invariants the drain pipeline\n * depends on — commit version monotonicity, claim/lease no-leak, watermark\n * monotonicity, and block exclusion. These ran only against `InMemoryStore`\n * before ACT-982; running them against the durable adapters too is the only\n * way to catch a divergence the example-based TCK cases miss.\n *\n * Each predicate resets the store (`drop` + `seed`) so randomized runs are\n * isolated. Durable adapters should pass a reduced `numRuns` and their own\n * dedicated schema/file so a parallel test worker can't clobber the table.\n */\nexport type StorePropertyTckOptions = {\n /** Adapter name for the describe block. */\n name: string;\n /** Produces the store under test (created once, reset between runs). */\n factory: () => Store | Promise<Store>;\n /** fast-check runs per property. Default 100; lower for durable adapters. */\n numRuns?: number;\n};\n\nconst streamArb = fc.constantFrom(\"s1\", \"s2\", \"s3\");\nconst commitArb = fc.record({\n stream: streamArb,\n count: fc.integer({ min: 1, max: 3 }),\n});\n\nconst claimStreamArb = fc.constantFrom(\"a\", \"b\", \"c\");\nconst opArb = fc.oneof(\n fc.record({ kind: fc.constant(\"commit\" as const), stream: claimStreamArb }),\n fc.record({ kind: fc.constant(\"claim\" as const) }),\n fc.record({ kind: fc.constant(\"ack-all\" as const) }),\n fc.record({ kind: fc.constant(\"block-all\" as const) })\n);\n\nconst events = (count: number) => Array.from({ length: count }, () => inc(1));\n\nexport const runStorePropertyTck = (options: StorePropertyTckOptions): void => {\n const numRuns = options.numRuns ?? 100;\n\n describe(`TCK / Store properties / ${options.name}`, () => {\n let store: Store;\n\n beforeAll(async () => {\n store = await options.factory();\n await store.seed();\n });\n afterAll(async () => {\n await store.dispose();\n });\n\n // Clean slate per randomized run. claim() spans every claimable stream\n // in the table, so namespacing alone can't isolate the claim properties;\n // a full reset is the only safe option.\n const reset = async () => {\n await store.drop();\n await store.seed();\n };\n\n describe(\"commit version invariants\", () => {\n test.prop([fc.array(commitArb, { minLength: 0, maxLength: 30 })], {\n numRuns,\n })(\n \"per-stream versions are 0..N-1 in commit order, regardless of interleaving\",\n async (commits) => {\n await reset();\n const expected = new Map<string, number>();\n for (const { stream, count } of commits) {\n const before = expected.get(stream) ?? -1;\n const committed = await store.commit<CounterEvents>(\n stream,\n events(count),\n make_meta({ stream })\n );\n committed.forEach((e, i) => {\n expect(e.version).toBe(before + 1 + i);\n });\n expected.set(stream, before + count);\n }\n for (const stream of new Set(commits.map((c) => c.stream))) {\n const seen = await collect(store, { stream, stream_exact: true });\n seen.forEach((e, i) => {\n expect(e.version).toBe(i);\n });\n }\n }\n );\n\n test.prop([fc.array(commitArb, { minLength: 1, maxLength: 20 })], {\n numRuns,\n })(\n \"bad expectedVersion throws and commits no events\",\n async (commits) => {\n await reset();\n for (const { stream, count } of commits) {\n await store.commit<CounterEvents>(\n stream,\n events(count),\n make_meta({ stream })\n );\n }\n const stream = commits[0].stream;\n const before = await collect(store, { stream, stream_exact: true });\n // Actual head is before.length - 1, so before.length is wrong.\n await expect(\n store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream }),\n before.length\n )\n ).rejects.toThrow();\n const after = await collect(store, { stream, stream_exact: true });\n expect(after.length).toBe(before.length);\n }\n );\n });\n\n describe(\"claim/lease lifecycle invariants\", () => {\n test.prop([fc.array(opArb, { minLength: 1, maxLength: 30 })], {\n numRuns,\n })(\n \"no leaks: claims are always acked or blocked, never lost\",\n async (ops) => {\n await reset();\n await store.subscribe([\n { stream: \"a\" },\n { stream: \"b\" },\n { stream: \"c\" },\n ]);\n let totalClaims = 0;\n let totalResolved = 0;\n let pending: Awaited<ReturnType<Store[\"claim\"]>> = [];\n for (const op of ops) {\n if (op.kind === \"commit\") {\n await store.commit<CounterEvents>(\n op.stream,\n [inc(1)],\n make_meta({ stream: op.stream })\n );\n } else if (op.kind === \"claim\") {\n const claimed = await store.claim(5, 5, \"worker\", 60_000);\n totalClaims += claimed.length;\n pending = [...pending, ...claimed];\n } else if (op.kind === \"ack-all\") {\n const acked = await store.ack(pending);\n totalResolved += acked.length;\n pending = pending.filter(\n (p) => !acked.find((a) => a.stream === p.stream)\n );\n } else {\n const blocked = await store.block(\n pending.map((p) => ({ ...p, error: \"test\" }))\n );\n totalResolved += blocked.length;\n pending = pending.filter(\n (p) => !blocked.find((b) => b.stream === p.stream)\n );\n }\n }\n expect(totalResolved + pending.length).toBe(totalClaims);\n }\n );\n\n test.prop(\n [\n fc.array(claimStreamArb, { minLength: 1, maxLength: 5 }),\n fc.array(claimStreamArb, { minLength: 0, maxLength: 5 }),\n ],\n { numRuns }\n )(\n \"ack advances the watermark monotonically per stream\",\n async (commitsA, commitsB) => {\n await reset();\n const all = [...new Set([...commitsA, ...commitsB, \"a\", \"b\", \"c\"])];\n await store.subscribe(all.map((stream) => ({ stream })));\n for (const stream of commitsA) {\n await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const acked1 = await store.ack(\n await store.claim(10, 10, \"worker\", 60_000)\n );\n // Seed every subscribed stream at -1 so the comparison below is\n // unconditional — streams not acked in batch 1 just compare\n // against -1, keeping the property branch-free for coverage.\n const watermark1 = new Map(all.map((stream) => [stream, -1]));\n for (const l of acked1) watermark1.set(l.stream, l.at);\n for (const stream of commitsB) {\n await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const acked2 = await store.ack(\n await store.claim(10, 10, \"worker\", 60_000)\n );\n for (const lease of acked2) {\n expect(lease.at).toBeGreaterThanOrEqual(\n watermark1.get(lease.stream) as number\n );\n }\n }\n );\n\n test.prop([fc.array(claimStreamArb, { minLength: 1, maxLength: 5 })], {\n numRuns,\n })(\"blocked streams cannot be claimed again\", async (commits) => {\n await reset();\n const streams = [...new Set(commits)];\n await store.subscribe(streams.map((stream) => ({ stream })));\n for (const stream of commits) {\n await store.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const claimed = await store.claim(10, 10, \"worker\", 60_000);\n await store.block(claimed.map((l) => ({ ...l, error: \"test\" })));\n const blockedSet = new Set(claimed.map((l) => l.stream));\n // A control stream committed *after* the first claim is guaranteed\n // claimable, so the re-claim is non-empty and the exclusion check\n // below actually runs — while still proving no blocked stream\n // reappears.\n await store.subscribe([{ stream: \"ctrl\" }]);\n await store.commit<CounterEvents>(\n \"ctrl\",\n [inc(1)],\n make_meta({ stream: \"ctrl\" })\n );\n const reclaim = await store.claim(10, 10, \"worker2\", 60_000);\n for (const l of reclaim) expect(blockedSet.has(l.stream)).toBe(false);\n });\n });\n });\n};\n","import {\n act,\n ConcurrencyError,\n InMemoryCache,\n SNAP_EVENT,\n TOMBSTONE_EVENT,\n ValidationError,\n} from \"@rotorsoft/act\";\nimport type {\n BlockedLease,\n Committed,\n EventSource,\n Lease,\n ScanOptions,\n ScanResult,\n Schemas,\n Store,\n StoreNotification,\n} from \"@rotorsoft/act/types\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport type { CounterEvents } from \"./fixtures/events.js\";\nimport {\n type CommittedCounterEvent,\n collect,\n dec,\n inc,\n make_meta,\n reset as reset_event,\n seed_stream,\n uid,\n} from \"./fixtures/helpers.js\";\n\n/**\n * Optional features a {@link Store} implementation may or may not\n * support. Default to `false` — only enable a flag when the adapter\n * exposes the corresponding surface and you want the TCK to cover it.\n */\nexport type StoreCapabilities = {\n /**\n * Adapter implements {@link Store.notify}. When `true`, the TCK runs\n * the cross-instance conformance cases: a listener receives commits\n * from a *sibling* instance produced by the same `factory`, never its\n * own commits (the port's self-filtering MUST), and exactly one\n * notification per commit transaction carrying the full event batch.\n * Requires the `factory` to produce instances sharing one backing\n * store — e.g. two PostgresStores on the same schema/table, or two\n * `withBroker` decorators on one broker. True cross-*process*\n * LISTEN/NOTIFY plumbing needs two processes and stays in the\n * adapter's own suite.\n */\n readonly notify?: boolean;\n /**\n * Adapter implements {@link Store.restore}. When `true`, the TCK\n * runs the full restore suite — empty-source / single-stream /\n * multi-stream happy paths, ISO-string `created`, pre-existing\n * wipe, subscription clearing, causation remap, and atomic\n * rollback on mid-iteration throw.\n */\n readonly restore?: boolean;\n /**\n * Adapter supports sensitive-data isolation (#566): accepts the\n * optional `pii` field on commit messages, returns it on load\n * outputs, and implements {@link Store.forget_pii}. When `true`,\n * the TCK runs the PII isolation suite — commit-with-pii\n * round-trip, commit-without-pii passthrough, `forget_pii` happy\n * path, idempotency, and isolation across streams.\n */\n readonly pii_isolation?: boolean;\n /**\n * Adapter supports competing consumers — two workers may call\n * `claim()` concurrently and the store hands each stream to at most\n * one of them (PostgreSQL via `FOR UPDATE SKIP LOCKED`; the in-memory\n * store via single-threaded atomic claim). When `true`, the TCK runs\n * the concurrency suite. Single-writer embedded stores (e.g. SQLite,\n * where concurrent write transactions raise `SQLITE_BUSY` rather than\n * serializing) leave this `false`: their deployment model is a single\n * drain worker per database file.\n */\n readonly concurrent_claim?: boolean;\n /**\n * Adapter implements the {@link QueryStreams.source_matches} reverse-\n * match filter — \"subscriptions whose stored `source` pattern matches\n * at least one of these names\" (`name ~ source`). When `true`, the TCK\n * runs the `source_matches` suite. Stores that can't express reverse-\n * regex (e.g. an anchor-aware `LIKE` approximation) leave it `false`;\n * the close-cycle safety probe then falls back to an unfiltered scan,\n * so correctness never depends on this flag — only probe cost.\n */\n readonly source_matches?: boolean;\n /**\n * Adapter matches a **pattern** reaction `source` (one carrying regex\n * metacharacters, e.g. the calculator's `^(A|B)$`) as a full RegExp in\n * claim()'s has-work probe, so a stream whose max event id exceeds the\n * subscription watermark is claimed when its name matches the pattern.\n * When `true`, the TCK runs the pattern-source claim suite. Literal\n * sources stay exact everywhere regardless of this flag — the fast,\n * index-friendly path.\n *\n * Stores that cannot run an arbitrary regex against candidate streams\n * (e.g. SQLite, whose libsql build has no `REGEXP` and whose portable\n * `LIKE` grammar cannot express alternation/grouping) leave this\n * `false` and instead reject a non-portable claim source at\n * {@link subscribe} time — see {@link rejects_nonportable_claim_source}.\n */\n readonly pattern_claim_source?: boolean;\n /**\n * Adapter cannot faithfully match every regex claim `source`, so it\n * fails loud at registration: {@link subscribe} throws\n * {@link ValidationError} for a source outside its portable subset\n * (alternation/grouping like `^(A|B)$`), rather than silently never\n * claiming the stream. When `true`, the TCK runs the reject-at-subscribe\n * case. Currently only SQLite sets this — its message points operators\n * to InMemory/PG for full regex claim sources.\n */\n readonly rejects_nonportable_claim_source?: boolean;\n};\n\n/**\n * Options for {@link runStoreTck}.\n */\nexport type StoreTckOptions = {\n /**\n * Display name for the implementation under test.\n */\n readonly name: string;\n /**\n * Returns the {@link Store} instance under test. Called once during\n * `beforeAll`. The TCK does not assume a fresh store per test — each\n * test namespaces its streams via {@link uid} so they don't collide.\n * The TCK calls `store.seed()` once before any test runs and\n * `store.dispose()` after all tests, with `store.drop()` in between\n * if any test needs it.\n */\n readonly factory: () => Store | Promise<Store>;\n /**\n * Optional capabilities flags — see {@link StoreCapabilities}.\n */\n readonly capabilities?: StoreCapabilities;\n};\n\n/**\n * Runs the Store contract test compatibility kit against the\n * implementation produced by `options.factory`.\n *\n * The TCK is the executable definition of the {@link Store} contract.\n * Every method on the interface in `libs/act/src/types/ports.ts` has\n * matching cases here:\n *\n * - `commit` — single + multi-event commits, optimistic concurrency\n * - `query` — stream, names, correlation, before, after, created_after,\n * created_before, limit, with_snaps, stream_exact, backward traversal\n * - stream filter grammar — the portable regex subset (`^`, `$`, `.`,\n * `.*`, literal characters) matches identically everywhere; richer\n * patterns either match with full regex semantics or throw\n * `ValidationError` — never a silent approximation\n * - `subscribe` — idempotent re-subscribe, watermark return value\n * - `claim` / `ack` — lease lifecycle, dual frontiers, leased streams\n * not double-claimed, exact-source has-work matching, timed-out-lease\n * retry accounting\n * - `block` — blocked streams hidden from claim, only same-drainer can block\n * - `reset` — restart watermarks (including blocked), no-op for missing\n * - `prioritize` — bulk priority updates by filter\n * - `truncate` — snapshot vs tombstone seeding, empty inputs, missing\n * streams; windowed boundaries (`before`/`max_id`) — prefix deleted\n * behind the closest safe snapshot, tail + subscriptions kept,\n * no-snapshot no-op, mixed full + windowed targets\n * - `query_streams` — filters, exact-match, pagination, blocked\n * - `notify` (capability-gated) — cross-instance delivery, self-filtering\n * (an instance never receives its own commits), one notification per\n * commit transaction with the full event batch\n *\n * Tests namespace their streams with a per-test {@link uid} so the\n * suite is parallel-safe against a shared backing store (e.g., a real\n * Postgres instance running tests for the whole monorepo concurrently).\n *\n * @example\n * ```ts\n * import { runStoreTck } from \"@rotorsoft/act-tck\";\n * import { InMemoryStore } from \"@rotorsoft/act\";\n *\n * runStoreTck({\n * name: \"InMemoryStore\",\n * factory: () => new InMemoryStore(),\n * });\n * ```\n */\nexport const runStoreTck = (options: StoreTckOptions): void => {\n describe(`TCK / Store / ${options.name}`, () => {\n let store: Store;\n // Spread (rather than `?? {}`) so the default-empty path doesn't\n // create a branch every adapter has to disprove. `{ ...undefined }`\n // is a runtime no-op that yields `{}`.\n const caps: StoreCapabilities = { ...options.capabilities };\n\n beforeAll(async () => {\n store = await options.factory();\n await store.drop();\n await store.seed();\n });\n\n afterAll(async () => {\n await store.dispose();\n });\n\n describe(\"commit\", () => {\n it(\"returns committed events with sequenced ids and versions\", async () => {\n const s = `commit-seq-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), dec(3)],\n make_meta({ stream: s })\n );\n expect(committed).toHaveLength(3);\n expect(committed[0].version).toBe(0);\n expect(committed[1].version).toBe(1);\n expect(committed[2].version).toBe(2);\n expect(committed[0].name).toBe(\"Incremented\");\n expect(committed[2].data).toEqual({ amount: 3 });\n for (let i = 1; i < committed.length; i++) {\n expect(committed[i].id).toBeGreaterThan(committed[i - 1].id);\n }\n });\n\n it(\"attaches correlation and stream metadata\", async () => {\n const s = `commit-meta-${uid()}`;\n const correlation = `cor-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s, correlation })\n );\n expect(committed[0].stream).toBe(s);\n expect(committed[0].meta.correlation).toBe(correlation);\n });\n\n it(\"throws ConcurrencyError when expectedVersion is wrong\", async () => {\n const s = `commit-cc-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s }),\n 0\n );\n await expect(\n store.commit<CounterEvents>(s, [inc(1)], make_meta({ stream: s }), 0)\n ).rejects.toBeInstanceOf(ConcurrencyError);\n });\n\n it(\"preserves prior events when a concurrent commit is rejected\", async () => {\n const s = `commit-cc-preserve-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2)],\n make_meta({ stream: s })\n );\n await expect(\n store.commit<CounterEvents>(s, [inc(3)], make_meta({ stream: s }), 0)\n ).rejects.toBeInstanceOf(ConcurrencyError);\n const found = await collect(store, { stream: s, stream_exact: true });\n expect(found).toHaveLength(2);\n });\n });\n\n describe(\"query\", () => {\n it(\"filters by stream, names, correlation, limit, with_snaps\", async () => {\n const s1 = `q-s1-${uid()}`;\n const s2 = `q-s2-${uid()}`;\n const cor = `q-cor-${uid()}`;\n await store.commit<CounterEvents>(\n s1,\n [inc(1), dec(1)],\n make_meta({ stream: s1, correlation: cor })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(2), dec(2), reset_event()],\n make_meta({ stream: s2, correlation: cor })\n );\n\n const by_stream = await collect(store, {\n stream: s1,\n stream_exact: true,\n });\n expect(by_stream).toHaveLength(2);\n\n const by_name = await collect(store, {\n stream: s2,\n stream_exact: true,\n names: [\"Reset\"],\n });\n expect(by_name).toHaveLength(1);\n expect(by_name[0].name).toBe(\"Reset\");\n\n const by_correlation = await collect(store, { correlation: cor });\n expect(by_correlation).toHaveLength(5);\n\n const limited = await collect(store, {\n correlation: cor,\n limit: 2,\n });\n expect(limited).toHaveLength(2);\n });\n\n it(\"with_snaps resumes from the latest snapshot per stream\", async () => {\n const s = `q-snap-${uid()}`;\n // 2 pre-snapshot domain events ...\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n // ... a snapshot ...\n const [snap] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n // ... and 3 events after it.\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1), inc(1)],\n make_meta({ stream: s })\n );\n\n // with_snaps resumes AT the latest snapshot: snapshot + the 3 after\n // it, never the 2 pre-snapshot events.\n const from_snap = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(from_snap).toHaveLength(4);\n expect(from_snap[0].name).toBe(SNAP_EVENT);\n\n // Without with_snaps: the 5 domain events, snapshot excluded.\n const domain = await collect(store, { stream: s, stream_exact: true });\n expect(domain).toHaveLength(5);\n\n // An explicit `after` overrides the snapshot floor.\n const after_snap = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: snap.id,\n });\n expect(after_snap).toHaveLength(3);\n\n // A stream with no snapshot returns its full history under with_snaps.\n const s2 = `q-nosnap-${uid()}`;\n await store.commit<CounterEvents>(\n s2,\n [inc(1), inc(1)],\n make_meta({ stream: s2 })\n );\n const full = await collect(store, {\n stream: s2,\n stream_exact: true,\n with_snaps: true,\n });\n expect(full).toHaveLength(2);\n });\n\n it(\"with_snaps applies the resume floor on a backward scan too\", async () => {\n const s = `q-snap-back-${uid()}`;\n // 2 pre-snapshot events, a snapshot, then 3 after it.\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n const [snap] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1), inc(1)],\n make_meta({ stream: s })\n );\n\n // The floor is direction-agnostic: forward resumes AT the snapshot,\n // backward stops AT it. Either way, only the snapshot + the 3 events\n // after it — never the 2 pre-snapshot events.\n const backward = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n backward: true,\n });\n expect(backward).toHaveLength(4);\n // DESC → the snapshot (lowest id in the floored set) comes last.\n expect(backward[backward.length - 1].name).toBe(SNAP_EVENT);\n expect(backward.every((e) => e.id >= snap.id)).toBe(true);\n\n // No snapshot → full history under with_snaps + backward.\n const s2 = `q-nosnap-back-${uid()}`;\n await store.commit<CounterEvents>(\n s2,\n [inc(1), inc(1)],\n make_meta({ stream: s2 })\n );\n const full = await collect(store, {\n stream: s2,\n stream_exact: true,\n with_snaps: true,\n backward: true,\n });\n expect(full).toHaveLength(2);\n });\n\n it(\"supports backward traversal\", async () => {\n const s = `q-back-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: s })\n );\n const forward = await collect(store, { stream: s, stream_exact: true });\n const backward = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n });\n expect(forward.map((e) => e.id)).toEqual(committed.map((c) => c.id));\n expect(backward.map((e) => e.id)).toEqual(\n [...committed].reverse().map((c) => c.id)\n );\n\n // Backward + limit — exercises the limit-break branch in the\n // backward-traversal path. Latest event only.\n const latest = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n limit: 1,\n });\n expect(latest).toHaveLength(1);\n expect(latest[0].id).toBe(committed.at(-1)!.id);\n });\n\n it(\"after/before bound the id range\", async () => {\n const s = `q-bounds-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3), inc(4)],\n make_meta({ stream: s })\n );\n const after_first = await collect(store, {\n stream: s,\n stream_exact: true,\n after: committed[0].id,\n });\n expect(after_first.map((e) => e.id)).toEqual(\n committed.slice(1).map((c) => c.id)\n );\n const before_last = await collect(store, {\n stream: s,\n stream_exact: true,\n before: committed[committed.length - 1].id,\n });\n expect(before_last.map((e) => e.id)).toEqual(\n committed.slice(0, -1).map((c) => c.id)\n );\n });\n\n // #1199: `names: []` means \"match no event names\" on every adapter.\n // An empty allow-list is an explicit \"nothing passes\" — the opposite\n // of an omitted `names` (which matches all). PG historically dropped\n // the empty filter (returned ALL); this pins the sane semantics.\n it(\"names:[] matches no events\", async () => {\n const s = `q-names-empty-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), dec(1)],\n make_meta({ stream: s })\n );\n const none = await collect(store, {\n stream: s,\n stream_exact: true,\n names: [],\n });\n expect(none).toHaveLength(0);\n // Omitting `names` still returns everything — the contrast case.\n const all = await collect(store, { stream: s, stream_exact: true });\n expect(all).toHaveLength(2);\n });\n\n // #1199: falsy-zero `after`/`before` are honored, not dropped by a\n // truthy guard. `after: 0` means strictly \"id > 0\"; `before: 0`\n // means strictly \"id < 0\" (matches nothing). InMemory ids start at\n // 0, so a truthy `if (after)` guard would leak id 0 on the backward\n // path — this pins `!== undefined` semantics across adapters.\n it(\"after:0 and before:0 are honored as id bounds\", async () => {\n const s = `q-zero-bound-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: s })\n );\n // before:0 → nothing has an id below 0.\n expect(\n await collect(store, { stream: s, stream_exact: true, before: 0 })\n ).toHaveLength(0);\n // before:0 on the backward path is equally empty.\n expect(\n await collect(store, {\n stream: s,\n stream_exact: true,\n before: 0,\n backward: true,\n })\n ).toHaveLength(0);\n // after:0 → strictly id > 0. On adapters whose ids start at 0 the\n // first event (id 0) is excluded; on 1-based adapters every event\n // survives. Either way no event with id <= 0 is returned.\n const forward = await collect(store, {\n stream: s,\n stream_exact: true,\n after: 0,\n });\n expect(forward.every((e) => e.id > 0)).toBe(true);\n // Backward path with after:0 must apply the same exclusive bound —\n // never leak an id-0 event.\n const backward = await collect(store, {\n stream: s,\n stream_exact: true,\n after: 0,\n backward: true,\n });\n expect(backward.every((e) => e.id > 0)).toBe(true);\n });\n\n it(\"created_after/created_before filter by timestamp\", async () => {\n const s = `q-ts-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Build the window from the event's OWN `created` (whatever clock\n // the store stamped it with) so the assertion can't flake on a\n // skew between the store's clock and the test runner's clock.\n const ts = committed[0].created.getTime();\n const before = new Date(ts - 60_000);\n const future = new Date(ts + 60_000);\n const in_window = await collect(store, {\n stream: s,\n stream_exact: true,\n created_after: before,\n created_before: future,\n });\n expect(in_window.length).toBe(1);\n const out_of_window = await collect(store, {\n stream: s,\n stream_exact: true,\n created_after: future,\n });\n expect(out_of_window.length).toBe(0);\n });\n\n it(\"backward traversal short-circuits at `after` id boundary\", async () => {\n const s = `q-back-after-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: s })\n );\n // Backward from the end, but only events newer than committed[0].id.\n const got = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n after: committed[0].id,\n });\n expect(got.map((e) => e.id)).toEqual([\n committed[2].id,\n committed[1].id,\n ]);\n });\n\n it(\"backward traversal short-circuits at `created_after` boundary\", async () => {\n const s = `q-back-cafter-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Asking backward with created_after = now+1m should short-circuit\n // immediately because the only event was created before that bound.\n const future = new Date(Date.now() + 60_000);\n const got = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n created_after: future,\n });\n expect(got).toHaveLength(0);\n });\n\n it(\"backward traversal honors created_before by skipping newer events\", async () => {\n const s = `q-back-ts-${uid()}`;\n // `make_meta()` with no stream — exercises the meta builder's\n // no-causation branch alongside the backward + created_before\n // path inside the adapter.\n const committed = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta()\n );\n // `created_before` strictly before the event's own timestamp, so\n // it must be skipped — relative to the store's clock, not the\n // host's, to avoid clock-skew flakiness.\n const past = new Date(committed[0].created.getTime() - 60_000);\n const got = await collect(store, {\n stream: s,\n stream_exact: true,\n backward: true,\n created_before: past,\n });\n expect(got).toHaveLength(0);\n });\n\n it(\"stream_exact disables regex matching\", async () => {\n const tag = uid();\n const a = `q-exact-${tag}`;\n const b = `q-exact-${tag}-extra`;\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [inc(2)],\n make_meta({ stream: b })\n );\n const exact = await collect(store, { stream: a, stream_exact: true });\n expect(exact).toHaveLength(1);\n expect(exact[0].data).toEqual({ amount: 1 });\n });\n\n // Regex anchor contract — same across every Store. Caller controls\n // anchors. `^foo` for prefix, `foo$` for suffix, `^foo$` for whole-\n // string. A plain `foo` is a substring match. Auto-anchoring by the\n // adapter is a contract violation.\n it(\"plain regex without anchors is a substring match\", async () => {\n const tag = uid();\n const inner = `qr-${tag}-inner`;\n const longer = `qr-${tag}-inner-extra`;\n await store.commit<CounterEvents>(\n inner,\n [inc(1)],\n make_meta({ stream: inner })\n );\n await store.commit<CounterEvents>(\n longer,\n [inc(2)],\n make_meta({ stream: longer })\n );\n const got = await collect(store, { stream: `qr-${tag}-inner` });\n expect(got.map((e) => e.stream).sort()).toEqual([inner, longer].sort());\n });\n\n it(\"caller-anchored `^name$` matches only the whole string\", async () => {\n const tag = uid();\n const inner = `qr-${tag}-anchor`;\n const longer = `qr-${tag}-anchor-extra`;\n await store.commit<CounterEvents>(\n inner,\n [inc(1)],\n make_meta({ stream: inner })\n );\n await store.commit<CounterEvents>(\n longer,\n [inc(2)],\n make_meta({ stream: longer })\n );\n const got = await collect(store, { stream: `^qr-${tag}-anchor$` });\n expect(got).toHaveLength(1);\n expect(got[0].stream).toBe(inner);\n });\n\n it(\"caller-anchored `^prefix` matches by prefix\", async () => {\n const tag = uid();\n const a = `qr-${tag}-pfx-a`;\n const b = `qr-${tag}-pfx-b`;\n const other = `zz-${tag}-other`;\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [inc(2)],\n make_meta({ stream: b })\n );\n await store.commit<CounterEvents>(\n other,\n [inc(3)],\n make_meta({ stream: other })\n );\n const got = await collect(store, { stream: `^qr-${tag}-pfx-` });\n expect(got.map((e) => e.stream).sort()).toEqual([a, b].sort());\n });\n });\n\n // Stream-filter grammar conformance. The portable subset — `^` / `$`\n // anchors, `.` (any single character), `.*` (any run), and literal\n // characters — must produce identical matches on every adapter\n // (PG POSIX `~`, InMemory `RegExp`, SQLite anchor-aware `LIKE`).\n // Richer regex is adapter-optional: an adapter either matches it\n // with full regex semantics or throws `ValidationError`. Silently\n // returning wrong rows (e.g. from a lossy LIKE approximation) is a\n // contract violation — and the worst one available when the filter\n // drives `reset` / `unblock`.\n describe(\"stream filter grammar\", () => {\n const seed_streams = async (streams: string[]) => {\n for (const s of streams)\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n };\n\n const streams_matching = async (pattern: string) =>\n (await collect(store, { stream: pattern })).map((e) => e.stream).sort();\n\n // A non-portable pattern must never silently mis-match: the store\n // either returns exactly the full-regex-semantics result set or\n // throws ValidationError at the call site.\n const match_exactly_or_throw = async (\n pattern: string,\n expected: string[]\n ) => {\n let matched: string[] | undefined;\n let error: unknown;\n try {\n matched = await streams_matching(pattern);\n } catch (e) {\n error = e;\n }\n if (error !== undefined) expect(error).toBeInstanceOf(ValidationError);\n else expect(matched).toEqual(expected.sort());\n };\n\n it(\"portable subset: anchors, `.`, and `.*` match identically\", async () => {\n const tag = uid();\n const plain = `g-${tag}-plain`;\n const dotted = `g-${tag}.dot`;\n const scored = `g-${tag}_us`;\n const pct = `g-${tag}%pc`;\n await seed_streams([plain, dotted, scored, pct]);\n\n // ^prefix — all four, regex-significant literals included\n expect(await streams_matching(`^g-${tag}`)).toEqual(\n [plain, dotted, scored, pct].sort()\n );\n // suffix$ — one\n expect(await streams_matching(`${tag}-plain$`)).toEqual([plain]);\n // ^exact$ — one\n expect(await streams_matching(`^g-${tag}-plain$`)).toEqual([plain]);\n // single `.` is a one-character wildcard: matches the literal\n // dot in `dotted` and the `-` in `plain`\n expect(await streams_matching(`^g-${tag}.dot$`)).toEqual([dotted]);\n expect(await streams_matching(`^g-${tag}.plain$`)).toEqual([plain]);\n // `.*` — any run\n expect(await streams_matching(`^g-${tag}.*dot$`)).toEqual([dotted]);\n });\n\n it(\"literal `_` and `%` in patterns are not wildcards\", async () => {\n const tag = uid();\n const scored = `u-${tag}_x`;\n const scored_decoy = `u-${tag}Zx`;\n const pct = `p-${tag}%y`;\n const pct_decoy = `p-${tag}ZZy`;\n await seed_streams([scored, scored_decoy, pct, pct_decoy]);\n\n // `_` is a literal in the regex grammar — a store translating to\n // LIKE must escape it or it single-char-wildcards into the decoy\n expect(await streams_matching(`^u-${tag}_x$`)).toEqual([scored]);\n // `%` is a literal in the regex grammar — unescaped LIKE would\n // any-run-wildcard into the decoy\n expect(await streams_matching(`^p-${tag}%y$`)).toEqual([pct]);\n });\n\n it(\"portable subset applies to stream-position filters\", async () => {\n const tag = uid();\n const scored = `sf-${tag}_a`;\n const decoy = `sf-${tag}Za`;\n await store.subscribe([{ stream: scored }, { stream: decoy }]);\n\n const got: string[] = [];\n await store.query_streams((p) => got.push(p.stream), {\n stream: `^sf-${tag}_a$`,\n });\n expect(got).toEqual([scored]);\n });\n\n it(\"non-portable patterns match with full regex semantics or throw\", async () => {\n const tag = uid();\n const a = `np-${tag}-a`;\n const b = `np-${tag}-b`;\n const c = `np-${tag}-c`;\n const one = `np-${tag}-1`;\n const aaa = `np-${tag}-aaa`;\n const dot = `e-${tag}.d`;\n const dot_decoy = `e-${tag}xd`;\n await seed_streams([a, b, c, one, aaa, dot, dot_decoy]);\n\n // alternation\n await match_exactly_or_throw(`^np-${tag}-(a|b)$`, [a, b]);\n // character class\n await match_exactly_or_throw(`^np-${tag}-[0-9]$`, [one]);\n // quantifier\n await match_exactly_or_throw(`^np-${tag}-a+$`, [a, aaa]);\n // escaped dot — a literal-dot match, not a one-char wildcard\n await match_exactly_or_throw(`^e-${tag}\\\\.d$`, [dot]);\n });\n\n it(\"bulk stream ops reject non-portable filters instead of mis-matching\", async () => {\n const tag = uid();\n const s = `bo-${tag}-a`;\n await store.subscribe([{ stream: s }]);\n\n let count: number | undefined;\n let error: unknown;\n try {\n count = await store.reset({ stream: `^bo-${tag}-(a|b)$` });\n } catch (e) {\n error = e;\n }\n if (error !== undefined) expect(error).toBeInstanceOf(ValidationError);\n else expect(count).toBe(1);\n });\n\n // #1197: stream filters are case-SENSITIVE across every adapter.\n // PG (`~`) and InMemory (RegExp) are case-sensitive; a store that\n // translates to `LIKE` must not let SQLite's ASCII-insensitive LIKE\n // overmatch a differently-cased sibling. A `^order-` prefix must\n // match `order-x` but never `Order-x`.\n it(\"stream filters match case-sensitively (query)\", async () => {\n const tag = uid();\n const lower = `order-${tag}`;\n const upper = `Order-${tag}`;\n await seed_streams([lower, upper]);\n\n // ^prefix — only the lower-cased stream, never the capitalized one\n expect(await streams_matching(`^order-${tag}`)).toEqual([lower]);\n // ^exact$ — the capitalized name never matches a lower-cased pattern\n expect(await streams_matching(`^Order-${tag}$`)).toEqual([upper]);\n // contains — case-sensitive substring\n expect(await streams_matching(`order-${tag}`)).toEqual([lower]);\n });\n\n it(\"stream filters match case-sensitively (position filters)\", async () => {\n const tag = uid();\n const lower = `csp-order-${tag}`;\n const upper = `csp-Order-${tag}`;\n await store.subscribe([{ stream: lower }, { stream: upper }]);\n\n const got: string[] = [];\n await store.query_streams((p) => got.push(p.stream), {\n stream: `^csp-order-${tag}`,\n });\n expect(got).toEqual([lower]);\n });\n\n it(\"bulk stream ops match case-sensitively\", async () => {\n const tag = uid();\n const lower = `bcs-order-${tag}`;\n const upper = `bcs-Order-${tag}`;\n await store.subscribe([{ stream: lower }, { stream: upper }]);\n\n // reset by pattern touches only the exactly-cased stream\n const count = await store.reset({ stream: `^bcs-order-${tag}` });\n expect(count).toBe(1);\n });\n });\n\n describe(\"subscribe + claim + ack\", () => {\n it(\"subscribes new streams and is idempotent on repeat\", async () => {\n const s = `sub-${uid()}`;\n const first = await store.subscribe([{ stream: s }]);\n expect(first.subscribed).toBe(1);\n const second = await store.subscribe([{ stream: s }]);\n expect(second.subscribed).toBe(0);\n });\n\n // Backs the port-doc contract on `subscribe`'s `priority` param:\n // \"When the same stream is subscribed by multiple reactions with\n // different priorities, implementations must keep the maximum so\n // the highest-priority reaction wins.\" Without this test the merge\n // could silently regress to last-write-wins on any adapter.\n it(\"keeps the maximum priority when a stream is re-subscribed\", async () => {\n const s = `sub-pri-${uid()}`;\n const read = async () => {\n const got: { priority?: number } = {};\n await store.query_streams(\n (p) => {\n got.priority = p.priority;\n },\n { stream: s, stream_exact: true }\n );\n return got.priority;\n };\n\n await store.subscribe([{ stream: s, priority: 3 }]);\n expect(await read()).toBe(3);\n\n // Higher priority wins.\n await store.subscribe([{ stream: s, priority: 10 }]);\n expect(await read()).toBe(10);\n\n // Lower priority must NOT lower the stored value.\n await store.subscribe([{ stream: s, priority: 1 }]);\n expect(await read()).toBe(10);\n\n // Default priority (0, omitted) must NOT lower it either.\n await store.subscribe([{ stream: s }]);\n expect(await read()).toBe(10);\n });\n\n it(\"claims a subscribed stream and ack releases the lease\", async () => {\n const s = `claim-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const by = `worker-${uid()}`;\n const leased = await store.claim(100, 0, by, 10_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n expect(mine!.by).toBe(by);\n await store.ack([{ ...(mine as Lease), at: mine!.at + 1 }]);\n });\n\n it(\"does not double-claim a held lease\", async () => {\n const s = `claim-held-${uid()}`;\n const other = `claim-other-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leasedA = await store.claim(100, 0, `wA-${uid()}`, 100_000);\n const targetA = leasedA.find((l) => l.stream === s);\n expect(targetA).toBeDefined();\n // Subscribe + commit `other` only AFTER A's claim — fresh\n // subscriptions report `at=-1` which adapters treat as\n // claimable. We want `other` to be visible only to B so the\n // negative assertion below runs through a populated array.\n await store.subscribe([{ stream: other }]);\n await store.commit<CounterEvents>(\n other,\n [inc(2)],\n make_meta({ stream: other })\n );\n const leasedB = await store.claim(100, 0, `wB-${uid()}`, 100_000);\n expect(leasedB.length).toBeGreaterThan(0);\n expect(leasedB.find((l) => l.stream === s)).toBeUndefined();\n expect(leasedB.find((l) => l.stream === other)).toBeDefined();\n });\n\n it(\"supports dual frontiers (lagging + leading)\", async () => {\n const s = `claim-dual-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2)],\n make_meta({ stream: s })\n );\n const first = await store.claim(100, 0, `w-${uid()}`, 1);\n const mine = first.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await store.ack([{ ...(mine as Lease), at: (mine as Lease).at + 1 }]);\n const second = await store.claim(0, 100, `w-${uid()}`, 1);\n expect(second.find((l) => l.stream === s)).toBeDefined();\n });\n\n it(\"does not starve a default-priority lagging stream under sustained high-priority load (ACT-1223)\", async () => {\n // A fresh adapter so only these streams compete for the frontier.\n // Six priority-100 streams that always have fresh work plus one\n // never-processed priority-0 stream. The lagging selection orders\n // by priority DESC, at ASC, so without a fairness reserve the four\n // lagging slots are forever taken by the high-priority streams and\n // the low one starves. The reserve (ACT-1223) carves one slot for\n // pure watermark order, so the most-behind stream is claimed within\n // a bounded window regardless of priority.\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const suffix = uid();\n const highs = Array.from(\n { length: 6 },\n (_, i) => `hi-${i}-${suffix}`\n );\n const low = `lo-${suffix}`;\n await fresh.subscribe([\n ...highs.map((stream) => ({ stream, priority: 100 })),\n { stream: low, priority: 0 },\n ]);\n for (const stream of highs)\n await fresh.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n await fresh.commit<CounterEvents>(\n low,\n [inc(1)],\n make_meta({ stream: low })\n );\n\n const by = `w-${uid()}`;\n let low_claimed = false;\n const MAX_CYCLES = 20;\n for (let cycle = 0; cycle < MAX_CYCLES && !low_claimed; cycle++) {\n const leases = await fresh.claim(4, 0, by, 1000);\n if (leases.some((l) => l.stream === low)) {\n low_claimed = true;\n break;\n }\n // Ack each high stream forward, then commit a fresh event so it\n // is lagging again next cycle — sustained high-priority load.\n for (const l of leases) {\n await fresh.ack([{ ...l, at: l.at + 1 }]);\n await fresh.commit<CounterEvents>(\n l.stream,\n [inc(1)],\n make_meta({ stream: l.stream })\n );\n }\n }\n\n expect(low_claimed).toBe(true);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"dedupes when both frontiers would return the same stream\", async () => {\n const s = `claim-dedup-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Asking for both frontiers with overlapping budgets must not\n // return the same stream twice.\n const claimed = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const matches = claimed.filter((l) => l.stream === s);\n expect(matches).toHaveLength(1);\n });\n\n it(\"silently ignores ack from the wrong holder\", async () => {\n const s = `ack-wrong-${uid()}`;\n const sibling = `ack-sibling-${uid()}`;\n await store.subscribe([{ stream: s }, { stream: sibling }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n sibling,\n [inc(2)],\n make_meta({ stream: sibling })\n );\n const leased = await store.claim(100, 0, `right-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n const sibling_lease = leased.find((l) => l.stream === sibling);\n expect(mine).toBeDefined();\n expect(sibling_lease).toBeDefined();\n // Mix a correctly-held lease with an imposter ack so `acked`\n // ends up with one entry (the sibling) and the predicate runs.\n const acked = await store.ack([\n { ...(mine as Lease), by: \"imposter\" },\n sibling_lease as Lease,\n ]);\n expect(acked.length).toBeGreaterThan(0);\n expect(acked.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"ack with a stale (lower) watermark does not throw\", async () => {\n const s = `ack-stale-${uid()}`;\n await store.subscribe([{ stream: s }]);\n const by = `w-${uid()}`;\n const leased = await store.claim(100, 0, by, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await expect(\n store.ack([{ ...(mine as Lease), at: -5 }])\n ).resolves.toBeDefined();\n });\n\n it(\"claim with no subscribed streams returns an empty array\", async () => {\n // Use a fresh adapter instance — the parent store is shared across\n // the suite and has subscribed streams already.\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const claimed = await fresh.claim(1, 1, `w-${uid()}`, 1000);\n expect(claimed).toEqual([]);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n // ACT-980: the TCK previously asserted only the *shape* of claim()\n // results, letting adapters diverge on `Lease.retry` and `Lease.lagging`\n // — the two signals the drain controller reads to time `blockOnError`\n // and to balance frontiers. These cases pin the *semantics* so every\n // adapter is interchangeable, not merely structurally conformant.\n describe(\"lease semantics\", () => {\n // Frontier budgets (`lagging`/`leading`) apply across every claimable\n // stream in the store, so these cases run against a fresh, isolated\n // instance with exactly one subscribed stream — that makes the\n // budgets deterministic regardless of what the shared suite left\n // behind.\n it(\"returns retry=0 on first claim and increments on re-claim without ack\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `lease-retry-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n await fresh.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // First claim = first attempt. A 0ms lease is released\n // immediately, so the re-claim below sees a claimable stream\n // deterministically (no wall-clock race on lease expiry).\n const first = await fresh.claim(1, 0, `w-${uid()}`, 0);\n const f = first.find((l) => l.stream === s);\n expect(f).toBeDefined();\n expect(f!.retry).toBe(0);\n // Re-claim without an intervening ack = the first retry.\n const second = await fresh.claim(1, 0, `w-${uid()}`, 100_000);\n const sec = second.find((l) => l.stream === s);\n expect(sec).toBeDefined();\n expect(sec!.retry).toBe(1);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"reports lagging=true from the lagging frontier and false from the leading frontier\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `lease-lag-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n await fresh.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Lagging-only budget: the stream is claimed from the lagging\n // frontier → lagging must be true.\n const lag = await fresh.claim(1, 0, `w-${uid()}`, 0);\n expect(lag.find((l) => l.stream === s)?.lagging).toBe(true);\n // Leading-only budget on the released lease: claimed from the\n // leading frontier → lagging must be false. `lagging` is\n // frontier membership, not a function of the stream's watermark.\n const lead = await fresh.claim(0, 1, `w-${uid()}`, 100_000);\n expect(lead.find((l) => l.stream === s)?.lagging).toBe(false);\n } finally {\n await fresh.dispose();\n }\n });\n\n // ACT-1183: a lease timeout is not a free pass. Every claim()\n // increments the stream's retry counter and only ack resets it, so\n // a stream whose workers keep dying marches toward `blockOnError`\n // exactly like one whose handlers keep throwing — repeated worker\n // deaths on one stream are poison-adjacent, and quarantining beats\n // an infinite crash loop. The 0ms lease is the deterministic\n // stand-in for \"worker died mid-lease\" (no wall-clock race).\n it(\"counts a timed-out lease reclaimed by another worker against the retry budget; ack resets it\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `lease-timeout-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n const [e1] = await seed_stream(fresh, s, 1);\n // Worker A claims and \"dies\" — its 0ms lease is already expired.\n const a = await fresh.claim(1, 0, `wA-${uid()}`, 0);\n expect(a.find((l) => l.stream === s)?.retry).toBe(0);\n // Worker B reclaims after the timeout: the budget marches.\n const b = await fresh.claim(1, 0, `wB-${uid()}`, 30_000);\n const b_lease = b.find((l) => l.stream === s);\n expect(b_lease).toBeDefined();\n expect(b_lease!.retry).toBe(1);\n // Ack resets the budget: the next claim is a first attempt again.\n await fresh.ack([{ ...(b_lease as Lease), at: e1.id }]);\n await seed_stream(fresh, s, 1);\n const c = await fresh.claim(1, 0, `wC-${uid()}`, 30_000);\n expect(c.find((l) => l.stream === s)?.retry).toBe(0);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n // ACT-1182: a subscription's `source` is an **exact stream name** in\n // claim()'s has-work probe — never a regex, LIKE pattern, or substring.\n // Every shipped resolver (autoclose, dynamic per-aggregate reactions)\n // produces exact names, and exact equality keeps the probe on the\n // adapter's stream index. Pattern matching belongs to the StreamFilter\n // surfaces (`query_streams`, `reset`, `unblock`), not to claim. Before\n // these cases, InMemory compiled `source` into an unanchored RegExp and\n // SQLite into a contains-LIKE — both silently overmatched sibling\n // streams sharing a prefix.\n describe(\"claim source matching\", () => {\n it(\"treats source as an exact stream name — no substring or pattern overmatch\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const base = `src-${uid()}`;\n const sibling = `${base}2`; // `base` is a strict prefix of `sibling`\n const target = `agg-${uid()}`;\n const control = `ctl-${uid()}`;\n await fresh.subscribe([\n { stream: target, source: base },\n // Control subscription sourced from the sibling — it DOES see\n // the sibling commit below, so the negative assertion runs\n // through a populated claim result.\n { stream: control, source: sibling },\n ]);\n // Advance the watermarks past -1 first — fresh subscriptions are\n // claimable unconditionally on some adapters.\n const [seeded] = await seed_stream(fresh, base, 1);\n const [ctl_seeded] = await seed_stream(fresh, sibling, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const mine = first.find((l) => l.stream === target);\n const ctl = first.find((l) => l.stream === control);\n expect(mine).toBeDefined();\n expect(ctl).toBeDefined();\n await fresh.ack([\n { ...(mine as Lease), at: seeded.id },\n { ...(ctl as Lease), at: ctl_seeded.id },\n ]);\n // New events land only on the *sibling* stream. An exact-source\n // subscription on `base` must not see them as work; the control\n // sourced from the sibling must.\n await seed_stream(fresh, sibling, 1);\n const second = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n expect(second.find((l) => l.stream === control)).toBeDefined();\n expect(second.find((l) => l.stream === target)).toBeUndefined();\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"receives exactly its source stream's events\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const base = `src-${uid()}`;\n const target = `agg-${uid()}`;\n await fresh.subscribe([{ stream: target, source: base }]);\n const [e1] = await seed_stream(fresh, base, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const f = first.find((l) => l.stream === target);\n expect(f).toBeDefined();\n expect(f!.source).toBe(base);\n await fresh.ack([{ ...(f as Lease), at: e1.id }]);\n // A fresh commit on the exact source makes the stream claimable\n // again, and the fetch window (source + after watermark) yields\n // exactly the new event.\n const [e2] = await seed_stream(fresh, base, 1);\n const second = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const sec = second.find((l) => l.stream === target);\n expect(sec).toBeDefined();\n expect(sec!.at).toBe(e1.id);\n const events = await collect(fresh, {\n stream: sec!.source,\n after: sec!.at,\n });\n expect(events.map((e) => e.id)).toEqual([e2.id]);\n } finally {\n await fresh.dispose();\n }\n });\n\n // ACT-1220: an exact (literal) source must never fetch events from a\n // sibling stream sharing its prefix. Guards the drain fetch path: an\n // exact source `s1` claimed as work must, when queried, receive only\n // `s1`'s events — not `s12`'s. Pre-#1215 fetch treated `source` as an\n // unanchored regex, so `s1` would have pulled `s12`'s events into the\n // handler.\n it(\"fetches only the exact source stream's events, never a sibling prefix\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const base = `fx-${uid()}`;\n const sibling = `${base}2`;\n const target = `agg-${uid()}`;\n await fresh.subscribe([{ stream: target, source: base }]);\n const [b1] = await seed_stream(fresh, base, 1);\n await seed_stream(fresh, sibling, 1);\n const claimed = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const lease = claimed.find((l) => l.stream === target);\n expect(lease).toBeDefined();\n const events = await collect(fresh, {\n stream: lease!.source,\n stream_exact: true,\n after: -1,\n });\n expect(events.map((e) => e.stream)).toEqual([base]);\n expect(events.map((e) => e.id)).toEqual([b1.id]);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n // ACT-1220: a **pattern** source (one carrying regex metacharacters) is\n // matched as a full RegExp against candidate streams. This restores the\n // calculator's shipped `source: \"^(A|B)$\"` static reaction, which\n // #1215's exact-only claim contract silently broke — the Board\n // projection stopped being claimed because `_max_event_id_by_stream.get(\n // \"^(A|B)$\")` is always undefined. Literal sources keep the fast exact\n // path; only sources with metacharacters compile to a RegExp.\n describe.skipIf(!caps.pattern_claim_source)(\n \"claim pattern source matching (capability)\",\n () => {\n it(\"claims a pattern-source target when any matched stream has work (^(A|B)$)\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const a = `A-${uid()}`;\n const b = `B-${uid()}`;\n const target = `board-${uid()}`;\n const pattern = `^(${a}|${b})$`;\n await fresh.subscribe([{ stream: target, source: pattern }]);\n // Commit to A only — the pattern must match it and claim.\n const [ea] = await seed_stream(fresh, a, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const l1 = first.find((s) => s.stream === target);\n expect(l1).toBeDefined();\n await fresh.ack([{ ...(l1 as Lease), at: ea.id }]);\n // Now commit to B — the same pattern-source target must claim\n // again for the second matched stream.\n const [eb] = await seed_stream(fresh, b, 1);\n const second = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n expect(second.find((s) => s.stream === target)).toBeDefined();\n expect(eb.stream).toBe(b);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"does not claim a pattern-source target when no matched stream has work\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const a = `A-${uid()}`;\n const b = `B-${uid()}`;\n const other = `Z-${uid()}`;\n const target = `board-${uid()}`;\n const control = `ctl-${uid()}`;\n const pattern = `^(${a}|${b})$`;\n // The control target sources from `other` (a literal). It DOES\n // see the `other` commit below, so the second claim is\n // non-empty and the negative assertion runs through a\n // populated result — the pattern target must simply be absent.\n await fresh.subscribe([\n { stream: target, source: pattern },\n { stream: control, source: other },\n ]);\n // Advance the target's watermark past -1 first: a fresh\n // subscription is claimable unconditionally on some adapters,\n // so the negative assertion must run against a settled stream.\n const [ea] = await seed_stream(fresh, a, 1);\n const first = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const l1 = first.find((s) => s.stream === target);\n expect(l1).toBeDefined();\n // Ack both the pattern target and the fresh control lease so\n // neither is held into the second claim; the control becomes\n // claimable again only when `other` gets a commit below. Both\n // are fresh subscriptions, so both are in the first claim.\n const c1 = first.find((s) => s.stream === control);\n expect(c1).toBeDefined();\n await fresh.ack([\n { ...(l1 as Lease), at: ea.id },\n { ...(c1 as Lease), at: -1 },\n ]);\n // Now activity on a stream the pattern does NOT match must not\n // make the target claimable again — but the control sourced\n // from that stream must.\n await seed_stream(fresh, other, 1);\n const claimed = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n const streams = claimed.map((s) => s.stream);\n expect(streams).toContain(control);\n expect(streams).not.toContain(target);\n } finally {\n await fresh.dispose();\n }\n });\n }\n );\n\n // ACT-1220: adapters that cannot faithfully run an arbitrary regex in\n // claim reject a non-portable claim source loudly at subscribe() —\n // failing at registration, not silently never claiming the stream.\n describe.skipIf(!caps.rejects_nonportable_claim_source)(\n \"claim source registration (capability)\",\n () => {\n it(\"throws at subscribe for a non-portable (alternation) claim source\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n await expect(\n fresh.subscribe([\n { stream: `board-${uid()}`, source: `^(${uid()}|${uid()})$` },\n ])\n ).rejects.toThrow(ValidationError);\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"accepts a portable-subset pattern claim source (^prefix.*) and claims on match\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const prefix = `pfx${uid()}`.replace(/-/g, \"\");\n const matched = `${prefix}child`;\n const target = `board-${uid()}`;\n await fresh.subscribe([{ stream: target, source: `^${prefix}.*` }]);\n const [e] = await seed_stream(fresh, matched, 1);\n const claimed = await fresh.claim(100, 0, `w-${uid()}`, 30_000);\n expect(claimed.find((s) => s.stream === target)).toBeDefined();\n expect(e.stream).toBe(matched);\n } finally {\n await fresh.dispose();\n }\n });\n }\n );\n\n // ACT-982: competing-consumer correctness was previously proven only by\n // the PG-specific multi-process stress harness. This makes it a portable\n // contract for adapters that support concurrent claimers (gated by\n // `concurrent_claim`): two distinct workers claiming the same candidate\n // set concurrently must never both lease the same stream within the\n // lease window. Single-writer stores (SQLite) opt out — see the\n // capability docs.\n describe.skipIf(!caps.concurrent_claim)(\"concurrency (capability)\", () => {\n it(\"never double-leases a stream across concurrent claimers\", async () => {\n // Fresh isolated instance: the two workers below claim with large\n // budgets across every claimable stream, so a shared store would\n // both perturb this test and leave 60s leases that pollute later\n // suites. Mirrors the lease-semantics cases.\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const streams = Array.from(\n { length: 8 },\n () => `concurrent-${uid()}`\n );\n await fresh.subscribe(streams.map((stream) => ({ stream })));\n for (const stream of streams) {\n await fresh.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n }\n const owned = new Set(streams);\n // Overlapping budgets so both workers target the same set;\n // SKIP LOCKED (pg) / atomic lease (in-memory) must hand each\n // stream to at most one worker.\n const [a, b] = await Promise.all([\n fresh.claim(100, 100, `wA-${uid()}`, 60_000),\n fresh.claim(100, 100, `wB-${uid()}`, 60_000),\n ]);\n // Combine both workers' leases. Operating on the union (rather\n // than per-worker sets) keeps the callbacks covered even when one\n // worker wins every stream and the other comes back empty.\n const claimed = [...a, ...b]\n .map((l) => l.stream)\n .filter((stream) => owned.has(stream));\n // No stream leased twice (no double-lease across workers)...\n expect(new Set(claimed).size).toBe(claimed.length);\n // ...and every stream leased exactly once (none lost).\n expect(claimed.length).toBe(owned.size);\n } finally {\n await fresh.dispose();\n }\n });\n\n // ACT-1184: lease expiry under competing claimers. An unexpired\n // lease is invisible to every other worker; an expired one is\n // handed to exactly one of them.\n it(\"does not hand an unexpired lease to a competing claimer\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `unexpired-${uid()}`;\n const other = `unexpired-other-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n await seed_stream(fresh, s, 1);\n const a = await fresh.claim(100, 100, `wA-${uid()}`, 60_000);\n expect(a.find((l) => l.stream === s)).toBeDefined();\n // Subscribe `other` only AFTER A's claim so B's claim comes back\n // populated and the negative assertion runs through a non-empty\n // array (mirrors \"does not double-claim a held lease\").\n await fresh.subscribe([{ stream: other }]);\n await seed_stream(fresh, other, 1);\n const b = await fresh.claim(100, 100, `wB-${uid()}`, 60_000);\n expect(b.find((l) => l.stream === other)).toBeDefined();\n expect(b.find((l) => l.stream === s)).toBeUndefined();\n } finally {\n await fresh.dispose();\n }\n });\n\n it(\"hands an expired lease to exactly one competing claimer, with retry accounting shared across workers\", async () => {\n const fresh = await options.factory();\n try {\n await fresh.drop();\n await fresh.seed();\n const s = `expired-${uid()}`;\n await fresh.subscribe([{ stream: s }]);\n const [e1] = await seed_stream(fresh, s, 1);\n // The original holder \"dies\": a 0ms lease is expired on arrival.\n const dead = await fresh.claim(100, 0, `wDead-${uid()}`, 0);\n expect(dead.find((l) => l.stream === s)?.retry).toBe(0);\n // Two workers race for the expired lease — exactly one wins,\n // and the shared retry counter (ACT-1183) reflects the reclaim\n // regardless of which worker performs it.\n const [b, c] = await Promise.all([\n fresh.claim(100, 100, `wB-${uid()}`, 60_000),\n fresh.claim(100, 100, `wC-${uid()}`, 60_000),\n ]);\n const winners = [...b, ...c].filter((l) => l.stream === s);\n expect(winners).toHaveLength(1);\n expect(winners[0].retry).toBe(1);\n // Ack by the winning worker resets the shared budget.\n await fresh.ack([{ ...winners[0], at: e1.id }]);\n await seed_stream(fresh, s, 1);\n const again = await fresh.claim(100, 0, `wNext-${uid()}`, 60_000);\n expect(again.find((l) => l.stream === s)?.retry).toBe(0);\n } finally {\n await fresh.dispose();\n }\n });\n });\n\n describe(\"block\", () => {\n it(\"hides blocked streams from claim\", async () => {\n const s = `block-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n const blocked = await store.block([\n { ...(mine as Lease), error: \"boom\" },\n ]);\n expect(blocked).toHaveLength(1);\n expect(blocked[0].error).toBe(\"boom\");\n const again = await store.claim(100, 100, `w2-${uid()}`, 100_000);\n expect(again.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"rejects block calls from a different holder\", async () => {\n const s = `block-wrong-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `right-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n const blocked = await store.block([\n { ...(mine as Lease), by: \"imposter\", error: \"no\" },\n ]);\n expect(blocked).toHaveLength(0);\n });\n\n it(\"re-blocking an already-blocked stream is a no-op (#1263)\", async () => {\n const s = `block-twice-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await store.ack(leased.filter((l) => l.stream !== s));\n const first = await store.block([\n { ...(mine as Lease), error: \"boom\" },\n ]);\n expect(first).toHaveLength(1);\n // Second block of the same already-blocked lease affects nothing —\n // no spurious duplicate `blocked` event.\n const second = await store.block([\n { ...(mine as Lease), error: \"boom\" },\n ]);\n expect(second).toHaveLength(0);\n });\n });\n\n describe(\"defer\", () => {\n it(\"hides a stream from claim until its deferred_at passes\", async () => {\n const s = `defer-${uid()}`;\n // A claimable control stream guarantees the claim result is non-empty,\n // so the membership checks below actually run (and prove `s` is the one\n // being skipped, not that nothing was claimable).\n const ctl = `defer-ctl-${uid()}`;\n await store.subscribe([{ stream: s }, { stream: ctl }]);\n for (const st of [s, ctl])\n await store.commit<CounterEvents>(\n st,\n [inc(1)],\n make_meta({ stream: st })\n );\n // Defer far into the future — claim must skip it.\n expect(await store.defer([s], Date.now() + 3_600_000)).toBe(1);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(leased.find((l) => l.stream === ctl)).toBeDefined();\n expect(leased.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"makes a stream claimable once the deferred_at is in the past\", async () => {\n const s = `defer-past-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // A due-time already in the past is not a constraint.\n expect(await store.defer([s], Date.now() - 1_000)).toBe(1);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n // ack clears the schedule and does not bump retry past the claim.\n await store.ack(\n leased.filter((l) => l.stream !== s).concat(mine as Lease)\n );\n });\n\n it(\"does not bump retry while a stream is deferred\", async () => {\n const s = `defer-retry-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.defer([s], Date.now() + 3_600_000);\n // Several claim attempts while deferred — none should touch the row.\n await store.claim(100, 100, `w1-${uid()}`, 100_000);\n await store.claim(100, 100, `w2-${uid()}`, 100_000);\n // Re-defer into the past so it becomes claimable, then observe retry.\n await store.defer([s], Date.now() - 1_000);\n const leased = await store.claim(100, 100, `w3-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n // First real claim → retry 0, proving the deferred claims didn't bump it.\n expect(mine!.retry).toBe(0);\n await store.ack(\n leased.filter((l) => l.stream !== s).concat(mine as Lease)\n );\n });\n\n it(\"reset clears a pending defer\", async () => {\n const s = `defer-reset-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.defer([s], Date.now() + 3_600_000);\n expect(await store.reset([s])).toBe(1);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(leased.find((l) => l.stream === s)).toBeDefined();\n });\n\n it(\"exposes a future deferred_at via query_streams (#1221)\", async () => {\n // The cold-start defer re-seed reads the persisted schedule back\n // through query_streams: a stream with a future deferred_at must\n // surface the ms-since-epoch value so the orchestrator can re-arm\n // the drain at the due-time. A stream with no active defer omits it.\n const deferred = `defer-qs-${uid()}`;\n const plain = `defer-qs-plain-${uid()}`;\n await store.subscribe([{ stream: deferred }, { stream: plain }]);\n for (const s of [deferred, plain])\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const due = Date.now() + 3_600_000;\n await store.defer([deferred], due);\n\n const seen = new Map<string, number | undefined>();\n await store.query_streams((p) => {\n if (p.stream === deferred || p.stream === plain)\n seen.set(p.stream, p.deferred_at);\n });\n // The deferred stream reports its schedule; adapters persist at\n // second/ms precision, so allow a small rounding tolerance.\n const got = seen.get(deferred);\n expect(got).toBeDefined();\n expect(Math.abs((got as number) - due)).toBeLessThan(2_000);\n // The undeferred stream omits the field.\n expect(seen.get(plain)).toBeUndefined();\n });\n\n it(\"defers streams matching a filter and counts matches\", async () => {\n const tag = uid();\n const a = `deferfilter-${tag}-a`;\n const b = `deferfilter-${tag}-b`;\n await store.subscribe([{ stream: a }, { stream: b }]);\n for (const s of [a, b])\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // A claimable control stream outside the filter keeps the claim result\n // non-empty, so the membership checks below run against real rows.\n const ctl = `defer-filterctl-${tag}`;\n await store.subscribe([{ stream: ctl }]);\n await store.commit<CounterEvents>(\n ctl,\n [inc(1)],\n make_meta({ stream: ctl })\n );\n const n = await store.defer(\n { stream: `^deferfilter-${tag}-`, stream_exact: false },\n Date.now() + 3_600_000\n );\n expect(n).toBe(2);\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(leased.find((l) => l.stream === ctl)).toBeDefined();\n expect(leased.find((l) => l.stream === a)).toBeUndefined();\n expect(leased.find((l) => l.stream === b)).toBeUndefined();\n });\n\n it(\"returns 0 for unknown streams and empty input\", async () => {\n expect(await store.defer([`missing-${uid()}`], Date.now())).toBe(0);\n expect(await store.defer([], Date.now())).toBe(0);\n });\n });\n\n describe(\"ack finalize (due-marked leases)\", () => {\n it(\"defers a due-marked lease instead of acking it\", async () => {\n // One finalize call carries both outcomes: the control stream acks\n // (watermark advances), the due-marked stream defers (schedule set,\n // watermark held). Deferred entries are not part of the return value.\n const s = `ackdefer-${uid()}`;\n const ctl = `ackdefer-ctl-${uid()}`;\n await store.subscribe([{ stream: s }, { stream: ctl }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const [ctl_head] = await store.commit<CounterEvents>(\n ctl,\n [inc(1)],\n make_meta({ stream: ctl })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const s_lease = leased.find((l) => l.stream === s)!;\n const ctl_lease = leased.find((l) => l.stream === ctl)!;\n const acked = await store.ack([\n { ...ctl_lease, at: ctl_head.id },\n { ...s_lease, due: Date.now() + 3_600_000 },\n ]);\n expect(acked.find((l) => l.stream === ctl)).toBeDefined();\n expect(acked.find((l) => l.stream === s)).toBeUndefined();\n // The schedule holds: claim skips the deferred stream. A fresh\n // commit on the control keeps the claim result non-empty, so the\n // membership check proves the deferred stream is the one skipped.\n await store.commit<CounterEvents>(\n ctl,\n [inc(2)],\n make_meta({ stream: ctl })\n );\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n expect(again.find((l) => l.stream === ctl)).toBeDefined();\n expect(again.find((l) => l.stream === s)).toBeUndefined();\n });\n\n it(\"holds the watermark and resets retry on an explicit-defer due lease (retry: -1)\", async () => {\n // A due-time already in the past makes the stream immediately\n // re-claimable — proving the finalize released the lease. The lease\n // carries `at` = the claim watermark (no events handled), so the\n // advance is a no-op and the watermark holds. An explicit defer passes\n // `retry: -1` (a defer is not a failure), so the persisted retry resets\n // and the next claim bumps it to 0.\n const s = `ackdefer-past-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n await store.ack([{ ...mine, due: Date.now() - 1_000, retry: -1 }]);\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const re = again.find((l) => l.stream === s);\n expect(re).toBeDefined();\n expect(re!.at).toBe(mine.at); // watermark held — events still pending\n expect(re!.retry).toBe(0); // reset by the defer, bumped by claim\n await store.ack([{ ...re!, at: 1_000_000 }]);\n });\n\n it(\"persists the lease's retry on a backoff-style due lease (#1262)\", async () => {\n // A retry-with-backoff passes the climbing counter (not -1) on the\n // due-marked lease, so the retry budget survives the defer window —\n // the persisted value plus the next claim's bump keep it accruing\n // toward the block threshold across windows.\n const s = `ackdefer-retry-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n // Persist retry 3 with a past due-time so it's immediately re-claimable.\n // `at` = the claim watermark (no progress), so the advance is a no-op.\n await store.ack([{ ...mine, due: Date.now() - 1_000, retry: 3 }]);\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const re = again.find((l) => l.stream === s);\n expect(re).toBeDefined();\n expect(re!.at).toBe(mine.at); // watermark unchanged — no-op advance\n expect(re!.retry).toBe(4); // persisted 3, bumped to 4 by claim\n await store.ack([{ ...re!, at: 1_000_000 }]);\n });\n\n it(\"advances the watermark to `at` while persisting the schedule on a partial-progress due lease (#1278)\", async () => {\n // Advance and defer are independent ack legs: a partial-progress\n // backoff/defer moves the watermark past the events handled this cycle\n // (`at`) AND persists the window in one call, so the handled prefix\n // never re-runs. Distinct from the hold cases above, which pass\n // `at` = the claim watermark (a no-op advance).\n const s = `ackadvance-${uid()}`;\n await store.subscribe([{ stream: s }]);\n // e1 is the \"handled prefix\"; a second event keeps the stream pending.\n const [e1] = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n expect(mine.at).toBeLessThan(e1.id); // fresh stream — floor below e1\n // Advance to e1 (last succeeded) AND defer with a past due-time (so it's\n // immediately re-claimable) carrying the climbing retry.\n await store.ack([\n { ...mine, at: e1.id, due: Date.now() - 1_000, retry: 2 },\n ]);\n const again = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const re = again.find((l) => l.stream === s);\n expect(re).toBeDefined();\n expect(re!.at).toBe(e1.id); // advanced past the succeeded event, NOT held\n expect(re!.retry).toBe(3); // persisted 2, bumped by claim\n await store.ack([{ ...re!, at: 1_000_000 }]);\n });\n\n it(\"ignores due-marked entries from a non-holder\", async () => {\n // Same ownership rule as plain acks: only the lease holder can\n // finalize, so a stale worker cannot overwrite a live schedule.\n const s = `ackdefer-owner-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 100, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s)!;\n await store.ack([\n { ...mine, by: `stale-${uid()}`, due: Date.now() + 3_600_000 },\n ]);\n // No schedule was written: the holder can still finalize normally.\n const acked = await store.ack([{ ...mine, at: 1_000_000 }]);\n expect(acked.find((l) => l.stream === s)).toBeDefined();\n });\n });\n\n describe(\"reset\", () => {\n it(\"rewinds a stream watermark to -1\", async () => {\n const s = `reset-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n expect(mine).toBeDefined();\n await store.ack([{ ...(mine as Lease), at: 99 }]);\n expect(await store.reset([s])).toBe(1);\n const after = await store.claim(100, 0, `w2-${uid()}`, 100_000);\n const back = after.find((l) => l.stream === s);\n expect(back).toBeDefined();\n expect(back!.at).toBe(-1);\n });\n\n it(\"clears blocked status when resetting\", async () => {\n const s = `reset-blk-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n await store.block([{ ...(mine as Lease), error: \"boom\" }]);\n expect(await store.reset([s])).toBe(1);\n const after = await store.claim(100, 0, `w2-${uid()}`, 100_000);\n expect(after.find((l) => l.stream === s)).toBeDefined();\n });\n\n it(\"returns 0 for unknown streams and empty input\", async () => {\n expect(await store.reset([`missing-${uid()}`])).toBe(0);\n expect(await store.reset([])).toBe(0);\n });\n });\n\n describe(\"unblock\", () => {\n it(\"clears blocked flag and preserves the watermark\", async () => {\n const s = `unblock-${uid()}`;\n await store.subscribe([{ stream: s }]);\n // Two events so the watermark advances past 0 before block.\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(2)],\n make_meta({ stream: s })\n );\n\n // First lease + ack first event → watermark advances.\n const first = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m1 = first.find((l) => l.stream === s);\n await store.ack([{ ...(m1 as Lease), at: m1!.at }]);\n\n // Capture watermark before block.\n const before_block = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m2 = before_block.find((l) => l.stream === s);\n expect(m2).toBeDefined();\n const watermark_before = m2!.at;\n await store.block([{ ...(m2 as Lease), error: \"permanent\" }]);\n\n // Stream is now blocked — query_streams must report it as such.\n // (Asserting on `claim()` would be flaky: an empty result is the\n // same as \"s not in the result,\" which short-circuits a find()\n // callback and leaves it uncovered when no other streams happen\n // to be claimable in the fixture.)\n let blocked_flag: boolean | undefined;\n await store.query_streams(\n (p) => {\n blocked_flag = p.blocked;\n },\n { stream: s, stream_exact: true, limit: 1 }\n );\n expect(blocked_flag).toBe(true);\n\n // Unblock — claim picks it back up at the same watermark.\n expect(await store.unblock([s])).toBe(1);\n const after = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const back = after.find((l) => l.stream === s);\n expect(back).toBeDefined();\n expect(back!.at).toBe(watermark_before);\n expect(back!.retry).toBe(0);\n });\n\n it(\"returns 0 when the stream is not blocked\", async () => {\n const s = `unblock-noop-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Stream exists but isn't blocked.\n expect(await store.unblock([s])).toBe(0);\n });\n\n it(\"returns 0 for unknown streams and empty input\", async () => {\n expect(await store.unblock([`missing-${uid()}`])).toBe(0);\n expect(await store.unblock([])).toBe(0);\n });\n\n it(\"only counts streams that were actually blocked\", async () => {\n const s1 = `unblock-mix-a-${uid()}`;\n const s2 = `unblock-mix-b-${uid()}`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m1 = leased.find((l) => l.stream === s1);\n const others = leased.filter((l) => l.stream !== s1);\n await store.ack(others);\n // Block only s1.\n await store.block([{ ...(m1 as Lease), error: \"boom\" }]);\n expect(await store.unblock([s1, s2])).toBe(1);\n });\n\n it(\"filter form: unblocks by stream pattern\", async () => {\n const tag = uid();\n const s1 = `unblock-filter-${tag}-a`;\n const s2 = `unblock-filter-${tag}-b`;\n const s3 = `other-${tag}`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }, { stream: s3 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n await store.commit<CounterEvents>(\n s3,\n [inc(1)],\n make_meta({ stream: s3 })\n );\n // Block all three.\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const blockable: BlockedLease[] = leased\n .filter((l) => l.stream === s1 || l.stream === s2 || l.stream === s3)\n .map((l) => ({ ...(l as Lease), error: \"boom\" }));\n // Ack any other leases the test fixture's shared store left\n // outstanding so they don't pollute counts below.\n await store.ack(\n leased.filter(\n (l) => !(l.stream === s1 || l.stream === s2 || l.stream === s3)\n )\n );\n await store.block(blockable);\n\n // Filter targets only `unblock-filter-${tag}-` prefix → 2 of 3.\n const count = await store.unblock({\n stream: `^unblock-filter-${tag}-`,\n });\n expect(count).toBe(2);\n\n // s3 is still blocked.\n const after = await store.claim(100, 0, `w-${uid()}`, 100_000);\n expect(after.find((l) => l.stream === s3)).toBeUndefined();\n // s1 and s2 are unblocked and claimable.\n expect(after.find((l) => l.stream === s1)).toBeDefined();\n expect(after.find((l) => l.stream === s2)).toBeDefined();\n });\n\n it(\"filter form: empty filter unblocks every blocked stream\", async () => {\n // Set up an isolated set of blocked streams using a unique tag,\n // then assert the filter unblocks every one. We can't use the\n // truly empty filter `{}` across the shared TCK fixture because\n // other tests may leave blocked rows behind; use the tag as a\n // narrow proxy for \"everything in my scope.\"\n const tag = uid();\n const s1 = `unblock-empty-${tag}-a`;\n const s2 = `unblock-empty-${tag}-b`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.filter((l) => l.stream === s1 || l.stream === s2);\n await store.ack(leased.filter((l) => !mine.includes(l)));\n await store.block(\n mine.map((l) => ({ ...(l as Lease), error: \"boom\" }))\n );\n const count = await store.unblock({\n stream: `^unblock-empty-${tag}-`,\n });\n expect(count).toBe(2);\n });\n\n it(\"filter form: explicit blocked:false matches nothing\", async () => {\n // The implementation forces `blocked = true` regardless of what\n // the caller passed — operators can't accidentally \"unblock\"\n // already-unblocked streams.\n const tag = uid();\n const s = `unblock-blocked-false-${tag}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n // Stream is registered but not blocked.\n expect(\n await store.unblock({\n stream: `^unblock-blocked-false-${tag}`,\n blocked: false,\n })\n ).toBe(0);\n });\n });\n\n describe(\"reset filter form\", () => {\n it(\"resets streams matching a stream pattern\", async () => {\n const tag = uid();\n const s1 = `reset-filter-${tag}-a`;\n const s2 = `reset-filter-${tag}-b`;\n const other = `other-reset-${tag}`;\n await store.subscribe([\n { stream: s1 },\n { stream: s2 },\n { stream: other },\n ]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n await store.commit<CounterEvents>(\n other,\n [inc(1)],\n make_meta({ stream: other })\n );\n // Advance watermarks for all three so the reset is observable.\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.filter(\n (l) => l.stream === s1 || l.stream === s2 || l.stream === other\n );\n await store.ack(mine.map((l) => ({ ...(l as Lease), at: l.at + 100 })));\n\n // Filter targets only `reset-filter-${tag}-` prefix → 2 of 3.\n const count = await store.reset({ stream: `^reset-filter-${tag}-` });\n expect(count).toBe(2);\n\n // Inspect via query_streams (doesn't lease, no regex alternation\n // assumptions on SQLite's LIKE-pattern path) — fetch each name\n // by exact match and check the watermark independently.\n const position_for = async (name: string): Promise<number | null> => {\n let at: number | null = null;\n await store.query_streams(\n (p) => {\n at = p.at;\n },\n { stream: name, stream_exact: true, limit: 1 }\n );\n return at;\n };\n expect(await position_for(s1)).toBe(-1);\n expect(await position_for(s2)).toBe(-1);\n expect(await position_for(other)).toBeGreaterThan(-1);\n });\n\n it(\"filter form: resets only blocked streams when blocked:true\", async () => {\n const tag = uid();\n const s1 = `reset-blocked-${tag}-blocked`;\n const s2 = `reset-blocked-${tag}-fine`;\n await store.subscribe([{ stream: s1 }, { stream: s2 }]);\n await store.commit<CounterEvents>(\n s1,\n [inc(1)],\n make_meta({ stream: s1 })\n );\n await store.commit<CounterEvents>(\n s2,\n [inc(1)],\n make_meta({ stream: s2 })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const m1 = leased.find((l) => l.stream === s1);\n await store.ack(leased.filter((l) => l.stream !== s1));\n await store.block([{ ...(m1 as Lease), error: \"boom\" }]);\n\n const count = await store.reset({\n stream: `^reset-blocked-${tag}-`,\n blocked: true,\n });\n expect(count).toBe(1);\n });\n });\n\n describe(\"prioritize\", () => {\n it(\"sets priority directly, overriding subscribe's max() rule\", async () => {\n const tag = uid();\n const s1 = `pri-${tag}-a`;\n const s2 = `pri-${tag}-b`;\n await store.subscribe([\n { stream: s1, priority: 5 },\n { stream: s2, priority: 5 },\n ]);\n const updated = await store.prioritize(\n { stream: s1, stream_exact: true },\n 3\n );\n expect(updated).toBe(1);\n const got1: { priority?: number } = {};\n const got2: { priority?: number } = {};\n await store.query_streams(\n (p) => {\n if (p.stream === s1) got1.priority = p.priority;\n if (p.stream === s2) got2.priority = p.priority;\n },\n { stream: `pri-${tag}-.*`, limit: 100 }\n );\n expect(got1.priority).toBe(3);\n expect(got2.priority).toBe(5);\n });\n });\n\n // ACT-1103: drain lanes. The Store contract now carries lane on\n // every persisted-and-returned stream surface. Adapters that\n // haven't migrated will fail these cases — the signal is\n // intentional (\"the contract changed, your adapter needs to\n // surface lane\"). Lane mutability across subscribe calls is the\n // load-bearing case: the builder config wins on every restart, so\n // operators can move a stream by editing config and restarting\n // without a manual data migration.\n describe(\"lanes\", () => {\n it(\"subscribe defaults lane to 'default' when omitted\", async () => {\n const s = `lane-default-${uid()}`;\n await store.subscribe([{ stream: s }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.lane as string), {\n stream: s,\n stream_exact: true,\n });\n expect(seen).toEqual([\"default\"]);\n });\n\n it(\"subscribe records the lane passed in\", async () => {\n const s = `lane-set-${uid()}`;\n await store.subscribe([{ stream: s, lane: \"slow\" }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.lane as string), {\n stream: s,\n stream_exact: true,\n });\n expect(seen).toEqual([\"slow\"]);\n });\n\n it(\"subscribe re-lanes existing streams on subsequent calls\", async () => {\n const s = `lane-upsert-${uid()}`;\n await store.subscribe([{ stream: s, lane: \"slow\" }]);\n await store.subscribe([{ stream: s, lane: \"fast\" }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.lane as string), {\n stream: s,\n stream_exact: true,\n });\n expect(seen).toEqual([\"fast\"]);\n });\n\n it(\"claim() filters by lane when supplied and returns lane on the Lease\", async () => {\n const tag = uid();\n const src1 = `lane-claim-src1-${tag}`;\n const src2 = `lane-claim-src2-${tag}`;\n const sub_default = `lane-claim-def-${tag}`;\n const sub_slow = `lane-claim-slow-${tag}`;\n await store.commit<CounterEvents>(\n src1,\n [inc(1)],\n make_meta({ stream: src1 })\n );\n await store.commit<CounterEvents>(\n src2,\n [inc(1)],\n make_meta({ stream: src2 })\n );\n await store.subscribe([\n { stream: sub_default, source: src1 },\n { stream: sub_slow, source: src2, lane: \"slow\" },\n ]);\n\n const slow = await store.claim(50, 0, `w-slow-${tag}`, 1_000, \"slow\");\n const slow_mine = slow.filter(\n (l) => l.stream === sub_default || l.stream === sub_slow\n );\n expect(slow_mine.map((l) => l.stream)).toEqual([sub_slow]);\n expect(slow_mine[0]?.lane).toBe(\"slow\");\n await store.ack(slow_mine.map((l) => ({ ...l, at: l.at + 1 })));\n\n const all = await store.claim(50, 0, `w-all-${tag}`, 1_000);\n const all_mine = all\n .filter((l) => l.stream === sub_default || l.stream === sub_slow)\n .map((l) => ({ stream: l.stream, lane: l.lane }));\n expect(all_mine).toEqual(\n expect.arrayContaining([\n { stream: sub_default, lane: \"default\" },\n { stream: sub_slow, lane: \"slow\" },\n ])\n );\n });\n\n it(\"query_streams filters by lane\", async () => {\n const tag = uid();\n const a = `lane-q-a-${tag}`;\n const b = `lane-q-b-${tag}`;\n const c = `lane-q-c-${tag}`;\n await store.subscribe([\n { stream: a, lane: \"qslow\" },\n { stream: b, lane: \"qfast\" },\n { stream: c, lane: \"qslow\" },\n ]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n lane: \"qslow\",\n stream: `lane-q-.*-${tag}`,\n limit: 100,\n });\n expect(seen.sort()).toEqual([a, c]);\n });\n\n it(\"prioritize filters by lane\", async () => {\n const tag = uid();\n const a = `lane-pri-a-${tag}`;\n const b = `lane-pri-b-${tag}`;\n await store.subscribe([\n { stream: a, lane: `pslow-${tag}` },\n { stream: b, lane: `pfast-${tag}` },\n ]);\n const updated = await store.prioritize({ lane: `pslow-${tag}` }, 7);\n expect(updated).toBe(1);\n const seen = new Map<string, number>();\n await store.query_streams((p) => seen.set(p.stream, p.priority), {\n stream: `lane-pri-.*-${tag}`,\n limit: 100,\n });\n expect(seen.get(a)).toBe(7);\n expect(seen.get(b)).toBe(0);\n });\n\n it(\"reset filters by lane\", async () => {\n const tag = uid();\n const src = `lane-reset-src-${tag}`;\n const a = `lane-reset-a-${tag}`;\n const b = `lane-reset-b-${tag}`;\n await store.commit<CounterEvents>(\n src,\n [inc(1)],\n make_meta({ stream: src })\n );\n await store.subscribe([\n { stream: a, source: src, lane: `rslow-${tag}` },\n { stream: b, source: src, lane: `rfast-${tag}` },\n ]);\n const leases = await store.claim(50, 0, `w-${tag}`, 5_000);\n const mine = leases.filter((l) => l.stream === a || l.stream === b);\n await store.ack(mine.map((l) => ({ ...l, at: l.at + 1 })));\n\n const count = await store.reset({ lane: `rslow-${tag}` });\n expect(count).toBe(1);\n // Fetch each stream by exact match — keeps the contract test\n // adapter-agnostic (PG `~` and SQLite anchor-aware LIKE both\n // honor `stream_exact: true` identically).\n const ats = new Map<string, number>();\n for (const name of [a, b]) {\n await store.query_streams((p) => ats.set(p.stream, p.at), {\n stream: name,\n stream_exact: true,\n });\n }\n expect(ats.get(a)).toBe(-1);\n expect(ats.get(b)).toBeGreaterThanOrEqual(0);\n });\n\n it(\"unblock filters by lane\", async () => {\n const tag = uid();\n const src = `lane-ub-src-${tag}`;\n const a = `lane-ub-a-${tag}`;\n const b = `lane-ub-b-${tag}`;\n await store.commit<CounterEvents>(\n src,\n [inc(1)],\n make_meta({ stream: src })\n );\n await store.subscribe([\n { stream: a, source: src, lane: `uslow-${tag}` },\n { stream: b, source: src, lane: `ufast-${tag}` },\n ]);\n const leases = await store.claim(50, 0, `w-${tag}`, 5_000);\n const mine = leases.filter((l) => l.stream === a || l.stream === b);\n await store.block(mine.map((l) => ({ ...l, error: \"boom\" })));\n\n const count = await store.unblock({ lane: `uslow-${tag}` });\n expect(count).toBe(1);\n const blocked = new Map<string, boolean>();\n for (const name of [a, b]) {\n await store.query_streams((p) => blocked.set(p.stream, p.blocked), {\n stream: name,\n stream_exact: true,\n });\n }\n expect(blocked.get(a)).toBe(false);\n expect(blocked.get(b)).toBe(true);\n });\n });\n\n describe(\"truncate\", () => {\n it(\"seeds a tombstone when no snapshot is provided\", async () => {\n const s = `trunc-tomb-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2)],\n make_meta({ stream: s })\n );\n const result = await store.truncate([{ stream: s }]);\n expect(result.get(s)?.deleted).toBe(2);\n const remaining: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n remaining.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(remaining).toHaveLength(1);\n expect((remaining[0] as unknown as { name: string }).name).toBe(\n \"__tombstone__\"\n );\n });\n\n it(\"seeds a snapshot when one is provided\", async () => {\n const s = `trunc-snap-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const result = await store.truncate([\n { stream: s, snapshot: { count: 7 } },\n ]);\n expect(result.get(s)?.deleted).toBe(1);\n const remaining: CommittedCounterEvent[] = [];\n await store.query<CounterEvents>(\n (e) => {\n remaining.push(e as CommittedCounterEvent);\n },\n { stream: s, stream_exact: true, with_snaps: true }\n );\n expect(remaining).toHaveLength(1);\n expect((remaining[0] as unknown as { name: string }).name).toBe(\n \"__snapshot__\"\n );\n expect(remaining[0].data).toEqual({ count: 7 });\n });\n\n it(\"returns an empty map for empty input\", async () => {\n const result = await store.truncate([]);\n expect(result.size).toBe(0);\n });\n\n it(\"returns 0 deleted for streams that don't exist\", async () => {\n const s = `trunc-missing-${uid()}`;\n const result = await store.truncate([{ stream: s }]);\n expect(result.get(s)?.deleted).toBe(0);\n });\n\n // Windowed truncation (#1011): a `before` boundary prunes the\n // prefix below the closest safe `__snapshot__` — a pure prefix\n // delete behind a real snapshot; no seed, no tombstone.\n describe(\"windowed (before boundary)\", () => {\n // Layout: inc, inc, snapA{2}, inc, snapB{3}, inc — returns the\n // stream name plus the two snapshot events for boundary asserts.\n async function seed_windowed(s: string) {\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n const [snap_a] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const [snap_b] = await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 3 } }],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n return { snap_a, snap_b };\n }\n\n it(\"deletes the prefix below the closest safe snapshot and keeps the snapshot + tail\", async () => {\n const s = `trunc-win-${uid()}`;\n const { snap_b } = await seed_windowed(s);\n const before = new Date(Date.now() + 60_000);\n const result = await store.truncate([{ stream: s, before }]);\n const entry = result.get(s);\n // 4 events below snapB: inc, inc, snapA, inc\n expect(entry?.deleted).toBe(4);\n // committed is the SURVIVING boundary snapshot, not a new seed\n expect(entry?.committed.id).toBe(snap_b.id);\n expect(entry?.committed.name).toBe(SNAP_EVENT);\n expect(entry?.committed.data).toEqual({ count: 3 });\n // windowed entries echo the boundary\n expect(entry?.before).toEqual(before);\n const remaining = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: -1,\n });\n expect(remaining.map((e) => e.name)).toEqual([\n SNAP_EVENT,\n \"Incremented\",\n ]);\n expect(remaining[0].id).toBe(snap_b.id);\n });\n\n it(\"honors the max_id cap — boundary never rises past a lagging consumer\", async () => {\n const s = `trunc-win-cap-${uid()}`;\n const { snap_a, snap_b } = await seed_windowed(s);\n const before = new Date(Date.now() + 60_000);\n const result = await store.truncate([\n { stream: s, before, max_id: snap_a.id },\n ]);\n const entry = result.get(s);\n // snapB is newer but above the cap — snapA is the closest safe\n expect(entry?.committed.id).toBe(snap_a.id);\n expect(entry?.deleted).toBe(2);\n const remaining = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: -1,\n });\n expect(remaining.map((e) => e.id)).toContain(snap_b.id);\n expect(remaining[0].id).toBe(snap_a.id);\n expect(remaining).toHaveLength(4);\n });\n\n it(\"no-ops when no snapshot qualifies — stream absent from the result, events untouched\", async () => {\n const s = `trunc-win-noop-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(1)],\n make_meta({ stream: s })\n );\n // no snapshot at all\n const none = await store.truncate([\n { stream: s, before: new Date(Date.now() + 60_000) },\n ]);\n expect(none.has(s)).toBe(false);\n // snapshot exists but the cutoff predates it\n await store.commit(\n s,\n [{ name: SNAP_EVENT, data: { count: 2 } }],\n make_meta({ stream: s })\n );\n const too_early = await store.truncate([\n { stream: s, before: new Date(0) },\n ]);\n expect(too_early.has(s)).toBe(false);\n // missing stream no-ops too\n const missing = await store.truncate([\n { stream: `trunc-win-missing-${uid()}`, before: new Date() },\n ]);\n expect(missing.size).toBe(0);\n const remaining = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n after: -1,\n });\n expect(remaining).toHaveLength(3);\n });\n\n it(\"leaves subscriptions untouched, unlike a full truncate\", async () => {\n const s = `trunc-win-subs-${uid()}`;\n await seed_windowed(s);\n await store.subscribe([{ stream: s }]);\n await store.truncate([\n { stream: s, before: new Date(Date.now() + 60_000) },\n ]);\n const positions: string[] = [];\n await store.query_streams((p) => positions.push(p.stream), {\n stream: s,\n stream_exact: true,\n });\n expect(positions).toEqual([s]);\n });\n\n it(\"mixes full and windowed targets in one call\", async () => {\n const w = `trunc-win-mix-w-${uid()}`;\n const f = `trunc-win-mix-f-${uid()}`;\n const { snap_b } = await seed_windowed(w);\n await store.commit<CounterEvents>(\n f,\n [inc(1)],\n make_meta({ stream: f })\n );\n const result = await store.truncate([\n { stream: w, before: new Date(Date.now() + 60_000) },\n { stream: f },\n ]);\n expect(result.get(w)?.committed.id).toBe(snap_b.id);\n expect(result.get(w)?.before).toBeInstanceOf(Date);\n expect(result.get(f)?.deleted).toBe(1);\n expect(result.get(f)?.committed.name).toBe(\"__tombstone__\");\n expect(result.get(f)?.before).toBeUndefined();\n });\n\n it(\"keeps the stream writable and readable after a prune\", async () => {\n const s = `trunc-win-cont-${uid()}`;\n const { snap_b } = await seed_windowed(s);\n await store.truncate([\n { stream: s, before: new Date(Date.now() + 60_000) },\n ]);\n // versions continue from the surviving tail; ids never reuse\n // a pruned id\n const [next] = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n expect(next.version).toBe(6);\n expect(next.id).toBeGreaterThan(snap_b.id);\n // with_snaps replay anchors on the surviving boundary snapshot\n const replay = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(replay[0].id).toBe(snap_b.id);\n expect(replay).toHaveLength(3);\n });\n });\n });\n\n describe(\"query_streams\", () => {\n it(\"returns positions filtered by stream regex, exact, source, and source_exact\", async () => {\n const tag = uid();\n const proj1 = `qs-${tag}-projection-tickets`;\n const proj2 = `qs-${tag}-projection-users`;\n const dyn1 = `qs-${tag}-stats-1`;\n const dyn2 = `qs-${tag}-stats-2`;\n const src1 = `qs-${tag}-src-1`;\n const src2 = `qs-${tag}-src-2`;\n await store.subscribe([\n { stream: proj1 },\n { stream: proj2 },\n { stream: dyn1, source: src1 },\n { stream: dyn2, source: src2 },\n ]);\n\n const all: Array<{ stream: string; source?: string }> = [];\n const all_result = await store.query_streams(\n (p) => all.push({ stream: p.stream, source: p.source }),\n { stream: `qs-${tag}-.*` }\n );\n expect(all_result.count).toBe(4);\n expect(all_result.maxEventId).toBeGreaterThanOrEqual(-1);\n expect(all.map((p) => p.stream).sort()).toEqual(\n [proj1, proj2, dyn1, dyn2].sort()\n );\n\n const projections: string[] = [];\n await store.query_streams((p) => projections.push(p.stream), {\n stream: `qs-${tag}-projection-.*`,\n });\n expect(projections.sort()).toEqual([proj1, proj2].sort());\n\n const exact: string[] = [];\n await store.query_streams((p) => exact.push(p.stream), {\n stream: dyn1,\n stream_exact: true,\n });\n expect(exact).toEqual([dyn1]);\n\n const by_source: string[] = [];\n await store.query_streams((p) => by_source.push(p.stream), {\n stream: `qs-${tag}-.*`,\n source: `qs-${tag}-src-.*`,\n });\n expect(by_source.sort()).toEqual([dyn1, dyn2].sort());\n\n const exact_source: string[] = [];\n await store.query_streams((p) => exact_source.push(p.stream), {\n stream: `qs-${tag}-.*`,\n source: src2,\n source_exact: true,\n });\n expect(exact_source).toEqual([dyn2]);\n });\n\n it(\"paginates with limit + after (keyset)\", async () => {\n const tag = uid();\n const streams = [\n `qp-${tag}-a`,\n `qp-${tag}-b`,\n `qp-${tag}-c`,\n `qp-${tag}-d`,\n ];\n await store.subscribe(streams.map((stream) => ({ stream })));\n const page1: string[] = [];\n await store.query_streams((p) => page1.push(p.stream), {\n stream: `qp-${tag}-.*`,\n limit: 2,\n });\n expect(page1).toHaveLength(2);\n const page2: string[] = [];\n await store.query_streams((p) => page2.push(p.stream), {\n stream: `qp-${tag}-.*`,\n limit: 2,\n after: page1.at(-1),\n });\n expect(page2).toHaveLength(2);\n expect([...page1, ...page2].sort()).toEqual([...streams].sort());\n });\n\n it(\"filters by blocked status\", async () => {\n const tag = uid();\n const s = `qb-${tag}`;\n const sibling = `qb-${tag}-other`;\n await store.subscribe([{ stream: s }, { stream: sibling }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === s);\n const others = leased.filter((l) => l.stream !== s);\n await store.ack(others);\n await store.block([{ ...(mine as Lease), error: \"boom\" }]);\n\n const blocked: Array<{ stream: string; error: string }> = [];\n await store.query_streams(\n (p) => blocked.push({ stream: p.stream, error: p.error }),\n { stream: `qb-${tag}.*`, blocked: true }\n );\n expect(blocked).toHaveLength(1);\n expect(blocked[0].error).toBe(\"boom\");\n\n // blocked: false — must exclude the blocked one but include\n // the sibling, exercising the other arm of the conditional.\n const unblocked: string[] = [];\n await store.query_streams((p) => unblocked.push(p.stream), {\n stream: `qb-${tag}.*`,\n blocked: false,\n });\n expect(unblocked).toEqual([sibling]);\n });\n });\n\n describe(\"query_stats\", () => {\n it(\"array input — returns head per stream, absent when not in input\", async () => {\n const tag = uid();\n const sA = `qst-${tag}-a`;\n const sB = `qst-${tag}-b`;\n const sUnasked = `qst-${tag}-unasked`;\n await store.commit<CounterEvents>(\n sA,\n [inc(1), inc(2)],\n make_meta({ stream: sA })\n );\n await store.commit<CounterEvents>(\n sB,\n [dec(5)],\n make_meta({ stream: sB })\n );\n await store.commit<CounterEvents>(\n sUnasked,\n [inc(99)],\n make_meta({ stream: sUnasked })\n );\n\n const stats = await store.query_stats<CounterEvents>([sA, sB]);\n expect(stats.size).toBe(2);\n expect(stats.get(sA)?.head.name).toBe(\"Incremented\");\n expect((stats.get(sA)!.head.data as { amount: number }).amount).toBe(2);\n expect(stats.get(sB)?.head.name).toBe(\"Decremented\");\n expect((stats.get(sB)!.head.data as { amount: number }).amount).toBe(5);\n expect(stats.has(sUnasked)).toBe(false);\n\n // Empty input — empty result.\n const empty = await store.query_stats([]);\n expect(empty.size).toBe(0);\n\n // Unknown stream name — absent, not an error.\n const unknown = await store.query_stats([`qst-${tag}-missing`]);\n expect(unknown.size).toBe(0);\n });\n\n it(\"tail returns the earliest event per stream\", async () => {\n const tag = uid();\n const s = `qst-tail-${tag}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(2)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(3)],\n make_meta({ stream: s })\n );\n\n const stats = await store.query_stats<CounterEvents>([s], {\n tail: true,\n });\n const r = stats.get(s);\n expect(r?.head.name).toBe(\"Incremented\");\n expect((r!.head.data as { amount: number }).amount).toBe(3);\n expect(r?.tail?.name).toBe(\"Incremented\");\n expect((r!.tail!.data as { amount: number }).amount).toBe(1);\n });\n\n it(\"count + names — full aggregates including framework markers\", async () => {\n const tag = uid();\n const s = `qst-cn-${tag}`;\n // 1 inc, then truncate (wipes + seeds snap), then 2 more incs + 1 dec\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n await store.truncate([{ stream: s, snapshot: { count: 99 } }]);\n await store.commit<CounterEvents>(\n s,\n [inc(2), inc(3), dec(1)],\n make_meta({ stream: s })\n );\n\n const stats = await store.query_stats<CounterEvents>([s], {\n count: true,\n names: true,\n });\n const r = stats.get(s);\n // Post-truncate live events: snap + inc + inc + dec = 4\n expect(r?.count).toBe(4);\n expect(r?.names?.[SNAP_EVENT]).toBe(1);\n expect(r?.names?.Incremented).toBe(2);\n expect(r?.names?.Decremented).toBe(1);\n // Snapshot count is derivable from the names map — no separate field needed.\n expect(r?.names?.[SNAP_EVENT]).toBe(1);\n });\n\n it(\"exclude shifts head past filtered events; stream absent when all filtered\", async () => {\n const tag = uid();\n const s = `qst-excl-${tag}`;\n const sAllOut = `qst-allout-${tag}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), dec(2), inc(3)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n sAllOut,\n [inc(7)],\n make_meta({ stream: sAllOut })\n );\n\n // Without exclude — head is the latest Incremented.\n const all = await store.query_stats<CounterEvents>([s]);\n expect(all.get(s)?.head.name).toBe(\"Incremented\");\n expect((all.get(s)!.head.data as { amount: number }).amount).toBe(3);\n\n // Exclude Incremented — head is now Decremented (the next-latest).\n const excl = await store.query_stats<CounterEvents>([s], {\n exclude: [\"Incremented\"],\n });\n expect(excl.get(s)?.head.name).toBe(\"Decremented\");\n expect((excl.get(s)!.head.data as { amount: number }).amount).toBe(2);\n\n // Exclude every name on a stream — that stream is absent from result.\n const wipe = await store.query_stats<CounterEvents>([sAllOut], {\n exclude: [\"Incremented\", \"Decremented\", \"Reset\"],\n });\n expect(wipe.has(sAllOut)).toBe(false);\n\n // Framework markers are typed in EventName<E> too — close-cycle pattern.\n const no_tomb = await store.query_stats<CounterEvents>([s], {\n exclude: [TOMBSTONE_EVENT],\n });\n expect(no_tomb.get(s)?.head.name).toBe(\"Incremented\");\n });\n\n it(\"before — time travel narrows head/tail/count\", async () => {\n const tag = uid();\n const s = `qst-tt-${tag}`;\n const c1 = await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const c2 = await store.commit<CounterEvents>(\n s,\n [inc(2)],\n make_meta({ stream: s })\n );\n await store.commit<CounterEvents>(\n s,\n [inc(3)],\n make_meta({ stream: s })\n );\n\n // Cutoff at id of c2's event — only c1's event is < cutoff\n const before = c2[0].id;\n const stats = await store.query_stats<CounterEvents>([s], {\n tail: true,\n count: true,\n before,\n });\n const r = stats.get(s);\n expect(r?.count).toBe(1);\n expect(r?.head.id).toBe(c1[0].id);\n expect(r?.tail?.id).toBe(c1[0].id);\n\n // Cutoff before any event — stream absent\n const empty = await store.query_stats<CounterEvents>([s], {\n before: 0,\n });\n expect(empty.has(s)).toBe(false);\n });\n\n it(\"filter form — stream regex, stream_exact, empty {} match\", async () => {\n const tag = uid();\n const sA = `qsf-${tag}-orders-1`;\n const sB = `qsf-${tag}-orders-2`;\n const sOther = `qsf-${tag}-users-1`;\n await store.commit<CounterEvents>(\n sA,\n [inc(1)],\n make_meta({ stream: sA })\n );\n await store.commit<CounterEvents>(\n sB,\n [inc(2)],\n make_meta({ stream: sB })\n );\n await store.commit<CounterEvents>(\n sOther,\n [inc(3)],\n make_meta({ stream: sOther })\n );\n\n // Regex match — restrict to this tag's orders.\n const orders = await store.query_stats<CounterEvents>({\n stream: `^qsf-${tag}-orders-`,\n });\n expect([...orders.keys()].sort()).toEqual([sA, sB].sort());\n\n // Exact match — single stream.\n const exact = await store.query_stats<CounterEvents>({\n stream: sA,\n stream_exact: true,\n });\n expect([...exact.keys()]).toEqual([sA]);\n\n // Empty filter — matches every event-bearing stream visible to\n // this test's tag (filtered down to avoid sibling-test pollution).\n const all = await store.query_stats<CounterEvents>({\n stream: `^qsf-${tag}-`,\n });\n expect([...all.keys()].sort()).toEqual([sA, sB, sOther].sort());\n });\n\n it(\"compose with query_streams for subscription-level filters\", async () => {\n // `query_stats` only accepts event-stream selection. For\n // \"stats for blocked subscriptions\" etc., compose with\n // `query_streams` and pipe the names through. This test asserts\n // that two-call pattern works end-to-end.\n const tag = uid();\n const a = `qsc-${tag}-a`;\n const b = `qsc-${tag}-b`;\n await store.subscribe([{ stream: a }, { stream: b }]);\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [inc(2)],\n make_meta({ stream: b })\n );\n\n // Block stream `a` via the standard claim → block path.\n const leased = await store.claim(100, 0, `w-${uid()}`, 100_000);\n const mine = leased.find((l) => l.stream === a);\n expect(mine).toBeDefined();\n const others = leased.filter((l) => l.stream !== a);\n await store.ack(others);\n await store.block([{ ...(mine as Lease), error: \"boom\" }]);\n\n // Step 1: subscription-level filter via query_streams.\n const blocked_names: string[] = [];\n await store.query_streams((p) => blocked_names.push(p.stream), {\n stream: `^qsc-${tag}-`,\n blocked: true,\n });\n expect(blocked_names).toEqual([a]);\n\n // Step 2: event-level stats for those streams.\n const stats = await store.query_stats<CounterEvents>(blocked_names);\n expect(stats.get(a)?.head.name).toBe(\"Incremented\");\n expect(stats.has(b)).toBe(false);\n });\n\n it(\"empty filter {} — matches every event-bearing stream\", async () => {\n const tag = uid();\n const a = `qse-${tag}-a`;\n const b = `qse-${tag}-b`;\n await store.commit<CounterEvents>(\n a,\n [inc(1)],\n make_meta({ stream: a })\n );\n await store.commit<CounterEvents>(\n b,\n [dec(2)],\n make_meta({ stream: b })\n );\n\n // {} matches all event-bearing streams globally — the TCK runs\n // against a shared store, so we only assert that this tag's\n // streams are present (other tests' streams may also appear).\n const all = await store.query_stats<CounterEvents>({});\n expect(all.has(a)).toBe(true);\n expect(all.has(b)).toBe(true);\n });\n\n it(\"stat-flag combinations — count-only, names-only, tail-only\", async () => {\n const tag = uid();\n const s = `qsfl-${tag}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1), inc(2), dec(3)],\n make_meta({ stream: s })\n );\n\n // count only → no names, no tail in result.\n const c = await store.query_stats<CounterEvents>([s], {\n count: true,\n });\n expect(c.get(s)?.count).toBe(3);\n expect(c.get(s)?.names).toBeUndefined();\n expect(c.get(s)?.tail).toBeUndefined();\n\n // names only → no count, no tail.\n const n = await store.query_stats<CounterEvents>([s], {\n names: true,\n });\n expect(n.get(s)?.names).toEqual({ Incremented: 2, Decremented: 1 });\n expect(n.get(s)?.count).toBeUndefined();\n expect(n.get(s)?.tail).toBeUndefined();\n\n // tail only → no count, no names. Cheap path (no full scan).\n const t = await store.query_stats<CounterEvents>([s], { tail: true });\n expect(t.get(s)?.tail?.name).toBe(\"Incremented\");\n expect((t.get(s)!.tail!.data as { amount: number }).amount).toBe(1);\n expect(t.get(s)?.count).toBeUndefined();\n expect(t.get(s)?.names).toBeUndefined();\n });\n\n it(\"paginates with limit + after (keyset), ordered by stream name\", async () => {\n const tag = uid();\n const streams = [\n `qsp-${tag}-a`,\n `qsp-${tag}-b`,\n `qsp-${tag}-c`,\n `qsp-${tag}-d`,\n ];\n for (const s of streams) {\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n }\n\n const page1 = await store.query_stats<CounterEvents>(\n { stream: `qsp-${tag}-.*` },\n { limit: 2 }\n );\n const k1 = [...page1.keys()];\n expect(k1).toEqual([`qsp-${tag}-a`, `qsp-${tag}-b`]);\n\n const page2 = await store.query_stats<CounterEvents>(\n { stream: `qsp-${tag}-.*` },\n { limit: 2, after: k1.at(-1) }\n );\n const k2 = [...page2.keys()];\n expect(k2).toEqual([`qsp-${tag}-c`, `qsp-${tag}-d`]);\n\n // Final short page signals the end.\n const page3 = await store.query_stats<CounterEvents>(\n { stream: `qsp-${tag}-.*` },\n { limit: 2, after: k2.at(-1) }\n );\n expect(page3.size).toBe(0);\n\n // Unbounded (no limit) returns every matching stream in one call.\n const all = await store.query_stats<CounterEvents>({\n stream: `qsp-${tag}-.*`,\n });\n expect([...all.keys()].sort()).toEqual([...streams].sort());\n });\n });\n\n // Reverse-match probe filter (#1010): restrict to subscriptions whose\n // stored `source` pattern matches at least one of the supplied names.\n // Gated — stores that can't express reverse-regex omit it and callers\n // fall back to an unfiltered scan.\n describe.skipIf(!caps.source_matches)(\n \"query_streams source_matches (capability)\",\n () => {\n it(\"returns only subscriptions whose source pattern matches a name\", async () => {\n const tag = uid();\n // Two dynamic subscriptions with concrete sources, one with a\n // regex source matching a family of streams.\n const subConcreteA = `sm-${tag}-sub-a`;\n const subConcreteB = `sm-${tag}-sub-b`;\n const subRegex = `sm-${tag}-sub-regex`;\n const subNoSource = `sm-${tag}-sub-nosource`;\n const srcA = `sm-${tag}-order-1`;\n const srcB = `sm-${tag}-order-2`;\n const srcRegex = `^sm-${tag}-order-`;\n await store.subscribe([\n { stream: subConcreteA, source: srcA },\n { stream: subConcreteB, source: srcB },\n { stream: subRegex, source: srcRegex },\n // No source = no source constraint = matches every name.\n { stream: subNoSource },\n ]);\n\n // Closing srcA: the concrete-A sub (source === srcA), the regex\n // sub (source matches srcA), and the no-source sub (always)\n // qualify; concrete-B does not.\n const matched: string[] = [];\n await store.query_streams((p) => matched.push(p.stream), {\n stream: `sm-${tag}-sub-.*`,\n source_matches: [srcA],\n });\n expect(matched.sort()).toEqual(\n [subConcreteA, subRegex, subNoSource].sort()\n );\n\n // A name no concrete/regex source matches → only the\n // no-source sub (which always qualifies) comes back.\n const none: string[] = [];\n await store.query_streams((p) => none.push(p.stream), {\n stream: `sm-${tag}-sub-.*`,\n source_matches: [`sm-${tag}-unrelated`],\n });\n expect(none).toEqual([subNoSource]);\n\n // Multiple names → union of matching subscriptions, plus the\n // always-matching no-source sub.\n const both: string[] = [];\n await store.query_streams((p) => both.push(p.stream), {\n stream: `sm-${tag}-sub-.*`,\n source_matches: [srcA, srcB],\n });\n expect(both.sort()).toEqual(\n [subConcreteA, subConcreteB, subRegex, subNoSource].sort()\n );\n });\n }\n );\n\n describe(\"query_streams anchor contract\", () => {\n // Same regex-anchor rules as `query`. Auto-anchoring by an adapter\n // is a contract violation — every store must honor caller-supplied\n // anchors identically.\n it(\"plain regex without anchors is a substring match\", async () => {\n const tag = uid();\n const inner = `qsr-${tag}-inner`;\n const longer = `qsr-${tag}-inner-extra`;\n const other = `zz-${tag}-other`;\n await store.subscribe([\n { stream: inner },\n { stream: longer },\n { stream: other },\n ]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n stream: `qsr-${tag}-inner`,\n });\n expect(seen.sort()).toEqual([inner, longer].sort());\n });\n\n it(\"caller-anchored `^name$` matches only the whole string\", async () => {\n const tag = uid();\n const inner = `qsr-${tag}-anchor`;\n const longer = `qsr-${tag}-anchor-extra`;\n await store.subscribe([{ stream: inner }, { stream: longer }]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n stream: `^qsr-${tag}-anchor$`,\n });\n expect(seen).toEqual([inner]);\n });\n\n it(\"caller-anchored `^prefix` matches by prefix\", async () => {\n const tag = uid();\n const a = `qsr-${tag}-pfx-a`;\n const b = `qsr-${tag}-pfx-b`;\n const other = `zz-${tag}-pfx-c`;\n await store.subscribe([\n { stream: a },\n { stream: b },\n { stream: other },\n ]);\n const seen: string[] = [];\n await store.query_streams((p) => seen.push(p.stream), {\n stream: `^qsr-${tag}-pfx-`,\n });\n expect(seen.sort()).toEqual([a, b].sort());\n });\n });\n\n describe(\"prioritize anchor contract\", () => {\n it(\"caller-anchored `^name$` filter matches only the whole string\", async () => {\n const tag = uid();\n const inner = `pr-${tag}-anchor`;\n const longer = `pr-${tag}-anchor-extra`;\n await store.subscribe([\n { stream: inner, priority: 0 },\n { stream: longer, priority: 0 },\n ]);\n const updated = await store.prioritize(\n { stream: `^pr-${tag}-anchor$` },\n 7\n );\n expect(updated).toBe(1);\n const seen = new Map<string, number>();\n await store.query_streams((p) => seen.set(p.stream, p.priority), {\n stream: `pr-${tag}-anchor`,\n });\n expect(seen.get(inner)).toBe(7);\n expect(seen.get(longer)).toBe(0);\n });\n });\n\n describe(\"query_streams head\", () => {\n it(\"maxEventId tracks the highest committed id\", async () => {\n const s = `head-${uid()}`;\n await store.subscribe([{ stream: s }]);\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const positions: string[] = [];\n const { maxEventId } = await store.query_streams(\n (p) => positions.push(p.stream),\n { stream: s, stream_exact: true, limit: 1 }\n );\n expect(maxEventId).toBeGreaterThanOrEqual(0);\n expect(positions).toEqual([s]);\n });\n });\n\n describe(\"seed_stream helper coverage\", () => {\n it(\"commits N events with monotonically increasing ids\", async () => {\n const s = `seed-${uid()}`;\n const committed = await seed_stream(store, s, 3);\n expect(committed).toHaveLength(3);\n for (let i = 1; i < committed.length; i++) {\n expect(committed[i].id).toBeGreaterThan(committed[i - 1].id);\n }\n });\n });\n\n // Use `describe.skipIf` rather than `if (caps.restore) { describe(...) }`\n // so the gating lives inside vitest's skip mechanism instead of an\n // `if` branch every consumer would have to disprove (all three\n // in-tree adapters opt in to restore).\n describe.skipIf(!caps.restore)(\"restore (capability)\", () => {\n // Restore wipes the whole store — every test starts from a\n // freshly-dropped + seeded baseline so no test inherits\n // another's post-restore state and so subsequent TCK blocks\n // (notify) get a predictable empty store.\n beforeEach(async () => {\n await store.drop();\n await store.seed();\n });\n\n /**\n * Adapt an event array into the {@link EventSource} contract.\n * The test source's `query` walks the array and calls the\n * callback per event, exactly like a real `Store.query`. The\n * `await Promise.resolve(callback(...))` mirrors the adapter\n * pattern so async-callback backpressure stays exercised\n * even from this synthetic source.\n */\n const as_source = (\n events: Committed<Schemas, keyof Schemas>[]\n ): EventSource => ({\n async query(callback) {\n // The cast widens our concrete schema-erased event back\n // into the generic `E` slot the EventSource.query contract\n // is parametrized over. Safe — the synthetic test source\n // is intentionally schema-agnostic.\n for (const e of events)\n await Promise.resolve(\n (callback as (event: Committed<Schemas, keyof Schemas>) => void)(\n e\n )\n );\n return events.length;\n },\n async dispose() {\n // no-op — synthetic in-memory source\n },\n });\n\n /**\n * Build a {@link Committed} event with stub meta + the given\n * created date. `original_id` populates `id` — used by the\n * orchestrator's scan to key the causation remap. Tests pass\n * arbitrary values (often a counter) since they're only\n * consumed by the map.\n */\n const event = (\n original_id: number,\n stream: string,\n version: number,\n name: string,\n created: Date,\n data: Record<string, unknown> = {}\n ): Committed<Schemas, keyof Schemas> => ({\n id: original_id,\n name,\n data,\n stream,\n version,\n created,\n meta: { correlation: \"restore-tck\", causation: {} },\n });\n\n /**\n * Test-side helper that routes through the public `Act.restore`\n * orchestrator path bound to the store-under-test via the\n * scoped-ports bag. Validates that the adapter's `restore` HOF\n * integrates correctly with the framework's scan loop without\n * importing the framework's internal scan symbol directly.\n */\n const restore = async (\n source: EventSource,\n opts: ScanOptions = {}\n ): Promise<ScanResult> => {\n const cache = new InMemoryCache();\n const app = act().build({ scoped: { store, cache } });\n try {\n return await app.restore(source, opts);\n } finally {\n // Dispose the source first, then the cache — mirrors how\n // a production caller would tear down ephemeral resources.\n // Also keeps the synthetic-source `dispose` no-op\n // exercised by every test that runs `restore`.\n await source.dispose();\n await cache.dispose();\n }\n };\n\n it(\"returns kept=0 on an empty source\", async () => {\n const result = await restore(as_source([]));\n expect(result.kept).toBe(0);\n expect(result.duration_ms).toBeGreaterThanOrEqual(0);\n expect(result.dropped).toEqual({\n closed_streams: 0,\n snapshots: 0,\n });\n // Store ends empty.\n const events = await collect(store, { limit: 10 });\n expect(events).toHaveLength(0);\n });\n\n it(\"rebuilds a single stream and preserves `created` verbatim\", async () => {\n const s = `restore-single-${uid()}`;\n const t0 = new Date(\"2020-01-01T00:00:00.000Z\");\n const t1 = new Date(\"2020-01-02T00:00:00.000Z\");\n const t2 = new Date(\"2020-01-03T00:00:00.000Z\");\n const events = [\n event(1, s, 0, \"Incremented\", t0, { amount: 1 }),\n event(2, s, 1, \"Incremented\", t1, { amount: 2 }),\n event(3, s, 2, \"Decremented\", t2, { amount: 1 }),\n ];\n const result = await restore(as_source(events));\n expect(result.kept).toBe(3);\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back).toHaveLength(3);\n expect(\n back.map((e) => ({\n stream: e.stream,\n version: e.version,\n name: e.name,\n created: e.created.toISOString(),\n data: e.data,\n }))\n ).toEqual([\n {\n stream: s,\n version: 0,\n name: \"Incremented\",\n created: t0.toISOString(),\n data: { amount: 1 },\n },\n {\n stream: s,\n version: 1,\n name: \"Incremented\",\n created: t1.toISOString(),\n data: { amount: 2 },\n },\n {\n stream: s,\n version: 2,\n name: \"Decremented\",\n created: t2.toISOString(),\n data: { amount: 1 },\n },\n ]);\n });\n\n it(\"rebuilds multiple streams interleaved\", async () => {\n const a = `restore-multi-a-${uid()}`;\n const b = `restore-multi-b-${uid()}`;\n const t = new Date(\"2020-06-01T00:00:00.000Z\");\n const events = [\n event(1, a, 0, \"Incremented\", t, { amount: 10 }),\n event(2, b, 0, \"Incremented\", t, { amount: 20 }),\n event(3, a, 1, \"Decremented\", t, { amount: 5 }),\n event(4, b, 1, \"Incremented\", t, { amount: 30 }),\n ];\n const result = await restore(as_source(events));\n expect(result.kept).toBe(4);\n const aBack: Committed<CounterEvents, keyof CounterEvents>[] = [];\n const bBack: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n aBack.push(e);\n },\n { stream: a, stream_exact: true }\n );\n await store.query<CounterEvents>(\n (e) => {\n bBack.push(e);\n },\n { stream: b, stream_exact: true }\n );\n expect(aBack.map((e) => e.version)).toEqual([0, 1]);\n expect(bBack.map((e) => e.version)).toEqual([0, 1]);\n });\n\n it(\"preserves Date `created` verbatim\", async () => {\n const s = `restore-isoc-${uid()}`;\n const iso = \"2021-07-15T12:34:56.789Z\";\n await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n created: new Date(iso),\n meta: { correlation: \"restore-tck\", causation: {} },\n },\n ])\n );\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back).toHaveLength(1);\n expect(back[0].created.toISOString()).toBe(iso);\n });\n\n it(\"wipes pre-existing events before inserting\", async () => {\n const old = `restore-old-${uid()}`;\n await store.commit<CounterEvents>(\n old,\n [inc(1), inc(2)],\n make_meta({ stream: old })\n );\n const fresh = `restore-fresh-${uid()}`;\n const t = new Date(\"2020-01-01T00:00:00.000Z\");\n await restore(\n as_source([event(1, fresh, 0, \"Incremented\", t, { amount: 99 })])\n );\n // The old stream is gone.\n const old_back = await collect(store, {\n stream: old,\n stream_exact: true,\n });\n expect(old_back).toHaveLength(0);\n // Only the fresh stream remains.\n const fresh_back = await collect(store, {\n stream: fresh,\n stream_exact: true,\n });\n expect(fresh_back).toHaveLength(1);\n });\n\n it(\"clears subscription/stream-position metadata\", async () => {\n const sub = `restore-sub-${uid()}`;\n await store.subscribe([{ stream: sub, source: \"anything\" }]);\n const collect_streams = async () => {\n const out: string[] = [];\n await store.query_streams((p) => {\n out.push(p.stream);\n });\n return out;\n };\n const before = await collect_streams();\n expect(before.includes(sub)).toBe(true);\n await restore(as_source([]));\n const after = await collect_streams();\n expect(after.includes(sub)).toBe(false);\n });\n\n it(\"preserves snapshot events through restore\", async () => {\n // SNAP_EVENT is a framework marker — restore writes it\n // through but skips updating the max-non-snap-id indexes.\n // Covers the `event.name !== SNAP_EVENT` false branch.\n const s = `restore-snap-${uid()}`;\n const t = new Date(\"2020-04-01T00:00:00.000Z\");\n await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: SNAP_EVENT,\n data: { count: 42 },\n created: t,\n meta: { correlation: \"snap\", causation: {} },\n },\n ])\n );\n const back = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(back).toHaveLength(1);\n expect((back[0] as { name: string }).name).toBe(SNAP_EVENT);\n });\n\n it(\"rewrites causation refs through the old→new id map\", async () => {\n // Sparse source ids (5, 7, 9) — adapter renumbers densely;\n // the event whose causation pointed at original id 5 must end\n // up pointing at the new id assigned to that same row.\n const s = `restore-caus-${uid()}`;\n const t = new Date(\"2020-08-01T00:00:00.000Z\");\n const events: Committed<Schemas, keyof Schemas>[] = [\n {\n id: 5,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n created: t,\n meta: { correlation: \"c\", causation: {} },\n },\n {\n id: 7,\n stream: s,\n version: 1,\n name: \"Incremented\",\n data: { amount: 2 },\n created: t,\n meta: {\n correlation: \"c\",\n causation: {\n event: { id: 5, name: \"Incremented\", stream: s },\n },\n },\n },\n {\n id: 9,\n stream: s,\n version: 2,\n name: \"Decremented\",\n data: { amount: 1 },\n created: t,\n meta: {\n correlation: \"c\",\n causation: {\n event: { id: 7, name: \"Incremented\", stream: s },\n },\n },\n },\n ];\n await restore(as_source(events));\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back).toHaveLength(3);\n // First row's causation is empty.\n expect(back[0].meta.causation.event).toBeUndefined();\n // Second row's causation pointed at original id 5 → new id of row 0.\n expect(back[1].meta.causation.event?.id).toBe(back[0].id);\n // Third row's causation pointed at original id 7 → new id of row 1.\n expect(back[2].meta.causation.event?.id).toBe(back[1].id);\n });\n\n it(\"leaves causation refs unmapped when the target isn't in the source\", async () => {\n const s = `restore-orphan-${uid()}`;\n const t = new Date(\"2020-09-01T00:00:00.000Z\");\n await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n created: t,\n meta: {\n correlation: \"c\",\n causation: {\n event: { id: 999, name: \"Phantom\", stream: \"ghost\" },\n },\n },\n },\n ])\n );\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(back[0].meta.causation.event?.id).toBe(999);\n });\n\n it(\"rolls back atomically when the source throws mid-iteration\", async () => {\n // Pre-seed some events the rollback must restore.\n const original = `restore-pre-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n original,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: original })\n );\n // EventSource that fires one event then throws — exercises\n // the rollback path on the destination store. Implemented as\n // a query method (not an iterable) since EventSource is the\n // shape Act.restore takes.\n const explosive: EventSource = {\n async query(callback) {\n await Promise.resolve(\n (callback as (event: Committed<Schemas, keyof Schemas>) => void)(\n event(\n 1,\n `restore-explode-${uid()}`,\n 0,\n \"Incremented\",\n new Date(),\n { amount: 1 }\n )\n )\n );\n throw new Error(\"boom\");\n },\n async dispose() {\n // no-op\n },\n };\n await expect(restore(explosive)).rejects.toThrow(\"boom\");\n // Pre-call events still there.\n const back: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n back.push(e);\n },\n { stream: original, stream_exact: true }\n );\n expect(back).toHaveLength(3);\n expect(back.map((e) => e.id)).toEqual(committed.map((c) => c.id));\n });\n\n // ACT-1125 — compaction toggles + dry-run blocker scan + progress.\n\n it(\"drop_snapshots: skips SNAP_EVENT rows and counts them\", async () => {\n const s = `restore-drop-snap-${uid()}`;\n const t = new Date(\"2020-10-01T00:00:00.000Z\");\n const result = await restore(\n as_source([\n event(1, s, 0, \"Incremented\", t, { amount: 1 }),\n {\n id: 2,\n stream: s,\n version: 1,\n name: SNAP_EVENT,\n data: { count: 1 },\n created: t,\n meta: { correlation: \"snap\", causation: {} },\n },\n event(3, s, 2, \"Incremented\", t, { amount: 2 }),\n ]),\n { drop_snapshots: true }\n );\n expect(result.kept).toBe(2);\n expect(result.dropped.snapshots).toBe(1);\n // Verify the snapshot is gone from the rebuilt store.\n const back = await collect(store, {\n stream: s,\n stream_exact: true,\n with_snaps: true,\n });\n expect(back).toHaveLength(2);\n expect(\n back.every((e) => (e as { name: string }).name !== SNAP_EVENT)\n ).toBe(true);\n });\n\n it(\"on_progress fires once per event (caller throttles)\", async () => {\n const calls: number[] = [];\n const s = `restore-progress-${uid()}`;\n const t = new Date(\"2021-02-01T00:00:00.000Z\");\n await restore(\n as_source([\n event(1, s, 0, \"Incremented\", t, { amount: 1 }),\n event(2, s, 1, \"Incremented\", t, { amount: 2 }),\n ]),\n { on_progress: (p) => calls.push(p.processed) }\n );\n // One callback per event; values monotonic.\n expect(calls).toEqual([1, 2]);\n });\n\n // #1258: `created` bounds are pure WHERE filters, never early-breaks.\n // Restore preserves the source `created` verbatim, so a restored\n // dataset whose timestamp order diverges from id order proves the\n // scan must not short-circuit on the first out-of-order event.\n it(\"query created bounds are filters, not id-ordered breaks\", async () => {\n const s = `restore-created-order-${uid()}`;\n // id 0 = newest, id 1 = oldest → created order ≠ id order.\n const newest = new Date(\"2020-06-01T00:00:00.000Z\");\n const oldest = new Date(\"2020-01-01T00:00:00.000Z\");\n await restore(\n as_source([\n event(1, s, 0, \"Incremented\", newest, { amount: 10 }),\n event(2, s, 1, \"Incremented\", oldest, { amount: 20 }),\n ])\n );\n const cutoff = new Date(\"2020-03-01T00:00:00.000Z\");\n // Forward: the newest event (id 0) is scanned first and fails\n // `created_before`; the older event (id 1) must still be found.\n const fwd: number[] = [];\n await store.query<CounterEvents>(\n (e) => {\n fwd.push((e.data as { amount: number }).amount);\n },\n { stream: s, stream_exact: true, created_before: cutoff }\n );\n expect(fwd).toEqual([20]);\n // Backward: the oldest event (id 1) is scanned first and fails\n // `created_after`; the newer event (id 0) must still be found.\n const bwd: number[] = [];\n await store.query<CounterEvents>(\n (e) => {\n bwd.push((e.data as { amount: number }).amount);\n },\n {\n stream: s,\n stream_exact: true,\n created_after: cutoff,\n backward: true,\n }\n );\n expect(bwd).toEqual([10]);\n });\n\n // Note (RFC 1274): floor-vs-time-bound suppression is no longer a\n // store-level concern. The store applies the resume floor whenever\n // `with_snaps` is set; the orchestrator is the single owner of floor\n // eligibility and never combines `with_snaps` with an `asOf` bound. The\n // suppression contract (#1261 `created_*`, #1267 `before`, #1274 `limit`)\n // is now enforced at the orchestrator level in\n // `libs/act/test/time-travel.spec.ts`.\n\n // #1257: restore must split `pii` into the isolated store so\n // `forget_pii` erases it — otherwise restored PII stays inline and\n // erasure silently no-ops. Only meaningful when the adapter also\n // isolates PII, so gate the assertion on that capability.\n it.skipIf(!caps.pii_isolation)(\n \"isolates restored pii so forget_pii erases it\",\n async () => {\n const s = `restore-pii-${uid()}`;\n const t = new Date(\"2020-05-01T00:00:00.000Z\");\n // Two PII events on the same stream so isolation must survive\n // across events, not just the first.\n const result = await restore(\n as_source([\n {\n id: 1,\n stream: s,\n version: 0,\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"first@example.com\" },\n created: t,\n meta: { correlation: \"restore-tck\", causation: {} },\n },\n {\n id: 2,\n stream: s,\n version: 1,\n name: \"Incremented\",\n data: { amount: 2 },\n pii: { email: \"second@example.com\" },\n created: t,\n meta: { correlation: \"restore-tck\", causation: {} },\n },\n ])\n );\n expect(result.kept).toBe(2);\n // PII round-trips on read after restore.\n const before: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n before.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(before.map((e) => e.pii)).toEqual([\n { email: \"first@example.com\" },\n { email: \"second@example.com\" },\n ]);\n // forget_pii sees the restored PII and wipes every event's copy.\n const wiped = await store.forget_pii!.call(store, s);\n expect(wiped).toBe(2);\n const after: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n after.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(after).toHaveLength(2);\n for (const e of after) expect(e.pii == null).toBe(true);\n expect(after.map((e) => e.data)).toEqual([\n { amount: 1 },\n { amount: 2 },\n ]);\n }\n );\n });\n\n // PII isolation — sensitive-data epic (#566). Same `skipIf` pattern as\n // restore: gated on `caps.pii_isolation`, exercises commit-with-pii\n // round-trip, the no-pii passthrough, `forget_pii` happy path +\n // idempotency, and isolation across streams.\n describe.skipIf(!caps.pii_isolation)(\"pii_isolation (capability)\", () => {\n it(\"commits and loads pii alongside data\", async () => {\n const s = `pii-roundtrip-${uid()}`;\n const committed = await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"u@example.com\", name: \"Ursula\" },\n },\n ],\n make_meta({ stream: s })\n );\n expect(committed).toHaveLength(1);\n expect(committed[0].pii).toEqual({\n email: \"u@example.com\",\n name: \"Ursula\",\n });\n\n // Re-read via query to confirm the adapter persists pii.\n const seen: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n seen.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(seen).toHaveLength(1);\n expect(seen[0].pii).toEqual({ email: \"u@example.com\", name: \"Ursula\" });\n // Non-pii fields untouched.\n expect(seen[0].data).toEqual({ amount: 1 });\n });\n\n it(\"query_stats head/tail never carry pii — introspection surface is pii-safe (#1294)\", async () => {\n const s = `pii-stats-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"head@example.com\" },\n },\n {\n name: \"Incremented\",\n data: { amount: 2 },\n pii: { email: \"tail@example.com\" },\n },\n ],\n make_meta({ stream: s })\n );\n\n // `query_stats` has no actor context and no disclosure gate, so it\n // must not surface pii — regardless of adapter or at-rest encryption.\n // Both code paths: heads-only (no count/names) and full-scan.\n const heads = await store.query_stats<CounterEvents>([s], {\n tail: true,\n });\n const h = heads.get(s);\n expect(h?.head?.pii == null).toBe(true);\n expect(h?.tail?.pii == null).toBe(true);\n\n const full = await store.query_stats<CounterEvents>([s], {\n tail: true,\n count: true,\n names: true,\n });\n const f = full.get(s);\n expect(f?.head?.pii == null).toBe(true);\n expect(f?.tail?.pii == null).toBe(true);\n expect(f?.count).toBe(2);\n });\n\n it(\"passes through events without pii (pii is null or undefined on load)\", async () => {\n const s = `pii-none-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const seen: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n seen.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(seen).toHaveLength(1);\n // Either undefined or null is acceptable — adapters that store\n // `pii TEXT NULL` round-trip as null; in-memory may return\n // undefined for the missing key. Both forms mean \"no PII.\"\n expect(seen[0].pii == null).toBe(true);\n });\n\n it(\"wipes pii for every event on the stream via forget_pii\", async () => {\n const s = `pii-forget-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"a@example.com\" },\n },\n {\n name: \"Incremented\",\n data: { amount: 2 },\n pii: { email: \"b@example.com\" },\n },\n ],\n make_meta({ stream: s })\n );\n\n const forget = store.forget_pii;\n expect(forget).toBeDefined();\n const wiped = await forget!.call(store, s);\n expect(wiped).toBe(2);\n\n const seen: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n seen.push(e);\n },\n { stream: s, stream_exact: true }\n );\n expect(seen).toHaveLength(2);\n // PII is gone — adapters return null. Data is intact.\n for (const e of seen) {\n expect(e.pii == null).toBe(true);\n expect(e.data).toBeDefined();\n }\n });\n\n it(\"is idempotent — second forget_pii returns 0, no error\", async () => {\n const s = `pii-forget-idem-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"u@example.com\" },\n },\n ],\n make_meta({ stream: s })\n );\n const forget = store.forget_pii!;\n const first = await forget.call(store, s);\n expect(first).toBe(1);\n const second = await forget.call(store, s);\n expect(second).toBe(0);\n });\n\n it(\"only wipes the targeted stream — siblings untouched\", async () => {\n const sA = `pii-iso-a-${uid()}`;\n const sB = `pii-iso-b-${uid()}`;\n await store.commit<CounterEvents>(\n sA,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"alice@example.com\" },\n },\n ],\n make_meta({ stream: sA })\n );\n await store.commit<CounterEvents>(\n sB,\n [\n {\n name: \"Incremented\",\n data: { amount: 1 },\n pii: { email: \"bob@example.com\" },\n },\n ],\n make_meta({ stream: sB })\n );\n await store.forget_pii!.call(store, sA);\n\n const a: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n a.push(e);\n },\n { stream: sA, stream_exact: true }\n );\n expect(a[0].pii == null).toBe(true);\n\n const b: Committed<CounterEvents, keyof CounterEvents>[] = [];\n await store.query<CounterEvents>(\n (e) => {\n b.push(e);\n },\n { stream: sB, stream_exact: true }\n );\n expect(b[0].pii).toEqual({ email: \"bob@example.com\" });\n });\n\n it(\"forget_pii on a stream with no pii events returns 0\", async () => {\n const s = `pii-forget-empty-${uid()}`;\n await store.commit<CounterEvents>(\n s,\n [inc(1)],\n make_meta({ stream: s })\n );\n const wiped = await store.forget_pii!.call(store, s);\n expect(wiped).toBe(0);\n });\n });\n\n if (caps.notify) {\n // ACT-1184: the notify conformance suite. `factory` must produce\n // sibling instances that share one backing store — the TCK's\n // standing pattern (two PostgresStores on the same schema/table,\n // two withBroker decorators on one broker). These cases enforce\n // the port's MUSTs: cross-instance delivery, self-filtering\n // (\"implementations must skip their own commits\"), and one\n // notification per commit transaction carrying the full batch.\n describe(\"notify (capability)\", () => {\n it(\"delivers a notification when a different instance commits\", async () => {\n // Self-filtering contract: an instance does not see its own\n // commits. So we listen on `store` and write through a fresh\n // sibling instance pointing at the same backend.\n const notify = store.notify;\n expect(notify).toBeDefined();\n const received: StoreNotification[] = [];\n let resolve_arrived!: () => void;\n const arrived = new Promise<void>((res) => {\n resolve_arrived = res;\n });\n const disposer = await notify!.call(store, (n) => {\n received.push(n);\n resolve_arrived();\n });\n const writer = await options.factory();\n try {\n const stream = `notify-${uid()}`;\n await writer.commit<CounterEvents>(\n stream,\n [inc(1)],\n make_meta({ stream })\n );\n // No explicit timeout — vitest's default test timeout\n // bounds the wait. If notify silently fails to deliver,\n // the test will surface that as a clear timeout failure.\n await arrived;\n expect(received.length).toBeGreaterThanOrEqual(1);\n expect(received[0].stream).toBe(stream);\n expect(received[0].events.length).toBeGreaterThanOrEqual(1);\n } finally {\n await writer.dispose();\n await Promise.resolve(disposer());\n }\n });\n\n it(\"does not deliver an instance's own commits (self-filtering)\", async () => {\n const received: StoreNotification[] = [];\n let resolve_sentinel!: () => void;\n const sentinel_arrived = new Promise<void>((res) => {\n resolve_sentinel = res;\n });\n const own = `notify-self-${uid()}`;\n const remote = `notify-remote-${uid()}`;\n const sentinel = `notify-sentinel-${uid()}`;\n const disposer = await store.notify!.call(store, (n) => {\n received.push(n);\n if (n.stream === sentinel) resolve_sentinel();\n });\n const writer = await options.factory();\n try {\n // Commit through the *listening* instance first, then through\n // a sibling (a plain remote commit, then the sentinel).\n // Notifications are delivered in commit order, so once the\n // sentinel arrives the own-commit notification would already\n // have been delivered were it not filtered.\n await store.commit<CounterEvents>(\n own,\n [inc(1)],\n make_meta({ stream: own })\n );\n await writer.commit<CounterEvents>(\n remote,\n [inc(1)],\n make_meta({ stream: remote })\n );\n await writer.commit<CounterEvents>(\n sentinel,\n [inc(1)],\n make_meta({ stream: sentinel })\n );\n await sentinel_arrived;\n expect(received.find((n) => n.stream === own)).toBeUndefined();\n expect(received.find((n) => n.stream === remote)).toBeDefined();\n expect(received.find((n) => n.stream === sentinel)).toBeDefined();\n } finally {\n await writer.dispose();\n await Promise.resolve(disposer());\n }\n });\n\n it(\"delivers one notification per commit transaction carrying the full event batch\", async () => {\n const received: StoreNotification[] = [];\n let resolve_sentinel!: () => void;\n const sentinel_arrived = new Promise<void>((res) => {\n resolve_sentinel = res;\n });\n const batch = `notify-batch-${uid()}`;\n const sentinel = `notify-batch-sentinel-${uid()}`;\n const disposer = await store.notify!.call(store, (n) => {\n received.push(n);\n if (n.stream === sentinel) resolve_sentinel();\n });\n const writer = await options.factory();\n try {\n // One commit transaction, three events. The sentinel commit\n // bounds the wait: delivered in commit order, its arrival\n // proves any duplicate batch notification would already be in\n // `received`.\n await writer.commit<CounterEvents>(\n batch,\n [inc(1), inc(2), inc(3)],\n make_meta({ stream: batch })\n );\n await writer.commit<CounterEvents>(\n sentinel,\n [inc(1)],\n make_meta({ stream: sentinel })\n );\n await sentinel_arrived;\n const batch_notifications = received.filter(\n (n) => n.stream === batch\n );\n expect(batch_notifications).toHaveLength(1);\n const events = batch_notifications[0].events;\n expect(events).toHaveLength(3);\n // The batch arrives ordered with id + name per entry.\n expect(events.map((e) => e.name)).toEqual([\n \"Incremented\",\n \"Incremented\",\n \"Incremented\",\n ]);\n expect([...events.map((e) => e.id)].sort((a, b) => a - b)).toEqual(\n events.map((e) => e.id)\n );\n } finally {\n await writer.dispose();\n await Promise.resolve(disposer());\n }\n });\n });\n }\n });\n};\n"],"mappings":"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","names":["beforeEach","describe","expect","it","afterEach","beforeEach","describe","expect","it","afterEach","beforeEach","describe","expect","it","LEVELS","describe","expect","it","entry","afterAll","beforeAll","describe","expect","it","mulberry32","describe","beforeAll","afterAll","expect","it","afterAll","beforeAll","describe","expect","describe","beforeAll","afterAll","reset","expect","stream","SNAP_EVENT","afterAll","beforeAll","describe","expect","it","describe","beforeAll","afterAll","it","expect","SNAP_EVENT","events","entry"]}
|