diff --git a/frontend/src/App.css b/frontend/src/App.css
index 4227b82..7f8cb69 100644
--- a/frontend/src/App.css
+++ b/frontend/src/App.css
@@ -879,6 +879,33 @@
display: flex; align-items: center; justify-content: space-between;
margin-top: 6px;
}
+
+/* §8.11 Phase 5 — per-paragraph word-diff inside the pending manual
+ card. Shares Phase 3's green/red register with .markdown-preview
+ .tracked-insert / .tracked-delete so the contributor sees one
+ "change layer" vocabulary across the preview pane (accepted) and the
+ change card (their own pending typing). Scoped under its own class
+ rather than reusing the preview selectors since the card is not
+ inside .markdown-preview. */
+.change-manual-diff {
+ margin: 6px 0;
+ display: flex; flex-direction: column; gap: 6px;
+}
+.change-manual-diff-block {
+ font-size: 12px; line-height: 1.6;
+ background: #f9fafb; border-radius: 4px;
+ padding: 6px 8px; border: 1px solid #e5e5e5;
+ white-space: pre-wrap; word-break: break-word;
+}
+.change-manual-diff .manual-diff-insert {
+ background: #dcfce7; color: #166534;
+ border-radius: 2px; padding: 1px 2px;
+}
+.change-manual-diff .manual-diff-delete {
+ background: #fee2e2; color: #991b1b;
+ text-decoration: line-through;
+ border-radius: 2px; padding: 1px 2px;
+}
.btn-save-now {
background: none; border: 1px solid #d4d4d4;
border-radius: 4px; padding: 2px 8px;
diff --git a/frontend/src/components/ChangePanel.jsx b/frontend/src/components/ChangePanel.jsx
index 0feb5c6..4f7be67 100644
--- a/frontend/src/components/ChangePanel.jsx
+++ b/frontend/src/components/ChangePanel.jsx
@@ -11,7 +11,10 @@ import { useState, useEffect, useRef } from 'react'
const PREVIEW_LENGTH = 220
-function diffWords(original, proposed) {
+// Word-level LCS over whitespace-preserving tokens. Used by both the
+// AI change-card InlineDiff (original→proposed) and Phase 5's
+// manual-pending-card per-paragraph diff (baseline→current).
+export function diffWords(original, proposed) {
const a = (original || '').split(/(\s+)/)
const b = (proposed || '').split(/(\s+)/)
const m = a.length, n = b.length
@@ -85,6 +88,7 @@ export default function ChangePanel({
{manualPendingStatus && (