コンテンツにスキップ

AI Status Webhook

POST /api/v1/webhooks/ai-status は Guinness worker が X-API-Key(timing-safe comparison で検証)を付けて呼びます。Worker は PostgreSQL に write せず、backend が callback を検証して lifecycle transition を適用します。

実装済み type union:

  • design-import、code-import、des2code: standard camelCase envelope。
  • wf2des: WF2Des worker envelope。
  • page_import: 独立した Page Import terminal envelope。
  • code2des: 独立した Code2Des terminal envelope。

page-import と code2wf は discriminator として受け付けません。

Page Import

{
  "type": "page_import",
  "job_id": "page-import-id",
  "attempt": 1,
  "nonce": "enqueue-nonce",
  "status": "succeeded",
  "result_manifest_url": "s3://bucket/1/7/page-import/page-import-id/manifest.json",
  "manifest_schema_version": 1
}

status は succeeded または failed で、failure は error.message を含められます。Backend は row の nonce、manifest の bucket/tenant prefix、job ID、attempt、nonce、row_effects.page_import を検証して processing row を completed/failed に compare-and-set します。

Success row effect は result_url、capture_hash、screenshot_url を供給します。Page Import completion は Code2Des を作成・失敗・dispatch しません。Duplicate terminal callback は idempotent です。

Code2Des

{
  "type": "code2des",
  "job_id": "code2des-id",
  "attempt": 1,
  "nonce": "enqueue-nonce",
  "status": "succeeded",
  "result_manifest_url": "s3://bucket/1/7/code2des/code2des-id/manifest.json",
  "manifest_schema_version": 1
}

同じ identity/tenant-prefix guard を適用します。Success の row_effects.code2des は result_url と warning_count、failure は failure result pointer を供給し、callback は error.message を含められます。

WF2Des

wf2des generation worker は DesignSpec と result manifest を DocumentDB/S3 に書いた後、この Webhook で run の進捗を報告する。この handler は wf2des PostgreSQL row への 唯一の completion-time writer である。row を parse checkpoint へ進め、terminal status へ flip する。この Webhook を呼ぶのは 2 つの generation phase(parse, assemble)だけであり、内部 wf2des run(wf_parse, rule_process, component_sweep, component_capture)は決して呼ばない。

WF2Des は job_id(wf2des row id)、positive attempt、nonce、parse_started/parse_done/assemble_started/succeeded/failed status を使用します。Terminal state では result_manifest_url が必須で、phase signal には付きません。backend は manifest の guarded row_effects.wf2des transition を適用します。

status wf2des row effect
parse_started phase を parse にする
parse_done phase を awaiting_confirm にする。row は status '0' processing のまま。auto-confirm path では送られない
assemble_started auto-confirm path で phase を assemble にする。interactive confirm 後は no-op
succeeded S3 manifest を読み、row_effects.wf2des の result_url + flag_count とともに status を '1' completed へ flip し、phase を clear する
failed status を '2' failed へ flip し、error と failure result pointer を記録し、phase を clear する

すべての transition は attempt-guarded で row の現在 state に gate されるため、再配送または superseded な callback は no-op になります。wf2des row が存在しない場合は 404 を返して SQS に再配送させ、manifest が読めない/不正な場合は 500 を返します。

Standard envelope

design-import、code-import、des2code は recordId、projectId、organizationId、status: success|failed、optional result、optional error.message、Des2Code の optional artifact metadata を使います。Backend は type ごとの既存処理前に tenant scope を検証します。

Response

{
  "message": "Status updated successfully",
  "type": "page_import",
  "recordId": "page-import-id",
  "status": "success"
}
名前 型 説明
message string 人間が読める status message
type string request type の echo
recordId string request record ID の echo(wf2des などの job_id envelope では job_id を echo する)
status string request status を success または failed として echo

Acknowledgement は worker の succeeded(および WF2Des の phase signal)を success に normalize します。

エラーハンドリング

説明 ステータスコード ステータス名
API key が不正または missing 401 Unauthorized
request body が不正 422 Unprocessable Entity
organization/project/record scope が見つからない 404 Not Found
内部サーバーエラー 500 Internal Server Error

worker は non-2xx webhook response を retryable processing failure として扱い、SQS が message を再配送できるようにする。