Merge branch 'main' into rename

Keep pouch naming and .pouch/ack project state, and bring in ACK
regression mode, deployer test-environment binding, and manage-release
updates from main.
This commit is contained in:
2026-08-25 15:23:48 +08:00
40 changed files with 1968 additions and 224 deletions
+12 -2
View File
@@ -70,8 +70,18 @@
"additionalProperties": false,
"properties": {
"testEnvironment": {
"type": ["string", "null"],
"pattern": "^[a-z][a-z0-9-]{0,63}$"
"oneOf": [
{ "type": "null" },
{
"type": "object",
"additionalProperties": false,
"required": ["via", "env"],
"properties": {
"via": { "const": "deployer" },
"env": { "$ref": "#/definitions/id" }
}
}
]
},
"release": {
"type": ["string", "null"],
+2 -1
View File
@@ -7,7 +7,8 @@ project:
enabled: false
defaultProfile: null
# 测试环境部署和版本发布都写在本文件。null 表示用户尚未说明该操作
# 测试环境由 ACK 内部调用 deployer;发版仍指向本文件的 profile
# null 表示用户尚未说明该操作。
intents:
testEnvironment: null
release: null
+14 -9
View File
@@ -8,8 +8,8 @@
> 若希望 Agent 自动加载,可由项目维护者自行在 `AGENTS.md` 中引用本文件;ACK
> 不会自动修改 `AGENTS.md`、`CLAUDE.md` 或其它 Agent 指令文件。
> 无论叫什么,都在 `tasks.yaml` 的 `project.overlayFile` 记录实际路径。
> `.pouch/ack/` 只保存本项目的 `project.md`、`tasks.yaml`、`knowledge.yaml`默认关闭的
> `delivery.yaml`
> `.pouch/ack/` 只保存本项目的 `project.md`、`tasks.yaml`、`knowledge.yaml`默认关闭的
> `delivery.yaml` 与空的 `regression.yaml`
> 不复制或链接 Skill。
## 项目概览
@@ -21,6 +21,7 @@
- 任务板:`.pouch/ack/tasks.yaml`
- 项目知识:`.pouch/ack/knowledge.yaml`
- 交付契约:`.pouch/ack/delivery.yaml`(默认关闭)
- 回归目录:`.pouch/ack/regression.yaml`
- 覆盖层文件:`<overlay_file_path>`(默认 `.pouch/ack/project.md`
## 通用规范(由 ACK Skill 按需读取)
@@ -33,6 +34,7 @@
- 派发 prompt 模板:`references/prompt-templates.md`
- Orca 编排命令(可选):`references/orca-adapter.md`
- 验证后交付与配置维护(可选):`references/delivery.md`
- 回归目录与运行(可选):`references/regression.md`
## Worker 路由
@@ -67,6 +69,7 @@ receipt 全部以 `.pouch/ack/tasks.yaml` 的 `project.orchestration` 与顶层
| `<local_config_paths>` | Read-only | Read-only | Read-only | 本地私有配置 |
| `tasks.yaml` | R/W | Read-only | Read-only | 只有 Coordinator 写 |
| `knowledge.yaml` | R/W | Read-only | Read-only | 只有 Coordinator 写;Developer/Test 通过回报提名或验证 |
| `regression.yaml` | R/W | Read-only | Read-only | 只有 Coordinator 写;Test 通过 regressionCandidates 提名 |
| `delivery.yaml` | 仅显式维护时 R/W | Read-only | Read-only | 项目交付能力,不是执行授权 |
## 命令(项目覆盖层)
@@ -79,7 +82,7 @@ Developer 白盒验证:
<local_run_command>
```
Test 黑盒复测(服务启动以 `delivery.yaml` `intents.testEnvironment` 为准):
Test 黑盒复测(服务启动以 deployer 绑定`intents.testEnvironment` 为准):
```bash
<preflight_command>
@@ -96,9 +99,10 @@ Skill 的 `scripts/run_verification.py` 执行,不直接拼接 path/args。检
`ACK_PROJECT_ROOT_DISPLAY`
项目状态校验由 `/ack` 使用 Skill 自带的 `scripts/validate_tasks.py`
`scripts/validate_knowledge.py``scripts/validate_delivery.py` 执行。
`scripts/validate_knowledge.py``scripts/validate_delivery.py`
`scripts/validate_regression.py` 执行。
构建、测试环境部署和版本发布的机器入口以 `delivery.yaml``intents` 为准;
本文件不维护第二套交付命令。
测试环境由 ACK 内部调用 deployer。本文件不维护第二套交付命令。
## 硬规则(其余见 references/
@@ -112,16 +116,17 @@ Skill 的 `scripts/run_verification.py` 执行,不直接拼接 path/args。检
- 复用仅限同轮空闲、身份匹配且历史消息可信清理的 worker;否则重新 plan/launch。
- 整轮结束后回收只属于 verified 任务的终端;blocked/failed/leftover 终端保留且不设 TTL。
- `worker_done` 与复测报告都不等于完成。必须 Test 独立复测 + Coordinator 终检后才能 `verified`
- 只有 Coordinator 写 `tasks.yaml``knowledge.yaml`Developer 与 Test 都只读,
通过消息回报。
- 只有 Coordinator 写 `tasks.yaml``knowledge.yaml``regression.yaml`
Developer 与 Test 都只读,通过消息回报。
- Coordinator 只派发按 scope 命中并显式写入 `knowledgeRefs``active` 知识;
`candidate` 不派发,知识库不全量注入。
- Developer 回报 `knowledgeApplied``knowledgeCandidates`Test 回报
`knowledgeChecks`。关键约束应下沉为测试、lint、CI 或正式规范。
- ACK 不自动修改 `AGENTS.md``CLAUDE.md` 或其它 Agent 指令文件。
- `delivery.yaml` 默认关闭,只描述能力,不自动授权提交、推送、发布或部署。测试环境
发版写在这份契约的 `intents`;用户明确要求重新部署测试环境或发布版本时
才执行对应 intent。常规交付仍在任务 `verified` 且本次 profile 得到确认后运行。
绑定 deployer发版写在 `intents.release`;用户明确要求重新部署测试环境或发布
版本时才执行对应 intent。常规交付仍在任务 `verified` 且本次 profile 得到确认后
运行。回归目录在 `.pouch/ack/regression.yaml`,由用户明确要求「回归」时运行。
- 默认交付 profile 最多到 `validation_ready``review_ready`stable 发布或 production 部署必须有
approval 步骤并再次获得明确批准。配置变更只影响下一次 run。
- 每个任务最多派发 3 轮,仍不过标记 `leftover` 并继续下一个。
@@ -0,0 +1,92 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://git.yumee.top/laily/skills/skills/ack/templates/regression.schema.json",
"title": "ACK project regression catalog",
"description": ".pouch/ack/regression.yaml 的权威结构。用例是给 Test worker 的可观测信号说明书,不是可执行 DSL。",
"type": "object",
"required": ["version", "updatedAt", "project", "cases"],
"additionalProperties": false,
"properties": {
"version": { "type": "integer", "const": 1 },
"updatedAt": { "type": "string" },
"project": {
"type": "object",
"required": ["name"],
"additionalProperties": false,
"properties": {
"name": { "type": "string", "minLength": 1, "pattern": "\\S" }
}
},
"cases": {
"type": "array",
"items": { "$ref": "#/definitions/case" }
}
},
"definitions": {
"caseId": {
"type": "string",
"pattern": "^REG-[A-Za-z0-9][A-Za-z0-9-]*$"
},
"stringList": {
"type": "array",
"minItems": 1,
"items": { "type": "string", "minLength": 1, "pattern": "\\S" }
},
"relativePath": {
"type": "string",
"minLength": 1,
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[A-Za-z0-9._/-]+$"
},
"expectedSignal": {
"type": "object",
"required": ["kind", "value"],
"additionalProperties": false,
"properties": {
"kind": {
"type": "string",
"enum": ["visible-text", "api-status", "api-field", "url", "interaction"]
},
"value": { "type": "string", "minLength": 1, "pattern": "\\S" }
}
},
"case": {
"type": "object",
"required": [
"id",
"title",
"status",
"source",
"suite",
"surface",
"setup",
"steps",
"expected"
],
"additionalProperties": false,
"properties": {
"id": { "$ref": "#/definitions/caseId" },
"title": { "type": "string", "minLength": 1, "pattern": "\\S" },
"status": { "type": "string", "enum": ["active", "retired"] },
"source": {
"type": "object",
"required": ["taskId", "kind"],
"additionalProperties": false,
"properties": {
"taskId": { "type": "string", "minLength": 1, "pattern": "\\S" },
"kind": { "type": "string", "enum": ["feature", "bug"] }
}
},
"suite": { "type": "string", "enum": ["smoke", "full"] },
"surface": { "type": "string", "enum": ["browser", "api"] },
"setup": { "type": "string", "minLength": 1, "pattern": "\\S" },
"steps": { "$ref": "#/definitions/stringList" },
"expected": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/expectedSignal" }
},
"automationRef": { "$ref": "#/definitions/relativePath" }
}
}
}
}
@@ -0,0 +1,7 @@
# 复制为 .pouch/ack/regression.yaml。只有 Coordinator 写入;Test 通过回报提名。
# 结构见 templates/regression.schema.json。
version: 1
updatedAt: "<YYYY-MM-DDTHH:mm:ss+TZ>"
project:
name: "<project_name>"
cases: []
+176
View File
@@ -69,6 +69,11 @@
"const": ".pouch/ack/delivery.yaml",
"description": "可选项目交付契约的唯一权威路径"
},
"regressionFile": {
"type": "string",
"const": ".pouch/ack/regression.yaml",
"description": "可选项目回归目录的唯一权威路径"
},
"bugIntake": {
"$ref": "#/definitions/feishuBugIntake"
},
@@ -122,6 +127,12 @@
"$ref": "#/definitions/deliveryRun"
}
},
"regressionRuns": {
"type": "array",
"items": {
"$ref": "#/definitions/regressionRun"
}
},
"tasks": {
"type": "array",
"items": {
@@ -243,6 +254,32 @@
"deliveryRuns": {}
}
}
},
{
"if": {
"properties": {
"project": {
"type": "object",
"required": [
"regressionFile"
],
"properties": {
"regressionFile": {}
}
}
},
"required": [
"project"
]
},
"then": {
"required": [
"regressionRuns"
],
"properties": {
"regressionRuns": {}
}
}
}
],
"definitions": {
@@ -1750,6 +1787,20 @@
"$ref": "#/definitions/knowledgeCheck"
}
},
"regressionRefs": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^REG-[A-Za-z0-9][A-Za-z0-9-]*$"
}
},
"regressionCandidates": {
"type": "array",
"items": {
"$ref": "#/definitions/regressionCandidate"
}
},
"source": {
"if": {
"type": "object",
@@ -1908,6 +1959,131 @@
}
}
]
},
"regressionCandidate": {
"type": "object",
"required": ["title", "surface", "steps", "expected"],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^REG-[A-Za-z0-9][A-Za-z0-9-]*$"
},
"title": { "type": "string", "minLength": 1, "pattern": "\\S" },
"surface": { "type": "string", "enum": ["browser", "api"] },
"suite": { "type": "string", "enum": ["smoke", "full"] },
"setup": { "type": "string" },
"steps": {
"type": "array",
"minItems": 1,
"items": { "type": "string", "minLength": 1 }
},
"expected": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["kind", "value"],
"additionalProperties": false,
"properties": {
"kind": {
"type": "string",
"enum": [
"visible-text",
"api-status",
"api-field",
"url",
"interaction"
]
},
"value": { "type": "string", "minLength": 1, "pattern": "\\S" }
}
}
},
"sourceKind": { "type": "string", "enum": ["feature", "bug"] }
}
},
"regressionRun": {
"type": "object",
"required": [
"id",
"suite",
"caseIds",
"status",
"sourceRevision",
"configRevision",
"baseUrl",
"results",
"evidence",
"updatedAt"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^RR-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
},
"suite": { "type": "string", "enum": ["smoke", "full", "custom"] },
"caseIds": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^REG-[A-Za-z0-9][A-Za-z0-9-]*$"
}
},
"taskIds": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"deliveryRunId": {
"type": "string",
"pattern": "^DR-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
},
"status": {
"type": "string",
"enum": [
"planned",
"running",
"passed",
"failed",
"blocked",
"skipped"
]
},
"sourceRevision": {
"type": ["string", "null"],
"pattern": "^[0-9a-f]{7,64}$"
},
"configRevision": {
"type": ["string", "null"],
"pattern": "^[0-9a-f]{7,64}$"
},
"baseUrl": { "type": ["string", "null"] },
"results": {
"type": "array",
"items": {
"type": "object",
"required": ["caseId", "result", "evidence"],
"additionalProperties": false,
"properties": {
"caseId": {
"type": "string",
"pattern": "^REG-[A-Za-z0-9][A-Za-z0-9-]*$"
},
"result": { "type": "string", "enum": ["pass", "fail", "skipped"] },
"evidence": { "type": "string", "minLength": 1 }
}
}
},
"evidence": {
"type": "array",
"items": { "type": "string", "minLength": 1 }
},
"updatedAt": { "type": "string", "minLength": 1 }
}
}
}
}
+4
View File
@@ -9,6 +9,7 @@ project:
overlayFile: ".pouch/ack/project.md"
knowledgeFile: ".pouch/ack/knowledge.yaml"
deliveryFile: ".pouch/ack/delivery.yaml"
regressionFile: ".pouch/ack/regression.yaml"
# 可选:飞书 Base Bug 收件箱。只保存 profile 名和资源 ID,绝不保存 App Secret。
# bugIntake:
# provider: "feishu-base"
@@ -114,6 +115,7 @@ project:
workerReceipts: []
deliveryRuns: []
regressionRuns: []
summary:
verified: []
@@ -137,6 +139,8 @@ tasks:
knowledgeApplied: []
knowledgeCandidates: []
knowledgeChecks: []
regressionRefs: []
regressionCandidates: []
# 从飞书导入时由 Coordinator 写入;source.ref 是幂等键。
# source: