writeonce/docs/stories/board-views.md
shoney.arickathil 746dc2b42b docs(databasev2): third track — the database beyond RAM, with per-table storage modes
- docs/stories/databasev2/, numbered from 1. Six PENDING database iterations
  moved from the language track and renumbered, keeping the old id in
  `was_language_iteration:` so a search for "iteration 32" still finds it:
  32 -> 3 WAL checkpoint, 23 -> 4 io_uring commit, 33 -> 7 single-file store,
  27 -> 8 query grammar, 20 -> 9 cross-program, 21 -> 10 keypair auth.
  Done work (9, 9b, 22) stays as v1 history; language 18 left whole
- the problem, read off the engine not guessed: rows are malloc'd slabs with
  addresses stable forever, NO eviction/spill/paging anywhere in database/src,
  the WAL never checkpoints so boot replays all history, and durability is one
  process-global WO_DATA so no table can say it matters more than another.
  An allocation failure IS a clean catchable WO_T_OOM — but swap thrash
  arrives first and carries no error signal at all, which is the real hazard
- four new iterations:
  1 measure the ceiling FIRST (curve not cliff; the three exits; kill -9 at
    exhaustion) — every later default should follow from a number
  2 `@table(mode: ram | durable | cold)` — the grammar ask. Small surface
    (Ast.table_cfg gains a key, the parser already rejects unknown args), big
    semantics: `durable` defaults so nothing changes silently, and the
    compiler refuses a durable row holding a `ref` into a ram table
  5 bounded tables + refuse/evict/back-pressure, shedding BEFORE the OS acts
  6 cold tiering — mostly forks, incl. whether the language surfaces the
    fault cost and whether @unique on cold is refused outright. A paged
    B-tree stays rejected: if tiering needs one, reject tiering
- 39 links repointed, link TEXT renumbered to track-local ids; arc gains one
  pointer row replacing the six moved; board + board-views cover three tracks
- linkcheck 0 broken / 0 anchors; no code blocks in any story

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 20:52:48 +02:00

3.5 KiB
Raw Blame History

Live board views (Obsidian Dataview)

Every story iteration file carries YAML frontmatter — the frontmatter is the source of truth:

---
track: porch          # OMITTED on language-runtime-database stories
iteration: "8"        # immutable id, LOCAL TO ITS TRACK (string: "7b", "9b" exist)
status: in-progress   # done | in-progress | refine | hold — the ONLY place status lives
chain: 1              # concurrency-chain position, chain stories only (1–6)
---

Editing status: IS the status change. Story files sit flat in docs/stories/language-runtime-database/; no directory encodes state, so there is nothing to move and nothing that can disagree. This replaced the 2026-08-20/21 folder scheme on 2026-08-26 — under that scheme a status change moved the file, which broke every relative link in and to it, and the repo's two link audits were largely the cleanup.

The closed set status: may take is done, in-progress, refine (needs a brainstorm before it can be planned) and hold. A value outside it will simply not appear in the lanes below, which is the cheapest possible validation. The prose board (00-status.md) stays the standup narrative; these queries are the live views over the same facts.

Adjust the FROM path to your vault root (queries below assume the vault opens at the repo root).

Three tracks now carry iterations, each numbered from 1: language-runtime-database/ (the language and runtime), porch/ (the web framework) and databasev2/ (the database beyond RAM) — the latter two added 2026-08-26. Iteration ids therefore repeat across tracks, so every query below is scoped by FROM path; non-language stories carry track:, and iterations moved between tracks keep was_language_iteration: so the old number stays searchable.

Everything not done, chain order first

TABLE iteration, status, chain
FROM "docs/stories/language-runtime-database"
WHERE status != "done"
SORT chain ASC, iteration ASC

Grouped by status (the kanban lanes, as data)

TABLE rows.file.link AS story, rows.iteration AS iteration
FROM "docs/stories/language-runtime-database"
WHERE status != "done"
GROUP BY status

The concurrency chain, in execution order

TABLE iteration, status
FROM "docs/stories/language-runtime-database"
WHERE chain
SORT chain ASC

Active right now

LIST
FROM "docs/stories/language-runtime-database"
WHERE status = "in-progress"

Kanban caveat

The Kanban plugin stores board state in its own markdown file — a second copy of status. To keep frontmatter the single source of truth: use Dataview for querying; treat any Kanban board as a VIEW, never the place status is edited. A status change is one edit to one status: key; a Kanban card drag that only rewrites the Kanban file is a lie the next query won't see.

The databasev2 track

TABLE iteration, status, was_language_iteration AS "was"
FROM "docs/stories/databasev2"
WHERE status != "done"
SORT iteration ASC

The porch track

TABLE iteration, status
FROM "docs/stories/porch"
WHERE status != "done"
SORT iteration ASC

Both tracks at once, grouped

Relies on track: being present on porch stories and absent on language ones, so the language track shows up under an empty group.

TABLE rows.file.link AS story, rows.iteration AS iteration, rows.status AS status
FROM "docs/stories"
WHERE iteration AND status != "done"
GROUP BY track