cc-devflow 4.5.2 → 4.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/cc-act/CHANGELOG.md +19 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +14 -1
- package/.claude/skills/cc-act/SKILL.md +46 -6
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +44 -1
- package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +18 -1
- package/.claude/skills/cc-act/references/closure-contract.md +3 -0
- package/.claude/skills/cc-act/scripts/cc-act-common.sh +27 -1
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +31 -0
- package/.claude/skills/cc-act/scripts/verify-act-gate.sh +6 -0
- package/.claude/skills/cc-check/CHANGELOG.md +18 -0
- package/.claude/skills/cc-check/PLAYBOOK.md +38 -7
- package/.claude/skills/cc-check/SKILL.md +39 -7
- package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +61 -0
- package/.claude/skills/cc-check/references/gate-contract.md +11 -0
- package/.claude/skills/cc-check/references/review-contract.md +17 -1
- package/.claude/skills/cc-check/scripts/render-report-card.js +37 -0
- package/.claude/skills/cc-check/scripts/verify-gate.sh +7 -0
- package/.claude/skills/cc-do/CHANGELOG.md +18 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +20 -13
- package/.claude/skills/cc-do/SKILL.md +37 -17
- package/.claude/skills/cc-do/references/execution-recovery.md +19 -5
- package/.claude/skills/cc-do/references/parallel-dispatch.md +6 -4
- package/.claude/skills/cc-do/scripts/detect-file-conflicts.sh +49 -3
- package/.claude/skills/cc-do/scripts/verify-task-gates.sh +19 -6
- package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +14 -2
- package/.claude/skills/cc-investigate/CHANGELOG.md +24 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +35 -13
- package/.claude/skills/cc-investigate/SKILL.md +87 -20
- package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +68 -3
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +9 -4
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +41 -2
- package/.claude/skills/cc-investigate/references/investigation-contract.md +46 -0
- package/.claude/skills/cc-plan/CHANGELOG.md +32 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +26 -8
- package/.claude/skills/cc-plan/SKILL.md +79 -34
- package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +71 -3
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +32 -0
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +76 -2
- package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +58 -0
- package/.claude/skills/cc-plan/references/planning-contract.md +26 -4
- package/.claude/skills/cc-roadmap/CHANGELOG.md +14 -0
- package/.claude/skills/cc-roadmap/PLAYBOOK.md +10 -7
- package/.claude/skills/cc-roadmap/SKILL.md +43 -23
- package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +10 -0
- package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +15 -0
- package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +1 -1
- package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +11 -7
- package/.claude/skills/cc-simplify/CHANGELOG.md +6 -0
- package/.claude/skills/cc-simplify/SKILL.md +10 -1
- package/.claude/skills/cc-spec-init/CHANGELOG.md +6 -0
- package/.claude/skills/cc-spec-init/SKILL.md +14 -1
- package/CHANGELOG.md +29 -0
- package/README.md +10 -2
- package/README.zh-CN.md +10 -2
- package/bin/cc-devflow-cli.js +93 -2
- package/docs/examples/example-bindings.json +7 -7
- package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
- package/docs/examples/full-design-blocked/README.md +1 -1
- package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +1 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +1 -1
- package/docs/examples/full-design-blocked/roadmap-tracking.json +1 -1
- package/docs/examples/local-handoff/BACKLOG.md +1 -1
- package/docs/examples/local-handoff/README.md +1 -1
- package/docs/examples/local-handoff/ROADMAP.md +1 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +1 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +1 -1
- package/docs/examples/local-handoff/roadmap-tracking.json +1 -1
- package/docs/examples/pdca-loop/BACKLOG.md +1 -1
- package/docs/examples/pdca-loop/README.md +1 -1
- package/docs/examples/pdca-loop/ROADMAP.md +1 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +1 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +2 -2
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +1 -1
- package/docs/examples/pdca-loop/roadmap-tracking.json +1 -1
- package/docs/get-shit-done-strategy-audit.md +518 -0
- package/docs/skill-strategy-audit.md +48 -0
- package/lib/compiler/__tests__/inventory.test.js +51 -0
- package/lib/compiler/inventory.js +78 -0
- package/lib/skill-runtime/__tests__/approve.test.js +92 -0
- package/lib/skill-runtime/__tests__/autopilot.test.js +4 -0
- package/lib/skill-runtime/__tests__/planner.tdd.test.js +20 -0
- package/lib/skill-runtime/__tests__/query.test.js +147 -1
- package/lib/skill-runtime/__tests__/readiness.test.js +53 -0
- package/lib/skill-runtime/__tests__/release.test.js +85 -0
- package/lib/skill-runtime/__tests__/runtime.integration.test.js +30 -1
- package/lib/skill-runtime/__tests__/schemas.test.js +56 -0
- package/lib/skill-runtime/__tests__/worker-run.test.js +29 -0
- package/lib/skill-runtime/errors.js +39 -0
- package/lib/skill-runtime/index.js +8 -0
- package/lib/skill-runtime/operations/approve.js +17 -2
- package/lib/skill-runtime/operations/release.js +6 -3
- package/lib/skill-runtime/operations/worker-run.js +30 -0
- package/lib/skill-runtime/planner.js +10 -2
- package/lib/skill-runtime/query-registry.js +101 -0
- package/lib/skill-runtime/query.js +159 -91
- package/lib/skill-runtime/readiness.js +84 -0
- package/lib/skill-runtime/schemas.js +39 -4
- package/lib/skill-runtime/trace.js +22 -0
- package/package.json +1 -1
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# CC-Act Skill Changelog
|
|
2
2
|
|
|
3
|
+
## v1.8.1 - 2026-04-29
|
|
4
|
+
|
|
5
|
+
- add structured ship preflight fields with `ShipPreflightError` rescue actions
|
|
6
|
+
- require rollback guards before publish, merge, PR update, or release note handoff
|
|
7
|
+
- add PR branch hygiene and learning extraction targets to delivery templates
|
|
8
|
+
|
|
9
|
+
## v1.8.0 - 2026-04-28
|
|
10
|
+
|
|
11
|
+
- add remote state consistency rules for issue, PR, tracker, `needs-info`, and `ready-for-agent` closeout handoffs
|
|
12
|
+
- require dangerous git actions to have explicit ship semantics and user confirmation before reset, clean, branch deletion, or whole-tree restore
|
|
13
|
+
- require tooling changes to prove the real hook, adapt, publish, lint, or verification entrypoint still works
|
|
14
|
+
|
|
15
|
+
## v1.7.0 - 2026-04-28
|
|
16
|
+
|
|
17
|
+
- carry cc-check QA feedback-loop and behavior evidence into PR briefs, handoffs, and release notes so ship materials preserve expected/actual/reproduction truth
|
|
18
|
+
- add durable follow-up brief rules for current behavior, desired behavior, key interfaces, acceptance criteria, and out-of-scope boundaries
|
|
19
|
+
- teach shared follow-up and evidence extraction to include report-card followup briefs and QA architecture follow-ups
|
|
20
|
+
- extend readiness dashboard guidance with feedback-loop quality and behavior evidence checks
|
|
21
|
+
|
|
3
22
|
## v1.6.4 - 2026-04-28
|
|
4
23
|
|
|
5
24
|
- add a readiness dashboard covering review freshness, review quality, specialist facets, QA coverage, browser QA, failure ownership, documentation release, and PR body accuracy
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
2. 确认 `review/report-card.json` 是 `pass`,且没有未解释的 gaps / reroute
|
|
27
27
|
3. 确认 `planning/tasks.md` 不再有未完成项
|
|
28
28
|
4. 确认 `review.freshness` 新鲜、`runtime.failureOwnership` 无未解释失败、`qa.coverageAudit` / `qa.browserEvidence` 有证据或明确 skip
|
|
29
|
+
5. 确认 `qa.feedbackLoop` / `qa.behaviorEvidence` 能支撑行为结论;不可复现时必须写清缺什么 artifact / 权限 / 输入
|
|
29
30
|
|
|
30
31
|
如果 gate 没闭合,直接回 `cc-check` 或 `cc-do`,不要在 `cc-act` 自我安慰。
|
|
31
32
|
|
|
@@ -82,7 +83,10 @@ Ship 必须属于这 4 种模式之一:
|
|
|
82
83
|
3. 检查提交边界,按逻辑单元拆分,保证提交顺序不引用未来代码。
|
|
83
84
|
4. 如果有 WIP commit,只能用非破坏性 rebase / fixup 处理,不允许盲目 soft reset。
|
|
84
85
|
5. push 前比较 local / remote HEAD;PR 前检查是否已有打开 PR / MR。
|
|
85
|
-
6. 生成 readiness dashboard:review freshness、review quality、QA coverage、browser QA、failure ownership、documentation release、PR body accuracy。
|
|
86
|
+
6. 生成 readiness dashboard:review freshness、review quality、QA coverage、browser QA、feedback loop、behavior evidence、failure ownership、documentation release、PR body accuracy。
|
|
87
|
+
7. 生成 ship preflight:branch/base/remote/auth/clean tree/review freshness/ship mode。
|
|
88
|
+
8. preflight 失败必须命名为 `ShipPreflightError`,并写明 rescue action 或切到 `local-handoff`。
|
|
89
|
+
9. 发布、合并、PR 更新或 release note 前必须写 rollback guard。
|
|
86
90
|
|
|
87
91
|
## Phase 3: Build Delivery Pack
|
|
88
92
|
|
|
@@ -114,8 +118,12 @@ Ship 必须属于这 4 种模式之一:
|
|
|
114
118
|
- review packet path / summary
|
|
115
119
|
- finding triage summary
|
|
116
120
|
- QA / claim evidence summary
|
|
121
|
+
- ship preflight and `ShipPreflightError` rescue if any
|
|
122
|
+
- rollback guard
|
|
123
|
+
- QA behavior evidence and feedback-loop quality
|
|
117
124
|
- readiness dashboard
|
|
118
125
|
- PR body accuracy check
|
|
126
|
+
- Durable follow-up briefs: current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
|
|
119
127
|
|
|
120
128
|
缺这些字段时,可以生成 local handoff,但不能声称 PR body 已经可 review。
|
|
121
129
|
|
|
@@ -183,6 +191,8 @@ Ship 必须属于这 4 种模式之一:
|
|
|
183
191
|
- 长期方向写 `devflow/roadmap/roadmap.md`
|
|
184
192
|
- 下一轮待排队动作写 `devflow/roadmap/backlog.md`
|
|
185
193
|
- 不要把噪音和碎念回写成系统真相
|
|
194
|
+
- follow-up 必须是 durable brief:用领域语言写 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
|
|
195
|
+
- 独立行为拆独立条目;有依赖关系时写明顺序,方便下一轮并行或排队
|
|
186
196
|
|
|
187
197
|
## Phase 7: Declare The Next Entry
|
|
188
198
|
|
|
@@ -201,6 +211,9 @@ Ship 必须属于这 4 种模式之一:
|
|
|
201
211
|
4. `cc-simplify`、单测、e2e、commit/push 的结果是不是都能追溯?
|
|
202
212
|
5. PR body / release note / handoff / changelog 说的是不是同一套现实?
|
|
203
213
|
6. readiness dashboard 有没有 blocker 或 stale warning?
|
|
214
|
+
7. follow-up 是不是行为契约,而不是“改某文件某行”的易腐烂 TODO?
|
|
215
|
+
8. ship preflight failure 是否有 `ShipPreflightError`、artifact ref 和 rescue action?
|
|
216
|
+
9. rollback guard 是否足够让下一位维护者不靠聊天记录回退?
|
|
204
217
|
|
|
205
218
|
如果第 1 或第 3 题答案不是“能”,说明 `cc-act` 仍然太重或太糊。
|
|
206
219
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cc-act
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.8.1
|
|
4
4
|
description: 'Use when verified work must be shipped or handed off with a clear landing path: run simplify and required tests, create or update a PR, prepare a local handoff, close out merged work, sync docs, write release notes, and fold follow-ups back into backlog or roadmap.'
|
|
5
5
|
triggers:
|
|
6
6
|
- 准备提 PR
|
|
@@ -37,7 +37,7 @@ effects:
|
|
|
37
37
|
- roadmap or backlog follow-up updates when needed
|
|
38
38
|
entry_gate:
|
|
39
39
|
- Accept only a passing review/report-card.json with reroute=none and specSyncReady=true.
|
|
40
|
-
- Freeze current branch, PR,
|
|
40
|
+
- Freeze current branch, PR, ship-mode, auth, clean-tree, and rollback facts before writing delivery materials.
|
|
41
41
|
- If simplify, tests, or act changes code or verification scope, return to cc-check immediately.
|
|
42
42
|
exit_criteria:
|
|
43
43
|
- The ship mode is explicit, delivery materials match that mode, and the next maintainer has one clear entry point.
|
|
@@ -127,7 +127,8 @@ tool_budget:
|
|
|
127
127
|
3. 运行 `scripts/verify-act-gate.sh --dir <requirement-dir>`,确认 gate 真的闭合。
|
|
128
128
|
4. 运行 `scripts/detect-ship-target.sh`,识别当前分支、base branch、PR 状态与推荐 ship 路径。
|
|
129
129
|
5. 检查 `review.freshness`、`runtime.failureOwnership`、`qa.coverageAudit`、`qa.browserEvidence`,确认 readiness dashboard 没有 blocker。
|
|
130
|
-
6.
|
|
130
|
+
6. 检查 `qa.feedbackLoop`、`qa.behaviorEvidence`、`qa.architectureFollowUps` 和 follow-up brief,确认交付材料继承的是行为证据,不是聊天记忆或易腐烂 TODO。
|
|
131
|
+
7. 如果在 `cc-act` 期间因为 `cc-simplify`、单测、e2e、review 修复而改了代码,必须回 `cc-check`,不能带着旧证明继续 ship。
|
|
131
132
|
|
|
132
133
|
## Ship Modes
|
|
133
134
|
|
|
@@ -213,6 +214,32 @@ tool_budget:
|
|
|
213
214
|
7. PR idempotency:已有打开的 PR / MR 只更新 body,不重复创建。
|
|
214
215
|
8. Review range:PR brief / PR body 必须写清 `cc-check` 审过的 base/head SHA、review packet、finding triage 摘要。
|
|
215
216
|
9. Post-integration verification:本地合并或 post-merge closeout 后,必须在 merged result 上跑必要 gate;不能只继承合并前绿色。
|
|
217
|
+
10. Follow-up durability:PR brief / release note / backlog writeback 里的 follow-up 必须写成行为契约,包含 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope;不要把当前文件路径或行号当成长期计划。
|
|
218
|
+
11. Remote state consistency:如果本次 closeout 触碰 GitHub issue / PR / tracker,必须记录当前 state、目标 state、允许转换、已保留事实和下一位 owner;`needs-info` 必须保留已确认事实和具体问题,`ready-for-agent` 必须有可执行 brief。
|
|
219
|
+
12. Tooling smoke:如果本次改动影响 hook、pre-commit、lint、publish、adapt 或验证脚本,必须跑真实入口或最接近真实入口的 smoke;只读配置文件不等于工具链可用。
|
|
220
|
+
|
|
221
|
+
## Ship Preflight And Rescue
|
|
222
|
+
|
|
223
|
+
ship preflight 必须结构化记录:
|
|
224
|
+
|
|
225
|
+
- `branch`: 当前分支、base、remote、local/remote HEAD 关系
|
|
226
|
+
- `auth`: `gh` / registry / deploy / package publish 等权限是否可用
|
|
227
|
+
- `workspace`: clean tree、staged files、未跟踪文件和相关 stash
|
|
228
|
+
- `reviewFreshness`: `cc-check` 审查范围是否仍绑定当前 HEAD
|
|
229
|
+
- `shipMode`: `create-pr` / `update-pr` / `local-handoff` / `post-merge-closeout`
|
|
230
|
+
|
|
231
|
+
任何 preflight failure 都必须命名为 `ShipPreflightError`,并写清 rescue action。
|
|
232
|
+
不能用“工具不可用”当作模糊失败;要明确切 `local-handoff`、补 auth、刷新 review,
|
|
233
|
+
还是返回 `cc-check`。
|
|
234
|
+
|
|
235
|
+
rollback guard 必须在 publish、merge、PR 更新或 release note 前写清:
|
|
236
|
+
|
|
237
|
+
- safe state
|
|
238
|
+
- rollback command 或人工回退步骤
|
|
239
|
+
- data / migration / package / remote side effect
|
|
240
|
+
- owner
|
|
241
|
+
|
|
242
|
+
没有 rollback guard 的 release 只能停在 handoff,不准发布。
|
|
216
243
|
|
|
217
244
|
## Readiness Dashboard
|
|
218
245
|
|
|
@@ -222,9 +249,11 @@ PR / handoff 之前必须把 readiness 压成一屏事实:
|
|
|
222
249
|
2. Review quality:记录 `review.qualityScore`、specialist facet 覆盖、finding triage 摘要。
|
|
223
250
|
3. QA coverage:记录 `qa.coverageAudit` 的 coverage、gaps、e2e/eval requirement。
|
|
224
251
|
4. Browser QA:UI / 用户路径变更必须有 `qa.browserEvidence`,否则要有 skip reason。
|
|
225
|
-
5.
|
|
226
|
-
6.
|
|
227
|
-
7.
|
|
252
|
+
5. Feedback loop:bugfix / 行为变更必须有 `qa.feedbackLoop`,否则要有不可复现或不适用原因。
|
|
253
|
+
6. Behavior evidence:expected / actual / reproduction steps 必须能被 reviewer 独立理解。
|
|
254
|
+
7. Failure ownership:`runtime.failureOwnership` 不能有未解释的 `in-branch` 或 `ambiguous` failure。
|
|
255
|
+
8. Documentation release:README / CLAUDE / architecture / handoff / changelog 的同步状态必须可审计。
|
|
256
|
+
9. PR body accuracy:PR body 必须从当前 `pr-brief.md`、当前 diff、当前 report-card 重建;已有 PR body 只能被刷新,不能被继承。
|
|
228
257
|
|
|
229
258
|
readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute 到 `cc-check` / `cc-do` 或生成 local handoff。
|
|
230
259
|
|
|
@@ -236,6 +265,7 @@ readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute
|
|
|
236
265
|
2. 丢弃未合并工作必须要求用户显式确认;没有确认时只能转 `local-handoff`。
|
|
237
266
|
3. branch cleanup 只发生在 merge / PR / discard 语义已经清楚之后。
|
|
238
267
|
4. `post-merge-closeout` 必须记录 merged-result verification:命令、exit status、关键观察、失败时 reroute。
|
|
268
|
+
5. 危险 Git 动作必须有明确 ship 语义:`git push` 只在 `create-pr` / `update-pr` / release lane 执行,`git reset --hard`、`git clean -f`、`git branch -D`、整树 restore/checkout 必须先列出对象并取得用户确认;没有确认时写 handoff,不执行。
|
|
239
269
|
|
|
240
270
|
## Documentation Release
|
|
241
271
|
|
|
@@ -249,6 +279,16 @@ readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute
|
|
|
249
279
|
6. Discoverability:新增文档必须能从 README、CLAUDE 或 handoff 入口找到。
|
|
250
280
|
7. TODO/backlog cleanup:只把有 diff 证据完成的事项移到 completed;新 follow-up 写回 backlog/roadmap。
|
|
251
281
|
|
|
282
|
+
## Issue And Follow-Up Handoff
|
|
283
|
+
|
|
284
|
+
当本次交付产生或更新 issue / PR / backlog follow-up 时,文案必须耐 refactor:
|
|
285
|
+
|
|
286
|
+
- 先写用户可观察行为:what happened / expected / reproduction 或 desired behavior。
|
|
287
|
+
- 再写 agent 可执行 contract:acceptance criteria、allowed scope、blocked by、verification command。
|
|
288
|
+
- 不把短期文件路径、行号、函数名写成长期事实;只有当前 reviewer 需要定位时才放进 PR brief 的实现备注。
|
|
289
|
+
- 多个 follow-up 必须按独立可验证切片拆开,并标明 `AFK` / `HITL`、blocked-by 和 owner。
|
|
290
|
+
- 已经问过或确认过的信息不能在 `needs-info` 里丢失;问题必须具体到 reporter 能直接补证据。
|
|
291
|
+
|
|
252
292
|
## Loop
|
|
253
293
|
|
|
254
294
|
1. 先锁定 ship 事实:当前分支、base branch、PR 状态、requirement 状态。
|
|
@@ -24,6 +24,27 @@
|
|
|
24
24
|
- Base branch:
|
|
25
25
|
- PR / MR:
|
|
26
26
|
|
|
27
|
+
## Ship Preflight
|
|
28
|
+
|
|
29
|
+
- Branch:
|
|
30
|
+
- Base:
|
|
31
|
+
- Remote:
|
|
32
|
+
- Local / remote HEAD:
|
|
33
|
+
- Auth:
|
|
34
|
+
- Clean tree:
|
|
35
|
+
- Review freshness:
|
|
36
|
+
- Ship mode:
|
|
37
|
+
- `ShipPreflightError`:
|
|
38
|
+
- Rescue action:
|
|
39
|
+
|
|
40
|
+
## PR Branch Hygiene
|
|
41
|
+
|
|
42
|
+
- Existing PR / MR:
|
|
43
|
+
- Duplicate PR risk:
|
|
44
|
+
- Commit split:
|
|
45
|
+
- Push idempotency:
|
|
46
|
+
- Body source:
|
|
47
|
+
|
|
27
48
|
## Review Range
|
|
28
49
|
|
|
29
50
|
- Reviewed base SHA:
|
|
@@ -39,6 +60,8 @@
|
|
|
39
60
|
- Specialist review facets:
|
|
40
61
|
- QA coverage:
|
|
41
62
|
- Browser QA:
|
|
63
|
+
- Feedback loop:
|
|
64
|
+
- Behavior evidence:
|
|
42
65
|
- Failure ownership:
|
|
43
66
|
- Documentation release:
|
|
44
67
|
- PR body accuracy:
|
|
@@ -57,6 +80,21 @@
|
|
|
57
80
|
- Fresh evidence:
|
|
58
81
|
- Merged-result verification:
|
|
59
82
|
|
|
83
|
+
## Rollback Guard
|
|
84
|
+
|
|
85
|
+
- Safe state:
|
|
86
|
+
- Rollback command / manual steps:
|
|
87
|
+
- Side effects:
|
|
88
|
+
- Owner:
|
|
89
|
+
|
|
90
|
+
## QA Behavior Evidence
|
|
91
|
+
|
|
92
|
+
- Feedback loop:
|
|
93
|
+
- Expected behavior:
|
|
94
|
+
- Actual behavior:
|
|
95
|
+
- Reproduction steps:
|
|
96
|
+
- Consistency:
|
|
97
|
+
|
|
60
98
|
## Documentation Sync
|
|
61
99
|
|
|
62
100
|
- `CLAUDE.md`:
|
|
@@ -81,7 +119,12 @@
|
|
|
81
119
|
|
|
82
120
|
## Follow-Ups
|
|
83
121
|
|
|
84
|
-
-
|
|
122
|
+
- Current behavior:
|
|
123
|
+
- Desired behavior:
|
|
124
|
+
- Key interfaces:
|
|
125
|
+
- Acceptance criteria:
|
|
126
|
+
- Out of scope:
|
|
127
|
+
- Learning extraction target:
|
|
85
128
|
|
|
86
129
|
## Risks
|
|
87
130
|
|
|
@@ -20,10 +20,27 @@
|
|
|
20
20
|
|
|
21
21
|
-
|
|
22
22
|
|
|
23
|
+
## Rollback Guard
|
|
24
|
+
|
|
25
|
+
- Safe state:
|
|
26
|
+
- Rollback command / manual steps:
|
|
27
|
+
- Side effects:
|
|
28
|
+
- Owner:
|
|
29
|
+
|
|
30
|
+
## QA Behavior Evidence
|
|
31
|
+
|
|
32
|
+
- Feedback loop:
|
|
33
|
+
- User-visible behavior:
|
|
34
|
+
- Reproduction / verification path:
|
|
35
|
+
|
|
23
36
|
## Ops Notes
|
|
24
37
|
|
|
25
38
|
-
|
|
26
39
|
|
|
27
40
|
## Follow-Ups
|
|
28
41
|
|
|
29
|
-
-
|
|
42
|
+
- Current behavior:
|
|
43
|
+
- Desired behavior:
|
|
44
|
+
- Acceptance criteria:
|
|
45
|
+
- Out of scope:
|
|
46
|
+
- Learning extraction target:
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
6. 如果文件结构变了,就同步对应目录的 `CLAUDE.md`
|
|
11
11
|
7. PR / handoff 必须记录 `cc-check` 审过的 base/head SHA、review packet、finding triage 摘要
|
|
12
12
|
8. readiness dashboard 必须说明 review freshness、QA coverage、browser evidence、failure ownership、documentation release、PR body accuracy
|
|
13
|
+
9. behavior handoff 必须带上 QA feedback loop、expected / actual / reproduction steps,以及 durable follow-up brief
|
|
13
14
|
|
|
14
15
|
## Ship Decision Contract
|
|
15
16
|
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
9. 删除 branch、worktree、未合并提交、归档 requirement 前必须列出对象;丢弃未合并工作需要显式确认
|
|
36
37
|
10. verification 每次进入 `cc-act` 都必须重新跑;只有 push、PR 更新、文档生成等动作可以因为幂等状态跳过
|
|
37
38
|
11. PR body accuracy 必须对照当前 report-card、当前 diff、当前 commits;旧 body 不能作为证据源
|
|
39
|
+
12. follow-up 回写必须用行为契约表达,包含 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope;不能只写文件路径或聊天 TODO
|
|
38
40
|
|
|
39
41
|
## Memory Consolidation
|
|
40
42
|
|
|
@@ -52,6 +54,7 @@
|
|
|
52
54
|
- maintainer 知道怎么验证
|
|
53
55
|
- PR / handoff / release 材料反映同一套事实
|
|
54
56
|
- readiness dashboard 没有 blocker,PR body accuracy 已检查或明确阻塞
|
|
57
|
+
- QA behavior evidence 和 feedback loop 已进入 PR / handoff / release 材料
|
|
55
58
|
- post-merge closeout 反映 merged result 的验证事实,而不是只反映合并前事实
|
|
56
59
|
- 下一轮计划入口更清楚
|
|
57
60
|
- 文档入口可发现,changelog 不丢历史,TODO / backlog 只记录有证据的事项
|
|
@@ -189,6 +189,30 @@ req_act_collect_followups() {
|
|
|
189
189
|
|
|
190
190
|
if [[ -f "$report_card" ]]; then
|
|
191
191
|
jq -r '(.gaps // [])[]?' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
192
|
+
jq -r '
|
|
193
|
+
(.followupBriefs // .review.followupBriefs // [])[]?
|
|
194
|
+
| [
|
|
195
|
+
("summary: " + (.summary // .title // "follow-up")),
|
|
196
|
+
("current: " + (.currentBehavior // "not recorded")),
|
|
197
|
+
("desired: " + (.desiredBehavior // "not recorded")),
|
|
198
|
+
("interfaces: " + ((.keyInterfaces // []) | join(", "))),
|
|
199
|
+
("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
|
|
200
|
+
("out-of-scope: " + ((.outOfScope // []) | join(", ")))
|
|
201
|
+
]
|
|
202
|
+
| join(" | ")
|
|
203
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
204
|
+
jq -r '
|
|
205
|
+
(.qa.architectureFollowUps // [])[]?
|
|
206
|
+
| [
|
|
207
|
+
("summary: " + (.summary // .title // "architecture follow-up")),
|
|
208
|
+
("current: " + (.currentBehavior // "not recorded")),
|
|
209
|
+
("desired: " + (.desiredBehavior // "not recorded")),
|
|
210
|
+
("interfaces: " + ((.keyInterfaces // []) | join(", "))),
|
|
211
|
+
("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
|
|
212
|
+
("out-of-scope: " + ((.outOfScope // []) | join(", ")))
|
|
213
|
+
]
|
|
214
|
+
| join(" | ")
|
|
215
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
192
216
|
fi
|
|
193
217
|
|
|
194
218
|
if [[ -f "$manifest" ]]; then
|
|
@@ -238,7 +262,9 @@ req_act_collect_evidence() {
|
|
|
238
262
|
(.evidence // [])[]?,
|
|
239
263
|
((.claimEvidence // [])[]? | "- " + (.claim // "claim") + ": " + (.status // "unknown") + " via " + (.commandOrArtifact // "artifact") + " - " + (.keyObservation // "")),
|
|
240
264
|
(if .qa.coverageAudit then "- qa.coverage: " + (.qa.coverageAudit.status // "unknown") + ", gaps=" + (((.qa.coverageAudit.gaps // []) | length) | tostring) else empty end),
|
|
241
|
-
(if .qa.browserEvidence then "- qa.browser: " + (.qa.browserEvidence.status // "unknown") + ", mode=" + (.qa.browserEvidence.mode // "unknown") else empty end)
|
|
265
|
+
(if .qa.browserEvidence then "- qa.browser: " + (.qa.browserEvidence.status // "unknown") + ", mode=" + (.qa.browserEvidence.mode // "unknown") else empty end),
|
|
266
|
+
(if .qa.feedbackLoop then "- qa.feedbackLoop: " + (.qa.feedbackLoop.status // "unknown") + ", mode=" + (.qa.feedbackLoop.mode // "unknown") + ", signal=" + (.qa.feedbackLoop.signalSharpness // "not recorded") else empty end),
|
|
267
|
+
(if .qa.behaviorEvidence then "- qa.behavior: " + (.qa.behaviorEvidence.status // "unknown") + ", expected=" + (.qa.behaviorEvidence.expectedBehavior // "not recorded") + ", actual=" + (.qa.behaviorEvidence.actualBehavior // "not recorded") else empty end)
|
|
242
268
|
' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
243
269
|
req_act_dedup_file "$out_file"
|
|
244
270
|
}
|
|
@@ -157,6 +157,23 @@ browser_qa_summary="$(jq -r '
|
|
|
157
157
|
(if (($browser.skipReason // "") != "") then ", skip=\($browser.skipReason)" else "" end)
|
|
158
158
|
end
|
|
159
159
|
' "$report_card")"
|
|
160
|
+
feedback_loop_summary="$(jq -r '
|
|
161
|
+
.qa.feedbackLoop as $loop |
|
|
162
|
+
if $loop == null then
|
|
163
|
+
"not recorded"
|
|
164
|
+
else
|
|
165
|
+
"status=\($loop.status // "unknown"), mode=\($loop.mode // "unknown"), determinism=\($loop.determinism // "not recorded"), reproductionRate=\($loop.reproductionRate // "not recorded")" +
|
|
166
|
+
(if (($loop.blockedReason // "") != "") then ", blocked=\($loop.blockedReason)" else "" end)
|
|
167
|
+
end
|
|
168
|
+
' "$report_card")"
|
|
169
|
+
behavior_evidence_summary="$(jq -r '
|
|
170
|
+
.qa.behaviorEvidence as $behavior |
|
|
171
|
+
if $behavior == null then
|
|
172
|
+
"not recorded"
|
|
173
|
+
else
|
|
174
|
+
"status=\($behavior.status // "unknown"), boundary=\($behavior.userFacingBoundary // "not recorded"), expected=\($behavior.expectedBehavior // "not recorded"), actual=\($behavior.actualBehavior // "not recorded"), steps=\((($behavior.reproductionSteps // []) | length))"
|
|
175
|
+
end
|
|
176
|
+
' "$report_card")"
|
|
160
177
|
failure_ownership_summary="$(jq -r '
|
|
161
178
|
(.runtime.failureOwnership? // [])
|
|
162
179
|
| if length == 0 then
|
|
@@ -210,6 +227,8 @@ pr_body_accuracy_summary="body must be regenerated from this pr-brief, current r
|
|
|
210
227
|
echo "- Specialist review facets: $specialist_review_summary"
|
|
211
228
|
echo "- QA coverage: $qa_coverage_summary"
|
|
212
229
|
echo "- Browser QA: $browser_qa_summary"
|
|
230
|
+
echo "- Feedback loop: $feedback_loop_summary"
|
|
231
|
+
echo "- Behavior evidence: $behavior_evidence_summary"
|
|
213
232
|
echo "- Failure ownership: $failure_ownership_summary"
|
|
214
233
|
echo "- Documentation release: $documentation_release_summary"
|
|
215
234
|
echo "- PR body accuracy: $pr_body_accuracy_summary"
|
|
@@ -252,6 +271,18 @@ pr_body_accuracy_summary="body must be regenerated from this pr-brief, current r
|
|
|
252
271
|
echo "- No evidence lines captured yet."
|
|
253
272
|
fi
|
|
254
273
|
echo
|
|
274
|
+
echo "## QA Behavior Evidence"
|
|
275
|
+
echo
|
|
276
|
+
echo "- Feedback loop: $feedback_loop_summary"
|
|
277
|
+
echo "- Behavior evidence: $behavior_evidence_summary"
|
|
278
|
+
jq -r '
|
|
279
|
+
.qa.behaviorEvidence as $behavior |
|
|
280
|
+
if $behavior == null then empty else
|
|
281
|
+
(($behavior.reproductionSteps // [])[]? | "- Reproduction step: " + .),
|
|
282
|
+
(($behavior.domainLanguage // [])[]? | "- Domain language: " + .)
|
|
283
|
+
end
|
|
284
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' || true
|
|
285
|
+
echo
|
|
255
286
|
echo "## Documentation Sync"
|
|
256
287
|
echo
|
|
257
288
|
echo "- \`CLAUDE.md\`: $claude_status"
|
|
@@ -47,6 +47,8 @@ failure_ownership_open="$(jq -r '
|
|
|
47
47
|
' "$report_card" 2>/dev/null || echo 0)"
|
|
48
48
|
coverage_status="$(jq -r '.qa.coverageAudit.status // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
49
49
|
browser_status="$(jq -r '.qa.browserEvidence.status // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
50
|
+
feedback_loop_status="$(jq -r '.qa.feedbackLoop.status // "skipped"' "$report_card" 2>/dev/null || echo skipped)"
|
|
51
|
+
behavior_evidence_status="$(jq -r '.qa.behaviorEvidence.status // "skipped"' "$report_card" 2>/dev/null || echo skipped)"
|
|
50
52
|
|
|
51
53
|
remaining_tasks="0"
|
|
52
54
|
if [[ -f "$tasks_file" ]]; then
|
|
@@ -62,6 +64,8 @@ fi
|
|
|
62
64
|
[[ "$failure_ownership_open" -eq 0 ]] || { echo "Gate open: failure_ownership_open=$failure_ownership_open" >&2; exit 1; }
|
|
63
65
|
[[ "$coverage_status" != "blocked" && "$coverage_status" != "fail" && "$coverage_status" != "pending" ]] || { echo "Gate open: coverage_status=$coverage_status" >&2; exit 1; }
|
|
64
66
|
[[ "$browser_status" != "blocked" && "$browser_status" != "fail" && "$browser_status" != "pending" ]] || { echo "Gate open: browser_status=$browser_status" >&2; exit 1; }
|
|
67
|
+
[[ "$feedback_loop_status" != "blocked" && "$feedback_loop_status" != "fail" && "$feedback_loop_status" != "pending" ]] || { echo "Gate open: feedback_loop_status=$feedback_loop_status" >&2; exit 1; }
|
|
68
|
+
[[ "$behavior_evidence_status" != "blocked" && "$behavior_evidence_status" != "fail" && "$behavior_evidence_status" != "pending" ]] || { echo "Gate open: behavior_evidence_status=$behavior_evidence_status" >&2; exit 1; }
|
|
65
69
|
[[ "$remaining_tasks" -eq 0 ]] || { echo "Gate open: remaining_tasks=$remaining_tasks" >&2; exit 1; }
|
|
66
70
|
|
|
67
71
|
cat <<EOF
|
|
@@ -75,5 +79,7 @@ REVIEW_FRESHNESS=$review_freshness
|
|
|
75
79
|
FAILURE_OWNERSHIP_OPEN=$failure_ownership_open
|
|
76
80
|
COVERAGE_STATUS=$coverage_status
|
|
77
81
|
BROWSER_STATUS=$browser_status
|
|
82
|
+
FEEDBACK_LOOP_STATUS=$feedback_loop_status
|
|
83
|
+
BEHAVIOR_EVIDENCE_STATUS=$behavior_evidence_status
|
|
78
84
|
REMAINING_TASKS=$remaining_tasks
|
|
79
85
|
EOF
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# CC-Check Skill Changelog
|
|
2
2
|
|
|
3
|
+
## v1.10.1 - 2026-04-29
|
|
4
|
+
|
|
5
|
+
- add named runtime failure fields with artifact references, owners, and rescue actions
|
|
6
|
+
- add human UAT evidence to the report card so manual acceptance can block or reroute honestly
|
|
7
|
+
- require review findings to carry explicit rescue actions instead of vague follow-up text
|
|
8
|
+
|
|
9
|
+
## v1.10.0 - 2026-04-28
|
|
10
|
+
|
|
11
|
+
- add test fixture honesty review for partial fixtures, generated stubs, casts, and missing mock payload fields
|
|
12
|
+
- require fixture shortcuts to preserve public seam behavior instead of hiding contract or input-shape problems
|
|
13
|
+
|
|
14
|
+
## v1.9.0 - 2026-04-28
|
|
15
|
+
|
|
16
|
+
- add QA feedback-loop evidence so bugfix and behavior checks record reproduction mode, determinism, signal quality, and blocked loop reasons before a pass verdict
|
|
17
|
+
- add behavior evidence fields for expected behavior, actual behavior, reproduction steps, consistency, and domain language
|
|
18
|
+
- tighten test-quality review around public-interface tests, system-boundary mocks, and architecture follow-ups when no correct test seam exists
|
|
19
|
+
- update the report-card template, renderer, and gate validation for the new QA evidence shape while keeping older reports structurally compatible
|
|
20
|
+
|
|
3
21
|
## v1.8.4 - 2026-04-28
|
|
4
22
|
|
|
5
23
|
- add review freshness, quality score, specialist review facets, and finding confidence fingerprints so stale or noisy review evidence cannot masquerade as current proof
|
|
@@ -41,6 +41,7 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
41
41
|
- task review proof
|
|
42
42
|
- requirement diff review
|
|
43
43
|
- claim evidence matrix
|
|
44
|
+
- QA feedback loop and behavior evidence
|
|
44
45
|
- QA regression / test-quality proof
|
|
45
46
|
- QA coverage and browser evidence
|
|
46
47
|
- review freshness and finding confidence
|
|
@@ -62,6 +63,8 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
62
63
|
6. 把每个成功声明映射到 `claimEvidence[]`
|
|
63
64
|
7. 行为变更必须补 `qa` 证据或例外理由
|
|
64
65
|
8. 失败输出必须写入 `runtime.failureOwnership[]`
|
|
66
|
+
9. failure ownership 必须包含 named error、artifact refs 和 rescue action
|
|
67
|
+
10. human UAT 必须 pass、fail、blocked 或带 skip reason;失败不能被测试绿灯覆盖
|
|
65
68
|
|
|
66
69
|
## Verification Layers
|
|
67
70
|
|
|
@@ -69,11 +72,14 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
69
72
|
2. Task review proof
|
|
70
73
|
3. Requirement diff truth
|
|
71
74
|
4. Claim evidence matrix
|
|
72
|
-
5. QA
|
|
73
|
-
6. QA
|
|
74
|
-
7.
|
|
75
|
-
8.
|
|
76
|
-
9.
|
|
75
|
+
5. QA feedback loop and behavior evidence
|
|
76
|
+
6. QA regression and test quality
|
|
77
|
+
7. QA coverage and browser evidence
|
|
78
|
+
8. Review freshness and confidence calibration
|
|
79
|
+
9. Failure ownership
|
|
80
|
+
10. Spec alignment and sync readiness
|
|
81
|
+
11. Human UAT
|
|
82
|
+
12. Named runtime errors and rescue actions
|
|
77
83
|
|
|
78
84
|
## Claim Evidence Matrix
|
|
79
85
|
|
|
@@ -121,13 +127,16 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
|
|
|
121
127
|
|
|
122
128
|
行为变化、bugfix、边界条件、用户可见流程必须补 `qa`:
|
|
123
129
|
|
|
130
|
+
- `feedbackLoop`:用什么 loop 证明现实,速度、确定性、信号锋利度、复现率如何
|
|
131
|
+
- `behaviorEvidence`:用户边界、expected / actual、复现步骤、稳定性、领域语言
|
|
124
132
|
- `regressionProof`:red command、red failure reason、green command、是否恢复最终状态
|
|
125
|
-
- `testQuality
|
|
133
|
+
- `testQuality`:是否经公共接口验证真实行为、mock 是否只停在系统边界、是否存在 test-only production API
|
|
134
|
+
- `architectureFollowUps`:没有正确 test seam 时记录 seam / hidden coupling / shallow module 的后续改造
|
|
126
135
|
- `tddException`:纯配置、生成文件、throwaway prototype 等例外和替代验证
|
|
127
136
|
- `coverageAudit`:覆盖率、codepath / user-flow map、缺口、是否需要 e2e / eval、测试质量星级
|
|
128
137
|
- `browserEvidence`:UI / 用户路径变更的 affected routes、截图、console、health score、issues,或明确 skip reason
|
|
129
138
|
|
|
130
|
-
测试只绿过一次,不能证明 regression test 有效;断言 mock
|
|
139
|
+
测试只绿过一次,不能证明 regression test 有效;断言 mock 本身,不能证明真实行为。没有可信反馈环时,`pass` 不成立。
|
|
131
140
|
|
|
132
141
|
## Failure Ownership
|
|
133
142
|
|
|
@@ -171,6 +180,26 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
|
|
|
171
180
|
},
|
|
172
181
|
"qa": {
|
|
173
182
|
"status": "pass",
|
|
183
|
+
"feedbackLoop": {
|
|
184
|
+
"status": "pass",
|
|
185
|
+
"mode": "targeted-test",
|
|
186
|
+
"commandOrArtifact": "npm test -- src/feature/feature.test.ts",
|
|
187
|
+
"speed": "fast",
|
|
188
|
+
"determinism": "high",
|
|
189
|
+
"signalSharpness": "fails only when the target behavior is absent",
|
|
190
|
+
"reproductionRate": "1/1",
|
|
191
|
+
"attempts": [],
|
|
192
|
+
"blockedReason": ""
|
|
193
|
+
},
|
|
194
|
+
"behaviorEvidence": {
|
|
195
|
+
"status": "pass",
|
|
196
|
+
"userFacingBoundary": "feature action",
|
|
197
|
+
"expectedBehavior": "the user-visible behavior succeeds",
|
|
198
|
+
"actualBehavior": "verified by targeted test",
|
|
199
|
+
"reproductionSteps": [],
|
|
200
|
+
"consistency": "deterministic",
|
|
201
|
+
"domainLanguage": []
|
|
202
|
+
},
|
|
174
203
|
"regressionProof": [],
|
|
175
204
|
"testQuality": [],
|
|
176
205
|
"coverageAudit": {
|
|
@@ -193,6 +222,7 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
|
|
|
193
222
|
"issues": [],
|
|
194
223
|
"skipReason": "not a UI or user-path change"
|
|
195
224
|
},
|
|
225
|
+
"architectureFollowUps": [],
|
|
196
226
|
"tddException": null
|
|
197
227
|
},
|
|
198
228
|
"quickGates": [],
|
|
@@ -251,3 +281,4 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
|
|
|
251
281
|
4. `review.status` 是真实现实,还是我脑补的绿色?
|
|
252
282
|
5. 如果把这份 `report-card.json` 给下一位接手者,他知道接下来去哪吗?
|
|
253
283
|
6. diff review 是否同时覆盖了 plan completion、scope drift、critical pass、doc staleness?
|
|
284
|
+
7. feedback loop 是否真的证明了用户描述的行为,而不是只证明附近代码能跑?
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cc-check
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.10.1
|
|
4
4
|
description: Use when a planned or investigated change needs fresh verification evidence, layered gate proof, review truth, and an honest pass fail blocked verdict before entering cc-act.
|
|
5
5
|
triggers:
|
|
6
6
|
- 验收这个需求
|
|
@@ -25,7 +25,7 @@ entry_gate:
|
|
|
25
25
|
- Re-run fresh commands instead of inheriting cc-do narration.
|
|
26
26
|
- If evidence is stale or missing, reset context and rebuild the verdict from canonical artifacts.
|
|
27
27
|
exit_criteria:
|
|
28
|
-
- review/report-card.json records pass, fail, or blocked using fresh evidence, review freshness, claim evidence, QA coverage and browser evidence, failure ownership, plus spec alignment and sync readiness.
|
|
28
|
+
- review/report-card.json records pass, fail, or blocked using fresh evidence, review freshness, claim evidence, QA coverage and browser evidence, human UAT when applicable, named failure ownership, plus spec alignment and sync readiness.
|
|
29
29
|
- Task-level review and requirement-level diff review are separated clearly.
|
|
30
30
|
- 'The next step is unambiguous: cc-act, cc-do, cc-investigate, or cc-plan.'
|
|
31
31
|
reroutes:
|
|
@@ -120,6 +120,7 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
120
120
|
- task-level review proof
|
|
121
121
|
- requirement-level diff review
|
|
122
122
|
- claim evidence matrix
|
|
123
|
+
- QA feedback loop and behavior evidence
|
|
123
124
|
- QA regression / test-quality proof
|
|
124
125
|
- spec alignment / sync readiness
|
|
125
126
|
4. **Freeze Verdict**
|
|
@@ -138,7 +139,7 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
138
139
|
|
|
139
140
|
## Verification Layers
|
|
140
141
|
|
|
141
|
-
`cc-check` 不是只看“测试是不是绿的”,而是至少看
|
|
142
|
+
`cc-check` 不是只看“测试是不是绿的”,而是至少看 10 层:
|
|
142
143
|
|
|
143
144
|
1. **Runtime Layer**
|
|
144
145
|
- 测试、lint、typecheck、build、脚本 gate
|
|
@@ -154,6 +155,7 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
154
155
|
6. **QA Test Layer**
|
|
155
156
|
- 回归测试是否有 red/green 证据
|
|
156
157
|
- 测试是否验证真实行为,而不是 mock 或 test-only production API
|
|
158
|
+
- 反馈环是否能稳定复现或证明用户描述的行为
|
|
157
159
|
7. **Review Freshness Layer**
|
|
158
160
|
- review 是否绑定当前 `headSha`
|
|
159
161
|
- 从 review 到当前 HEAD 是否还有新增 commit
|
|
@@ -164,6 +166,15 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
164
166
|
9. **Failure Ownership Layer**
|
|
165
167
|
- 失败是本分支引入、基线已存在、环境阻塞,还是归属不明
|
|
166
168
|
- 归属不明默认不能支撑 `pass`
|
|
169
|
+
10. **Behavior Contract Layer**
|
|
170
|
+
- expected / actual / reproduction steps 是否用用户和领域语言写清
|
|
171
|
+
- follow-up 是否是行为契约,而不是易腐烂的文件行号 TODO
|
|
172
|
+
11. **Human UAT Layer**
|
|
173
|
+
- 人工验收是否 required、skipped with reason、pass、fail 或 blocked
|
|
174
|
+
- failed UAT 必须 reroute 到 `cc-do`、`cc-investigate` 或 `cc-plan`
|
|
175
|
+
12. **Named Error Layer**
|
|
176
|
+
- runtime failure 必须有 `errorName`、artifact refs、failure owner 和 rescue action
|
|
177
|
+
- invalid JSON、stale artifact、missing report 不能变成静默 `blocked`
|
|
167
178
|
|
|
168
179
|
任何一层失真,都不能写 `pass`。
|
|
169
180
|
|
|
@@ -187,13 +198,27 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
187
198
|
|
|
188
199
|
`cc-check` 必须区分“有测试”和“测试证明了正确行为”:
|
|
189
200
|
|
|
190
|
-
1.
|
|
191
|
-
2.
|
|
192
|
-
3.
|
|
193
|
-
4.
|
|
201
|
+
1. 先建立反馈环,再谈修复:failing test、curl / HTTP、CLI fixture、headless browser、trace replay、throwaway harness、bisect / differential loop 都可以,但必须说明速度、确定性、信号锋利度和复现率。
|
|
202
|
+
2. 回归测试必须记录 red/green 证据;red 要因为目标行为缺失而失败,不是语法、fixture 或 mock 写错。
|
|
203
|
+
3. 测试应从公共接口验证真实行为;不准为了方便直接测私有实现。
|
|
204
|
+
4. mock 只允许站在系统边界:外部 API、数据库、时间、随机数、文件系统、网络。mock 自家模块、断言内部调用次数或顺序,默认是 review finding。
|
|
205
|
+
5. 生产代码里新增仅测试使用的 API,默认是坏味道,必须 blocking,除非有明确生产生命周期理由。
|
|
206
|
+
6. 复杂 mock setup 超过测试主体时,优先要求 integration / contract test 解释。
|
|
207
|
+
7. test fixture 必须诚实表达 contract:partial fixture、generated stub、`as` / `any` / 双重 cast、缺字段 mock payload 都要说明真实字段与填充字段;如果这些技巧让测试绕过公共 seam 或隐藏错误输入,默认是 review finding。
|
|
208
|
+
8. 如果没有正确测试 seam,不要硬造脆弱测试;记录 `qa.architectureFollowUps`,说明缺失 seam / hidden coupling / shallow module,并按严重度决定 reroute 或 follow-up。
|
|
194
209
|
|
|
195
210
|
这些事实写入 `qa.regressionProof` 和 `qa.testQuality`。如果本需求没有行为测试空间,必须记录 `tddException` 或替代验证命令。
|
|
196
211
|
|
|
212
|
+
## QA Behavior Evidence
|
|
213
|
+
|
|
214
|
+
用户可见行为、bugfix、regression、工作流、CLI 行为和 API 行为都必须留下行为证据:
|
|
215
|
+
|
|
216
|
+
1. `qa.feedbackLoop` 记录本轮用什么 loop 证明现实,包含 `status`、`mode`、`commandOrArtifact`、`speed`、`determinism`、`signalSharpness`、`reproductionRate`、`attempts`、`blockedReason`。
|
|
217
|
+
2. `qa.behaviorEvidence` 记录 `userFacingBoundary`、`expectedBehavior`、`actualBehavior`、`reproductionSteps`、`consistency`、`domainLanguage`、`status`。
|
|
218
|
+
3. bugfix 不能只写“代码改了”;必须证明用户描述的原始症状已经被同一条或更可信的反馈环覆盖。
|
|
219
|
+
4. 不能复现时,verdict 默认 `blocked` 或回 `cc-investigate`,并写清尝试过哪些 loop、还缺什么 artifact / 权限 / 输入。
|
|
220
|
+
5. QA issue / follow-up 必须用行为和验收条件表达,不写易失效的文件路径或行号,除非它是当前 review finding 的证据位置。
|
|
221
|
+
|
|
197
222
|
## QA Coverage And Browser Evidence
|
|
198
223
|
|
|
199
224
|
测试不是数量游戏。`cc-check` 必须判断测试覆盖了哪条真实路径:
|
|
@@ -265,6 +290,13 @@ NO PASS WITHOUT FRESH EVIDENCE
|
|
|
265
290
|
4. `environment` 必须记录缺失依赖、权限、服务、密钥或平台约束。
|
|
266
291
|
5. `pass` 不能带未解释的 `in-branch` 或 `ambiguous` 失败。
|
|
267
292
|
|
|
293
|
+
每条 failure ownership 还必须命名:
|
|
294
|
+
|
|
295
|
+
- `errorName`:可搜索的错误名,例如 `MissingSpecReviewProof`
|
|
296
|
+
- `artifactRefs`:指向 report、manifest、checkpoint、日志或命令输出
|
|
297
|
+
- `rescueAction`:下一步救援动作,不写空泛“检查一下”
|
|
298
|
+
- `owner`:`branch` / `baseline` / `environment` / `external` / `unknown`
|
|
299
|
+
|
|
268
300
|
## Entry Gate
|
|
269
301
|
|
|
270
302
|
1. 先读 `planning/design.md` 或 `planning/analysis.md`,再读 `planning/tasks.md`、`planning/task-manifest.json`。
|