with one click
review-flow
// ProcessFlow JSON の実行セマンティクスを専門レビュー (変数ライフサイクル / TX スコープ / runIf 連鎖 / 補償整合 / event 双方向 / 画面項目連携 / SQL alias 整合 / 業務 semantic gap)。Step 0.5 で 12 バリデータを機械実行 (#599 /
// ProcessFlow JSON の実行セマンティクスを専門レビュー (変数ライフサイクル / TX スコープ / runIf 連鎖 / 補償整合 / event 双方向 / 画面項目連携 / SQL alias 整合 / 業務 semantic gap)。Step 0.5 で 12 バリデータを機械実行 (#599 /
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | review-flow |
| description | ProcessFlow JSON の実行セマンティクスを専門レビュー (変数ライフサイクル / TX スコープ / runIf 連鎖 / 補償整合 / event 双方向 / 画面項目連携 / SQL alias 整合 / 業務 semantic gap)。Step 0.5 で 12 バリデータを機械実行 (#599 / |
| argument-hint | <flowId | path | --all | (空 = MCP アクティブタブ)> |
| disable-model-invocation | true |
ProcessFlow $ARGUMENTS の 実行セマンティクスを専門レビューします。
/review-pr 担当)$ARGUMENTS を以下の優先順で解決:
--all → examples/retail/process-flows/*.json + data/process-flows/*.json (存在すれば) を全件並列レビュー/ か \ を含む / .json で終わる) → そのまま読むdata/process-flows/<id>.jsonexamples/retail/process-flows/<id>.jsonexamples/retail/process-flows/<id>*.json (glob)dddddddd-0001) → glob で resolve、複数マッチなら全件レビューlist_tabs を呼びアクティブな ProcessFlowEditor のフロー ID を取得 → 1 で resolveresolve 結果を最初に明示:
対象フロー: <絶対パス>
ID: <id>
name: <name>
maturity: <maturity>
複数件なら一覧表示してから順次処理。
Step 1 の AI 目視レビューに入る前に、実装済みの 12 バリデータを CLI 経由で実行して、機械的に検出可能な参照整合・識別子スコープ・SQL カラム・@conv.* 参照・画面項目イベント連携・画面項目値レベル整合・viewDefinition・画面遷移・設計コントラクト・アンチパターンの問題を先に拾う。
対象フローが属するプロジェクトディレクトリを渡す:
cd frontend
npm run validate:samples -- ../examples/<project-id>
| # | バリデータ | 検出内容 | 入力 |
|---|---|---|---|
| 1 | referentialIntegrity | responseRef / errorCode / systemRef / compensatesFor 等の不整合 | 常時動作 |
| 2 | identifierScope | 識別子スコープ違反 (root レベル @var 未宣言) | 常時動作 |
| 3 | sqlColumnValidator | SQL 内で参照したカラムがテーブル定義に存在しない | examples/<project-id>/tables/ 経由で自動ロード |
| 4 | conventionsValidator | @conv.* 参照が catalog 未登録 | examples/<project-id>/conventions/catalog.json を自動ロード |
| 5 | screenItemFlowValidator | 画面項目イベント ↔ 処理フロー連携 (handlerFlowId 実在 / argumentMapping 整合 / primaryInvoker 双方向 / events[].id ユニーク) | 各プロジェクトの screens/ を per-project でロード (project-level 検査、#619/#621) |
| 6 | screenItemFieldTypeValidator | 画面項目 ↔ フロー 値レベル整合 | 画面項目定義ファイル + 処理フロー JSON |
| 7 | sqlOrderValidator | DB 制約 × 操作順序 (NOT NULL × INSERT / FK × INSERT 順序) | テーブル定義 (v3 形式) を自動ロード (#632) |
| 8 | viewDefinitionValidator | ViewDefinition 整合 (sourceTableId 実在 / columnRef 実在 / 重複列名 / sort/filter/groupBy 列参照 / FieldType 互換) | 各プロジェクトの view-definitions/ を per-project でロード (project-level 検査、#649) |
| 9 | screenItemRefKeyValidator | 画面項目の refKey が conventions catalog の domainKey と整合 | screens/ + conventions/catalog.json |
| 10 | screenNavigationValidator | 処理フローの画面遷移 step が project.json の screenTransitions 定義と整合 | project.json の entities.screenTransitions |
| 11 | runtimeContractValidator | Screen.items embed 検証 (legacy screen-items/ 残存 / kind 別 items 空) | screens/ ディレクトリ |
| 12 | processFlowAntipatternValidator | 既知アンチパターン検出 (18 ルール) | 処理フロー JSON 直接解析 |
UNKNOWN_RESPONSE_REF / UNKNOWN_ERROR_CODE / UNKNOWN_IDENTIFIER / UNKNOWN_COLUMN / UNKNOWN_CONV_* / UNKNOWN_HANDLER_FLOW / MISSING_REQUIRED_ARGUMENT / EXTRA_ARGUMENT / PRIMARY_INVOKER_MISMATCH / DUPLICATE_EVENT_ID / NULL_NOT_ALLOWED_AT_INSERT / FK_REFERENCE_NOT_INSERTED / CASCADE_DELETE_OMITTED 等INCONSISTENT_ARGUMENT_CONTRACT (1 フローを呼ぶ複数イベント間で argumentMapping キー集合が異なる) / UNIQUE_CHECK_MISSING (UNIQUE カラムへの INSERT で事前重複チェックなし、#640) / TX_CIRCULAR_DEPENDENCY (transactionScope 内で INSERT/UPDATE テーブル間に双方向 FK 循環、#642)| 観点 | バリデータでカバー | AI 目視のみ |
|---|---|---|
| 1. 変数ライフサイクル | identifierScope (root 識別子の未宣言) / sqlOrderValidator (INSERT 時点の未バインド変数) | TX 順序 / property path / 前方参照は AI |
| 2. TX スコープ整合 | (なし) | AI |
| 3. runIf 連鎖の網羅性 | (なし) | AI |
| 4. branch / elseBranch 到達性 | (なし) | AI |
| 5. compensatesFor 健全性 | referentialIntegrity (compensatesFor 対象の実在チェック) | 補償内容の妥当性は AI |
| 6. eventsCatalog ⇄ eventPublish | (なし、referentialIntegrity 対象外) | AI |
| 7. 外部呼び出しと TX 位置 | referentialIntegrity (systemRef 実在) | TX 内外の位置関係は AI |
| 8. rollbackOn 発火可能性 | referentialIntegrity (UNKNOWN_ERROR_CODE) | TX inner からの実発火可能性は AI |
| 9. 画面項目イベント連携整合 | screenItemFlowValidator (handlerFlowId / argumentMapping / primaryInvoker / events[].id ユニーク) | 業務文脈での argumentMapping 値の妥当性 (UI 入力 → フロー入力の意味的整合) は AI |
| 10. 画面項目値レベル整合 | screenItemFieldTypeValidator (options 包含 / domainKey / 型 / pattern / range / length) | 業務文脈の妥当性 (選択肢命名の業務適切性 / domain 設計妥当性) は AI |
| 11. DB 制約 × INSERT / DELETE 順序 (#632 / #640 / #641 / #642) | sqlOrderValidator (NULL_NOT_ALLOWED_AT_INSERT / FK_REFERENCE_NOT_INSERTED / UNIQUE_CHECK_MISSING / CASCADE_DELETE_OMITTED / TX_CIRCULAR_DEPENDENCY) | 複雑な条件分岐での可能性の有無は AI / UNIQUE チェック抑止パターンの業務妥当性は AI / onDelete 設定が業務要件として適切かは AI / TX 循環の DEFERRED 検出は Phase 5 候補 (別 ISSUE) |
| 12. ViewDefinition 整合 (#649) | viewDefinitionValidator (UNKNOWN_SOURCE_TABLE / UNKNOWN_TABLE_COLUMN_REF / DUPLICATE_VIEW_COLUMN_NAME / UNKNOWN_SORT_COLUMN / UNKNOWN_FILTER_COLUMN / UNKNOWN_GROUP_BY_COLUMN) | sourceTableId ↔ dbAccess テーブルの業務的整合 / FIELD_TYPE_INCOMPATIBLE の業務妥当性は AI |
| 13. SQL SELECT ↔ ViewDefinition alias 整合 (#775) | (なし、目視のみ) | SELECT 結果が viewer VD columns[].name と直接バインドする場合に AS "<camelCase>" alias があるか / alias 後の camelCase キーで変数参照が一致しているか |
| 15. 業務 semantic 架空値検出 (#780) | (なし、機械検出困難) | WHERE 句 / JOIN 条件のリテラル (= 'DEFAULT' 等) がサンプル data に存在するか / 業務概念として意味があるか / multi-* dimension との整合 |
| 16. SQL alias 同名異物理列の event 整合 (#780) | (なし、機械検出困難) | unaliased i.id と aliased p.id AS "productId" を混在させた SELECT で event payload / outputBinding が誤参照していないか |
| 17. PostgreSQL aggregate 型変換 (#781) | (なし、機械検出困難) | COUNT(*) / SUM(...) / AVG(...) / DATE_PART(...) 等の SQL 結果を後続 step で数値比較する場合、outputBinding.transformations: [{ field, type: "integer" | "float" | ... }] で型変換が宣言されているか。SQL 側で CAST(...) を書く形式は anti-pattern (DB 方言を吸収しない) → transformations への migration を提案 |
監査根拠: docs/spec/dogfood-2026-04-29-phase2-validator-audit.md §3 / §4 + Phase 3 子 1 #619 (PR #626)。
UNKNOWN_SOURCE_TABLE / UNKNOWN_TABLE_COLUMN_REF / UNKNOWN_TABLE_REF_IN_VIEW (#745) / DUPLICATE_VIEW_COLUMN_NAME / UNKNOWN_SORT_COLUMN / UNKNOWN_FILTER_COLUMN / UNKNOWN_GROUP_BY_COLUMNJOIN_NOT_DECLARED (Level 2 アップグレード推奨、#745) / FIELD_TYPE_INCOMPATIBLE / FILTER_OPERATOR_TYPE_MISMATCHnpm run validate:samples 自体が失敗 (依存解決等) → 同上、Step 1 に進む各観点を 必ず実施。「該当なし」の場合もその旨を明記する。 観点 11 / 12 は機械検出が主 (Step 0.5) で AI 目視は業務文脈の妥当性のみ担当する。観点 15 / 16 / 17 は PR #780 retail audit (段階 4 dogfood) で確立した新規観点で、AI 目視のみ。
すべての @varName 参照を抽出し、実行順に追跡:
inputs[].name / outputs[].name / outputBinding / ambientVariables[].name / domainsCatalog (型定義のみで実体ではないので除外) / 各 step の outputBindingcondition / expression / bodyExpression / sql / httpCall.body / payload / runIf 等検出対象:
@var を参照@input.x (s 抜け、正しくは @inputs.x) 等の typo報告形式:
@<varName>:
set at: step-X (line Y) [outputBinding | inputs | ambientVariables]
used at: step-A (line B) <expression>, step-C (line D) ...
status: ✓ OK / ❌ 前方参照 (set at step-X but used at step-Y where Y < X) / ❌ 未定義
type: "transactionScope" の step を全列挙し、各 TX について:
rollbackOn のエラーコードが inner steps から実際に発生しうるか (TX 外 step のエラーで指定すると死コード)onRollback の補償 step が inner で書き込んだテーブルを正しく扱っているか冪等 UPSERT (UPSERT_IDEMPOTENT operation 使用) の後続 step 群について:
@upsertedTrade.trade_id != null か IS NOT NULL か。式言語の整合)各 type: "branch" step について:
condition 式が変数ライフサイクル上有効か (ライフサイクル分析と連動)compensatesFor: "step-X" を持つ step すべてについて:
eventPublish step が存在するかeventPublish.topic (or eventRef) で参照する topic が eventsCatalog に登録されているかpayload が catalog の payload schema と整合しているか (フィールド名・必須項目)type: "externalSystem" step すべてについて:
outcomes.failure: "compensate" 等の補償処理が正しく書かれているかfireAndForget: true の場合、outcomes.failure: "continue" になっているか (発火しっぱなしと整合)TransactionScope の rollbackOn: [...] で指定したエラーコードについて:
errorCatalog エントリが存在するかUI 起点フロー (type: "screen" / mode: "upstream") について、画面項目側との接続点を検証。機械検出の大半は Step 0.5 の screenItemFlowValidator でカバー されるため、AI 目視は 「validator では届かない業務文脈の妥当性」 に絞る。
meta.primaryInvoker の業務妥当性: 双方向参照は validator が確認するが、宣言された ScreenItem.events[] が業務上の主要起動元として妥当か (例: 「保存」フローの primaryInvoker が「ヘルプリンク」になっていないか)argumentMapping.amount に画面側 @self.priceJpy を渡しているが、フロー側 inputs.amount のドメイン (例: 通貨単位) と一致するかは AI 判断inputs[].required: true だが画面側で空文字を渡しうる UI なら、フロー側の入力検証 step (type: "validate") が catch しているかtype: "system" / type: "batch" / mode: "downstream" で meta.primaryInvoker を設定しているのは設計ミス候補type: "system" / type: "batch" フローで meta.primaryInvoker 未設定 + 同プロジェクト内のどの ScreenItem.events[] からも呼ばれていない場合 (validator も起動しない)報告形式:
@<flowId> primaryInvoker: <screenId>.<itemId>.<eventId>
validator 検出: <validator が出した issue 一覧>
業務妥当性: ✓ OK / ⚠ 業務文脈で argumentMapping が型整合しない / ❌ primaryInvoker が業務上の主要起動元と異なる
UI 起点フロー (type: "screen" / mode: "upstream") について、画面項目側との 値レベル での整合を検証。機械検出の大半は Step 0.5 の screenItemFieldTypeValidator でカバー されるため、AI 目視は 「validator では届かない業務文脈の妥当性」 に絞る:
options[].value 自体は flow domain enum と一致していても、選択肢命名が業務として適切か (例: label vs value の表示ラベル整合)BenefitType を多業務で再利用するか専用に閉じるか)画面遷移を含むフローについて、画面フロー edges × ProcessFlow の ScreenTransitionStep.targetScreenId × 画面 path (URL ルーティング) の三者整合を検証する。機械検出は Step 0.5 の screenNavigationValidator でカバー されるため、AI 目視は 「validator では届かない業務文脈の妥当性」 に絞る:
MISSING_FLOW_EDGE warning は 業務遷移として意図的か再確認 (画面フロー edges を後で追加すべき遷移か、単に不要なら ScreenTransitionStep 側を削除)MISSING_FLOW_TRANSITION error (#744) は edge が kind: "flow-driven" なのに対応 ScreenTransitionStep が無い。純 UI 遷移なら kind: "navigation" に修正、処理を伴うなら ProcessFlow に ScreenTransitionStep を追加 (Must-fix 候補)AUTH_TRANSITION_VIOLATION の例外運用 (login / error 画面以外で auth 不一致を許容するべき業務シナリオが妥当か)DEAD_END_SCREEN warning が 業務として終端でよい画面か (確認画面 / 完了画面は終端で正当、それ以外は遷移欠落の可能性)PATH_PARAM_MISMATCH warning は path 設計の業務的整合性を再確認 (param 名の業務表現が source / target で一致しているか)UNKNOWN_TARGET_SCREEN (実在しない画面への遷移) / DUPLICATE_SCREEN_PATH (path 衝突) / AUTH_TRANSITION_VIOLATION (認証 bypass)このフローに紐付く画面項目の refKey 設定と conventions.fieldKeys 宣言の整合性を確認する。機械検出は Step 0.5 の screenItemRefKeyValidator でカバー されるため、AI 目視は 「validator では届かない業務文脈の妥当性」 に絞る:
refKey の画面項目間で UI 制約の業務上の差異が正当か (例: 振込実行は required=true、履歴照会は required=false — 画面 role の違いとして正当)conventions.fieldKeys の displayName / description が業務の実態を正確に表しているかrefKey が付与されているか (付与漏れは warning 受容可だが将来の整合性リスク)refKey は UNDECLARED_REF_KEY / INCONSISTENT_TYPE_BY_REF_KEY は Must-fix 相当 (validator が検出)、それ以外の warning 観点 (INCONSISTENT_FORMAT / VALIDATION / HANDLER_FLOW / ORPHAN / DECLARED_TYPE_MISMATCH) は business context で判断業務上意味のないリテラル値が WHERE 句や JOIN 条件に hardcode されていないか検証する。機械検出は困難な業務 semantic 領域の AI 目視観点。
WHERE <column> = '<LITERAL>' のようにリテラルが現れる場合、その値が:
'DEFAULT' 'CENTRAL' のような汎用語は要警戒)store_code = 'DEFAULT' を hardcode して multi-store 設計と矛盾するパターン (PR #780 の M-1)grep -P "= '[A-Z_]+'" で全 caps の literal を抽出@cartItem.storeId 等) に置き換え、必要なら schema レベルで context (例: cart_items.store_id) を持たせるSELECT で複数テーブルの primary key を取得する場合、unaliased な id と aliased な ... AS "<entityId>" が共存し、後続 step で誤参照するリスクを検証する。
SELECT i.id, p.id AS "productId", ... のように、複数の .id を取得していないか@row.id と書いている箇所が、SQL の i.id (= 別テーブルの主キー) を意味してしまっていないかproductId) を期待しているが、@row.id では unaliased な inventory.id が流れるgrep -P "@\\w+\\.id\\b" で .id 参照を抽出i.id, p.id AS "productId" のような複数 id 取得をしている場合は誤参照疑い@row.productId) しているか確認i.id AS "inventoryId" と全 column に alias を付けるCOUNT(*) / SUM(...) 等の戻り値型が PG では bigint / decimal で pg クライアント経由で文字列化される問題を検証する。
SELECT COUNT(*) AS "<name>" FROM ... / SELECT SUM(<col>) AS "<name>" ... で取得した値を後続 step で数値比較しているか確認"10" >= 20 の暗黙変換に依存する形になるoutputBinding.transformations: [{ field: "<alias>", type: "integer" \| "float" \| ... }] で runtime に型変換を吸収させる (推奨、#781 で導入済み、transactionScope の outputBinding には不適用)。SQL 側で CAST(...) を書く形式は DB 方言が SQL に染み出す anti-pattern → transformations への migration を提案するgrep -P "COUNT\\(|SUM\\(|AVG\\(|DATE_PART\\(" flow.json で aggregate を抽出outputBinding.transformations に対応 field の型変換が宣言されているか確認 (なければ Should-fix)transformations の代わりに CAST(...) を SQL に書いている場合は anti-pattern として transformations への置き換えを Should-fix で提案>= / < / arithmetic) があるかも合わせて確認結果を 標準出力 に Markdown で出す (PR コメント投稿はしない、設計フェーズで使えるため)。
## /review-flow 結果 — <YYYY-MM-DD HH:MM>
**対象**: <絶対パス>
**ID**: <id>
**name**: <name>
**maturity**: <maturity>
---
### 総合判定
**Must-fix: N 件 / Should-fix: M 件 / Nit: K 件**
---
### Must-fix (実行時バグ確実)
#### 1. <観点名>: <一行要約>
- 場所: `<file>:<line>` step-X (`type: <type>`)
- 詳細: ...
- 推奨修正: ...
### Should-fix (実行時の品質劣化リスク)
...
### Nit (任意改善)
...
---
### 17 観点別カバレッジ
`validator 検出済` 欄には Step 0.5 で動作したバリデータの issue 件数を、`AI 目視` 欄には Step 1 で AI が検出した件数 (validator 重複は除外) を記入する。
| 観点 | validator 検出済 | AI 目視 (M / S / N) | 状態 |
|---|---|---|---|
| 1. 変数ライフサイクル | identifierScope: N 件 | M:0 / S:0 / N:0 | ✓ 問題なし / ❌ Must-fix あり |
| 2. TransactionScope 内外整合 | (validator 対象外) | ... | ... |
| 3. runIf 連鎖の網羅性 | (validator 対象外) | ... | ... |
| 4. branch 到達性 | (validator 対象外) | ... | ... |
| 5. compensatesFor | referentialIntegrity: N 件 | ... | ... |
| 6. eventsCatalog ⇄ eventPublish | (validator 対象外) | ... | ... |
| 7. 外部呼び出しと TX | referentialIntegrity (systemRef): N 件 | ... | ... |
| 8. rollbackOn 発火可能性 | referentialIntegrity (UNKNOWN_ERROR_CODE): N 件 | ... | ... |
| 9. 画面項目イベント連携整合性 | screenItemFlowValidator: N 件 (UNKNOWN_HANDLER_FLOW / MISSING_REQUIRED_ARGUMENT / EXTRA_ARGUMENT / PRIMARY_INVOKER_MISMATCH / DUPLICATE_EVENT_ID / INCONSISTENT_ARGUMENT_CONTRACT 内訳) | 業務妥当性 (型整合 / 主要起動元妥当性) は AI | ... |
| 10. 画面項目値レベル整合 | screenItemFieldTypeValidator: N 件 (OPTIONS_NOT_SUBSET_OF_ENUM / DOMAIN_KEY_MISMATCH / TYPE_MISMATCH / PATTERN_DIVERGENCE / RANGE_DIVERGENCE / LENGTH_DIVERGENCE 内訳) | 業務妥当性 (選択肢命名 / domain 設計) は AI | ... |
| 14. 画面項目 refKey 横断整合 | screenItemRefKeyValidator: N 件 (UNDECLARED_REF_KEY / INCONSISTENT_TYPE_BY_REF_KEY / INCONSISTENT_FORMAT_BY_REF_KEY / INCONSISTENT_VALIDATION_BY_REF_KEY / INCONSISTENT_HANDLER_FLOW_BY_REF_KEY / ORPHAN_FIELD_KEY / DECLARED_TYPE_MISMATCH 内訳) | 業務文脈での warning 判断は AI | ... |
| 15. 業務 semantic 架空値検出 (#780) | (validator 対象外) | M:0 / S:0 / N:0 | ✓ 問題なし / ❌ Must-fix あり |
| 16. SQL alias 同名異物理列の event 整合 (#780) | (validator 対象外) | M:0 / S:0 / N:0 | ✓ 問題なし / ❌ Must-fix あり |
| 17. PostgreSQL aggregate 型変換 (#780) | (validator 対象外) | M:0 / S:0 / N:0 | ✓ 問題なし / ⚠ Should-fix あり |
Step 0.5 をスキップした場合は `validator 検出済` 列を全行 `未実行` と記載する。
---
### 変数ライフサイクル詳細 (参考)
| 変数 | 設定 step | 参照 step | 状態 |
|---|---|---|---|
| @inputs.foo | inputs | step-01, step-05 | ✓ |
| @bar | step-02 outputBinding | step-04, step-06 | ✓ |
| @baz | step-08 outputBinding | step-05 | ❌ 前方参照 |
---
### 検証方法
- Step 0.5: `npm run validate:samples -- ../examples/<project-id>` で 12 バリデータ実行
- 対象ファイル全文読み込み: <パス>
- 17 観点を順に手動で grep + ライフサイクル追跡 (validator 検出済の問題は重複説明しない)
- 必要に応じて `schemas/v3/process-flow.v3.schema.json` の TransactionScopeStep 定義も参照
ユーザーに短く 1-3 行で:
複数プロジェクト検証の場合: 全件サマリ表 (フロー ID × Must-fix 件数) を最後に追加。
フローレビュー開始前に 関連する画面の editorKind / cssFramework を確認する。
screen.design.editorKind / screen.design.cssFramework (画面個別指定)project.techStack.designer.editorKind / project.techStack.designer.cssFramework (project default、#826 で project.design から移行)"grapesjs" / "bootstrap")editorKind: "grapesjs" → screens/<id>/design.json を読む (GrapesJS 形式)editorKind: "puck" → screens/<id>/puck-data.json を読む (Puck Data tree)editorKind: "puck") を明示スキップしてレポートに記録することscreen.design.editorKind === "puck" または解決後の editorKind が "puck" であること詳細仕様: docs/spec/multi-editor-puck.md § 2.3
npm run validate:samples 実行のみ)backend が起動していなくても動く (引数なし時のみ MCP 利用、明示指定時は不要)/issues オーケストレーターから Skill ツール経由で呼ばれた場合: 結果は標準出力に出す (Opus が読み取る)。ユーザー報告の役割は呼び出し元