` with a button group — no routing or complex state needed
+
+### Implementation Approach
+
+#### Unified View
+
+- Render `Change[]` from `diffWords()` sequentially in a single `` or ``
+- Apply `bg-red-100 text-red-800` for removed, `bg-green-100 text-green-800` for added
+- Prefix removed segments with `-` and added segments with `+` (accessibility: not color-only)
+
+#### Side-by-Side View
+
+- Split `Change[]` into left (original) and right (modified) columns
+- Left column shows removed + unchanged segments; right column shows added + unchanged segments
+- Align rows so corresponding changes appear at the same vertical position
+
+### Alternatives Considered
+
+| Approach | Rejected Because |
+| ----------------------------------- | ---------------------------------------------------------------------- |
+| Tab-based switching | Toggle button is simpler and more discoverable for a two-option choice |
+| Three views (unified + split + raw) | Over-engineering; spec only requires two views |
+
+---
+
+## Research Topic 4: Accessibility for Diff Output
+
+### Decision
+
+Use semantic HTML, ARIA live regions, and text markers (`+`/`-`) alongside color coding.
+
+### Rationale
+
+- Constitution Principle III mandates accessibility-first design
+- Color MUST NOT be the sole means of conveying diff information
+- Screen readers need to announce diff changes meaningfully
+
+### Implementation Approach
+
+1. **ARIA live region**: Wrap diff output in `aria-live="polite"` so screen readers announce updates
+2. **Text markers**: Prefix added segments with `+` and removed segments with `-` (visually subtle but screen-reader accessible)
+3. **Semantic roles**: Use `role="status"` for the "No differences found" message
+4. **Labels**: Each textarea gets an associated `