diff --git a/.yoi/tickets/00001KSKBP9YG/item.md b/.yoi/tickets/00001KSKBP9YG/item.md
index 5d77db50..1970b6ff 100644
--- a/.yoi/tickets/00001KSKBP9YG/item.md
+++ b/.yoi/tickets/00001KSKBP9YG/item.md
@@ -2,7 +2,7 @@
title: "E2E テストハーネス"
state: 'inprogress'
created_at: "2026-05-27T00:00:02Z"
-updated_at: '2026-06-13T15:05:52Z'
+updated_at: '2026-06-13T15:18:21Z'
queued_by: 'yoi ticket'
queued_at: '2026-06-13T14:17:34Z'
---
diff --git a/.yoi/tickets/00001KSKBP9YG/thread.md b/.yoi/tickets/00001KSKBP9YG/thread.md
index 90a0fd97..8c7bca77 100644
--- a/.yoi/tickets/00001KSKBP9YG/thread.md
+++ b/.yoi/tickets/00001KSKBP9YG/thread.md
@@ -298,4 +298,40 @@ Validation run in `/home/hare/Projects/yoi/.worktree/e2e-harness`:
No source changes were made during review.
+---
+
+
+
+## Implementation report
+
+Follow-up implementation update for reviewer request `559adb9a ticket: request e2e harness changes`:
+
+Production/non-production boundary fix:
+- Removed the normal-build no-op `e2e_observer` module path and now compile the observer module only behind `tui/e2e-test` via `#[cfg(feature = "e2e-test")] mod e2e_observer;`.
+- Added `#[cfg(feature = "e2e-test")]` to all Panel/TUI observability call sites that build JSON payloads, including terminal cleanup/exit, panel ready, rows-rendered, mouse click, selection changes, action requests, quit request, and background task lifecycle events.
+- `App::emit_rows_rendered`, `PanelE2eRowKey`, `PanelE2eRect`, `PanelE2eRenderedRow`, `PanelE2eRowsRendered`, and the conversion helpers are now compiled only with `tui/e2e-test`.
+- Normal builds no longer call `app.emit_rows_rendered()`, no longer evaluate `serde_json::json!` e2e payloads, and no longer retain the Panel E2E DTO/helper logic in the runtime path.
+- The background reload hold seam remains compiled/called only under `tui/e2e-test`; `YOI_TUI_TEST_EVENTS` and `YOI_TUI_TEST_HOLD_BACKGROUND_TASK` behavior remains feature-gated.
+
+Preserved E2E behavior:
+- Mouse E2E still verifies PTY output for normal mouse tracking + SGR mouse enable sequences before any raw SGR click can be sent.
+- `PanelHarness::click(...)` still fails if mouse capture was not observed.
+- Quit latency E2E still uses the feature-gated pending reload hold barrier and asserts the reload task is pending before Ctrl+C.
+
+Validation:
+- `cargo fmt --check` — passed.
+- `cargo check -p tui --all-targets` — passed.
+- `cargo check -p yoi --all-targets` — passed.
+- `cargo check -p tui --all-targets --features e2e-test` — passed.
+- `cargo check -p yoi --all-targets --features e2e-test` — passed.
+- `cargo build -p yoi --features e2e-test` — passed.
+- `YOI_E2E_BIN=/home/hare/Projects/yoi/.worktree/e2e-harness/target/debug/yoi cargo test -p yoi-e2e --features e2e --test panel -- --nocapture` — passed (2 tests).
+- `cargo check -p yoi-e2e --all-targets --features e2e` — passed.
+- `git diff --check` — passed.
+
+Remaining gaps / risks unchanged:
+- The E2E harness remains Unix PTY based.
+- The screen artifact remains raw PTY output rather than a parsed terminal snapshot.
+
+
---
diff --git a/crates/tui/src/e2e_observer.rs b/crates/tui/src/e2e_observer.rs
index 8c2749cf..77eceb60 100644
--- a/crates/tui/src/e2e_observer.rs
+++ b/crates/tui/src/e2e_observer.rs
@@ -1,89 +1,77 @@
-#[cfg(feature = "e2e-test")]
-mod imp {
- use std::fs::{File, OpenOptions};
- use std::io::Write;
- use std::path::PathBuf;
- use std::sync::{Mutex, OnceLock};
- use std::time::{Duration, SystemTime, UNIX_EPOCH};
+use std::fs::{File, OpenOptions};
+use std::io::Write;
+use std::path::PathBuf;
+use std::sync::{Mutex, OnceLock};
+use std::time::{Duration, SystemTime, UNIX_EPOCH};
- use serde::Serialize;
+use serde::Serialize;
- const EVENT_PATH_ENV: &str = "YOI_TUI_TEST_EVENTS";
- const HOLD_BACKGROUND_TASK_ENV: &str = "YOI_TUI_TEST_HOLD_BACKGROUND_TASK";
+const EVENT_PATH_ENV: &str = "YOI_TUI_TEST_EVENTS";
+const HOLD_BACKGROUND_TASK_ENV: &str = "YOI_TUI_TEST_HOLD_BACKGROUND_TASK";
- static EVENT_WRITER: OnceLock