benchtop-mcp v0.7.0-alpha — olfact / biosensor mock spike
v0.1 spike
STEP 1396
hardware未取得 = mock
2026-08-23 / Rei-AIOS / benchtop-mcp v0.7.0-alpha
1. 経緯 — 対話 arc 4 turn
藤本さん 2026-08-23 対話 arc:
- 「Claude 先生に チューンアップマシン、 部品等も 必要と するものなの でしょうか?」 → 私 「Claude 自身は不要 (クラウド)、 手元は software 側 (指示 / skill / connector / folder 接続)」
- 「虫の触覚センサー、 動物のセンサー、 植物のセンサーなどは マシン化 出来ますか?」 → 私 3 層整理 (① bio-hybrid EAG / ② receptor-chip / ③ bio-inspired e-nose)
- 「これまでのコネクタ用や、 マシン用に 上記を作るとしたら どの様な名称の機械 になりますか?」 → 私 3 層別 命名 table + benchtop 拡張 案
- 「此等は AI の役に立ちますか?」 → 私 「双方向依存」 説明 (センサ→AI: 嗅覚 modality 供給、 AI→センサ: 生体信号 復号) + Osmo Principal Odor Map 参照
- 藤本さん 「(a) でお願い致します」 = benchtop-mcp v0.7 olfact connector v0.1 spike GO
2. 実装内容
2.1 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 |
2.2 3 layer (対話 arc 3 分類、 内蔵 mock probe)
| id | layer | reference | expected_lifetime | degradation model |
silkworm-antenna-a1 |
① bio-hybrid |
npj Robotics 2026 (hydrogel electrode 7h) |
7 h |
linear-hydrogel-dehydration |
mosquito-receptor-fet-b1 |
② receptor-chip |
ACS AMI 2026 (0.5 ppb CNT-FET) |
168 h (~1 week) |
exponential-protein-denaturation |
sparse-e-nose-c1 |
③ bio-inspired |
2026-07 insect-inspired silicon |
8760 h (~1 year) |
calibration-only-silicon |
2.3 決定性 (cross-process determinism) と 訂正
初稿では hash((probe_id, odor_name)) & 0xFFFFFFFF を seed 化。 しかし Python built-in hash() は Python 3.3+ default で PYTHONHASHSEED による起動時 random seed → cross-process 非決定的。 wire 実行時に amp 値が 微妙に変化 (1.409 → 1.406) して 「再現可能」 claim との不整合を self-catch。
訂正: hashlib.md5(f"{probe_id}|{odor_name}".encode()).digest()[:4] に置換 → cross-process 安定。 md5 は cryptographic 用途ではなく単純 seed 用途 (collision resistance 要求なし)。
命名 discipline 適用実例 (siren-family pattern 回避) = docstring claim を コード side で 実際に満たす operational 訂正。
3. verify 実測
3.1 benchtop_olfact.py 単体 selftest: 35 assertion PASS
=== benchtop_olfact v0.7.0-alpha selftest ===
[1] list_probes: count=3 ids=[mosquito-receptor-fet-b1, silkworm-antenna-a1, sparse-e-nose-c1]
[2] measure_eag: amp=1.409 mV noise=0.050 snr=28.2 verdict=TRUE/⊤
[3] measure_eag determinism: waveform equal=True
[4] different odor: amp_A=1.529 amp_B=1.169
[5] unknown probe rejected: known=3
[6] invalid args rejected: 3/3
[7] silkworm age=0: verdict=HEALTHY health=1.000
[8] silkworm age=3.5h: verdict=DEGRADING health=0.500
[9] silkworm age=10.5h: verdict=EXPIRED age_ratio=1.50
[10] uncalibrated overrides age: verdict=UNCALIBRATED
[11] sparse-e-nose age=1000h: verdict=HEALTHY model=calibration-only-silicon
[12] mosquito age=168h: verdict=DEGRADING health=0.368
[13] invalid args rejected: 3/3
[14] source markers: 3/3 present
=== selftest result: 35 passed, 0 failed ===
3.2 benchtop_mcp.py 統合 selftest phase [21a-21f]: 6 sub-test 全 PASS
--- [21] v0.7.0-alpha: olfact / biosensor mock spike (3 MCP tool wire) ---
[21a] list_probes: count=3 hw=False ids=[mosquito-receptor-fet-b1, silkworm-antenna-a1, sparse-e-nose-c1]
[21b] measure_eag(silkworm, cis-3-hexenol, 3s@100Hz): amp=0.536mV noise=0.050mV snr=10.7 verdict=TRUE/⊤
[21c] measure_eag determinism: waveform_equal=True
[21d] probe_health(silkworm): 0h=HEALTHY 3.5h=DEGRADING 10.5h=EXPIRED (linear-hydrogel model)
[21e] probe_health(sparse-e-nose, 1000h): verdict=HEALTHY model=calibration-only-silicon
[21f] invalid input rejected: unknown_probe=True neg_dur=True unknown_probe_health=True neg_age=True
全テスト成功。実機が無くてもこのサーバーは動作します。
v0.5.0-alpha SPIKE: import_external_session + SafetyGate + source field 追加 動作確認。
v0.6.0-alpha: physics-limits pre-flight (Bekenstein/Landauer/Lloyd/op-space/compression) 動作確認。
v0.7.0-alpha SPIKE: olfact / biosensor mock (list_probes / measure_eag / probe_health) 動作確認。
累計 selftest: v0.2 - v0.7 全 phase [1] - [21f] 全 PASS (regression zero breaking)。
4. D-FUMT₈ verdict mapping (STEP 1350 subset)
measure_eag は SNR から D-FUMT₈ 8 値のうち 2 値のみ 使う (STEP 1350 primitive の subset 参照):
- TRUE (⊤) — SNR ≥ threshold (default 3.0) = signal_above_noise
- NEITHER (〜) — SNR < threshold = snr_below_threshold
BOTH / FALSE / SELF / INFINITY / ZERO / FLOWING は v0.1 で未使用 (5/8 = 62% 値 coverage、 意図的 under-fit で 「区別できることだけを 区別する」 honest scope)。
5. Rei stack alignment
6. honest scope 7 条
- v0.1 spike: 実 hardware 送出なし、 全 return dict で
hardware_available: False + is_mock: True marker (機械可読)
- 実 physics 模倣なし: ion channel kinetics 等 生体信号の 実 physics は 模倣していない = interface skeleton のみ
- degradation model 単純: 論文数値 (7h hydrogel / 0.5 ppb 等) を parameter として使うだけの linear / exponential / calibration-only、 実 hardware feedback loop なし
- SafetyGate 統合未実装: 生体センサ hazard rule (probe 感染 / VOC exposure alarm 等) は v0.2 candidate defer
- 実 hardware 統合は 別 STEP candidate: 実 EAG 実験には フロントエンドアンプ (GΩ 差動) + シールド box + 恒温恒湿 + オルファクトメータ + シリアル DAQ 全て必要、 本 spike は 全部置換可能な interface のみ、 実物調達は 藤本さん judgment 待ち
- 「世界初」 主張ゼロ (controllable 継承): 生体センサ装置化 主張は 論文 level 既存多数 (Osmo Principal Odor Map 2023 / 神奈川産技研 2026-06 / Scentian Bio / MIT plant nanobionics)、 本 module は Rei stack 内 benchtop 新 domain 追加のみ、 novelty ゼロ
- pool saturation 予防 (SAC-4 適用): 「命名 → 実装 → 数え上げ」 の projection 罠を 事前 audit (Kolmogorov / EAG 命名 discipline)
7. 次 candidate (別 STEP、 藤本さん judgment 待ち)
- v0.2 SafetyGate 統合: 生体センサ hazard rule (probe 汚染検出 / VOC exposure alarm 等)
- v0.2 実 hardware 統合: フロントエンドアンプ + オルファクトメータ 実物調達 + serial interface + probe 実 EAG 差動 measurement
- 植物センサ layer 追加: MIT plant nanobionics (CNT 蛍光) / 植物電位ロガー = 4 layer 目候補
- Osmo Principal Odor Map interop: 匂い分子構造 → PON embedding 経路との bridge (受容体 array signal → embedding vector 変換)
- defer: 藤本さん 「stance shift 後 再開」 判断待ち = 3-4 は 実物 hardware 調達 blocker のため immediate 実施しない
8. commit / 関連
- benchtop-mcp commit:
040ccd2 (ba00ca1..040ccd2、 push 済、 main branch)
- files:
benchtop_olfact.py (new, ~380 行, stdlib+hashlib のみ) + benchtop_mcp.py (+179 行) + README.md (+9 行)
- memory:
project_step1396_benchtop_olfact_spike_2026-08-23.md
- 関連 memory:
- SAC-4 47 教訓: Phase 3-16 12 連続 clean 成功 (pre-staged 0 件 confirm → 明示 3 file add → sweep なし)