cc-devflow 4.5.2 → 4.5.3

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.
Files changed (76) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +13 -0
  2. package/.claude/skills/cc-act/PLAYBOOK.md +7 -1
  3. package/.claude/skills/cc-act/SKILL.md +22 -5
  4. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +15 -1
  5. package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +10 -1
  6. package/.claude/skills/cc-act/references/closure-contract.md +3 -0
  7. package/.claude/skills/cc-act/scripts/cc-act-common.sh +27 -1
  8. package/.claude/skills/cc-act/scripts/render-pr-brief.sh +31 -0
  9. package/.claude/skills/cc-act/scripts/verify-act-gate.sh +6 -0
  10. package/.claude/skills/cc-check/CHANGELOG.md +12 -0
  11. package/.claude/skills/cc-check/PLAYBOOK.md +34 -7
  12. package/.claude/skills/cc-check/SKILL.md +25 -6
  13. package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +43 -0
  14. package/.claude/skills/cc-check/references/gate-contract.md +11 -0
  15. package/.claude/skills/cc-check/references/review-contract.md +17 -1
  16. package/.claude/skills/cc-check/scripts/render-report-card.js +37 -0
  17. package/.claude/skills/cc-check/scripts/verify-gate.sh +7 -0
  18. package/.claude/skills/cc-do/CHANGELOG.md +12 -0
  19. package/.claude/skills/cc-do/PLAYBOOK.md +14 -9
  20. package/.claude/skills/cc-do/SKILL.md +24 -13
  21. package/.claude/skills/cc-do/references/execution-recovery.md +16 -5
  22. package/.claude/skills/cc-do/scripts/verify-task-gates.sh +19 -6
  23. package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +14 -2
  24. package/.claude/skills/cc-investigate/CHANGELOG.md +18 -0
  25. package/.claude/skills/cc-investigate/PLAYBOOK.md +28 -13
  26. package/.claude/skills/cc-investigate/SKILL.md +78 -20
  27. package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +38 -3
  28. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +9 -4
  29. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +41 -2
  30. package/.claude/skills/cc-investigate/references/investigation-contract.md +46 -0
  31. package/.claude/skills/cc-plan/CHANGELOG.md +26 -0
  32. package/.claude/skills/cc-plan/PLAYBOOK.md +18 -6
  33. package/.claude/skills/cc-plan/SKILL.md +72 -34
  34. package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +30 -3
  35. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +28 -0
  36. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +46 -1
  37. package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +24 -0
  38. package/.claude/skills/cc-plan/references/planning-contract.md +18 -4
  39. package/.claude/skills/cc-roadmap/CHANGELOG.md +14 -0
  40. package/.claude/skills/cc-roadmap/PLAYBOOK.md +10 -7
  41. package/.claude/skills/cc-roadmap/SKILL.md +43 -23
  42. package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +10 -0
  43. package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +15 -0
  44. package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +1 -1
  45. package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +11 -7
  46. package/.claude/skills/cc-simplify/CHANGELOG.md +6 -0
  47. package/.claude/skills/cc-simplify/SKILL.md +10 -1
  48. package/.claude/skills/cc-spec-init/CHANGELOG.md +6 -0
  49. package/.claude/skills/cc-spec-init/SKILL.md +14 -1
  50. package/CHANGELOG.md +21 -0
  51. package/README.md +10 -2
  52. package/README.zh-CN.md +10 -2
  53. package/docs/examples/example-bindings.json +7 -7
  54. package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
  55. package/docs/examples/full-design-blocked/README.md +1 -1
  56. package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
  57. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +1 -1
  58. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +1 -1
  59. package/docs/examples/full-design-blocked/roadmap-tracking.json +1 -1
  60. package/docs/examples/local-handoff/BACKLOG.md +1 -1
  61. package/docs/examples/local-handoff/README.md +1 -1
  62. package/docs/examples/local-handoff/ROADMAP.md +1 -1
  63. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +1 -1
  64. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +1 -1
  65. package/docs/examples/local-handoff/roadmap-tracking.json +1 -1
  66. package/docs/examples/pdca-loop/BACKLOG.md +1 -1
  67. package/docs/examples/pdca-loop/README.md +1 -1
  68. package/docs/examples/pdca-loop/ROADMAP.md +1 -1
  69. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +1 -1
  70. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +2 -2
  71. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +1 -1
  72. package/docs/examples/pdca-loop/roadmap-tracking.json +1 -1
  73. package/docs/skill-strategy-audit.md +48 -0
  74. package/lib/skill-runtime/__tests__/runtime.integration.test.js +19 -1
  75. package/lib/skill-runtime/schemas.js +11 -1
  76. package/package.json +1 -1
@@ -1,5 +1,18 @@
1
1
  # CC-Act Skill Changelog
2
2
 
3
+ ## v1.8.0 - 2026-04-28
4
+
5
+ - add remote state consistency rules for issue, PR, tracker, `needs-info`, and `ready-for-agent` closeout handoffs
6
+ - require dangerous git actions to have explicit ship semantics and user confirmation before reset, clean, branch deletion, or whole-tree restore
7
+ - require tooling changes to prove the real hook, adapt, publish, lint, or verification entrypoint still works
8
+
9
+ ## v1.7.0 - 2026-04-28
10
+
11
+ - carry cc-check QA feedback-loop and behavior evidence into PR briefs, handoffs, and release notes so ship materials preserve expected/actual/reproduction truth
12
+ - add durable follow-up brief rules for current behavior, desired behavior, key interfaces, acceptance criteria, and out-of-scope boundaries
13
+ - teach shared follow-up and evidence extraction to include report-card followup briefs and QA architecture follow-ups
14
+ - extend readiness dashboard guidance with feedback-loop quality and behavior evidence checks
15
+
3
16
  ## v1.6.4 - 2026-04-28
4
17
 
5
18
  - 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,7 @@ 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。
86
87
 
87
88
  ## Phase 3: Build Delivery Pack
88
89
 
@@ -114,8 +115,10 @@ Ship 必须属于这 4 种模式之一:
114
115
  - review packet path / summary
115
116
  - finding triage summary
116
117
  - QA / claim evidence summary
118
+ - QA behavior evidence and feedback-loop quality
117
119
  - readiness dashboard
118
120
  - PR body accuracy check
121
+ - Durable follow-up briefs: current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
119
122
 
120
123
  缺这些字段时,可以生成 local handoff,但不能声称 PR body 已经可 review。
121
124
 
@@ -183,6 +186,8 @@ Ship 必须属于这 4 种模式之一:
183
186
  - 长期方向写 `devflow/roadmap/roadmap.md`
184
187
  - 下一轮待排队动作写 `devflow/roadmap/backlog.md`
185
188
  - 不要把噪音和碎念回写成系统真相
189
+ - follow-up 必须是 durable brief:用领域语言写 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
190
+ - 独立行为拆独立条目;有依赖关系时写明顺序,方便下一轮并行或排队
186
191
 
187
192
  ## Phase 7: Declare The Next Entry
188
193
 
@@ -201,6 +206,7 @@ Ship 必须属于这 4 种模式之一:
201
206
  4. `cc-simplify`、单测、e2e、commit/push 的结果是不是都能追溯?
202
207
  5. PR body / release note / handoff / changelog 说的是不是同一套现实?
203
208
  6. readiness dashboard 有没有 blocker 或 stale warning?
209
+ 7. follow-up 是不是行为契约,而不是“改某文件某行”的易腐烂 TODO?
204
210
 
205
211
  如果第 1 或第 3 题答案不是“能”,说明 `cc-act` 仍然太重或太糊。
206
212
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cc-act
3
- version: 1.6.4
3
+ version: 1.8.0
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
@@ -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. 如果在 `cc-act` 期间因为 `cc-simplify`、单测、e2e、review 修复而改了代码,必须回 `cc-check`,不能带着旧证明继续 ship
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,9 @@ 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;只读配置文件不等于工具链可用。
216
220
 
217
221
  ## Readiness Dashboard
218
222
 
@@ -222,9 +226,11 @@ PR / handoff 之前必须把 readiness 压成一屏事实:
222
226
  2. Review quality:记录 `review.qualityScore`、specialist facet 覆盖、finding triage 摘要。
223
227
  3. QA coverage:记录 `qa.coverageAudit` 的 coverage、gaps、e2e/eval requirement。
224
228
  4. Browser QA:UI / 用户路径变更必须有 `qa.browserEvidence`,否则要有 skip reason。
225
- 5. Failure ownership:`runtime.failureOwnership` 不能有未解释的 `in-branch` `ambiguous` failure。
226
- 6. Documentation releaseREADME / CLAUDE / architecture / handoff / changelog 的同步状态必须可审计。
227
- 7. PR body accuracy:PR body 必须从当前 `pr-brief.md`、当前 diff、当前 report-card 重建;已有 PR body 只能被刷新,不能被继承。
229
+ 5. Feedback loop:bugfix / 行为变更必须有 `qa.feedbackLoop`,否则要有不可复现或不适用原因。
230
+ 6. Behavior evidenceexpected / actual / reproduction steps 必须能被 reviewer 独立理解。
231
+ 7. Failure ownership:`runtime.failureOwnership` 不能有未解释的 `in-branch` `ambiguous` failure。
232
+ 8. Documentation release:README / CLAUDE / architecture / handoff / changelog 的同步状态必须可审计。
233
+ 9. PR body accuracy:PR body 必须从当前 `pr-brief.md`、当前 diff、当前 report-card 重建;已有 PR body 只能被刷新,不能被继承。
228
234
 
229
235
  readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute 到 `cc-check` / `cc-do` 或生成 local handoff。
230
236
 
@@ -236,6 +242,7 @@ readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute
236
242
  2. 丢弃未合并工作必须要求用户显式确认;没有确认时只能转 `local-handoff`。
237
243
  3. branch cleanup 只发生在 merge / PR / discard 语义已经清楚之后。
238
244
  4. `post-merge-closeout` 必须记录 merged-result verification:命令、exit status、关键观察、失败时 reroute。
245
+ 5. 危险 Git 动作必须有明确 ship 语义:`git push` 只在 `create-pr` / `update-pr` / release lane 执行,`git reset --hard`、`git clean -f`、`git branch -D`、整树 restore/checkout 必须先列出对象并取得用户确认;没有确认时写 handoff,不执行。
239
246
 
240
247
  ## Documentation Release
241
248
 
@@ -249,6 +256,16 @@ readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute
249
256
  6. Discoverability:新增文档必须能从 README、CLAUDE 或 handoff 入口找到。
250
257
  7. TODO/backlog cleanup:只把有 diff 证据完成的事项移到 completed;新 follow-up 写回 backlog/roadmap。
251
258
 
259
+ ## Issue And Follow-Up Handoff
260
+
261
+ 当本次交付产生或更新 issue / PR / backlog follow-up 时,文案必须耐 refactor:
262
+
263
+ - 先写用户可观察行为:what happened / expected / reproduction 或 desired behavior。
264
+ - 再写 agent 可执行 contract:acceptance criteria、allowed scope、blocked by、verification command。
265
+ - 不把短期文件路径、行号、函数名写成长期事实;只有当前 reviewer 需要定位时才放进 PR brief 的实现备注。
266
+ - 多个 follow-up 必须按独立可验证切片拆开,并标明 `AFK` / `HITL`、blocked-by 和 owner。
267
+ - 已经问过或确认过的信息不能在 `needs-info` 里丢失;问题必须具体到 reporter 能直接补证据。
268
+
252
269
  ## Loop
253
270
 
254
271
  1. 先锁定 ship 事实:当前分支、base branch、PR 状态、requirement 状态。
@@ -39,6 +39,8 @@
39
39
  - Specialist review facets:
40
40
  - QA coverage:
41
41
  - Browser QA:
42
+ - Feedback loop:
43
+ - Behavior evidence:
42
44
  - Failure ownership:
43
45
  - Documentation release:
44
46
  - PR body accuracy:
@@ -57,6 +59,14 @@
57
59
  - Fresh evidence:
58
60
  - Merged-result verification:
59
61
 
62
+ ## QA Behavior Evidence
63
+
64
+ - Feedback loop:
65
+ - Expected behavior:
66
+ - Actual behavior:
67
+ - Reproduction steps:
68
+ - Consistency:
69
+
60
70
  ## Documentation Sync
61
71
 
62
72
  - `CLAUDE.md`:
@@ -81,7 +91,11 @@
81
91
 
82
92
  ## Follow-Ups
83
93
 
84
- -
94
+ - Current behavior:
95
+ - Desired behavior:
96
+ - Key interfaces:
97
+ - Acceptance criteria:
98
+ - Out of scope:
85
99
 
86
100
  ## Risks
87
101
 
@@ -20,10 +20,19 @@
20
20
 
21
21
  -
22
22
 
23
+ ## QA Behavior Evidence
24
+
25
+ - Feedback loop:
26
+ - User-visible behavior:
27
+ - Reproduction / verification path:
28
+
23
29
  ## Ops Notes
24
30
 
25
31
  -
26
32
 
27
33
  ## Follow-Ups
28
34
 
29
- -
35
+ - Current behavior:
36
+ - Desired behavior:
37
+ - Acceptance criteria:
38
+ - Out of scope:
@@ -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,17 @@
1
1
  # CC-Check Skill Changelog
2
2
 
3
+ ## v1.10.0 - 2026-04-28
4
+
5
+ - add test fixture honesty review for partial fixtures, generated stubs, casts, and missing mock payload fields
6
+ - require fixture shortcuts to preserve public seam behavior instead of hiding contract or input-shape problems
7
+
8
+ ## v1.9.0 - 2026-04-28
9
+
10
+ - add QA feedback-loop evidence so bugfix and behavior checks record reproduction mode, determinism, signal quality, and blocked loop reasons before a pass verdict
11
+ - add behavior evidence fields for expected behavior, actual behavior, reproduction steps, consistency, and domain language
12
+ - tighten test-quality review around public-interface tests, system-boundary mocks, and architecture follow-ups when no correct test seam exists
13
+ - update the report-card template, renderer, and gate validation for the new QA evidence shape while keeping older reports structurally compatible
14
+
3
15
  ## v1.8.4 - 2026-04-28
4
16
 
5
17
  - 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
@@ -69,11 +70,12 @@ NO PASS WITHOUT FRESH EVIDENCE
69
70
  2. Task review proof
70
71
  3. Requirement diff truth
71
72
  4. Claim evidence matrix
72
- 5. QA regression and test quality
73
- 6. QA coverage and browser evidence
74
- 7. Review freshness and confidence calibration
75
- 8. Failure ownership
76
- 9. Spec alignment and sync readiness
73
+ 5. QA feedback loop and behavior evidence
74
+ 6. QA regression and test quality
75
+ 7. QA coverage and browser evidence
76
+ 8. Review freshness and confidence calibration
77
+ 9. Failure ownership
78
+ 10. Spec alignment and sync readiness
77
79
 
78
80
  ## Claim Evidence Matrix
79
81
 
@@ -121,13 +123,16 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
121
123
 
122
124
  行为变化、bugfix、边界条件、用户可见流程必须补 `qa`:
123
125
 
126
+ - `feedbackLoop`:用什么 loop 证明现实,速度、确定性、信号锋利度、复现率如何
127
+ - `behaviorEvidence`:用户边界、expected / actual、复现步骤、稳定性、领域语言
124
128
  - `regressionProof`:red command、red failure reason、green command、是否恢复最终状态
125
- - `testQuality`:是否验证真实行为、mock 边界、是否存在 test-only production API
129
+ - `testQuality`:是否经公共接口验证真实行为、mock 是否只停在系统边界、是否存在 test-only production API
130
+ - `architectureFollowUps`:没有正确 test seam 时记录 seam / hidden coupling / shallow module 的后续改造
126
131
  - `tddException`:纯配置、生成文件、throwaway prototype 等例外和替代验证
127
132
  - `coverageAudit`:覆盖率、codepath / user-flow map、缺口、是否需要 e2e / eval、测试质量星级
128
133
  - `browserEvidence`:UI / 用户路径变更的 affected routes、截图、console、health score、issues,或明确 skip reason
129
134
 
130
- 测试只绿过一次,不能证明 regression test 有效;断言 mock 本身,不能证明真实行为。
135
+ 测试只绿过一次,不能证明 regression test 有效;断言 mock 本身,不能证明真实行为。没有可信反馈环时,`pass` 不成立。
131
136
 
132
137
  ## Failure Ownership
133
138
 
@@ -171,6 +176,26 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
171
176
  },
172
177
  "qa": {
173
178
  "status": "pass",
179
+ "feedbackLoop": {
180
+ "status": "pass",
181
+ "mode": "targeted-test",
182
+ "commandOrArtifact": "npm test -- src/feature/feature.test.ts",
183
+ "speed": "fast",
184
+ "determinism": "high",
185
+ "signalSharpness": "fails only when the target behavior is absent",
186
+ "reproductionRate": "1/1",
187
+ "attempts": [],
188
+ "blockedReason": ""
189
+ },
190
+ "behaviorEvidence": {
191
+ "status": "pass",
192
+ "userFacingBoundary": "feature action",
193
+ "expectedBehavior": "the user-visible behavior succeeds",
194
+ "actualBehavior": "verified by targeted test",
195
+ "reproductionSteps": [],
196
+ "consistency": "deterministic",
197
+ "domainLanguage": []
198
+ },
174
199
  "regressionProof": [],
175
200
  "testQuality": [],
176
201
  "coverageAudit": {
@@ -193,6 +218,7 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
193
218
  "issues": [],
194
219
  "skipReason": "not a UI or user-path change"
195
220
  },
221
+ "architectureFollowUps": [],
196
222
  "tddException": null
197
223
  },
198
224
  "quickGates": [],
@@ -251,3 +277,4 @@ review 还要带 `freshness`:`status`、`reviewedCommit`、`currentCommit`、`
251
277
  4. `review.status` 是真实现实,还是我脑补的绿色?
252
278
  5. 如果把这份 `report-card.json` 给下一位接手者,他知道接下来去哪吗?
253
279
  6. diff review 是否同时覆盖了 plan completion、scope drift、critical pass、doc staleness?
280
+ 7. feedback loop 是否真的证明了用户描述的行为,而不是只证明附近代码能跑?
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cc-check
3
- version: 1.8.4
3
+ version: 1.10.0
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
  - 验收这个需求
@@ -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` 不是只看“测试是不是绿的”,而是至少看 9 层:
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,9 @@ 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
167
172
 
168
173
  任何一层失真,都不能写 `pass`。
169
174
 
@@ -187,13 +192,27 @@ NO PASS WITHOUT FRESH EVIDENCE
187
192
 
188
193
  `cc-check` 必须区分“有测试”和“测试证明了正确行为”:
189
194
 
190
- 1. 回归测试必须记录 red/green 证据;red 要因为目标行为缺失而失败,不是语法、fixture mock 写错。
191
- 2. 测试应验证真实行为;如果依赖 mock,必须说明 mock 的边界和为什么不会测试 mock 本身。
192
- 3. 生产代码里新增仅测试使用的 API,默认是坏味道,必须 blocking,除非有明确生产生命周期理由。
193
- 4. 复杂 mock setup 超过测试主体时,优先要求 integration / contract test 解释。
195
+ 1. 先建立反馈环,再谈修复:failing test、curl / HTTP、CLI fixture、headless browser、trace replay、throwaway harness、bisect / differential loop 都可以,但必须说明速度、确定性、信号锋利度和复现率。
196
+ 2. 回归测试必须记录 red/green 证据;red 要因为目标行为缺失而失败,不是语法、fixture mock 写错。
197
+ 3. 测试应从公共接口验证真实行为;不准为了方便直接测私有实现。
198
+ 4. mock 只允许站在系统边界:外部 API、数据库、时间、随机数、文件系统、网络。mock 自家模块、断言内部调用次数或顺序,默认是 review finding。
199
+ 5. 生产代码里新增仅测试使用的 API,默认是坏味道,必须 blocking,除非有明确生产生命周期理由。
200
+ 6. 复杂 mock setup 超过测试主体时,优先要求 integration / contract test 解释。
201
+ 7. test fixture 必须诚实表达 contract:partial fixture、generated stub、`as` / `any` / 双重 cast、缺字段 mock payload 都要说明真实字段与填充字段;如果这些技巧让测试绕过公共 seam 或隐藏错误输入,默认是 review finding。
202
+ 8. 如果没有正确测试 seam,不要硬造脆弱测试;记录 `qa.architectureFollowUps`,说明缺失 seam / hidden coupling / shallow module,并按严重度决定 reroute 或 follow-up。
194
203
 
195
204
  这些事实写入 `qa.regressionProof` 和 `qa.testQuality`。如果本需求没有行为测试空间,必须记录 `tddException` 或替代验证命令。
196
205
 
206
+ ## QA Behavior Evidence
207
+
208
+ 用户可见行为、bugfix、regression、工作流、CLI 行为和 API 行为都必须留下行为证据:
209
+
210
+ 1. `qa.feedbackLoop` 记录本轮用什么 loop 证明现实,包含 `status`、`mode`、`commandOrArtifact`、`speed`、`determinism`、`signalSharpness`、`reproductionRate`、`attempts`、`blockedReason`。
211
+ 2. `qa.behaviorEvidence` 记录 `userFacingBoundary`、`expectedBehavior`、`actualBehavior`、`reproductionSteps`、`consistency`、`domainLanguage`、`status`。
212
+ 3. bugfix 不能只写“代码改了”;必须证明用户描述的原始症状已经被同一条或更可信的反馈环覆盖。
213
+ 4. 不能复现时,verdict 默认 `blocked` 或回 `cc-investigate`,并写清尝试过哪些 loop、还缺什么 artifact / 权限 / 输入。
214
+ 5. QA issue / follow-up 必须用行为和验收条件表达,不写易失效的文件路径或行号,除非它是当前 review finding 的证据位置。
215
+
197
216
  ## QA Coverage And Browser Evidence
198
217
 
199
218
  测试不是数量游戏。`cc-check` 必须判断测试覆盖了哪条真实路径:
@@ -42,6 +42,32 @@
42
42
  ],
43
43
  "qa": {
44
44
  "status": "blocked",
45
+ "feedbackLoop": {
46
+ "status": "blocked",
47
+ "mode": "targeted-test",
48
+ "commandOrArtifact": "npm test -- src/feature/feature.test.ts",
49
+ "speed": "fast",
50
+ "determinism": "high",
51
+ "signalSharpness": "targeted failure would indicate the user-visible behavior regressed",
52
+ "reproductionRate": "not recorded",
53
+ "attempts": [
54
+ "targeted unit test"
55
+ ],
56
+ "blockedReason": "red/green reproduction is not recorded yet"
57
+ },
58
+ "behaviorEvidence": {
59
+ "status": "blocked",
60
+ "userFacingBoundary": "feature behavior",
61
+ "expectedBehavior": "target behavior succeeds for the user",
62
+ "actualBehavior": "not proven yet",
63
+ "reproductionSteps": [
64
+ "run the targeted verification command"
65
+ ],
66
+ "consistency": "not recorded",
67
+ "domainLanguage": [
68
+ "feature behavior"
69
+ ]
70
+ },
45
71
  "regressionProof": [
46
72
  {
47
73
  "behavior": "original symptom",
@@ -81,6 +107,23 @@
81
107
  "issues": [],
82
108
  "skipReason": "template example is not a UI browser QA scenario"
83
109
  },
110
+ "architectureFollowUps": [
111
+ {
112
+ "summary": "Add the missing public test seam before widening coverage",
113
+ "currentBehavior": "review proof depends on task metadata instead of a direct behavior seam",
114
+ "desiredBehavior": "tests verify the behavior through a stable public interface",
115
+ "keyInterfaces": [
116
+ "feature public API"
117
+ ],
118
+ "acceptanceCriteria": [
119
+ "target behavior can be reproduced without private implementation hooks"
120
+ ],
121
+ "outOfScope": [
122
+ "rewriting unrelated modules"
123
+ ],
124
+ "status": "deferred-minor"
125
+ }
126
+ ],
84
127
  "tddException": null
85
128
  },
86
129
  "quickGates": [
@@ -16,6 +16,17 @@
16
16
 
17
17
  所有通过结论都必须来自本次新鲜证据;旧输出只能当线索,不能直接继承 verdict。
18
18
 
19
+ ## QA Feedback Loop
20
+
21
+ 行为变更和 bugfix 的 evidence 还必须说明反馈环:
22
+
23
+ - `mode`:failing test、curl / HTTP、CLI fixture、browser、trace replay、bisect、differential loop 等
24
+ - `determinism`:反馈是否稳定,flaky 时复现率是多少
25
+ - `signalSharpness`:失败是否指向目标行为,而不是语法、fixture 或 mock 问题
26
+ - `blockedReason`:无法建立 loop 时缺少什么 artifact、权限、服务或输入
27
+
28
+ 没有可信 loop 的 bugfix 默认不能 `pass`。
29
+
19
30
  ## Reroute
20
31
 
21
32
  - `none`
@@ -98,15 +98,29 @@ Review finding 不只是“发现过”,必须有处置结果:
98
98
 
99
99
  Review 必须判断测试是否证明行为:
100
100
 
101
+ - 反馈环是否可信:速度、确定性、信号锋利度、复现率是否足够支撑结论
102
+ - bugfix 是否复现并覆盖了用户描述的原始症状,而不是附近的另一个失败
103
+ - expected / actual / reproduction steps 是否能让 reviewer 独立复现或判断缺件
101
104
  - 回归测试是否有 red/green 证据
102
105
  - red 是否因为目标行为缺失而失败
103
106
  - green 是否包含 targeted test 和必要的 broader gate
104
- - mock 是否必要,且没有断言 mock 本身
107
+ - 测试是否通过公共接口覆盖行为
108
+ - mock 是否只停在系统边界,且没有断言 mock 本身或内部调用顺序
105
109
  - 生产代码是否新增 test-only API
106
110
  - integration / contract test 是否比复杂 mock 更直接
111
+ - 如果没有正确测试 seam,是否记录了架构 follow-up,而不是造易碎测试
107
112
  - coverage audit 是否映射真实 codepath / user flow / error state / edge case
108
113
  - UI 或用户路径变更是否有 browser evidence、截图、console 结果,或明确 skip reason
109
114
 
115
+ ## Durable Follow-Up Facts
116
+
117
+ Review 产生的 QA issue 或 follow-up 必须可长期执行:
118
+
119
+ - 用领域语言描述用户或系统行为,不把当前文件路径 / 行号当成唯一真相
120
+ - 写清 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
121
+ - 独立行为拆成独立条目;有依赖关系时写明顺序
122
+ - `deferred-minor` 只能用于不阻塞本次交付的 minor 项,并且必须进入 `cc-act` follow-up writeback
123
+
110
124
  ## Failure Ownership
111
125
 
112
126
  失败归属必须结构化写入 `runtime.failureOwnership[]`:
@@ -125,6 +139,8 @@ Review 必须判断测试是否证明行为:
125
139
  - `important` / `critical` finding 未处理前,不算通过
126
140
  - `important` / `critical` finding 缺 triageStatus,不算通过
127
141
  - QA test quality 缺失且本次涉及行为变化,至少是 `blocked`
142
+ - 行为变更缺 `qa.feedbackLoop` / `qa.behaviorEvidence` 且没有明确例外,至少是 `blocked`
143
+ - bugfix 没有复现原始症状,也没有解释不可复现原因,不能通过
128
144
  - review freshness 缺失、过期或与当前 head 不一致,不能绿灯
129
145
  - UI / 用户路径变更缺 browser evidence 且无 skip reason,不能绿灯
130
146
  - `runtime.failureOwnership` 仍有 `in-branch` 或 `ambiguous` 未解释失败,不能绿灯