Estimate: 14m · Depends on: 2.4.1
The page's content body. The description renders through MarkdownView (2.3.5) — the same single render module the editor preview uses, so the read view and the edit-time preview can never diverge. The explanation (explanationMd, the "why this matters" axis from Story 1.4) renders read-only beneath it with an "AI-drafted" badge when explanationSource == 'ai_draft' (the provenance enum 1.4 shipped); editing/regenerating the explanation is an Epic-7 concern and is NOT a control here. Empty description shows a muted "No description" placeholder rather than blank space.
Core-fields panel (the metadata sidebar): every read-only field on work_item — type, priority, assignee (avatar/name or "Unassigned"), reporter, due date, estimate (minutes → human duration), created / updated (the same deterministic en-US/UTC formatter the jobs dashboard adopted after the 1.6.5 hydration fix — issue timestamps are an audit surface, so render them deterministically). These are DISPLAY only; the two interactive fields (status, assignee) get their inline controls in 2.4.4. The "Edit" button (2.4.1) remains the path for every other field.
MarkdownView (GFM + sanitized + highlighted + underlined links); empty → muted placeholder.explanationSource == 'ai_draft'; absent explanation hides the section entirely.en-US/UTC formatter (no hydration mismatch).ai_draft explanation shows the badge, a user_authored one does not.components/ui/MarkdownView.tsx + lib/markdown/render.tsx (2.3.5) — the ONE render pathlib/issues/issueTypes.ts (2.1.1) — type icon/label; the priority enum + labels from Story 1.4formatDateTime (en-US/UTC, "UTC" suffix) — reuse, don't re-deriveexplanationSource enum + explanationMd semantics (Story 1.4 · AI-storage boundary note)