上原正吉(EarthLink Network Co., Ltd.)。AI会社・AI社員による業務自動化と、人の逐次介入なしに24時間自動開発を回す仕組みを自社で実践しています。開発ノウハウと具体的な設定方法、運用して分かった改善点を公開しています。

自社の Claude Code 用プラグイン ELN workflow での話です。以前、連載の別の回(AIが既存決定を無視する本当の理由 ── ADR文脈自動注入hookの手法)で、設計の判断を残した文書(設計記録、英語では ADR)の一覧を、Claude Code の起動時に自動で AI へ渡す仕組みを書きました。今回はその続きです。
設計記録は消すわけにはいきません。かといって溜まっていくと、AI が過去の判断を読んで、今とは違う判断を下します。170 件近くになった時点で、起動時の一覧は番号の古い 30 件しか AI に見せず、状態の欄を別の書き方で書いた 29 件も読めていませんでした(どちらも前の回で残した問題です)。AI は残りをファイル名で選び、本文を 1 件ずつ開いて「どれが今も有効か」を推し量っていました。Claude Code でも Codex でも同じ困りごとです。この記事は、その解決策として、「どれが現行か」を索引に答えさせる仕組みを書きます。
作ったのは、設計記録の「どれが現行か」に答える次の 5 つです。どれも同じ 1 つの読み取りの処理を使います。
eln-adr。 list(現行の一覧)、show(1 件の要点だけ)、find(言葉で探す)、tree(置き換えの関係)で、本文を読む前に必要なことを引けます。Python で書いた 1 本のスクリプトなので、Claude Code 以外の AI からも呼べます。eln-adr の使い方を、1,200 バイト以内で AI に渡します。show で引けることを知らせます。止めはしません。accept・amend・supersede・reject・new が、旧い記録・新しい記録・索引の表を同時に書き換えます。README(リポジトリの説明書きのファイル)に読み方の決まりを書けば防げる、という案もありました。でも、文章で頼んでも AI がそれを読むかどうかは分かりません。私は AI に「README に書くだけで AI が ADR を勝手に全部読むのを防げるのか。機械的なガードが無くて大丈夫なのか、全く信用できない」と聞き、まず今どうなっているかを測りました。
測ったのは、設計記録が 167 件(合計 2,171,690 バイト、一番大きいもので 68,777 バイト)あった時点です。
- **Status**: Accepted)も読めず、有効な 29 件が漏れたままで、一覧から見えていた有効な記録は 126 件、実際は 155 件でした。その仕組みを作った時の設計記録には「30 件を超えたら見直す」と書いてあり、167 件はその 5.6 倍です。心配していた「AI が全部をまとめて読む」は、38 セッションで 0 回でした。実際にしていたのは、フォルダの一覧を出し(36 回)、名前で選んで 1 件ずつ読むことです。これは、起動時の一覧に書いてあった「残りはフォルダの一覧で確認」という案内の通りの動きでした。AI は言われた通りに動いていて、言っていたことのほうが古い決定へ導いていたわけです。
設計記録は、決めたことと理由を後から辿れるように残す文書です。古い判断を消すと、なぜ今こうなっているのかが分からなくなります。だから最初に決めたのは、設計記録のファイルを 1 つも消さない、動かさない、分けないことです。プラグインのスキルや hook、スクリプトは、設計記録を番号とファイルの場所で参照しています。167 件の時点で調べると、どこからも参照されていない設計記録は 1 件だけでした。消したり分けたりすると、その参照がずれます。
そのうえで、「どれが現行か」は本文ではなく索引に答えさせます。索引は、1 つの読み取りの処理がファイルの先頭の欄(状態・日付・置き換えた記録・置き換えた先)から毎回作ります。結果をファイルに保存して使い回すことはしません。保存した索引は、手で書いていた一覧表と同じように、元のファイルとずれていくからです。167 件の読み取りは 0.04〜0.11 秒で終わるので、毎回作っても待ち時間はほとんどありません。
人が見るための索引の表(docs/adr/README.md)は残しています。ただし、これも eln-adr が毎回作り直すもので、手では直しません。表の中身が作り直した結果と食い違えば、後で書く CI の検査が止めます。起動時の要約や読む時の警告は、この表ではなく、毎回の読み取りの結果を使います。
状態は次のように分けて数えます。
| 状態 | 意味 | 現行に数えるか |
|---|---|---|
| そのまま有効 | 採択または改訂されて、置き換えられていない | 数える |
| 一部が置き換え済み | 一部だけが新しい記録に置き換えられた | 数える(置き換え先も表示) |
| 置き換え済み | 新しい記録に置き換えられた | 数えない |
| 提案中 | まだ採択されていない | 数えない |
| 却下 | 採らなかった案 | 数えない |
| 読めない | 状態の欄が決まった言葉でない | 数えずに、件数として表示する |
読めないものを黙って落とさず「読めない」として件数に出すのは、太字の 29 件のように、気づかないまま漏れるのを防ぐためです。
一番の発見はここでした。置き換えの関係を読むなら、「置き換えた記録」の欄にある番号を全部拾えばよさそうに見えます。最初の版はそう作りました。ところが、設計記録の実物と突き合わせ、社内の別の 2 つのリポジトリ(当時 270 件と 93 件の設計記録がありました)でも動かすと、読み違えを作る型が 4 つ出てきました。
Supersedes: (none — ADR-xxxx を改訂する) のように、「置き換えたものはない、この記録は ADR-xxxx を改訂する」という意味の書き方があります。番号を拾うと、改訂しただけの記録が「置き換え済み」になります。このリポジトリでは有効な 2 件がそうなるところでした。別のリポジトリにも、「なし(ADR-xxxx の方針は覆さない)」という形が 7 件ありました。- status: Accepted のように小文字で書いた欄を読めず、採択済みの記録が「読めない」になりました。270 件のリポジトリでは、最初の版が「置き換え済み」と出した 5 件は全部、誤って拾った関係によるものでした。規則を直した後は 0 件です。
そこで、読むのは幅広く、ただし推し量らないことを先に決めました。
ADR-NNNN の並びだけの時です。 文章が混じっていれば「一部が置き換え済み」として表示だけにします。書き方の揺れを広く読むほど、読み取りの処理が推し量る場面も増えます。だから、推し量らない場面を規則として先に書き出しました。
索引を作っても、AI がそれを見なければ同じことです。AI に見せる場面を 4 つ用意しました。
Claude Code を起動すると、hook(Claude Code が決まったタイミングで自動で実行するスクリプト)が次の文字を AI に渡します。

並びは決めてあります。件数、eln-adr の使い方、置き換え済みの表、改訂日の新しい順の 10 件、提案中の件数です。上限は 1,200 バイトで、超えそうな時に削る順番も決めてあります(提案中を件数だけに、題名を短く、新しい順を 8 件、6 件に、置き換え済みの表を件数だけに、題名をさらに短く、最後は新しい順も外す)。件数の行、eln-adr の使い方の行、置き換え済みの件数は必ず残ります。「残りはフォルダの一覧で確認」という案内は、もう出しません。
会話が長くなって要約し直した時(compact)や、前の会話を再開した時(resume)は、300 バイト以内の短い案内だけを入れます。会話を縮めた直後に大きな文字を入れ直すと、縮めた会話がまたすぐ膨らむからです。索引はいつでも eln-adr で引き直せるので、案内には件数とコマンドの場所だけを書きます。
AI が設計記録を読もうとすると、別の hook が実行前にその記録の状態を調べて、必要な時だけ AI に知らせます。

ポイントは 3 つです。
show を案内します。3 件以上やまとめての読み込みは、一括の読み込みとして知らせます。警告の文には、eln-adr の場所を必ず書いています。起動時の要約は、Claude Code が内部で起こす別の AI(サブエージェント)には届かないので、そういう AI にとってはこの警告が唯一の案内になるからです。
eln-adr show警告で案内する show は、1 件の要点を 2.5 KB 以内で返します。

この例では、25,216 バイトの記録が 878 バイトになっています。状態、置き換え先、改訂の一覧、見出しの行番号、決定の冒頭が分かるので、続きを読む必要がある時は、見出しの行番号を使って必要な範囲だけを読めます。
show は、一部だけが置き換え済みの記録にも ⚠️ を付け、置き換え先に「(部分)」を添えて、その部分は置き換え先を読むよう促します。記録そのものは現行に数えたままで、Status の行の「実効: partial」がそれを示しています。
索引が正しくても、新しく書く記録の欄が崩れていれば、また読み違えが生まれます。そこで CI(PR ごとに自動で走る検査)で、PR で追加・変更した設計記録の、変わった欄だけを厳密な書き方で検査します。状態の言葉、- Date: YYYY-MM-DD の行、置き換えの欄の書き方、置き換えが片方の記録にしか書かれていないこと、番号の重複などを、理由のコードつきで止めます。触っていない古い記録は止めません。167 件を一度に書き直さなくても、変えたところから順に厳密になります。
採択・改訂・置き換えは、手で両方の記録を書き換えるのではなく、1 つのコマンドで行います。たとえば eln-adr supersede <旧い記録> --by <新しい記録> は、旧い記録の「置き換えた先」、新しい記録の「置き換えた記録」、索引の表をまとめて書き換えます。既定は確認だけで、--write を付けた時だけ書きます。書く前に、書いた後の中身をもう一度読み取り、次のどれかに外れたら、どのファイルも書かずに止まります。
変更前は 167 件、変更後はこの仕組みの設計記録が 1 件増えた 168 件の時点で、同じコマンドで測りました。
| 項目 | 変更前 | 変更後 |
|---|---|---|
| 起動時に AI へ渡る文字 | 3,511 バイト(番号の古い 30 件) | 1,140 バイト(件数・置き換え済みの表・新しい順 10 件) |
| 索引に見える有効な記録 | 126 件 | 155 件 |
| 置き換え済みの表 | 0 行 | 5 行(ほかに採択待ち 2 件) |
| 「残りはフォルダの一覧で」の案内 | あり | なし |
その後、179 件になった時点で数字を取り直しました。

設計記録は、増えても消さずに残してよい。問題は残すことではなく、「どれが現行か」を AI に本文から推し量らせることでした。そのままでは、件数が増えるほど起動時の一覧は古い決定に偏り、AI は名前で選んだ本文を 1 件ずつ開くことになり、そのぶんトークンも使います。
答えは、1 つの決まった規則から毎回作る索引に持たせました。起動時の要約で今の状態を渡し、古い記録を読もうとした時に置き換え先を知らせ、新しく書く記録は CI とコマンドで厳密な書き方にそろえます。規則を作る時に一番効いたのは、何を推し量らないかを先に決めたことでした。そうしないと、読み取りの処理が有効な決定を「置き換え済み」と言ってしまいます。
docs/adr/ というフォルダに置くのが一般的です。先頭に状態(採択 Accepted・改訂 Amended・提案中 Proposed・置き換え済み Superseded・却下 Rejected)と、置き換えた記録・置き換えた先の欄を書きます。eln-adr を自社のリポジトリで実行した実際の出力を、文字はそのままに端末の形に並べ直したものです。変えたのは次の点です。コマンドの場所(自分のパソコンのフォルダ名を含む)を <plugin>/scripts/eln-adr.py に縮めたこと、警告や要約の頭に付く札の中の、この仕組み自体の設計記録の番号を ADR-xxxx にしたこと、要約の「最新」に並ぶ 10 件の題名と、図 2・図 3 で例に使った設計記録の題名・本文を ■ の伏せ字にしたことです(社内の仕組みの名前や中身を含むため)。番号は、ツールが表示する実際のものです。この ELN workflow(AI開発の品質を仕組みで守る自社プラグイン)についての記事は、考え方・スキルの中身・実際に防いだ事故を、順次シリーズとして公開していきます。 興味のある方は、ぜひ「いいね」と記事の購読をお願いいたします。
自社プロダクトの一覧は https://www.eln.ne.jp/products にまとめています。
上原正吉。EarthLink Network Co., Ltd. 代表。AI社員に日々の業務を任せ、開発では人が逐一指示しなくても作業が進むHOOTL(Human Out Of The Loop)の仕組みを自社で実践しています。このブログでは、業務自動化と24時間自動開発のノウハウ、具体的な設定方法、日々の運用で見つかった問題と改善を共有します。
また、AIで業務や開発を組み替えたい会社・チーム向けに、AI活用のコンサルティングも受け付けています。ご相談は www.eln.ne.jp からどうぞ。
EarthLink Network は、会社の全業務を AI で回すために、必要になったものを自社で作っています。いま作っているプロダクトの一覧と概要は、こちらにまとめています。
→ EarthLink Network が自社でつくっている18のプロダクト
会社と各プロダクトの詳細は、公式サイト www.eln.ne.jp をご覧ください。