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:
@@ -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"],
|
||||
|
||||
@@ -7,7 +7,8 @@ project:
|
||||
enabled: false
|
||||
defaultProfile: null
|
||||
|
||||
# 测试环境部署和版本发布都写在本文件。null 表示用户尚未说明该操作。
|
||||
# 测试环境由 ACK 内部调用 deployer;发版仍指向本文件的 profile。
|
||||
# null 表示用户尚未说明该操作。
|
||||
intents:
|
||||
testEnvironment: null
|
||||
release: null
|
||||
|
||||
@@ -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: []
|
||||
@@ -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 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user