Decide hall URI, static renderer sibling, and allowlist trust.

HOH-WP-0002 T01–T03. Public slug is frontmatter id. Rendering lives in
hall-render. T04 still needs the operator corpus call.

Assistant: grok
Assistant-Session: 01a09dc1-b21e-77e1-919e-fcad2f82b267
This commit is contained in:
tegwick 2026-09-14 12:03:28 +02:00
parent 2554e437ea
commit 250f9a525c
4 changed files with 84 additions and 5 deletions

View file

@ -0,0 +1,61 @@
# ADR 0001 — Hall URI identifier, service shape, and renderer trust
Status: accepted
Date: 2026-09-14
Workplan: HOH-WP-0002-T01, T02, T03
## T01 — URI identifier
The public path is:
```
https://helix.coulomb.social/hall-of-helix/<id>
```
`<id>` is the seat frontmatter `id` **verbatim** (example:
`hall-worker-codex-statehub-snapshot-and-signature`). Uniqueness is already
enforced by `make check`. The filename is not the URI and may be renamed.
The `hall-worker-` prefix stays. Stripping it would require a second
uniqueness domain; an opaque extra id would be a third name to keep.
`id` is URL-safe `[A-Za-z0-9-]+` (mixed case is allowed; several existing
Claude session ids use it). Once `status` is not `draft`, `id` is frozen.
Corrections edit the body, not the identifier.
`?renderer=` is optional; omitting it equals `renderer=default`.
## T02 — Where the service lives
This repo stays a **publication** corpus. Rendering is a sibling tooling
repo, conventionally `hall-render`. Do not execute renderer code from this
repository.
First delivery is **static generation**: `hall-render` reads this repo at a
pinned commit and emits HTML. The renderer set is known at build time.
Dynamic on-request execution is declined for v1 (publication classification
plus XSS surface).
Deployment target: reef-railiance k3s, private/static objects behind the
existing Traefik ingress. DNS `helix.coulomb.social` is a railiance-infra /
railiance-cluster record, not owned by this publication repo. No live
publish until T04 (operator corpus disposition).
## T03 — Renderer contract and trust
`renderer` is user-controlled input that selects code. Rules:
1. Resolve only through a **fixed allowlist** in `hall-render`. Never treat
the parameter as a path, module, package, or URL.
2. Unknown values return 404 (static: missing artifact). Do not fetch or
import.
3. A renderer receives parsed Markdown plus frontmatter and returns markup.
No credentials, filesystem, or network.
4. Output is sanitised before it is a page. HTML from a renderer is an XSS
sink.
Registration is an in-repo allowlist in `hall-render`, not reuse-surface
(that catalog is capability discovery, not a safe code-execution index).
Input: `{frontmatter, markdown, entry_id}`. Output: `{html}`. Default
renderer is named `default` and is the only one in the first allowlist.