uce/DOCS-TODO.md
2026-06-16 12:21:31 +00:00

177 lines
8.4 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.

# DOCS-TODO — `/doc` documentation overhaul
Briefing for the doc-system overhaul. Read this fully before touching anything.
The approved design and the two locked decisions are: **(1) examples are LIVE and
SELF-VERIFYING** — real UCE code executed at render time, showing source + actual
captured output, gated by the test suite; **(2) FULL SWEEP** of all 257 pages.
The docs live under `site/doc/`:
- `index.uce` — the renderer (index + per-page detail view).
- `lib/doc_page.h` — page parsing (`load_doc_page`) + label/kind helpers.
- `style.css` — theme + layout.
- `pages/*.txt` — 257 page source files (the corpus).
- `areas/*.txt` — area groupings; first line is the area title, following lines
are page slugs (or `>area` references) that populate the index sidebar.
- `search.uce`, `singlepage.uce` — search + single-page render.
## Why this work exists (the problems)
- **Title bug:** 15 pages carry a `:title` that literally repeats the raw filename,
so `0_StringList` renders as "0_StringList" instead of "StringList". The `:title`
override defeats the prefix-stripping label logic already in `doc_page.h`
(`doc_default_title` / `doc_index_label` / `doc_method_label`).
- **31 slop/stub pages:** the newest APIs (`file_*`, `crypto_equal`, `sha256*`,
`hmac*`, `random_bytes`, `http_request*`, `job_*`, `shell_spawn`) are throwaway
`# name` + one-line markdown with NO `:sig`/`:params`/`:see`/`:content`.
- **134 of 257 pages have no code example.** We want PHP-manual-style
code-to-output examples on EVERY page.
- **Sidebar overflow:** long monospace identifiers in the 280px index sidebar and
220px detail sidebar have no wrapping → they spill.
- **Relevancy:** pages lead with cross-membrane mechanics and "Related Concepts"
PHP/JS filler instead of usage; cross-references between related pages are missing.
## Principles for every page
1. **Usage first.** The opening `:content` sentence says what the function does and
when you'd reach for it — in plain terms. No membrane/ABI talk up top.
2. **A real example, always.** Every page has at least one `:example` whose output
is produced by actually running it. Examples are the primary teaching tool.
3. **Cross-link.** Every page's `:see` references its area (`>area`) and its closest
sibling APIs, so the reader is never left to search alone.
4. **Demote the drivel.** Cross-membrane behavior, lock semantics, and PHP/JS
equivalents are at most a short trailing note — never the body. Delete filler
that teaches nothing.
---
## Phase 1 — Infrastructure (do this FIRST, verify on host before any content)
### 1a. Title bug
- In `lib/doc_page.h` `load_doc_page`: when a `:title` value, trimmed, **equals the
page slug**, ignore it (leave `result.title` empty) so the renderer falls through
to `doc_default_title`, which already strips `0_/1_/2_/3_` prefixes and renders
`Class::method` for `2_*`.
- Strip the 15 redundant `:title` blocks from their pages (`0_StringList`, `cli_arg`,
`cli_input`, `list_filter`, `list_map`, `map`, `request_base_url`,
`request_query_path`, `request_query_route`, `request_script_url`,
`route_path_is_safe`, `route_path_normalize`, `route_path_sanitize`, `ucb_encode`,
`ucb_decode`).
- Fix garbage `:sig` lines on struct pages (e.g. `0_StringList`'s sig is literally
`0_StringList`): give struct pages a real one-line type summary or drop the sig box.
### 1b. Live example mechanism — EXACT SPEC
Primitives (already confirmed to exist): `unit_compile(path)`, `unit_render(path)`,
`ob_start()`, `ob_get_close()`. Relative paths in the doc unit resolve against
`site/doc/`.
- **Parse:** add `:example` handling to `load_doc_page``DocPage.examples`
(a list; multiple `:example` blocks per page allowed). Capture the raw body lines
verbatim (this is both the displayed source AND the executed code).
- **Materialize:** for each example, write the body wrapped in a minimal unit to a
**stable** path `examples/_gen/<slug>_<n>.uce`:
```
RENDER(Request& context)
{
<example body>
}
```
Write **only if the content changed** (compare to existing file) so the runtime's
compiled-unit cache stays warm. The `_gen` dir must be writable by the worker
(www-data) — created/`chown`ed once on the host (see Setup below).
- **Execute + capture:** `unit_compile("examples/_gen/<slug>_<n>.uce");` then
`ob_start(); unit_render("examples/_gen/<slug>_<n>.uce"); String out = ob_get_close();`
- **Render:** an "Example" `doc-section` showing the source block, then the captured
output beneath it under an "Output" label (PHP-manual style). If the example
traps or output is empty, **surface that visibly** (do not swallow it) — a broken
example must be obvious so the gate catches it.
- Examples must be **self-contained and deterministic** — no wall-clock/random output
shown as canonical (if a function is inherently non-deterministic, show a
representative call and describe the shape, or seed it). The gate asserts presence
of an output block + absence of an error marker, not an exact value, EXCEPT where
the value is deterministic.
### 1c. Sidebar + example CSS (`style.css`)
- Add `overflow-wrap: anywhere; word-break: break-word;` to `.category li a`,
`.func-item a`, and `.sidebar-card div`.
- Style the example Output block so it's visually distinct from the source (subtle
border + an "Output" label), reusing existing `--bg-code`/`--border` tokens.
### 1d. Format spec page
- Create `pages/3_Documentation format.txt` (an `info` page) documenting the canonical
page template below, so the format is self-describing inside the docs.
### Canonical page template
```
:sig
<one or more real C++ signatures, exactly as declared>
:params
<name> : <what it is>
return value : <what comes back>
:content
<Usage-first prose. What it does, when to use it. 25 tight sentences.>
:example
<runnable UCE code that print()s something illustrative>
:see
><area>
<closest sibling API slugs>
```
Optional short trailing note in `:content` for membrane/PHP-JS equivalence — one line,
not a section. No `:title` unless it differs from the derived label.
### Setup (host, one-time, before content work)
```sh
ssh root@10.4.2.110 'cd /Code/uce.openfu.com/uce && mkdir -p site/doc/examples/_gen && chown -R www-data:www-data site/doc/examples/_gen && chmod 775 site/doc/examples/_gen'
```
---
## Phase 2 — Content sweep (batched by area; one area = one reviewable batch)
For each area file in `site/doc/areas/` (string, sys, types, sqlite, mysql, memcache,
session, websocket, task, time, uri, regex, ob, markup, socket, noise, runtime), bring
every listed page to the canonical template:
1. **Convert the 31 stubs** to full structured pages.
2. **Add a live `:example`** to every page missing one (≈134), each verified to render
real output.
3. **Repair `:see`** — area link + sibling links on every page; demote membrane / PHP-JS
filler to a one-line note.
4. **Cull dead pages** — remove `concat.txt` ("Removed. Not a current API") and audit
internal-only helpers (e.g. `json_consume_space`) for removal; also remove culled
slugs from the relevant `areas/*.txt`.
Per-batch bar: every touched page renders cleanly, its example produces real output,
and the suite stays green.
---
## Phase 3 — Gate
- Add a `site/tests/cli_runner.uce` regression test that renders **every** `?p=` page
and asserts HTTP 200, no error/trap marker, and (for pages with `:example`) presence
of a non-error Output block.
- Full host gate (this is the ONLY place builds/tests run — the sshfs mount is
edit-only, no WASI SDK on the client):
```sh
ssh root@10.4.2.110 'cd /Code/uce.openfu.com/uce && bash scripts/build_core_wasm.sh && bash scripts/build_linux.sh && systemctl restart uce.service && sleep 3 && bash scripts/run_cli_tests.sh --include-wasm-kill'
```
Expect the current 91 to grow by the new doc gate(s), 0 failed.
## Hard rules (non-negotiable)
- **NEVER `git commit`/push/tag.** Not pi, not its subagents, not anyone. Leave a clean
working tree and report.
- **Always run the real host gate** (`bash scripts/build_core_wasm.sh && bash
scripts/build_linux.sh && systemctl restart uce.service && ...`) and trust only its
output. `g++ -fsyntax-only` / client-side builds do NOT count — there is no WASI SDK
on the client and the doc unit must actually render.
- Sub-delegation model is exactly `gpt-5.3-codex-spark`.
- Verify the example mechanism end-to-end on the host BEFORE authoring content against
it — content written against an unproven mechanism is wasted.