コンテンツにスキップ

エージェントハーネス設計 v7 — 記憶体系(貯めるではなく、読む・刈る)

状態: 人間ゲート通過(2026-09-15・akapen 4 問に回答・全体への赤ペンなし)・bd 起票済み(親 wl-2w3p)。 経路: eval-loop 1 周 86 点(閾値 80)→ 評価者が指摘しコーディネーターが独立に再現した事実誤り 1 件(§1-4 の「役割 4 ファイル」)と 派生 5 点を訂正 → akapen シート akapen/harness-v7-memory-01.html(試問 2 巡・問い 4)→ 回答を §7 と本文へ反映。 シート作成中に本書の数値の誤りをもう 1 件見つけて訂正した(§1-4 の索引の行長。文字数以外の単位で数えていた)。 訂正分と §7 は採点されていない(86 点は訂正前の版に対する点)。 前版: v6 — 分岐の根拠と評価の独立性。v6 の規律はすべて不変。 正典の優先順位は ユーザー指示 > AGENTS.md > 本設計 > プラグイン既定(v6 と同じ)。

0. 読めた範囲と読めていない範囲

素材は masa_wunder 氏の記事 1 本の公開部と、2026-09-14〜15 の開発記録(10 PR・レビュー 17 巡)である。 有料本文(¥24,800〜)は未読。以下は公開部の要約であり、非公開の実装を再現したものではない。 人間ゲート(§7 Q4)で購読して照合すると決まった(人間タスク wl-3iez → 照合 wl-yxen)。読めた時点で §3 と照合し、違いがあれば根拠付きで改訂する。それまで本書は公開部と Greco の実測だけで自立する。

記事 公開部で読めた主張(要約) 読めていない範囲
第二の脳を作れ!記憶体系の重要 1 ピース『LLM-Wiki』(2026-09-14) LLM が忘れるのは「覚えておく場所を与えていないから」。3 層=生の資料(人が集め・LLM は読むだけ)/ Wiki(LLM が書く Markdown・継続更新)/ スキーマ(Wiki 構成のルール)。3 操作=入れる / 聞く(良い答えを wiki に戻す)/ 点検する(矛盾・古い記述)。RAG は整理結果を使い捨てるが LLM Wiki は記録して再利用する 本文の実装・ディレクトリ構成・プロンプト・運用例

§3 はこの 3 層 × 3 操作を手掛かりに、Greco の記録から導いた運用上の裁定である。 記事の提案そのもの、または効果が検証済みの手法とは認定しない。

この文書の数値そのものが、この文書の主張の実例である。 §1 は 2026-09-15 07:45〜07:55 の実測だが、 同日早朝に書いた草案からすでに 7 項目が動いていた(§1 冒頭の差分表)。 草案が「これから直す」と書いた提案が、書いている間に実行済みになっていた例が 2 件ある: §3-4(resume-state の分割)と、§3-3 が「最初の対象」に挙げた役割ファイルの統合(§1-4 の訂正)である。 後者は本書の eval-loop の評価者が見つけたもので、書き手(生成)も計画(コーディネーター)も見落とし、 「4 ファイルが別世代を語る」という既に偽になっていた記述を残したまま 1 周目を通した。 さらに report 件数は本セッション中の 9 分間に 757 → 760 へ動いた(§1-1 脚注)。 記録は古びる速度が速く、古びたことに気づく操作(§3-3)が無ければ、実測を売りにした文書ほど早く嘘になる

1. 実測 — 3 層はすでに全部ある。壊れているのは 3 操作のほう

計測は 2026-09-15 07:45〜07:55、読み取り専用コマンドのみ(ls / wc / du / find / grep / awk / comm / git ls-tree / bd show)。対象は ~/.claude/projects/-Users-kyoei-woo-Projects-waste-link-waste-link/memory/(memory)と ~/orca/workspaces/waste-link/*/(ワークツリー)と本ワークツリーの AGENTS.md

再実測で草案から動いた項目(数字を黙って差し替えず、動いた事実のほうを残す):

項目 草案(同日早朝) 実測(07:45〜07:55) 計測コマンド
memory の .md 総数 116 115(索引 1 + 本体 114) ls -1 *.md \| wc -l
memory 総量 796KB 616KB du -sk .
8KB 超のファイル 5 本 4 本(+ 索引自身) find . -maxdepth 1 -name '*.md' -size +8k
名前に日付を含むファイル 2 本 1 本 ls -1 *.md \| grep -E '20[0-9][0-9]-[0-9][0-9]'
7 月以前から未更新 68 本 67 本(8 月以前は 86 本) find . ! -newermt '2026-08-01'
verdict 358 本 325 本 find …/.worker-specs -name '*-verdict.md' \| wc -l
ワークツリー数 11 12(exec 6 / review 5 / coordinator 1) ls -d …/waste-link/*/

差の大半は §3-4 の分割(171KB の 1 ファイルを memory の外へ出した)と、 草案が別ワークツリーのローカル値を数えていたことによる。verdict の 358 → 325 は「減った」のではなく、 草案の計測範囲が広すぎた(12 ワークツリーの .worker-specs に限定して再計測した値が 325)。

1-1. 層の対応表

記事の層 Greco での実体 読者 いつ context に入るか(記事の 3 分類・§8) 実測(2026-09-15 07:45〜07:55)
生の資料 .worker-specs/*-report.md / *-verdict.md(12 ワークツリーに散在)、docs/superpowers/specs/**、JWNET 仕様書 PDF コーディネーター(verdict は投入前にコピーして読む) 取りに行く(読むときに開く。context に常駐しない) verdict 325 本・report 760 本。gitignore 対象だが develop に 27 本が追跡されているgit ls-tree -r --name-only origin/develop -- .worker-specs \| wc -l。wl-r010 起票時は 12 本・以後も増えた)
Wiki(コーディネーター用) ~/.claude/projects/…/memory/*.md + 索引 MEMORY.md コーディネーターだけ(ワーカーには見えない・repo 外) 索引は常に読ませる(毎セッション自動)・本文は取りに行く(grep → 開く)・指示書へ写した分は操作記憶(投入の直前に差し込む・§3-1) 本体 114 ファイル / 合計 616KB。索引は 114 行・23,686 字・34,127 byte。索引⇄ファイルの対応は健全(索引 114 行 ⇄ 本体 114 本・欠落も孤児もゼロ)
Wiki(ワーカー用) AGENTS.md の「不変条件ラチェット」節 全エージェント 常に読ませる(314,661 byte 全部・上限超過で無視される・§1-5) 314,661 byte(307.2 KiB)/ 79 節 / うち 64 節がラチェット55 節が scripts/proofs/ へ接地=歯つきの compiled knowledge。256,000 byte の読込上限を 58,661 byte 超過し、少なくとも 1 ツールで丸ごと無視(§1-5・wl-hgo7・P1)
スキーマ memory: コーディネーターの system prompt 内(1 事実 1 ファイル・frontmatter・索引 1 行・[[link]])。AGENTS: 冒頭の「唯一の正典」宣言と Routing 節。.beads/PRIME.md の分担表 memory の schema はコーディネーターの system prompt にしか無い(repo に無い・ワーカーは知らない) 常に読ませる(system prompt) type の内訳は feedback 41 / project 47 / reference 25 / feature 1(schema 違反・許容は user / feedback / project / reference)

Wiki が 2 つあり、読者が違う。 コーディネーターは memory を読み、ワーカーは AGENTS.md を読む。 ワーカーへ届く知識は AGENTS.md に追記する以外に経路が無いため、ラチェットが 64 節まで積み上がって上限を超えた。 memory 側も同じで、追記が既定・削除と統合が無い。

report 760 本は本セッション中に動いた。 07:45 の計測では 757 本、07:54 の再計測で 760 本 (find … -newermt '2026-09-15 07:45' \| wc -l = 5)。稼働中のワーカーが書き足している。 生の資料は「今いくつあるか」を固定できないので、§3-3 の検査対象にも §6 の見積の根拠にもしない。 固定できるのは wiki 側(memory・AGENTS.md)だけである。

1-2. 「忘れた」5 件のうち 4 件は記録済みだった(2026-09-14 実測)

事象 記録の所在 種別
仕様書の印刷ページ番号(2-15 等)を節番号と読んだ memory jwnet-spec-pdfs-local-and-d31-layout同じ罠を明記 取り出し失敗
接続テスト経路の照合手段に resolve_web_edi_submitting を書いた(jwnet_submissions 用で対象外) AGENTS.md JWNET 節「接続テスト経路が実際に使う RPC は next_jwnet_request_code のみ」 取り出し失敗
指示書に docs-manual-ratchet というファイル名を書いた(実在せず) memory docs-manual-ratchet-and-merge-gatingmemory の名前をファイル名と取り違えた 取り出しの型違い
未リリース量を「165 commit」と書いた memory release-pr-needs-release-branch-content-neutral-merge 取り出し遅延(計算後に思い出した)
message_type を 10 値と書いた(12) コードのみ 記録なし

5 件中 4 件は wiki にあった。 貯める規律(v3 の LEARN・v6 の決定台帳)はあるが、 行動の前に読む規律が無い。記事の「聞く」に当たる操作に発火点が無い。

1-3. 「入れる」が verdict から起きていない

2026-09-14 に verdict で確定し、プロジェクト横断で再発しうる知見:

  • toThrow(string) は部分一致。旧文言が新文言を含むと歯にならない(#805 R1)
  • Set(...).size は出力文字列の個数を固定するだけで、トリガ⇄期待文言の対応は固定しない(#805 R2)
  • PostgREST は同一列の複数条件を AND する。select=id,id,env は 200(#803 R2)
  • is(null) の偽側は非 NULL の fixture 行が無いと一度も通らない(#803 R3)
  • nssm の停止猶予は各段階 1,500ms が既定。console 段階だけが SIGINT を運ぶ(#801 R3)
  • mergeable=MERGEABLE はテキスト衝突の有無だけ。意味的合流は交差の実測で(#801・#805)
  • 待受が armed の間に素の check を打つと delivery を横取りする(本セッション)

7 件のうち memory へ書いたのは 1 件provider-billing-failure-is-silent-to-orchestration。 残りは resume-state の追記と chat のみ)。verdict は生の資料として 325 本たまっているが、 そこから wiki へ compile する操作がループに無い

しかも、その 1 件は索引から溢れて読まれていなかった(§1-4)。 書く操作だけを直しても、索引の書式が壊れていれば読まれない。§3-2 と §3-3 は片方だけでは効かない。

1-4. 「点検する」が無い — 索引は容量ではなく書式で壊れる

索引の真因は総量ではなく 1 行の長さである。 ローダーは本セッションで次を逐語で警告した:

MEMORY.md is 24.5KB (limit: 24.4KB) — index entries are too long. Only part of it was loaded: 1 of 115 lines were cut off, starting at line 115 Keep index entries to one line under ~200 chars; move detail into topic files.

ローダーは上限とあわせて書式の規約(1 行 200 字以下)を明示している。実測は次のとおり:

計測 値(文字数・2026-09-15 08:55 再計測) コマンド
索引の行数 114 wc -l MEMORY.md
200 字を超える行 66(= 58%) python sum(len(l) > 200 for l in lines)
最長の行 280 字 python max(len(l) for l in lines)
200 字以下の行 48 同上を反転
合計 23,685 字 python len(text)

訂正(akapen シート作成中に発見): 草案は「112 行・最長 438」と書いていたが、これは awklength() を UTF-8 でない数え方(byte または表示幅)で走らせた値で、ローダーの規約「~200 chars」とは単位が違っていた。 文字数で数え直すと 66 行・280 字である。単位を書かない数値は、この文書が §5 で禁じている自己認定と同じ穴だった。

ローダーの「KB」は文字数 ÷ 1024 である(草案の §5 では再現できていなかった)。 警告時の索引は 25,082 字で 25,082 ÷ 1024 = 24.5、上限の 24.4KB は約 24,985 字(24.4 × 1024 = 24,985.6。表示は小数第 1 位への丸めなので、厳密な閾値は表示値からは確定できない)。 つまり警告は合計文字数が約 25,000 字を超えると出る。合計を押し上げているのが 1 行の長さで、 114 行がすべて 200 字以内なら合計は最大 22,800 字で上限に届かない。索引は ローダーが明示した書式規約に 114 行中 66 行で違反しており、容量超過はその帰結である。 切り落とされた 1 行は provider-billing-failure-is-silent-to-orchestration = §1-3 が「7 件中ただ 1 件 memory へ書けた」と誇っている当のエントリだった。 書いても索引から溢れて読まれない状態だった。索引は 07:43 に長い 14 行を短くして 115 行 → 114 行・23,685 字になり、 09-15 09:00 頃の再読込で警告が消え末尾行まで読み込まれたことを観測した。ただし 66 行が 200 字を超えたままなので、 数本足せばまた出る(I1 の是正対象)。 行が 1 本減った原因を §3-4 の分割に決め打ちしない: 分割は memory 内の改名 + 本文の移送で索引の行数を減らさず、 同じ 07:43 に coordinator-is-orchestrator-delegate-implementation の削除(下の訂正)も入っている。 どちらが減らしたかは未確認で、後者である可能性のほうが高い。 警告が消えたことは 09-15 の再読込で観測した(上記)。§3-3 の I1 は「ローダーの警告文を一次情報にする」 方針のまま、単位が分かったので自前閾値も同じ数え方(文字数)で置く。 容量を減らすのは対症療法で、行を短くしないと次の 1 件で再発する。

その他の症状:

症状 実測
8KB 超 4 本opencode-muse-implementer-harness 14,882 / jwnet-pivot-webedi-to-standard-edi 13,030 / jwnet-webedi-avoids-gateway-and-connection-test 12,698 / notion-workspace-structure 10,145 byte)+索引自身 34,127 byte
同トピック複数ファイルの矛盾 草案は「誰が実装し誰がレビューするか」が 4 ファイルに分かれて別世代を語ると書いたが、再実測では既に解消されていた(下の訂正を見よ)。現存は 3 本で、implementation-codex-review-claude が索引 description で「役割と model routing の単一の現況 + 8 世代の遍歴」と名乗り、orca-worker-start-codex-harness-v5 は「モデルの現況は implementation-codex-revi…」と単一ソースへ委譲している。4 本目の coordinator-is-orchestrator-delegate-implementation削除済みls で不在・索引にも 0 件)
陳腐化の疑い 本体 114 本のうち 67 本が 7 月以前から未更新(8 月以前まで広げると 86 本。frontmatter の modified が無いものは mtime で代用)
schema 違反 type: feature が 1 件(許容は user / feedback / project / reference)

[[link]] 切れ 15 件は 3 種類の混合だった。 素の \[\[[^]]*\]\] で拾って ファイル名集合と comm -23 した結果を全部読むと、性質がまったく違うものが混ざっている:

種別 件数 実体 対処
迷子(参照先が存在しない) 12 codex-review-model-gpt-5-6-terra / coordinator-resume-state-2026-07-19 / coordinator-resume-state-2026-07-23 / eval-loop / external-partner-driver-mobile-visibility / jwnet-request-file-nominee-binding-gap / linear-project-naming-no-product-prefix / resource-weighing-optimization-design / roadmap-2026-07-10-walkin-release-and-3-features / roadmap-external-partner-then-release-then-jwnet-edi / secondary-transport-daiei-pl-request / weighing-business-extension-design 張り替えるか削る(§3-3)
リンクでない記法(バッククォート内) 2 `[[kv_namespaces]]`(Cloudflare wrangler の TOML array-of-tables 記法・cloudflare-binding-deploy-real-wrangler.md:12)/ `functions/supabase/[[path]].ts`(CF Pages の catch-all ルートのファイル名・supabase-publishable-key-dlp-block-and-cf-pages-redeploy.md:43 検査から除外(永久に直らない偽陽性)
書式が壊れたリンク 1 [[canactasdriver は AuthContext.tsx:58-60]](散文をブラケットで囲んだもの・epd-attribution-canactasdriver-and-live-partner.md:12)。バッククォート外なので除外規則では落ちないが、参照先に空白と : を含むのでファイル名ではありえない 別枠で列挙(§3-3 の I5)

素の正規表現だけの検査は、15 件のうち 3 件を毎回ノイズとして出し続ける。 偽陽性が 2 割ある検査は読まれなくなり、点検そのものが死ぬ。 v6 が「検査に歯があるか(わざと壊して落ちるか)」を要求したのと同じ問題の裏側で、 検査に嘘の歯が無いかを同時に確かめる必要がある。

1-5. スキーマと Wiki の癒着(AGENTS.md)

AGENTS.md は「機械が守る不変条件」(スキーマ)と「機能ごとのラチェット履歴」(compiled knowledge)を 1 ファイルに持つ。後者が 64 節・うち 55 節は proof 接地で価値が高いが、スキーマまで一緒に読めなくなった

wl-hgo7(P1・OPEN・2026-09-13 起票)が記録した Muse Code 1.2.1 / exec-rigel での観測は次の 2 本である:

(1) rules file at .../AGENTS.md is 307753 bytes, over the 256000 byte load limit; it is skipped for this session (2) rules file at .../CLAUDE.md is ignored this session because AGENTS.md takes precedence in that directory

2 本目が効く。 AGENTS.md が上限超過で捨てられ、その巻き添えで CLAUDE.md も優先度規則により無視されるので、 そのセッションは正典を 1 文字も持たない。「大きすぎて読まれない」より一段重く、 分割しないかぎり回避策が無い(CLAUDE.md へ退避する手が塞がれている)。 現行の Claude / codex / OpenCode で同じ上限に当たるかは未実測= [仮説]

分割は wl-hgo7(P1・設計スライス)の範囲であり、本書は分割後の置き場のルールだけを決める(§3-6)。

2. v6 のどこに穴があったか

v6 は「書く」規律を足した — 決定台帳(§3-1)・変異表(§3-4)・往復の記録(§3-6)。 書かれたものは増えたが、読む前提と刈る前提が無かった:

  • 指示書テンプレートの「参照する仕様・証跡」は仕様と proof を指す欄で、memory を引く欄ではない。 コーディネーターが memory を読んだかどうかは指示書に痕跡が残らない
  • verdict を読んだ後の処理は「APPROVE ならマージ・BLOCK なら R+1」の 2 分岐だけで、 知見を wiki へ戻す分岐が無い
  • memory の schema はシステムプロンプトにしか無く、違反を検査するものが無い (索引の行長規約は、ローダーが警告を出すまで一度も見ていなかった)

3. 差分 — v7 で足す 6 点(すべて既存ループへの挿入・新しい器は作らない)

記事の操作 発火点(いつ・誰が・どこで) 使う既存の器 禁則
3-1 聞く 指示書を書く・コーディネーター・docs/harness/templates/ の 2 本 指示書テンプレート(既存欄へ並置) 索引の description だけで判断しない / memory 名をファイル名・コマンド名として書かない
3-2 入れる verdict 読了時(worker-release の前)・コーディネーター・memory ファイルメモリ PR の要約を memory にしない / 2 件以上書きたくなったら昇格の兆候として bd へ
3-3 点検する セッション開始時(機械)+ 月次(人)・コーディネーター scripts/ + memory 読まずに古いから消さない / 偽陽性を放置しない
3-4 点検する 実施済み(2026-09-15 07:35〜07:43) memory + session-log 現況ポインタに「学び」を書かない
3-5 (層の宣言・操作ではない) 常時・全員・.worker-specs/ .gitignore + bd wl-r010 生の資料を repo に入れない
3-6 (スキーマの宣言・操作ではない) 1 回・コーディネーター・docs/harness/ 文書 ワーカーの memory 書込を解禁しない

3-5 と 3-6 は記事の 3 操作に当たらない。層とスキーマをどこに置くかの宣言であり、 操作に無理に当てはめると「入れる」の一種に見えて 3-2 と混ざるので、そう明記して分けておく。

3-1. 「聞く」の発火点 — 指示書を書く前に wiki を引き、引いた名前を指示書に残す

コーディネーターは指示書(worker / review)を書くに、対象の領域語で memory の本文rg -il '<語>' ~/.claude/projects/<slug>/memory/)と AGENTS.md## 節名を grep し、 検索した語と、該当した memory 名を指示書に書く。該当が無ければ「該当なし」と書く(検索した語は残す)。 索引 MEMORY.md は Claude Code が毎セッション読み込む器なので残すが、該当の判断には使わない (§8: 記事の「索引を持たず毎回 grep」と、§1-4 で索引が実際に壊れた実例)。 人間ゲート Q1 = A: 毎回課す(領域を限らない)。検索した語まで残すのは、 「引いたが該当なし」と「引き忘れ」を後から区別するためで、§5 にあった計測手段の穴はこれで閉じる。 ワーカーは memory を読めないので、当たった記述はコーディネーターが指示書へ写す。 欄はその写し漏れの点検にも使う。 規約としては .beads/PRIME.md:103(分担表の「セッション横断の長期知見 = memory / ワーカーは使わない」)、 機構としては .opencode/opencode.json:3"instructions": ["AGENTS.md", ".beads/PRIME.md"]memory が入っていない)と memory が repo 外にあることの 2 つが根拠である。規約と機構の両方が閉じている。

新しい欄を作らない。 docs/harness/templates/worker-spec-template.md の 「対象・変更・所有範囲」節には既に 「参照する仕様・証跡 / 不変条件 / 触らない範囲」 の欄がある。 v7 はここに memory: 検索語 <語, …> / 参照 <名前, …>(該当なしなら memory: 検索語 <語, …> / 該当なし)を 並置するだけで、節も欄も増やさない(wl-6ysd)。

根拠: §1-2 の 4 件はすべて「grep すれば当たっていた」。 禁則: 索引の description だけで判断しない(本文を開く。description は §1-4 のとおり別世代を語ることがある)。 memory の名前をファイル名・コマンド名として書かない(§1-2 の 3 件目がこの取り違え)。

3-2. 「入れる」の発火点 — verdict 読了時に ≤1 件を wiki へ

settle ループ(check → verdict を読む → worker-release)に 1 手を足す: verdict の所見から、プロジェクト横断で再発しうる一般知見を最大 1 件選び、memory に書く (0 件も可・書かない理由は不要)。

判定基準(4 つとも満たす): (a) この PR 固有でない(別領域でも起きる) (b) 実測または一次資料で確定している (c) 既存 memory の更新で済まないか先に確認した (d) 判断・実測・文脈・失敗のどれかを含む (読めば分かる事実だけの知見は書かない — 「repo にあることは書かない」と同じ線・§8)。 書くときは verdict の逐語 1〜2 行と出所<ワークツリー>/.worker-specs/<verdict>.md:<行>を添える。 生の資料の場所を持つのは記事の raw: と同じで、言い換えだけの記録にしない。

基準 (a) は新しい規則ではない。 .beads/PRIME.md:69 の 「issue 固有の学び=bd / プロジェクト横断・セッション横断の知見=ファイルメモリ」の写しであり、 v7 が足しているのは判定の基準ではなく判定する時点(verdict 読了時)だけである。

根拠: §1-3 の 7 件中 6 件がこの基準を満たし、いずれも 1 段落で書ける。 禁則: PR の要約を memory にしない(それは bd close の reason の仕事)。 1 verdict から 2 件以上書きたくなったら、それは指示書テンプレートか AGENTS.md のラチェットへ 昇格すべき兆候として bd へ(memory を厚くする方向へ逃がさない)。 書いたら §3-3 の I1 を必ず通す(§1-3 のとおり、書いても索引から溢れれば読まれない)。

3-3. 「点検する」の定義 — 機械検査 5 つ + 月次の矛盾点検

機械検査(スクリプト化・セッション開始時に走らせる)人間ゲート Q2 = A: SessionStart hook で自動 (コーディネーターのユーザー設定 ~/.claude/settings.jsonhooks.SessionStart → repo の scripts/memory-inspect.mjs・wl-9jt1。.claude/.gitignore:50 で無視対象なので、hook の配線は memory と同じユーザー層に置き、repo には検査スクリプトだけを入れる)。 出力は 7 行(見出し + 5 検査 + 末尾の 1 行)で表示のみ・セッションを止めない・常に exit 0。 ✗ が出たとき直すかどうかはコーディネーターが決める(月次点検は人が矛盾・古さを見る別の場)。 見本は akapen シートの問 2 に置いた。 書いた瞬間の検査(PostToolUse Write|Edit・--hook-stdin・同じくユーザー設定側)は wl-r7ym で追加(2026-09-15)。

# 検査 閾値 2026-09-15 の実測
I1 索引 MEMORY.md1 行の長さ(文字数) 200 字超の行が 1 本でもあれば件数と最長を出す(ローダーの規約そのもの)。補助として合計 22,800 字超でも警告(上限 ≈ 24,985 字 = 24.4KB × 1024 の手前) 66 行 / 最長 280 字(要是正)・合計 23,685 字
I2 1 ファイルの大きさ 8KB 超で列挙 4 本(+ 索引自身)
I3 ファイル名に日付 20\d\d-\d\d を含めば列挙 1 本
I4 frontmatter の type user / feedback / project / reference 以外を列挙 1 本(feature
I5 [[link]] 先の不在 バッククォートに囲まれた一致を除外したうえで、参照先に空白・: を含むものを「書式が壊れたリンク」、残りを「迷子」として別の見出しで列挙 迷子 12 / 書式 1(除外 2)= 15 種・延べ 24 箇所

I1 の第一の指標は容量ではなく行長である。 §1-4 のとおり容量超過は行長違反の帰結で、 容量だけを見ると「索引を削ったから直った」と誤認して同じ形で再発する。 閾値の単位は文字数である: ローダーの「24.5KB / 上限 24.4KB」は文字数 ÷ 1024(§1-4 で再現)。 それでも ローダーが出す警告文そのものを一次情報として扱い、I1 の自前閾値は早期警告に留める (ローダーの実装が変わっても検査が嘘をつかないように)。

I5 は偽陽性を構造的に落とす。 §1-4 の 3 種のうち 2 件はバッククォート内の TOML / ファイル名記法で、 直しようがないので除外する。1 件は参照先に空白と : を含むため、ファイル名ではありえないと機械判定できる。 迷子 12 件と混ぜて 15 件と報告すると 2 割が永久に残り、点検が読まれなくなる。

月次の矛盾点検(人=コーディネーターが読む): 同トピックで 2 本以上ある memory の description を並べ、 新しい 1 本に統合して古い方を削除する。作法の手本は役割 3 本(§1-4 の訂正)で、 単一の現況を名乗る 1 本 + 遍歴 + 他からの委譲という形が既に出来ている。これを他トピックへ広げる。 統合の作法: 残す 1 本に「遍歴」を 1 段落で書き、削除する側の [[name]] 参照を残す側へ張り替える (削除だけすると I5 の迷子が増える)。初回は 2026-10(wl-v4tz・迷子 12 件の張り替えを含む)

根拠: I1〜I5 は 2026-09-14〜15 にすべて手作業で見つけた。機械化しないと次も気づかない。 禁則: 点検を「読まずに古いから消す」に使わない。削除は統合の結果としてだけ起きる。 偽陽性を放置しない(出し続ける検査は無視される検査になる)。

3-4. 追記ログを wiki から出す — resume-state は「生の資料」

実施済み(2026-09-15 07:35〜07:43)。 草案は分割を提案していたが、本ターンの実測時点で完了していた:

分けた先 実測 役割
memory/coordinator-resume-state.md 07:45 の計測で 2,556 byte、08:10 の再計測で 3,031 byte(並走セッションが更新中・≤3KB の自己申告を既に超えた)。名前に日付なし・frontmatter の description に「≤3KB・学びは書かない。過去のセッション記録は …/session-log/ に日付別」と自己申告 現況ポインタ(到達点 / open PR / 稼働 dispatch / 次の一手 / 一時措置の有無だけ)
~/.claude/projects/…/session-log/coordinator-resume-log-2026-08-03-to-2026-09-15.md 175,819 byte(memory の外) セッション記録(生の資料)。本文をそのまま移した

memory から [[session-log-…]] のように参照しない(生の資料は wiki からリンクしない・読むときは開く)。

実行して初めて分かったことが 2 つある。

  1. 改名は既存の壊れたリンクを直さない。 [[coordinator-resume-state-2026-07-19]][[coordinator-resume-state-2026-07-23]] は分割後も壊れたまま残っている(§1-4 の迷子 12 件に含まれる)。 発信元は secondary-carryover-explicit-not-derived.md:22jwnet-webedi-avoids-gateway-and-connection-test.md:30 の 2 箇所である。 「日付を名前に入れない」はこれ以上増やさないための規則であって、既にあるものの修復ではない。 修復は別操作(張り替え)で、§3-3 の月次点検が担う。誰がいつやるかは §5。
  2. 日付は wiki では禁則、生の資料では必須。 移した先のファイル名は …-2026-08-03-to-2026-09-15.md で日付範囲を持つ。これは正しい。 禁則は「wiki の名前に日付を入れない」であって「日付入りの名前を禁止する」ではない。 生の資料は時系列で積むものなので、日付が無いほうが壊れる。I3 の検査対象は memory ディレクトリだけで、 session-log へ広げてはならない。

根拠: §1-4。171KB の 1 ファイルは「毎回全文を読む」前提を壊し、日付入りの名前がリンクを 2 件壊した。 禁則: 現況ポインタに「学び」を書かない(学びは §3-2 で個別 memory へ)。

3-5. 生の資料の置き場を宣言する — verdict は compile 対象・repo には入れない

  • .worker-specs/*-verdict.md / *-report.md生の資料.gitignore のまま。 develop に追跡されている 27 本(実測)は wl-r010 で撤去する (sweep-audit.md は AGENTS.md が参照するので例外・既存の .gitignore 注記どおり)
  • verdict の「所見」節と「独立変異」表が §3-2 の compile 対象。report の「未検査の象限」は PR 本文へ転記済みなので対象外
  • ワークツリーの .worker-specs/ は削除しない(worker-read の transcript と同じ扱い・保存期間は未確定 §5)
  • 件数を目標にしない。 §1-1 の脚注のとおり report は稼働中に増え続ける(9 分で 3 本)。 「生の資料が何本あるか」は §3-3 の検査対象にしない

3-6. スキーマを repo に置く — memory の書き方を 1 ファイルで

memory の schema(1 事実 1 ファイル・frontmatter・索引 1 行 200 字以下[[link]]type の 4 値・ 名前に日付を入れない・8KB 目安)を memory-schema.md に書く。 コーディネーターの system prompt と同じ内容をrepo で読める形にする。 人間ゲート Q3 = A: 写しを置き、2 条件を課す。正は system prompt、repo の文書は写し (食い違ったら system prompt を正として写しを直す。冒頭にそう明記する・wl-6ysd)。 ワーカーが memory を書くことは解禁しない(PRIME.md:103 の分担どおり)。 目的は §3-3 の検査の根拠と、次のコーディネーターへの引き継ぎである。

AGENTS.md の分割(wl-hgo7)は本書の外。置き場(新しいディレクトリ名)を本書が決めることはしない — それは新しい器を作ることであり、§3 の前提に反する。本書が先に決めるのは分割の受入条件 2 つだけである:

  1. 分割後の AGENTS.md 本体が読込上限を下回ること(ツールの警告が消えたことを実測する。 §5 のとおり 09-13 の警告は 09-09 版のファイルを読んだ値で、数え方の違いではなく版の違いだった。それでも警告文を一次情報にする方針は変えない)
  2. 退避先の CLAUDE.md が生きていること(§1-5 の 2 本目の警告。本体を縮めても優先度規則で CLAUDE.md が無視されたままなら、そのセッションの正典はやはり欠ける)

「機械が守る不変条件=スキーマ」と「機能ごとのラチェット履歴=compiled knowledge」を別の器に分ける という区別だけは本書の言い分として残す。どのパスへ置くかは wl-hgo7 の設計スライスが決める。 2 条件は 2026-09-15 に wl-hgo7 の受入条件へ追記済み

4. 変えないもの

変えないもの 出典 v7 がそれと矛盾しない理由
bd remember は原則使わない。長期知見はファイルメモリが正典 .beads/PRIME.md:72(裁定 #1)・:103 §3-2 の書き先は memory であって bd ではない。bd へ回すのは「昇格すべき兆候」= issue 化のときだけ
issue 固有の学び=bd / プロジェクト横断・セッション横断=ファイルメモリ .beads/PRIME.md:69 §3-2 の判定基準 (a) はこの行の写しであり、新規の規則ではない。v7 が足したのは判定する時点だけ
知見 → ファイルメモリ / 状態の二重更新はしない(進行状態の権威は bd) .beads/PRIME.md:119-120 §3-4 の現況ポインタは「到達点 / open PR / 稼働 dispatch」を持つが、進行状態の権威は bd のまま。ポインタは再開時の索引であって更新対象ではない
eval-loop は文書系成果物のみ・fork 版既定・2 周上限。コードは機械ゲートが正典 .beads/PRIME.md:121-123 本書は文書なので §6 の 1 番で eval-loop を通す。§3 の各項はコードの合否判定に一切関与しない
ワーカーは memory を読まない・書かない 規約 .beads/PRIME.md:103 / 機構 .opencode/opencode.json:3instructions に memory が無い)+ memory が repo 外 §3-1 は memory の名前を指示書へ転写する。ワーカーに memory への経路を与えない
AGENTS.md が唯一の正典。矛盾したら実コード → AGENTS → DESIGN → PRODUCT AGENTS.md 冒頭・CLAUDE.md §3-6 は AGENTS.md の置き場を決めるだけで、優先順位を変えない。分割は wl-hgo7
指示書の「分岐と裁定」と [実測] / [仕様] / [仮説] の印 v6 §3-1({ #decision-ledger } §3-1 は同じ節(「対象・変更・所有範囲」)に 1 行並置するだけで、v6 の欄を削らない
question を dispatch 内で完結させる v6 §3-2({ #questions } 変更なし。§3 のどの項も worker_done の前後関係に触れない
変異表を報告書の必須節にする(最低 3 本) v6 §3-4({ #mutation-evidence } 変更なし。§3-3 の「偽陽性を放置しない」は検査の質の話で、変異表の本数規定ではない
未検査の象限の宣言 v6 §3-5 変更なし。§3-5 のとおり report のこの節は compile 対象外(PR 本文へ転記済み)
実装前の人間ゲート(akapen) v6 §7({ #akapen-gate } 本書は設計書なので §6 の 1 番で akapen を通す。§3 が akapen の発火条件を変えない
docs/superpowers/plans / specs の位置づけ(設計意図つき成果物) AGENTS.md §1-1 のとおり specs/** は生の資料側に数えるが、成果物としての位置づけは変えない(削除・移動しない)
Notion と bd の分担 .beads/PRIME.md:119 変更なし。memory は第 3 の器として既に分担表にある(:103

5. 未確定

  • 有料本文の実装・運用例と §3 の関係。購読して照合する(§7 Q4 = B)。人間タスク wl-3iez → 照合 wl-yxen。 読めた時点で比較し、違いがあれば根拠付きで改訂する
  • ~~ローダーが言う「KB」の単位を再現できていない~~ → 解決(2026-09-15)。MEMORY.md の「KB」は文字数 ÷ 1024(§1-4)。 AGENTS.md の 307753 bytes は byte として正確で、ツールが読んでいたのは 2026-09-09 の版git show ddc948c6:AGENTS.md | wc -c = 307,753。exec-rigel の作業ツリーが develop より古かった)。 2 通りの数え方ではなく、2 つの版だった。ただし「警告文を一次情報にする」方針は変えない
  • ~~§3-3 の機械検査をどこで走らせるか~~ → 解決: SessionStart hook(§7 Q2 = A・wl-9jt1)。memory は repo 外なので CI には乗らない
  • §3-2 の「≤1 件」が過少か過多か。開始値 1 で 1 か月の実測で判断する(v6 §3-6 の往復記録と同じ扱い)
  • ~~既にある迷子リンク 12 件を誰がいつ張り替えるか~~ → 解決: 月次点検の初回 2026-10(wl-v4tz・コーディネーター)
  • 生の資料(verdict / report)の保存期間。現状は無期限。§1-1 のとおり件数は稼働中に動くので、 「N 本を超えたら」の形の規則は置けない
  • verdict 325 / report 760 はこのマシンの 12 ワークツリーのローカル値で、別環境では再現しない。 memory の件数・索引の行長も同じく 1 台のコーディネーター環境の値である。 他環境へ移すときは §1 の数値ではなく計測コマンドのほうを持っていく
  • §3-3 の検査を「実行した」と言うときは、実行時刻と対象パスを出力に添える。 本書の 1 周目では生成側が「memory への書込 0 件」と自己申告したが、 実際には計測窓の外(07:56:26)に coordinator-resume-state.md が変更されていた (並走する main コーディネーターによる正規の更新と見られ、違反とは断定しない)。 時刻を書かない自己申告は、この文書が禁じている自己認定そのものである
  • ~~「聞く」が実際に起きたかの計測手段~~ → 解決: 欄に検索した語も書く(§3-1)。空欄 = 引き忘れ、検索語あり + 該当なし = 引いた
  • ~~§3-6 の schema の二重管理(どちらが正か)~~ → 解決: 正は system prompt・repo は写し(§7 Q3 = A)
  • §1-5 の [仮説](Claude / codex / OpenCode の読込上限)。実測は wl-hgo7 の受入条件(2 条件を追記済み)

6. 導入の順序(提案)

親課題は wl-2w3p(epic)。2026-09-15 の人間ゲート通過後に起票した。

内容 課題 見積
~~本書を eval-loop → akapen~~ 実施済み 2026-09-15(86 点・4 問回答)
~~§3-4: resume-state を現況ポインタ + session-log へ分割~~ 実施済み 2026-09-15 07:43
1 本書を docs/harness/ へ + §3-1 のテンプレート 2 本へ memory 行を並置 + §3-6 の memory-schema.md + akapen シート 2 枚を証跡として repo へ(v6 §7-4) 文書のみ・1 PR wl-6ysd
2 §3-3: 検査スクリプト I1〜I5(I1 は文字数の行長・I5 はバッククォート除外を含む)+ SessionStart hook(表示のみ) scripts/memory-inspect.mjs + .claude/settings.json wl-9jt1
3 §3-3 月次点検の初回: 迷子 12 件の張り替え・同トピック複数ファイルの統合 コーディネーター(memory は repo 外) wl-v4tz(2026-10) 半日
4 §3-5: wl-r010 の 27 本撤去 既存 bd wl-r010
5 §0: 有料本文の購読(人間)→ §3 との照合(コーディネーター) repo 外 → 本書の付録 wl-3iez → wl-yxen 読んで半日

1 と 2 は並行できる(別ワークツリー・ファイル交差なし)。 2 を最初に置いた理由は §1-3(書く操作だけ先に直しても、索引が壊れていれば読まれない)で変わらないが、 1 の文書が無いと 2 の検査の根拠(schema)が repo に無いので、同時に出す。

7. 人間ゲート(akapen)の結果 — 2026-09-15

v6 §7 の手順どおり、標準モードのシート akapen/harness-v7-memory-01.html を作り、文脈ゼロの subagent で試問を 2 巡回してから 禹さんに出した。回答は akapen/harness-v7-memory-01.html.answer.txt(固定形・全体への赤ペンなし・赤ピンなし)。

論点 推奨 回答 反映先
Q1 「聞く」— 指示書を書く前の memory・AGENTS.md の grep を毎回の義務にするか A 毎回課す A §3-1(検索した語も欄に)・wl-6ysd(テンプレ)
Q2 「点検する」— 機械検査 5 つを SessionStart hook で自動か手動か A hook で自動 A §3-3・wl-9jt1(表示のみ・止めない)
Q3 「スキーマ」— memory の書き方を repo に写し、AGENTS.md 分割に 2 条件を先に課すか A 写す + 2 条件 A §3-6・wl-6ysd(memory-schema.md)・wl-hgo7(受入条件追記済み)
Q4 記事の有料本文(¥24,800〜)を購読して 6 点と照合するか A 今は購読しない B 購読して照合する §0・§5・wl-3iez(人間)→ wl-yxen(照合)

問いにしなかった 3 点(3-2 の上限 1 件は開始値として 1 か月の実測へ / 3-4 は実施済み / 迷子リンク 12 件は 2026-10 の月次初回)に 赤ピンは付かなかったので、そのまま確定した。

試問(preflight)で直ったもの: 1 巡目は問い 1(Q2 に出力の絵が無い)・問い 2(Q1・Q4 に file:line が無い)で落ち、 音読で 14 文・内輪語が約 40 語挙がった。Q2 に検査出力の見本 7 行と回答フォームの .thumb を足し、Q1 の 4 件に file:line、 Q4 に記事のタイトル・URL・v6 設計書の行番号を付け、用語欄を 12 語に広げた。2 巡目は問い 1〜3 全問通過・残りは表記 5 点で、 それも直してから出した。試問の過程で本書の数値の誤り(§1-4 の単位)を見つけたのは、文脈ゼロの読者に 「数字の出所」を問われて再計測したからで、v6 §7 が期待した効果がそのまま出た形である。

未回答だった場合の既定(推奨案で確定)は使わなかった。4 問とも回答があり、Q4 だけ推奨と違う案が選ばれた。

8. 有料本文との照合 — 2026-09-15(wl-yxen)

人間ゲート Q4 = B(購読して照合する)に従い、禹さんが購読した記事の有料本文(25,171 字・図 22 枚)を コーディネーターが読んだ(wl-3iez・09:45・Orca の内蔵ブラウザからログイン済みのタブを読取)。 本文は repo・memory・指示書に写さない(著作物。原文は repo 外 ~/Documents/kyoei/ に保管)。 以下は自分の言葉での照合で、記事の逐語は 7 つの軸の名前と Karpathy の英語 1 文を除いて引かない。

8-1. 記事の有料部の主張(要約)

  • 記憶が使われなかった原因は、保存先の機能不足ではなく記憶に何でもさせたこと。 いつ context に入るかで記憶を分け、行き先を agent に知らせるという 2 つが欠けていた。
  • 記憶は 3 つに分かれる: 常に読ませる(CLAUDE.md 等)/ 操作記憶(hook が操作の直前に差し込む)/ 取りに行く(agent が必要と判断して引く = wiki)。wiki は 3 つ目で、常駐させるのは行き先の 1 行だけ。
  • Karpathy の LLM wiki との違いは 7 つ。前提の 4(誰が書く・誰が読む・形式・数)と、 読み手が agent になることで逆転した 3: 更新は追記(訂正は新しい記録・判断の履歴が根拠になる)/ 索引を持たず毎回 grep(索引は壊れる中間データ)/ 入れないものの線引きを先に決める
  • 溜めるのは 判断・実測・文脈・失敗。読めば分かる事実だけの記録は、入れる前に呼ぶ側が外す。 言い換えだけの要約は入れず、原文の逐語と頼んだ人の言葉を残す。原文そのものは wiki の外(オブジェクトストレージ)に置き、 記録は場所(raw:)だけ持つ。
  • 部品: wiki repo の CLAUDE.md 1 枚 + skill 4 本(書き方の辞書 / 入れる / 聞く / 点検)+ hook 3 本 (起動時に件数一覧 / 書いた瞬間に書式検査 / 終了時に commit)+ コマンド 1 本。repo 専属の agent(司書)が読み書きし、 人は書かない(人も司書に頼む)。呼び手は別フォルダから 1 行で聞き、答えの文だけを受け取る。
  • 1 分野 1 repo に分ける。代償として、聞く先・入れる先の間違いと複数 repo への同報が実際に起きており未解決。
  • MCP は採らない(ツールの説明文が常駐して context を使う)。

8-2. 4 分類の照合

論点 記事 Greco v7 分類 判断
3 層 生の資料 / wiki / スキーマ verdict・報告書(repo 外)/ memory + AGENTS.md / system prompt + memory-schema.md 一致
記憶の分け方 いつ context に入るかで 3 つ 常に読ませる = system prompt・索引 MEMORY.md・AGENTS.md / 操作記憶 = hook(PRIME 注入・guard)と指示書の memory 行(§3-1)/ 取りに行く = memory 本文 一致(v7 は無自覚だった) §1-1 に列を足す(本 PR)
聞く発火点 agent の判断 + CLAUDE.md の行き先 1 行。聞き逃しは許容 指示書を書く前に必ず(Q1 = A) Greco が強い 変えない
聞く対象 索引を持たず本文を毎回 grep 索引 + AGENTS.md 節名の grep 不一致 採る: §3-1 の grep を memory 本文(rg -il)へ。索引は Claude Code が常時読む器なので残すが該当の判断に使わない(本 PR)
更新 追記。判断の履歴が根拠 上書き(単一の現況 + 遍歴の段落) 不一致 採る(形を変えて): memory ディレクトリを git 管理にして履歴を持ち、ファイルは単一の現況のまま(wl-mqze・2026-09-15 に承認・実施)
線引き 判断・実測・文脈・失敗を通す。読めば分かる事実は入れない §3-2 の (a)(b)(c) + 「repo にあることは書かない」 一致 (d) として「失敗」を明記(本 PR)
逐語と出所 記録に原文の逐語と raw: の場所 verdict の所見を自分の言葉で 不一致 採る: §3-2 の memory に verdict の逐語 1〜2 行と 出所: パス:行 を添える(本 PR)
点検 起動時(件数・直近・過去の 1 枚を無作為に)/ 書いた瞬間の書式検査 / 終了時 commit / 点検 skill 起動時(I1〜I5・7 行)/ 月次(人) 一部一致 検討: 書いた瞬間の検査は wl-r7ym(P3)。無作為の 1 枚は採らない(今は)
索引 持たない(壊れる中間データ) MEMORY.md(§1-4 で実際に壊れた) 記事が正しかった 「聞く対象」で吸収
司書・別フォルダからの呼出し・1 分野 1 repo 専属 agent・1 行で聞く・分野で分ける コーディネーターが自分で読む。ワーカーには指示書へ写す 記事にだけある 採らない(コーディネーター 1 体・memory 114 本の規模では grep で足りる)。AGENTS.md の分割(wl-hgo7)には「常に読ませる / 取りに行く」の軸と、冒頭の行き先一覧を引き継ぐ(wl-hgo7 の notes に記録済み)
人が書かない 人も司書に頼む 人は memory を編集しない(入力は bd / Notion / akapen) 一致
MCP を採らない 説明文が常駐する memory を MCP にしていない 一致
日付 記録は日付付き(年/月のフォルダ)・名詞は日付なし memory は日付なし・session-log は日付あり(§3-4) 一致
Greco にだけあるもの 敵対レビュー → verdict → memory の経路(§3-2)、変異表、eval-loop、akapen、bd、prod-critical の人間ゲート Greco にだけある

8-3. 採る改訂(3 点 + 承認を得て実施した 1 点)

  1. §3-1 聞く対象: 索引ではなく memory 本文を grep する。索引は残すが判断に使わない。理由: 記事の #6 と §1-4 の実例(索引は書式で壊れ、壊れても気づかなかった)。
  2. §3-2 線引きと出所: 基準 (d)「判断・実測・文脈・失敗のどれかを含む」を足し、memory には verdict の逐語 1〜2 行と出所(パス:行)を添える。理由: 記事の言い分(言い換えだけの記録は原文の代わりにならない)。Greco の memory はすでに file:line の作法を持つので、verdict にも同じ作法を当てるだけ。
  3. §1-1 の列「いつ context に入るか」: v7 の 3 層が記事の 3 つの記憶にどう当たるかを表に書く。理由: 記事の主張の核で、v7 は同じ分け方を無自覚に持っていた。名前を与えると §3-1(操作記憶)と §3-3(常に読ませる索引の検査)の役割が説明できる。
  4. (wl-mqze・2026-09-15 に承認・実施)memory ディレクトリを git 管理にする: 記事の「追記」の狙い(判断の履歴を残す)を、ファイルを追記型に変えずに満たす。Greco の memory は上書きで単一の現況を保つ方針(§3-3 の統合)なので、履歴は git に持つのが最小の変更。repo 外・ローカルのみ・remote なし。commit はセッション終了時の hook が拾う(記事の終了時 hook と同じ)。新しい器を 1 つ足すので人間ゲートの外にあり、禹さんの一言で決める。

8-4. 採らないもの

  • 司書と別フォルダからの呼出し: コーディネーター 1 体・memory 114 本の規模では、自分で rg して開くほうが速く、往復の失敗(聞く先の間違い・同報)を持ち込まない。ワーカーへは指示書に写す(§3-1)。
  • 1 分野 1 repo: 同上。ただし AGENTS.md の分割(wl-hgo7)には「常に読ませる / 取りに行く」の軸を引き継ぐ。
  • 追記型のファイル: 単一の現況を 1 本で名乗る形(§3-3 の統合)を優先し、履歴は git に。
  • 無作為の過去 1 枚を起動時に見せる: memory 114 本の陳腐化(67 本が 7 月以前)には効くかもしれないが、7 行の出力に足すと読まれなくなる。月次点検(wl-v4tz)で古いものを見る。
  • ~~記事の hook 3 本のうち終了時 commit~~ → git 化(wl-mqze)と同時に 実施済み(コーディネーターのユーザー設定の Stop hook memory-commit.sh が memory の変更を commit する)。

8-5. 読んで分かった、v7 の書き方の誤り

  • §0 で「記事の提案そのもの、または効果が検証済みの手法とは認定しない」と書いたが、記事の有料部は実走の記録(入れる・聞く・agent が自分で取りに行く)を持っており、少なくとも著者の環境では効果が観測されている。認定しないのは「Greco で効くか」であって「記事が検証していない」ではない。§0 の表現はそのまま残し、ここで訂正する。