AI Des2WF — テストケース設計
I/O 定義 の対になるページです。契約変更はコードのマージ前に双方へ反映します。ケースは
今日書けるもの と 入力が揃ってから実行できるもの で分けています。
文言、元ジオメトリ、ガード付きの図形簡略化、保守的 fallback、scope 付き review transport を検証します。
キット固有のケースには登録済みキット、視覚認識品質には元 PNG と実 provider の実行が必要です。
以下は期待の定義であり、すべての手動確認や下流の検証が完了したという主張ではありません。
D-P — Parse(今日仕様化可能)
| ID |
ケース |
期待 |
| D-P-01 |
デザイン FRAME を parse |
ツリーを出力し、ノード数と深さを記録 |
| D-P-02 |
インスタンスがアイデンティティを保持 |
すべての INSTANCE ノードが componentId と componentProperties を原文のまま保持 |
| D-P-03 |
名前付きスタイルが生存 |
すべての style 参照を publish key として取得し、ダングリング 0 件 |
| D-P-04 |
決定性 |
同一スナップショットの 2 回の parse が バイト一致。parse 経路に LLM は無い |
| D-P-05 |
キャッシュキーが位置を含まない |
キャンバス上でフレームを移動しても parse を無効化 しない。WF2Des の parse ハッシュは absoluteBoundingBox を含み、純粋な移動がバイト一致の抽出結果を無効化していた |
| D-P-06 |
snapshot のマップ保持 |
参照された components/componentSets/styles を保存し、scoped fetch 後も publish identity が残ることを確認 |
| D-P-07 |
マスターをツリー抽出で読まない |
ツリー抽出による COMPONENT_SET 読み取りは却下。derive_component_context はバリアント境界を返す |
| D-P-08 |
非表示のフロー状態 |
不可視の内容は描画しない。auto-layout の領域を占める opacity 0 の子は透明な source-layout slot を保持 |
D-V — 入力バリデーション(今日仕様化可能)
| ID |
ケース |
期待 |
| D-V-01 |
FRAME でない(COMPONENT / GROUP / page) |
invalid_input.not_a_frame、部分書き込みなし |
| D-V-02 |
可視の作成ノードが無いフレーム |
invalid_input.empty_frame |
| D-V-03 |
バイト上限超過のスナップショット |
invalid_input.snapshot_too_large。上限は des2wf の取得経路で明示的に強制 |
| D-V-04 |
ワイヤーフレームをデザインとして投入 |
デザイン判定器はない。provenance 自体は下流での拒否を保証しない(D-O-03 参照) |
D-C — コントロールプレーン(今日仕様化可能)
| ID |
ケース |
期待 |
| D-C-01 |
投入前に行が存在 |
メッセージ送信前に edge=des2wf の行が存在する |
| D-C-02 |
ワーカーは PostgreSQL に書かない |
ワーカーに PG クレデンシャルが無いことを構造的に検証 |
| D-C-03 |
明示的 dispatch |
必須 edge=des2wf を保持。生成と kind=render_review は専用 DES2WF キューを使用 |
| D-C-04 |
attempt フェンシング |
古い attempt の Webhook は無視。DocDB コミットは (job_id, attempt) でフェンス |
| D-C-05 |
終端の再送 |
同一 attempt に対する 2 度目の succeeded は no-op |
| D-C-06 |
open-generation フェンス |
同一 (project, file, node, edge) の 2 本目は却下 |
| D-C-07 |
フェンス解放 |
終端または明示的 cancel で解放。定期 reaper の存在を前提にしない |
| D-C-08 |
edge をまたぐ冪等性 |
WF2Des ジョブと Des2WF ジョブがプラグインの jobId → rootNodeId インデックスで衝突しない |
| D-C-09 |
スコープ付き取得は高速経路を通る |
クライアントが渡した sectionNodeId がフレームを含む場合、取得はそのサブツリーのみで、ファイル全体の GET /files/{key}(実測 255MB / 67.5 秒、140 秒でソケット切断)を決して発行しない |
| D-C-10 |
誤ったスコープは劣化するが破損させない |
フレームを含まない・削除済みノードを指す sectionNodeId はログを残してファイル全体走査へフォールバックし、得られる source_hash はスコープ無し取得と一致する — このハッシュは parse キャッシュのキーであり、古いスコープが別フレームの parse を返してはならない |
D-O — 出力ドキュメント(今日仕様化可能)
| ID |
ケース |
期待 |
| D-O-01 |
WireframeDoc の形状 |
based_on = 1、type = 0、memos = []、summaries を算出 |
| D-O-02 |
_id の分離 |
Des2WF は …_{node_id}~des2wf を書き、wf_parse は非スコープ id を書く。同一フレームを両エッジが処理すると 2 つの ドキュメントになり、どちらも上書きされない |
| D-O-03 |
下流の provenance guard(フォローアップ) |
based_on=1 の機械生成入力を拒否すると主張する前に各 consumer を検証。出力 provenance 自体は guard ではない |
| D-O-04 |
unmatched は可視 |
表現できないノードはプレースホルダとなり、スコアゲートを 0 にする |
| D-O-05 |
成果物 |
終端成功前にジョブ単位 parse/result/manifest が存在。version 固定元 PNG のキーは source/render hash を含む |
| D-O-06 |
キット不在はプリミティブへフォールバック |
キット表現の無いノードは layout_frame/text プリミティブとして出力される — unmatched にも失敗にもならない |
| D-O-07 |
キット入れ替えは綺麗に劣化する |
別キット登録後、消えたコンポーネントを参照するエントリは参照時に破棄・再投票され、出力はプリミティブへ劣化する。クラッシュもプレースホルダの氾濫も起きない |
| D-O-08 |
描画行の完全性 |
各描画行が出力 lineage または明示的な複合要素に対応。確認済み ornament は非描画にでき、必要なフロースロットは残す |
| D-O-09 |
ガード付き kit 置換 |
キット置換は文言と独立描画の子孫を表現できる場合のみ。明示的 ornament 抑止とは区別 |
| D-O-10 |
layout: absolute |
描画行を root 下の元座標に置き、深さゲートは 2。API 省略時の既定であり、現プラグインの送信設定ではない |
| D-O-11 |
layout: auto |
元階層、子が 1 つの wrapper、itemSpacing、padding、baseline、wrap、軸ごとの sizing を保持。平坦化後に新たな間隔を推論しない |
| D-O-12 |
どちらのレイアウトも同じコピーを運ぶ |
同一フレームを absolute と auto で出力すると、同じ文字列が同じ回数だけ現れる。選択が変えるのは構造であって内容ではない |
| D-O-13 |
拒否されるレンダーは記録し、再試行しない |
デザインフレームと生成ワイヤーフレームを、どちらの辺もビジョンモデルの 8000px 上限を超えないよう縮尺して PNG のペアで書き出す。モデルが拒否するレンダーは status: "skipped" と理由を記録し、finding 数を null にする。実行されなかったパスから「所見なし」と読めてはならない |
D-S — スコア(一部は今日仕様化可能)
| ID |
ケース |
期待 |
| D-S-01 |
コンテンツ保存 |
入力の各文字列が原文のまま、同じ多重度で出現する — デザインが 3 回述べるラベルは 3 回出力される。キットインスタンスのスロットに収まったコピーも出力済みとして数える |
| D-S-02 |
メトリクスはデザインに対して計測する |
engine/measure.py は integrity / flatness / ink_covered / boundary_fidelity をデザインツリーと出力 spec から算出し、較正中は 重み 0 で報告する。同モジュールは emitter・census・selection を import してはならない — 計測される側が供給する分母は計測ではないため。この import 禁止はテストで強制する |
| D-S-03 |
ゲート |
出力ノードに unmatched が 1 つでもある場合、および strings_invented / text_displaced / cross_over_text / boxes_coincident のいずれかが 0 でない場合、スコアを 0 にする。strings_lost は意図的にゲートに 入れない — コンテンツ保存が既に採点しており、二重に数えるとスコアが合否ビットに潰れる |
| D-S-04 |
スカラーではなくバンド |
スコアはマージン付きで報告し、ノイズ帯内の改善はラチェットしない |
| D-S-05 |
数値がサーバーへ到達 |
score と score_version はマニフェストの row_effects.wf2des ブロックで共有の generation 行へ届く。このブロックはエッジではなく影響先の テーブル で鍵付けされ、両フィールドは加算的なので、WF2Des エッジが省いても同じ backend の読み手が行を適用する。ゲート・バンド・各項を含むブロック全体は、その行が指す結果ドキュメントにある |
| D-S-06 |
モデル支援の band |
kit selection または graphic classification が llm_assisted を設定したら margin 0.07、それ以外 0.0。primitives はモデル不使用を保証しない |
| D-S-07 |
深さのゲートはフラットが契約の場合のみ |
深さの項は、フラットであることを要求した absolute レイアウトにのみ適用する。auto のワイヤーフレームは意図して入れ子になるため、その深さは flatness として報告するだけでゲートしない。コーパスでの実測は 6〜11 |
キットまたは受け入れ済み結果ワイヤーフレームを要するケース
いま記述済みで、それぞれの入力が揃い次第実行できます。欠落を可視化するために列挙します。必要な入力が
「—」のケースは、すでに揃っているもの以外を何も要しません。
| ID |
ケース |
必要な入力 |
| D-K-01 |
出力したコンポーネント参照がターゲットファイルで解決する |
キットの設置 + 登録 |
| D-K-02 |
語彙カバレッジ — 表現先を持つデザインコンポーネントの割合 |
選定したキットのインベントリ |
| D-K-03 |
バリアント選択が根拠どおりのバリアントを選ぶ — 選択の単位はコンポーネントではなく バリアント。コンポーネントセットはインスタンス化できず、セット内の全バリアントはレジストリの _id を共有するため、投票も解決もバリアント単位の一意キーで行う |
キットの設置 |
| D-K-04 |
脱スタイルは意味と組版を保持:文字と面は中立色のリテラルで design style binding なし。元 font/weight/geometry と保護 glyph の色は保持可能。罫線と状態印には塗りを許可 |
— |
| D-K-05 |
元 layout、文言、ガード付き画像方針:意味のある glyph を保持、許可画像は ink、装飾は ornament。文字上にクロスを描かない |
— |
| D-K-06 |
同一画面の人手ワイヤーフレームとの類似度 |
受け入れ済み結果ワイヤーフレーム |
| D-K-07 |
選択ガード — 投票で選ばれたアトムは unreachable / copy_truncated / slot_overflow / imagery_heavy / size_implausible / unknown_atom により棄却され、不正なインスタンスを出さずプリミティブのボックスへフォールバックする。スロット容量はバリアントが宣言する 相異なる スロットレイヤーパスの数 — マテリアライザはパスでスロットを指すため、同一パスの 2 つの宣言は 1 つの宛先 |
キットの設置 |
| D-K-08 |
選択安定性:実 provider で反復し variant/graphic の差を報告。多数決と score band は同一出力を保証しない |
設置済みキットと実 provider |
| D-K-09 |
mode の分割:両 mode が画像分類を利用可能。kit だけが component context のサンプリング選択を追加 |
設置済みキット。呼び出し検証は model stub |
| D-K-10 |
mode 既定:省略時は primitives。同じ保守的 graphic policy を使用 |
— |
D-G — グラフィックと元ジオメトリ
| ID |
ケース |
期待 |
| D-G-01 |
矢印、操作/hamburger、状態、SNS/識別、list marker、unknown |
実際の元形状を保持。名前や raster/vector 形式だけでは置換を許可しない |
| D-G-02 |
簡略化ガード |
高信頼、情報を持たない content_image/redundant_artwork/decoration だけが対象。redundant_artwork は実在するローカル label_node_id が必須 |
| D-G-03 |
ボタンの飾りとフッター背景 |
確認済み装飾はクロス付き placeholder や paint を出さない。必要なフロー領域と周囲のボタン/文言の配置を保持 |
| D-G-04 |
根拠と返答の欠落/不正 |
PNG 欠落/破損/過大/アスペクト不一致、provider 障害、不完全/未知/重複 ID、時間切れは保持し理由を記録 |
| D-G-05 |
バッチ制限と対象範囲 |
6 候補/batch、3 並列、分類予算 180 秒。先頭 120 件制限なし。枝/control を再帰的に交互処理し、crop は active batch ごとに作成 |
| D-G-06 |
文脈と根拠 |
出現箇所ごとの overview、graphic/control crop、label、variant、ancestor を供給。元画像/根拠 hash と prompt/model を記録 |
| D-G-07 |
Override |
organization/project/file に限定。component ID と variant は完全一致。node 優先、重複競合は保持。simplify は ink であり ornament ではない。旧 verdict を使わない |
| D-G-08 |
実際の描画方針 |
提案と、元の親 glyph または kit instance に覆われた子を区別。集計数を独立した見た目の変更数とみなさない |
| D-G-09 |
元 glyph の構築 |
実インスタンスと override を clone、比例拡縮と x/y 中央配置。clone 失敗は実際の元 PNG。別ファイル/欠落は可視 fallback と診断 |
| D-G-10 |
Layout sizing |
1 子 wrapper、軸ごとの FIXED/HUG/FILL、min/max、絶対配置、opacity 0 slot を保持。単独 SPACE_BETWEEN 子は元の根拠がある場合のみ中央配置 |
| D-G-11 |
Text geometry |
font family/weight、行高、文字間隔、自動 resize、trim、alignment、段落を保持。元 clone で PALT を保持。fallback/reflow の診断も確認 |
| D-G-12 |
旧仕様互換 |
source_layout/text_geometry のない spec は従来の WF2DES 動作を維持 |
| D-G-13 |
キャンバス名と plugin 設定 |
plugin は auto を要求。DES2WF は des2wf · source_name(空なら version)。CODE2WF を含む明示 spec.name が優先 |
D-R — 取得とレビューの安全性
| ID |
ケース |
期待 |
| D-R-01 |
元画像の version 一致 |
実際にフレームを返した応答の version と absolute bounds で export。PNG key は source/render hash を含む |
| D-R-02 |
取得 fallback |
version なしなら export しない。export/upload 失敗でも有効 snapshot を維持し PNG URL は省略。新しい未固定画像で代用しない |
| D-R-03 |
Review 行の検証 |
project write と DES2WF 行 scope が必須。body jobId 不一致は 400、非 COMPLETED は 409。upload/enqueue より前に拒否 |
| D-R-04 |
生成中の元選択/project 変更 |
pair は元 source と backend client/project に固定。構築 job ID の一致を確認 |
| D-R-05 |
Review worker の scope |
結果欠落/別 tenant/別 project は download、model、結果書き込み前に拒否。未知の結果を upsert しない |
| D-R-06 |
Review 状態と履歴 |
過大画像は skipped と null finding_count。provider 障害は問題なしではない。前回 block を保持し、生成は完了のまま |
検証箇所と限界
- AI:
apps/des2wf/__tests__/unit/test_graphic_classification.py、test_graphics.py、
test_source_geometry.py、test_engine.py、test_service.py、共有 packages/figma-ir/__tests__。
- Plugin:materializer/source-geometry のテストと
des2wfPanel.review.test.tsx。
- Backend:
apps/app/__tests__/unit/services/des2wf.test.ts、des2wf-snapshot.test.ts、
apps/app/__tests__/unit/repositories/figma-rest-render.test.ts。
- mock model のテストは方針と transport の安全性を確認し、認識精度は検証しません。
固定 JSON corpus は元 PNG を持たず、保守的 fallback と layout の不変条件を検証します。
- 視覚改善を主張する前に、実 provider で分類し再生成した plugin 出力を確認します。
矢印/SNS/操作、ボタンの装飾、フッター背景、アイコン中央配置、文字を、元と結果の両方で確認します。
score 1.0 から正しさを推定しません。
- 反復実行と画面ごとの指標を比較し、平均で別画面の退行を隠しません。
テストにはクライアント固有の名前や ID ではなく、一般的な機構を記述します。