Task 3 of docs/superpowers/plans/2026-08-26-table-residency.md. - NO LAYOUT CHANGE. The plan said to add descriptor fields; the descriptor already had a `flags` u32 with only bit0 used, so both properties ride spare bits (WO_CLASSF_VOLATILE 0x02, WO_CLASSF_RESIDENT_KEYS 0x04). A v7 class record is byte-identical in shape to a v6 one, which is a much smaller and safer change than the plan assumed - both spelled as the NON-default, so a zero flags word means exactly what every pre-v7 image meant: durable, every row resident. A non-@table class has both clear by construction - the loader refuses the meaningless pair (bit1+bit2) independently of woc, on the standing principle that what the loader accepts the interpreter trusts. Verified by FORGING the flags word in an otherwise valid image, since woc will not emit one: flags=6 gives "durable:false with resident:keys", flags=8 still gives "unknown flags" - WOB_VERSION 6 -> 7. Kept because an OLDER runtime reading a v7 image would otherwise treat a volatile table as durable and quietly disagree with its own source. loader.c's check is exact-match, so a v6 image is refused rather than read with the bits clear — verified by patching a v7 header back down to 6 GAP FOUND AND CLOSED: woc ACCEPTED `durable: false, resident: keys`. Task 1's steps covered duplicates and bad values but never the combination, and the plan had only put that refusal in the loader. The spec wants both, so the compiler now refuses it too (WO-E102, checked after the argument list is complete since it is a property of the pair). A compile error is the one a developer can act on. VERSION DRIFT: the constant lives in FOUR places, not one. wob.h, emit.ml:157, disasm.ml:186, and compiler/test/runner.ml:2405 — the last is a deliberately independent reimplementation of the loader battery, and it caught the drift as 14 failures rather than silently passing. Its flags mask and the combination refusal are now in sync too, which is the point of it being independent rather than shared. Gates: woc-test 557/0, 18 runtime suites 0 fail, 18 ISO-flavour suites 0 fail, cli_smoke OK, oop-e2e 118/0, employee 8/0, db-actor 8/0, site 21/0. Zero goldens moved (git diff over golden/ empty). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| 00-wob-format.md | ||
| 01-error-catalog.md | ||
| 02-corpus.md | ||
| 03-concurrency-coroutines.md | ||
| 04-db-binding.md | ||
| 08-builtin-surface.md | ||
| README.md | ||
docs/plan/oop-vm/ — OOP + systems track contracts
The normative contract documents both stacks cite. Landed by their named plan tasks:
| doc | contract | plan |
|---|---|---|
00-wob-format.md |
.wob bytecode format (compiler↔VM) |
1 |
01-error-catalog.md |
every WO-E### code |
2, grows 3/8 |
02-corpus.md |
how to add conformance fixtures | 3 |
03-concurrency-coroutines.md |
stackless fibers, park/resume protocols, reduction budget, the no-async rule |
arc (was plan 4's slot; that plan ✖ discarded 2026-08-21) |
04-db-binding.md |
row format, WAL records, query subset | 5 |
05-http-service.md |
route section, trap→HTTP table, JSON subset | 6 |
06-ui-live.md |
delta frames, subscribe protocol, wo:live | 7 |
07-systems-stdlib.md |
per-function nil-vs-trap contracts | 9 |
08-builtin-surface.md |
builtin source names, container/call/entry rules the emitter enforces | 3 |
Specs and plans: docs/superpowers/{specs,plans}/. Repo map: docs/08-project-structure.md.