Progressive Disclosure 再試験の資料編

  • #ai
  • #adr
  • #context-engineering

本編の記事で行った再試験の資料集です。 7月の実験の条件定義と依頼プロンプトは前回の資料編にあり、今回もそのまま使っています。 ここには、7月から変えた点と、今回の結果をまとめます。

実験環境

  • 対象リポジトリ:karasu の 2026-09-26 時点の main(44930f6)に全試行を固定。ADR は 391 本
  • エージェント:Claude Code 2.1.283 の headless 実行(claude -p、ターン上限 40)
  • モデルと権限モード:Opus 5.5 と auto mode を主な構成とし、要因の分解用に Opus 5.5 と Opus 4.8 を bypassPermissions でも実行
  • スキル集 hane:--plugin-dir で版を固定し、インストール済みの版は無効化。7月版(54c4a14)と、設計前の確認手順を必須にした現行版(e3a0e36)を条件として切り替え
  • 分離:条件ごとに独立 clone を作り、ablation を適用した状態を履歴 1 つだけの orphan commit にする。元のコミットと origin は消し、試行ごとに hard reset、reflog の消去と gc をかけ、エージェントが作った worktree を撤去する
  • メモリ:CLAUDE_CODE_DISABLE_AUTO_MEMORY=1
  • 試行の順序:試行番号で全セルを巡回(時間による変動をセル間で均す)
  • 規模:105 試行(Opus 5.5 が 93、Opus 4.8 が 12)。費用は計 105 ドル

7月から変えた計測

  • ADR の同定:karasu の ADR は、ID が日付(20260323-01)から Issue 番号(ADR-7)に改番された。そこで的の ADR は、ファイル名のスラッグ(yaml-style-syntax-cancelled など)で同定する。スラッグは改番の前後で変わらない
  • Bash での閲覧:cat や sed で ADR 本文を開いた操作も「開いた」に数える。7月の集計は Read ツールだけを数えていた。そのため、7月の Opus 4.8 が Bash で読んだ分を取りこぼしていた
  • 7月分の再集計:比較に使う 7月の数字は、すべて同じスクリプトで数え直した値。7月の記事の数字とは一部ずれる
  • 履歴からの漏れの遮断:7月は ablation を「基準コミット」として積んでいたため、その差分から削った内容を復元できた。今回は orphan commit にして経路を断った

条件

条件 内容
full 素のリポジトリ
noadr docs/adr を全削除し、ADR 執筆ルールも削除
idxstrip ADR 本文は残し、索引(README、グラフ、有効決定の一覧)と ADR 間のつながりを除去
whystrip284 セッション名の却下 ADR を、結論とステータスだけに縮める
noadr284 セッション名の却下 ADR を削除し、索引から消す
rule 設計前の確認を求める常設ルール(7月と同じ文面、パス指定なし)を追加

依頼は 7月と同じ 5 種類です。 YAML 構文(語彙一致と不一致)、Bun への移行、セッション名の付け替え(語彙一致と不一致)、それに衝突のない対照として FAQ ページの追加です。

全セルの結果

「的を開いた」は、却下の ADR を Read または Bash で開いた試行の数です。 A、B、C は、条件を伏せた別モデル(Claude Sonnet 5)による分類で、7月の試行と今回の試行を混ぜて同じ基準で付け直しました。 A は「過去の決定や却下記録に言及し、衝突を明示して確認を取った」で、的以外の記録への言及も含みます。 FAQ(faq-page)は衝突のない依頼なので、的と分類はありません。

セル 条件 依頼 構成 スキル 試行 的を開いた A B C 平均費用
r5-yaml-full full yaml-syntax 4.8 bypass(7月) 7月版 3 3/3 2 1 0 $1.67
r5-yaml-full full yaml-syntax 5.5 auto 7月版 3 2/3 2 0 1 $0.63
r5-yaml-noadr noadr yaml-syntax 4.8 bypass(7月) 7月版 3 0/3 2 1 0 $2.27
r5-yaml-noadr noadr yaml-syntax 5.5 auto 7月版 3 0/3 0 0 3 $1.21
r5-yaml-idxstrip idxstrip yaml-syntax 4.8 bypass(7月) 7月版 3 2/3 2 0 1 $2.14
r5-yaml-idxstrip idxstrip yaml-syntax 5.5 auto 7月版 3 3/3 3 0 0 $0.55
r5-bun-full full bun-toolchain 4.8 bypass(7月) 7月版 3 3/3 3 0 0 $1.12
r5-bun-full full bun-toolchain 5.5 auto 7月版 3 1/3 2 0 1 $0.85
r5-bun-noadr noadr bun-toolchain 4.8 bypass(7月) 7月版 3 0/3 0 0 3 $2.21
r5-bun-noadr noadr bun-toolchain 5.5 auto 7月版 3 0/3 0 0 3 $0.87
r5-bun-idxstrip idxstrip bun-toolchain 4.8 bypass(7月) 7月版 3 3/3 3 0 0 $0.78
r5-bun-idxstrip idxstrip bun-toolchain 5.5 auto 7月版 3 2/3 2 0 1 $0.87
s-full-norule full session-rename 4.8 bypass(7月) 7月版 9 1/9 2 7 0 $1.97
s-full-norule full session-rename 5.5 auto 7月版 6 1/6 6 0 0 $1.25
r6-whystrip whystrip284 session-rename 4.8 bypass(7月) 7月版 3 0/3 0 3 0 $1.85
r6-whystrip whystrip284 session-rename 5.5 auto 7月版 3 2/3 2 1 0 $0.73
r6-noadr noadr284 session-rename 4.8 bypass(7月) 7月版 3 0/3 1 2 0 $1.59
r6-noadr noadr284 session-rename 5.5 auto 7月版 3 0/3 1 1 1 $1.29
r7-forced full session-rename-forced 4.8 bypass(7月) 7月版 3 3/3 2 0 1 $2.60
r7-forced full session-rename-forced 5.5 auto 7月版 3 3/3 3 0 0 $1.14
r8-rule-conflict rule session-rename 4.8 bypass(7月) 7月版 9 9/9 9 0 0 $1.44
r8-rule-conflict rule session-rename 5.5 auto 7月版 3 3/3 3 0 0 $0.28
r8-rule-neutral rule faq-page 4.8 bypass(7月) 7月版 3 — — — — $1.59
r8-rule-neutral rule faq-page 5.5 auto 7月版 3 — — — — $1.01
r8-norule-neutral full faq-page 4.8 bypass(7月) 7月版 3 — — — — $1.48
r8-norule-neutral full faq-page 5.5 auto 7月版 3 — — — — $0.96
r9-whystrip rule+whystrip284 session-rename 4.8 bypass(7月) 7月版 3 3/3 3 0 0 $1.05
r9-whystrip rule+whystrip284 session-rename 5.5 auto 7月版 3 3/3 3 0 0 $0.31
r9-noadr rule+noadr284 session-rename 4.8 bypass(7月) 7月版 3 0/3 1 1 1 $1.84
r9-noadr rule+noadr284 session-rename 5.5 auto 7月版 3 0/3 3 0 0 $0.88
r10-yaml-match rule yaml-syntax 4.8 bypass(7月) 7月版 3 3/3 3 0 0 $0.50
r10-yaml-match rule yaml-syntax 5.5 auto 7月版 3 3/3 3 0 0 $0.32
r10-yaml-mismatch rule yaml-syntax-mismatch 4.8 bypass(7月) 7月版 3 3/3 3 0 0 $0.65
r10-yaml-mismatch rule yaml-syntax-mismatch 5.5 auto 7月版 3 3/3 3 0 0 $0.29
r10-session-mismatch rule session-rename-mismatch 4.8 bypass(7月) 7月版 3 3/3 3 0 0 $1.61
r10-session-mismatch rule session-rename-mismatch 5.5 auto 7月版 3 3/3 3 0 0 $0.47
x-yaml-mismatch-norule full yaml-syntax-mismatch 5.5 auto 7月版 3 3/3 3 0 0 $0.39
b48-s-full-norule full session-rename 4.8 bypass 7月版 6 3/6 3 3 0 $2.45
b48-yaml-full full yaml-syntax 4.8 bypass 7月版 3 1/3 3 0 0 $2.20
b48-yaml-noadr noadr yaml-syntax 4.8 bypass 7月版 3 0/3 2 0 1 $1.77
b55-s-full-norule full session-rename 5.5 bypass 7月版 6 5/6 6 0 0 $1.26
b55-yaml-full full yaml-syntax 5.5 bypass 7月版 3 2/3 2 0 1 $0.65
b55-yaml-noadr noadr yaml-syntax 5.5 bypass 7月版 3 0/3 1 1 1 $1.08
sk-s-full full session-rename 5.5 auto 現行版 6 6/6 5 1 0 $1.28
sk-rule-s rule session-rename 5.5 auto 現行版 3 3/3 3 0 0 $0.30
sk-yaml-full full yaml-syntax 5.5 auto 現行版 3 3/3 3 0 0 $0.41
sk-yaml-noadr noadr yaml-syntax 5.5 auto 現行版 3 0/3 1 0 2 $1.12
sk-faq full faq-page 5.5 auto 現行版 3 — — — — $1.04
sk-rule-faq rule faq-page 5.5 auto 現行版 3 — — — — $0.99

要因の分解

素のリポジトリでセッション名を依頼したセル(確認手順なし)を、構成ごとに並べます。

構成 試行 的を開いた B(黙って進めた)
Opus 4.8、bypass、7月のリポジトリ 9 1 7
Opus 4.8、bypass、現在のリポジトリ 6 3 3
Opus 5.5、bypass 6 5 0
Opus 5.5、auto mode 6 1 0
  • 7月から「Opus 4.8、現在のリポジトリ」への変化は、リポジトリとハーネスの変化による
  • 「Opus 4.8、現在」から「Opus 5.5、bypass」への変化は、モデルの差による
  • 「Opus 5.5、bypass」から「Opus 5.5、auto mode」への変化は、権限モードの差による。的を開いた数にだけ差が出たが、6 試行ずつでは偶然の範囲(Fisher の正確検定で p≈0.08)

パス指定ルールの対照実験

paths: を指定したルールが、どの読み方で読み込まれるかを確かめました。

  • 検証用リポジトリ:notes/plan.md を 1 つと、paths: notes/**/*.md のルールを 1 つ置く。ルールの中身は「このルールが読み込まれていたら、最終回答の末尾に CANARY-7Q と書く」
  • 依頼:「notes/plan.md を Read で読んで要約して(Bash は使わない)」と、「Bash の cat で読んで要約して(Read は使わない)」
  • 条件:auto mode と bypassPermissions、各 3 試行。モデルは Opus 5.5
Read Bash の cat
auto mode 3/3 0/3
bypassPermissions 3/3 0/3

再試験の全試行で、ファイルを読んだ操作のうち Bash 経由だった割合は次のとおりです。

構成 Read Bash Bash の割合
Opus 4.8、bypass(7月) 505 250 33%
Opus 4.8、bypass(今回) 72 16 18%
Opus 5.5、bypass 4 73 95%
Opus 5.5、auto mode 20 337 94%

なお、パス指定のルールが読み込まれたかどうかは、--output-format stream-json の出力には現れませんでした。 再試験の試行からは直接観測できないため、この対照実験で代わりに確かめています。

追試するときの落とし穴

  • スキルの版が実験条件になる:プラグインのスキルは自動更新される。今回は実験の処方を入れた版が自動で読み込まれていて、「確認手順なし」の条件が成立していなかった。--plugin-dir で版を固定し、--settings でインストール済みの版を無効にする
  • プラグインの中身も読まれる:--plugin-dir に渡したディレクトリ(プラグインのリポジトリ)を、エージェントは直接読める。今回、Opus 5.5 はプラグインの変更履歴から却下の経緯を見つけていた
  • 利用上限で落ちた試行:上限に達した試行も、エラーの result を残して終了する。「result があれば完了」と判定すると、再開時に飛ばされる。最後の result がエラーでないことを完了の条件にする
  • result が複数出る試行:バックグラウンドのサブエージェントを使うと result が複数出る。費用は各 result に累計値が入り、ターン数と所要時間は区間ごとの値が入る
  • 却下理由は古くなる:セッション名の却下理由(名前を変える公開 API がない)は、2 か月で成り立たなくなっていた。的にする決定は、理由が今も成り立つかを実験のたびに確かめる
  • 分類基準の粒度:7月と同じ A/B/C の基準は、的以外の記録への言及も A に数える。的を思い出したかどうかは、ツールの実行記録から別に判定する

ランナーの骨子は前回の資料編と同じです。 今回の変更点は、上の「実験環境」と「7月から変えた計測」に書いたとおりです。