diff --git a/docs/adr/0000-record-architecture-decisions.md b/docs/adr/0000-record-architecture-decisions.md index a12b3b1..9b16a4f 100644 --- a/docs/adr/0000-record-architecture-decisions.md +++ b/docs/adr/0000-record-architecture-decisions.md @@ -58,6 +58,24 @@ compute "next" from a feature branch. A branch that genuinely needs a real number up front may instead reserve one by landing a stub index entry on `main` first, but placeholder-until-merge is the default. +### Subproject ADR namespaces + +A long-lived subproject developed on its own branch can escape the shared +integer pool entirely by keeping its decision records in a **separate +namespace**, rather than fighting collisions on every merge. The **website** +(`docs/website/adr/`) is the first: its ADRs use a dated sequence — +`-adr-website-.md`, referenced in prose as `ADR-website-NNN` — +and are indexed by their own `docs/website/adr/README.md`. Because the +date-plus-subproject prefix is disjoint from `main`'s integer sequence, a +website ADR and a `main` ADR can never claim "the same number" again. (This +namespace was created on 2026-06-10 after the website's ADR collided with +`main`'s on consecutive numbers — drafted 0042, bumped to 0044, both times +landing on a number `main` had taken; the move retired it from the pool as +**ADR-website-001**.) The main `docs/adr/` index carries a pointer to each +such namespace. Use this for a new subproject only when it is genuinely +self-contained and branch-isolated; one-off cross-cutting decisions stay in +the global sequence. + ## Out-of-scope discipline ADRs (and the plans they spawn) lean heavily on "out of scope" language. diff --git a/docs/adr/README.md b/docs/adr/README.md index 5ebab87..7a5c469 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -3,6 +3,13 @@ This directory contains the project's ADRs, recorded per [ADR-0000](0000-record-architecture-decisions.md). +> **Website subproject ADRs** live in a separate namespace — +> [`docs/website/adr/`](../website/adr/README.md) — with their own dated +> sequence (`-adr-website-.md`, id `ADR-website-NNN`), so they +> never compete with this global integer pool for numbers (see ADR-0000 +> "Numbering discipline"). The website itself was decided in +> **ADR-website-001** (formerly ADR-0044 in this index). + ## Index - [ADR-0000 — Record architecture decisions](0000-record-architecture-decisions.md) @@ -49,4 +56,3 @@ This directory contains the project's ADRs, recorded per - [ADR-0041 — Copy the output panel to the system clipboard](0041-copy-output-to-clipboard.md) — **Accepted 2026-06-02 (issue #11)**, amends ADR-0003's app-command registry (adds **`copy`** / `copy all` / `copy last`). The friction it removes: filing a bug report meant terminal-selecting the output panel and fighting wrapping/borders. New **app-level command** (sigil-free, both modes): `copy` / `copy all` copy the whole panel; `copy last` copies from the most recent echo line to the end. **Mechanism — OSC 52 *and* native (`arboard`), always both**, because OSC 52 acceptance is undetectable (no terminal ack), so a true "fall back when unsupported" can't be built: emit the OSC 52 escape (no new dep — `base64`+`crossterm`; works over SSH; tmux-passthrough-wrapped via `$TMUX`), then a best-effort native write whose failure is ignored (headless host — OSC 52 carried it); the two carry identical content. **Format — plain text verbatim as rendered** (tags, `✓`/`✗`, box-drawing) joined by `\n`, without viewport padding/wrapping; a drift-lock test pins `OutputLine::plain_text` to `render_output_line`. `arboard` added **`--no-default-features`** (drops the `image` crate; X11-only on Linux — `wayland-data-control` deliberately omitted as it ~doubles the dep tree and OSC 52 covers native-Wayland). Security: write-only, scans clean for arboard's tree (cargo audit / osv-scanner / grype), 1Password-maintained, minimal surface. OOS: Markdown export, selection/range, a keybinding, OSC 52 read, `screen` passthrough - [ADR-0042 — H1a parse-error pedagogy in the grammar-tree era](0042-h1a-parse-error-pedagogy-grammar-tree.md) — **Accepted 2026-06-03.** Continues **H1a** from ADR-0021 against the ADR-0024 grammar tree (ADR-0021's chumsky mechanism is dead). Records the **baseline already shipped** — per-command `usage:` block (38 `parse.usage.*` templates), available-commands fallback, structural "after `…`, expected …" wording, source-derived ident slot labels ("table name"/"column name"), curated `parse.custom.*` near-miss messages, and the ADR-0027/0033/0036 schema-aware `[ERR]` diagnostics — so H1a is *substantially* delivered at the intent level. Defines the remaining work as **(1)** a verified per-command **near-miss matrix** (`tests/typing_surface/` + `tests/it/parse_error_pedagogy.rs`) as the definition of done, test-first; **(2)** **friendlier literal expectation labels** — optional prose glosses on `Word`/`Punct`/`Flag` positions that *add* role context while always keeping the exact literal visible (e.g. "a filter clause: `where …` or `--all-rows`"); **(3)** **advanced-mode SQL** near-miss parity (RETURNING scope, CTE-arity positioning, `CROSS JOIN … ON`, INSERT…SELECT count) — **in scope**, kept distinct from ADR-0019 §OOS-2 which covers advanced-SQL *engine*-error sanitisation, a different layer. Catalog/anchor-phrase discipline (ADR-0019) preserved; no public API change. OOS: I3/I4, spell-correction, multi-error reporting, verbosity-gating the usage block - [ADR-0043 — Compound-primary-key foreign-key references (T3)](0043-compound-pk-foreign-key-references.md) — **Accepted + implemented 2026-06-09** (all four forks confirmed at the recommended option: full-PK matching, house-style uniform lists, parenthesized DSL syntax, bare-SQL-FK auto-expansion). Closes `requirements.md` **T3** `[x]` — the relationship model went list-based across six layers (single-column preserved, no migration), DSL `from P.(a,b) to C.(x,y)` + SQL `FOREIGN KEY (a,b) REFERENCES P(x,y)` parse/execute/enforce, 12 tests in `tests/it/compound_fk.rs`. Closes the open leg of `requirements.md` **T3**: a foreign key that *references* a parent's compound primary key. A 2026-06-09 audit found single-column FK woven through ~15–20 sites (metadata table, `RelationshipSchema`, `project.yaml` `RawEndpoint`, both grammar surfaces, executor FK-DDL emission, per-column type-compat, display) — earns an ADR, not an inline build. **Decision:** reference the parent's **full** compound PK, matched **positionally** to an equal-length child column list, per-pair `fk_target_type` compat (ADR-0011, element-wise); DSL `from

.(a, b) to .(x, y)` (single form unchanged), SQL `FOREIGN KEY (x, y) REFERENCES P(a, b)` (extend the existing one-cap lists; bare table-level FK auto-expands to the parent PK when arities match). **Storage — no migration (back-compat not required, user-confirmed 2026-06-09; no installed base):** the relationship endpoint joins the list convention `project.yaml` *already* uses — `columns: [a, b]` like `primary_key: [id]` and index `columns: [...]` (the endpoint was the lone scalar `column:` holdout); the metadata `TEXT` columns are unchanged and store the list **comma-joined** (`a,b`; the bare name for single — safe because identifiers are `[A-Za-z0-9_]+`). No F3 migrator, no version bump; accepted trade-off is that a pre-change `project.yaml` with relationships won't load (clean cutover). In-memory model goes list-based (`Vec`) through all six layers; the enforced FK is the rebuilt child-table DDL (`FOREIGN KEY (a,b) REFERENCES P(x,y)`), one relationship = one undo step (ADR-0013). Genuine forks escalated: matching policy (full-PK vs subset), storage (house-style uniform lists vs normalized table), DSL syntax (parenthesized vs repeated-dotted), bare-SQL-FK auto-expansion. OOS: subset/non-PK (UNIQUE-targeted) FK references; any single-column behaviour change -- [ADR-0044 — Public website and documentation site](0044-public-website-and-documentation-site.md) — **Accepted 2026-06-04** (originally drafted as ADR-0042 on the `website` branch; renumbered on merge to avoid colliding with the H1a ADR-0042). The first public website: a marketing landing page plus the **canonical** user docs. Stack **Astro 6 + Starlight + Tailwind v4** (chosen over SvelteKit + Tailwind for a docs-heavy + marketing site; interactive bits as Astro islands). Showcase demos are **asciinema** `.cast` recordings (scripted-input driver for paced, re-recordable sessions — *not* `history.log` replay), reused inline in docs. The **in-page WASM playground is deferred** (OOS: deferred) behind a stable `Demo` seam, with the portable-core (`dsl`/`app`/`ui`, in-memory `rusqlite` via `ffi-sqlite-wasm-rs`) vs native-edge (Tokio/worker-thread/`crossterm`/persistence/backup-API) boundary recorded for a future ADR + iteration plan. Portable **static build** (Vercel target, but host-agnostic); **no CI yet**; **monorepo** (`website/`). Docs cover the **full supported feature set** with "planned" callouts for the unshipped minority; two wording rules bind user-facing copy — **no engine name** (continues ADR-0002) and **no "DSL"** ("simple mode" / "advanced mode"). Install docs cover **prebuilt binaries + package managers** (D1–D3 track the release tooling). Plan: `docs/plans/20260604-adr-0044-website.md` diff --git a/docs/adr/0044-public-website-and-documentation-site.md b/docs/website/adr/20260604-adr-website-001.md similarity index 90% rename from docs/adr/0044-public-website-and-documentation-site.md rename to docs/website/adr/20260604-adr-website-001.md index 49dd24d..6b180e1 100644 --- a/docs/adr/0044-public-website-and-documentation-site.md +++ b/docs/website/adr/20260604-adr-website-001.md @@ -1,13 +1,17 @@ -# ADR-0044: Public website and documentation site +# ADR-website-001: Public website and documentation site ## Status Accepted (2026-06-04). Implementation plan: -[`docs/plans/20260604-adr-0044-website.md`](../plans/20260604-adr-0044-website.md). +[`docs/website/plans/20260604-website-implementation-plan.md`](../plans/20260604-website-implementation-plan.md). -> Renumbered from ADR-0042 to ADR-0044 when the `website` branch merged -> `main` (2026-06-09): `main` had independently used 0042 for the H1a -> parse-error ADR and 0043 for compound-PK FK references. Content is +> History: drafted as ADR-0042, renamed to ADR-0044 (each collided with a +> number `main` had independently assigned — H1a took 0042, compound-PK FK +> took 0043, then relationship-visualization took 0044). Moved to the +> website ADR namespace (`docs/website/adr/`, id **ADR-website-001**) on +> 2026-06-10 to end the recurring cross-branch number collision: website +> decision records now draw from their own dated sequence and never the +> main global ADR pool (see ADR-0000 "Numbering discipline"). Content is > unchanged from the original draft. ## Context diff --git a/docs/website/adr/README.md b/docs/website/adr/README.md new file mode 100644 index 0000000..5fcc977 --- /dev/null +++ b/docs/website/adr/README.md @@ -0,0 +1,19 @@ +# Website Architecture Decision Records + +Decision records for the **public website + documentation site** subproject +(the Astro/Starlight site under `website/`). These are kept in their own +namespace, separate from the project-wide ADRs in +[`docs/adr/`](../../adr/README.md), so website decisions never compete with +the main global ADR sequence for numbers — see +[ADR-0000 "Numbering discipline"](../../adr/0000-record-architecture-decisions.md). + +**Numbering.** Files are named `-adr-website-.md` and referenced +in prose as `ADR-website-NNN`. The `` (the ADR's accepted/created day, +`YYYYMMDD`) plus the `website` segment keeps the namespace disjoint from +`main`'s integers. Assign the next free `NNN` from this index. Every ADR +change updates this index in the same edit (the ADR-0000 index-upkeep rule +applies here too). + +## Index + +- [ADR-website-001 — Public website and documentation site](20260604-adr-website-001.md) — **Accepted 2026-06-04** (formerly ADR-0044 in the main index; moved here 2026-06-10 to end recurring cross-branch number collisions). The first public website: a marketing landing page plus the **canonical** user docs. Stack **Astro 6 + Starlight + Tailwind v4** (chosen over SvelteKit + Tailwind for a docs-heavy + marketing site; interactive bits as Astro islands). Showcase demos are **asciinema** `.cast` recordings (scripted-input driver for paced, re-recordable sessions — *not* `history.log` replay), reused inline in docs. The **in-page WASM playground is deferred** (OOS: deferred) behind a stable `Demo` seam, with the portable-core vs native-edge boundary recorded for a future ADR + iteration plan. Portable **static build** (Vercel target, but host-agnostic); **no CI yet**; **monorepo** (`website/`). Docs cover the **full supported feature set** with "planned" callouts for the unshipped minority; two wording rules bind user-facing copy — **no engine name** (continues ADR-0002) and **no "DSL"** ("simple mode" / "advanced mode"). Install docs cover **prebuilt binaries + package managers** (D1–D3 track the release tooling). Plan: [`docs/website/plans/20260604-website-implementation-plan.md`](../plans/20260604-website-implementation-plan.md) diff --git a/docs/plans/20260604-adr-0044-website.md b/docs/website/plans/20260604-website-implementation-plan.md similarity index 97% rename from docs/plans/20260604-adr-0044-website.md rename to docs/website/plans/20260604-website-implementation-plan.md index 36747e1..3ad9201 100644 --- a/docs/plans/20260604-adr-0044-website.md +++ b/docs/website/plans/20260604-website-implementation-plan.md @@ -3,7 +3,7 @@ **Date:** 2026-06-04 · **Status:** ready to build Decisions for this work are recorded in -[ADR-0044](../adr/0044-public-website-and-documentation-site.md): Astro 6 + +[ADR-website-001](../adr/20260604-adr-website-001.md): Astro 6 + Starlight + Tailwind v4; asciinema demos reusable in docs; the in-page WASM playground deferred behind a stable demo seam; portable static hosting (Vercel target); monorepo (`website/`); website is the canonical docs home; @@ -154,7 +154,7 @@ project lifecycle + undo/history → Tier 3 teaching echo + EXPLAIN + errors + completion/highlighting → Tier 4 clipboard + hints + editing. Conventions live in the **living style guide** `website/STYLE.md` (binding -rules from ADR-0044 §7 — no engine name, **no "DSL"**, "planned" callouts — +rules from ADR-website-001 §7 — no engine name, **no "DSL"**, "planned" callouts — plus finer conventions and an open-decisions log for depth/splitting/example dataset/etc. as they settle). Sources to mine: `src/dsl/command.rs`, `src/dsl/grammar/*`, the REGISTRY, `en-US.yaml`, `docs/adr/*`, @@ -170,7 +170,7 @@ static host. `website/README.md` notes the Vercel preset (root dir `Demo.astro` exposes a stable contract (`{ src, title, height, autoplay }`). At launch it renders `Cast.astro`; later a `Playground.astro` WASM island swaps in behind the same props on the landing page and in docs, with zero -call-site changes. Boundary details are in ADR-0044 §3. +call-site changes. Boundary details are in ADR-website-001 §3. ## Verification @@ -181,7 +181,7 @@ call-site changes. Boundary details are in ADR-0044 §3. - Starlight link-check passes (broken internal links fail the build). - Docs grep clean of forbidden terms: **no "DSL"**, no engine name. - A `dist/` static deploy works on Vercel (manual import) — confirms - portability. (No CI gate yet, per ADR-0044 §4.) + portability. (No CI gate yet, per ADR-website-001 §4.) ## Notes / recommendations (non-blocking) diff --git a/website/STYLE.md b/website/STYLE.md index a68b6d7..24ee9c8 100644 --- a/website/STYLE.md +++ b/website/STYLE.md @@ -4,7 +4,7 @@ This is the **living** home for documentation authoring conventions for the RDBMS Playground website. It grows as we write. - **Binding rules** come from - [ADR-0044 §7](../docs/adr/0044-public-website-and-documentation-site.md); + [ADR-website-001 §7](../docs/website/adr/20260604-adr-website-001.md); this guide must not contradict them. If a convention is significant, durable, or contested, it is decided in an **ADR** (new or amended), and this guide references it. Finer, settled conventions live here directly. @@ -17,7 +17,7 @@ Status tags used below: **[DECIDED]** (binding or settled) · --- -## Terminology & wording [DECIDED — ADR-0044 §7] +## Terminology & wording [DECIDED — ADR-website-001 §7] - **No "DSL".** It is internal jargon. Use **simple mode** (the playground's keyword command language) and **advanced mode** (SQL). @@ -66,7 +66,7 @@ Ground every reference page in source — `parse.usage.*` and `help.*` in `src/friendly/strings/en-US.yaml`, `src/dsl/command.rs`, `src/dsl/types.rs` — never paraphrase grammar from memory. -## "Planned / not yet available" callouts [DECIDED — ADR-0044 §7] +## "Planned / not yet available" callouts [DECIDED — ADR-website-001 §7] Any capability that is not yet fully implemented is **omitted** or carries a clear callout — never presented as shipped. Standard form: a Starlight aside @@ -127,7 +127,7 @@ a small standalone example, not by complicating this schema. - Pair a hero/landing cast with a text transcript or the equivalent docs snippet (accessibility + SEO). - Recorded via a scripted-input driver for paced, re-recordable sessions - (ADR-0044 §2; recipe in `README.md`). **[OPEN]**: cast file naming, + (ADR-website-001 §2; recipe in `README.md`). **[OPEN]**: cast file naming, fixed terminal size, light/dark theme handling. ## Formatting [DECIDED, refine] diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 312b2b6..67d6583 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -27,7 +27,7 @@ export default defineConfig({ customCss: ['./src/styles/global.css'], // Register the simple-mode command grammar with Expressive Code (Shiki). expressiveCode: { shiki: { langs: [rdbmsLang, rdbmsSyntax] } }, - // Pragmatic structure (ADR-0044 §7 / website/STYLE.md): Getting + // Pragmatic structure (ADR-website-001 §7 / website/STYLE.md): Getting // started, Guides, Reference, Concepts. Autogenerated per directory; // in-section order is controlled by each page's `sidebar.order` // frontmatter.