Des2WF Generation Result コレクション
概要
des2wf の生成出力コレクション — des2wf の実行 1 件につき 1 ドキュメントで、出力されたワイヤーフレームのスペック、それを採点したスコア、フラグ数、実行の lineage、そしてプラグインがレンダーの対を送った後の描画後レビューを保持する。des2wf ワーカーが parse → assemble という 1 回の呼び出しの最後に書き込む((_id, attempt) でフェンス)。des2wf-api はマテリアライズのためにこれを読み取り、描画後レビューのパスは同じドキュメントをその場で追記する。design_generation_result とは別コレクションである — 2 つのエッジが答える形状が異なり(ワイヤーフレームのスペック + スコア 対 デザインのスペック + 確信度)、1 つのコレクションに両方を入れるとすべての読み手が edge で分岐することになるため。
テーブル定義
| 論理名 | 物理名 | カラム名 | データ型 | 主キー | リレーション | ユニーク | NULL許可 | デフォルト値 | 備考 |
|---|---|---|---|---|---|---|---|---|---|
| Des2WF Generation Result | des2wf_generation_result | _id | string | ◯ | wf2des:id | 共有される wf2des の PG 行 id(実行の同一性 — 実行 1 件につき結果ドキュメント 1 つ、行と 1:1 で、job_id と同じ値)。この行 id は両エッジをまたいでグローバルに一意であり、それがプラグインの単一の (jobId → rootNodeId) 冪等インデックスを構成上安全に保っている。(_id, attempt) の CAS 書き込みフェンス |
|||
| edge | string | des2wf | タグ付きユニオンの判別子 — このコレクションでは常に des2wf。ディスパッチと読み手はこれでルーティングし、どの任意フィールドが埋まっているかでは決して判断しない。埋まっている任意フィールドだけが異なる 2 つのファミリーは安全に区別できない |
||||||
| organization_id | number | テナント所有者。すべての読み書きがこれでフィルタする | |||||||
| project_id | number | project:id | テナントスコープ。すべての読み書きがこれでフィルタする | ||||||
| job_id | string | wf2des:id | 生成元の実行 id — _id と同じ共有 wf2des 行 id。キーの外で読まれてもドキュメントが自己記述的であるようフィールドとしても持つ |
||||||
| attempt | number | 実行 attempt — 書き込みフェンス((_id, attempt) の CAS)がこれを比較して取って代わられた書き込みを拒否する。SQS の再配信で古い呼び出しが最後に完了しても、敗者のスペックを勝者の job id の下に公開することはない |
|||||||
| figma_file_key | string | デザインフレームが置かれている Figma ファイル(Figma の値そのまま。英数字、アンダースコアなし) | |||||||
| source_node_id | string | DESIGN フレーム — 実行がワイヤーフレーム化するよう指示された入力ノード | |||||||
| spec | object | 自己完結の {spec_version, edge, source_name, source_file_key?, name?, root}。style_bindings/parse_confirmed はなく、元ジオメトリは opt-in。 |
|||||||
| spec.spec_version | string | 1.0 | マテリアライザのワイヤー契約バージョン | ||||||
| spec.edge | string | des2wf | 命名と materializer 動作のための edge リテラル | ||||||
| spec.source_name | string | empty string | 元フレーム名 | ||||||
| spec.source_file_key | string | ◯ | 元 glyph/text を探す固定 Figma file。旧結果では任意 | ||||||
| spec.name | string | ◯ | null | 明示キャンバス名。未指定は des2wf · source_name、元名が空なら spec version | |||||
| spec.root | object | 既存の layout_frame/instance/compose/text/unmatched の 5 ケース。layout frame は placeholder=image、glyph_source、children を持ち得る。instance は kit identity・slot・DestylePolicy、text は文言と組版を持つ。任意の source_layout/text_geometry は下記参照。 | |||||||
| score | object | ds@1.0 — 出力可能性の GATE × コンテンツ保存率、バージョン付き。この製品には人手による修正ループがなく品質は機械側のラチェットで収束させるため、モデルの自己申告ではなく成果物から計算される。PostgreSQL に到達するのは score + score_version のみであり、band はラチェットが読むここに留まる。形状: { score, score_version, gate, band, terms } |
|||||||
| score.score | number | 採点対象の項の gate × 加重和、小数 4 桁に丸め |
|||||||
| score.score_version | string | ds@1.0 | スコアを計算した式のバージョン。項・重み・ゲートのいかなる変更でも上げる。バージョンをまたいだ比較は行わない — トレーサビリティのためのものである | ||||||
| score.gate | number | 0/1。unmatched ノードが 1 つでもあるとき、strings_invented/text_displaced/cross_over_text/boxes_coincident のいずれかが非ゼロのとき、そして absolute レイアウトに限りフラットを超える深さのときに 0 となる — auto レイアウトは意図的にネストするため、その深さをゲートすると指示どおりに動いた実行を 0 と採点してしまう。ゲートが 0 ならスコア全体が 0 になる: 穴の空いたワイヤーフレームは「部分的に良いワイヤーフレーム」ではない。strings_lost は意図的にゲートしない — コンテンツ保存率がすでにそれを採点している |
|||||||
| score.band | object | {low, high, margin}。kit selection または graphic classification が llm_assisted を設定した場合 0.07、それ以外 0.0。mode だけでは決定性を意味しない。 |
|||||||
| score.terms | object[] | [] | [{ name, value, weight }] — 退行が帰属可能になるよう、各項を自身の値とともに保持する。content_preservation は重み 1.0: デザインの文字列のうち出力に逐語で現れる割合であり、MULTISET として比較する(「次へ」と 3 回言う画面は出力でも 3 回言わねばならない)。integrity/flatness/ink_covered/boundary_fidelity は重み 0.0 で報告される — 可視かつ帰属可能でありながら、何点分の価値があるかの根拠が出るまで何も動かさない |
||||||
| flag_count | number | 0 | フラグ付き + unmatched のノード数 — 「レビューが必要なセルがいくつあるか」。共有バックエンドのバリデータが単一の形状のままでいられるよう wf2des での意味を保つ。マニフェストの row_effects.wf2des を通じて wf2des 行に到達する |
||||||
| graphic_classification | object | {} | 出現箇所ごとの分類監査。旧結果は空。人手 override 保存や完了後 review とは別 | ||||||
| graphic_classification.prompt_version | string | 現在の分類 prompt:des2wf-graphics-visual-2 | |||||||
| graphic_classification.model | string | 設定された分類モデル | |||||||
| graphic_classification.status | string | not-needed/fallback/partial/complete。complete は人手 override を含み得るため、全ノードの model 判定完了とは限らない | |||||||
| graphic_classification.source_render_sha256 | string | ◯ | 元 PNG hash。根拠なしなら null | ||||||
| graphic_classification.candidate_count | number | グラフィック候補数 | |||||||
| graphic_classification.decisions | object[] | [] | node_id、適用 action、status、reason。任意の evidence_sha256、proposal、rendered_kind、rendered_reason、covered_by。内部形状は I/O 定義参照 | ||||||
| graphic_classification.fallback_count | number | ◯ | 候補なしの早期 return では省略 | ||||||
| graphic_classification.simplified_count | number | ◯ | 装飾を含む適用 simplify 数。可視 placeholder ノード数ではない。候補なしの早期 return では省略 | ||||||
| render_review | object | ◯ | 描画後レビューのブロック — スコアには行えないパスである。スコアは何かが描かれる前に構造的な代理指標の上で計算されるため、描画されたキャンバス上の重なり、切れた文字列、欠落した要素を見ることができない。デザインフレームの PNG と構築されたワイヤーフレームの PNG を並べた 1 回の vision 呼び出し。プラグインがレンダーの対を送るまでは存在しない。設計上ポストターミナルであり、フェーズを進めるのではなく完了済みの実行に追記する。形状: { status, finding_count, summary, findings, prompt_version, model, checked_at } |
||||||
| render_review.status | string | reviewed/skipped。vision モデルが拒否するようなレンダーはリトライすべき失敗ではなくレンダーについての事実であり、skipped として skipped_reason + NULL の finding_count とともに記録される — 一度も走らなかったパスから「所見なし」と読めてしまわないようにするため |
|||||||
| render_review.finding_count | number | ◯ | 報告された所見の数。skipped では NULL |
||||||
| render_review.summary | string | 全体判断の一文。skipped では空 |
|||||||
| render_review.findings | object[] | [] | [{ kind, severity, location, description }]。kind: overlap/overflow/clipped_text/missing_element/extra_element/other。severity: high/medium/low。description は描画されたワイヤーフレームの何が誤っているかを一文で述べる |
||||||
| render_review.skipped_reason | string | ◯ | パスが走らなかった理由。status: "skipped" のときのみ存在する |
||||||
| render_review.prompt_version | string | レビュープロンプトのバージョン | |||||||
| render_review.model | string | レビューを行ったモデル id | |||||||
| render_review.checked_at | datetime | レビューを実行した時刻 | |||||||
| render_review_previous | object | ◯ | 現在のものの前にこのドキュメントが持っていたレビューブロック — 再レビューは黙って置き換えるのではなく MERGE するため、ラチェットが実行をまたいで比較できる。2 回目のレビューが届くまでは存在しない。形状は render_review と同じ |
||||||
| lineage | object | 全ドキュメント共通の lineage ブロック(ソース S3 キー/ハッシュ、プロセッサバージョン、処理時刻)。job_id = 生成元の実行 id、すなわち共有 wf2des 行 id。形状: { source_url, source_hash, processor_version, index_schema_version, processed_at, job_id } |
|||||||
| lineage.source_url | string | 生のデザインスナップショットの S3 キー — ノード単位の REST エンベロープ全体で、maps も保持される | |||||||
| lineage.source_hash | string | デザイン FRAME サブツリーの sha256。キャプチャ時に計算される(parse キャッシュキー) | |||||||
| lineage.processor_version | string | 生成元のプロセッサバージョン(例: des2wf@0.1) |
|||||||
| lineage.index_schema_version | string | 1.1 | このコレクションのドキュメントスキーマバージョン | ||||||
| lineage.processed_at | datetime | 終端書き込みタイムスタンプ | |||||||
| lineage.job_id | string | wf2des:id | 生成元の実行 id |
元のジオメトリ
spec の 5 ケースは変わりません。任意の source_layout は horizontal/vertical の
FIXED/HUG/FILL、AUTO/ABSOLUTE の positioning、strokes_in_layout、hidden、軸ごとの min/max を持ちます。
text の任意 text_geometry は font_family、auto_resize、line_height、line_height_pct、letter_spacing、
leading_trim、vertical_align、paragraph_spacing、paragraph_indent を持ちます。
これらを持たない旧結果は従来の materializer 動作を維持します。
layout frame の glyph_source は元図形を指します。spec.source_file_key で範囲を限定し、
実際のインスタンスの override を保持します。placeholder=image は許可された簡略化であり、
全アイコンの一律置換ではありません。装飾は意図的に非描画にできます。
契約と監査フィールドは I/O 定義 を参照してください。
リレーション
_id= 共有されるwf2desの PostgreSQL 行 id — 行と 1:1(バックエンドが先に行を作成し、ワーカーがドキュメントを書き込む)。同じ値がjob_idとlineage.job_idにも現れる。project_id→project.id。organization_id→ テナント所有者。{figma_file_key, source_node_id}は実行が読んだ DESIGN フレームを特定する。- 実行が出力したワイヤーフレームは、エッジスコープされた
_id = {project_id}_{figma_file_key}_{node_id}~des2wfのwireframeドキュメントである —wf_parseは同じフレームに対して接尾辞なしの id を使うため、2 つのエッジが互いを上書きすることはない。 spec.rootのinstanceノードはワイヤーフレームキットの VARIANT を指す:component_key/component_node_idはwireframe_component由来である。このエッジのplatform_design_idはレジストリキーではなく、そのアトムが代役となったデザインノードを保持する。- DocumentDB 内ではリレーションは強制されない。論理リレーションであり、アプリケーションコードで検証する。
インデックス
- PRIMARY KEY (
_id) — ユニーク。_idそのものが共有wf2des行 id(代理キーなし)。 - 実行のコミットは
(_id, attempt)の CAS —attempt ≤ コミット中の attemptに一致したときに upsert するため、再配信された古い attempt が新しいものを上書きすることはない(DB のユニークインデックスではなく、ワーカーの条件付き書き込みで強制される)。 - review は画像/model 処理より前に既存結果の organization/project scope を検証します。merge は upsert せず、未知の結果は新規作成せず例外にします。
- セカンダリインデックスは定義しない。読み取りはテナントフィルタ内での
_id指定である。
注記
- ワーカーは終端成功より前に生成成果物、wireframe 出力、この結果、manifest を保存します。
PG の完了・score/version・flag は
row_effects.wf2desから backend Webhook だけが反映します。 primitivesとkitは両方とも文脈による画像分類を使えます。kit だけが variant 選択を追加し、 キット欠落はプリミティブへ戻します。不確かな図形は元形状を保持し、許可された不要画像は ink、 確認済み装飾は ornament になります。- API の既定は
layout=absoluteです。現在の plugin はlayout=autoを明示送信し、 元階層、native item spacing、1 子 wrapper、sizing を保持します。 - キャンバス名は
spec.nameがなければdes2wf · {source_name}です。 別ドキュメントのWireframeDoc.nameは引き続きwf · {design frame name}を使います。 - 生成時の任意の version 固定元 PNG と、plugin の完了後 review pair は別物です。 review は upload 前に job ID 一致、scoped write access、COMPLETED 行を必要とします。 pair は元 source/project に固定し、review 失敗で生成を取り消しません。
graphic_classificationは提案と実際の描画 coverage を区別します。simplify の子が保持された親に 覆われる場合があるため、proposal だけでなく rendered_kind/covered_by も確認します。 人手graphic_override_v1はここではなくdes2wf_verdictに保存します。- 結果は全文を読みます。汎用 bounded-document 経路で spec を切り詰めると、 ワイヤーフレームの一部だけを黙って構築する危険があります。
- 構造/文言の score 1.0 はアイコン精度や視覚品質の合格ではありません。model stub と JSON のみの offline corpus では認識精度を証明できないため、実 provider で生成したキャンバスを確認します。