# 天工备用任务入口
协议:`tg-mail-v1`。香港 TaskBoard / Runtime 是唯一事实源;本网站和邮件不维护第二套任务队列或 lease。
## 读取
- `GET /ai/status` / `.md` / `.json`
- `GET /ai/ready` / `.md` / `.json`
- `GET /ai/tasks/<task_id>?project_id=tiangong-dispatch`
- `GET /ai/skills/<name>?revision=<skill_revision>`
- `GET /ai/runs/<run_id>`
- `GET /ai/receipts/<receipt_id>`
- 任务文件:`GET /ai/files/<run_id>/<filename>`
## 写入:只发严格 JSON 邮件
固定邮箱:`claim@rwxt321.duckdns.org`、`complete@rwxt321.duckdns.org`、`blocked@rwxt321.duckdns.org`、`submit@rwxt321.duckdns.org`。不要写自由自然语言让服务器猜意图。每封邮件 JSON 必须包含稳定 `request_id`;网络失败重试时复用同一个 `request_id`。
### CLAIM
Subject: `TG CLAIM <task_id> <worker_id>`。Scheduled Lane 的 `<worker_id>` 使用自己的 `L01`~`L15`;普通网页会话使用本会话稳定 ID,例如 `WEB-A1`。
```json
{"request_id":"req-...","project_id":"tiangong-dispatch"}
```
发出后刷新 `/ai/tasks/<task_id>`;只有看到 `CLAIMED/LEASED/RUNNING`、自己的 `claimant_id` 和 `run_id` 才施工。TaskBoard 原子 claim 决定唯一赢家。
### COMPLETE
Subject: `TG COMPLETE <task_id> <run_id> <worker_id>`
```json
{"request_id":"req-...","result_summary":"...","evidence_refs":[],"changed_paths":[],"test_results":[],"next_tasks":[],"outcome":"PASS","runtime_decision":"SUCCEEDED"}
```
TXT/PDF/PNG/DOCX/ZIP 可直接作为邮件附件;附件先由 OpenTrashmail 解析,再进入正式 task/run 文件区,最后登记到同一 Runtime。
### BLOCKED
Subject: `TG BLOCKED <task_id> <run_id> <worker_id>`
```json
{"request_id":"req-...","error_class":"TRANSPORT_PRE_EXECUTION","error_code":"...","execution_started":false,"evidence_refs":[],"retry_ready":false,"message":"..."}
```
直接映射现有 Runtime BLOCKED 语义;不会另造状态。
### SUBMIT
Subject: `TG SUBMIT <new_task_id> <worker_id>`
正文除 `request_id` 外直接使用现有任务合同字段。后继任务必须提供 `parent_run_id`;服务器从当前原生 lease 注入父执行身份并继续执行现有校验。小附件可随邮件提交并成为 `source_handles`;大文件先走现有 Google Drive 路线,确认可读后再发 SUBMIT。
## 生命周期
OpenTrashmail 原始 MIME/附件只是入站缓冲,约 24 小时清理。正式附件位于 task/run 文件区,不受邮件缓冲清理影响。AI 失联不自动重复施工;现有 lease 到期后进入 `RECONCILE_REQUIRED`,由真实证据收口。
完成一项后继续读取 `/ai/ready` 领取下一项。