writeonce/docs/active-slice-2026-08-23-chat-ws-lifecycle.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

60 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
slice: "24" # the story that owns the status; see stories/24-chat-websocket-workload.md
status: in-progress
---
# Active slice — chat + actor lifecycle (iteration 24, absorbing 31 + 34)
Branch `chat-ws-lifecycle`. Spec:
[`superpowers/specs/2026-08-23-chat-websocket-actor-lifecycle-design.md`](superpowers/specs/2026-08-23-chat-websocket-actor-lifecycle-design.md)
· plan:
[`superpowers/plans/2026-08-23-chat-ws-lifecycle.md`](superpowers/plans/2026-08-23-chat-ws-lifecycle.md)
· board: [`stories/00-status.md`](stories/00-status.md).
## Progress (2026-08-23)
- ✅ **T1 crypto** (`d14fa9f`): sha1/sha256/hmac_sha256, ids 85–87, RFC
vectors 18/0, corpus pin. Story 34's C-builtin resolution delivered.
- ✅ **T2 bounded mailboxes** (`92754a8`): cap 1024 + `WO_MAILBOX`,
sender-side atomic reserve, WO_T_ACTOR (trap 13) catchable. Plus a
pre-existing compiler fix: try-arm Text places (bare `e.msg`) now
copy before the arm's scope dies (was ASan use-after-free + SEGV).
- ✅ **T6 WS upgrade** (`79cfa01`): `ws_accept` + accept-key + the
101 hijack sentinel; plain HTTP byte-identical (web-app 26/26).
- ✅ **T7 frame codec** (`7ad2ced`): pure-`.wo` RFC 6455 parse/serialize,
probe-verified against the RFC's own bytes.
- ✅ **T3 call/reply** (`ed69841`): `call` parks + typed scalar reply
(WO-E226 through actor-M erasure); actor DEATH landed with it —
callers never hang (mid-call + to-dead both trap catchably). Fixed
TRAPF's fiber-death leak/dangle en route.
Every landed task: full battery 12/12, fresh-built.
## Pending
- ⬜ **T4 monitor(watched, observer, msg)** — id 89. Most of the death
machinery exists (`actor_die`); T4 adds the per-actor monitor list,
the death walk delivering the observer's own M-typed notice,
monitor-of-already-dead firing immediately, full-observer notice =
disclosed stderr drop. Three-argument form (spec deviation, disclosed
in the plan: the caller may be `main`, which has no mailbox).
- ⬜ **T5 time.after(ms, addr, msg)** — id 90, one-shot, no cancel;
rides the T4 deadline plumbing; delivery = runtime send (full = drop
+ stderr line, dead = silent). Corpus: timer-delivery,
timer-generation (the cancel idiom). Both WO_IO backends.
- ⬜ **T8 chat sample** — docs/examples/chat: registry (`call`'s first
consumer), room actors (cap-trap drops slow members, `monitor` reaps
dead writers), reader/writer actor pair per connection over
ws_accept/wsframe; SIGTERM close choreography.
- ⬜ **T9 chat gate** — scripts/chat-accept.sh + raw-RFC6455 python
client; the spec's five checks (functional cross-shard — also the
deferred cross-shard `call` proof — handshake vector, 1k soak with a
`WO_MAILBOX=8` sub-run, drain under both backends + ASan, battery).
- ⬜ **T10 closeout** — stories 24/31/34 → done/ with banners (note the
scalar-reply v1 narrowing + three-argument monitor deviations), board
standup entry, graph nodes, framework README ledger rows, runtime +
chat CODE-LOGIC sections, delete this marker. Final battery.
This file is deleted when the slice lands (board convention). It lives flat in
`docs/` rather than a status folder — since 2026-08-26 no directory in this repo
encodes state; `status:` above is the only place it is recorded.