docs: goal shift — log-watcher (met) to web framework as library

- NEXT PLAN rewritten: iteration 17 is the goal slice (merge branch, spec/
  plan, kind = "library", internal/ WO-E1xx, framework reorg, gate list)
- previous NEXT PLAN retitled "Landed 2026-08-15 — the executable milestone";
  all six measured items were already done, board rows were stale
- board row 7: in-progress -> landed 2026-08-15 (ASan-clean, SIGTERM, fd-flat,
  soak, just log-watcher 7/0); iteration 07 story banner updated to match
  its plan doc's done banner
- in-progress table now carries iteration 17 spec/plan
- implementation order re-sequenced for framework goal: 17, 9c/9d, 9e, 8,
  9f, 11 (+ h2c unparks), 10, 12, then 14/9g demoted (skillhost no longer
  the driving workload), 13 + parked drain last
- story notes record the shift and the new order

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
shoney.arickathil 2026-08-20 02:04:41 +02:00
parent f59f4e3131
commit b32e8a5073
3 changed files with 93 additions and 59 deletions

View file

@ -19,15 +19,44 @@ Statuses: ✅ **done** · 🔄 **in progress** · ⬜ **pending** · ⏸ **hold*
## ▶ NEXT PLAN ## ▶ NEXT PLAN
**Make log-watcher executable — nothing else.** The compile-and-run half of the **The web framework becomes a first-class library — iteration 17.** The goal
language track is met (2026-08-14): the sample compiles with zero diagnostics, shifted 2026-08-20: the previous NEXT PLAN ("make log-watcher executable —
`woc build` produces a 106 KB standalone binary, and all three modes work — nothing else") was met in full 2026-08-15 (milestone record below), and the
`watch` alerts on a live file, `run` schedules a cron.d entry, `mcp` answers driving workload is now `docs/examples/writeonce-framework` consumed by
JSON-RPC with all four tools returning `isError:false`. `just log-watcher` `docs/examples/web-app` through `[deps]`. Iteration 17's forks are settled
gates it: 6 checks, 0 failures. (decisions + framework/compiler/VM/GC impact in
[the iteration](stories/language-runtime-database/17-library-projects-internal.md));
what remains, in order:
What is left is the difference between "it runs" and "you can leave it 1. Merge the `web-framework` branch to master (iterations 15–17 docs + code,
running", and every item below came from a measurement on the sample itself: local only).
2. Spec + plan from the settled decisions (prose only, per convention).
3. `kind = "library"` in `wo.toml` (default `"program"`): `woc <dir>` on a
library runs the FULL pipeline as a check — parse, typecheck, borrow
check, GC inference — with no entry required; an explicit build still
works when a `main` exists (dual lib+bin).
4. The `internal/` rule at the `[deps]` boundary: a consumer `use` of a dep
path containing the segment `internal` is a new WO-E1xx at the `use`,
naming the dependency; inside the dep it stays legal.
5. Framework reorg: request-parser and serve-loop plumbing move under
`internal/`; the public surface (`Handler`, `Middleware`, `App`,
`Req`/`Resp`, builders) does not move.
6. Gate: `just web-app` stays 14/0, plus new checks — library check without
an entry succeeds, a consumer `internal` import is refused, and the
iteration-16 `--emit` verification workaround is deleted.
The VM and GC are untouched by design — visibility is compile-time name
resolution, libraries compile whole-program into the consumer's image, and
GC inference stays whole-program (app usage may promote dep classes; that is
intended).
---
### Landed 2026-08-15 — the executable milestone (the previous NEXT PLAN)
"Make log-watcher executable" — the difference between "it runs" and "you
can leave it running". Every item came from a measurement on the sample
itself, and all six landed:
1. ~~The ownership pass does not know what the stdlib returns~~ — **done 1. ~~The ownership pass does not know what the stdlib returns~~ — **done
2026-08-14**. The root cause was deeper than the table: `Text` was 2026-08-14**. The root cause was deeper than the table: `Text` was
@ -93,10 +122,12 @@ Story slice: [`docs/stories/language-runtime-database/07-logwatcher-proof.md`](s
- Iterations 8–12 (shard-actor runtime, database engine, `@table`/query, HTTP - Iterations 8–12 (shard-actor runtime, database engine, `@table`/query, HTTP
layer, fibers, blue-green): unchanged, and unblocked by this plan. layer, fibers, blue-green): unchanged, and unblocked by this plan.
The project is the **language track**: iterations 3 → 4 → 5 → 6 → 7, ending at The **language track**'s first goal — iterations 3 → 4 → 5 → 6 → 7, _compile
_compile and run log-watcher_, then the database engine (9/9b) and beyond. (The and run log-watcher_ — is met; the database engine (9/9b), deps (15), and the
prior Rust `wo` runtime was removed from the repo 2026-08-18 — see web framework (16) landed on top of it. The goal is now the framework line:
[`discarded.md`](plan/discarded.md).) iteration 17 first, then the runtime iterations that mature it (see
"Implementation order" under Pending). (The prior Rust `wo` runtime was
removed from the repo 2026-08-18 — see [`discarded.md`](plan/discarded.md).)
--- ---
@ -115,7 +146,7 @@ that sequences its tasks. Read one, approve, then the next starts.
| 4 | [Single binary end-to-end](stories/language-runtime-database/04-single-binary-e2e.md) | ✅ (known gaps below) | | 4 | [Single binary end-to-end](stories/language-runtime-database/04-single-binary-e2e.md) | ✅ (known gaps below) |
| 5 | [Language surface](stories/language-runtime-database/05-language-surface.md) | 🔄 grammar done; **`?T` forced handling ✅ + reject rows ✅ + WO-E205 ✅ (2026-08-18)**; `pub(read)`/`using`/`#if` still ⏸ | | 5 | [Language surface](stories/language-runtime-database/05-language-surface.md) | 🔄 grammar done; **`?T` forced handling ✅ + reject rows ✅ + WO-E205 ✅ (2026-08-18)**; `pub(read)`/`using`/`#if` still ⏸ |
| 6 | [Program mode + stdlib](stories/language-runtime-database/06-program-mode-stdlib.md) | ✅ (the surface log-watcher uses) | | 6 | [Program mode + stdlib](stories/language-runtime-database/06-program-mode-stdlib.md) | ✅ (the surface log-watcher uses) |
| 7 | [log-watcher proof](stories/language-runtime-database/07-logwatcher-proof.md) | 🔄 **runs; executable in progress** | | 7 | [log-watcher proof](stories/language-runtime-database/07-logwatcher-proof.md) | ✅ **landed 2026-08-15** — executable, not merely compilable: zero ASan leaks in all three modes, SIGTERM ends parked syscalls, fds flat, `LW_SOAK` gate; `just log-watcher` 7/0 |
| 7b | [Inferred GC + mark-sweep](stories/language-runtime-database/07b-inferred-gc-mark-sweep.md) | ✅ **landed 2026-08-18** — `@gc` gone (WO-E104), GC-ness inferred, RC replaced by incremental mark-sweep, `.wob` v4; supersedes iteration 2's RC memory model | | 7b | [Inferred GC + mark-sweep](stories/language-runtime-database/07b-inferred-gc-mark-sweep.md) | ✅ **landed 2026-08-18** — `@gc` gone (WO-E104), GC-ness inferred, RC replaced by incremental mark-sweep, `.wob` v4; supersedes iteration 2's RC memory model |
| 8 | [Shard-actor runtime](stories/language-runtime-database/08-shard-actor-runtime.md) | ⬜ | | 8 | [Shard-actor runtime](stories/language-runtime-database/08-shard-actor-runtime.md) | ⬜ |
| 9 | [Database engine](stories/language-runtime-database/09-database-engine.md) | 🔄 engine complete (storage/WAL/indexes/insert-update-delete); reads land with 9b | | 9 | [Database engine](stories/language-runtime-database/09-database-engine.md) | 🔄 engine complete (storage/WAL/indexes/insert-update-delete); reads land with 9b |
@ -140,9 +171,10 @@ that sequences its tasks. Read one, approve, then the next starts.
| Track | Item | Where | | Track | Item | Where |
| -------- | --------------------------------------------------------------------------- | ---------------------------------------------------------- | | -------- | --------------------------------------------------------------------------- | ---------------------------------------------------------- |
| Language | Iteration 7 — make log-watcher executable (leaks, stop signal, fd lifetime, soak) | [executable plan](plan/compiler/2026-08-14-logwatcher-executable.md) | | Language | Iteration 17 — web framework as first-class library: spec/plan from the settled forks, then `kind = "library"` + `internal/` + framework reorg | [iteration 17](stories/language-runtime-database/17-library-projects-internal.md) |
Off-critical-path work is parked by explicit scope directive (2026-08-08). Off-goal work is parked; the goal shifted 2026-08-20 from log-watcher (met)
to the web framework as a first-class library.
### Landed 2026-08-14 — the compile-and-run milestone ### Landed 2026-08-14 — the compile-and-run milestone
@ -305,40 +337,42 @@ The C proving-ground work (`exploration/c-runtime/`, phases A–F: 859k reads/s,
## Pending ## Pending
### Implementation order (sequenced 2026-08-20) ### Implementation order (re-sequenced 2026-08-20 — framework goal)
Dependency-derived order for everything not yet landed. Rules that force it: The goal is the web framework as a first-class library, so the framework
9f explicitly after 8 + 9e; 9c "precedes iteration 10"; 9d's plan folds into line leads and the workload-driven extras (14, 9g) demote behind it.
9c's; 12 only after 9 + 10 (catalog to diff, HTTP to build on); 11 rides 8's Dependency rules that force the shape: 9f explicitly after 8 + 9e; 9c
shard scheduler; h2c parked behind 8/9f/11; the post-12 parked list stays "precedes iteration 10"; 9d's plan folds into 9c's; 12 only after 9 + 10
parked by the 2026-08-08 scope directive. (catalog to diff, HTTP to build on); 11 rides 8's shard scheduler; h2c
parked behind 8/9f/11; the post-12 parked list stays parked by the
2026-08-08 scope directive. (Iteration 7 dropped from this list — landed
2026-08-15.)
1. **7 finish** — in progress (executable plan: leaks, stop signal, fd 1. **17** — THE goal slice: `kind = "library"` + `internal/` + framework
lifetime, soak); the locked critical path ends here. reorg; forks settled, compiler-driver-only, no runtime deps. Merge the
2. **17** — forks settled, compiler-driver-only, no runtime deps; kills the `web-framework` branch first.
framework's `--emit` wart while iteration 16 is fresh. (Merge the 2. **9c then 9d** — finish the half-done branches (ipc-attach: manifest +
`web-framework` branch first.) binding; keypair-auth: manifest) before they rot; 9d folds into 9c's
3. **9g** — likely collapses to "confirm `len(query)` + add `exists`"; the plan; both must precede 10.
skillhost corpus already showed no new grammar; do before 14 consumes it. 3. **9e** — the measurement backbone; baseline single-shard BEFORE the
4. **14** — skillhost port, the next driving workload (log-watcher's role for runtime restructure so 8/9f/11 sign against real numbers.
host capabilities); stdlib-shaped, independent of shards; 4. **8** — shard-actor; the framework's multi-core serving story; unblocks
bounded-subprocess gap first. 9f, 11, h2c.
5. **9c then 9d** — finish the half-done branches (ipc-attach: manifest + 5. **9f** — io_uring group-commit; explicitly after 8 + 9e.
binding; keypair-auth: manifest) while DB context is warm; 9d folds into 6. **11** — fibers; retires the framework's disclosed keep-alive limit (an
9c's plan; both must precede 10. idle connection starving accept forced close-when-idle in iteration 16 —
6. **9e** — the measurement backbone; baseline single-shard BEFORE the parked fds fix it properly); with 8 + 9f done, **h2c unparks** (spec §C)
runtime restructure so 8/9f have numbers to sign against. as the framework's HTTP/2 slice.
7. **8** — shard-actor; the big structural move; precondition (collector 7. **10** — HTTP service layer; after 9c by its own precedence note;
settled, 7b) already met; unblocks 9f, 11, h2c. `service` blocks lower onto the framework instead of a parallel stack.
8. **9f** — io_uring group-commit; explicitly after 8 + 9e. 8. **12** — blue-green; prerequisites 9 + 10 now exist; completes the
9. **11** — fibers on the shard scheduler; keeps VM-core work contiguous framework's deploy story.
with 8/9f (same dispatch/io seams). 9. **14 and 9g** — demoted with the goal shift: skillhost is no longer the
10. **10** — HTTP service layer; after 9c by its own precedence note; driving workload; 9g likely collapses to "confirm `len(query)` + add
lowers `service` blocks onto the iteration-16 framework. `exists`" and precedes 14 when they run.
11. **12** — blue-green; prerequisites 9 + 10 now exist. 10. **13 + parked drain** — metaprogramming (spec first), then group-by,
12. **13 + parked drain** — metaprogramming (spec first), then h2c, `pub(read)`/`using`/`#if`, ADT roster, WO-E225 — held behind 12 by the
group-by, `pub(read)`/`using`/`#if`, ADT roster, WO-E225 — all held scope directive.
behind 12 by the scope directive.
### Language track — sequenced, on the critical path ### Language track — sequenced, on the critical path

View file

@ -89,10 +89,12 @@ list, and a pointer to the plan document that already sequences its tasks.
- **Critical path (locked 2026-08-08): compile and run log-watcher.** - **Critical path (locked 2026-08-08): compile and run log-watcher.**
Iterations 3 → 4 → 5 → 6 → 7 are the committed line; nothing off that Iterations 3 → 4 → 5 → 6 → 7 are the committed line; nothing off that
line lands before iteration 7's acceptance. Then 7b, then 8–12 (with 9b after the database engine). line lands before iteration 7's acceptance. Then 7b, then 8–12 (with 9b after the database engine).
- **Implementation order re-sequenced 2026-08-20** for everything still - **Goal shifted 2026-08-20: log-watcher (iteration 7, landed 2026-08-15)
pending: 7-finish → 17 → 9g → 14 → 9c/9d → 9e → 8 → 9f → 11 → 10 → 12 → to the web framework as a first-class library.** Implementation order for
13 + parked drain. Rationale and forcing dependencies live in everything still pending: 17 → 9c/9d → 9e → 8 → 9f → 11 (+ h2c unparks) →
[`docs/00-status.md`](../../00-status.md) under "Implementation order". 10 → 12 → 14/9g → 13 + parked drain. Rationale and forcing dependencies
live in [`docs/00-status.md`](../../00-status.md) under "Implementation
order".
- **Iteration 7b (inserted 2026-08-11)** sits after the critical path - **Iteration 7b (inserted 2026-08-11)** sits after the critical path
deliberately: it delays nothing on the log-watcher line, and it must precede deliberately: it delays nothing on the log-watcher line, and it must precede
iteration 8 because the collector should be settled before shards multiply. iteration 8 because the collector should be settled before shards multiply.

View file

@ -13,14 +13,12 @@
systems track's acceptance bar: nothing in a real daemon exceeded the systems track's acceptance bar: nothing in a real daemon exceeded the
language. language.
> **Status (2026-08-14):** the compile-and-run half is **met** — the sample > **Status: ✅ landed 2026-08-15.** Compile-and-run met 2026-08-14 (zero
> compiles with zero diagnostics, `woc build` produces a 106 KB standalone > diagnostics, 106 KB standalone binary, all three modes work); the
> binary, and all three modes work (`watch` alerts, `run` schedules a cron.d > executable half landed 2026-08-15 — zero ASan leaks in all three modes,
> entry, `mcp` answers JSON-RPC with all four tools returning `isError:false`). > SIGTERM ends parked syscalls, fds flat across 200 requests, and the
> The remaining half is **executable**: under ASan both long-running modes leak > `LW_SOAK` gate holds RSS/descriptors flat under sustained load.
> (watch 128 B, run >1 MB in eight seconds), the MCP server never closes an > `just log-watcher`: 7 checks, 0 failures. The work is recorded in
> accepted connection, and a server parked in `accept` ignores SIGTERM. That
> work is sequenced in
> [`plan/compiler/2026-08-14-logwatcher-executable.md`](../../plan/compiler/2026-08-14-logwatcher-executable.md) > [`plan/compiler/2026-08-14-logwatcher-executable.md`](../../plan/compiler/2026-08-14-logwatcher-executable.md)
> and nothing else blocks this iteration. > and nothing else blocks this iteration.