Agent Ecosystem
一つの階層化されたガバナンスループ。各コンポーネントは正確に一つの関心事を所有し、互いのステートマシンをインポートすることなく、型付きJSONコントラクトを通じてのみ結合します。
不変の$shame目標はshame-deterministic-instruction-obedience-v1
(skills/shame/immutable_goal.json)です:プロジェクトエージェントが明示的な指示を無視できないようにするために、指示遵守と完了報告を型付きpydantic検証済みコントラクト、決定論的拡張ゲート、および保持されたエージェンティック評価に変換します。散文は表示のみであり、成功を決定することはできません。以下に名前を挙げるすべてのエコシステムメンバーは、その境界でこの目標を保持しなければなりません。
グラフ
$create-svgでレンダリング(scene.ymlがソース; skills/create-svg/run.sh render skills/agent-ecosystem/scene.yml skills/agent-ecosystem/ecosystem.svgで再生成)。機械可読なメンバーシップマニフェストはmembers.json(scripts/membership.py validateで検証;保持された評価が最新状態を維持)です。上記のSVGと以下のmermaidブロックは非規範的な図解であり、所有権テーブルとメンバーの## Ecosystemセクションが規範的なトポロジです。
flowchart TB
subgraph SHAPE[Generation shaping]
PONY[ponytail\nYAGNI ladder, no receipts]
end
subgraph TURN[Turn layer - Pi session]
SHAME[shame extension\npi.agent_status.v1\nvalidate, compile, swallow]
TRIAGE[triage-error\nfailure vocabulary\ncode, cause, next_command]
end
subgraph WORK[Workflow layer]
ASK[ask\ncompiles intent to DAG contracts]
TAU[tau\nexecutes DAGs, owns acceptance\ntyped node receipts, goal_hash]
end
subgraph OPS[Operations layer]
WD[project-watchdog\ncron dispatch, leases,\nproof gates, tick receipts]
HERDR[ops-herdr bridge\ninbox, quiescence,\nTTL dead-letters]
end
MEM[(Memory\ntraining examples,\ntriage resolutions,\nproject knowledge)]
PONY -.-> SHAME
SHAME -->|failed.triage.code| TRIAGE
SHAME -->|needs_* compiled commands| ASK
ASK -->|tau.dag_contract.v1| TAU
TAU -->|node receipts / handoff v2 carries status| SHAME
WD -->|ticket_repair via ask| ASK
WD -->|reads verdicts| TAU
HERDR -->|dead-letter triage codes| TRIAGE
SHAME -->|labeled examples| MEM
TRIAGE -->|minted codes| MEM
TAU -->|post-run export of bad node receipts| MEM
所有権テーブル
| コンポーネント | 所有するもの | 発行するもの | 消費するもの | $shame不変目標のためのMUST条件 |
|---|---|---|---|---|
| プロジェクトエージェント | ターン境界における指示遵守 | pi.agent_status.v1レポート | オペレーター指示、ツール結果、レシート | ガードされた作業を型付きステータスデータとして報告し、continuing.not_done[].next_commandをエージェント実行可能な未完了作業に使用し、散文/コミット/レビューアの意見を完了証明と決して扱わないこと。 |
| triage-error | 障害語彙(failure_codes.json) | {code, cause, next_command} | 任意のレイヤーからの生のエラーテキスト | 一つの生のシグナルを一つのカタログまたはミントされたコードにマッピングすること;曖昧な終端ラベルが有効な決定になってはならない。 |
| shame | ターンステータス(pi.agent_status.v1)およびshame.immutable_goal.v1 | ステータスオブジェクト、不変目標、訓練例 | トリアージコード、人間のラベル | ステータスの真実をpydantic検証済み、散文表示のみ、評価ゲート付きに保つこと。 |
| lazy-report-shame-shame-shame拡張機能 | Pi message_end強制 | 拒否パケット、レンダリングされたステータス、フォローアップコマンド | 最終ステータスJSON、継続台帳 | 欠落/無効なステータスJSONを拒否し、モデル作成のステータス散文を取り除き、検証済みデータからレンダリングし、コンパイルされた継続/エスカレーションコマンドをキューイングすること。 |
| status-json-check.mjs | 最終ステータス抽出とバリデーター呼び出し | 検証済みステータスオブジェクトを含むチェッカー結果 | アシスタントテキスト | 正規表現、散文見出し、マークダウン、HTML、またはLLM判断でステータスの有効性を判断してはならない。 |
| agent_status_schema.py | pydanticステータスの合法性 | パース成功/失敗 | 最終ステータスJSON | extra=forbid、型付きステートペイロード、正準トリアージコード、およびcontinuingでのみnot_doneを使用して、無効なステータス状態を表現不可能にすること。 |
| compile-status-command.mjs | 型付きステータスからコマンドへのコンパイル | 正確なフォローアップコマンドまたはコマンドなし | pydantic検証済みステータスオブジェクト | continuing/needs_*ペイロードを機械的にコンパイルし、ターミナル/人間の状態を自動コマンドなしにコンパイルすること。 |
| agentic-evals | 保持された回帰証明 | 準備完了レポート | フィクスチャとコマンド | 正規表現/散文ステータスポリシーが戻る場合、またはpydanticステータス不変条件が弱められた場合に失敗すること。 |
| ask | 意図からDAGへのコンパイル | tau.dag_contract.v1、リカバリーパケット | ステータスエスカレーションペイロード | 非形式的なエスカレーション散文の代わりに型付きneeds_*ペイロードを消費すること。 |
| tau | DAG実行と受理 | ノードレシート、tau.agent_handoff.v1/v2、目標ハッシュ | DAGコントラクト、埋め込みステータスオブジェクト | 不変目標ハッシュと型付き受理レシートを所有すること;レビューアの散文は受理を置き換えることができない。 |
| project-watchdog | スケジュールされたディスパッチ | ティックレシート、証明ゲート、ロック、継続台帳 | GitHubチケット、tauの判定 | チケット/ゲート/次のステップが未解決のままdoneが失敗できるよう、機械可読な未解決作業を公開すること。 |
| ops-herdr | セッション間のトランスポート | 受信箱レコード、デッドレター | トリアージコード | セッション間の障害/状態をトリアージコード付きの型付き受信箱またはデッドレターレコードとして運ぶこと。 |
| ponytail | 生成のミニマリズム | ponytail: 債務コメント(レシートではない) | レシート世界からの何もない | ステータス、レシート、証明、または評価要件をオーバーライドしてはならない。 |
| Memory | 想起 | ストア/リコール読み返し応答(エンベロープレシートではない;リコールは観測であり、決してラップされない) | すべての永続的なもの | shameの例、トリアージ解決、およびプロジェクト知識を読み返し付きで保存すること;リコールは観測であり、完了レシートではない。 |
| agent-ecosystem | コンポーネント所有権とレシート境界 | pi.receipt_envelope.v1検証 | 境界ペイロード | 所有権マップを公開し、権限変更境界でのエンベロープラッピングを要求すること。 |
| goal-helper | 証明中心の目標形状 | 不変目標プロンプト/チェックリスト | 人間の目標テキスト | 成功を一次証明、完了基準、許可された範囲、禁止されたドリフト、リトライ予算、および停止条件に結び付けること。 |
pi.receipt_envelope.v1 - 境界エンベロープ
ペイロードをエンベロープでラップするのは、権限変更境界でのみ行います:ディスパッチ、ハンドオフ、受理、エスカレーション、クロージャ、永続的障害。内部オブジェクトはラップされないままです(レビュー済みYAGNI判定:ユニバーサルイベントバスなし、すべてのアーティファクトにエンベロープなし)。
{
"schema": "pi.receipt_envelope.v1",
"receipt_id": "stable-id",
"payload_schema": "pi.agent_status.v1",
"producer": "shame",
"emitted_at": "RFC3339",
"goal_hash": "sha256:<64hex> (optional)",
"parent_refs": [
{"receipt_id": "id", "expected_schema": "s", "expected_producer": "p", "digest": "sha256:<64hex> (optional)"}
],
"triage_code": "catalog or minted code (optional)",
"payload": {}
}
以下のコマンドで検証:
skills/agent-ecosystem/run.sh validate <envelope.json>
echo '{...}' | skills/agent-ecosystem/run.sh validate -
scripts/receipt_envelope.py(pydantic、extra=forbid)で強制されるルール:
triage_codeが存在する場合、triage-errorカタログコードまたはミントされた*_unclassified_<8hex>コードでなければならない –pi.agent_status.v1.failureと同じルール。goal_hashとparent_refs[].digestはsha256:+ 64の小文字16進数でなければならない。parent_refsはgoal_hashを必要とする:共有目標のない証拠エッジは信頼されず、検証に失敗する。- PydanticはSTRUCTUREのみを証明する。参照RESOLUTIONは別個のコンシューマー側のステップであり、4つの必須チェックがある:参照されたレシートが存在すること;そのスキーマが
expected_schemaと等しいこと;そのプロデューサーがexpected_producerと等しいこと;そしてresolved_parent.goal_hash == envelope.goal_hash(存在するハッシュは、比較されるまで共有目標ではない)。ダイジェスト検証はdigestが設定されている場合に適用される。構造的に有効なエンベロープはまだ信頼されたものではない。 payload.schemaはラップされたすべてのペイロードで必須であり、エンベロープのpayload_schemaと等しくなければならない;匿名ペイロードは検証に失敗する。- 任意の
extra=forbidスキーマへのフィールドセット変更は、構造的に破壊的変更となる;新しいスキーマバージョンを必要とし、インプレース編集は決して行わない。
共有JSONフィールド規約
以下のフィールドは実際の共有インターフェースです。コンポーネントがフィールドを「共有する」とは、所有者と同じ名前、形状、およびセマンティクスを発行または検証することを意味します。
| フィールド | 形状 | 所有者 | 共有元 |
|---|---|---|---|
schema | バージョン付きID、例:pi.agent_status.v1 | 各スキーマの所有者 | すべてのコントラクトオブジェクト;バージョンアップは追加または新名 |
code(トリアージ) | カタログエントリまたは<prefix>_unclassified_<8hex> | triage-error | shame failure.triage.code、エンベロープtriage_code、herdrデッドレター、askリカバリーパケット |
cause / next_command | プレーン文字列 / 正確な実行可能コマンド | triage-error | トリアージ分類のすべてのコンシューマー;next_commandはshameのcontinuing継続フィールドでもある |
goal_hash | sha256: + 64の小文字16進数 | tau(不変目標パケット) | shameステータス(オプション)、エンベロープ(オプション)、すべてのtauノードレシート |
verified[] | {command, result}ペア | shame | ステータスオブジェクトが埋め込まれている場所のdone状態証明 |
proof[] | 具体的なパス/URL/ID;pi.agent_status.v1のローカルパスはdoneが通過する前に存在しなければならない | shame | ステータスオブジェクト;watchdog証明ゲートは同じアーティファクトに名前を付ける |
parent_refs[] | {receipt_id, expected_schema, expected_producer, digest?} | agent-ecosystemエンベロープ | エスカレーション証拠(needs_webgptのアドホックパスを置き換える) |
producer / receipt_id / emitted_at | 文字列 / 安定ID / RFC3339 | agent-ecosystemエンベロープ | 境界ラップされた任意のレシート |
payload_schema | バージョン付きID;ペイロードが宣言する場合はpayload.schemaと等しくなければならない | agent-ecosystemエンベロープ | 境界ラップされた任意のレシート |
| 終端判定 | PASS FAIL BLOCKED NEEDS_ATTENTION | tau | askが参加、watchdog証明ゲート、ストリームモニター |
recoverable / not_this | ブール / 除外リスト | triage-errorカタログ | リトライとエスカレーションを決定するコンシューマー |
triage-error 規約(ここでは規範的、実装はそちら)
- 一つの生シグナルはONEの
{code, cause, next_command}にマッピングされる;レイヤー境界での汎用コードはバグであり、分類ではない。 - カタログエントリは
skills/triage-error/failure_codes.jsonに{code, layer, match[], cause, next_command, recoverable, not_this[]}として存在する。マッチングは決定論的:正規化は正確に" ".join(text.lower().split())(小文字、すべての空白連続は単一スペースに圧縮、両端トリム);エントリはそのmatch[]トークン(これも小文字化)のいずれかが正規化されたシグナルの部分文字列である場合にマッチ;--layerが指定された場合、異なるlayerのエントリはスキップ;ファイル順で最初にマッチしたエントリが勝ち。決して正規表現、LLM判断ではない。終端分類として禁止(これらは症状であり原因ではなく、基礎となるシグナルから再トリアージされなければならない):NEEDS_ATTENTION、BLOCKED、browser_handler_timeout、unknown_error、generic_failure、および任意の裸の終端判定語。 - マッチしないシグナルは
<layer-or-unknown>_unclassified_<8hex>をミントする。ここで8つの16進文字は正規化されたシグナルテキストのsha256の最初の8文字であり、同じシグナルは常に同じコードをミントする。ミンティングはチケット + agentic-eval + memoryループを開く。再発しきい値:同じミントコードの2回目の観測で、プロモーションまたはエイリアスがトリガーされる。エイリアス表現:カタログファイルのトップレベルaliasesマップはミントコード -> 正準コードをマッピング;ミンティングは正規化されたシグナルに対して決定論的であるため、再発するシグナルは同じコードを再ミントし、分類器はマップを通じて正準エントリに解決する(aliased_fromとして記録);ミントコードは二番目の正準IDではない。チケット/評価/メモリの副作用はミントコードごとに冪等(コード文字列によってキー付け)。 - 障害を命名するすべてのエコシステムコンポーネントは、カタログまたはミントされたコードを使用する。pydanticバリデーター(ステータススキーマ、エンベロープ)の両方がパース時にこれを強制するため、曖昧なラベルが有効なオブジェクトに存在することはできない。
設計上の裁定(外部レビューより)
- 厳密性はDECISIONSに適用され、観測には適用されない。生の証拠は寛容に保ち、受理された結果は厳格に保つ。型付きの
unknown観測は合法である;曖昧な決定は違法である。 - ミントされた
*_unclassified_*コードは暫定的なライフサイクルを得る:再発したらカタログにプロモートするか既存のコードにエイリアスする;決して拡散させない。 - スキーマ変更は追加的;形状を破る変更は新しいバージョン(
tau.agent_handoff.v2パターン)を得る、決してインプレース編集ではない。 - 構築しないもの:ユニバーサルガバナンスイベントバス;ponytailコメント、Memoryリコール、または内部リトライのレシート。
メンバーシップ
スキルまたは拡張機能は、そのSKILL.mdに## Ecosystemセクションを追加することでエコシステムに参加し、生成するスキーマ、消費するスキーマ、およびエンベロープにラップする境界イベントを命名します。現在のメンバー:shame、triage-error、tau、ask、project-watchdog、ops-herdr。Ponytailは設計上隣接しています。