---
name: project-step1402-d8-ledger-query-2026-08-24
description: STEP 1402 d8_ledger_query v0.1 = rei-aios MCP tool consuming rei-checker-mcp v0.3 ledger (Lean 4+NEITHER pending (c) pickup 完了)
metadata: 
  node_type: memory
  type: project
  originSessionId: dadb5340-3a5e-41c6-a6ea-a557191d9c84
  modified: 2026-08-23T22:30:50.272Z
---

# STEP 1402 — d8_ledger_query v0.1 (rei-aios MCP)

**Date**: 2026-08-24
**Repo**: rei-aios (single-repo change)
**MCP**: rei-aios v2.8.5 → 43 → **44 tool** (auto-count STEP 1378 反映)

## 経緯

- STEP 1401 で rei-checker-mcp v0.3.0a1 wired: verify() → ledger.jsonl (`d_fumt8` field 記録)
- pending pickup (c) ledger_query = rei-aios MCP 側から rei-checker ledger を D-FUMT₈ aggregation で consume する tool
- 藤本さん directive 「(c) ledger_query 実装」 選択
- 責務分離 (単方向 flow): rei-checker verify() → ledger write / rei-aios d8_ledger_query → ledger read + aggregate

## 実装

**新規 file 2 + 3 file 修正**:

| file | 変更内容 |
|---|---|
| **`src/mcp/d8-ledger-query.ts`** (NEW、 ~290 行) | `queryLedger()` + `ledgerQuerySpec()` + `LedgerRow` / `LedgerFilter` / `LedgerAggregation` types |
| **`test/step1402-d8-ledger-query-test.ts`** (NEW、 16 part 81 assertion) | filter / aggregation / edge case / backward compat 網羅 |
| `src/mcp/rei-mcp-server.ts` | import + tool 定義 + case handler (banner v2.8.5 43 → **44** auto-count 反映) |
| `package.json` | test:step1402 script |

## Design (spec §1.3 preservation via 単方向 flow)

```
rei-checker-mcp verify()  →  ledger.jsonl (d_fumt8 field)  [Option X, STEP 1401]
                                    │
                                    ▼
rei-aios d8_ledger_query  ─── reads, filters, aggregates  [本 STEP 1402]
                                    │
                                    ▼
                          downstream analysis / reporting
```

**Read-only invariant**: 本 tool は ledger を **一切書かない**、 rei-checker が 既に 書いた field を 読むのみ = spec §1.3 (rei-checker) 保護 継承。 「新 API surface 追加」 ではなく 「既存 surface 消費」。

## API (5 filter + 6 aggregation field)

**Input**:
- `ledgerPath?: string` (auto-detect: `C:/Users/user/rei-checker-mcp/ledger.jsonl` or Linux path)
- `filter?: {verdict?, reasonCode?, dFumt8?, since?, until?}` (5 field、 AND 合成、 全 optional)
- `limit?: number` (default 100、 max 10000、 tail return)
- `includeAggregation?: boolean` (default true)
- `includeRows?: boolean` (default true、 false で aggregation のみ)

**Output** (success):
- `ledgerPath, ledgerExists, totalRowsRead, malformedRowsCount, filteredRowsCount`
- `rows?: LedgerRow[]` (opt-in via includeRows)
- `aggregation?: {totalRows, byVerdict, byReasonCode, byDFumt8, decisionRate, d_fumt8_coverage}` (opt-in)
- `source: 'd8-ledger-query'` (marker)
- `honestScope: string[]` (6 items 常時)

**Output** (error): `{error: 'invalid-input' | 'ledger-not-found' | 'read-error', detail}`

## 5 filter graceful handling

- Ledger 不在 → `ledgerExists: false` + 空 aggregation + graceful (error でない)
- Malformed rows → silent skip + `malformedRowsCount` に count 集約
- Pre-v0.3 rows → `d_fumt8` field 欠如 = `d_fumt8_coverage < 1.0` で 明示 (retroactive inference しない)
- Filter 未指定 → 全 rows aggregate
- limit=0 → rows 空 + aggregation は 全 filtered set (「aggregation 常に filtered 全体」 invariant)

## test 実測 (81/81 PASS)

- 16 part: ledger 不在 / happy path / filter × 4 / combined / backward compat / malformed / limit tail / opt-out / invalid input / limit=0 / source marker / spec-as-data / honest scope
- pre-v0.3 backward compat test [8]: 3 rows (1 pre-v0.3 + 2 v0.3) → `d_fumt8_coverage = 2/3`、 pre-v0.3 row NOT counted as "unknown" (honest skip)
- edge case invalid input [12]: negative limit / NaN / non-string filter value / non-object filter 全 rejected

## MCP e2e stdio smoke (real ledger consume)

```
Rei MCP Server v2.8.5 起動済み（stdio モード・44ツール (auto-count、 finding #32 systemic 対策 STEP 1378)・起動時インデックス構築）
```

tools/call `d8_ledger_query` with real `C:/Users/user/rei-checker-mcp/ledger.jsonl`:
```json
{
  "ledgerPath": "C:/Users/user/rei-checker-mcp/ledger.jsonl",
  "ledgerExists": true,
  "totalRowsRead": 11,
  "malformedRowsCount": 0,
  "filteredRowsCount": 11,
  "aggregation": {
    "totalRows": 11,
    "byVerdict": {"UNDECIDED": 5, "VALID": 6},
    "byReasonCode": {"TIMEOUT": 5},
    "byDFumt8": {"NEITHER": 2, "TRUE": 2},
    "decisionRate": 0.5454545454545454,
    "d_fumt8_coverage": 0.36363636363636365
  },
  "source": "d8-ledger-query",
  "honestScope": [...]
}
```

Verified:
- 実 11 rows 読み込み + malformed 0
- backward compat: 4 rows only have d_fumt8 (v0.3+) = coverage 36.4%
- decisionRate 54.5% (VALID+INVALID / total)
- byReasonCode TIMEOUT=5 (only UNDECIDED reason present in this ledger)

## Rei stack alignment

- **Rei stack MCP 9 systems の 消費 pipeline 第 1 号**: rei-checker-mcp (9th system, STEP 1401) → rei-aios (1st system) の cross-project consumption
- **STEP 1349/1350/1371/1376/1377/1379/1397 D-FUMT₈ surface**: 全て rei-aios 内 producer、 本 STEP は **rei-checker からの inter-project consumer**、 D-FUMT₈ ecosystem に cross-project data flow 追加
- **source marker discipline** (STEP 1349/1350 pattern 継承): `source: 'd8-ledger-query'` で rei-checker の `'rei-checker-d-fumt8-mapping'` + rei-aios connectors の `'static-truth-table'` / measurement `'measurement-verdict-mapping'` と 区別可能 = downstream analysis で 発生源明示

## Lean 4+NEITHER pending 5 選択肢 状態 更新

| # | option | status |
|---|---|---|
| (a) | Andrica verify | ⏸ 別 STEP candidate (rei-checker-mcp v0.3 経由 実 verify 可能に なった) |
| (b) | rei-checker-mcp v0.3 拡張 | ✅ **STEP 1401 で 完了** |
| **(c)** | **ledger_query 実装** | ✅ **本 STEP 1402 で 完了** |
| (d) | (b)+(c) セット | ✅ **完了** ((b) STEP 1401 + (c) STEP 1402) |
| (e) | 別方針 | 該当なし |

**pending memory 全 close 状態** (残 (a) は 別 arc として 独立、 pending memory は archive candidate)。

## Honest scope 7 条

1. **Read-only invariant** = ledger write 一切なし、 rei-checker 側 spec §1.3 継承保護
2. **novelty ゼロ** ([[feedback-world-uniqueness-claim-controllable]] 適用) = JSONL parse + filter + aggregate は 標準 pattern、 novelty は rei-checker → rei-aios cross-project D-FUMT₈ flow の Rei stack 内 初 arc のみ
3. **Auto-detect ledger path** は Windows/Linux 2 candidate のみ、 macOS 等は 明示 override 必要
4. **Aggregation は filtered set 集計** (「全 ledger」 ではない)、 filter 未指定時のみ 全 ledger 統計、 混同注意 (honest scope [16b] 明示)
5. **Pre-v0.3 rows は d_fumt8 欠如** = retroactive inference しない、 `d_fumt8_coverage < 1.0` で 明示
6. **Recent-N tail return** = ledger 全体 return しない、 aggregation は 全 filtered set、 rows は tail (最新順ではない chronological order 保持)
7. **SAC-4 47 教訓 Phase 3-19 継続** = pre-staged 0 件 confirm 後 明示 file add、 write-time STEP number verify (STEP 1401 直前完了 catch、 collision なし)

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

- **d8_ledger_query v0.2** = spec-as-data 引数 flag 追加 (現状 embed) + histogram output (byDFumt8 の 時間経過)
- **(a) Andrica verify** = rei-checker-mcp v0.3 を 経由して STEP 1387 予告 Andrica 22 zero-sorry 実 verify
- **rei-aios stats aggregation との統合** = decision_rate cross-project dashboard
- **Multiple ledger sources merge** = 複数 rei-checker instance の ledger を union query
- **ledger schema drift detection** = pre-v0.3 vs v0.3+ の schema difference を 検出 report

## 関連

- [[project-step1401-rei-checker-mcp-v03-lean-repl-d8-2026-08-24]] (STEP 1401 前提、 本 STEP は consumer 側)
- [[pending-lean4-neither-mcp-connector-2026-08-23]] (本 STEP で (c) pickup 完了、 (a)-(d) 全処理済で archive candidate)
- STEP 1349 (D-FUMT₈ operator connectors、 source marker discipline 起点)
- STEP 1350 (measurement verdict mapping、 source marker pattern 継承)
- STEP 1371 (multi-trial FDR、 aggregation pattern 参考)
- STEP 1378 (MCP tool count auto-count、 本 STEP で 43→44 auto 反映)
- STEP 1380 (TS/Python drift check、 spec-as-data export pattern 継承)
- [[feedback-all-research-site-reflection-default]] 2026-08-06 protocol 継続
- [[feedback-no-rush-publication]] 単日 close
- [[feedback-world-uniqueness-claim-controllable]] 継承
- [[feedback-projection-self-audit-pattern]] SAC-4 継承
- [[feedback-critique-response-pattern]] SAC-4 100% 認諾 discipline
