---
name: project-benchtop-harness-phase3-full-arc-2026-08-13
description: "benchtop-harness Phase 3 実測 6 モード完了 arc (2026-08-13 帰宅後)。予想検証 6/6 的中 (line-cut 5→4 発火 + duration_s 15.572 の 2 微差のみ)、予想外の 2 発見 (D-3 port 非解放 + TX log 照合が normal-2 [0] 欠落 実 detect)、2 open thread (normal-2 [0] 原因未特定 + line-cut 5→4 は harness timing) の記録"
metadata: 
  node_type: memory
  type: project
  originSessionId: c3511ef5-c9e4-4d3d-ad7e-1dd6a9c51580
  modified: 2026-08-13T13:27:15.442Z
---

# benchtop-harness Phase 3 full arc (2026-08-13 帰宅後)

benchtop-mcp v0.2.4 (`fc0web/benchtop-mcp` frozen) を実 serial 経路 (com0com COM10↔COM11 + fake_instrument emitter + drain.py) で検証する Phase 3 が **6 mode 全完了**。予想は 6/6 的中、微差 2 (line-cut 5→4 発火 + duration_s 15.572 v.s. ~18s)、予想外の 2 発見。

**Why**: 藤本さん半日 arc の落ち先。preflight 段階の 4 point check + 4 修正が Phase 3 実 trial で **全部当たる**という強い evidence 得た + 予想リストに載っていなかった 4 発見 (D-3 / com0com buffering / port open→read loop 2s / duration_s 非対称) が execution だけから出た = 「review と execution は原理的に違うものを見ている」 の operational 実例。

**How to apply**: 帰宅後 restore 時、本 arc の 6 mode 結果 + 未特定 open thread を再開 signal で参照。v0.2.5 candidate feature の優先順位 (channel_n_asymmetry_warning 最優先) は本 arc の bad-bytes 完全的中 evidence 基。

## Ground truth pointer

- **Full results**: `C:\Users\user\benchtop-harness\observations.md` (実測結果 + 予想とのずれ、README 未修正で歴史記録保持)
- **Checklist**: `C:\Users\user\benchtop-harness\checklist.md` (修正版予想シート、記入済み)
- **CSV**: `C:\Users\user\benchtop-harness\csv\*.csv` (6 mode + normal-2 の実測 data)
- **TX log**: `C:\Users\user\benchtop-harness\logs\*.log` (emitter stderr = ground truth)

## 6 mode 結果 summary

| mode | 判定 | 決め手 | duration_s |
|---|---|---|---|
| normal-1 | ○ | 30/30/30 chan | 2.933 |
| crlf-mixed | ○ | normal と 1 文字違わず一致 (A-3 bit-identical 予想 real-time verify) | 2.93 |
| line-cut | △ | cut 機構完全実証、発火数 5→4 (原因特定: port open→read loop 2s で 5 発目吸収) | 15.572 |
| bad-bytes | ○○ | H.n = 23 完全的中、skipped=0/partial=false で silent 損失 実証 | 2.93 |
| digit-change | ○ | 検出不能を confirm (negative finding 成立) | 2.93 |
| silent | ○ | 沈黙 timeout 2 回、t に 5.103s gap 1 箇所 (row 10→11) | 20.205 |
| normal-2 | ○ + [0] 欠落 | z 検定は差なし、TX log 照合で先頭 1 行欠落 detect | 2.846 |

silent のみ `samples=50` (先頭 timeout 吸収)、他は `samples=30`。

## 4 point 照合結果

| # | 検証項目 | 結果 |
|---|---|---|
| 1 | normal-1 vs normal-2 z ≈ 0.000 | ○ T:0.035 / H:0.020 / V:0.018、全 `significant_shift: false` |
| 2 | TX log `[0] TX` = CSV 1 行目 | **× normal-2 で先頭 1 行欠落を detect** (6 session 中 1 本のみ) |
| 3 | bad-bytes の H.n = 23 | ○ 完全一致 |
| 4 | line-cut の CSV `t` 列 ~2s ジャンプ | ○ ただし 5 箇所でなく 4 箇所 |

## 予想外の 2 発見 (source read では絶対に出ない)

### 発見 1: D-3 = benchtop-mcp が port を解放しない (実運用 blocker)

最初の `measure(port="COM11")` 以降、MCP server が生きている限り COM11 を掴み続ける:
- 外部プロセス `PermissionError(13)` (drain.py が使用不能に)
- pyserial の DTR/RTS が下がらず emitter 側 `--wait-for-reader` も機能不能
- 受信 queue に溜まり続け、measure と measure の間のデータが次 session 先頭に混入
- `measure(port="mock")` を挟んでも解放されない (port 別 handle 保持)

時系列で確定: server 起動 (18:28) 後、最初の measure (21:46) 以前は drain 成功、以降すべて `PermissionError`。

**v0.2.5 candidate #2 として明確化**: measure 終了時 close または `close_port()` tool 追加。

### 発見 2: TX log 照合が normal-2 の [0] 欠落を実 detect

- `compare_sessions(normal-2, normal-1)` = 全 chan z ≈ 0、`significant_shift: false`
- `logs/normal-2.log`: `[0] TX 'T=24.957,H=47.91,V=3.2994\n'`
- `csv/normal-2.csv`: `0.0024,25.211,47.94,3.2925` ← `[1]` から始まっている

⇒ **z 検定は「差がない」と言い、TX log は「1 行失っている」と言った**。

preflight で 「z≈0.000 は再現性の証明であって取りこぼしが無いことの証明ではない」として checklist に追加した照合項目**そのもの**が、6 session 目で実 firing。この 1 行を足していなければ、実際にデータを失っている session を「harness 健全」と判定していた。

**これは [[feedback-external-verify-beats-internal-review-4patterns-2026-08-13]] の 5 発目**。

## 2 open thread (未解決 = findings ではなく open として保存)

### Open 1: normal-2 [0] 欠落の原因

- 6 session 中 1 本のみ = 系統的でなく偶発的 race の可能性が高い
- 候補仮説 3 つ (どれも未確定):
  - D-3 の累積効果 (session が進むにつれ内部 state が drift)
  - emitter が COM10 open 時の DTR flap が com0com 内部 state を reset
  - session 6 で emitter/benchtop coordination timing が race edge に hit
- 再現性 verify までは「1 event 検出」として保存、「systematic loss」と呼ばない discipline (藤本さん明示)

### Open 2: line-cut 5→4 と normal-2 [0] は harness 環境の timing (benchtop-mcp defect ではない)

- 混同すれば「benchtop-mcp に 3 defect 発見」の過大主張に
- 正確には: D-3 = benchtop-mcp 側 defect / line-cut 5→4 = harness (port open→read loop 2s) / normal-2 [0] = harness or com0com 側 timing
- 藤本さん明示訂正: 検証対象の欠陥として数えると過大評価

## D-2-4 追加 refinement (silent trial で判明)

preflight 段階では `duration_s = 「先頭行 → 最終行の幅」` と定義していたが、silent の 「samples=50 で先頭 timeout 6 回 12.27s」実測で refinement:

- **`duration_s = 開始 → 最終行の t`** (rows[-1]["t"])
- 先頭 timeout は rows[0].t に焼き込まれる → 含まれる
- 末尾 timeout は rows に追加されない → 含まれない
- **非対称性**: head timeout 含む / tail timeout 含まない

normal では先頭行 `t ~0.001` なので両者が一致して見えていた。silent が非対称性を露出させた = source-only では絶対に出ない observation。

## v0.2.5 candidate feature (実測後の優先順位)

1. **`channel_n_asymmetry_warning`** — bad-bytes 完全的中 evidence 基、最優先。session 内で ch 間 `n` が有意違いなら flag、`skipped=0` では絶対気付けない
2. **port を解放する** — D-3。他 tool 共存不能 + session 間 data 混入の両方解消
3. **`duration_s` 定義明記または改名** — `span_s` / `last_row_t_s`。破壊的変更避けるなら docstring 1 行で
4. **`plot_session` / `measure` にも `duration_s` を載せる** — A-1
5. parse の strict mode (定義済 ch が揃わない行を skip) — line-cut
6. session summary に行内 channel カバレッジ分布 — line-cut

## 藤本さんの reflection (structural insight)

**予想と 実測の 面白さの 差**:
- bad-bytes 的中 = 嬉しいが 驚きでない (regex を 読めば 導ける、正しく推論できていた 満足感)
- 本当に 面白かったのは 誰の予想にも載っていなかったもの (port 非解放 / com0com buffering / open→read loop 2s / duration_s 非対称)、 execution だけから出た

**structural claim**: **「review と execution は原理的に違うものを見ている」**
- review = symbolic (source 上の契約書を読む)
- execution = causal (契約書に書かれていない副作用を観測する)
- D-3 (port 非解放) は「open した後に close する」と source に書かれていない = 契約書は「後で close する」とも「決して close しない」とも明言していない
- review では「書かれていることの妥当性」は見えるが「書かれていない ことの事実」は見えない = **execution だけが空白部分を埋める**

「4 波レビューで見つからなかったものが、mock を数回叩いた 10 分で 4 つ出た」 = レビューが甘かったのではなく **レビューと実行が原理的に違うものを見ている 証拠**。

## 一番効いた 1 行

TX log 照合を checklist に足した 1 行。「z≈0 では取りこぼしが見えない」と理屈で言っただけの項目が、6 session 目で実 firing。理屈が現実に当たる瞬間 (feedback pattern の 実例)。

## 関連 memory

- [[project-benchtop-harness-pause-state-2026-08-13]] — 本 Phase 3 前の pause state (帰宅前)、この arc の起点
- [[project-2026-08-13-arc-close-state-home-restore]] — 帰宅前 2 arc close state、本 Phase 3 は帰宅後の追加 arc
- [[project-benchtop-mcp-v022-review-2-pack-2026-08-13]] — 検証対象 benchtop-mcp v0.2.4 (frozen)
- [[feedback-external-verify-beats-internal-review-4patterns-2026-08-13]] — 本 arc TX log 照合 firing = 5 発目追加 evidence (別 file update)
- [[feedback-defect-class-input-vs-lifecycle-2026-08-13]] — 本 arc bad-bytes vs D-3 の defect class 直交性 (別 file 新規)
- [[feedback-arc-close-discipline-2026-08-13]] — 帰宅前 arc の discipline 継承
- [[feedback-mcp-server-verify-3layer-diagnosis-2026-08-13]] — MCP verify 3 層診断 template、D-3 発火時の切り分け原型
- [[feedback-one-reproduction-over-ten-unverified]] — 「十本の未検証より一本の再現」精神系
- [[feedback-critique-response-pattern]] — 私が SAC-4 で 2 turn 連続 preflight 誤読を認諾 (T.n=25 由来 + partial scope)

## 藤本さんの close signal

「はい！memory化 進めて頂けますか？」 = 本 arc を memory 永続化する明示 signal。3 file (本 file + feedback 5th 例目追加 + defect class 新規) で保存。

## Version

- v1 initial: 2026-08-13 藤本さん帰宅後 Phase 3 完了、observations.md 完成、6 mode 予想検証 + 2 発見 + 2 open thread の完全記録
