diff --git a/docs/in-progress/2026-08-21-db-bench.md b/docs/in-progress/2026-08-21-db-bench.md new file mode 100644 index 0000000..63d7db1 --- /dev/null +++ b/docs/in-progress/2026-08-21-db-bench.md @@ -0,0 +1,36 @@ +# In progress β€” iteration 22: db-bench, the measurement backbone + +> **Status: πŸ”„ in progress** (spec + plan approved 2026-08-21) β€” second +> slice of the concurrency chain **βœ… stage 3 β†’ 22 β†’ 31 β†’ 24 β†’ 23 β†’ 32**. +> Board: [../stories/00-status.md](../stories/00-status.md). +> +> One marker doc per active slice; deleted when the slice lands. + +## What + +Execute [`superpowers/plans/2026-08-21-db-bench.md`](../superpowers/plans/2026-08-21-db-bench.md) +(spec: [`2026-08-21-db-bench-design.md`](../superpowers/specs/2026-08-21-db-bench-design.md), +approved): the `time.ticks` Β΅s builtin, the `docs/examples/db-bench` +sample (seed/read/query/write/mix/msgrate/verify), the campaign driver +with relative gates vs `bench/baseline.json`, the restart proof and +kill -9 battery at both shard counts, and the first committed baseline. + +## Why now + +Nothing performance-shaped is sourced until this runs β€” and the arc owes +its before/after. One campaign now covers single- AND multi-shard +honestly (stage 3 landed), prices the RPC, and produces the mutex-inbox +number stage-2's deviation waits on. + +## Story + +- [22 β€” durability, throughput, scale](../stories/language-runtime-database/in-progress/22-durability-throughput-scale.md) + +## Definition of done + +- Plan Tasks 1–6 checked; `just db-bench` exit 0 twice in a row; + gate-bites smoke proven (doctored results FAIL); baseline committed + with rationale; arc delta + msgrate copied into story 8; full battery + green. +- Story 22 β†’ done/; board standup written from the actual numbers; this + file deleted. Next slice: iteration 31 (actor lifecycle). diff --git a/docs/stories/00-status.md b/docs/stories/00-status.md index c195abb..048f580 100644 --- a/docs/stories/00-status.md +++ b/docs/stories/00-status.md @@ -35,10 +35,13 @@ machine-readable truth behind this board; live Obsidian Dataview views: ## β–Ά NEXT PLAN **The concurrency + fiber chain β€” βœ… stage 3 β†’ 22 β†’ 31 β†’ 24 β†’ 23 β†’ 32** -(directive 2026-08-21). Next slice: **iteration 22, the measurement -backbone** β€” its spec brainstorm is the next act (four forks recorded in -[the story](language-runtime-database/refine/22-durability-throughput-scale.md)); -no marker doc until it starts. +(directive 2026-08-21). Active slice: **iteration 22, the measurement +backbone** β€” spec + plan approved 2026-08-21 +([spec](../superpowers/specs/2026-08-21-db-bench-design.md) Β· +[plan](../superpowers/plans/2026-08-21-db-bench.md) Β· +[marker](../in-progress/2026-08-21-db-bench.md)); the four forks settled +as their leanings, plus `time.ticks` (Β΅s clock) as the one runtime +addition and a new `db-bench` sample as the vehicle. **Implemented last time (2026-08-21):** the arc's **stage 3 β€” the transparent DB actor landed, the arc is COMPLETE** (stories @@ -230,7 +233,7 @@ that sequences its tasks. Read one, approve, then the next starts. | 9b | [`@table`, relations, query](language-runtime-database/done/09b-table-relations-query.md) | πŸ”„ query surface + relations + FK done (branch query-surface); group-by parked | | 19 | [Float + Bytes](language-runtime-database/done/19-missing-scalar-types.md) | βœ… **landed 2026-08-20** β€” `.wob` v5: Float constant tag, field kinds 6/7, opcodes 34-41 (IEEE-quiet f64), builtins 70-83. Full stack: literals, arithmetic, `@table` column, WAL bit-exact replay, json fractions in / shortest-round-trip out, `?Float` reserved-NaN nil, total-order index (NaN last, `-0.0` == `+0.0`), Bytes + base64. No implicit Int/Float mixing (WO-E201); `float`/`trunc` are the only bridges. Proof: web-app price is a real Float (`{"price":9.99}`), `just web-app` 23/0; corpus 103/0 | | 11 | [Fibers](language-runtime-database/done/11-fibers.md) | βœ… **landed 2026-08-21** with the arc (`just fibers` 10/0); fs-park re-scoped out of v1, disclosed in the story | -| 22 | [Durability, throughput, scale](language-runtime-database/refine/22-durability-throughput-scale.md) | ⬜ needs a spec first β€” second in chain, after arc stage 3 | +| 22 | [Durability, throughput, scale](language-runtime-database/in-progress/22-durability-throughput-scale.md) | πŸ”„ **spec + plan approved 2026-08-21, executing** β€” db-bench sample + campaign gates; forks settled | | 31 | [Actor lifecycle](language-runtime-database/refine/31-actor-lifecycle.md) | ⬜ needs a spec first β€” third in chain (story written 2026-08-21) | | 24 | [chat: WebSocket workload](language-runtime-database/refine/24-chat-websocket-workload.md) | ⬜ fourth in chain β€” the arc's acceptance; after 31 | | 23 | [io_uring group-commit](language-runtime-database/refine/23-io-uring-commit.md) | ⬜ fifth in chain, after stage 3 + 22 | @@ -253,7 +256,7 @@ that sequences its tasks. Read one, approve, then the next starts. | Track | Item | Where | | -------- | --------------------------------------------------------------------------- | ---------------------------------------------------------- | -| Runtime | nothing active β€” arc stage 3 landed 2026-08-21; next per the chain: iteration 22's spec brainstorm (four forks recorded in its story) | [order](#implementation-order-re-sequenced-2026-08-21--concurrency-chain) | +| Runtime | **iteration 22: db-bench** β€” spec + plan approved 2026-08-21; executing | [marker](../in-progress/2026-08-21-db-bench.md) Β· [plan](../superpowers/plans/2026-08-21-db-bench.md) | The active slice's marker doc lives in [`in-progress/`](../in-progress/) β€” one file, deleted when the slice lands. Everything else pending is the @@ -441,7 +444,8 @@ precedence notes for resumption. database is broken today. Plan of record: [`2026-08-20-shard-fiber-arc.md`](../superpowers/plans/2026-08-20-shard-fiber-arc.md) (stages 1+2 landed 2026-08-20, branch `concurrency-arc`). -2. **22** β€” the measurement backbone: restart-persistence proof + baseline +2. πŸ”„ **22** β€” IN PROGRESS (spec + plan approved 2026-08-21) β€” the + measurement backbone: restart-persistence proof + baseline benchmark (durable + RAM-only), single- AND multi-shard in one campaign, plus the stage-2 mutex-inbox number (rings only if the mutex costs). It has never run β€” no `bench/baseline.json`, no `just db-bench`; diff --git a/docs/stories/language-runtime-database/00-story.md b/docs/stories/language-runtime-database/00-story.md index 7cc8f06..0c1a97d 100644 --- a/docs/stories/language-runtime-database/00-story.md +++ b/docs/stories/language-runtime-database/00-story.md @@ -100,7 +100,7 @@ still pending IS the runtime-concurrency chain; order: | 11 | 15 | [deps: `wo.toml [deps]`](done/15-deps-package-manager.md) | exact-rev git deps + `wo.lock` + `.wo-deps`; flat-only, offline once locked | | 12 | 16 | [web framework](done/16-web-framework.md) | the `.wo` framework v1 (router, middleware, auth, all three body hooks) consumed via `[deps]` | | 13 | 8+11 | [Shard-actor runtime](done/08-shard-actor-runtime.md) Β· [Fibers](done/11-fibers.md) | βœ… **THE ARC LANDED 2026-08-21** β€” stages 1+2 (fibers/budget/actors/io_uring plane; pinned shards, envelope sends, home-routed frees, WO-E222) + stage 3's transparent DB actor: worker statements marshal to shard 0, ack-after-owner-fsync, materialized replies (`just db-actor` 8/0, ASan/TSan, WAL replay pair). fs-park re-scoped out (disclosed in story 11). | -| 14 | 22 | [Durability, throughput, scale](refine/22-durability-throughput-scale.md) | restart-persistence proof, benchmarks, ~1M rows β€” the baseline the arc and 23 sign against. It has never run, so every performance claim on this project is currently unsourced; runs after stage 3 so one campaign covers single- and multi-shard, plus the stage-2 mutex-inbox number. *(was 9e)* | +| 14 | 22 | [Durability, throughput, scale](in-progress/22-durability-throughput-scale.md) | πŸ”„ **spec + plan approved 2026-08-21, executing** β€” db-bench sample (`time.ticks` Β΅s clock, seed/read/query/write/mix/msgrate/verify), campaign gates vs `bench/baseline.json`, restart + kill -9 proofs at both shard counts; the arc's delta and the mutex-inbox number come out of the first run. *(was 9e)* | | 15 | 30 | Observability, CI, fuzz *(no story file yet)* | **NEW** β€” runtime counters + a profiler hook, 22's harness wired to run per change instead of by hand, and a fuzz target on the parser and `.wob` loader. The whole proof-maturity gap had no iteration to point at. | | 16 | 19 | [Float + Bytes](done/19-missing-scalar-types.md) | **LANDED 2026-08-20** β€” `.wob` v5; the full stack: IEEE-quiet f64 through literals/VM/@table/WAL/json + Bytes as the binary carrier, no implicit mixing, total-order indexes. Unblocks 24 (WS frames) and the crypto fork (digests). *(was 20)* | | 17 | 31 | [Actor lifecycle](refine/31-actor-lifecycle.md) | request/response (today `send` is one-way and callers `sleep` to await), bounded mailboxes with backpressure (today the FIFO just grows), actor death/supervision, and timers beyond `time.sleep`. 24 cannot be written honestly without these. *(story written 2026-08-21)* | diff --git a/docs/stories/language-runtime-database/done/07b-inferred-gc-mark-sweep.md b/docs/stories/language-runtime-database/done/07b-inferred-gc-mark-sweep.md index 0209b2b..39da722 100644 --- a/docs/stories/language-runtime-database/done/07b-inferred-gc-mark-sweep.md +++ b/docs/stories/language-runtime-database/done/07b-inferred-gc-mark-sweep.md @@ -97,7 +97,7 @@ status: done - **Gated by the benchmark (2026-08-15):** this is the "implement garbage collection" lever of the performance arc β€” tri-color mark-sweep replacing RC changes the write path's tail latency, so landing it means re-running - iteration [22](../refine/22-durability-throughput-scale.md) and recording the + iteration [22](../in-progress/22-durability-throughput-scale.md) and recording the delta (does tracing help or hurt p99 under write load?). - **Constraint added by the database track (2026-08-15):** a GC-managed value in a `@table` field is a compile error (the engine/heap bulkhead β€” 9b diff --git a/docs/stories/language-runtime-database/done/08-shard-actor-runtime.md b/docs/stories/language-runtime-database/done/08-shard-actor-runtime.md index 1246b5f..438edeb 100644 --- a/docs/stories/language-runtime-database/done/08-shard-actor-runtime.md +++ b/docs/stories/language-runtime-database/done/08-shard-actor-runtime.md @@ -159,7 +159,7 @@ the slice's marker doc when it landed): - The VM's object header has carried a shard id since iteration 2 β€” no relayout. - **Gated by the benchmark:** landing the arc means re-running - [22](../refine/22-durability-throughput-scale.md) at the concurrency + [22](../in-progress/22-durability-throughput-scale.md) at the concurrency scale it unlocks and recording the before/after delta; it is also where [23](../refine/23-io-uring-commit.md) gets a thread to overlap durability against. diff --git a/docs/stories/language-runtime-database/refine/22-durability-throughput-scale.md b/docs/stories/language-runtime-database/in-progress/22-durability-throughput-scale.md similarity index 92% rename from docs/stories/language-runtime-database/refine/22-durability-throughput-scale.md rename to docs/stories/language-runtime-database/in-progress/22-durability-throughput-scale.md index be9a9db..52e02af 100644 --- a/docs/stories/language-runtime-database/refine/22-durability-throughput-scale.md +++ b/docs/stories/language-runtime-database/in-progress/22-durability-throughput-scale.md @@ -1,6 +1,6 @@ --- iteration: "22" -status: refine +status: in-progress chain: 2 --- @@ -16,7 +16,16 @@ chain: 2 > performance work, because each of those must be gated by re-running THIS > iteration's benchmark and showing the number moved the right way. > -> **No spec exists yet.** The forks in *Info* are genuine decisions. +> ~~**No spec exists yet.** The forks in *Info* are genuine decisions.~~ +> +> **SPEC APPROVED 2026-08-21** β€” the four forks below are SETTLED as +> their recorded leanings (developer confirmation), plus two new +> decisions: the vehicle is a NEW sample `docs/examples/db-bench` +> (employee stays a teaching sample) and `time.ticks` (CLOCK_MONOTONIC +> Β΅s) is the iteration's one runtime addition. Spec: +> [`2026-08-21-db-bench-design.md`](../../../superpowers/specs/2026-08-21-db-bench-design.md) +> Β· plan: [`2026-08-21-db-bench.md`](../../../superpowers/plans/2026-08-21-db-bench.md) +> β€” **in progress** (second slice of the chain). > > **RE-SEQUENCED 2026-08-21** (developer decision): runs AFTER the arc's > stage 3 β€” the transparent DB actor is a correctness hole (a multi-shard diff --git a/docs/superpowers/plans/2026-08-21-db-bench.md b/docs/superpowers/plans/2026-08-21-db-bench.md new file mode 100644 index 0000000..b950611 --- /dev/null +++ b/docs/superpowers/plans/2026-08-21-db-bench.md @@ -0,0 +1,224 @@ +# Iteration 22 β€” db-bench: durability proof, throughput, scale (implementation plan) + +> **Status: ready to execute (2026-08-21).** Board: +> [docs/00-status.md](../../stories/00-status.md). + +> **For agentic workers:** REQUIRED SUB-SKILL: Use +> superpowers:subagent-driven-development (recommended) or +> superpowers:executing-plans to implement this plan task-by-task. Steps +> use checkbox (`- [ ]`) syntax for tracking. +> +> **Style rule (user convention):** concept, reason, and required +> behavior in words plus verification commands only β€” no implementation +> or test code blocks; the executor writes the code. + +**Goal:** the measurement backbone β€” a `.wo` benchmark sample, a campaign +driver, a committed baseline contract, and the durability proofs, so +every later optimization signs a measured before/after. + +**Architecture:** four artifacts (spec Β§1): `docs/examples/db-bench` +(load generator, pure `.wo`), `scripts/db-bench.sh` (campaign driver + +gates), `bench/baseline.json` (the contract), `just db-bench` / +`just db-bench-quick`. One runtime addition: the `time.ticks` builtin +(CLOCK_MONOTONIC microseconds) β€” everything else is sample + script. + +**Tech Stack:** `.wo` (generator), bash + python3 (driver/gate β€” the +linkcheck.py precedent), C11 libc-only (one builtin case), OCaml +stdlib-only (one stdlib-table row). + +**Spec:** [`../specs/2026-08-21-db-bench-design.md`](../specs/2026-08-21-db-bench-design.md) +(approved 2026-08-21, normative β€” the four forks + decisions 5/6 live +there). Story: +[`22-durability-throughput-scale.md`](../../stories/language-runtime-database/in-progress/22-durability-throughput-scale.md). + +## Global Constraints + +- Branch `db-bench` off the current arc line; commits local only, never + push. +- Gates that stay green after every task: `just woc-test`, + `just oop-e2e`, `just deps-accept`, `just web-app`, + `just log-watcher`, `just employee`, `just fibers`, `just db-actor`. +- The ONLY runtime change is the `time.ticks` builtin (spec decision 6); + everything else must not touch `runtime/src` or `database/src`. +- `bench/results/` is gitignored; `bench/baseline.json` is tracked and + changes only with a commit that says why. +- The headline numbers come from compiled `.wo` end to end; the C-API + microbench is attribution-only and never gated (spec Β§5). + +--- + +## Task 1 β€” the `time.ticks` builtin (the honest clock) + +**Files:** +- Modify: `runtime/src/wob.h` (new builtin id 84, `WO_B_MAX` bump), + `runtime/src/sysio.c` (the case, beside `WO_B_TIME_SLEEP`), + `compiler/src/types.ml` (the stdlib table row beside + `m "time" "sleep" 1 46`; grep for the sibling tables in `owner.ml`/ + `emit.ml` that list stdlib names and mirror the row wherever `sleep` + appears), `docs/plan/oop-vm/08-builtin-surface.md` + + `docs/plan/oop-vm/07-systems-stdlib.md` (the contract rows). +- Test: a corpus fixture `tests/corpus/run/time-ticks` and one line in + the existing runtime/compiler suites only if their tables enumerate + builtins. + +**Interfaces:** +- Produces: `time.ticks()` β€” zero args, returns Int microseconds from + CLOCK_MONOTONIC (never wall clock: it must be immune to NTP steps; + the difference of two calls is a duration). Later tasks time every + operation with it. + +- [ ] Corpus fixture first: two `time.ticks()` calls around a spin loop; + assert the difference is non-negative and the second call is >= the + first (exact values are machine noise β€” the fixture asserts ordering + and that the builtin exists). Verify it FAILS today (unknown builtin). +- [ ] Wire the id (84), the sysio case (clock_gettime MONOTONIC, + seconds*1e6 + nsec/1e3, as Int), the compiler table rows, the two + contract-doc rows (name, arity 0, return Int Β΅s, monotonic-not-wall + wording). +- [ ] Verify: fixture green under `just oop-e2e`; full battery green. + Commit. + +## Task 2 β€” db-bench sample: tables, serial modes, per-op stats + +**Files:** +- Create: `docs/examples/db-bench/wo.toml`, + `docs/examples/db-bench/types.wo` (the two related tables β€” a parent + with a `@unique` Text column, a child with `ref` parent + two indexed + columns; the employee shape, spec Β§2), + `docs/examples/db-bench/main.wo` (argv mode dispatch, employee's + pattern), `docs/examples/db-bench/README.md` (what each mode measures + and the output-line contract). + +**Interfaces:** +- Consumes: `time.ticks()` from Task 1. +- Produces: modes `seed N`, `read N`, `query N`, `write N`, `verify`; + every measured mode prints exactly one line per operation class in + the spec's contract: ` `. + `verify` recounts, checksums contents, runs one indexed probe, exits + nonzero on mismatch; `seed`/`write` print an acknowledged high-water + line (`acked `) the crash battery reads (spec Β§4). + +- [ ] Tables + `seed`/`verify` first: seed writes N children (parents + amortized 1:100), verify recomputes count + a Int-sum checksum over an + indexed column + probes one known unique parent. Prove the pair by + hand: seed 10k, verify exits 0; corrupt expectation (verify 10k+1) + exits 1. +- [ ] Per-op timing: a fixed-size reservoir (spec Β§2 β€” honest, not + clever) collecting per-op durations from `time.ticks`; p50/p99 by + sorting the reservoir at report time; ops/sec from total ticks. +- [ ] `read`/`query`/`write` modes over a seeded store, each emitting + the contract line; a malformed mode prints usage and exits 2 + (employee's shape). +- [ ] Verify: run all modes by hand single-shard (`WO_SHARDS=1`), lines + parse (field count + numeric), `just` battery untouched. Commit. + +## Task 3 β€” mix + msgrate: the concurrent modes + +**Files:** +- Modify: `docs/examples/db-bench/main.wo` (+ a `types.wo` message + class), README rows. + +**Interfaces:** +- Consumes: Task 2's tables, stats, output contract. +- Produces: `mix N C` β€” C spawned actors each running the 90/10 + read/write mix, N total ops, one contract line for reads and one for + writes plus the `acked` high-water; `msgrate N` β€” two actors + ping-ponging N messages, printing `msgrate `. Under + `WO_SHARDS=1` everything is same-shard (fibers); at default cores + placement spreads the actors and every DB statement rides the stage-3 + RPC β€” no bench code may check the shard count (transparency is the + point). +- No request/response surface exists (iteration 31): main drives + completion the db-actor way β€” actors bump rows a completion `verify` + can count; main sleep-polls the store until the expected count, then + settles. Document that as the coordination idiom this side of 31. + +- [ ] `mix`: prove single-shard first (deterministic-ish, one thread), + then default cores; both emit parseable lines; TSan flavor of the + binary runs one short mix clean. +- [ ] `msgrate`: same proof shape; single- and multi-shard runs both + print (same-heap vs mutex-inbox comparison, spec Β§2). +- [ ] Verify: hand runs at both shard counts + TSan; battery. Commit. + +## Task 4 β€” the campaign driver, gate, and recipes + +**Files:** +- Create: `scripts/db-bench.sh` (driver), `scripts/db-bench-gate.py` + (JSON compare β€” python3, the linkcheck.py precedent), + `bench/baseline.json` (placeholder schema, values filled by Task 5), + `bench/results/.gitignore`. +- Modify: `justfile` (recipes `db-bench`, `db-bench-quick`), + `.gitignore` if bench/results needs a root rule. + +**Interfaces:** +- Consumes: the sample's line contract + `acked` lines. +- Produces: one timestamped JSON per campaign under `bench/results/` + (structure: flavor β†’ shards β†’ mode β†’ {count, ops_sec, p50us, p99us}); + gate exit 0/1 with a per-metric summary tail (value, baseline, delta, + tolerance); the baseline schema: per metric `{value, tolerance_pct, + floor}` (spec fork 2). + +- [ ] Driver: for flavor in ram/durable Γ— shards in 1/default β€” seed, + read, query, write, mix (+ msgrate once per shard count); durable + runs under a temp `WO_DATA`; RSS + fd sampled during mix, failing on + LW_SOAK tolerances (growth > 256 KiB resident or any fd growth). +- [ ] Durability teeth in the driver (spec Β§4): restart proof + (seed β†’ clean stop β†’ rerun `verify`), crash battery (kill -9 + mid-`write` K times per shard count, restart, `verify` against the + last `acked` high-water; K lives in baseline.json). +- [ ] Gate: compares every metric to baseline (relative tolerance + + absolute floor), prints the standup tail, exit nonzero on breach; + `--write-baseline` records a run as the new contract. +- [ ] `db-bench-quick`: seconds-long counts, loose gate (floors only) β€” + the CI-shaped smoke. +- [ ] Verify: quick mode end-to-end green against a freshly written + baseline; battery. Commit. + +## Task 5 β€” the first campaign: baseline, deltas, gate-bites proof + +**Files:** +- Modify: `bench/baseline.json` (the first honest full run's values + + chosen tolerances + floors + K), + `docs/stories/language-runtime-database/done/08-shard-actor-runtime.md` + (the arc's recorded delta: single- vs multi-shard columns), + `docs/examples/db-bench/README.md` (the reference-machine numbers). + +- [ ] Full campaign on this machine; inspect the tail; commit the + baseline with a message that says it IS the first contract. +- [ ] Gate-bites smoke (spec acceptance): doctor a copy of the results + (halve one ops/sec) and run the gate against it β€” must FAIL; then the + real results β€” must PASS. Record the procedure in the README. +- [ ] Copy the arc delta + msgrate numbers into story 8's record and + the mutex-inbox note (arc plan deviation 4 references it). +- [ ] Verify: `just db-bench` exit 0 twice in a row (repeatability); + battery. Commit. + +## Task 6 β€” closeout + +**Files:** +- Modify: story 22 (landing banner, criteria check, frontmatter + `status: done`, file moves refine/β†’done/ with link sweep), the board + (standup entry: implemented/findings/learned/unblocked/next/.dev-ref; + In-progress row; pending list; stories table), `00-story.md` row, + `00-dependency-graph.md` node, the spec's status banner (APPROVED β†’ + landed), `docs/in-progress/` marker deleted. + +- [ ] Docs synced (the standup answers written from the actual numbers); + links verified (the session's link-check loop); frontmatter matches + folders. +- [ ] Full battery + `just db-bench-quick` once more after doc edits. + Commit. + +## Self-review notes + +- Spec coverage: Β§1β†’T4 artifacts + T1 clock; Β§2 modesβ†’T2/T3; Β§3 + campaign+baselineβ†’T4/T5; Β§4 durabilityβ†’T4 driver + T5 run; Β§5 + microbenchβ†’deliberately NOT a task until a regression needs blaming + (YAGNI β€” the spec calls it attribution-only; first need creates it, + recorded here so the omission is a decision, not a gap); Β§6 + acceptanceβ†’T5 (gate-bites, repeatability) + T6. +- The only interface later tasks depend on from T1 is `time.ticks()` + returning Int Β΅s; T2's line contract is quoted verbatim where T4 + parses it. +- No code blocks by user convention; every step names its verification + command or observable. diff --git a/docs/superpowers/specs/2026-08-21-db-bench-design.md b/docs/superpowers/specs/2026-08-21-db-bench-design.md index 004f739..2199a8a 100644 --- a/docs/superpowers/specs/2026-08-21-db-bench-design.md +++ b/docs/superpowers/specs/2026-08-21-db-bench-design.md @@ -1,12 +1,13 @@ # Iteration 22 β€” durability proof, throughput, and scale under load (design) **Date:** 2026-08-21 -**Status:** proposed (story iteration 22) β€” awaiting developer review; the -plan follows approval. Board: [docs/00-status.md](../../stories/00-status.md) +**Status:** βœ… APPROVED 2026-08-21 (developer review) β€” plan ready: +[`2026-08-21-db-bench.md`](../plans/2026-08-21-db-bench.md). +Board: [docs/00-status.md](../../stories/00-status.md) **Scope:** the measurement backbone β€” a benchmark workload in `.wo`, a campaign driver script, a tracked baseline contract, and the durability proofs (restart persistence + crash battery), single- AND multi-shard. -**Relates to:** [story 22](../../stories/language-runtime-database/refine/22-durability-throughput-scale.md) +**Relates to:** [story 22](../../stories/language-runtime-database/in-progress/22-durability-throughput-scale.md) (the four forks settled below), the landed arc ([story 8's guarantee contract](../../stories/language-runtime-database/done/08-shard-actor-runtime.md) β€” the stage-3 delta this iteration records), iteration 23 (the durable