本書は Task / WorkerJob / WorkerResult / StateTransitionEvent を扱うための最小 API 契約案である。実装順序は、Task 作成、Job ディスパッチ、Result 反映、状態遷移の監査、Integrate / Publish 実行の順を想定する。
- API は Control Plane 正本のみが Task の
stateを更新できる。 - ワーカーは
WorkerJobを pull または push 方式で受け取ってもよいが、結果反映はWorkerResult契約に正規化する。 - 状態遷移は副作用ではなくイベントとして必ず
StateTransitionEventを記録する。 IntegrateとPublishはワーカー API ではなく Control Plane API として分離する。publishedを終端状態とし、completed状態は持たない。- Task / external ref / context bundle / typed_ref の canonical contract は
agent-taskstateと整合させる。 - tracker 連携は
tracker-bridge-materialsの helper layer を通し、docs / contracts 解決はmemx-resolverを通す。
| Method | Path | 用途 |
|---|---|---|
POST |
/v1/tasks |
Task 作成 |
GET |
/v1/tasks/{task_id} |
Task 取得 |
POST |
/v1/tasks/{task_id}/dispatch |
次工程 Job を生成 |
POST |
/v1/tasks/{task_id}/results |
WorkerResult 反映 |
POST |
/v1/tasks/{task_id}/transitions |
手動またはポリシー起因の遷移記録 |
POST |
/v1/tasks/{task_id}/integrate |
Integrate 開始 |
POST |
/v1/tasks/{task_id}/publish |
Publish 開始 |
POST |
/v1/jobs/{job_id}/heartbeat |
実行中 worker job の heartbeat 更新 |
POST |
/v1/tasks/{task_id}/cancel |
Task 中止 |
GET |
/v1/tasks/{task_id}/events |
状態遷移イベント一覧 |
GET |
/v1/jobs/{job_id} |
WorkerJob または進行状況取得 |
POST |
/v1/tasks/{task_id}/docs/resolve |
memx-resolver で読むべき文書を解決 |
POST |
/v1/tasks/{task_id}/docs/ack |
memx-resolver へ読了記録を残す |
POST |
/v1/tasks/{task_id}/tracker/link |
tracker-bridge-materials で tracker entity を紐付ける |
新規 Task を登録する。初期状態は queued。
Request body:
titleobjectivetyped_refdescriptionoptionalrepo_refrisk_leveloptionallabelsoptionalpublish_planoptionalexternal_refsoptional
Response:
201 Created- body は task.schema.json 準拠
Task の現在状態に応じて次の WorkerJob を発行する。通常は queued -> planning, planned -> developing, dev_completed -> accepting のときに呼ばれる。
Request body:
target_stage:plan/dev/acceptanceworker_selectionoptionaloverride_risk_leveloptionalexpected_versionoptional
補足:
dispatchAPI 自体はskillsのような専用入力を持たない。- Control Plane は
InstructionEnvelopeV2をWorkerJob.instruction_envelopeに保持してワーカーへ渡す。WorkerJob.input_promptとcontextは後方互換 fallback として維持する。 metadata.instruction_envelope_versionが2.0の job でinstruction_envelope本体が欠落している場合、worker 実行前に拒否する。SKILL.mdパスや skill 名を直接解釈して worker 側で展開する契約にはなっていない。execution_backendはdeployment policyが選んだphysical backendであり、公開worker_typeを変更しないoptional fieldである。executor_instance_idはdispatchを実施したcontrol plane instanceを示すoptional fieldである。再起動後の旧instance jobはorphanとしてblockedへ回収され、無条件再送しない。lmstudiobackendはOpenAI互換/v1だけを利用し、LM Link利用時もremote device識別子を契約へ含めない。- low-risk
plan/devのみLM Studioへrouteでき、既定の外部fallbackはplanのみである。
Response:
202 Accepted- body は worker-job.schema.json 準拠
ワーカー完了結果を反映する。Control Plane は結果を検証し、必要なら状態遷移イベントを自動生成する。
有効な WorkerResult では、状態遷移前に RunSystemPacket を生成し、run.systemPacketPrepared audit event として保存する。この packet は agent-protocols / agent-taskstate / agent-gatefield / agent-state-gate 連携用の advisory 入力証跡であり、既定では状態遷移をブロックしない。
Request body:
Response:
200 OK- body:
taskemitted_eventsnext_action:dispatch_dev/dispatch_acceptance/integrate/publish/wait_manual/none
補足:
WorkerResultにはfailure_class,failure_code、必要に応じてretry_countを含めてよい。- acceptance worker が
acceptを返しても Task はacceptingに留まり、next_action = wait_manualを返す。
手動 Acceptance の唯一の通常完了経路。完了済み manual checklist、worker または人手 override の accept verdict、最低1件の log artifact、fresh docs を検証し、すべて満たす場合だけ accepting -> accepted を実行する。
既存の CompleteAcceptanceRequest wire shapeは維持する。
人手承認、手動 Acceptance、ポリシー解除など、ワーカー結果では表せない遷移を明示記録する。許可される from_state -> to_state は state-machine.md の「許可遷移一覧」に一致しなければならない。
Request body:
Response:
200 OK- body は記録済みイベント
accepted Task に対して integration branch 作成、CI 確認、main 更新を行う。
Request body:
expected_state:acceptedbase_shabranch_reforpatch_ref
Response:
202 Accepted- body:
task_idstate:integratingintegration_branchrun_idoptional
integrated Task に対して Publish を開始する。No-op / Dry-run / Apply を共通エンドポイントで扱い、最終終端は published とする。
Request body:
mode:no_op/dry_run/applyidempotency_keyapproval_tokenoptional
Response:
202 Accepted- body:
task_idstate:publishingorpublish_pending_approvalpublish_run_id
実行中の worker-dispatched job に対して heartbeat を反映する。integrate / publish の進行監視は Control Plane 内部イベントで扱ってよい。
Request body:
worker_idstageprogressoptionalobserved_at
Response:
200 OK- body:
job_idlease_expires_atnext_heartbeat_due_at
memx-resolver を使って、feature / task / topic から読むべき文書を解決する。
Request body:
featureoptionaltopicoptionaltask_seedoptional
Response:
200 OK- body:
typed_refdoc_refschunk_refscontract_refsstale_status
memx-resolver へ読了記録を残す。
Request body:
doc_idversiontask_id
Response:
200 OK- body:
ack_ref
tracker-bridge-materials を使って tracker entity と internal task を紐付ける。
Request body:
typed_refconnection_refentity_ref
Response:
200 OK- body:
typed_refexternal_refssync_event_ref
-
GET /v1/improvement/observations?since=<ISO>&until=<ISO>&cursor=<cursor>&limit=<n>は、canonical AuditとRetrospectiveから再構築したself-improvement/v1を返す。 -
POST /v1/tasks/{task_id}/evidence/{evidence_id}/ackはreviewed_by必須、purpose任意で、evidence.acknowledgedAuditを記録する。 -
GET、Task参照、Evidence参照はackを発生させない。
-
旧
run.systemGateEvaluatedの欠損fieldはunknownへ正規化する。 -
exportからprompt、raw output、token、Authorization、artifact本文を除外する。
-
観測projectionは再構築可能であり、正本は365日保持のAudit eventである。
-
POST /v1/tasksではobjectiveとtyped_refを必須とする。 -
typed_refは 4 セグメント canonical form<domain>:<entity_type>:<provider>:<entity_id>に一致しなければならない。 -
POST /v1/tasks/{task_id}/resultsではjob_idが Task のactive_job_idと一致しない場合409 Conflict。 -
POST /v1/tasks/{task_id}/dispatchはexpected_versionが現在の Task version と一致しない場合409 Conflict。 -
POST /v1/tasks/{task_id}/integrateはstate != acceptedの場合409 Conflict。 -
POST /v1/tasks/{task_id}/publishはstate != integratedの場合409 Conflict。 -
POST /v1/jobs/{job_id}/heartbeatは worker-dispatched stages の active job にのみ受理され、lease 期限切れ後は409 Conflictまたは410 Goneを返してよい。 -
highリスク Task がacceptedへ遷移するには、WorkerResult.test_resultsに少なくとも 1 件suite = regressionかつstatus = passedが必要。 -
Plan 成功の
WorkerResultは、verdictまたは 1 件以上のartifactsを持つこと。 -
applyPublish はpublish_plan.approval_required = trueかつ承認未完了なら202でpublish_pending_approvalを返す。 -
publishは全モードでidempotency_key必須とする。特にmode = applyでは二重副作用防止のため必須要件として扱う。 -
integrate/publish開始時に lock が取得できない場合は409 Conflictまたは202+blocked相当の応答を返してよい。 -
POST /v1/tasks/{task_id}/transitionsは、許可遷移一覧外の遷移を409 Conflictで拒否する。 -
stale docs が未解消なら
accepting -> acceptedを拒否できる。
以下を API 契約上の許可遷移とする。
queued -> queuedqueued -> planningqueued -> cancelledqueued -> failedplanning -> plannedplanning -> rework_requiredplanning -> blockedplanning -> cancelledplanning -> failedplanned -> developingplanned -> cancelledplanned -> faileddeveloping -> dev_completeddeveloping -> rework_requireddeveloping -> blockeddeveloping -> cancelleddeveloping -> faileddev_completed -> acceptingdev_completed -> cancelleddev_completed -> failedaccepting -> acceptedaccepting -> rework_requiredaccepting -> blockedaccepting -> cancelledaccepting -> failedrework_required -> developingrework_required -> cancelledrework_required -> failedaccepted -> integratingaccepted -> cancelledaccepted -> failedintegrating -> integratedintegrating -> blockedintegrating -> cancelledintegrating -> failedintegrated -> publish_pending_approvalintegrated -> publishingintegrated -> cancelledintegrated -> failedpublish_pending_approval -> publishingpublish_pending_approval -> cancelledpublish_pending_approval -> failedpublishing -> publishedpublishing -> blockedpublishing -> cancelledpublishing -> failedblocked -> planningblocked -> developingblocked -> acceptingblocked -> integratingblocked -> publishingblocked -> cancelledblocked -> failed
TaskWorkerJobWorkerResultStateTransitionEventDispatchRequestIntegrateRequestPublishRequestResolveDocsRequestTrackerLinkRequestErrorResponse
POST /v1/tasksPOST /v1/tasks/{task_id}/docs/resolvePOST /v1/tasks/{task_id}/dispatchPOST /v1/tasks/{task_id}/resultsGET /v1/tasks/{task_id}/GET /v1/tasks/{task_id}/eventsPOST /v1/tasks/{task_id}/tracker/linkPOST /v1/tasks/{task_id}/integratePOST /v1/tasks/{task_id}/publish
この順で進めると、resolver / state / tracker の基盤を先に繋いでから Integrate / Publish を足せる。