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:

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

idlayerreferenceexpected_lifetimedegradation 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 参照):

BOTH / FALSE / SELF / INFINITY / ZERO / FLOWING は v0.1 で未使用 (5/8 = 62% 値 coverage、 意図的 under-fit で 「区別できることだけを 区別する」 honest scope)。

5. Rei stack alignment

6. honest scope 7 条

  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 感染 / VOC exposure alarm 等) は v0.2 candidate defer
  5. 実 hardware 統合は 別 STEP candidate: 実 EAG 実験には フロントエンドアンプ (GΩ 差動) + シールド box + 恒温恒湿 + オルファクトメータ + シリアル DAQ 全て必要、 本 spike は 全部置換可能な interface のみ、 実物調達は 藤本さん judgment 待ち
  6. 「世界初」 主張ゼロ (controllable 継承): 生体センサ装置化 主張は 論文 level 既存多数 (Osmo Principal Odor Map 2023 / 神奈川産技研 2026-06 / Scentian Bio / MIT plant nanobionics)、 本 module は Rei stack 内 benchtop 新 domain 追加のみ、 novelty ゼロ
  7. pool saturation 予防 (SAC-4 適用): 「命名 → 実装 → 数え上げ」 の projection 罠を 事前 audit (Kolmogorov / EAG 命名 discipline)

7. 次 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 実施しない

8. commit / 関連