Design Generation Result コレクション
概要
主たる生成出力コレクション — wf2des の生成実行 1 件につき 1 ドキュメントで、固定された入力、確定済みの parse、組み立て済みの DesignSpec、バリデータ/確信度の記録、そしてプラグインの placement + feedback の帳簿を保持する。wf2des ワーカーが parse フェーズと assemble フェーズにまたがって書き込む((_id, attempt) でフェンス)。wf2des-api はプレビュー、レビュー、マテリアライズのためにこれを読み取る。決してドロップされない。
テーブル定義
| 論理名 | 物理名 | カラム名 | データ型 | 主キー | リレーション | ユニーク | NULL許可 | デフォルト値 | 備考 |
|---|---|---|---|---|---|---|---|---|---|
| Design Generation Result | design_generation_result | _id | string | ◯ | wf2des:id | wf2des の PG 行 id(実行の同一性 — 生成 1 件につき結果ドキュメント 1 つ、wf2des 行と 1:1。(_id, attempt) の CAS 書き込みフェンス)。主コレクションであり、決してドロップされない |
|||
| organization_id | number | テナント所有者。すべての読み書きがこれでフィルタする | |||||||
| project_id | number | project:id | テナントスコープ。すべての読み書きがこれでフィルタする | ||||||
| attempt | number | 実行 attempt — 書き込みフェンス((_id, attempt) の CAS)がこれを比較して取って代わられた書き込みを拒否する。現在は常に 1 — これを増加させるものはない |
|||||||
| screen_id | string | ◯ | 生成リクエスト由来(例: AC_RGST01)。生成行は常にこれを持つ |
||||||
| request | object | SQS メッセージから引き写したリクエストのスナップショット。形状: { screen_id: string, prompt: string \| null, placement_target: string \| null, auto_confirm: boolean } |
|||||||
| request.screen_id | string | リクエストされた画面 id | |||||||
| request.prompt | string | ◯ | 任意の選択プロンプト。memo intent より下位にランク付け | ||||||
| request.placement_target | string | ◯ | placement 用に引き写された任意のノード id | ||||||
| request.auto_confirm | boolean | false normal/true auto → parse と assemble を 1 回の呼び出しで実行 |
|||||||
| inputs | object | 固定された生成入力(parse 呼び出しの最初の行為。assemble 時のいかなるハッシュ不一致でも fail-closed で再水和される)。components = 選択元となった正確なセットであり、生成はどのコンポーネントが使われたかを再現する(レジストリハッシュだけではない)。形状: { wireframe {figma_file_key, node_id, source_hash}, design_rule {design_rule_id, content_hash}, components [{platform_design_id, content_hash}], llm {model_id, prompt_version, screen_review_model_id, screen_review_reasoning_effort, screen_review_enabled} } |
|||||||
| inputs.wireframe | object | { figma_file_key, node_id, source_hash } — 固定されたワイヤーフレームの同一性。source_hash ≡ parse キャッシュキー wf_content_hash かつ lineage.source_hash |
|||||||
| inputs.design_rule | object | ◯ | { design_rule_id, content_hash } — 固定されたバリデータプログラムのリビジョン(design_rule ドキュメントキー) |
||||||
| inputs.components | object[] | [{ platform_design_id, content_hash }] — フラット。選択元となった正確なレジストリコンポーネントセット(レジストリハッシュなし)。platform_design_id = design(type=component)行 id/design_component._id |
|||||||
| inputs.llm | object | { model_id, prompt_version, screen_review_model_id, screen_review_reasoning_effort, screen_review_enabled } — 固定されたモデル + プロンプトバージョン(例: mp@0.4)と screen review 設定。retry で provider/model behavior が変わらないよう matching/review config を pin |
|||||||
| parse | object | 確定済みの parse 記録。完全な parse ツリーは不変の parse.json アーティファクト(S3、artifact_urls.parse)に置かれる — このブロックは確認 + スナップショットされた memo の影響のみを保持する。形状: { confirmed: boolean, confirmed_by: string \| null, confirmed_at: datetime \| null, rejected: {reason_code, note} \| null, memo_influences: [{memo_node_id, text}] } |
|||||||
| parse.confirmed | boolean | デザイナーが確認するまで対話的に false |
|||||||
| parse.confirmed_by | string | ◯ | 確認したユーザー(user:cognito_sub)。確認まで null |
||||||
| parse.confirmed_at | datetime | ◯ | 確認タイムスタンプの唯一の置き場。確認まで null | ||||||
| parse.rejected | object | ◯ | 却下時に記録される { reason_code, note }(行ステータス 3)。キュレーションに供給される。reason_code: wrong_roles/wrong_memos/wrong_sections/other。却下されない限り null |
||||||
| parse.memo_influences | object[] | [{ memo_node_id, text }] — memo の text をスナップショットし、後のワイヤーフレーム再パースを生き延びられるようにする |
|||||||
| spec | object | DesignSpec — 組み立て済みで自己完結したスペック。root は 5 つのノード型(layout_frame/instance/compose/text/unmatched)からなる SpecNode ツリー。約 1MB を超えるスペックは S3 ポインタ(artifact_urls.spec)へ退避する。形状: { spec_version, parse_confirmed, style_bindings {<token>: string}, root: SpecNode } |
|||||||
| spec.spec_version | string | スペックスキーマのバージョン | |||||||
| spec.parse_confirmed | boolean | parse 確認のミラー | |||||||
| spec.style_bindings | object | { <token>: styleId } — token → Figma のスタイル/変数 id。project_figma_file.style_captures から派生 |
|||||||
| spec.root | object | SpecNode ツリーのルート。layout_frame { auto_layout, children }。instance { component_key, component_node_id, component_name, variant_props, text_slots, assets, confidence, flagged, source{kind:registry, component_key}, lineage_wf_node_ids }(platform_design_id は spec_nodes_flat ではなくここの instance ノードに置かれる)。compose { primitives + small components composed under rules; ALWAYS flagged; source{kind:composed}, lineage_wf_node_ids }。text { content, style_token, confidence, flagged, lineage_wf_node_ids }。unmatched { placeholder{role,text,bbox}, confidence, flagged:true, source{kind:none}, lineage_wf_node_ids } |
|||||||
| spec_nodes_flat | object[] | チューニング/フラグクエリ用の、コンテンツノード単位のフラット化ビュー。要素: { layer_path: string, case: string, component_key: string, wf_role: string, confidence: number, flagged: boolean, lineage_wf_node_ids: [string] }。case: instance/compose/text/unmatched。platform_design_id は含まない(それは spec.root の instance ノードに留まる)。spec が退避してもここはインラインに留まる |
|||||||
| selection | object | セクション単位の選択記録(決定論的フィルタ + セクション並列の LLM 選択。類似/検索なし)。形状: { sections, candidates_considered, composed_count, unmatched_count, asset_fills, truncated } |
|||||||
| selection.sections | number | セクション数 | |||||||
| selection.candidates_considered | number | 全セクションで検討された候補数 | |||||||
| selection.composed_count | number | compose ケースのノード数 |
|||||||
| selection.unmatched_count | number | unmatched ケースのプレースホルダー数 |
|||||||
| selection.asset_fills | number | 固定されたアセットセットから埋められた画像スロット数 | |||||||
| selection.truncated | boolean | 候補セットの切り詰めフラグ | |||||||
| screen_plan | object | ◯ | replay 用に保持する grounded whole-screen review と accepted/rejected proposal | ||||||
| spec_hash | string | ◯ | base spec の canonical SHA-256。plugin render review identity fence | ||||||
| assembly_state_hash | string | ◯ | artifact_urls.assembly に保存した pin 済み stitch/validation state の hash |
||||||
| layout_fidelity | object | ◯ | layout preservation metric: {frames_total, frames_preserved, wrap_total, wrap_preserved, units_collapsed, lost[]} |
||||||
| validator_report | object | ルールバリデータの結果(違反は安全な範囲で自動修正、さもなければフラグ付け)。status: ok/no_rules — no_rules は登録済みルールドキュメントがないことを意味し、バリデータは no-op となりすべてのノードが rules_unvalidated とフラグ付けされる。形状: { status, violations: [{rule, layer_path, action, detail}], unfixed_flagged } |
|||||||
| validator_report.status | string | ok/no_rules |
|||||||
| validator_report.violations | object[] | [{ rule, layer_path, action, detail }]。action: auto_fixed/flagged |
|||||||
| validator_report.unfixed_flagged | number | フラグ付けのまま残された(自動修正されなかった)違反の数 | |||||||
| confidence | object | 計算された確信度のみ(モデルの自己申告は禁止)。flag_count は完了 webhook を通じて wf2des 行に到達する。形状: { min, avg, flag_count, formula_version } |
|||||||
| confidence.min | number | ノード確信度の最小値 | |||||||
| confidence.avg | number | ノード確信度の平均値 | |||||||
| confidence.flag_count | number | フラグ付けされたノード数。マニフェストの row_effects.wf2des を通じて wf2des.flag_count にミラーされる |
|||||||
| confidence.formula_version | string | 確信度計算式のバージョン(例: cf@0.2) |
|||||||
| placement | object | plugin build record。形状: { design_area, placed_node_id, materialized_at, revision, spec_hash, review_id, materializer_report }。design_area は worker、残りは plugin が fingerprint fence 付きで書く |
|||||||
| placement.design_area | object | { x, y, w, h } — 解決された DESIGN 領域の矩形(ワーカー書き込み) |
|||||||
| placement.placed_node_id | string | ◯ | マテリアライズされたノード id(プラグイン書き込み) | ||||||
| placement.materialized_at | datetime | ◯ | マテリアライズタイムスタンプ(プラグイン書き込み) | ||||||
| placement.materializer_report | object[] | ◯ | [{ layer_path, event, detail }]。event: name_fallback / ordinal_fallback / build_error / font_fallback / prop_rejected / unmatched / preserved |
||||||
| feedback | object | ◯ | feedback の帳簿のみ — 進捗/品質追跡用の changed_nodes + diff。学習ループはない。status はバックエンドの feedback エンドポイントによって wf2des.feedback_status に記録される。形状: { status, changed_nodes: [string], diff_url, at, by } |
||||||
| feedback.status | string | fixed/adopted |
|||||||
| feedback.changed_nodes | string[] | 変更されたレイヤーパス | |||||||
| feedback.diff_url | string | feedback diff の S3 キー(≡ artifact_urls.feedback_diff) |
|||||||
| feedback.at | datetime | feedback タイムスタンプ | |||||||
| feedback.by | string | feedback の作成者(user:cognito_sub) |
|||||||
| llm_usage | object | この実行のコスト(プロバイダ自身の報告値): { calls, requests, input_tokens, output_tokens, cached_input_tokens, stages: [{stage, calls, requests, input_tokens, output_tokens, cached_input_tokens}] } — ステージ別、入力トークンの多い順。高コストな呼び出しを担う assemble フェーズが書き込む。parse のみのドキュメントは空のデフォルトを持つ |
|||||||
| timings | object | 実行ライフサイクルのタイムスタンプ + フェーズごとの所要時間。形状: { created_at, parse_done_at, assembled_at, <phase>_ms } — created_at は実行開始のアンカー(lineage.processed_at、終端書き込み時刻とは別物)。parse が created_at/parse_done_at を、assemble が assembled_at を刻む。<phase>_ms はフェーズごとのレイテンシ(例: snapshot_ms、parse_ms、selection_ms、assemble_ms、validate_ms) |
|||||||
| artifact_urls | object | immutable artifact S3 key。形状: { result, assembly, spec, parse, feedback_diff }。assembly は bounded rendered-output review 用の hash-pinned stitch input |
|||||||
| artifact_urls.assembly | string | ◯ | canonical hash が assembly_state_hash の pin 済み assembly-state artifact |
||||||
| artifact_urls.result | string | ◯ | クライアント向け結果アーティファクトのキー({org}/{proj}/wf2des/{id}-{ts}-result.json) |
||||||
| artifact_urls.spec | string | ◯ | スペック退避のキー。spec > ~1MB のときのみ存在する |
||||||
| artifact_urls.parse | string | ◯ | 不変の parse.json キー — ある実行が使用した権威ある parse |
||||||
| artifact_urls.feedback_diff | string | ◯ | feedback diff のキー | ||||||
| lineage | object | 全ドキュメント共通の lineage ブロック(ソース S3 キー/ハッシュ、プロセッサバージョン、処理時刻)。job_id = 生成元の実行 id: 生成実行では wf2des 行 id、内部実行ではジョブドキュメントの _id。形状: { source_url, source_hash, processor_version, index_schema_version, processed_at, job_id } |
|||||||
| lineage.source_url | string | ソーススナップショットの S3 キー | |||||||
| lineage.source_hash | string | ソースコンテンツハッシュ(≡ inputs.wireframe.source_hash) |
|||||||
| lineage.processor_version | string | 生成元のプロセッサバージョン(例: wf-parse@1.0) |
|||||||
| lineage.index_schema_version | number | このコレクションのドキュメントスキーマバージョン | |||||||
| lineage.processed_at | datetime | 終端書き込みタイムスタンプ(timings.created_at、実行開始のアンカーとは別物) |
|||||||
| lineage.job_id | string | 生成元の実行 id |
リレーション
_id= wf2des の PostgreSQLwf2des行 id — 行と 1:1(行が先に作成され、ドキュメントは実行が書き込む)。project_id→project.id。organization_id→ テナント所有者。inputs.components[].platform_design_id→ プラットフォームのdesign(type=component)行 id/design_component._id。inputs.design_rule.design_rule_id→design_ruleドキュメントのビジネスキー(content_hashと併せて)。inputs.wireframe.{figma_file_key, node_id}はwireframeキャッシュドキュメント(複合_id = {project_id}_{figma_file_key}_{node_id})を特定する。parse.confirmed_byとfeedback.byは Cognito sub(user:cognito_sub)であり、値で格納される。- DocumentDB 内ではリレーションは強制されない。論理リレーションであり、アプリケーションコードで検証する。
インデックス
- PRIMARY KEY (
_id) — ユニーク。_idそのものが wf2des 行 id(代理キーなし)。 - 書き込みフェンスは
(_id, attempt)の CAS — ゾンビ/取って代わられた attempt の書き込みは拒否される(DB のユニークインデックスではなく、ワーカーの条件付き書き込みで強制される)。 - セカンダリインデックスは定義しない。
spec_nodes_flatとconfidence.flag_countがフラグ/チューニングのクエリフィールドだが、実行ごとに 1 ドキュメントというモデル内でスキャンされ、ドキュメント横断でインデックスされない。
注記
- 生成ワーカーが 2 フェーズにまたがって書き込む: parse は
inputs+parse(+artifact_urls.parse、timings、lineage)を書き込み、assemble はspec/spec_nodes_flat/selection/validator_report/confidence/placement.design_area(+artifact_urls.result、スペック退避)を書き込む。すべての書き込みは(_id, attempt)でフェンスされる。 - プレビュー、memo レビュー、マテリアライズのため
wf2des-api経由で読み取られる。プレビュー/レビューの面はこのドキュメント + 不変のparse.jsonアーティファクトを読み取り、上書き可能なwireframeキャッシュドキュメントは決して読まない。 - ワーカーは決して PostgreSQL を書き込まない。
confidence.flag_count、完了ステータス、結果参照は、S3 の結果マニフェストから供給される ai-status webhook ハンドラ(完了時点の唯一の PG 書き込み者)を通じてのみwf2des行に到達する。 parse.confirmed_atは確認タイムスタンプの唯一の置き場である(timingsに重複させない)。parse.memo_influences[].textはスナップショットされ、後のワイヤーフレーム再パースを生き延びる。placement.placed_node_id/materialized_at/materializer_reportとfeedbackブロックは、生成ワーカーではなく後にプラグイン経路がwf2des-apiを通じて書き込む。- 完了した生成は決して再処理されない — 全置換は主たる人間イベントのデータを別の非決定論的スペックで上書きしてしまう。終端の行は最終であり、ワイヤーフレームを再実行すると新しい行が作成される。
- 約 1MB を超える
specはartifact_urls.specへ退避する。spec_nodes_flatと要約ブロックはインラインに留まる。これがこのドキュメントに適用される唯一のバイト上限である。