- Fixed two rendering bugs in auto-generated corpus CAML articles (`Readme.CAML`) that surfaced on freshly-branded corpora:
  - **Raw block text leak** (e.g. `corpus-stats` rendering as a stray `- documents | Documents` / `- annotations | Annotations` / `::::` bullet list). `@os-legal/caml`'s depth-specific tokenizer cannot close a `::::` block fence placed at the top level (outside a `::: chapter`), so it leaked the block body — including the literal `::::` — as prose. Added `frontend/src/components/corpuses/caml/normalizeCamlSource.ts` (`normalizeCamlSource` / `parseCamlArticle`), which wraps stray top-level block fences in a synthetic chapter before parsing, and wired it into `CorpusArticleView.tsx` and `CamlArticleEditor.tsx`. This repairs already-stored articles at render time as well as new ones.
  - **Collapsed content column** (prose wrapping one word per line; CTA buttons wrapping mid-word, e.g. "Contact" / "Us"). `CamlArticleFrame.tsx` capped every section to `readingMeasure` (720px) while `@os-legal/caml-react` styles dark/gradient chapters full-bleed via `padding: 3rem calc((100% - 720px) / 2 + 2rem)`, whose percentage resolves against the wider article width — so on wide viewports the horizontal padding collapsed the capped section's content box toward zero. Neutralized the full-bleed padding with a flat gutter (`CamlArticleFrame.tsx`).
- Hardened the CAML Article Writer prompt (`opencontractserver/corpuses/caml_authoring.py`) to require every `::::` block be nested inside a `::: chapter`, reducing mis-nested LLM output at the source; propagated to existing databases via `agents/migrations/0016_update_caml_article_writer_prompt.py`.
