Plan Linter(ゲート1 計画バリデータ) は何をしますか?
このスキルは、単一で厳密に境界付けられた責任を持ちます:開発着手前に tasks/ 配下の計画タスク契約とバンドルに対するゲート1の決定的静的検証を行うことです。
- ゲート1 はこのスキル内の決定的スクリプトです:高速、オフライン、標準ライブラリのみ。
- ゲート2 はプロンプトのみの意味論的レビュー(
reviewスキル、フォールバックとしてreferences/gate-2-review.mdを使用)です。 - 非目標:plan-linter はコードを実行せず、CIパイプラインを構築・実行せず、AST/コード複雑性分析を行わず、テストや
03-qa-verification.mdに記録されたQA複雑性/ミューテーション証拠の監査(プレースホルダスキャンと存在チェックのみ)は行いません。すべてのCIパイプラインと検証ゲートはquality-engineeringが担当し、ローカルテストはqaが担当します。
ゲート1:決定的チェック
| チェック | デフォルト | オーバーライド可能 |
|---|---|---|
| 01-contract.md が存在し、有効なメタデータを持つ | 必須 | いいえ |
| task_id がディレクトリ名と一致する | 必須 | いいえ |
| task_id がバンドル間で一意 | 必須 | いいえ |
| touch_files の数 | 1..3 | max_touch_files |
| estimated_lines | 50..250 | min_diff_lines, max_diff_lines |
origin_spec_anchor が #sec-[a-z0-9-]+ に一致 | 必須 | require_anchor |
| adherence_adrs が少なくとも1つのADRをリスト | 必須 | require_adrs |
| dod.type_check, dod.lint, dod.test_file | 必須 | いいえ |
| dod.edge_cases の数 | 最低2つ | min_edge_cases |
| 02-dev-workspace.md, 03-qa-verification.md, 04-process.md が存在 | 必須 | require_docs |
| 禁止タッチプレフィックス | tests/acceptance/ | forbidden_touch_prefixes |
| 01/02/03 内の未解決プレースホルダ | ブロック | scan_placeholders |
| 03-qa-verification.md の内容レベルのQA証拠 | 監査しない(ゲート3) | いいえ |
| 逆トポロジ:modifyパスの存在、createパスの非存在 | 警告 | check_topology, strict_topology, --repo-root |
| size_class micro: change_id の存在、1つのタッチファイル、小さな予算 | micro の場合必須 | micro_min_diff_lines, micro_max_touch_files |
| change_id が変更ディレクトリ配下にオープンな提案を持つ | --changes-dir が指定された場合必須 | --changes-dir |
| 仕様アンカーカバレッジマトリックス(未カバーセクション) | レポート; --require-full-coverage でエラー | --spec, --coverage-out |
| 契約アンカーが仕様にない | 警告; --strict-anchor でエラー | --spec |
| 依存関係グラフ | 非循環、欠落タスクなし | いいえ |
すべてがチェックされます。出力の順序は安定しています。
クイックスタート
# 標準レポートまたは機械可読JSON
python .agents/skills/plan-linter/scripts/plan_linter.py --tasks-dir ./tasks
python .agents/skills/plan-linter/scripts/plan_linter.py --tasks-dir ./tasks --json
# カスタム設定またはレガシーフォーマット
python .agents/skills/plan-linter/scripts/plan_linter.py --tasks-dir ./tasks --config plan-linter.json
python .agents/skills/plan-linter/scripts/plan_linter.py --tasks-dir ./tasks --legacy
# ゲート2ヒューリスティックとCIブロッキングモード
python .agents/skills/plan-linter/scripts/plan_linter.py --tasks-dir ./tasks \
--repo-root . --spec .specs/02-tech-spec.md --changes-dir .specs/changes --json
python .agents/skills/plan-linter/scripts/plan_linter.py --tasks-dir ./tasks \
--spec .specs/02-tech-spec.md --strict-topology --strict-anchor --require-full-coverage
このスクリプトはオプションです。Pythonが利用できない場合は、references/gate-2-review.md を手動チェックリストとして使用し、同じフィールドを手動でレビューしてください。
ゲート2は別の review スキルです。 ゲート1が終了コード0で終了した後、review スキル(plan-reviewモード)がインストールされている場合はそれを使用して独立した意味論的監査を行います。このスキルは、review スキルがインストールされていない場合の自己完結型フォールバックとして references/gate-2-review.md を保持します。ゲート1を置き換えることは決してありません。
終了コード
| コード | 意味 |
|---|---|
| 0 | すべてのタスクバンドルでゲート1合格 |
| 1 | 違反が見つかりました(または契約フロントマターを解析できません) |
| 2 | 使用法または設定エラー |
| 3 | 予期しない内部エラー |
契約フォーマット
01-contract.md のYAMLフロントマターが権威です。以下の人間用テーブルはオプションの可読性補助です。
---
task_id: task-001-auth
title: "ユーザー認証"
module: auth
dependencies: [task-000-bootstrap]
estimated_lines: 120
touch_files:
- action: create
path: src/auth/service.py
- action: modify
path: src/auth/routes.py
origin_spec_anchor: "#sec-auth"
adherence_adrs: [ADR-001]
dod:
type_check: "npm run type-check"
lint: "npm run lint"
test_file: "tests/acceptance/test_auth.ts"
edge_cases:
- "空の資格情報で400を返す"
- "期限切れトークンで401を返す"
---
ルール:
task_idはタスクディレクトリ名と一致する必要があります。パスはリポジトリ相対で、フォワードスラッシュを使用します。touch_filesは禁止プレフィックス(デフォルトではtests/acceptance/)を指してはいけません。- 01/02/03 にプレースホルダ(
{{...}},[TBD],TODO)を残してはいけません。
レガシーフォールバック
YAMLフロントマターのない契約は、v2より前のレイアウト用にテーブルフォールバックを使用し、LEGACY_FORMAT 警告を出力します。--legacy を追加して強制的にフォールバックします。
設定
{
"max_touch_files": 3,
"min_diff_lines": 50,
"max_diff_lines": 250,
"require_anchor": true,
"require_adrs": true,
"min_edge_cases": 2,
"require_docs": ["02-dev-workspace.md", "03-qa-verification.md", "04-process.md"],
"forbidden_touch_prefixes": ["tests/acceptance/"],
"scan_placeholders": true,
"micro_min_diff_lines": 10,
"micro_max_touch_files": 1,
"check_topology": true,
"strict_topology": false,
"ignore_task_dirs": ["archive"]
}
しきい値はリポジトリの慣習であり、普遍的な法則ではありません。プロジェクトごとにオーバーライドしてください。未知のキーは警告を生成し、型が間違った値は終了コード2で終了します。
JSON出力
{
"gate": "1",
"passed": true,
"tasks_scanned": 3,
"errors": [],
"warnings": [],
"coverage": {
"spec": ".specs/02-tech-spec.md",
"spec_anchors": 3,
"covered": ["#sec-alpha", "#sec-beta"],
"uncovered": ["#sec-gamma"],
"contract_anchors_missing_from_spec": [],
"coverage_ratio": 0.6667
}
}
coverage は --spec が渡された場合のみ存在します。--coverage-out はそれをファイルに書き込みます。
各エラーオブジェクトには、task、code、message、file、line のキーがあります。エラーコードは安定した英語の識別子です(例:MISSING_DOC、TASK_ID_MISMATCH、DAG_CYCLE、PLACEHOLDER、TOUCH_FILE_MISSING、FORBIDDEN_TOUCH_FILE、BDD_MISSING_PRECONDITION、BDD_MISSING_ACTION、BDD_MISSING_OUTCOME、BDD_INVALID_SCENARIO、SPEC_SECTION_UNCOVERED)。アーカイブされた提案はエラーの代わりに CHANGE_ALREADY_ARCHIVED を生成し、ignore_task_dirs(tasks/archive)は保留中のバンドルとして決してスキャンされません。完全なエラーリファレンス:references/gate-2-review.md。
ゲート2:意味論的レビュー(プロンプトのみ)
ゲート1が合格した後、references/gate-2-review.md を独立したレビューアーとして従ってください。以下のいずれかで要約します:
Gate 2 Plan Review Passed: 0 omissions, 0 hallucinations;または- 発見リスト:タスクディレクトリ、汚染されたフィールド、違反したADR ID。
ゲート2は手動です。スクリプトは意味論的真実性を判断できません。レビューされるまでは合格としないでください。
移植性、境界、非目標
このスクリプトは標準ライブラリのみを使用し、自身のディレクトリからの相対パスを解決し、ファイルを書き込むことはありません。
厳密な境界と非目標:
- コードを実行しない:DoDコマンド、アプリケーションコード、テストスイートを決して実行しません。
- CIオーケストレーションをしない:CIパイプラインを構築、管理、実行しません(
quality-engineeringが担当)。 - ASTまたは複雑性分析をしない:サイクロマティック複雑性 $V(G)$ を計算しません(
quality-engineeringが担当)。 - テストまたは検証監査をしない:03 QA証拠を監査しません。4つのドキュメントの存在チェックと未解決プレースホルダスキャンだけが
03-qa-verification.mdに触れます。複雑性、ベーシスパスカバレッジ、ミューテーションMSIはゲート3(quality-engineering/verification_linter.py)が監査します。 - 意味論的判断をしない:意味論的真実性を判断しません(ゲート2はプロンプトレビューです)。
- RBACの強制をしない:gitベースのRBAC監査を置き換えません。