lab-notebook-mcp Phase 1 arc
lab-notebook-mcp Phase 1 arc — 実験ノート MCP independent 実装 (benchtop v0.4 との 使い分け明示)
1. Rei stack MCP architecture 更新 (4 → 5 systems)
Before 本 arc (4 systems):
rei-aios (32 tools) 理論・自律学習
benchtop v0.4.0 (11 tools) 測定器制御 + quick session notes
mcp-lens 上流 intercept
rei-automator-mcp v0.1 自動化
After 本 arc (5 systems、 責務 clean separation):
rei-aios (32 tools) 理論・自律学習
benchtop v0.4.0 (11 tools) 測定器制御 + quick session-level notes
lab-notebook-mcp v0.1.0 (21 tools rw / 9 tools ro) ★ 新規
structured multi-session records
experiment × run × dut × condition ×
measurement × artifact × note × link ×
baseline × safety_limit の永続化
mcp-lens 上流 intercept
rei-automator-mcp v0.1 自動化
chat-Claude 「+4 MCP → AI 選択劣化」 warning に 抵触するか?
今回の +1 (lab-notebook-mcp) は warning に 抵触しない設計:
- 各 MCP の 責務が clean separation (I/O / 永続化 / 推論 の 三者分業)
- 相互 HTTP/IPC 依存なし、 ID sharing のみ (mystery_id / benchtop_session_id / target_id)
- ro モードで rei-aios 自律ループから 参照 = write 権限は Claude Code / Cowork Claude のみ
- 5 systems は 前 turn 「+4 MCP → 8 systems」 warning の 半分以下
2. Phase 1 実装内容 (lab-notebook-mcp commit a2d7f64)
コードベース (12 file、 ~1,200 line、 pyproject.toml + CLAUDE.md + README.md 含む)
| Module | 役割 | Line count 目安 |
|---|---|---|
config.py | env vars parse (LAB_NOTEBOOK_MODE default 'ro' 安全側) | ~70 |
db.py | SQLite 接続 + mode-aware URI (ro=file:...?mode=ro 二重防御) | ~90 |
schema.sql | 10 table (experiment/run/dut/condition/measurement/artifact/note/link/baseline/safety_limit) | ~140 |
hashing.py | condition_hash (int/float 正規化 6桁 SHA-256 先頭 16) + file_sha256 | ~65 |
store.py | content-addressed artifact storage (path 封じ込め + 0o444 read-only) | ~115 |
provenance.py | external note ラップ (<external-content> + prompt injection 警告付加) | ~65 |
tools_read.py | 9 read tools (stats/search_experiments/get_experiment/list_runs/get_run/list_artifacts/resolve_artifact/list_links/find_by_link) | ~200 |
tools_write.py | 12 write tools (create_experiment/update_status/upsert_dut/start_run/record_measurements/finish_run/supersede_run/add_note/add_link/set_baseline/set_safety_limit/attach_artifact) | ~300 |
server.py | mode-based tool 登録 (ro で write tool 登録なし = §5.1 核心) | ~200 |
__main__.py | stdio entry point | ~20 |
Tests (pytest 23/23 全 PASS)
Selftest 実測 (2026-08-17): 23/23 全 PASS (2.05 sec)
- test_mode_gating.py (7) ★ 最重要 (§9): ro で write tool 一切なし / rw で 21 tools 全登録 / ro connection INSERT 拒否 / default 'ro' / invalid mode ValueError / execute_sql 系 存在なし (§5.4)
- test_condition_hash.py (7): 順序独立 / int-float 正規化 (25==25.0==25.00) / 6桁丸め / 単位違い別hash / 空 conditions 決定論的 / 16 hex 桁
- test_append_only.py (5): delete/drop/remove/purge/truncate 名 tool 存在なし / supersede 後 default 除外 + include_superseded 復元 / agent-provenance note 自動追記 / 自 supersede 拒否 / tools_write 全体 delete 経路なし
- test_schema.py (4): end-to-end workflow (実験→DUT→run→measurements→finish→get で spec 自動判定 verdict 確認) / slug 重複 structured error / link add+find_by_link / external note source_ref 必須+ 読み取り時 wrap
3. Design 原則 実装状態 (§5 + §3.4 準拠)
| 原則 | 実装 | test |
|---|---|---|
| Append-only | 削除ツール 実装せず、 supersede pattern + supersede_by column | test_append_only 5/5 PASS |
| モード gating | ro で write tool 登録なし + SQLite ro URI 二重防御 | test_mode_gating 7/7 PASS |
| 任意 SQL 禁止 | execute_sql 系 意図的 未実装、 型付き専用 tools のみ | test_no_arbitrary_sql_tool_registered PASS |
| 外部由来テキスト ラップ | <external-content source="..." trust="untrusted"> + top-level _external_warning | test_note_external_wrapped_on_read PASS |
| 測定器 未 touch | benchtop 依存なし、 SQLite/artifact のみ | schema/deps に 測定 code なし |
| アーティファクト 中身返さない | list_artifacts + resolve_artifact は path/sha256/bytes のみ | tools_read 実装で 中身 read なし |
| パス封じ込め | Path.resolve() + LAB_NOTEBOOK_INGEST_DIRS 配下確認 (symlink 脱出も 拒否) | Phase 2 test_artifact_store で 追加 verify 予定 |
| 個人情報 構造的持たない | schema に 氏名/email/住所 列なし、 operator 16 char 警告 (拒否せず) | schema.sql 全 column 確認 |
4. benchtop v0.4.0 との responsibility overlap + 使い分け明示
Overlap の 事実: 前 turn で 実装した benchtop v0.4.0 の 実験ノート features (Session extension + find_similar_sessions + regression_check + mystery_id) は、 lab-notebook-mcp の 中核機能と 部分的 overlap。 chat-Claude が 「独立 MCP として 分離」 提案 した経緯 = 私 前 turn 推奨 (benchtop 内 拡張) と 別解、 両方 実装 完了。
| 用途 | benchtop v0.4.0 | lab-notebook-mcp v0.1.0 |
|---|---|---|
| 粒度 | 単発 session に メタデータ付ける (subject, environment, instrument_config, mystery_id) | experiment × run × dut × condition × measurement × artifact × note × link × baseline × safety_limit の 10 layer structured |
| Schema | Session dataclass 4 optional field | SQLite 10 table + condition_hash + verdict + provenance + append-only |
| Mode | 常時 rw (単一 client 想定) | ro/rw 二重防御 (rei-aios 自律ループ ro 参照可能) |
| Integrity | v0.3.0 audit log hash chain (tool 呼び出し 全記録) | SQLite WAL + append-only + supersede + agent-provenance audit note |
| Artifact | なし (session_id.json のみ) | content-addressed sha256/2-level dir + 0o444 read-only + dedup |
| Prompt injection | なし | <external-content> ラップ + top-level warning |
| 用途 target | quick session-level notes (簡単な 1 実験の 単発記録) | structured multi-session records (professional lab notebook、 校正証明書、 監査対応) |
推奨 usage 指針:
- 個人 hobby 実験 / 単発 debug / 探索: benchtop v0.4.0 のみ で 十分
- professional lab / 校正記録 / 監査対応 / 長期 experiment × 多 run: lab-notebook-mcp 使用 (benchtop で measure → benchtop_session_id を lab_start_run に 渡す 併用 workflow)
- rei-aios 側 自律ループ から 参照: lab-notebook-mcp を
LAB_NOTEBOOK_MODE=roで 参照、 benchtop の session store は 別途
5. 動作確認手順 (藤本さん実施用)
Step 1: 依存インストール + テスト実行
# lab-notebook-mcp repo に入って dev deps install
cd C:\Users\user\lab-notebook-mcp
python -m pip install -e ".[dev]"
# 全 test 実行 (23/23 全 PASS 期待)
python -m pytest -v
Step 2: rw モード で サーバー 起動 (手動 stdio、 一度 DB 初期化)
# Windows PowerShell
$env:LAB_NOTEBOOK_MODE = "rw"
$env:LAB_NOTEBOOK_ROOT = "$env:USERPROFILE\lab-notebook"
python -m lab_notebook
# → stdio で サーバー 起動、 Ctrl+C で 停止
# 初回起動時 に notebook.db 作成 (~/lab-notebook/notebook.db)
Step 3: Claude Desktop に 登録 (rw モード)
// %APPDATA%\Claude\claude_desktop_config.json に 追記
{
"mcpServers": {
"lab-notebook": {
"command": "python",
"args": ["-m", "lab_notebook"],
"env": {
"LAB_NOTEBOOK_MODE": "rw",
"LAB_NOTEBOOK_ROOT": "C:\\Users\\user\\lab-notebook",
"LAB_NOTEBOOK_INGEST_DIRS": "C:\\Users\\user\\lab-notebook\\inbox"
}
}
}
}
// Claude Desktop 再起動
Step 4: Claude Desktop 上で 動作確認
「使える tool を全部挙げて」
→ lab_stats, lab_search_experiments, lab_get_experiment, lab_list_runs,
lab_get_run, lab_list_artifacts, lab_resolve_artifact, lab_list_links,
lab_find_by_link, lab_create_experiment, lab_update_experiment_status,
lab_upsert_dut, lab_start_run, lab_record_measurements, lab_finish_run,
lab_supersede_run, lab_add_note, lab_add_link, lab_set_baseline,
lab_set_safety_limit, lab_attach_artifact (21 tools 全 見える)
「experiment 作って、 run 1 つ 記録して、 後で 読み出して」
→ create_experiment → start_run → record_measurements → finish_run → get_run
の 一連 workflow が 動く
Step 5: ro モード verify (rei-aios 自律ループ 用途)
# rw で 一度 DB 初期化した 後、 ro で 別 process 起動
$env:LAB_NOTEBOOK_MODE = "ro"
$env:LAB_NOTEBOOK_ROOT = "$env:USERPROFILE\lab-notebook"
python -m lab_notebook
# ro で 起動、 write tool は tool 一覧に 存在しない
# rei-aios 側 config に ro で 登録すれば 自律ループから 参照専用可能
6. Phase 2-4 remaining (未着手、 Phase 1 完了後 pause)
| Phase | 内容 | 完了条件 |
|---|---|---|
| P1 ✅ | config / db / schema / hashing / 読み書き基本 + mode gating | mode gating + append-only tests 全通過 ← 本日 完了 |
| P2 | store.py アーティファクト保管 (✅ 部分実装済) + パス封じ込め test 完全網羅 | path 封じ込め + provenance test 全通過 |
| P3 | analysis.py (compare / history / regression) + baseline | 回帰検出 test 全通過 |
| P4 | link 系 tool + rei-aios / benchtop / git 相互参照 + README 整備 | 実機測定 1 件 record → 再現 verify |
Phase 2-4 は 藤本さん判断で 別 session 継続 or 保留。 Phase 1 で 「実験を作り、 run を記録し、 後から 読み出せる」 = 実運用 開始可能 粒度 (§10 準拠)。
7. Cross-pollination pattern (Rei stack Type 1 移送 拡張)
2026-08-17 累計 cross-pollination 4 段階:
- Rei-Automator STEP 1340 audit-log.ts (TypeScript、 hash chain origin) → primitive 実装
- benchtop v0.3.0 audit_log.py (Python) → 同 primitive の Python port (直接 移送)
- benchtop v0.4.0 experiment notebook (Python) → 実験ノート features を benchtop 内 拡張 (深化)
- lab-notebook-mcp v0.1.0 (Python) → 実験ノート features を independent MCP として 分離 (別 architectural approach、 SQLite + append-only + mode gating = 別方式 integrity)
chat-Claude new-idea §I 5 手 の Type 1 移送 の 更に強い evidence: 同 concept (「証跡が価値になる領域」 の primitive) が 3 別 substrate (Rei-Automator hash chain / benchtop v0.4 session extension / lab-notebook SQLite append-only) で 独立実装、 architectural choice の diversity が Rei stack cross-pollination 力の 上限を 定量化。
8. Honest scope
Novelty ゼロ: SQLite + append-only + sha256 artifact CAS は 既知 primitive の 集約 (ELN 系 商用 多数存在)、 Rei stack は 命名 + design.md §5 セキュリティ設計 の 統合 layer + Rei stack との ID linking 契約 のみ。 数学的発見ではない。
実 ISO/IEC 17025 認定 未達: primitive + workflow 骨格 は Phase 1 で 揃った、 実 監査人 verify や 認定機関 review は 未実施。 GMP 21 CFR Part 11 も 同様、 電子署名 / access control / long-term storage 要件 は Phase 2-4 candidate。
Phase 1 の 完了条件 のみ 満たす: §10 「P1 が 動けば もう 実運用を 開始できる 粒度」 = 「実験を作り、 run を記録し、 後から 読み出せる」 まで、 analysis.py 回帰検出 (Phase 3) と link 系 (Phase 4) は 未着手。
benchtop v0.4.0 との overlap は 意図的 に 併存: 前 turn 私 推奨 (benchtop 内 拡張) と chat-Claude 別提案 (independent MCP) の 両方 実装、 使い分け 明示で 破壊回避 = discipline 準拠、 但し 「どちら 使えば 良い?」 の 判断 は 藤本さん judgment に 委ねる。
MCP count 4 → 5 は chat-Claude 前 turn warning に 部分 抵触: 「+4 → 8 systems → AI 選択劣化」 warning に 対して +1 (5 systems) は 半分以下 だが、 warning の 型 (「MCP 数 増加 = AI 選択劣化」) に 該当 する 事実 は 変わらない。 責務 clean separation で 影響 minimize したが、 実 AI 選択劣化 の 定量測定 は 未実施。
9. commit history (2026-08-17 全 arc)
| Repo | Commit | 内容 |
|---|---|---|
| rei-aios | 10 commits | audit log + cost atlas + Galois + 6 item 束 + Z+Y + D 推奨 + arc extension + benchtop v0.3 arc + D approval + benchtop v0.4 arc |
| benchtop-mcp | 2 commits | v0.3.0 audit log + v0.4.0 experiment notebook |
| lab-notebook-mcp | a2d7f64 | v0.1.0 Phase 1 initial (本日 新 repo、 local commit のみ) |
| rei-aios | (本 site page commit) | lab-notebook-mcp Phase 1 arc site 反映 |
10. 関連 memory
- benchtop v0.4.0 experiment notebook arc (前 turn arc、 使い分け 対の 相手)
- benchtop v0.3.0 audit chain arc (primitive origin)
- chat-Claude 2026-08-17 「新しいアイデア」 arc (提案 origin)
- STEP 1340 arc site page (Rei-Automator audit-log.ts + Galois pair)
- [[feedback-motivation-ground-not-user-pleasing-but-agent-operational-2026-08-15]] — 動くか動かないか criterion (pytest 23/23 = 動く)
- [[feedback-no-rush-publication]] — 急がず ゆっくりと (Phase 1 完了で pause、 §10 準拠)
- [[feedback-chat-claude-hallucination-warning]] — chat-Claude 内部矛盾 (「+4 MCP 警告」 vs 「+1 独立 MCP 提案」) 発見、 但し 責務 clean separation で 型 変える 提案は 質 が 異なる
- [[feedback-independent-verification-cross-agent-collaboration-2026-08-15]] — 独立検証原則 (私 前 turn 推奨 と chat-Claude 別 提案 併存)