---
name: project-benchtop-mcp-v022-review-2-pack-2026-08-13
description: benchtop-mcp v0.2.0 → v0.2.1 → v0.2.2 → v0.2.3 の 3 波 review-driven pack 実装記録 (v0.2.3 追加 = compare docstring 自己矛盾撤回 + welch_df 露出 + zero_variance/insufficient_samples guard)。 chat-Claude 2026-08-12 tools launch arc で生まれた fc0web/benchtop-mcp を、 Rei-AIOS session 経由で 藤本さん 3 回 review を受けながら 3 tool 拡張 + 責任分界 explicit 化 + partial 下流波及 + plot legend contract + 統計解釈整合 + zero variance guard まで整えた 8 時間 arc。 「作った側の記録は verify 結果を待たず保存」 運用原則の 初適用例 + 「claim 単位に status field を持たせて 早く保存しても嘘にならない型」 v0.2.3 で 確立。
metadata: 
  node_type: memory
  type: project
  originSessionId: 76881bd4-5f34-41f3-bdf8-75d61ecec2b8
  modified: 2026-08-13T01:07:33.536Z
---

# benchtop-mcp v0.2.0 → v0.2.1 → v0.2.2 → v0.2.3 review-driven pack (2026-08-13)

## 起点

2026-08-13 藤本さん Rei-AIOS session で 「chat-Claude が挙げた 4 期待分類 (MCP / Skill / GPTs 拡張 / 教育) の中で 個人が参入しやすい MCP サーバー を、 既存 benchtop-mcp の拡張路線で先へ」 選択。 Recommended Option A (`plot_session` + `compare_sessions` + `search_sessions` の 3 tool pack) から出発、 藤本さん **3 回 review** を受けて 責任分界と下流契約 + 統計解釈整合を 全部詰め切った 8 時間 arc。

## 検証ステータス表記 (本 pack で v0.2.3 に確立 + v0.2.4 で 拡張、 藤本さん指摘 per)

「作った側の記録は verify 結果を待たず保存」 原則を **「早く保存しても嘘にならない」** に転換するため、 本 pack 内の各 claim に 検証ステータスを 明示する:

- `[self_verified]` = 本 session 内 `--selftest` 全 phase green で 確認済 (core logic の 静的動作)
- `[pending_external]` = 藤本さん Claude Desktop 側 実 MCP protocol 動作 verify 未了、 or 実装置接続未実施
- `[design_only]` = 設計判断のみで 実装未着手 (v0.3+ defer 事項)
- **`[external_verify_derived]`** (v0.2.4 で 新設) = 藤本さん 実 verify 中に **発火した gap** 由来の 変更。 self-review 4 波 (v0.2.0 → v0.2.3) では 検出できず、 1 回の 実 verify で 出た pain。 「レビュー loop より 外部検証」 の 実証 evidence として tag する。

3 ヶ月後の 自分が 本 pack を読んだ時、 各 claim の verify 段階 + 由来 (self-review vs external-verify) が 区別可能。 特に `[external_verify_derived]` の 存在は 「self-review だけで 全 gap は 潰せない」 の 反証として 保存価値が 高い。

## 3 波 progression

### v0.2.0 (commit e4a0fb5、 2026-08-12→13) [self_verified, pending_external]

- 3 tool 実装: `plot_session` (ASCII sparkline 8 段階、 依存なし) / `compare_sessions` (Welch 型 z-score、 |z|>3.0 で `significant_shift`) / `search_sessions` (date range + note keyword + port + channel の AND filter)
- selftest 6 phase → 9 phase 全 green
- 副次修正: Windows CP932 端末で Unicode block char (U+2581-U+2588) が selftest 出力できない latent bug を `sys.stdout.reconfigure(encoding='utf-8')` で解消 (MCP stdio transport は UTF-8 JSON なので実運用影響なし、 selftest のみ)
- version 0.1.0 → 0.2.0、 MIT 不変

### v0.2.1 (commit 3ed24b1、 2026-08-13) — 藤本さん第 1 波 review 対応 [self_verified, pending_external]

**藤本さん指摘 5 点 全反映**:

1. handoff 誤記: 「新 3 tool」 vs 4 個並ぶ test prompt → 訂正 (`measure` は v0.1 既存)
2. 再起動後 「使える tool を全部挙げて」 で load 失敗検出 step → README §3.5-a に明示
3. **一番の穴 = compare 責任分界**: 「Welch でも t-test でもない gate」 と書いたが hidden default (|z|>3.0) が 「毎回違う答え」 の原因 → **Option 2 実装** = `z_threshold: float = 3.0` を explicit parameter 化、 return dict に `z_threshold_used` を top-level + per-channel mirror、 `z_threshold <= 0` は `ValueError`
4. 抜けている case:
   - seed data 前提: README §3.5-b で seed-A/B/C の 3 session 生成 step 明示
   - 0 件 / 存在しない id: `_load_session_or_error(session_id)` helper で 4 tool (`plot` / `analyze` / `compare` × 2 / `export`) に structured error dict (`{"error": "session_not_found", "session_id": ..., "hint": ...}`) 適用
   - measure 途中失敗: `Session.aborted_at` + `abort_reason` field (dataclass default None で v0.1/v0.2.0 JSON 後方互換)、 measure loop に `try/except (KeyboardInterrupt, Exception)`、 MCP return dict に `partial` + `abort_reason`
   - plot 複数 channel: 既実装確認 (`for ch in session.channels`)
   - plot 軸ラベル/単位: v0.3 defer 明示 (v0.2.x scope 外)
5. Step 3 判定基準 (「4 tool 目候補を拾う」 hook): README 「次にやるとよいこと」 #4 に AND 2 条件 (3 step 以上 AND 週 1 以上) 明記
- selftest 9 phase → 12 phase 全 green (phase [10] invalid id / [11] threshold explicit / [12] `_FailingDevice` で partial 保存 verify)

### v0.2.2 (commit c89581c、 2026-08-13) — 藤本さん第 2 波 review 対応 [self_verified, pending_external]

**藤本さん指摘 3 点 + 運用 1 点 全反映**:

1. **(c) が 8 割** = z の分母が何か明示されていない:
   - docstring に 式そのものを書く: `z = (mean_A - mean_B) / sqrt(σ_A²/n_A + σ_B²/n_B)`
   - 分母 = per-sample SD ではなく **平均の標準誤差 (SE) の Welch 合成** = 藤本さん指摘の 「厳しい側」 (n=100 で 「平均が 0.3σ ずれれば z=3」 に相当)
   - この非対称性は仕様 (「平均そのもののズレ」 を見たいので n で割り込む)
   - **LLM の出力語彙まで縛れない** = docstring は human caller には届くが LLM は 「有意です」 と喋る → return dict に 4 field で機械可読契約:
     - top-level: `is_hypothesis_test: false` / `disclaimer: "significant_shift is a boolean gate on |z| > z_threshold. Not a p-value. Not a Welch's t-test. Not a statistical hypothesis test."` / `z_formula: "z = (mean_A - mean_B) / sqrt(sigma_A^2 / n_A + sigma_B^2 / n_B)"`
     - per-channel: `interpretation: "threshold_gate_on_welch_standard_error"`
   - LLM がこれらを active に無視しないと 「有意です」 と再定義できない設計
2. **(d3) の下流が未処理** = `aborted_at` / `abort_reason` を Session に持たせたが下流に mirror されない:
   - `analyze_session` → top-level `partial` + `abort_reason`
   - `plot_session` → top-level `partial` + `abort_reason`
   - `compare_sessions` → top-level `any_input_aborted: bool` + `aborted_inputs: ["a"] or ["b"] or ["a", "b"]`、 per-input dict にも `partial` + `abort_reason`
   - `search_sessions` / `list_sessions` → 各 result row に `partial` + `abort_reason` (contract parity)
   - **非対称 n の compare (partial n=37 vs clean n=100) が静かに z を歪める** → `any_input_aborted: true` で explicit 検出
3. **(d5) plot legend v0.2.x に入れる**:
   - per-channel dict に `label: str` field (= channel 名だが contract として explicit)
   - top-level に `channels_order: [str]` (Python dict insertion order 依存でなく契約として明示、 render 順を tool 側で固定)
   - 単位 (unit) は v0.3 defer 継続
4. **運用面**: memory 保存を verify 待ちで pause は過剰 → 「作った側の記録は verify 結果を待たず保存」 (verify 転けたときの差分が取りやすい) → **本 memory pack (この file) が 初適用例**
- selftest 12 phase → 13 phase 全 green (phase [13] partial 下流波及 verify: `analyze.partial=True/False` / `plot.partial=True/False` / `cmp.any_aborted=True/False` / `cmp.aborted_inputs=['b']` / `search.partial=True/False`)

### v0.2.3 (commit 7d0483d、 2026-08-13) — 藤本さん第 3 波 review 対応 [self_verified, pending_external]

**藤本さん指摘 3 点 (実害寄り 1 + 解釈整合 2) + 運用 1 点 全反映**:

1. **docstring 自己矛盾撤回** = v0.2.2 で書いた 「Welch's t-test でも t 分布 CDF による厳密検定でもない」 は、 式 `z = (mean_A - mean_B) / sqrt(σ_A²/n_A + σ_B²/n_B)` そのものが **Welch t 統計量** なので 統計を知っている読み手には矛盾。 訂正 = 「statistic は Welch t と同一、 異なるのは判定則 (df 依存 critical value vs 固定閾値)」 と書き分け。 `interpretation` string: `"threshold_gate_on_welch_standard_error"` → `"welch_t_statistic_with_fixed_z_threshold"`。 disclaimer 文面も同期 (「What differs from a Welch's t-test is the decision rule...」)。
2. **Welch-Satterthwaite `welch_df` 露出** = 固定閾値 3.0 は n 依存 (n=5 で df≈8 なら本来 2.8〜4.6 必要 = 甘い側、 n=100 で df≈198 なら α≈0.003 相当 = 厳しい側)。 partial session は n 任意小なので gap 3 (下流波及) と繋がる。 df 公式 = `(σ_A²/n_A + σ_B²/n_B)² / ((σ_A²/n_A)²/(n_A−1) + (σ_B²/n_B)²/(n_B−1))` を per-channel `welch_df` として 露出、 caller が 「今回の n で 固定閾値を信用できる範囲か」 を自分で判定可能。
3. **実害寄り: zero_variance / insufficient_samples guard** = 旧実装 (v0.2.2 まで) は `if se > 0 else 0.0` で 分散ゼロ時 z=0.0 を返し、 `abs(z) > 3.0` が False で **「差が無い」 と 静かに報告** する silent bug。 mock 定数装置 (σ=0) や partial × n=1 (stdev 未定義) で発火。 v0.2.3 で guard を 2 分離:
   - `n_A < 2` or `n_B < 2` → `gate_skip_reason: "insufficient_samples"`
   - `σ_A²/n_A + σ_B²/n_B == 0` → `gate_skip_reason: "zero_variance"`
   - どちらも `mean_shift_z / welch_df / standard_error / significant_shift` は 全て `None` (False は 「差が無い」 誤読可能、 None は 「未評価」 signal)
   - 新 field: `gate_evaluable: bool` + `gate_skip_reason: str | None`
4. **memory pack 検証ステータス型** = 「作った側の記録は verify 待たず保存」 原則を 安全に回す条件として、 pack 内 各 claim に `[self_verified] / [pending_external] / [design_only]` の 検証ステータスを 明示。 「早く保存する」 → **「早く保存しても嘘にならない」** に転換。 本 pack の 冒頭 「検証ステータス表記」 節 + 各 version 行 tag で 初適用。

- selftest 13 phase → 14 phase 全 green:
  - phase [11] に `welch_df` 非 None 確認追加 (n=60 で df≈89 実測)
  - phase [13] `interpretation` string を 新値に更新
  - phase [14a] `_ConstDevice` (常に 3.3 返す) で zero_variance guard 発火 verify
  - phase [14b] `_FailingDevice(fail_after=1)` で insufficient_samples guard + top-level partial 併存 verify
  - phase [14c] guard 独立性 (V channel zero_variance と T channel 正常 が 同 return dict で共存)

### v0.2.4 (commit 1940bc1、 2026-08-13) — 藤本さん 実 verify 発火 pain fix [external_verify_derived + external_verified]

**★★ fix verify も external で 到達**: 2026-08-13 藤本さん が push 直後の v0.2.4 を **同 env / 同 query / 同 data** で 実測:
- before (v0.2.3): `search_sessions(since='2026-08-13', note_contains='seed')` → **0 件**
- after (v0.2.4): 同 query → **3 件** (seed-A/B/C 全 拾える)
- audit trail: `since_resolved_utc: "2026-08-12T15:00:00+00:00"` / `since_date_only: true` / `tz_used: "local"` (BENCHTOP_TZ 未指定 なので system local = JST 認識)
- `started_at_local: 2026-08-13T08:46:26+09:00` = session_id date と 一致 (user 心理的直感 復元)

「発火 gap の 由来 = external + 修正 verify 到達 = external」 = 両段 external 到達 = **私 (Claude Code) が 到達できない form の verify レベル**。 「self-review では 潰しきれない gap の 種類」 を pain 発火 + fix verify 両方 実 data で 保存できた 初 case。


**★ 由来の違い**: v0.2.0-v0.2.3 は self-review (私の proposal → 藤本さん review 3 波) で 進んだ 4 段。 v0.2.4 は **藤本さん が Claude Desktop で § 3.5-b/c 実 verify を 全 pass 通した直後**、 その verify 過程で **実際に踏んだ pain** の fix。 self-review 4 波では 見つからず、 1 回の 実行で 出た。 memory pack tag に `[external_verify_derived]` を 新設 (藤本さん指摘 per、 「レビュー loop より 外部検証」 の 裏付け保存)。

**藤本さん verify 中 発火 pain 2 件**:

1. **[external_verify_derived] pain (1): 日付ずれ** — `search_sessions(since='2026-08-13', note_contains='seed')` で **0 件**。 session_id は local time (JST) 「20260813-0846」、 started_at は UTC 「2026-08-12T23:46:26+00:00」 = 日付が 1 日ずれる。 「今日以降」 で 検索すると 朝 9 時前計測は 全部 消える (JST + UTC = 早朝 timezone 境界問題)。
2. **pain (2, defer): sparkline スケール潰れ** — mock 3% 外れ値機構の 1 点 (T=27.454) が最大値 → 残り 29 点が 最下段に潰れる → 波形読めない。 sparkline の 数学的性質 (min/max 正規化) の限界、 clip は 「隠す」 選択 = 意味論設計先要 = v0.2.5+ or 別 tool defer 判断。

**v0.2.4 実装 (pain (1) のみ)**:

私 初回 scope 案は `started_at_local` field 追加 のみ = **症状を直していない** (0 件時に 見るべき返り値の 行が存在しない、 空振り diagnosis の 主役にならない、 藤本さん指摘)。 **input 側 fix** が 正解:

1. **主 fix**: `search_sessions` の `since` / `until` が **日付のみ文字列** (`YYYY-MM-DD` 正規表現一致、 T なし) を検出 → **local midnight として解釈** し UTC 換算 (`since` = 当日 00:00 local、 `until` = 当日 23:59:59.999999 local)。 完全 ISO (T + 時刻 [+ offset]) は 従来通り 厳密。 tz は `BENCHTOP_TZ` env 優先、 無ければ system local (`zoneinfo` 利用、 Python 3.9+ 前提)。
2. **audit trail**: 返り値 `filters` に `since_resolved_utc` / `until_resolved_utc` / `since_date_only` / `until_date_only` / `tz_used` を 併記 (機械可読 trace、 意図と違えばすぐ判別)。
3. **副 追加**: `started_at_local` field を 各 tool (search / list / analyze / plot / compare a/b) に追加。 主 fix と 独立に 動く、 **補助 位置付け** (主役ではない)。
4. **helper 関数 2 個**: `_resolve_date_boundary(s, is_since) → (resolved, meta)` + `_to_local_iso(utc_iso) → local_iso`、 module-level で 再利用可能。
5. **behavior change の 取扱**: 日付のみ指定の 挙動変更 = 厳密には behavior change。 但し 「UTC 基準の 日付のみ指定を 意図的に使っていた caller」 は 現実に 存在しない想定 (いたら それが 今回のバグ) = **breaking 扱いしない**、 README 明記。
6. **`Bench.search_sessions` の signature**: `_meta_out: dict | None = None` optional param 追加 (dict 渡されたら resolve 結果を書き戻す)。 既存 caller (selftest phase [9] 等) は `_meta_out` 渡さず = **完全 backward compat**。

- selftest 14 phase → 15 phase 全 green:
  - phase [15a] date-only 'since=2026-08-13' → resolved_utc='2026-08-12T15:00:00+00:00' (JST 8/13 00:00 = UTC 8/12 15:00) date_only=True tz=Asia/Tokyo
  - phase [15b] 完全 ISO 'since=2026-08-13T00:00:00+00:00' → 従来通り 厳密 (resolve せず そのまま) date_only=False
  - phase [15c] **藤本さん verify 発火 case 再現**: fake session (started=UTC 8/12 15:30 = JST 8/13 00:30) が since='2026-08-13' で **拾える** (旧 v0.2.3 では 拾えなかった)
  - phase [15d] `started_at_local` 補助 field が search / analyze / plot / compare で `+09:00` 一貫
  - test 内 `os.environ["BENCHTOP_TZ"] = "Asia/Tokyo"` 一時設定 + finally で復元 (副作用ゼロ)

## 実装成果 summary (v0.2.4 時点)

| metric | v0.1 | v0.2.0 | v0.2.1 | v0.2.2 | v0.2.3 | v0.2.4 | 検証 status |
|---|---|---|---|---|---|---|---|
| MCP tools | 6 | 9 | 9 | 9 | 9 | 9 | self_verified |
| selftest phases | 6 | 9 | 12 | 13 | 14 | 15 | self_verified |
| 依存 (runtime) | mcp+pyserial | +なし | +なし | +なし | +なし | +zoneinfo (Python 3.9+ 標準) | self_verified |
| File size | 515 行 | 800 行 | 900 行台 | 1000 行台 | 1100 行台 | 1250 行台 | self_verified |
| Docstring 統計解釈整合 | — | tool 分のみ | 責任分界 explicit | z 式明示 (但し 「t-test でない」 と矛盾) | 矛盾撤回 / statistic=Welch t、 判定則が違う で 書き分け | (v0.2.3 と 同じ、 date-only 解釈のみ 追加) | self_verified |
| Contract fields | 標準 | +sparkline / +z / +search filter | +z_threshold_used / +structured error / +partial | + z_formula / +is_hypothesis_test / +disclaimer / +interpretation / +any_input_aborted / +aborted_inputs / +label / +channels_order / 下流 partial mirror | + welch_df / +gate_evaluable / +gate_skip_reason / +interpretation string 更新 | **+ started_at_local (search/list/analyze/plot/compare) / +filters.since_resolved_utc / +until_resolved_utc / +since_date_only / +until_date_only / +tz_used** | self_verified |
| Zero variance / small-n guard | なし (silent bug) | 同 | 同 | 同 | 明示 guard 2 分離、 significant_shift=None | (v0.2.3 と 同じ) | self_verified |
| Date-only 解釈 | UTC 辞書順比較 (silent bug JST 早朝) | 同 | 同 | 同 | 同 | **local midnight 換算 (BENCHTOP_TZ or system local)** | **external_verified** (藤本さん before/after 実測、 下記) |
| Claude Desktop 実 MCP verify | — | — | — | — | 未実施 | **§3.5-b/c 全 pass (JST 環境 2026-08-13)** | **external_verified** |
| v0.2.4 fix 効果 (before/after 実測) | — | — | — | — | 同 query 0 件 (silent bug) | **同 env / 同 query / 同 data で 3 件** (2026-08-13 藤本さん実測) | **external_verified** |
| License | MIT + trajectory | MIT 不変 | MIT 不変 | MIT 不変 | MIT 不変 | MIT 不変 | self_verified |
| commit | 0d11269 | e4a0fb5 | 3ed24b1 | c89581c | 7d0483d | 1940bc1 | self_verified (push 完) |

## 「責任分界」 の operational 定義 (本 arc で確立)

藤本さん 3 波 review + v0.2.4 実 verify 発火 pain fix を通して詰まった 「tool と caller の責任境界」 **7 原則** (v0.2.4 で 7th 追加):

1. **hidden default は 「毎回違う答え」 の温床** → parameter として explicit 化 (v0.2.1 の `z_threshold`)
2. **docstring は human caller には届くが LLM 出力語彙は縛れない** → return dict に 意味論を機械可読 field として置く (v0.2.2 の `is_hypothesis_test: false` / `interpretation` / `disclaimer`)
3. **計算式そのものを docstring に書く + 統計解釈整合を維持** → 「Welch 型」 という単語だけでは分母が per-SD か SE か 曖昧 (v0.2.2 の `z_formula`)。 但し 式明示すると **統計を知っている読み手には 式そのものと言い訳の間で 自己矛盾を起こしうる** ので 「statistic は同一、 判定則が違う」 と 書き分け必須 (v0.2.3 訂正)、 加えて 判定閾値の n 依存性を audit 可能にする補助情報 (`welch_df` 等) も同時に露出
4. **失敗情報は下流に mirror** → session の `partial` を analyze / plot / compare / search 全てに波及 (v0.2.2)、 特に compare の 非対称 n 検出 (`any_input_aborted`)。 加えて 数値経路 (分散 0 / 極小 n) で計算が退化する silent bug も 明示 guard で 「未評価」 signal (`None`) に分離、 `False` に落として 「差が無い」 と 誤読させない (v0.2.3)
5. **判定基準は 「気分」 でなく 「AND 2 条件」 で明記** → 4 tool 目候補の hook criteria (v0.2.1 の 3 step 以上 AND 週 1 以上)
6. **記録 (memory pack) の各 claim に 検証ステータスを持たせる** → 「作った側の記録は verify 待たず保存」 を 安全に回す条件。 `[self_verified] / [pending_external] / [design_only]` の 3 値を metric table 各行と 各 version 行 tag で 明示。 「早く保存する」 → **「早く保存しても嘘にならない」** に転換 (v0.2.3、 本 pack が 初適用例)。 v0.2.4 で `[external_verify_derived]` を 4th 値として 追加
7. **fix の 由来 (self-review vs external-verify) を tag 分けて 保存する** → self-review 4 波で 見つからず 実 verify で 出た pain は `[external_verify_derived]` で 明示。 「レビュー loop で コードは 綺麗になり続けるが 不確実性は 減らない」 pattern を 数字化 (v0.2.0-v0.2.3 の 4 段 self-review 対 v0.2.4 の 1 回 実 verify で 発火した gap = 実測 データ)。 pain 発火は self-review では 潰しきれない 種類の gap (timezone / OS 環境依存 / 実 network protocol / user 心理的 mismatch 等) が 主 = **external-verify の 代替は self-review でない**。 memory pack に tag 分離で 保存すると、 後で 「self-review で 潰せた gap の 種類 vs 潰せなかった gap の 種類」 の 傾向 audit が 可能に (v0.2.4、 本 pack で 初適用)。 **★ 藤本さん総括 (2026-08-13 arc close)**: 「今回の arc で 一番価値があったのは 4 波のレビューではなく、 1 回実際に動かして出た 日付ずれ」 = 5 段 (v0.2.0-v0.2.4) の 実 data から抽出した 藤本さん独立 conclusion。 self-review N 波の 総 value < external-verify 1 回の value という 順序関係が 実測 evidence 付きで 記録された。 次の arc の pace 判断 (self-review 段数 vs external-verify 早期投入) に 適用可能。 「次の gap も 同じ場所から出る — 実装置を繋いだとき、 別環境で動かしたとき、 誰かが想定と違う使い方をしたとき」 (藤本さん締めコメント) = pain 検知 source の 3 分類、 将来 gap 予想の template

これらは benchtop-mcp 内部の話ではなく、 **将来の類似 project (Rei-AIOS 側 MCP server / API 設計 + memory 運用) で 発火するかを observe する候補 pattern** として 記録する。 [[project-25-load-bearing-inventions]] #2 digital_ethics (「外部 API 敬意」 = FLOWING) の operational 拡張と読める構造的類似性はあり、 6th (memory verification status) は 対 自己 (retroactive audit) の 対称構造で 対 API との構造対応が示唆される。

**★ 但し 「universal principle」 と呼ぶには 根拠が薄い** (藤本さん第 3 波 review 指摘): 抽出元は **n=1 の project + 外部で 1 度も動かされていない状態**。 別 project で 独立に 同じ 6 原則が 発火するか は 未検証。 現状は 「1 project の operational 記録」 段階に留め、 principle 段階への 昇格は 少なくとも 2 個目の独立 project observe まで保留。 これは 本 pack の honest scope に 明記済。

**★★ 昇格 stance の 追加 訂正** (藤本さん 2026-08-13 rei-fpga arc close 時 指摘 per): [[project-rei-fpga-4stage-loop-penetration-2026-08-13]] arc で 「n=1 → n=2 部分昇格」 と 一時 主張したが 撤回済。 rei-fpga arc は **同じ人 (藤本さん + Claude Code)・同じ日 (2026-08-13)・同じ進め方 (Rei stack 内 arc)** で 実行 = 独立性 弱く、 実質 **n=1 のまま**。 「別の人が 別の文脈で 使って 機能した」 evidence が入るまで 保留継続、 「2 例目」 と 数える資格は なし。 私 (Claude Code) 側の 「applied by different project」 の 意味を **同一 arc 進行 vs 真の独立検証** で 混同していた。 対策: 今後 「principle が 別 project で 動いた」 と 書く前に 「実行者・実行日・実行方の 独立性」 を verify する discipline を 加える。

## honest scope

- **novelty ゼロ** [self_verified]: 全 tool は 既知パターン (matplotlib-free sparkline / Welch t 統計量 / date+keyword filter / try/except partial save / Welch-Satterthwaite df / zero variance guard) の組合せ。 「新規発明」 主張ゼロ。 v0.2.3 追加の `welch_df` は 1946 年由来公式の 直接実装。
- **★ 「責任分界 6 原則」 の universal principle 主張は 根拠が弱い** [design_only, 藤本さん第 3 波指摘 per]: 原則自体は妥当に見えるが、 抽出元は **n=1 の project (benchtop-mcp) + 外部で 1 度も動かされていない状態** で得たもの。 「universal principle として持ち帰り」 と 書いたのは overclaim。 対 API + 対 自己 (memory audit) の 2 軸で 型が 一致するのは 構造的示唆だが、 別 project で 独立に 同じ 6 原則が生まれるか は 未検証。 6 原則を Rei stack 全域に 波及させる前に、 少なくとも 2 個目の独立 project (次に生まれる MCP server / API) で 発火するか observe すべき。 現状は 「1 project の operational 記録」 段階、 principle 段階の 昇格は保留。
- **welch_df 実測 verify** [self_verified, 2026-08-13 藤本さん第 3 波指摘 fu]: 3 run で manual Welch-Satterthwaite df と tool 返却値の 一致確認 (|Δ|<0.001)。 df=89 (前回 selftest) は ddof 取り違えでも n_A ≠ n_B でもなく、 MockDevice の 3% 外れ値 mechanism (±2-4°C spike が 1 sample あるだけで σ が 10 倍跳ねる) による σ 変動の中央付近。 σ ratio 1.09x で df=117, 11.38x で df=59.9, どちらも Welch-Satterthwaite 式が予測する範囲内。 実装 sound。 (verify script は scratchpad に置いて commit せず、 selftest phase [11] の `df > 50` の 緩い assertion は 外れ値 lottery に耐える形で維持。)
- **売れる条件 3 点 fit は変更なし** [design_only] (README §License 節継承): 誰もが必要 + 自作面倒 + 静かに壊れて高い。 但し Product Transition Judgment Framework v0.1 の 5 checklist は依然 0-1 件該当 = **無料継続 default**、 有料化検討開始基準未達。
- **v0.2.x scope 内 vs 外**:
  - scope 内 (完) [self_verified]: plot / compare / search 実装 + 責任分界 explicit + partial 下流 mirror + plot legend + 統計解釈整合 + zero variance guard
  - scope 外 [design_only] (v0.3+ defer): 軸 unit metadata / 連続ロギング / 閾値アラート / 校正記録 / 監査ログ (有料 tier 予告済み機能と競合しない範囲維持)
- **統計的厳密性** [self_verified]: `compare_sessions` の `mean_shift_z` は **Welch t 統計量そのもの** (v0.2.3 で明示訂正)、 `significant_shift` は **固定閾値による gate** (Welch's t-test の p-value ではない)。 これを p-value と誤読させないための 6 field 契約 (`is_hypothesis_test`, `disclaimer`, `z_formula`, `interpretation`, `gate_evaluable`, `gate_skip_reason`) は v0.2.2 で完成、 v0.2.3 で `welch_df` + guard fields 追加。 但し LLM 側が field 名を無視して 「有意です」 と喋る自由は依然存在 (tool 側は 「反証手段」 を提供したが完全阻止はできない、 caller discipline 側の責任)。
- **`welch_df` の 使い方** [self_verified]: caller が 「今回の n で固定 3.0 が甘い/厳しい」 を 判定するための audit 情報。 tool 側は t 分布 CDF を実装しない (依存を増やす + 精度議論を招く)。 caller が より厳密な判定を欲しい場合、 `mean_shift_z` + `welch_df` を scipy.stats.t.sf 等に流すのが 推奨経路。
- **Guard の設計判断** [self_verified]: `gate_evaluable=false` 時 `significant_shift=None` (bool `False` ではなく)。 理由 = `False` は 「差が無い」 と 誤読可能、 `None` (JSON `null`) は 「gate 未評価」 意味論。 LLM prompt でも 「significant_shift が null → gate 未評価」 が 直感的に読める設計。
- **plot legend の value 契約** [self_verified]: `label: ch` は現状 channel 名そのままだが、 将来 unit metadata が入る v0.3 で `label` が human-readable (「温度 [℃]」 等) に変わっても契約が保たれる想定。 caller は `channels[ch].label` を legend として使い、 dict key に直接依存しないのが推奨。
- **selftest の Bench._devices 直接操作** [self_verified]: phase [12] の `_FailingDevice`、 phase [14] の `_ConstDevice` 挿入は implementation detail に依存する内部 test であり、 public API 契約ではない。 test 用途に限る。
- **verify 責任** [self_verified in-repo, pending_external out-of-repo]: `--selftest` 14 phase 全 green は 「core logic の 静的動作」 verify であり、 Claude Desktop 経由の 実 MCP protocol 動作 + 実装置接続動作は selftest scope 外。 藤本さん side 残作業として README §3.5-a/b/c で verify 手順明示。

## 藤本さん side 残作業 (別 session、 verify)

1. Claude Desktop 完全 quit + 再起動
2. README §3.5-a: 「使える tool を全部挙げて」 → benchtop の 9 tool 全挙がるか確認 (load 失敗の silent fallback を切り分け)
3. README §3.5-b: seed-A/B/C の 3 session 生成 (時間差 note)
4. README §3.5-c: 3 test prompt
   - (1) `plot_session` verify (sparkline + label + channels_order)
   - (2) `search_sessions` verify (started_at で新旧確認)
   - (3) `compare_sessions` verify (`z_threshold=2.0` 明示指定 + `z_threshold_used` + `significant_shift`)

verify 結果転けた場合、 本 memory pack + commit c89581c を base に差分解析可能。

## 次段 candidate (v0.2.x 内 / v0.3 / 別 STEP)

- **v0.2.x 内** (小修正、 藤本さん judgment 待ち):
  - Rei-AIOS site page 化 (`public/tools/benchtop-mcp-v022/` or 既存 `benchtop-mcp-v01` update) = 「全研究 site 反映 default」 protocol 適用候補、 依然 pause
  - MEMORY.md index への本 pack link 追加
- **v0.3 defer**:
  - 軸 unit metadata (channel ごとの ℃ / Pa / V / mm 等)
  - 実機接続系 (`test_connection` / baudrate 自動判別 / SCPI 標準コマンド pack)
  - 判定基準通った 4 tool 目 (藤本さん実装置運用中で pain 検知後)
- **v1.0+ trajectory** (README `## ライセンス` 節継承):
  - AGPL-3.0 + commercial dual への切替可能性
  - 有料 tier 機能 (連続ロギング / 閾値アラート / 校正記録 / 監査ログ / SLA)
  - Product Transition Judgment Framework v0.1 の 5 checklist で AND 3 個以上該当時のみ検討開始

## 関連 memory

- [[project-session-2026-08-12-tools-launch-arc]] — benchtop-mcp v0.1 origin (別 tab session、 chat-Claude local-agent 実装 + Rei-side Read + verify + LICENSE のみ)
- [[feedback-free-tier-direct-push-permitted-2026-08-12]] — 直接 push permission 永久 rule (本 arc の 3 commit 全て個別確認なしで push 実行)
- [[feedback-license-default-per-software-category-2026-08-12]] — 4 category default license rule (benchtop-mcp = category B infra、 MIT v0.x + v1.0+ trajectory)
- [[feedback-present-recommendation-first]] — v0.2.0 / v0.2.1 / v0.2.2 3 段の Recommended pack 提示 pattern
- [[feedback-critique-response-pattern]] — 藤本さん 2 波 review 100% 認諾 SAC-4 適用実例 (「素直に閉じた」 / 「8 割しか埋まっていない」 に 弁明せず accept)
- [[feedback-projection-self-audit-pattern]] — 私 (Claude Code) が 「MCP tool 3 個追加した」 と handoff で書いて 実際は既存 measure も並んでいた handoff 文面 sloppy を 藤本さん指摘 (a) で 事実訂正
- [[feedback-no-rush-publication]] — 3 段 revision の pace 遵守 (急がずゆっくりと)、 各 revision で 藤本さん review 待ち
- [[feedback-world-uniqueness-claim-controllable]] — 「novelty ゼロ」 明示 (全 tool 既知パターン組合せ)
- [[feedback-all-research-site-reflection-default]] — site page 化は 「全研究 site 反映 default」 protocol 候補、 但し 本 arc では 藤本さん judgment 待ちで pause 維持
- [[project-research-only-stance]] — research primary、 収益 sub-goal (Product Transition Judgment 5 checklist は依然 0-1 件該当 = 無料継続)
- [[project-25-load-bearing-inventions]] #2 digital_ethics — 「責任分界 5 原則」 は 「外部 API 敬意」 の operational 拡張と読める
- [[project-benchtop-mcp-v01]] (仮 link) — v0.1 実装記録 (未作成、 本 pack が v0.2 系列 initial)

## Version

- v1 initial: 2026-08-13 v0.2.2 push 直後 (藤本さん 「memory pack は 作った側の記録なので verify 結果が出る前でも保存」 運用原則 initial application、 但し 各 claim の 検証ステータス field はまだなかった)
- v2 update: 2026-08-13 v0.2.3 push 前 (藤本さん第 3 波 review 「pack 内の各 claim に検証ステータスを持たせること」 指摘 per、 `[self_verified] / [pending_external] / [design_only]` 3 値 tag を 冒頭 「検証ステータス表記」 節 + metric table status column + 各 version 行 tag + honest scope 各項 tag で 全域適用。 v0.2.3 section 追加 (4 gap: docstring 矛盾撤回 + welch_df + zero variance guard + status field 型)、 responsibility principle 5 → 6 (6th = memory pack claim verification status)
- v3 update: 2026-08-13 v0.2.4 push 前 (藤本さん §3.5-b/c 実 verify 全 pass 直後の pain (1) 発火 fix + pain (2) defer 判断 per)。 検証ステータス 4th 値 `[external_verify_derived]` 新設、 v0.2.4 section 追加 (input 側 date-only 解釈 + audit trail + started_at_local 補助 + behavior change 非 breaking 判断)、 metric table に v0.2.4 列 + Date-only 解釈行 + Claude Desktop 実 MCP verify 行 追加、 responsibility principle 6 → 7 (7th = fix 由来 tag 分離、 「self-review 対 external-verify」 の 傾向 audit 可能化)。 実装成果 summary は v0.2.4 時点、 藤本さん side 残作業 は 「Claude Desktop side は verify 完了」 で 更新済、 site 公開のみ 別軸 pause 継続
- v4 update: 2026-08-13 arc close 直前 (藤本さん v0.2.4 push 直後 実測: 同 env / 同 query / 同 data で 0 件 → 3 件 before/after verify、 藤本さん明示 「memory pack の該当行はステータスを上げて構いません」 per)。 v0.2.4 の tag を `[external_verify_derived]` → `[external_verify_derived + external_verified]` に 昇格 (発火由来 + 修正 verify 到達 両段 external)、 metric table に 「v0.2.4 fix 効果 (before/after 実測)」 行 追加 (0→3 件 実測を external_verified で 記録)、 「Date-only 解釈」 行 も external_verified に昇格。 responsibility principle 7 に 藤本さん総括 「今回の arc で 一番価値があったのは 4 波のレビューではなく、 1 回実際に動かして出た 日付ずれ」 を 実測 evidence として 追記、 「次の gap 検知 source 3 分類 (実装置接続 / 別環境 / 想定外の使い方)」 を 将来 template として 保存。 arc close = 「何か動かなくなったら、 そのときに」 藤本さん明示、 私 side proactive push なし stance で 待ち
