アーティファクトスキーマ仕様
Apothem ソースツリー内のすべてのアーティファクトタイプに対する正規の YAML フロントマタースキーマと必須フィールド。クラスごとのテンプレートと検証ルールを含みます。
Apothem エコシステムのすべてのアーティファクトに対する、クラスごとの YAML フロントマターテンプレートと必須フィールド。
信頼できる情報源。 機械可読で、ゲートによって強制される契約は、
src/apothem/schemas/配下のクラスごとの JSON Schema(agent.schema.json、command.schema.json、skill.schema.json、…)です。スキルとコマンドのスキーマはadditionalProperties: falseを宣言しているため未知のキーを拒否します。エージェント、出力スタイル、プランのスキーマはadditionalProperties: trueを宣言しています。 本ページとfrontmatter-schema.mdxは、これらのスキーマを人間が読める形にした 2 つの投影です。本ページはクラスごとのテンプレートと実例を扱い、frontmatter-schema は簡潔な必須キーの索引を扱います。ページが JSON Schema と食い違う場合は、スキーマが優先されます。
概要
Apothem ソースツリー内(src/apothem/ 配下とルートの設定面)のすべてのアーティファクトは、そのアーティファクトタイプに固有の必須フィールドと任意フィールドを持つ YAML フロントマターブロック(--- 区切り文字の間)を含まなければなりません。このドキュメントは、各タイプの正規スキーマを定義します。
普遍的なルール:
- フロントマターは YAML 1.2 に準拠する
- すべての文字列値はダブルクォートを使用し、空文字列は
""と書く - フィールドの順序: 必須フィールドを先頭に置き、任意フィールドは関連性ごとにグループ化する
- フロントマター内のコメントは、スペースを伴う
#を使用する:# comment - パス値は相対パス(先頭に
/を付けない)でなければならず、クロスプラットフォーム互換性のためにスラッシュ(/)を使用しなければならない
バージョニング規約(バージョンを持つアーティファクトクラス — コマンド、ヘルパー、スキル、CLAUDE.md):
versionはセマンティック(MAJOR.MINOR.PATCH)です。互換性のないスキーマまたは契約の変更では MAJOR を上げます。互換性を壊さない追加的な変更(新しい任意フィールド、追加のセクション、追加のアンチパターン)では MINOR を上げます。契約を壊さずに既存の指令を修正する挙動の変更では PATCH を上げます。- 誤字の修正、リンクの修正、整形、コメントのみ、またはドキュメントのみの編集では、
versionは変わりません。挙動の変更のみがバージョンを上げます。 updatedは、直近の編集の ISO 8601 日付(YYYY-MM-DD)です。versionを上げるたびに必ず変更しなければならず、バージョンを上げない誤字やリンクの修正でも変更されます。- 新しいアーティファクトは
v0.Y.Zから始まります。vX.Y.Zへの昇格は、アーティファクトの契約が公開のコミットメントとして十分に安定していることを示します。 - プランスイートは、この規約の対象外です。プランスイートの誤字修正は、スイートのバージョンの PATCH 番号を上げ(
vX.Y.ZからvX.Y.(Z+1)へ)、改訂履歴の行を追加します。開発者ガイドは、プランスイートの改訂のセクションで、プランスイートのルールを説明しています。
スキーマ: ルール
パスパターン: src/apothem/rules/*.md
目的: 振る舞いに関するマンデートと運用上の指令。
必須フィールド
---
name: "kebab-case-identifier"
description: "One-line description"
pathFilter: "**/*.py, **/*.toml"
alwaysApply: true | false
---| フィールド | 型 | 目的 | 例 |
|---|---|---|---|
name | string | 機械可読な識別子 | "operational-mandates" |
description | string | レジストリ向けの 1 行の説明 | "Operational mandates CM-1–10" |
pathFilter | string | パスフィルター付きルールの適用範囲を定める、カンマ区切りの glob リスト。常時適用のルールでは空文字列("") | "**/*.py, **/*.toml" |
alwaysApply | boolean | 常時適用のルール(どこでも読み込まれる)では true、パスフィルター付きルール(pathFilter が一致したときに読み込まれる)では false | true |
任意フィールド
ルールには任意のフロントマターフィールドがなく、また他のアーティファクトクラスとは異なり、version / updated / scope / portability フィールドもありません。上記の 4 つの必須フィールドが、frontmatter_grep によって強制されるルールのフロントマター契約のすべてです。
例
---
name: "operational-mandates"
description: "Behavioral definitions for CM-1 through CM-10: violation indicators and recovery actions"
pathFilter: ""
alwaysApply: true
---
# Rule: Operational Mandates
...スキーマ: コマンド
パスパターン: src/apothem/commands/*.md
目的: スラッシュコマンドの定義(/plan-execute、/freshify など)。
必須フィールド
---
name: "command-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this command does"
argument-hint: "[argument-pattern]"
disable-model-invocation: true | false
portability: "universal"
allowed-tools: "Read, Glob, Grep"
---| フィールド | 型 | 目的 | 例 |
|---|---|---|---|
name | string | コマンド名(先頭の / なし) | "plan-execute" |
version | string | セマンティックバージョン | "X.Y.Z" |
updated | string (ISO 8601) | 最終更新日 | "2026-04-20" |
description | string | 短い説明 | "Executes a phase with quality gates" |
argument-hint | string | 使用パターン。引数がない場合は "[args...]" | "[path/to/plan] [phase-id]" |
disable-model-invocation | boolean | true の場合、コマンドを開始するのはオペレーターだけであり、モデルが自らそれを呼び出すことは決してない | true |
portability | string | ハーネスアダプター間でのポータビリティの分類 | "universal" |
allowed-tools | string | コマンドの実行中に事前承認されるツール: 読み取り専用ツールに加え、副作用のあるツールは Bash(git log *) のようなスコープ付きルールとしてのみ。素の "*" ワイルドカードは拒否される | "Read, Glob, Grep" |
任意フィールド
コマンドには任意のフロントマターフィールドがありません — 上記の 8 つの必須フィールドが、command.schema.json(additionalProperties: false)によって強制されるコマンドのフロントマター契約のすべてです。
例
---
name: "plan-execute"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Executes a specific phase from a Master Plan Suite with conformity checking and quality gates"
argument-hint: "[path/to/plan-suite/] [phase-id] [--dry-run]"
disable-model-invocation: true
portability: "universal"
allowed-tools: "Read, Glob, Grep"
---
# /plan-execute — Execute a Specific Phase
...スキーマ: ヘルパー
パスパターン:
src/apothem/agents/*.md目的: 並列探索、監査、品質ゲートのための永続的なヘルパー定義(委任ワーカーとも呼ばれます)。
必須フィールド
---
name: "agent-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this agent specializes in"
tools: "Tool1, Tool2, Tool3"
disallowedTools: "Write, Edit"
maxTurns: 20
effort: "high" | "medium" | "low"
---| フィールド | 型 | 目的 | 例 |
|---|---|---|---|
name | string | ヘルパーの識別子 | "codebase-explorer" |
version | string | セマンティックバージョン | "X.Y.Z" |
updated | string (ISO 8601) | 最終更新日 | "2026-04-20" |
description | string | 専門分野の説明 | "Deep codebase exploration" |
tools | string(カンマ区切り) | 許可されるツール | "Read, Glob, Grep, Bash" |
disallowedTools | string(カンマ区切り) | 禁止されるツール | "Write, Edit, TodoWrite" |
maxTurns | integer | 最大会話ターン数(通常は 5–20。20 を超える値にはインラインの根拠コメントが必要) | 20 |
effort | enum | 計算の範囲 | "high" |
任意フィールド
permissionMode: "default" # Permission handling
memory: user | project | local # Persistent-memory scope; omit for none
pattern: "Research" | "Audit" | "Implementation" | "Quality" # Agent team pattern
portability: "universal"例
---
name: "codebase-explorer"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Deep codebase exploration — find patterns, trace dependencies, discover conventions, map architecture"
tools: "Read, Glob, Grep, Bash"
disallowedTools: "Write, Edit, TodoWrite"
maxTurns: 20
effort: "high"
permissionMode: "default"
portability: "universal"
---
You are a codebase exploration specialist...スキーマ: スキル
パスパターン: src/apothem/skills/*/SKILL.md
目的: 検出シグナルと実行手順を備えた、再利用可能なテクニックの定義。
必須フィールド
---
name: "skill-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this skill teaches"
archetype: "workflow-template"
userInvocable: true | false
disable-model-invocation: true | false
allowed-tools: "Read, Glob, Grep"
---| フィールド | 型 | 目的 | 例 |
|---|---|---|---|
name | string | スキルの識別子 | "plan-suite" |
version | string | セマンティックバージョン | "X.Y.Z" |
updated | string (ISO 8601) | 最終更新日 | "2026-04-20" |
description | string | スキルが提供するもの | "Master Plan Suite template" |
archetype | string | 形状のクラス。kebab-case の <class>-template 識別子 | "workflow-template" |
userInvocable | boolean | true の場合、ユーザーはこのスキルを明示的に要求できる | false |
disable-model-invocation | boolean | true の場合、スキルには明示的な呼び出しによってのみ到達する | true |
allowed-tools | string | スキルの実行中に事前承認されるツール: 読み取り専用ツールに加え、副作用のあるツールは Bash(git log *) のようなスコープ付きルールとしてのみ。素の "*" ワイルドカードは拒否される | "Read, Glob, Grep" |
任意フィールド
argument-hint: "[args...]" # Usage pattern if userInvocable例
---
name: "ecosystem-audit"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Comprehensive blind audit of the apothem ecosystem"
archetype: "audit-template"
userInvocable: true
disable-model-invocation: false
allowed-tools: "Read, Glob, Grep, Agent, TodoWrite"
argument-hint: "[--focus area] [--fix]"
---
## Purpose
...スキーマ: フック
パスパターン: settings.json の hooks ブロックと、src/apothem/hooks/ 配下の Python 実装。
目的: 明確に定義されたライフサイクルの時点でホストが呼び出す、イベントトリガー型のバリデーターと状態管理ハンドラーを宣言する。
設定ファイルのスキーマ
トップレベルキー hooks は、イベント名をマッチャーブロックの配列に対応付けます:
"hooks": {
"<EventName>": [
{
"matcher": "<pattern>",
"hooks": [
{
"type": "command",
"command": "${PYTHON_BIN}",
"args": ["${HARNESS_ROOT}/.apothem/support/hooks/dispatch.py", "<EventName>", "<message-name>"],
"timeout": <seconds>,
"statusMessage": "<short human-readable label>"
}
]
}
]
}-m apothem.hooks.dispatch 形式は、PYTHONPATH=src を使ってソースチェックアウトから開発する場合のものです。
| フィールド | 型 | 目的 | 例 |
|---|---|---|---|
matcher | string | ツール名のパターン(ツールに依存しないイベントでは "*") | "Write" |
hooks[].type | リテラル "command" | 現時点でサポートされる唯一のフックハンドラーの種類 | "command" |
hooks[].command | string | 実行可能なコマンド。Apothem は ${PYTHON_BIN} プレースホルダーを使い、インストール時に解決されます | "${PYTHON_BIN}" |
hooks[].args | 文字列の配列 | exec 形式の引数: ${HARNESS_ROOT}/.apothem/support/ 配下のスクリプトパスに、その引数が続きます | ["${HARNESS_ROOT}/.apothem/support/hooks/dispatch.py", "SessionStart"] |
hooks[].timeout | 整数(秒) | ホストがフックを強制終了するまでの最大実行時間 | 30 |
hooks[].statusMessage | string | ホストの UI に表示される短いラベル | "Session start" |
必須イベント
Claude Code テンプレートは、SessionStart、PreToolUse、PostToolUse、Stop の 4 つのイベントを登録します。scripts/dev/validate_hooks.py は、下の表にある 5 つのイベント(先の 4 つとは異なる集合)について settings.json を確認し、見つからなかったイベントをそれぞれ、失敗ではなく警告として報告します。PostToolUse は登録されていますが、その 5 つには含まれません。PreCompact と PostCompact はその 5 つに含まれますが、Claude Code には登録されていない(フックのリファレンス)ため、チェッカーは Claude Code ではこの 2 つについて警告します。
タイムアウト値は正規のフックイベント予算を反映しています — 下の表は読者の便宜のためにそれらを再掲したものであり、正規のソースが優先されます。
| イベント | 標準的なタイムアウト | 目的 |
|---|---|---|
SessionStart | 30 秒 | メモリを読み込み、プランの状態を確認し、準備状況を報告する |
PreToolUse | 10 秒 | コンテンツ分離ポリシー + フロントマターについて書き込みを検証する |
PreCompact | 30 秒 | コンテキスト圧縮の前に状態が外部化されていることを検証する |
PostCompact | 30 秒 | コンテキスト圧縮の後に作業状態を復元する |
Stop | 60 秒 | セッション終了時の外部化 — 再開用の状態、出力、決定事項 |
dispatch.py は、前方互換性のために、イベントのホワイトリストで UserPromptSubmit と Notification も受け付けます。出荷されるテンプレートでは、どちらも接続されていません。
有効にするには、同じ exec 形式のパターンでマッチャーブロックを追加します。
Python レイヤー
すべてのフックコマンドは、同じ Python ディスパッチャーを経由します:
| ファイル | 役割 |
|---|---|
src/apothem/hooks/dispatch.py | SessionStart を session_start_bootstrap.main() に、ホワイトリストにあるその他すべてのイベントを emit_hook_context.main() にルーティングします。常に 0 で終了します。 |
src/apothem/hooks/session_start_bootstrap.py | セッション開始フックスクリプト — メモリとプランスイートの要約コンテキストを出力します。 |
src/apothem/hooks/emit_hook_context.py | デフォルトのフックエミッター — 登録された --context-file ペイロードを運ぶ有効なエンベロープを書き込みます。 |
src/apothem/hooks/messages/*.md | --context-file によって参照される静的なコンテキストペイロード。 |
検証
scripts/dev/validate_hooks.py は、フック契約を強制します:
settings.jsonが JSON としてパースでき、表にある 5 つのイベントのそれぞれを宣言している。欠けているイベントは失敗ではなく警告となる。- 3 つの Python スクリプトがすべて存在し、有効な Python としてパースできる。
--context-file引数によって参照されるすべてのメッセージファイルが存在する。- ハードコードされた絶対ユーザーパス(
C:\Users\...など)がsrc/apothem/hooks/**.pyに現れない。 src/apothem/hooks/とscripts/配下のシェルアーティファクトは、承認されたロケーター / ブートストラップのスタブに限られる。
スキーマ: CLAUDE.md
パス: CLAUDE.md(ルート)
目的: プロジェクトスコープの Claude Code 向け指示。
必須の YAML フロントマター
---
name: "CLAUDE"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "Project-scoped Claude Code instructions for the Apothem source repository"
scope: "project"
portability: "project-local"
---セクション
CLAUDE.md は散文のセクションで書かれており、その内容は CLAUDE.md で説明されています。固定のセクション一覧を要求するバリデーターはありません。scripts/dev/validate_ecosystem.py は、上記のフロントマターのキーを確認します。
検証チェックリスト
すべてのアーティファクトは、以下のチェックを満たさなければなりません:
フロントマターの検証
- YAML が構文的に有効である(パースエラーがない)
- アーティファクトタイプのすべての必須フィールドが存在する
-
nameが kebab-case の規約に従っている -
versionがセマンティック(MAJOR.MINOR.PATCH)である -
updatedが ISO 8601 の日付形式(YYYY-MM-DD)である -
descriptionが空でない単一行の文字列である - 任意フィールドが期待される enum 値に一致する(該当する場合)
- フィールド名にタイポがない(スキーマの正規名を使用する)
- 余分な空白や整形上の問題がない
コンテンツの検証
- コンテンツが、閉じる
---の後の新しい行から始まる。Markdown 系のファイルでは、その直後の最初のコンテンツが正規の SPDX ヘッダー行である - プラン内部への参照がない(CM-7 準拠)
- 相互参照が解決する(他のアーティファクトを列挙する場合)
- リンクがスラッシュ区切りの相対パスを使用している
ポータビリティの検証
- ハードコードされた絶対パスがない(相対パスを使用する)
- universal スコープのアーティファクトに Windows 固有の構文がない
- パス区切り文字にスラッシュを使用している
- 環境変数がプラットフォームに依存しない形式(
${VAR}またはツールネイティブ)を使用している
注記
- セキュリティとしての一貫性: 正規のフロントマターは、自動検証、ツール化、アーティファクト横断の検証を可能にします。逸脱はすぐに積み重なります。
- ポータビリティの宣言: すべてのアーティファクトがユニバーサルになれるわけではありません。制約を明示的に宣言してください —— 気づかれないバグを出荷するよりも、注意書きを文書化するほうが良いのです。
- 名前には kebab-case: URL、スクリプト、コマンドラインの文脈で使いやすいためです。名前にはスペース、アンダースコア、camelCase を使わないでください。
- バージョン引き上げの衛生: 挙動を変えるすべての編集は、
versionとupdatedを一緒に上げなければなりません。誤字の修正、リンクの修正、整形の変更ではバージョンは変わりません。新しい任意セクションやアンチパターンは MINOR を上げ、構造の再編成や契約の変更は MAJOR を上げます。