# 0.8.2 — Hotfix: live-run artifact detail crash on bracketed content

`LiveRunScreen._render_artifact_detail` interpolated artifact body text (read from disk) directly into a Textual markup template. Artifact bodies routinely carry literal bracket tokens — `[/yellow]`, `[TODO]`, code-fence prose with annotations — which the markup parser then treats as console-markup tags. First mismatched closer crashes the whole live-run view with `MarkupError: closing tag '[/yellow]' does not match any open tag`.

Operator-surfaced on the obol pilot: highlighting an implementation artifact tripped the crash.

Fix: escape user-controlled fields (title, kind, body, path, OSError message) via `rich.markup.escape` before substitution. Only substrate-controlled markup (`[b]`, `[dim]`, `[dim red]`) is preserved as live tags. Truncation path operates on raw body length so the "N more chars on disk" hint stays accurate.

Class of bug: artifact bodies are operator-visible-but-team-authored content; treating them as trusted markup violates the data-vs-code boundary. Other interpolations of artifact-derived strings into `Static.update()` in the TUI are suspect — separate audit pass worth doing at some point. For now, scoped to the one crash site the operator hit.

No substrate / pricing changes vs 0.8.1. Pure TUI hotfix.
