Semantic search over a Markdown knowledge base, served over MCP.
ADR-0028 は、.docx の読み方の変更に
既存の索引が普通の run 1 回で追いつく仕組みを決めた: index_meta の policy key が現行値で
ない間、変わっていない .docx を読み直し、行ごとに決着させる。この pass は .docx 専用で、
key、読み直す行を選ぶ述語 (rereads_unchanged_docx)、awaiting-reparse の印、最後の
transaction がどれも "docx" を名指していた。
v1.19.0 は .pptx の読み方を変える: 表の行を 1 行に書き (セルはタブ区切り)、<a:br> を改行
として読む。変わっていない .pptx は、索引がある限り前の版が切った chunk のまま残る。
ADR-0028 が .docx で解いたのと同じ問題で、ADR-0028 の見直し条件「別の形式でも同じ追いつきが
要る変更が来た時」に当たる。本 ADR は、ADR-0028 の「行ごとの列 (選択肢 1) が一般形」という
一文を置き換える。
.docx の key・値・告知と、それを固定している test を変えない。.docx の test が key の値と
「key を消すと pass が開く」を固定している。この 2 点で却下。.docx の pass を .pptx 用に写す。 .docx の経路は変わらないが、同じ問い (「この run は
この行を読み直すか」) に実装が 2 つになり、AGENTS.md が禁じる形になる。index_meta の key を持つ: .docx は今の 3 本 (ADR-0028)、.pptx は
pptx_table_break_policy (tab-joined-rows-kept-breaks)。rereads_unchanged_as(extension, stale, …) が決める: その形式の
pass が走っている、その形式の parser が書いた行である、hash が走査の hash と一致する。
rereads_unchanged_docx はその .docx の場合。awaiting-reparse を付けるかは 1 つの述語 stale_row が決める: pass が
走っている形式の行であること。.docx の key を今の順に、その後に .pptx の
key。cancel された run とエラーを返した run はどれも書かない。groove index は走る pass ごとに loop の前に告知し、.docx の行を先に出す。file watcher は pass
を走らせない。.pptx の key が古くても .docx は読み直さず、その逆もない。v1.18.0 からの索引は .pptx を
1 回読み直し、.docx は fast path のまま。.pptx を旧規則で書き続け、それは --force でしか戻らない。.docx の条件を引き継ぐ)、
または 3 つ目の形式に追いつきが要る時。
(2026-10-17, v1.20.0) .docx に 4 本目の key が要り、この条件に当たった。形式ごとの key を
維持した理由は ADR-0030。grooveseek/src/indexer.rs (述語と告知)、grooveseek/src/db.rs (key)、
grooveseek/tests/index_pptx_table_policy.rs (run、形式をまたぐ場合、書き込みの失敗、callback、
watcher)。