要約

Opencode のような AI エージェントと複数のセッションにわたる複雑なプロジェクトで作業するとき、根本的な問題に直面します:コンテキストの漏洩. エージェントは前のセッションを覚えていない。彼/彼女に説明されたすべて — アーキテクチャ、慣習、バックログの状態 — が失われている。このコンテキストを毎回再構築するのはコストがかかり、遅く、エラーの原因となる。

この記事では、私がこの問題を解決するために構築した職人的戦略を紹介します:AsciiDocファイルに基づく持続的なガバナンスシステム、二分法を含む熱心な/怠惰なコンテキストトークンの消費を最適化するために、そして一つ必須のセッション終了手続き継続性を確保するために。

シーン:月曜日 4月21日 9時00分

Opencodeを再開して、Gradleプラグインの作業を再開します`plantuml-plugin`. 昨晩、私は三時間を費やして、APIキーのプールアーキテクチャのエージェントと議論しました — ラウンドロビンローテーション、クォータ管理、自動フォールバック。今朝、そのエージェントは私を見て、金魚の目のように見つめました。

_ — こんにちは、私はOpencodeのアシスタントです。今日はどのようにお手伝いできますか? _

ない — あー、はい、 APIキーのプール, 私たちはYAMLの構造のところまで来ていた。 ない — 注意,PlantumlManager`これは Kotlin のシングルトンオブジェクトであって、クラスではありません。いいえ — いいえ、昨日決めたのは`SyntaxValidationResult`残っていた密封クラスのネストされた内部`PlantumlService.

全部やり直さなければならない。むしろ、すべてを再説明する必要がある。私はセッションの最初の20分を、昨日エージェントがすでに手にしていたコンテキストを再構築することに費やす。トークンを無駄にした20分。コードを書けるはずの20分なのに、必須の教育的説明に時間を費やしている。

Opencodeのバグではありません。これは会話型LLMの本質です:セッション間では、作業メモリは完全に削除された. エージェントは前の任務を覚えておらず、下された決定、特定された罠、私たちが一緒に書いたコードも覚えていません。

私はそれを何十回も経験しました。同時に4つのプロジェクトで、週をまたいで続くセッションが続いています。平均して,セッション時間の30%~40%はエージェントを再文脈化することに専念していた。 プロジェクトのセッション87において`plantuml-plugin`, 我慢できなくなった。これ以上、十回目になる説明をする余裕がなかった`AttemptEntry`トップレベルのデータクラスである`DiagramProcessor.kt`。

システムが必要だった。ハックではない。真のガバナンス。

創世記:カオスからメソッドへ

最初のセッション:暗黒時代

Opencode との私の最初のプロジェクト,plantuml-plugin, 何のガバナンスもなく開始した。質問を投げかけ、エージェントが答え、繰り返し、セッションが終了し、翌日はゼロからやり直す。それはセッション1で、続いてセッション2、セッション3…​そしてセッション62まで続き、そこで私は同じアーキテクチャを何度も説明し続けて累計何時間も失ったことに気付いた。

第62回のセッションでは、数字はここにあります:198の単体テストがパスします, 42つの機能テストが検証済み, プラグインは動作します。 しかし、認知的コストは耐え難いです。 新しいセッションごとに、プロジェクトの構造についての20分間の独白から始まります。

site.yml の エピソードが破壊されました (セッション 2, bakery-plugin)

この方法も災害から生まれます。 プロジェクトについて`bakery-gradle`, セッション 2 で、エージェントにファイルを変更するように依頼します。site.yml. エージェントは、ファイルがバージョン管理されているか確認せずに、する`Write`内容を上書きする。結果: 実際のトークン(Firebase APIキー、デプロイシークレット)は偽のプレースホルダーに置き換えられます。ファイルはgitに入っていなかった — それは…​にあった`.gitignore`秘密を守るために。

バックアップなし。なし`git restore`可能です。 私は詰まっています。 設定ファイルを手動で再構築し、パスワードマネージャーからトークンを見つけ出し、すべてを元に戻す必要があります。

それはこのフラストレーションから生まれる絶対ルール 1b :

_ 決して潰さない設定ファイルと`Write`完了するとき`Edit`部分的に十分です。決して置き換えてはいけません� 機密の値をダミーの値で。確認する git check-ignore と `git ls-files変更の前に _

この規則は、今では私のすべてのファイルに石に刻まれているように固定されています`AGENT.adoc` et `INDEX.adoc`4つのプロジェクトにおいて、実際のミスから生まれ、私に1時間の手作業のコストをかけた。

Markdown → AsciiDoc の移行(セッション 1、cheroliv.com)

2026年4月25日、cheroliv.com, 私は抜本的な決定を下す:Markdown のガバナンス全体を AsciiDoc に変換する。これは美的ではない。機能的だ。AsciiDoc は LLM がよりよく読める意味構造を提供する:階層的セクション、型付きテーブル、アドモニション (NOTE, WARNING, CAUTION), マシン可読のドキュメント属性

セッション 1 の`cheroliv.com`構造を形式化する:

  • 変換の`AGENTS.md` en AGENT.adoc

  • 専門エージェントの作成:`CODER.adoc`, SCRUM_MASTER.adoc, PLANTUML_DESIGNER.adoc

  • Eager/Lazy構造の作成:INDEX.adoc, SESSIONS_HISTORY.adoc, AGENT_SESSION_MANAGER.adoc, SESSION_CHECKLIST.adoc, PROCEDURES.adoc

1つのコミット:90975e9 refactor: migrate agent governance from Markdown to AsciiDoc. そしてサイトは引き続き機能しています。

@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false

title セッションの進化 — セッション1から150+まで
legend top
    |= Couleur |= Projet |
    | <#4CAF50> | cheroliv.com |
    | <#2196F3> | plantuml-plugin |
    | <#FF9800> | bakery-plugin |
    | <#9C27B0> | magic-stick |
endlegend

concise "アクティブなセッション" as S

@S
0 is ".md 生"
1 is "移行\nAsciiDoc"
10 is "Eager/Lazy\n形式化された"
62 is "安全ルール
(site.yml)"
87 is "クラック
コンテキスト"
109 is "最適化
-60% トークン"
133 is "133回のセッション\n240テスト合格"

S@0 -> S@1 : Session 1\n(cheroliv.com)
S@1 -> S@10
S@10 -> S@62 : Session 62\n(plantuml-plugin)
S@62 -> S@87 : Session 87\n(Cry 4 help)
S@87 -> S@109 : Session 109\n(API Key Pool)
S@109 -> S@133 : Session 133\n(Aujourd'hui)

@enduml

上記のタイムラインは実際の進行を示しています。転換点はセッション87です。ここで繰り返しの再コンテキスト化のフラストレーションが許容閾値を超え、Eager/Lazyメソッドは単なるアイデアではなく義務となります。

戦略:深掘りEager/Lazy

哲学 : 認知への応用コンピューティングキャッシュ

私のアプローチは、コンピュータのキャッシュ管理から直接インスピレーションを得ています。すべてが批判的で頻繁に使用されるすぐにアクセス可能でなければならない熱心なあるものはすべてコンテキスト依存のまたは大容量の� 必要に応じてロードされなければならない (怠惰な).

Eager (ダッシュボード)

Lazy (オーナーマニュアル)

サイズ

< 100 行, < 10k トークン

無制限、詳細

読み込み

自動、セッション開始時

エージェントの要請により

内容

絶対的なルール、通常の任務、危機的な状態

セッションアーカイブ、完全な履歴、詳細な手順、技術資料

役割

エージェントをすぐに方向づける

深いコンテキストの質問に答える

Eager ファイル : ダッシュボード

これらのファイルは各プロジェクトのルートに存在し、エージェントによって各セッションの開始時に自動的に読み込まれます。それらはダッシュボード-- 重要な情報、すぐにアクセス可能。

@startuml
skinparam defaultTextAlignment center
skinparam wrapWidth 200

package "プロジェクトのルート (Eager - 自動読み込み)" {
    component "<b>AGENT.adoc</b>
絶対のルール
構造 & 慣習" as AGENT
    component "<b>PROMPT_REPRISE.adoc</b>
セッション Nのミッション
概要 N-1" as PROMPT
    component "<b>INDEX.adoc</b>
エントリーポイント
ルール + セッション" as INDEX
    component "<b>*_ESSENTIALS.adoc</b>\n業務コンテキスト\n重要" as ESS
}

package ".agents/ (Lazy - オンデマンドで読み込み)" {
    component "<b>sessions/N-*.adoc</b>\n詳細なアーカイブ\n決定 & 出力" as SESS
    component "<b>SESSIONS_HISTORY.adoc</b>
サマリーテーブル
日付/タイプ/スコア" as HIST
    component "<b>PROCEDURES.adoc</b>
セッション終了テンプレート
6ステップ" as PROC
    component "<b>*_REFERENCE.adoc</b>
完全なアーキテクチャ
技術参照" as REF
    component "<b>COMPLETED_TASKS_ARCHIVE</b>
完了したタスク
月ごと" as ARCH
    component "<b>AGENT_MODUS_OPERANDI.adoc</b>
戦略ドキュメント
方法論" as MOD
    component "<b>*_REFERENCE.adoc</b>
Boot tests, A/B partition
特定のコンテキスト" as SPEC
}

AGENT --> PROMPT : "参考文献"
AGENT --> INDEX : "参考文献"
INDEX --> SESS : "インデックスする"
INDEX --> HIST : "インデックスする"
INDEX --> PROC : "参照"
INDEX --> ARCH : "参照"
INDEX --> REF : "参照"
PROMPT --> SESS : "アーカイブ N-1"
PROMPT --> ESS : "ビジネスコンテキスト N"

@enduml

AGENT.adoc-- マスターファイル。について`cheroliv.com`, 200行あり、以下を含みます :

  • プロジェクトの絶対的なルール(コミットは許可がなければ、`rm`確認なし)

  • プロジェクトの構造とコーディング規約

  • 基本的なコマンド (./gradlew serve, ./gradlew test)

  • エピックとプロダクトバックログ(優先順位付けられたユーザーストーリー)

  • 横断的な品質基準(アクセシビリティ、レスポンシブ、互換性)

上`bakery-plugin`, ルール0は異なります :./gradlew -q publishToMavenLocal` ソースコードを変更するたびに必須です. ローカル JAR を再公開せずにプラグインをテストしたため、まだパッケージ化されていないコードをデバッグするのに1時間も無駄にしてしまった。

PROMPT_REPRISE.adoc-- 現在のセッションのミッション。各セッションの終了時に更新され、以下を含みます:

  • セッション番号と優先ミッション

  • 前回のセッションのまとめ(行われたこと、まだやるべきこと)

  • 現在のセッションの受入基準

  • 特定の技術的なリマインダー

.agents/INDEX.adoc-- エントリーポイント。これは絶対的なルール、最近のセッション、そして特にプロジェクトポートフォリオ同じ方法論で管理されています。今日現在、ここに5つのプロジェクトが掲載されています :

----
----
| magic-stick    | Session 23 | SCRIPT_VERIFICATION.adoc | 2026-04-27 |
| bakery-gradle  | Session 11 | TEST_COVERAGE_ANALYSIS   | 2026-04-27 |
| cheroliv.com   | Session 9  | TEST_COVERAGE_ANALYSIS   | 2026-04-27 |
| plantuml-gradle| Session 133| TEST_COVERAGE_ANALYSIS   | 2026-04-23 |
| jhipster-gradle-plugins | Session 1 | TEST_COVERAGE_ANALYSIS | 2026-04-28 |
----

(No content)`*_ESSENTIALS.adoc`-- Session 109(plantuml-plugin)による最近の追加で、Eagerコンテキストをさらに最適化。API キー プール上のビジネス コンテキスト 200 行をロードする代わりに、必須の 50 行だけをロードし、残りの 150 行は LAZY の状態のままにしておきます`*_REFERENCE.adoc`.

�測定結果 : ~への移行**~25k トークン EAGER から ~10k トークン**(60%の利益)。エージェントはもはやエネルギーを消費するリマインダーを必要としない。

==== 欠落しているリンク : `opencode.json

実は告白しておかなければならないことがあります。ドキュメントに残すのをうっかり忘れそうになったことです。これらの .adoc ファイルの上には、動作に不可欠な極めて小さな JSON ファイルがあります。それは`opencode.json`そして六行です。文字通り六行です。

[source,json]
----
{
  "$schema": "https://opencode.ai/config.json",
  "instructions": [
    "AGENT.adoc"
  ]
}
----

このファイルがOpencodeに伝える:「起動時に、ロード」`AGENT.adoc`「自動的に。」 彼がいないと、エージェントは私が記事の冒頭で説明した通り、真っ白なページです。彼がいると、エージェントはすでに絶対的なルール、プロジェクトのアーキテクチャ、そして必須のコマンドを手にしています — 私が「こんにちは」と言う前でも。

私は偶然、このファイルの重要性に気づきました。 上で`bakery-plugin`, それは存在していなかった。私はなぜそのエージェントが他のプロジェクトよりもこのプロジェクトで系統的にもっと「迷子」だったのか疑問に思っていた。絶対的なルールは確かにその中にあった`AGENT.adoc`— しかし`AGENT.adoc`一度も充電されていなかった。 エージェントは私が読むように言ったものだけを、各セッションごとに手動で読んでいた。 これはセッション11の`bakery-plugin`私がその欠如に気づいたとき`opencode.json`. 私はそれを作成しました — そしてセッション12は他のセッションと同様に開始されました。

このファイルは今では私にとってとても明白で、もうそれについて考えることすらしなくなった。ツールに詳しすぎる開発者が陥りがちな典型的なミスだ。今日では、私はこれを常に*avant*作成するようにしている。`AGENT.adoc`. これが最初の石です。

==== INDEX.adoc`の二重性

もう一つ、明確にすべき微妙な点があります:`INDEX.adoc`に住んでいる`.agents/`— LAZYとして提示したフォルダ。しかし、私はこれをすべてのテーブルでEAGERとしてリストしている。ここには明らかな緊張がある。

実際の現場 : ファイル`.agents/INDEX.adoc`自動的に正しく読み込まれ、同様に`AGENT.adoc` et `PROMPT_REPRISE.adoc`. 彼らは中に`.agents/`組織上の理由により — 根を侵さないように — しかし、彼らの動作はEAGERである。

上に`plantuml-plugin`, `INDEX.adoc`これは200行で、過去のセッションの教訓である歴史とともに、絶対に*完全な*ルール、スコア付きのEPIC、そしてプロジェクトのポートフォリオを含んでいます。これはエージェントが「現在の状況」を確認するために参照するドキュメントです。Sur`bakery-plugin`, 最近のロードマップとセッションで150行です。

意図的な冗長性の間`AGENT.adoc` et `INDEX.adoc`� 驚くかもしれません。 絶対的なルールは両方に存在します。 なぜ? なぜなら、それらは二つの異なる役割を果たしているから:の中で`AGENT.adoc`, それらは*説明的*です (ルールのストーリーテリング、学んだ教訓) ; 中で`INDEX.adoc`, それらは *実行可能* (裸のルール、正当化なし、迅速な参照のため)。 エージェントは読む`AGENT.adoc`一度理解するために;彼は読み返す`INDEX.adoc`各セッションで*適用*する。2つの用途、2つのフォーマット。

[plantuml, format=svg, id=diag-dualite-agent-index, alt="Comparaison entre AGENT.adoc (narratif) et INDEX.adoc (exécutif)"]
----
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center

title 二重性 AGENT.adoc ←→ INDEX.adoc
left to right direction

rectangle "AGENT.adoc
(根 — EAGER)" as AGENT #E3F2FD {
  rectangle "**ナラティブフォーマット**
ルールのストーリーテリング
学んだ教訓、コンテキスト" as NARR
  rectangle "🏗️**完全なアーキテクチャ**
プロジェクト構造、コンポーネント
詳細なユーザーストーリーバックログ" as ARCHI
  rectangle "📋 **解説ルール**
なぜルールは存在するのか
インシデントの履歴" as EXPL
}

rectangle "INDEX.adoc\n(.agents/ — EAGER)" as INDEX #E8F5E9 {
  rectangle "⚡ **エグゼクティブフォーマット**
裸のルール、正当化なし
迅速な相談" as EXEC
  rectangle "📊 **Roadmap & EPICs**
サマリーテーブル
進行状況, スコア, 優先度" as ROAD
  rectangle "🌐 **プロジェクトポートフォリオ**
横断ビュー
5つの同期プロジェクト" as PORT
}

AGENT --> INDEX : "Agent が AGENT.adoc を
1 回 読んで **理解する**"
INDEX --> AGENT : "AgentはINDEX.adocを読み直しました
各セッションで**適用**する"

note bottom of AGENT
  Taille max : 200 lignes
end note

note bottom of INDEX
  Taille max : 200 lignes
  Source de vérité en cas de divergence
end note

@enduml
----

この意図的な冗長性は設計上の選択です。これらはEAGERトークンの追加で約50行消費しますが、エージェントが常にルールを目の前に持てるように保証します。つまり、即時の従順を助ける簡潔なフォーマットでも同様です。

=== LAZY ファイル: 所有者のためのマニュアル

これらのファイルは[場所]に存在します`.agents/`それらは、エージェントが必要とする時だけ読まれる。それらは、方法の真の財産を構成する。なぜなら、それらは現在のコンテキストを汚すことなくプロジェクトの知識を蓄積するからである。

[plantuml, format=svg, id=diag-agents-tree, alt="Arborescence complète du dossier .agents/"]
----
@startuml
skinparam folderBackgroundColor #E3F2FD
skinparam folderBorderColor #1565C0
skinparam fileBackgroundColor #FFF3E0
skinparam fileBorderColor #EF6C00

folder ".agents/" as ROOT {
  file "INDEX.adoc
(EAGER -- 200 行)" as IDX #E8F5E9
  file "AGENT_SESSION_MANAGER.adoc\n(テンプレート セッション)" as ASM
  file "SESSION_CHECKLIST.adoc
(いつ変更するか)" as CHK
  file "PROCEDURES.adoc\n(6段階 + LAZY/EAGER)" as PRO
  file "SESSIONS_HISTORY.adoc\n(すべてのセッション)" as HIS

  folder "セッション/" as SESS {
    file "1-chore-migration.adoc" as S1
    file "109-形式化-lazy.adoc" as S109 #FFECB3
    file "133-epic11-article.adoc" as S133
    file "... +130 他の" as SMORE
  }

  folder "アーカイブ/" as ARCH {
    file "COMPLETED_TASKS_2026-04.adoc" as CTA
    file "SESSIONS_HISTORY_83-95.adoc" as SHIST
    folder "セッションのサマリー/" as SUM {
      file "SESSION_64_SUMMARY.adoc" as SU64
      file "SESSION_73_SUMMARY.adoc" as SU73
      file "..." as SUMORE
    }
    folder "プロンプトアーカイブ/" as PARCH {
      file "PROMPT_REPRISE_S65.adoc" as PR65
      file "PROMPT_REPRISE_S75.adoc" as PR75
      file "..." as PMORE
    }
  }
}

IDX --> SESS : "索引"
IDX --> HIS : "索引"
IDX --> ARCH : "参照"

note right of S109
  Session 109 =
  Formalisation stratégie
  LAZY/EAGER
  Token : ~25k → ~10k
end note

@enduml
----

上記のツリー構造はフォルダーの実際の構造を示しています。`.agents/`上に`plantuml-plugin`, 最も成熟したプロジェクト。 注目してください 3層の深さ : ルートファイル(メタデータ), ディレクトリ`sessions/`(年代順アーカイブ), と ファイル`archives/`(集約と要約)。この深さが、単なるTODOファイルのガバナンスを変える**完全な組織記憶**。

**.agents/sessions/{N}-{titre}.adoc**-- 各セッションの詳細なアーカイブ。現在:

* `plantuml-plugin`:**133件のアーカイブ済みセッション**(セッション1から133まで)
* `bakery-plugin` : **11 セッション**
* `magic-stick` : **23セッション**
* `cheroliv.com` : **9 正式なセッション**+ 7セッション(プリシステム)が遡及的に再構築されました

各アーカイブはセッションの完全なコンテキスト、行われた決定、遭遇した問題とその解決、実行されたコマンドとその出力を含みます。

**.agents/SESSIONS_HISTORY.adoc**-- すべてのセッションのスコア付きサマリーテーブル。例:`cheroliv.com`:

----

| -6 | 2025-05 | chore | Initialisation projet Gradle/JBake | 7/10 |  1 | 2026-04-25 | chore | Migration gouvernance agent | 8/10 |  7 | 2026-04-27 | debug/fix | Correction publishSite | 9/10 |  8 | 2026-04-27 | analyse | Analyse article 0108 | 7/10

**.agents/COMPLETED_TASKS_ARCHIVE_{mois}.adoc**-- 完了したタスクを月ごとにアーカイブし、アクティブなバックログを過負荷にしないようにします。ユーザーストーリーが完了すると、ここに移行します。バックログは読みやすく保たれます:アクティブなアイテムは最大10個。

**.agents/PROCEDURES.adoc**-- 終了セッション手順の詳細なテンプレート。長いが、エージェントが方法を学ぶときに一度だけ読まれる。その後、手順は機械的になる。

**.agents/AGENT_MODUS_OPERANDI.adoc**完全な戦略ドキュメント。 上で`plantuml-plugin`, このファイルは**900+行**そして実際にはその名前が付いています`AGENT_METHODOLOGIES.adoc`— この記事を書いている間と実際に実装される間で、私は名前を変更しました。この種の命名のズレは、進化する職人製のシステムでは避けられない。重要なのは命名規則です:ファイルが*メソッド*を文書化している場合、それはで始まります。`AGENT_`または明示的なプレフィックス。Eager/Lazyの手法を文書化し、従うべきパターンと避けるべきアンチパターンを示しています。LAZYであるのは、エージェントが各セッションごとに戦略全体を読み直す必要がなく、あいまいさがあるときだけだからです。

(Empty)`*_REFERENCE.adoc`** -- プロジェクト固有の技術的参照。について`magic-stick`, 密集した2つのLAZYファイル:

* `AB_PARTITION_REFERENCE.adoc`(147 行) -- A/B パーティション GPT アーキテクチャ, スクリプト`update-system.sh`, 推定サイズ, ロールバックメカニズム
* `BOOT_TEST_REFERENCE.adoc`(144 行) -- QEMU + VNC を使用して物理ハードウェアなしで ISO のブートをテストする手順、BIOS/UEFI チェックリスト、CI/CD の制限事項

上`plantuml-plugin` :

* `ARCHITECTURE.adoc`(134 行) -- 11 のデータクラスの構造, 注意点(避けるべき罠), 最適化されたテストコマンド
* `API_KEY_POOL_REFERENCE.adoc`-- キー プールの完全な詳細 (LAZY pendant que`ESSENTIALS`です EAGER)

== �専門エージェント:仮想チーム

ガバナンスは受動的なファイルに限定されません。私は形式化した**�専門エージェントの役割**専用のLAZYファイル内に、タスクの種類に応じた期待されるワークフローが定義されています。

|===
|エージェント |ファイル |役割 |プロジェクト |**コードを書く** |`CODER.adoc` |FTL/CSS/JS の実装、セマンティックタグ、アクセシビリティ基準 |cheroliv.com |**スクラムマスター** |`SCRUM_MASTER.adoc` |ユーザーストーリーの計画、サブタスクへの分割、依存関係の検出 |cheroliv.com |**PlantUML デザイナー** |`PLANTUML_DESIGNER.adoc` |�図の作成, PUML構文, JBake統合 |cheroliv.com
|===

ファイル`CODER.adoc`上`cheroliv.com`具体的なルールが含まれています:_一つだけ`<h1>`python print("ページごとに、パスにプレフィックスをつける")`${content.rootpath}`_, _Déclarer la langue `<html lang="${content.lang!"fr"}">`_. これらの規則は一度書かれると、セッション1からエージェントによって自動的に遵守されます。

ファイル`SCRUM_MASTER.adoc`納品物の構造を課す:**目的**, **タスク**(代入付き座標),**受入基準**, **リスク**. 私がアクションプランを要求すると、エージェントは私が求めずにこの構造を生成します。ガバナンス**プログラム**エージェント。

==== 専門エージェントが不可欠になる時

専門エージェントの作成は自然な曲線に従います。プロジェクトの初めには、これらは必要ありません —`AGENT.adoc`十分です。しかしプロジェクトが大きくなる(たとえば、20セッションを超える場合)と、2つのシグナルがあなたに警告を発すべきです。

1. エージェントは2つの異なる分野の規則を混在させます(例:PlantUML構文とCSSルール)
2. あなたは、エージェントにすでに5回説明した慣習について訂正することに、もっと時間を費やしています。

上に`cheroliv.com`, これはセッションで起こったことです... 1. はい、最初からです。なぜなら、このプロジェクトはFTL、CSS、JSの3つの言語を使ったウェブサイトであり、AsciiDocのコンテンツとPlantUMLのダイアグラムを含んでいるからです — これらは全く関係のない3つの分野です。CODERエージェントはフォントサイズとメディアクエリを知る必要があり、PLANTUML_DESIGNERエージェントは構文を知る必要があります`@startuml`. 分離なく、エージェント CODER が私にダイアグラムを提案し、その逆も同様だった。混乱。

上`jhipster-gradle-plugins`, 私はGradleプラグイン開発に適した2つの専門エージェントを作成しました:`PLUGIN_DEVELOPER.adoc` et `BACKLOG_MANAGER.adoc`. 最初はすべての Kotlin/Gradle の規約をエンコードします(ただし`!!`, データクラス(モデル用),`@TaskAction`タスクのため)。2番目は知っている`persistence`それになる前に安定している必要がある`assistant`開発を開始しない — mono-repo内のクリティカルな依存関係。

犯してはいけない間違い:早すぎる段階でエージェントを作りすぎること`plantuml-plugin`セッション108を待ち、APIキーのプール用の専門エージェントを正式化しました。それ以前は、業務コンテキストは`AGENT.adoc`. 経験則:専門的なエージェントは、その業務ドメインのドキュメントが100行を超えるとき正当化される。

==== セッション命名規約

小さくて取るに足らない詳細だが、100回のセッションに到達すると重要になる。アーカイブファイルはどのように命名すればよいでしょうか?

私は苦い経験から、規約が必要だと学びました — 初めは4つのプロジェクト、4つの異なるフォーマットがあり、訳がわからなくなりました。今日、私が確立した規約は:

{N}-{type}-{sujet-kebab-case}.adoc

具体例:

* `1-chore-migration-gouvernance-agent.adoc`— セッション 1、タイプの雑用
* `10-solidification-tests.adoc`— セッション10、明示的な型なし (主題だけで十分)
* `036-debug-graphify-symlink-epic9.adoc`— 3桁の番号付きソート用セッション36

セッション番号が主要なソート基準です。3桁の番号(001、036、133)を使用するプロジェクトは、99を超えたときの辞書順ソートの問題を回避します。これが今私が使っているものです`magic-stick`:

(Note: a leading space, colon, trailing space)`001-init-projet.adoc`, `036-debug-graphify-symlink-epic9.adoc`。

タイプはオプションであり、セッションのキーワード (debug, feature, refactor, docs, chore, test) から派生します。kebab-case のサブジェクトは最も重要な部分です:ファイルを開かずにセッションを見つけられるようにする必要があります。「テストの統合のタイムアウトを修正したセッションはどれだったかな?」と疑問に思う場合、答えは`124-fix-timeout-integration-test.adoc`.

再構築された歴史的セッション(ガバナンス以前に生まれたプロジェクト)については、負の数を使用しています。の`cheroliv.com`, セッション -6 から 0 までがプロジェクトのガバナンス以前の歴史全体をカバーしています。そして、ドキュメント化されていないセッションや失われたセッションについては、その中にエントリを作成します`SESSIONS_HISTORY.adoc`対応するアーカイブなし、スコアあり`?`. それは仮を装うよりも正直だ。

[plantuml, format=svg, id=diag-naming-convention, alt="Arbre de décision pour le nommage des fichiers de session"]

@startuml skinparam backgroundColor #FEFEFE skinparam defaultTextAlignment center skinparam wrapWidth 200

title セッション命名規約 start

:Une session se termine; note right: Trigger "セッションの終わり"

if (Session antérieure\nà la gouvernance ?) then (oui) :Numéro NÉGATIF\n-6, -5 …​ 0; note right: Historique\nreconstitué :Suffixe : reconstitution; else (non) :Numéro POSITIF\nsur 3 chiffres si > 99; note right: 001, 036, 133\npour le tri lexicographique

:Détecter le **TYPE**;
if (Mots-clés trouvés ?) then (oui)
  :debug / feature / refactor\ndocs / chore / test;
else (non)
  :Omettre le type\n(le sujet suffit);
endif
  :Formuler le **SUJET** en kebab-case;
  note right
    Ex: fix-timeout-integration-test
    Doit permettre de retrouver
    sans ouvrir le fichier
  end note
endif

note right • 1-chore-migration-gouvernance.adoc • 036-debug-graphify-symlink.adoc • 124-fix-timeout-integration-test.adoc • 133-epic11-article-blog-kg.adoc end note

if (Session documentée ?) then (oui) :Créer archive dans sessions/; :Ajouter ligne SESSIONS_HISTORY\navec score X/10; else (non) :Ajouter ligne SESSIONS_HISTORY\navec score ?\nsans archive; note right: L’honnêteté\nplutôt que le vide endif

stop @enduml

==== TEST_COVERAGE_ANALYSIS.adoc` — ステップ5 詳細分析

手順5のセッション終了の手順は最も謎めいています。それは「更新する」と言います。`TEST_COVERAGE_ANALYSIS.adoc`もしテストが追加または変更された場合。 しかし、このファイルはどのように見えるでしょうか?

上`plantuml-plugin`, それは数行から完全な構造に進化しました。ここにその安定した形があります:

[source]

Analyse de Couverture de Tests

Suivi des Tests

Classe de test

Type

Tests

Statut

Dernière MAJ

PlantumlServiceTest

unit

45/45

✅ PASS

2026-04-23

ApiKeyPoolTest

integration

15/15

✅ PASS

2026-04-20

Historique par Session

| Session | Tests ajoutés | Tests modifiés | Couverture | 133 | 0 | 2 | 100% | 132 | 5 | 0 | 100%

----

興味はファイルそのものではなく、変更点を記録する*義務である。このステップを踏まなければ、50セッション後にはどのテストが何をカバーしているのかわからなくなる。エージェントも同様だ。ファイルはプロジェクトのテストカバレッジの唯一の真実の参照となる。

伝統的なテストのないプロジェクト (例えば`magic-stick`bash スクリプトをテストする), ステップ5は置き換えられます`SCRIPT_VERIFICATION.adoc`.メカニズムは同じです: スクリプトの検証状態を追跡するファイルです。ステップ5をあなたのプロジェクトに合わせて調整してくださいが、決して省略しないでください。これは、サイレントリグレッションを防ぐ安全ネットです。

あなたのプロジェクトに *まったくない テスト — ユニットテストでも、機能テストでも、スクリプトテストでも — それでも空のファイルを作成し、「やること:テスト戦略を定義する」というセクションを追加してください。これは、将来の自分にこのトピックが未処理であることを思い出させるしおりとなります。

[plantuml, format=svg, id=diag-session-flow, alt="Flux d’une session type avec Eager/Lazy et agents"] ---- @startuml skinparam backgroundColor #FEFEFE

start

:Début session; note right: L’agent est une page blanche

:Chargement EAGER auto; note right * AGENT.adoc (règles absolues) * PROMPT_REPRISE.adoc (mission N) * INDEX.adoc (état projet) end note

if (Mission claire ?) then (oui) :Exécution directe; else (non) :Charge LAZY sur demande; note right * SESSIONS_HISTORY.adoc (contexte passé) * sessions/{N-1}-.adoc (décisions) * *REFERENCE.adoc (architechture) end note endif

:Délégation agent spécialisé ?;

if (CODER ?) then (oui) :Lit CODER.adoc; :Suit conventions FTL/CSS; elseif (SCRUM Master ?) then (oui) :Lit SCRUM_MASTER.adoc; :Structure livrable imposée; elseif (PlantUML ?) then (oui) :Lit PLANTUML_DESIGNER.adoc; :Syntaxe PUML + intégration; else (non) endif

:Travail de la session;

:Fin de session (trigger utilisateur);

:Procédure 6 étapes; note right 1. Archive sessions/N-.adoc 2. Maj PROMPT_REPRISE.adoc (N+1) 3. Maj SESSIONS_HISTORY.adoc 4. Maj INDEX.adoc 5. Maj TEST_COVERAGE (si applicable) 6. Maj COMPLETED_TASKS_ARCHIVE.adoc end note

:Checklist [✅] x 6;

stop @enduml ----

上記の図は、セッションの完全なライフサイクルを示しています。重要なポイントは、EAGERロード後の分岐です:ミッションが十分に明確で直接実行できる場合(80%のケース)と、エージェントがLAZYロードを行い曖昧さを解決する場合(20%のケース)があります。この判別がトークンの節約につながります。

== セッション終了の手順:黄金律

=== なぜ彼女は不可欠なのか

この手順がないと、Eager/Lazy ストラテジーは何の役にも立ちません。それが、セッションの作業を永続的な情報に変換します。それが実行されます。ユーザーの明示的な要求により(キーワード: "セッション終了", "私が去る", など), そしてそれは必須-- 例外もなく、漏れもなく。

ファイル`SESSION_CHECKLIST.adoc`理想的なセッションメトリクスを定義する:

* 所要時間: 15-30分 * 変更されたファイル: 1-3個まで * LLMの交換:5-10メッセージ * コンテキストトークン : < 50k

セッションを変更する必要がある兆候 : _LLMが既に修正されたエラーを繰り返す、 同時に3ファイル以上が変更されている、 会話が50メッセージを超える。 黄金律 :2時間のセッションと混乱したデバッグより、20分のセッションを5回行う方が良い。

=== 6つのステップのフロー (静かに)

[plantuml, format=svg, id=diag-end-session-flow, alt="Flux de la procédure de fin de session"] ---- @startuml skinparam defaultTextAlignment center skinparam wrapWidth 200 skinparam activityBackgroundColor #E3F2FD

start :L’utilisateur dit "セッションの終了"; note right: Mots-clés déclencheurs

:Agent détecte le trigger;

:Étape 1\nCréer archive\n`.agents/sessions/N-*.adoc`; note right: Tout le contexte de la session

:Étape 2\nMettre à jour\n`PROMPT_REPRISE.adoc`; note right: Mission N + critères d’acceptation N+1

:Étape 3\nMettre à jour\n`SESSIONS_HISTORY.adoc`; note right: Ligne récap : # / Date / Type / Sujet / Score

:Étape 4\nMettre à jour\n`INDEX.adoc`; note right: État courant, roadmap, fichiers modifiés

:Étape 5\nMettre à jour\n`TEST_COVERAGE_ANALYSIS.adoc`; note right: Si tests ajoutés ou modifiés

:Étape 6\nMettre à jour\n`COMPLETED_TASKS_ARCHIVE.adoc`; note right: Archiver tâches terminées

:Afficher la checklist de confirmation; note right: Vérifier que chaque [✅] est mérité

stop @enduml ----

=== 150+セッションの結果

これは、私の4つのプロジェクトに体系的に適用したこの手順の結果です:

プラントUMLプラグイン :

* 133セッションプロジェクトの開始以来 * 240/240 テスト合格(100% カバレッジ) — EPICs 1-7 完了 * 57 シナリオ Cucumber BDD�検証済み * 設定ファイルに関する実際のエラーから生じた安全規則 (Session 2 bakery-plugin)

ベーカリープラグイン:

* 11セッション2週間で * Supabase → Firebase の移行が完了(9つのテストが修正されました) * EPIC 6 (publishProfile) 本番環境で機能する * ルール 0 が作成されました :`publishToMavenLocal`各修正後の必須

マジック・スティック:

* 23セッションA/Bパーティションを持つXubuntuライブシステムを構築するために * セッション10で最初に生成されたISO * QEMU + VNC の形式化されたブートテスト (LAZY ドキュメント 144 行) * 機能的なSourceForgeのCI/CD

cheroliv.com :

* 9回の正式なセッション+ 7回のプレシステムセッションの再構成 * 記事0101 (OpenCode PATH) 公開済み * Article 0108(こちら)は、その欠点の分析後に書き直された * 完全なガバナンスがMarkdownからAsciiDocに移行されました

=== 最終チェックリスト

6ステップのサイレント実行後に、エージェントは確認チェックリストを表示しなければなりません:

----

✅ Procédure de fin de session exécutée 📋 Checklist :

絶対的なルールどのステップもマークすることはできません`[✅]ファイルが実際に変更され、検証されていない場合。

== Bootstrapガイド:1日目、セッション0

あなたはその方法に確信を持っています。新しいプロジェクトに適用したいです。どこから始めればよいでしょうか?

私は2026年4月28日にこの瞬間を経験しました。私はOpencodeを開いて`jhipster-gradle-plugins, 私の JHipster Gradle プラグイン 2 つを含むモノレポです。これはすでに存在するプロジェクトで — コードはそこにあり、Gradle タスクは正常に動作しています。しかし、エージェントのガバナンスは?ゼロ。真っ白なページ。このように`plantuml-plugin`そのセッション1は、何ヶ月も前のことだった。

以下が私が従った正確な手順であり、今後の新しいプロジェクトでも同じように従います。順序に注意してください — 重要です。

[plantuml, format=svg, id=diag-bootstrap, alt="Flux de bootstrap en 6 étapes pour initialiser la gouvernance agent sur un nouveau projet"] ---- @startuml skinparam backgroundColor #FEFEFE skinparam defaultTextAlignment center skinparam wrapWidth 250 skinparam activityBackgroundColor #E8F5E9

title ブートストラップ ガバナンス — 1日目, セッション0 start :Étape 0\nCréer opencode.json\n(6 lignes, instructions: AGENT.adoc); note right: Le pont qui charge\nAGENT.adoc automatiquement

:Étape 1\nCréer les dossiers\nmkdir -p .agents/sessions/ .agents/archives/; note right: Les conteneurs vides\navant que l’agent écrive dedans

:Étape 2\nCréer AGENT.adoc\n(200 lignes, règles absolues); note right: Le fichier maître\nStructure minimale v1

:Étape 3\nCréer PROMPT_REPRISE.adoc\nMission session 1 (max 70 lignes); note right: Ce que l’agent doit\nfaire à la prochaine session

:Étape 4\nCréer .agents/INDEX.adoc\nRègles exécutives + roadmap; note right: Point d’entrée EAGER\ndans le dossier LAZY

:Étape 5\nCréer les fichiers LAZY structurants\n6 fichiers : SESSIONS_HISTORY, CHECKLIST, etc.; note right • SESSIONS_HISTORY.adoc • SESSION_CHECKLIST.adoc • PROCEDURES.adoc • AGENT_SESSION_MANAGER.adoc • TEST_COVERAGE_ANALYSIS.adoc • Agents spécialisés (si besoin) end note

:Étape 6\nAjouter le projet au Portefeuille\nMettre à jour TOUS les INDEX.adoc existants; note right: Maintenance transverse\nObligatoire mais fastidieuse

:✅ Bootstrap terminé\nSession 1 prête; note right: 20 minutes investies\nDes centaines économisées

stop @enduml ----

=== ステップ 0: opencode.json を作成

これは最初のファイルです。いいえ`AGENT.adoc`, ない`INDEX.adoc`。opencode.json`まず、単純な理由で: あなたが作成するとき`AGENT.adoc`まず、自動的にロードするブリッジを作成するのを忘れるでしょう。私はそれを…で作りました。`bakery-plugin, 私は何を話しているか知っています。

=== ステップ 1:フォルダーを作成する

[source,bash] ---- mkdir -p .agents/sessions .agents/archives ----

空のフォルダーが2つです。sessions/`各セッションのアーカイブを受け取ります。`archives/`月次のCOMPLETED_TASKS_ARCHIVEを受け取ります。これらのフォルダは、エージェントが書き込む必要がある*前*に存在していなければなりません。フォルダとファイルを同時に作成しなければならないエージェントは、静かに失敗する可能性のあるエージェントです。

=== ステップ 2: `AGENT.adoc を作成 — マスターファイル

最初のバージョン用の最小構造(成長します):

[source] ---- = {NOM_PROJET} — Directives Agent

[CAUTION] ----

必須停止rm の前に、 Write、削除 :

1. ファイル全体を読む 2. 確認 git ls-files 3. 確認を求める 4. 待つ「はい」

== プロジェクト

名前: …​ スタック: …​ ドキュメンテーション: AsciiDoc

== 絶対的なルール

=== 0. 開発環境

必須のコマンド…​

=== 1. COMMITS/GIT

正式な禁止…​

=== 1b. 設定ファイル — 絶対安全規則

決して潰さないで…​

=== 2. セッション終了時のテスト

正式な禁止…​

=== 3. セッション終了手順

6つの必須ステップ…​

== コンテキスト管理 — LAZY/EAGER

Eager ファイル / Lazy ファイル…​

この最小テンプレートはエージェントを起動させます。リッチ版 — プロジェクト構造、重要なコンポーネント、EPIC、バックログ — はセッション1で提供され、そのときエージェントはすでに基本ルールを手にしており、ドキュメントを充実させるお手伝いができます。

=== ステップ 3 : 作成 PROMPT_REPRISE.adoc — ミッション セッション 1

「これはセッション1、ミッションはまだ定義されていません。」というファイル。最大70行、セッション0(ブートストラップの概要)セクションとセッション1(ユーザーと定義する優先順位)セクションを含む。

=== ステップ 4: .agents/INDEX.adoc を作成 — エントリーポイント

絶対的なルール(実行版)およびセッションテーブルを含むファイル。ブートストラップのために、コンパクトな形式のルール0から3、プロジェクトポートフォリオ(新しいプロジェクトに絵文字🆕を含む)、そして入力待ちの空のロードマップをリストします。

=== ステップ 5: LAZY構造ファイル作成

順に:

1. .agents/SESSIONS_HISTORY.adoc— セッション0のみのテーブル 2. .agents/SESSION_CHECKLIST.adoc―テンプレート「セッションを変更するタイミング」 3. .agents/PROCEDURES.adoc— 6ステップの完全な手順 + EAGER/LAZY 4. .agents/AGENT_SESSION_MANAGER.adoc— アーカイブのテンプレート 5. .agents/TEST_COVERAGE_ANALYSIS.adoc— テスト追跡表、最初は空

もしあなたのプロジェクトが複雑なビジネスドメインを持っている場合 (例えば`jhipster-gradle-plugins`その mono-repo persistence/assistant) 、 専門エージェントを今すぐ作成してください:

1. .agents/PLUGIN_DEVELOPER.adoc— コードの規約と依存関係の境界 (プラグインの場合) 2. .agents/BACKLOG_MANAGER.adoc— 計画構造と特定されたリスク

使わないエージェントを作らないでください。エンコードする具体的なルールのないエージェントは、汚染する死んだファイルです。.agents/。

=== ステップ 6: すべてのプロジェクトのポートフォリオにプロジェクトを追加

これは必ず忘れてしまうステップです。それぞれ`INDEX.adoc`各プロジェクトには、すべてのプロジェクトを同じ方法論でリストする「プロジェクトポートフォリオ」という表が含まれます。新しいプロジェクトを作成する際には、以下を行う必要があります:

1. 新しいプロジェクトのポートフォリオに行を追加する(論理) 2. 既存のすべてのプロジェクトのポートフォリオに一行を追加 — はい、すべて

私の4(現在5つ)のプロジェクトでは、これは開けることを意味します`INDEX.adoc` de magic-stick, bakery-gradle, cheroliv.com, `plantuml-gradle`それに行を追加する`jhipster-gradle-plugins

Session 1

…​

2026-04-28 🆕.

面倒くさいです。手動です。これも、作業しているプロジェクトに関係なく、エージェントが他のプロジェクトの存在とその状態を知ることができるように保証する唯一の方法です。セッション 012 の`magic-stick, エージェントはポートフォリオで2つの不整合を検出しました —`bakery-gradle`彼の COMPLETED_TASKS_ARCHIVE が遅れていて、そして`plantuml-gradle`彼は、手順書(5ステップ)とインデックス(6ステップ)の間にずれがあった。このクロステーブルがなければ、これらの不整合は見えなかったままだっただろう。

[plantuml, format=svg, id=diag-portfolio-graph, alt="Graphe du portefeuille de projets — références croisées entre INDEX.adoc"] ---- @startuml skinparam backgroundColor #FEFEFE skinparam defaultTextAlignment center skinparam nodeBackgroundColor #E3F2FD

title プロジェクトポートフォリオ — 相互参照 INDEX.adoc node "magic-stick\nSession 037\nSCRIPT_VERIFICATION" as MS #E1BEE7 node "bakery-gradle セッション11 TEST_COVERAGE" as BG #FFE0B2 node "cheroliv.com セッション 10 TEST_COVERAGE" as CH #C8E6C9 node "plantuml-gradle セッション 133 TEST_COVERAGE" as PG #BBDEFB node "jhipster-gradle セッション 1 🆕 テストカバレッジ" as JG #FFCDD2

MS -→ BG : INDEX.adoc référence MS -→ CH : INDEX.adoc référence MS -→ PG : INDEX.adoc référence MS -→ JG : INDEX.adoc référence 🆕

BG -→ MS : INDEX.adoc référence BG -→ CH : INDEX.adoc référence BG -→ PG : INDEX.adoc référence BG -→ JG : INDEX.adoc référence 🆕

CH -→ MS : INDEX.adoc référence CH -→ BG : INDEX.adoc référence CH -→ PG : INDEX.adoc référence CH -→ JG : INDEX.adoc référence 🆕

PG -→ MS : INDEX.adoc référence PG -→ BG : INDEX.adoc référence PG -→ CH : INDEX.adoc référence PG -→ JG : INDEX.adoc référence 🆕

JG -→ MS : INDEX.adoc référence JG -→ BG : INDEX.adoc référence JG -→ CH : INDEX.adoc référence JG -→ PG : INDEX.adoc référence

note bottom of JG Quand on ajoute un projet : • 4 INDEX.adoc à mettre à jour • 1 ligne par portefeuille • Coût : 5 minutes end note

legend bottom

= Couleur

= Projet

<#E1BEE7>

magic-stick — ISO Linux live

<#FFE0B2>

bakery-gradle — Plugin JBake

<#C8E6C9>

cheroliv.com — Site personnel

<#BBDEFB>

plantuml-gradle — Plugin IA

<#FFCDD2>

関連記事