- README: shipped concurrency/HTTP/WebSockets sat in the roadmap as "not yet available"; "no package manager" contradicted [deps]; the deps example would not have compiled (the key IS the module name) - runtime/README: leads with wovm, wo-rt.c demoted to a historical section; dropped 2 nonexistent recipes, crates/rt, @gc refcounting, 13 suites -> 18 - employee + log-watcher READMEs claimed "does not compile"; both are gates - error catalog: +10 emitted codes incl WO-E250, the only diagnostic the shipped query surface raises; recorded why the sweep rotted - language-surface: group-by parses, then the typechecker refuses it - 00-code-review + 00-link-audit re-run; history kept, not rewritten - 48 dead Rust-era exploration links de-linked rather than re-pointed (their prose names the retired plan by number); successor map -> discarded.md - 08-project-structure: compiler/plan/ never existed; corpus has 9 dirs, 5 empty - releasing.md: dropped a --draft step the workflow never had - new docs/00-doc-audit.md: findings + disposition, incl one row where the audit was wrong and the doc it accused was right - status folders removed: 34 stories flat, status only in frontmatter; 252 links recomputed from resolved paths; board/board-views/structure retaught - story 24 -> in-progress, since frontmatter is now the only truth - new iteration 38: fs mutation verbs + net.connect, the two capability families no iteration owned - new iteration 39: gofiber/fiber v3.5.0 parity study. The ledger called CSRF/sessions unblocked by iteration 34's HMAC, but the runtime has no source of randomness at all - linkcheck skips .dev/.superpowers: 0 broken paths, 0 bad anchors Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
34 lines
2.3 KiB
Markdown
34 lines
2.3 KiB
Markdown
# employee — the database track's acceptance workload
|
||
|
||
> **Status: shipped — this is the database track's acceptance gate.** Run it
|
||
> with `just employee`. The sample was written *ahead of* the features it
|
||
> exercises, exactly as log-watcher was written ahead of iterations 5–7: the
|
||
> sample is the test, and the plans compiled toward it. Both landed — iteration
|
||
> 9 (engine: [`2026-08-01-db-engine-binding.md`](../../superpowers/plans/2026-08-01-db-engine-binding.md))
|
||
> and iteration 9b (query surface:
|
||
> [`2026-08-15-employee-relations-query.md`](../../plan/compiler/2026-08-15-employee-relations-query.md)).
|
||
> Normative semantics:
|
||
> [the 9b spec](../../superpowers/specs/2026-08-15-table-relations-query-design.md).
|
||
> One clause below is still ahead of the compiler and marked where it appears:
|
||
> `group … by … into` parses and is then refused by the typechecker.
|
||
|
||
Two `@table` classes and every 9b feature load-bearing:
|
||
|
||
| Mode | What it proves |
|
||
| --- | --- |
|
||
| `employee seed` | `insert` + WAL-before-ack; a second run catches the `departments.name` `@unique` trap (`SEED-DUP`, exit 3) |
|
||
| `employee report` | `group … by … into g` lowered as one hash pass; `count`/`avg`/`min`/`max` per department; `order by avg(g.salary) desc`; whole-query `sum` for payroll |
|
||
| `employee staff <dept>` | unique-name **index probe** (asserted via the engine's probe counter, not assumed), `backlink` scan one way, `e.dept.name` ref navigation the other |
|
||
| `employee raise <dept> <pct>` | update through a query result; a missing department takes the empty-query path |
|
||
| `employee drop <dept>` | delete **restrict**: a department with staff traps (exit 4); the trap code is the acceptance's assertion |
|
||
|
||
The engine lives in `database/` (statically linked into `wovm` — still one
|
||
binary). Rows are RAM-authoritative, WAL-durable; a kill -9 between `seed`
|
||
and `report` followed by an identical `report` is part of the acceptance
|
||
script (iteration 9's replay, proven on this workload).
|
||
|
||
Data shape: `Department { name @unique, staff: backlink Employee.dept }`,
|
||
`Employee { name, salary (cents), hired (epoch ms), dept: ref Department }`,
|
||
indexes `[name]`, `[dept]`, `[dept, salary]`. Salaries wrap like all language
|
||
arithmetic; `avg`/`min`/`max` are `?Int` because an empty group is data, not
|
||
a fault.
|