feat(ack): refine intake and validation workflow

This commit is contained in:
2026-08-04 10:52:37 +08:00
parent b9c82b5520
commit 5018a1801d
32 changed files with 1602 additions and 302 deletions
+1 -1
View File
@@ -216,7 +216,7 @@
"properties": {
"stopAt": {
"type": "string",
"enum": ["verified", "review_ready", "released"]
"enum": ["verified", "validation_ready", "review_ready", "released"]
},
"steps": {
"type": "array",
+5 -4
View File
@@ -51,8 +51,8 @@ receipt 全部以 `docs/ack/tasks.yaml` 的 `project.orchestration` 与顶层
项目如改用 Cursor,应修改结构化 profile、allowlist 和 defaults,再运行任务板
校验;不能在这里粘贴 `orca --command`、Agent CLI 参数或自由 shell。
每次自动派发必须先审阅 launcher plan,再把其中的 `launchFingerprint` 作为
`--expected-launch-fingerprint` 启动 fresh worker。v0.10 的 `receiptHash` 只作
审计 checksum不授权自动复用旧终端。
`--expected-launch-fingerprint` 启动 fresh worker。`receiptHash` 只作审计 checksum
不授权自动复用旧终端;只有同轮空闲、身份匹配且历史消息可信清理后才可复用
## 路径权限(项目覆盖层,必须填实际路径)
@@ -108,7 +108,8 @@ Skill 的 `scripts/run_verification.py` 执行,不直接拼接 path/args。检
等第二配置面。
- v0.10 自动 launcher 只支持 `read-only``workspace-write`。full-access、
bypass、YOLO/force 与关闭 sandbox 均 fail closed;需要可信平台审批通道后再开放。
- v0.10 不自动复用持久化 receipt 指向的旧终端;每次自动派发都重新 plan/launch。
- 复用仅限同轮空闲、身份匹配且历史消息可信清理的 worker;否则重新 plan/launch。
- 整轮结束后回收只属于 verified 任务的终端;blocked/failed/leftover 终端保留且不设 TTL。
- `worker_done` 与复测报告都不等于完成。必须 Test 独立复测 + Coordinator 终检后才能 `verified`
- 只有 Coordinator 写 `tasks.yaml``knowledge.yaml`Developer 与 Test 都只读,
通过消息回报。
@@ -119,7 +120,7 @@ Skill 的 `scripts/run_verification.py` 执行,不直接拼接 path/args。检
- ACK 不自动修改 `AGENTS.md``CLAUDE.md` 或其它 Agent 指令文件。
- `delivery.yaml` 默认关闭,只描述能力,不自动授权提交、推送、发布或部署;交付仅在
任务 `verified` 且本次 profile/目标/停止点得到确认后运行。
- 默认交付 profile 最多到 `review_ready`stable 发布或 production 部署必须有
- 默认交付 profile 最多到 `validation_ready``review_ready`stable 发布或 production 部署必须有
approval 步骤并再次获得明确批准。配置变更只影响下一次 run。
- 每个任务最多派发 3 轮,仍不过标记 `leftover` 并继续下一个。
- 不提交、推送、发布或部署,除非用户确认的 ACK 任务或 delivery profile 明确包含。
+107 -4
View File
@@ -181,7 +181,7 @@
"provider": { "const": "feishu-base" },
"workflow": {
"type": "string",
"enum": ["read-only-v1", "reviewed-writeback-v1"]
"enum": ["read-only-v1", "reviewed-writeback-v1", "clarified-writeback-v1"]
},
"profile": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$" },
"baseToken": { "type": "string", "minLength": 1, "pattern": "^\\S+$" },
@@ -189,7 +189,7 @@
"viewId": { "type": "string", "minLength": 1, "pattern": "^\\S+$" },
"fields": {
"type": "object",
"required": ["title", "actual", "expected", "stepsToReproduce", "acceptance", "priority", "attachments", "updatedAt"],
"required": [],
"additionalProperties": false,
"properties": {
"title": { "type": "string", "minLength": 1, "pattern": "^\\S+$" },
@@ -201,10 +201,28 @@
"priority": { "type": "string", "minLength": 1, "pattern": "^\\S+$" },
"attachments": { "type": "string", "minLength": 1, "pattern": "^\\S+$" },
"updatedAt": { "type": "string", "minLength": 1, "pattern": "^\\S+$" }
,"details": { "type": "string", "minLength": 1, "pattern": "^\\S+$" }
,"problemStatement": { "type": "string", "minLength": 1, "pattern": "^\\S+$" }
,"expectedOutcome": { "type": "string", "minLength": 1, "pattern": "^\\S+$" }
,"intakeStatus": { "type": "string", "minLength": 1, "pattern": "^\\S+$" }
,"ackTaskId": { "type": "string", "minLength": 1, "pattern": "^\\S+$" }
}
}
},
"allOf": [
{
"if": {
"not": {
"properties": { "workflow": { "const": "clarified-writeback-v1" } },
"required": ["workflow"]
}
},
"then": {
"properties": {
"fields": { "required": ["title", "actual", "expected", "stepsToReproduce", "acceptance", "attachments", "updatedAt"] }
}
}
},
{
"if": {
"properties": { "workflow": { "const": "reviewed-writeback-v1" } },
@@ -212,7 +230,18 @@
},
"then": {
"properties": {
"fields": { "required": ["fixLogic"] }
"fields": { "required": ["fixLogic", "priority"] }
}
}
}
,{
"if": {
"properties": { "workflow": { "const": "clarified-writeback-v1" } },
"required": ["workflow"]
},
"then": {
"properties": {
"fields": { "required": ["title", "details", "problemStatement", "expectedOutcome", "acceptance", "intakeStatus", "ackTaskId", "attachments", "updatedAt"] }
}
}
}
@@ -226,7 +255,7 @@
"kind": { "const": "feishu-base" },
"workflow": {
"type": "string",
"enum": ["read-only-v1", "reviewed-writeback-v1"]
"enum": ["read-only-v1", "reviewed-writeback-v1", "clarified-writeback-v1"]
},
"ref": {
"type": "string",
@@ -250,6 +279,15 @@
"required": ["approvedRevision", "approvedPayloadHash"]
}
}
,{
"if": {
"properties": { "workflow": { "const": "clarified-writeback-v1" } },
"required": ["workflow"]
},
"then": {
"required": ["approvedRevision", "approvedPayloadHash"]
}
}
]
},
"profileId": {
@@ -614,6 +652,13 @@
"launchFingerprint": {
"$ref": "#/definitions/sha256"
},
"projectRoot": {
"type": "string",
"pattern": "^/"
},
"boardHash": {
"$ref": "#/definitions/sha256"
},
"slot": {
"type": "integer",
"minimum": 1,
@@ -730,6 +775,57 @@
"evidence": { "type": "string" }
}
},
"environmentIncident": {
"type": "object",
"required": [
"id",
"role",
"phase",
"status",
"summary",
"evidence",
"impact",
"recoveryAction",
"userAction",
"reportedAt"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*-ENV-[1-9][0-9]*$"
},
"attemptId": { "type": ["string", "null"] },
"role": {
"type": "string",
"enum": ["coordinator", "developer", "test"]
},
"phase": {
"type": "string",
"enum": [
"launch",
"orchestration",
"service",
"test_data",
"browser",
"tooling",
"permissions",
"other"
]
},
"status": {
"type": "string",
"enum": ["open", "resolved"]
},
"summary": { "type": "string", "minLength": 1, "pattern": "\\S" },
"evidence": { "type": "string", "minLength": 1, "pattern": "\\S" },
"impact": { "type": "string", "minLength": 1, "pattern": "\\S" },
"recoveryAction": { "type": "string", "minLength": 1, "pattern": "\\S" },
"userAction": { "type": "string", "minLength": 1, "pattern": "\\S" },
"reportedAt": { "type": "string", "minLength": 1, "pattern": "\\S" },
"resolvedAt": { "type": ["string", "null"] }
}
},
"knowledgeRef": {
"type": "string",
"pattern": "^K-[A-Z0-9][A-Z0-9-]*@[1-9][0-9]*$"
@@ -906,6 +1002,7 @@
"running",
"blocked",
"failed",
"validation_ready",
"review_ready",
"released",
"skipped"
@@ -944,6 +1041,7 @@
"running",
"blocked",
"failed",
"validation_ready",
"review_ready",
"released"
]
@@ -965,6 +1063,7 @@
"enum": [
"blocked",
"failed",
"validation_ready",
"review_ready",
"released",
"skipped"
@@ -1062,6 +1161,10 @@
"rounds": {
"type": "array",
"items": { "$ref": "#/definitions/round" }
},
"environmentIncidents": {
"type": "array",
"items": { "$ref": "#/definitions/environmentIncident" }
}
}
},
+8 -6
View File
@@ -12,19 +12,19 @@ project:
# 可选:飞书 Base Bug 收件箱。只保存 profile 名和资源 ID,绝不保存 App Secret。
# bugIntake:
# provider: "feishu-base"
# workflow: "reviewed-writeback-v1"
# workflow: "clarified-writeback-v1"
# profile: "project-feishu"
# baseToken: "<base_token>"
# tableId: "<table_id>"
# viewId: "<ack_ready_view_id>"
# fields:
# title: "<field_id>"
# actual: "<field_id>"
# expected: "<field_id>"
# stepsToReproduce: "<field_id>"
# fixLogic: "<field_id>" # 启用飞书审核前协作时必填
# details: "<field_id>"
# problemStatement: "<field_id>"
# expectedOutcome: "<field_id>"
# acceptance: "<field_id>"
# priority: "<field_id>"
# intakeStatus: "<field_id>"
# ackTaskId: "<field_id>"
# attachments: "<field_id>"
# updatedAt: "<field_id>"
orchestration:
@@ -170,6 +170,8 @@ tasks:
taskId: null
dispatchId: null
rounds: []
# 环境失败不占产品复验轮次;按 BUG-001-ENV-1... 连续编号,并写清 userAction。
environmentIncidents: []
resolution:
fixedBy: null