- Float full stack: literals (fraction/exponent; `0..10` still a range), f64
opcodes 34-41, @table column, WAL bit-exact replay, json fractions in and
shortest-round-trip out. IEEE-quiet — FDIV never traps where DIV does.
- Bytes: a wo_str with its own class id, so alloc/free/copy are shared but no
Text builtin accepts one; len/at/slice/eq/concat, base64 both ways, json
boundary as base64; TEXT_COPY preserves the kind.
- No implicit Int/Float mixing (WO-E201 in the typechecker, not the emitter,
which picks the opcode from one side and would misread the other).
- One IEEE deviation: float_cmp total order (NaN last, -0.0 == +0.0) for
indexes and order-by, keys canonicalized to match. `?Float` nil is a
reserved quiet NaN — the zero word is +0.0, WO_NIL_SCALAR's bits are -2.0.
- Renderer prefers fixed over exponential in 1e-6..1e21: pure shortest makes
a price of 900.0 read `9e+02`. One renderer for interp/json/float_to_text.
- Fixed en route: lexer double-counted the leading digit; is_scalar_shaped
took Float/Bytes as Int-shaped; Bytes ownership needed a shared heap-scalar
predicate or temps never dropped; order-by bit-compared negatives backwards.
- Iteration 17: `kind = "library"` (absent = program; bad value = WO-E109),
entry-less check mode retiring the `--emit` workaround, Go's `internal/` as
WO-E108 at the consumer's `use`. Driver-only; VM/.wob/GC untouched.
- Framework reorg: internal/{parse,serve}.wo; http/form.wo split out to keep
media_type/form_values public (parse.wo had grown public surface).
- Docs: link audit (97 -> 88 broken, conflict markers resolved, 2 duplicate
stories removed), 00-code-review verified 26/27, iterations re-sequenced.
- Also carries the pre-staged pub(read)/using/#if work from the index.
- Gates: corpus 103/0, test_wal 156/0, web-app 26/0, oop-accept ALL MET.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
8.3 KiB
Markdown link audit — 2026-08-20
Scope: every *.md in the repo (.git excluded).
External URLs were not fetched (no network verification performed).
| files | relative links | broken paths | bad anchors | |
|---|---|---|---|---|
| first scan | 207 | 574 | 97 | 0 |
| after section A fixes | 206 | 569 | 88 | 0 |
Section A is repaired and verified. Sections B–F are pre-existing rot and still open — every one of the remaining 88 lives there.
Re-check with just linkcheck.
Tool: linkcheck.py — walks the tree, strips fenced/inline code, extracts inline
links and reference definitions, resolves each relative target, and validates
#fragment against GitHub-style heading slugs of the target file.
A. Regressions from the in-flight renumber — FIXED 2026-08-20
All nine broke because files moved in the working tree; each had a known successor. Repaired:
| Source | Was | Now |
|---|---|---|
docs/00-status.md:167 |
stories/language-runtime-database/05-language-surface.md |
…/done/05-language-surface.md |
docs/00-status.md:187 |
stories/language-runtime-database/18-memory-db-features.md |
…/hold/18-memory-db-features.md |
docs/stories/language-runtime-database/00-story.md:60 |
05-language-surface.md |
done/05-language-surface.md |
docs/stories/language-runtime-database/00-story.md:69 |
18-memory-db-features.md |
hold/18-memory-db-features.md |
docs/stories/language-runtime-database/25-http-service.md:4 |
../00-story.md |
00-story.md |
docs/stories/language-runtime-database/26-blue-green-deploy.md:4 |
../00-story.md |
00-story.md |
.../refine/08-shard-actor-runtime.md:98 |
../hold/09e-durability-throughput-scale.md |
22-durability-throughput-scale.md |
.../refine/08-shard-actor-runtime.md:100 |
09f-io-uring-commit.md |
23-io-uring-commit.md |
.../refine/20-cross-program-tables.md:143 |
../hold/09d-keypair-attach-auth.md |
21-keypair-attach-auth.md |
The 25/26 pair used ../00-story.md while 00-story.md is a sibling — the
refine/-relative form pasted into files one level up.
Link labels were renumbered with their targets, since the old IDs contradicted
the new paths: 9e→22 and 9f→23 in refine/08 (both the "Gated by the
benchmark" note and settled decision 4, "Order: 22 → the 8+11 arc → 23").
B. Dead era: the old flat docs/plan/NN-*.md numbering (48 links)
docs/plan/ now holds only compiler/, exploration/, oop-vm/,
discarded.md, learnings.md. Every flat-numbered plan doc is gone, and no
successor path was recorded. Missing targets, by inbound count:
09-concurrency-scaleout.md— 1211-wal-and-recovery.md— 912-engine-disk-cutover.md— 810-storage-foundations.md— 8done/02-event-loop-epoll.md— 413-class-model-live-pricing.md— 307-inotify-content-watcher.md— 308-sendfile-static-assets.md— 215-mcp-streamable-http.md,16-postgres-mirror.md,done/03-hand-rolled-http.md,done/04-cutover-remove-tokio-axum.md— 1 each
Inbound from: all of docs/plan/exploration/{linux,postgresql,c-runtime,assembly}/,
plus docs/00-principles.md:57,77,78, runtime/README.md:47,
.dev/reference/README.md:55,56,58.
Decision needed — these exploration docs still cite a plan structure that no
longer exists. Either map each to its story successor
(e.g. concurrency-scaleout → stories/.../refine/08-shard-actor-runtime.md,
wal/storage → refine/22-durability-throughput-scale.md,
io_uring → refine/23-io-uring-commit.md) or strip the links and keep prose.
C. Dead era: the docs/runtime/database/ tree (7 links)
docs/runtime/ does not exist. Missing targets:
03-inmemory-engine.md— 5 (incl. one#recoveryanchor)02-wo-language.md— 2 (incl. one#concurrency-modelanchor)07-wo-seg-migration.md— 1
Inbound from docs/plan/exploration/linux/{07-io_uring,08-mmap,11-memfd_create}.md,
docs/plan/exploration/{assembly/02-writeonce-stance,c-runtime/02-single-binary}.md,
runtime/README.md:43, .dev/reference/README.md:31.
D. Never-created / removed siblings (5 links)
| Source | Target | Note |
|---|---|---|
docs/plan/exploration/linux/06-sendfile.md:10 |
./07-splice.md |
slot 07 is 07-io_uring.md; no splice doc was written |
docs/plan/exploration/assembly/00-overview.md:19 |
../../../.dev/reference/go/src/runtime/atomic_amd64.s |
wrong depth and file absent from the vendored Go tree |
docs/00-principles.md:87 |
examples/blog/README.md |
docs/examples/blog/ never existed |
.dev/reference/rest/README.md:76 |
../../docs/examples/blog/README.md |
same missing example |
.dev/reference/README.md:41,59 |
../docs/plan/exploration/colibri/00-colibri-and-mixtral.md |
exploration/colibri/ absent (2 links) |
E. prototypes/ tree gone (4 links)
prototypes/ is not in the repo. Referenced as prototypes/wo-db/ from
docs/plan/exploration/c-runtime/00-plan.md:88, 02-single-binary.md:83,
runtime/README.md:5, and prototypes/llama-moe-stream from
.dev/reference/README.md:59.
F. Vendored skill copies — not ours to fix (13 links)
.dev/skills/ holds flattened copies of plugin skills. The originals ship as
directories with sibling reference files; flattening dropped them.
.dev/skills/context-mode/context-mode.md:297-300→./references/{patterns-javascript,patterns-python,patterns-shell,anti-patterns}.md.dev/skills/superpowers/requesting-code-review.md:34,95→code-reviewer.md.dev/skills/superpowers/subagent-driven-development.md:232,300,345,400,410→implementer-prompt.md,task-reviewer-prompt.md,re-review-prompt.md(×2),../requesting-code-review/code-reviewer.md.dev/skills/superpowers/test-driven-development.md:206→writing-good-tests.md.dev/skills/superpowers/writing-skills.md:12,587→../using-superpowers/references/{codex,gemini}-tools.md,testing-skills-with-subagents.md
Leave as-is, or re-vendor the skills with their references/ subdirectories.
Structural problems found alongside the links
-
Iteration 19 was double-booked — RESOLVED.
refine/19-chat-websocket-workload.mdandrefine/24-chat-websocket-workload.mdwere the same document, differing only in the# Iteration NNheading, while19-missing-scalar-types.mdalso claimed 19.00-story.md's mapping line (24←19(chat)) and table row 20 make 24 canonical, so the 19 copy was deleted.refine/11-fibers.md:13had been pointing at the 19 copy — repointed to 24 first, so the delete broke nothing. Prose inrefine/08that named "iteration 19" for chat now says 24 (4 places). -
08-shard-actor-runtime.mdexisted twice — RESOLVED. 58 lines at the stories root vs 110 inrefine/. Therefine/copy supersedes it outright: same acceptance criteria plus the 2026-08-20 settled decisions, the inferred-GC restatement (7b retired@gc, which the root copy still required), and the corrected substrate path (the root copy citedruntime/wo-rt.c, removed with the Rust runtime). Root copy deleted; the one inbound link,docs/00-status.md:171, now points atrefine/. Six other referrers already did. -
Unresolved merge-conflict markers were committed into
refine/20-cross-program-tables.md:139-145— `<<<<<<<< HEAD:… / ======== /language-surface-strictness:…/hold/09c-cross-program-tables.md
, from a rename-conflicted merge. This is what produced that file's broken09dlink: the stale side was still in the file. Resolved in favour of HEAD (the renumbered21text).grepconfirms no other conflict markers underdocs/`.
Still open
- Sections B–F above: 88 broken links, all pre-existing.
docs/plan/discarded.mdanddocs/plan/learnings.mdare the only survivors of the old flat plan layout, which is why B and C have no successor map. A rename table in one of them would let the exploration docs be repaired mechanically rather than by guesswork.docs/00-status.md:171still shows iteration 8 as ⬜ while00-story.md:68records arc stages 1+2 as landed 2026-08-20. Not a link problem — a status disagreement between the two index docs. Left alone.refine/23-io-uring-commit.md:26still quotes the old order as "9e → 8+11 → 9f" in a dated note. No link involved; left as historical record.