diff --git a/docs/state.md b/docs/state.md index 1ae4e06..6ed8b30 100644 --- a/docs/state.md +++ b/docs/state.md @@ -54,9 +54,17 @@ with a stated reason. A list nothing drains is a graveyard of known defects. | No mechanical gate on the untrusted boundary (ADR-0003) | Scheduled to Arc 3: nothing untrusted is read yet | The comment path — a test that untrusted input reaches no shortcode or template evaluation | | Raw HTML in Markdown is currently omitted only because goldmark's default omits it | Verified at the Arc 1 boundary, and it is what keeps invariant 2 intact for authored content. `html.WithUnsafe()` is the obvious move when a shortcode needs to emit HTML, and it silently turns authored Markdown into an injection path | Shortcodes (queue 12) — if unsafe rendering is enabled, the trusted/untrusted split must be real code, not a default | -## Open questions blocking Arc 1 +## Open questions -None. Every decision the engine needs before Arc 1 and before the first deploy is recorded. +**Blocking sequences (queue entry 10): how a series is joined.** ADR-0016 says membership is the `series` +frontmatter field plus `order`. Building it revealed a simpler option that contradicts that: membership is +**structural** — a chapter is a bundle nested under its series landing page, `comics/the-long-monsoon/first-rain` +under `comics/the-long-monsoon` — so no `series` field is needed and `order` alone stays. Structural needs +no new field and cannot disagree with the directory; `series` allows a series to span directories and is +what ADR-0016 already recorded. Reversing a recorded decision needs a decision, not a silent change +(`CLAUDE.md` rule 9), so this waits. + +Nothing else blocks Arc 1 or the first deploy. Every ADR in `decisions.md` is accepted; none is open or proposed.