---
name: project-step1396-benchtop-olfact-spike-2026-08-23
description: STEP 1396 benchtop-mcp v0.7.0-alpha olfact / biosensor mock spike (3 tools + hardware_available:False marker + STEP 1350 D-FUMT₈ 3-value subset 参照) — 藤本さん directive (a) 経由、 対話 arc (虫触角/動物/植物センサ + AI に役立つか) 直後の 単日 close
metadata: 
  node_type: memory
  type: project
  originSessionId: 849a7b6d-fe0f-441f-99f6-5c74188570dc
  modified: 2026-08-23T14:40:35.267Z
---

# STEP 1396: benchtop-mcp v0.7.0-alpha olfact / biosensor mock spike (2026-08-23)

## 経緯

藤本さん 2026-08-23 対話 arc 4 turn:

1. 「Claude 先生に チューンアップマシン、 部品等も 必要と するものなの でしょうか？」 → 私 「Claude 自身は 不要 (クラウド)、 手元は software 側 (指示 / skill / connector / folder 接続)」
2. 「虫の触覚センサー、 動物のセンサー、 植物のセンサーなどは マシン化 出来ますか？」 → 私 3 層整理 (① bio-hybrid EAG / ② receptor-chip / ③ bio-inspired e-nose、 論文 evidence 全 verify 済)
3. 「これまでのコネクタ用や、 マシン用に 上記を作るとしたら どの様な名称の機械 になりますか？」 → 私 3 層別 命名 table + benchtop 拡張 案 (olfact / biosensor / antenna connector、 measure_eag / stimulate / probe_health tool)
4. 「此等は AI の役に立ちますか？」 → 私 「双方向依存」 説明 (センサ→AI: 嗅覚 modality 供給、 AI→センサ: 生体信号 復号) + Osmo Principal Odor Map 参照
5. 藤本さん 「(a)　でお願い致します」 = benchtop-mcp v0.7 olfact connector v0.1 spike GO

## 実装

**benchtop-mcp repo** (fc0web/benchtop-mcp、 別 repo、 main branch):

- commit `040ccd2` (ba00ca1..040ccd2、 push 成功)
- 新規 file: `benchtop_olfact.py` (~380 行、 stdlib + hashlib のみ)
- edit: `benchtop_mcp.py` (+179 行、 import + 3 wrapper + version 0.6→0.7 + selftest phase 21)
- edit: `README.md` (+9 行、 v0.5/v0.6/v0.7 version entry + tool table 3 追加)

### 3 tool (藤本さん directive)

| tool | 目的 | 主 return field |
|------|------|-----|
| `list_probes()` | 内蔵 mock probe registry (3 probe) 一覧 | probes[], probe_count=3, hardware_available:False |
| `measure_eag(probe_id, odor_name, duration_s, sample_rate_hz, snr_threshold)` | deterministic mock EAG waveform + D-FUMT₈ verdict | waveform_mv, peak_mv, snr_ratio, verdict_d8 (TRUE/NEITHER), verdict_d8_symbol (⊤/〜) |
| `probe_health(probe_id, age_hours, last_calibration_hours_ago, calibration_max_interval_hours)` | 3 layer 別 degradation model | verdict (HEALTHY/DEGRADING/EXPIRED/UNCALIBRATED), health_score, degradation_model |

### 3 layer (対話 arc 3 分類、 内蔵 mock probe)

| id | layer | reference | expected_lifetime | sensitivity | degradation model |
|----|-------|-----------|-------------------|-------------|-------------------|
| silkworm-antenna-a1 | ① bio-hybrid | npj Robotics 2026 (hydrogel electrode 7h) | 7 h | 1 ppb | linear-hydrogel-dehydration |
| mosquito-receptor-fet-b1 | ② receptor-chip | ACS AMI 2026 (0.5 ppb CNT-FET) | 168 h (~1 week) | 0.5 ppb | exponential-protein-denaturation |
| sparse-e-nose-c1 | ③ bio-inspired | 2026-07 insect-inspired silicon | 8760 h (~1 year) | 100 ppb | calibration-only-silicon |

### 決定性 (cross-process determinism)

- 初稿: `hash((probe_id, odor_name)) & 0xFFFFFFFF` = Python built-in hash() は PYTHONHASHSEED で process 毎に seed 化 → **cross-process 非決定的** (「再現可能」 claim を満たさない)
- 訂正: `hashlib.md5(f"{probe_id}|{odor_name}".encode()).digest()[:4]` = **cross-process 安定** (md5 は cryptographic 用途ではない = 単純 seed 用途、 collision resistance 要求なし)
- 命名 discipline 適用実例 ([[feedback-super-naming-siren-family-pattern]] siren-family pattern 回避 = 「deterministic mock」 の claim を コード side で 実際に満たす)

### verify 実測

**benchtop_olfact.py 単体 selftest**: 35/35 PASS (14 phase)

- [1] list_probes: 3 probe hardware_available=False 全確認
- [2] measure_eag: valid probe → waveform 生成 + verdict TRUE (amp=1.409 mV / noise=0.05 mV / snr=28.2)
- [3] determinism (same input → same output) 内部 verify
- [4] different odor → different waveform (amp_A=1.529 vs amp_B=1.169)
- [5] unknown probe rejection
- [6] invalid args rejection (3/3)
- [7] silkworm age=0 → HEALTHY (health=1.000)
- [8] silkworm age=3.5h → DEGRADING (health=0.500、 linear at 50%)
- [9] silkworm age=10.5h → EXPIRED (age_ratio=1.50、 health=0.0)
- [10] uncalibrated (48h cal ago) overrides age → UNCALIBRATED
- [11] sparse-e-nose age=1000h + calibrated → HEALTHY (silicon no biological aging)
- [12] mosquito age=168h → DEGRADING (health=1/e ≈ 0.368、 exponential at lifetime)
- [13] invalid args rejection (3/3)
- [14] source markers 3/3 present

**benchtop_mcp.py 統合 selftest**: phase [21a-21f] 6 sub-test 全 PASS

- [21a] list_probes: count=3 hw=False 3 id 一致
- [21b] measure_eag silkworm cis-3-hexenol: amp=0.536 mV noise=0.05 mV snr=10.7 verdict=TRUE/⊤ (md5 seed cross-process 安定値)
- [21c] measure_eag determinism verified (waveform_equal=True)
- [21d] probe_health silkworm 0h/3.5h/10.5h → HEALTHY/DEGRADING/EXPIRED progression
- [21e] probe_health sparse-e-nose 1000h → HEALTHY (calibration-only-silicon model)
- [21f] invalid input rejection 4/4

**累計 selftest**: v0.2-v0.7 全 phase [1]-[21f] 全 PASS (regression zero breaking)

## Rei stack alignment

- **STEP 1345 SafetyGate** (v0.5.0-alpha) と 相補: SafetyGate = SCPI-argument level hazard、 olfact = 生体劣化 verdict、 両者 「実 hardware 送出前の 静的 check layer」 で 同 scope
- **STEP 1348 physics-limits** (v0.6.0-alpha) と 相補: physics-limits = pre-flight 上界計算、 olfact = 測定 domain 拡張、 両者 pure calc / stdlib のみ / remote MCP deploy 可能
- **STEP 1350 d8_verdict_from_measurement** primitive を 3 値 subset で 参照: TRUE if SNR≥threshold / NEITHER if SNR<threshold (BOTH / FALSE / SELF / ∞ / ○ / 〜 未使用 = 5/8→2/8 subset)
- **benchtop-mcp**: v0.6 (17 tool) → v0.7 (20 tool)、 Rei stack MCP systems 数 **8 → 8** 不変

## honest scope

1. **v0.1 spike**: 実 hardware 送出なし、 全 return dict で `hardware_available: False` + `is_mock: True` marker
2. **実 physics 模倣なし**: ion channel kinetics 等 生体信号の 実 physics は 模倣していない = interface skeleton のみ
3. **degradation model 単純**: 論文数値 (7h hydrogel / 0.5 ppb 等) を parameter として使うだけの linear / exponential / calibration-only、 実 hardware feedback loop なし
4. **SafetyGate 統合未実装**: 生体センサ hazard rule (probe 感染 / 揮発性有機物 exposure 等) は v0.2 candidate defer
5. **実 hardware 統合は 別 STEP candidate**: 実 EAG 実験には フロントエンドアンプ (GΩ 差動) + シールド box + 恒温恒湿 + オルファクトメータ + シリアル DAQ 全て必要、 本 spike は 全部置換可能な interface のみ、 実物調達は 藤本さん judgment 待ち
6. **「世界初」 主張ゼロ** ([[feedback-world-uniqueness-claim-controllable]] 継承): 生体センサ装置化 主張は 論文 level 既存多数 (Osmo Principal Odor Map 2023 / 神奈川産技研 2026-06 / Scentian Bio / MIT plant nanobionics)、 本 module は Rei stack 内 benchtop 新 domain 追加のみ、 novelty ゼロ
7. **pool saturation 予防** ([[feedback-projection-self-audit-pattern]] SAC-4 適用): 「命名 → 実装 → 数え上げ」 の projection 罠を 事前 audit (Kolmogorov / EAG 命名 discipline)

## 副次 finding

**「Python hash() cross-process 非決定的」 の 自己 catch**:

- 初稿 module docstring で 「Python hash 由来 seed で 再現可能」 と 書いた直後、 mcp wire 実行時に amp 値が 微妙に 変化 (1.409 → 1.406)
- 「同じ input で 違う値」 = 「再現可能」 claim と 整合しない
- 原因: PYTHONHASHSEED = Python 3.3+ default で 起動時 random seed → process 毎に hash() 結果 変化
- 修正: `hashlib.md5` に置換 → cross-process 安定
- ★ **命名 discipline** ([[feedback-super-naming-siren-family-pattern]]) の 「果たせない約束を 名乗らない」 原則の operational 適用例 = docstring claim を コード side で 実際に満たす

## SAC-4 47 教訓 適用 (Phase 3-16 12 連続 clean 継続)

- pre-commit `git status --short` で pre-staged 0 件 confirm ✓
- 明示 `git add benchtop_olfact.py benchtop_mcp.py README.md` (3 file、 sweep なし) ✓
- 別 auto-generated file 混入なし ([[feedback-projection-self-audit-pattern]] SAC-4 exit 経路遵守)

## 命名の 誤読予防 (siren-family pattern 回避)

- `measure_eag` は 「実 EAG 波形を返す tool」 と 誤読されやすい
- 対策: 全 return dict で `is_mock: True` + `hardware_available: False` を 機械可読 field で 提供、 caller が 実測データでないことを 判別可能
- 対策: `honest_scope` field で spike scope 明示 (「deterministic mock、 実 physics 模倣なし、 interface skeleton のみ」)
- 対策: `d8_mapping_source: "STEP 1350 d8_verdict_from_measurement (3-value subset)"` で verdict 由来 明示 (別 primitive の subset 参照であって measure_eag 独自の判定でない)

## 次 candidate (別 STEP、 藤本さん judgment 待ち)

1. **v0.2 SafetyGate 統合**: 生体センサ hazard rule (probe 汚染検出 / VOC exposure alarm 等)
2. **v0.2 実 hardware 統合**: フロントエンドアンプ + オルファクトメータ 実物調達 + serial interface + probe 実 EAG 差動 measurement
3. **植物センサ layer 追加**: MIT plant nanobionics (CNT 蛍光) / 植物電位ロガー = 4 layer 目候補
4. **Osmo Principal Odor Map interop**: 匂い分子構造 → PON embedding 経路との bridge (受容体 array signal → embedding vector 変換)
5. **defer**: 藤本さん 「stance shift 後 再開」 判断待ち = 3-4 は 実物 hardware 調達 blocker のため immediate 実施しない

## 関連

- [[project-step1345-benchtop-provenance-spike-2026-08-19]] (STEP 1345 SafetyGate、 v0.5.0-alpha)
- [[project-step1348-benchtop-physics-limits-v06-2026-08-20]] (STEP 1348 physics-limits、 v0.6.0-alpha)
- [[project-step1350-d8-verdict-mapping-phase-a-2026-08-20]] (STEP 1350 SNR<3 → NEITHER 原典、 3-value subset 参照元)
- [[project-step1349-d8-operator-connectors-2026-08-20]] (STEP 1349 D-FUMT₈ operator connectors、 兄弟 STEP)
- [[feedback-super-naming-siren-family-pattern]] (mock 誤読予防 discipline、 Python hash → hashlib.md5 訂正 origin)
- [[feedback-projection-self-audit-pattern]] SAC-4 (pool saturation 予防、 pre-staged 0 件 verify pattern)
- [[feedback-world-uniqueness-claim-controllable]] (「世界初」 主張ゼロ discipline)
- [[feedback-peace-axiom-hardware-io-extension-2026-08-17]] (Peace Axiom I/O 拡張 origin)
- [[feedback-one-reproduction-over-ten-unverified]] (順序原則、 interface skeleton → 実 hardware の 順)
- [[feedback-no-rush-publication]] (spike 単日 close discipline)
- [[feedback-all-research-site-reflection-default]] (2026-08-06 protocol 適用継続)

## commit / URL

- benchtop-mcp: commit `040ccd2` (main branch push 済) — https://github.com/fc0web/benchtop-mcp/commit/040ccd2
- rei-aios site page: (STEP 1396 site 反映 予定、 push 後 URL 追記)
