writeonce/docs/stories/language-runtime-database/07-logwatcher-proof.md
shoney.arickathil c0b0dbb846 docs: audit all markdown against the code, fix findings, flatten status folders
- 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>
2026-08-26 19:20:22 +02:00

84 lines
3.8 KiB
Markdown

---
iteration: "7"
status: done
---
# Iteration 7 — log-watcher proof workload
> Format: `product/story-iteration-template`. Part of
> [Story — one language, one runtime, one database, one binary](00-story.md).
## Goals
- The language's driving workload runs for real: the Haxe log-watcher
daemon (~1,200 lines) re-expressed file-for-file in `.wo` at
`docs/examples/log-watcher/`, compiled by `woc`, detecting a silent
death on a live file.
- The README mapping table's "could not express" column is empty — the
systems track's acceptance bar: nothing in a real daemon exceeded the
language.
> **Status: ✅ landed 2026-08-15.** Compile-and-run met 2026-08-14 (zero
> diagnostics, 106 KB standalone binary, all three modes work); the
> executable half landed 2026-08-15 — zero ASan leaks in all three modes,
> SIGTERM ends parked syscalls, fds flat across 200 requests, and the
> `LW_SOAK` gate holds RSS/descriptors flat under sustained load.
> `just log-watcher`: 7 checks, 0 failures. The work is recorded in
> [`plan/compiler/2026-08-14-logwatcher-executable.md`](../../plan/compiler/2026-08-14-logwatcher-executable.md)
> and nothing else blocks this iteration.
## Acceptance Criteria
- What to achieve?
- **Given** the eight-file `.wo` port (logtail, watcher, cron, probes,
supervisor, mcp, tools, main),
- **when** `woc` compiles the sample and the ported fixture groups run,
- **then** compilation is clean and every fixture mirrors its named
Haxe test case with matching behavior.
- What to achieve?
- **Given** the built sample running `watch` against a growing
tempfile,
- **when** the feed ends with an error line and the quiet period
elapses,
- **then** exactly one detection line appends to the JSONL sink —
the original's measured behavior, reproduced.
- What to achieve?
- **Given** the README mapping table,
- **when** the iteration closes,
- **then** every row names its `.hx` sibling and deliberate
divergences, and the could-not-express column is empty.
- What to achieve? *(added 2026-08-14 — compiling is not running)*
- **Given** any of the three modes started under a sanitizer build,
- **when** it is signalled to stop after a soak,
- **then** it exits cleanly on SIGTERM alone, reports zero leaks, and
its resident size and descriptor count are flat across the soak.
## Out Of Scope
- The sqlite-backed minilog tools — expressible when iteration 9's SQL
lands; recorded as scoped-out, not inexpressible.
- New language or stdlib features: a gap found here is a defect report
against iterations 5/6, and this iteration stops until it's resolved.
## Info
- The `.wo` files may be authored docs-first ahead of this iteration
(spec `2026-08-07-logwatcher-sample-and-principles-design.md`); this
iteration is where they must actually compile and run.
- The pure-core discipline (tail state machine, cron math, MCP `handle`
socket-free and clock-injected) is preserved — the original's best
design decision.
## Proposed Solution
- The authoring plan (`docs/superpowers/plans/2026-08-01-log-watcher-sample.md`)
is spent: the `.wo` files exist and compile.
- What remains is
[`plan/compiler/2026-08-14-logwatcher-executable.md`](../../plan/compiler/2026-08-14-logwatcher-executable.md)
— six tasks, every one traced to a measurement on this sample: the ownership
pass learning stdlib return types, dropping a projected temporary, the
runtime's own argv container, honouring the stop signal in blocking calls,
closing accepted connections, and a soak that would have caught all of it.
- `just log-watcher` (`scripts/log-watcher-accept.sh`) is this iteration's gate:
compile, watch alert, cron schedule, and three MCP checks today; the soak
joins it in the last task.