tools: generate the artifact page from canon markdown

The page and the ADR had already diverged once. They are now one source: the
markdown is authoritative and the page is generated, never hand-edited.

The renderer recognises conventions the document already uses rather than
requiring extra markup, so the source stays a readable document. A table whose
first column is **X0**/**X1** becomes a level ladder; a table headed Threat
becomes the threat matrix; a table with a Kind column gets mechanical and
adversarial chips; a table headed "E \ P" becomes the two-axis grid; ## N.
headings build the section rail.

Stdlib only, per the structure-not-tooling stance. A publishing step that needs
its own toolchain is a publishing step that stops being run - the same
reasoning tenant-engine used for its pin check.

One real consequence beyond deduplication: the E x P matrix had existed only on
the page, so the canonical document did not contain its own central diagram.
It is now a table in the markdown, which is where it should always have been.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
codex 2026-08-17 15:10:22 +02:00
parent c4f22a5e55
commit 1c65257352
4 changed files with 587 additions and 4 deletions

View file

@ -193,3 +193,10 @@ agents-update:
agents-validate:
@echo "Validating agents..."
@kaizen-agentic validate agents/
.PHONY: artifact-adr008
artifact-adr008:
python3 tools/render-artifact.py canon/architecture/adr-008-multi-tenancy-model.md \
--output build/adr-008.html \
--title "Tenancy Posture" \
--subtitle "A framework for describing, holding and improving multi-tenancy — including where we are not there yet."