writeonce/docs/stories/board-views.md
shoney.arickathil 01df75245f docs(porch): give the framework its own story track, iterations 1-8
- docs/stories/porch/ — a TRACK folder, not a status folder: status still
  lives only in frontmatter. Adds `track: porch` so a query over
  docs/stories/ can tell a porch 3 from a language 3
- 00-story.md carries the sequence, the dependency graph, and a table of
  what the track explicitly does NOT own (binding -> 29, cache -> 18,
  proxy -> 38, metrics -> 30, TLS/templates -> doctrine)
- eight iterations, each with phases, per-phase tasks, Given/When/Then
  criteria, out-of-scope and the forks a spec must settle:
  1 store-backed middleware (limiter + idempotency — needs nothing new,
    first on purpose so the store pattern is proven cheaply)
  2 randomness + cookies (phase A is language-track: a CSPRNG builtin;
    `Resp.headers` being a map cannot emit two Set-Cookie lines)
  3 sessions   4 CSRF   5 routing/response ergonomics (independent)
  6 streaming core (the seam 7 and 8 wait on; chunked-request refusal
    must survive)   7 SSE + compression   8 static + lifecycle hooks
- language iteration 39 -> status: hold, retitled superseded, with a row
  mapping each of its goals to the porch iteration that took it. Kept, not
  deleted: the Fiber study cites it and its randomness argument is what
  this track is built on
- board gains a porch section; board-views gains porch and both-track
  Dataview queries; porch README and the Fiber study §7 point at the track
- no code blocks in any story (plans carry concept and actions in words);
  linkcheck 0 broken / 0 anchors

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

3.2 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).

Two tracks now carry iterations, each numbered from 1: language-runtime-database/ (the language, runtime and database) and porch/ (the web framework, added 2026-08-26). Iteration ids therefore repeat across tracks — a porch 3 is not a language 3 — so every query below is scoped by FROM path, and porch stories carry track: porch so a combined query can still tell them apart.

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 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