# Tiling Check Chunked Embeddings Implementation Plan
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** `nomic-embed-text` の 2,048 トークン上限を超える wiki ページでも、内容を欠落させずにページ単位の埋め込みを計算できるようにする。
**Architecture:** 本文を UTF-8 バイト数の保守的な上限で分割し、段落・改行境界を優先しつつ、巨大な単一段落は必ずハード分割する。各チャンクを既存のローカル Ollama API で埋め込み、チャンク長による重み付き平均と L2 正規化でページベクトルへ集約する。埋め込み方式の識別子を本文ハッシュへ含め、旧方式のキャッシュと混在させない。
**Tech Stack:** Python 標準ライブラリ、`unittest`、Ollama `/api/embeddings`
---
## 設計判断
- `/api/embed` の既定切り詰めは使わない。HTTP エラーは消えるが、ページ後半が埋め込みから失われるためである。
- モデル固有のトークナイザー依存は追加しない。UTF-8 バイト上限を保守的な代理値として使い、特殊トークン分の余裕を残す。
- ページキャッシュのスキーマは維持する。保存する値は従来どおりページ単位のベクトルである。
- 分割処理は `contextual-prefix.py` から流用しない。同処理は巨大な単一段落を上限以下へ保証できないためである。
### Task 1: 長文分割の回帰テスト
**Files:**
- Create: `scripts/test_tiling_check.py`
- Modify: `scripts/tiling-check.py`
1. 長い日本語本文が複数リクエストへ分割される失敗テストを書く。
2. `python3.13 -m unittest scripts/test_tiling_check.py -v` で期待どおり失敗することを確認する。
3. UTF-8 文字を壊さず、各チャンクを上限以下にする最小の分割処理を実装する。
4. 同テストが成功することを確認する。
### Task 2: ページベクトル集約
**Files:**
- Modify: `scripts/test_tiling_check.py`
- Modify: `scripts/tiling-check.py`
1. チャンク長による重み付き平均、L2 正規化、次元不一致拒否の失敗テストを書く。
2. テストが期待どおり失敗することを確認する。
3. 最小の集約処理を実装する。
4. 短文の単一リクエスト互換性を含めてテストする。
### Task 3: キャッシュと実環境の検証
**Files:**
- Modify: `scripts/test_tiling_check.py`
- Modify: `scripts/tiling-check.py`
1. 新方式が旧方式と異なる本文ハッシュになる失敗テストを書く。
2. 埋め込み方式識別子をハッシュへ含める。
3. 単体テストと構文検査を実行する。
4. `wiki/CLAUDE.md` と長い concept ページを実 Ollama で埋め込み、HTTP 500 が再発せず複数チャンクが処理されることを確認する。
## 検証結果
- Python 3.13 の単体テスト 7 件に成功。
- `wiki/CLAUDE.md`: 4 チャンク、最大 1,657 バイト、768 次元。
- `wiki/concepts/2σ手法.md`: 6 チャンク、最大 1,797 バイト、768 次元。
- `wiki/concepts/AIOps.md`: 28 チャンク、最大 1,792 バイト、768 次元。
- 上記 3 ページはいずれも Ollama 0.30.9 の実モデルで HTTP エラーなく埋め込みを完了し、集約後のベクトルは L2 ノルム 1.0 となった。