177 lines
8.4 KiB
Markdown
177 lines
8.4 KiB
Markdown
# 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. 2–5 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.
|