diff --git a/.gitattributes b/.gitattributes
index 81f4fb6d..7f670e88 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -17,6 +17,7 @@ harness/scenario-group-spacing-evidence-20260924/** -text whitespace=cr-at-eol
harness/scenario-reorder-interaction-evidence-20260924/** -text whitespace=cr-at-eol
harness/scenario-group-removal-evidence-20260925/** -text whitespace=cr-at-eol
harness/scenario-removal-followup-evidence-20260925/** -text whitespace=cr-at-eol
+harness/fixtures/process-removal-removed-v2-20260925.arcadia -text whitespace=-blank-at-eol
# Exact source/recovery oracles and archived ledgers retain their measured bytes.
# Keep ordinary text diffs; only disable checkout/check-in newline conversion.
diff --git a/crates/oa-desktop/src/app/process_removal/tests.rs b/crates/oa-desktop/src/app/process_removal/tests.rs
index 54a8d22b..b6fb966b 100644
--- a/crates/oa-desktop/src/app/process_removal/tests.rs
+++ b/crates/oa-desktop/src/app/process_removal/tests.rs
@@ -59,7 +59,9 @@ const BASELINE: &str = include_str!(concat!(
));
const REMOVED: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
- "/../../harness/fixtures/process-removal-removed-20260925.arcadia"
+ // V1 assumed canonical whitespace. V2 independently retains removed-token
+ // trivia and existing reference spelling under language section 7's rules.
+ "/../../harness/fixtures/process-removal-removed-v2-20260925.arcadia"
));
fn native() -> App {
let document = Document::from_bundle(native_bundle(BASELINE), Default::default()).unwrap();
diff --git a/crates/oa-desktop/src/model_menu.rs b/crates/oa-desktop/src/model_menu.rs
index bf129e93..c11d5c26 100644
--- a/crates/oa-desktop/src/model_menu.rs
+++ b/crates/oa-desktop/src/model_menu.rs
@@ -436,6 +436,32 @@ pub fn popup(app: &App) -> Option