diff --git a/README.md b/README.md index 765c4e6..b1bbce5 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,13 @@ stream. - **Content-driven pages** (`src/content.rs`, `src/app.rs`): YAML loaded from Gitea at boot and hot-swapped on a NATS reload signal; - a bad push keeps the last-good content serving. A page's `id` is - its URL; `qualifies` gates it to a Kanidm group. + a bad push keeps the last-good content serving. The `questions/` + tree IS the router — file paths become URLs, `_section.yaml` + applies criteria to a whole directory, `[name].yaml` pages serve + any `/dir/` with the segment fed into resource keys, and + `requires_chain` gates a page on verifiable answer provenance next + to `qualifies`' Kanidm-group identity gate (see + `docs/design/filesystem-routes.md`). - **State machines as content** (`src/aggregates/`): `aggregates.yaml` declares each bucket's states and legal transitions; the engine replays a record's event history and refuses undeclared moves, with diff --git a/docs/design/filesystem-routes.md b/docs/design/filesystem-routes.md index 93bdfb1..6dcabb7 100644 --- a/docs/design/filesystem-routes.md +++ b/docs/design/filesystem-routes.md @@ -1,6 +1,12 @@ # Filesystem routes, sections, and where chains fit -Status: proposal (researched 2026-08-24, nothing implemented). +Status: implemented in v0.2.0 (2026-08-24) — all three phases, with +one deviation: dynamic-page params substitute into resource keys via +server-side `resolve_question` at lookup time (get_question, +find_feature, submit_answer all resolve concrete paths), so no param +threading exists client-side. The user-facing routing contract is +documented in uhhm/questions' README ("Routing: the tree is the +router"); this file stays as the design rationale. ## What exists today, precisely