cc-devflow 4.5.9 → 4.5.11

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 (122) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +11 -0
  2. package/.claude/skills/cc-act/SKILL.md +19 -10
  3. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +1 -1
  4. package/.claude/skills/cc-act/references/closure-contract.md +1 -1
  5. package/.claude/skills/cc-act/references/git-commit-guidelines.md +1 -1
  6. package/.claude/skills/cc-check/CHANGELOG.md +23 -0
  7. package/.claude/skills/cc-check/PLAYBOOK.md +1 -0
  8. package/.claude/skills/cc-check/SKILL.md +15 -9
  9. package/.claude/skills/cc-check/references/review-contract.md +7 -0
  10. package/.claude/skills/cc-check/scripts/render-report-card.js +6 -1
  11. package/.claude/skills/cc-dev/CHANGELOG.md +10 -0
  12. package/.claude/skills/cc-dev/SKILL.md +34 -2
  13. package/.claude/skills/cc-do/CHANGELOG.md +18 -0
  14. package/.claude/skills/cc-do/PLAYBOOK.md +7 -7
  15. package/.claude/skills/cc-do/SKILL.md +47 -40
  16. package/.claude/skills/cc-do/references/execution-recovery.md +18 -13
  17. package/.claude/skills/cc-do/scripts/build-task-context.sh +4 -17
  18. package/.claude/skills/cc-do/scripts/record-review-decision.sh +4 -5
  19. package/.claude/skills/cc-do/scripts/recover-workflow.sh +9 -11
  20. package/.claude/skills/cc-do/scripts/verify-task-gates.sh +12 -10
  21. package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +7 -29
  22. package/.claude/skills/cc-investigate/CHANGELOG.md +24 -0
  23. package/.claude/skills/cc-investigate/PLAYBOOK.md +10 -9
  24. package/.claude/skills/cc-investigate/SKILL.md +163 -417
  25. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +56 -10
  26. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +6 -6
  27. package/.claude/skills/cc-investigate/assets/{ANALYSIS_TEMPLATE.md → legacy/ANALYSIS_TEMPLATE.md} +1 -0
  28. package/.claude/skills/cc-investigate/references/investigation-contract.md +5 -4
  29. package/.claude/skills/cc-investigate/scripts/bootstrap-analysis.sh +1 -1
  30. package/.claude/skills/cc-plan/CHANGELOG.md +32 -0
  31. package/.claude/skills/cc-plan/PLAYBOOK.md +55 -53
  32. package/.claude/skills/cc-plan/SKILL.md +209 -536
  33. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +50 -14
  34. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +5 -4
  35. package/.claude/skills/cc-plan/assets/{DESIGN_TEMPLATE.md → legacy/DESIGN_TEMPLATE.md} +1 -0
  36. package/.claude/skills/cc-plan/assets/{TINY_DESIGN_TEMPLATE.md → legacy/TINY_DESIGN_TEMPLATE.md} +1 -1
  37. package/.claude/skills/cc-plan/references/planning-contract.md +12 -10
  38. package/.claude/skills/cc-review/CHANGELOG.md +6 -0
  39. package/.claude/skills/cc-review/PLAYBOOK.md +9 -11
  40. package/.claude/skills/cc-review/SKILL.md +37 -61
  41. package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +1 -1
  42. package/.claude/skills/cc-review/references/implementation-review-branch.md +5 -5
  43. package/.claude/skills/cc-review/references/plan-review-branch.md +1 -1
  44. package/.claude/skills/cc-review/references/review-methods.md +4 -4
  45. package/.claude/skills/cc-review/scripts/collect-review-context.sh +14 -7
  46. package/CHANGELOG.md +30 -0
  47. package/CONTRIBUTING.md +40 -4
  48. package/CONTRIBUTING.zh-CN.md +40 -4
  49. package/README.md +22 -8
  50. package/README.zh-CN.md +22 -8
  51. package/bin/cc-devflow-cli.js +293 -36
  52. package/docs/examples/START-HERE.md +6 -4
  53. package/docs/examples/example-bindings.json +8 -8
  54. package/docs/examples/full-design-blocked/README.md +2 -2
  55. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +2 -1
  56. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +3 -2
  57. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +11 -8
  58. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +4 -4
  59. package/docs/examples/local-handoff/README.md +2 -2
  60. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +2 -1
  61. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +3 -2
  62. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +9 -6
  63. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +1 -1
  64. package/docs/examples/pdca-loop/README.md +2 -2
  65. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +2 -2
  66. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +2 -1
  67. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +2 -1
  68. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +9 -6
  69. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +1 -1
  70. package/docs/examples/scripts/check-example-bindings.sh +2 -0
  71. package/docs/get-shit-done-strategy-audit.md +22 -22
  72. package/docs/guides/artifact-contract.md +5 -1
  73. package/docs/guides/getting-started.md +11 -8
  74. package/docs/guides/getting-started.zh-CN.md +11 -8
  75. package/docs/guides/minimize-artifacts.md +137 -0
  76. package/lib/compiler/__tests__/skills-registry.test.js +2 -2
  77. package/lib/skill-runtime/CLAUDE.md +1 -1
  78. package/lib/skill-runtime/__tests__/autopilot.test.js +42 -6
  79. package/lib/skill-runtime/__tests__/benchmark-artifacts.test.js +165 -0
  80. package/lib/skill-runtime/__tests__/benchmark-skills.test.js +109 -0
  81. package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +2 -2
  82. package/lib/skill-runtime/__tests__/dispatch.test.js +8 -38
  83. package/lib/skill-runtime/__tests__/intent.test.js +4 -20
  84. package/lib/skill-runtime/__tests__/lifecycle.test.js +1 -1
  85. package/lib/skill-runtime/__tests__/paths.test.js +7 -1
  86. package/lib/skill-runtime/__tests__/planner.tdd.test.js +61 -0
  87. package/lib/skill-runtime/__tests__/prepare-pr.test.js +3 -16
  88. package/lib/skill-runtime/__tests__/query.test.js +388 -7
  89. package/lib/skill-runtime/__tests__/review-check-integration.test.js +148 -0
  90. package/lib/skill-runtime/__tests__/review-records.test.js +619 -0
  91. package/lib/skill-runtime/__tests__/runtime.integration.test.js +64 -23
  92. package/lib/skill-runtime/__tests__/schemas.test.js +43 -0
  93. package/lib/skill-runtime/__tests__/task-contract-migrate.test.js +137 -0
  94. package/lib/skill-runtime/__tests__/task-contract.test.js +874 -0
  95. package/lib/skill-runtime/__tests__/verify-artifacts.test.js +203 -0
  96. package/lib/skill-runtime/__tests__/worker-run.test.js +4 -11
  97. package/lib/skill-runtime/__tests__/workflow-context-legacy-fallback.test.js +31 -0
  98. package/lib/skill-runtime/__tests__/workflow-context.test.js +98 -0
  99. package/lib/skill-runtime/artifacts.js +0 -5
  100. package/lib/skill-runtime/context-index.js +545 -0
  101. package/lib/skill-runtime/intent.js +9 -33
  102. package/lib/skill-runtime/lifecycle.js +1 -1
  103. package/lib/skill-runtime/operations/CLAUDE.md +2 -2
  104. package/lib/skill-runtime/operations/dispatch.js +4 -42
  105. package/lib/skill-runtime/operations/init.js +2 -6
  106. package/lib/skill-runtime/operations/janitor.js +2 -18
  107. package/lib/skill-runtime/operations/resume.js +21 -38
  108. package/lib/skill-runtime/operations/review-records.js +265 -0
  109. package/lib/skill-runtime/operations/snapshot.js +1 -1
  110. package/lib/skill-runtime/operations/task-contract.js +593 -0
  111. package/lib/skill-runtime/operations/worker-run.js +2 -30
  112. package/lib/skill-runtime/paths.js +4 -4
  113. package/lib/skill-runtime/planner.js +24 -11
  114. package/lib/skill-runtime/query-registry.js +2 -2
  115. package/lib/skill-runtime/query.js +15 -2
  116. package/lib/skill-runtime/review-records.js +123 -0
  117. package/lib/skill-runtime/review.js +246 -11
  118. package/lib/skill-runtime/schemas.js +174 -12
  119. package/lib/skill-runtime/store.js +0 -10
  120. package/lib/skill-runtime/task-contract.js +188 -0
  121. package/lib/skill-runtime/workflow-context.js +748 -0
  122. package/package.json +6 -2
@@ -60,6 +60,8 @@ Commands:
60
60
  config doctor Validate config and local ignore safety
61
61
  query list List typed runtime query ids
62
62
  query <id> Run a typed runtime query as JSON
63
+ task-contract Compile task contract artifacts
64
+ review Record durable review ledger events
63
65
  next-change-key Compute the next REQ/FIX change key
64
66
  archive-change Archive a completed change to devflow/changes/archive/YYYY-MM/
65
67
  restore-change Restore an archived change back to devflow/changes/
@@ -94,6 +96,9 @@ Query options:
94
96
  --change <id> Change id, for example REQ-123
95
97
  --change-id <id> Alias for --change
96
98
  --change-key <key> Full change key, for example REQ-123-my-feature
99
+ --data-only Print only the query data payload when the query succeeds
100
+ --no-trace Omit trace metadata from the JSON output
101
+ --compact Print minified JSON instead of pretty JSON
97
102
 
98
103
  Next-change-key options:
99
104
  --prefix <REQ|FIX> Change type prefix (required)
@@ -111,7 +116,10 @@ Examples:
111
116
  cc-devflow config resolve --cwd /path/to/project --format policy
112
117
  cc-devflow query list
113
118
  cc-devflow query ship-readiness --cwd /path/to/project --change REQ-123
119
+ cc-devflow query workflow-context --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature --data-only --no-trace --compact
114
120
  cc-devflow query progress --change REQ-123 --change-key REQ-123-my-feature
121
+ cc-devflow task-contract compile --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature
122
+ cc-devflow review start --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature --base-sha abc --head-sha def
115
123
  `);
116
124
  }
117
125
 
@@ -456,56 +464,51 @@ function runConfig(args) {
456
464
  return 0;
457
465
  }
458
466
 
459
- function parseQueryArgs(args) {
467
+ function parseChangeScopedArgs(args, options = {}) {
468
+ const { allowQueryFlags = false } = options;
460
469
  const parsed = {
461
470
  cwd: null,
462
471
  changeId: null,
463
472
  changeKey: null,
473
+ compact: false,
474
+ dataOnly: false,
475
+ noTrace: false,
464
476
  rest: []
465
477
  };
466
478
 
467
479
  for (let i = 0; i < args.length; i++) {
468
480
  const arg = args[i];
469
481
 
470
- if (arg === '--cwd') {
471
- parsed.cwd = args[++i];
472
- continue;
473
- }
474
-
475
- if (arg.startsWith('--cwd=')) {
476
- parsed.cwd = arg.slice('--cwd='.length);
477
- continue;
478
- }
479
-
480
- if (arg === '--change' || arg === '--change-id') {
481
- parsed.changeId = args[++i];
482
- continue;
483
- }
484
-
485
- if (arg.startsWith('--change=')) {
486
- parsed.changeId = arg.slice('--change='.length);
487
- continue;
488
- }
482
+ if (arg === '--cwd') { parsed.cwd = args[++i]; continue; }
483
+ if (arg.startsWith('--cwd=')) { parsed.cwd = arg.slice('--cwd='.length); continue; }
484
+ if (arg === '--change' || arg === '--change-id') { parsed.changeId = args[++i]; continue; }
485
+ if (arg.startsWith('--change=')) { parsed.changeId = arg.slice('--change='.length); continue; }
486
+ if (arg.startsWith('--change-id=')) { parsed.changeId = arg.slice('--change-id='.length); continue; }
487
+ if (arg === '--change-key') { parsed.changeKey = args[++i]; continue; }
488
+ if (arg.startsWith('--change-key=')) { parsed.changeKey = arg.slice('--change-key='.length); continue; }
489
+ if (allowQueryFlags && arg === '--compact') { parsed.compact = true; continue; }
490
+ if (allowQueryFlags && arg === '--data-only') { parsed.dataOnly = true; continue; }
491
+ if (allowQueryFlags && arg === '--no-trace') { parsed.noTrace = true; continue; }
489
492
 
490
- if (arg.startsWith('--change-id=')) {
491
- parsed.changeId = arg.slice('--change-id='.length);
492
- continue;
493
- }
493
+ parsed.rest.push(arg);
494
+ }
494
495
 
495
- if (arg === '--change-key') {
496
- parsed.changeKey = args[++i];
497
- continue;
498
- }
496
+ return parsed;
497
+ }
499
498
 
500
- if (arg.startsWith('--change-key=')) {
501
- parsed.changeKey = arg.slice('--change-key='.length);
502
- continue;
503
- }
499
+ function formatQueryResult(result, options) {
500
+ let output = result;
504
501
 
505
- parsed.rest.push(arg);
502
+ if (options.dataOnly && result.ok) {
503
+ output = result.data;
504
+ } else if (options.noTrace && output && typeof output === 'object') {
505
+ const { trace, ...withoutTrace } = output;
506
+ output = withoutTrace;
506
507
  }
507
508
 
508
- return parsed;
509
+ return options.compact
510
+ ? JSON.stringify(output)
511
+ : JSON.stringify(output, null, 2);
509
512
  }
510
513
 
511
514
  async function runQueryCommand(args) {
@@ -521,7 +524,7 @@ async function runQueryCommand(args) {
521
524
  return 0;
522
525
  }
523
526
 
524
- const options = parseQueryArgs(rest);
527
+ const options = parseChangeScopedArgs(rest, { allowQueryFlags: true });
525
528
  if (!options.changeId) {
526
529
  console.error('Query --change is required.');
527
530
  return 3;
@@ -533,10 +536,256 @@ async function runQueryCommand(args) {
533
536
  changeKey: options.changeKey
534
537
  });
535
538
 
536
- process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
539
+ process.stdout.write(`${formatQueryResult(result, options)}\n`);
537
540
  return result.ok ? 0 : 2;
538
541
  }
539
542
 
543
+ async function runTaskContractCommand(args) {
544
+ const [subcommand, ...rest] = args;
545
+
546
+ if (!subcommand || subcommand === '--help' || subcommand === '-h') {
547
+ console.error('Use: cc-devflow task-contract <compile|validate|migrate> --change <changeId> [--change-key <key>] [--cwd <path>] [--fold-design] [--fold-analysis]');
548
+ return 3;
549
+ }
550
+
551
+ const options = parseChangeScopedArgs(rest);
552
+ if (!options.changeId) {
553
+ console.error('task-contract --change is required.');
554
+ return 3;
555
+ }
556
+
557
+ if (subcommand === 'compile' || subcommand === 'validate' || subcommand === 'migrate') {
558
+ const {
559
+ runCompile,
560
+ runValidate,
561
+ runMigrate
562
+ } = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/operations/task-contract.js'));
563
+ const runners = {
564
+ compile: runCompile,
565
+ validate: runValidate,
566
+ migrate: runMigrate
567
+ };
568
+ const runner = runners[subcommand];
569
+ const result = await runner({
570
+ repoRoot: path.resolve(options.cwd || process.cwd()),
571
+ changeId: options.changeId,
572
+ changeKey: options.changeKey,
573
+ foldDesign: options.rest.includes('--fold-design'),
574
+ foldAnalysis: options.rest.includes('--fold-analysis')
575
+ });
576
+ if (result.code !== 0) {
577
+ console.error(result.stderr || result.error || `task-contract ${subcommand} failed`);
578
+ return result.code;
579
+ }
580
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
581
+ return result.code;
582
+ }
583
+
584
+ console.error(`Unknown task-contract command: ${subcommand}`);
585
+ return 3;
586
+ }
587
+
588
+ function parseReviewStartArgs(args) {
589
+ const scoped = parseChangeScopedArgs(args);
590
+ const parsed = {
591
+ ...scoped,
592
+ mode: 'implementation',
593
+ scope: 'current-diff',
594
+ baseSha: 'unknown',
595
+ headSha: 'unknown',
596
+ selectedNodes: [],
597
+ skippedNodes: [],
598
+ riskLanes: []
599
+ };
600
+
601
+ for (let i = 0; i < scoped.rest.length; i++) {
602
+ const arg = scoped.rest[i];
603
+ if (arg === '--mode') { parsed.mode = scoped.rest[++i]; continue; }
604
+ if (arg.startsWith('--mode=')) { parsed.mode = arg.slice('--mode='.length); continue; }
605
+ if (arg === '--scope') { parsed.scope = scoped.rest[++i]; continue; }
606
+ if (arg.startsWith('--scope=')) { parsed.scope = arg.slice('--scope='.length); continue; }
607
+ if (arg === '--base-sha') { parsed.baseSha = scoped.rest[++i]; continue; }
608
+ if (arg.startsWith('--base-sha=')) { parsed.baseSha = arg.slice('--base-sha='.length); continue; }
609
+ if (arg === '--head-sha') { parsed.headSha = scoped.rest[++i]; continue; }
610
+ if (arg.startsWith('--head-sha=')) { parsed.headSha = arg.slice('--head-sha='.length); continue; }
611
+ if (arg === '--selected-node') { parsed.selectedNodes.push(scoped.rest[++i]); continue; }
612
+ if (arg.startsWith('--selected-node=')) { parsed.selectedNodes.push(arg.slice('--selected-node='.length)); continue; }
613
+ if (arg === '--skipped-node') { parsed.skippedNodes.push(scoped.rest[++i]); continue; }
614
+ if (arg.startsWith('--skipped-node=')) { parsed.skippedNodes.push(arg.slice('--skipped-node='.length)); continue; }
615
+ if (arg === '--risk-lane') { parsed.riskLanes.push(scoped.rest[++i]); continue; }
616
+ if (arg.startsWith('--risk-lane=')) { parsed.riskLanes.push(arg.slice('--risk-lane='.length)); continue; }
617
+ }
618
+
619
+ return parsed;
620
+ }
621
+
622
+ function parseReviewEventArgs(args) {
623
+ const scoped = parseChangeScopedArgs(args);
624
+ const parsed = {
625
+ ...scoped,
626
+ reviewId: null,
627
+ nodeId: null,
628
+ mode: 'implementation',
629
+ target: null,
630
+ status: null,
631
+ coverage: [],
632
+ evidenceRefs: [],
633
+ findings: [],
634
+ next: null,
635
+ findingId: null,
636
+ severity: null,
637
+ confidence: null,
638
+ displayTier: null,
639
+ fingerprint: null,
640
+ scope: null,
641
+ path: null,
642
+ evidence: null,
643
+ recommendation: null,
644
+ route: null,
645
+ blockingCount: null,
646
+ warningCount: null,
647
+ output: null
648
+ };
649
+
650
+ for (let i = 0; i < scoped.rest.length; i++) {
651
+ const arg = scoped.rest[i];
652
+ if (arg === '--review-id') { parsed.reviewId = scoped.rest[++i]; continue; }
653
+ if (arg.startsWith('--review-id=')) { parsed.reviewId = arg.slice('--review-id='.length); continue; }
654
+ if (arg === '--node-id') { parsed.nodeId = scoped.rest[++i]; continue; }
655
+ if (arg.startsWith('--node-id=')) { parsed.nodeId = arg.slice('--node-id='.length); continue; }
656
+ if (arg === '--mode') { parsed.mode = scoped.rest[++i]; continue; }
657
+ if (arg.startsWith('--mode=')) { parsed.mode = arg.slice('--mode='.length); continue; }
658
+ if (arg === '--target') { parsed.target = scoped.rest[++i]; continue; }
659
+ if (arg.startsWith('--target=')) { parsed.target = arg.slice('--target='.length); continue; }
660
+ if (arg === '--status') { parsed.status = scoped.rest[++i]; continue; }
661
+ if (arg.startsWith('--status=')) { parsed.status = arg.slice('--status='.length); continue; }
662
+ if (arg === '--coverage') { parsed.coverage.push(scoped.rest[++i]); continue; }
663
+ if (arg.startsWith('--coverage=')) { parsed.coverage.push(arg.slice('--coverage='.length)); continue; }
664
+ if (arg === '--evidence-ref') { parsed.evidenceRefs.push(scoped.rest[++i]); continue; }
665
+ if (arg.startsWith('--evidence-ref=')) { parsed.evidenceRefs.push(arg.slice('--evidence-ref='.length)); continue; }
666
+ if (arg === '--finding') { parsed.findings.push(scoped.rest[++i]); continue; }
667
+ if (arg.startsWith('--finding=')) { parsed.findings.push(arg.slice('--finding='.length)); continue; }
668
+ if (arg === '--next') { parsed.next = scoped.rest[++i]; continue; }
669
+ if (arg.startsWith('--next=')) { parsed.next = arg.slice('--next='.length); continue; }
670
+ if (arg === '--finding-id') { parsed.findingId = scoped.rest[++i]; continue; }
671
+ if (arg.startsWith('--finding-id=')) { parsed.findingId = arg.slice('--finding-id='.length); continue; }
672
+ if (arg === '--severity') { parsed.severity = scoped.rest[++i]; continue; }
673
+ if (arg.startsWith('--severity=')) { parsed.severity = arg.slice('--severity='.length); continue; }
674
+ if (arg === '--confidence') { parsed.confidence = scoped.rest[++i]; continue; }
675
+ if (arg.startsWith('--confidence=')) { parsed.confidence = arg.slice('--confidence='.length); continue; }
676
+ if (arg === '--display-tier') { parsed.displayTier = scoped.rest[++i]; continue; }
677
+ if (arg.startsWith('--display-tier=')) { parsed.displayTier = arg.slice('--display-tier='.length); continue; }
678
+ if (arg === '--fingerprint') { parsed.fingerprint = scoped.rest[++i]; continue; }
679
+ if (arg.startsWith('--fingerprint=')) { parsed.fingerprint = arg.slice('--fingerprint='.length); continue; }
680
+ if (arg === '--scope') { parsed.scope = scoped.rest[++i]; continue; }
681
+ if (arg.startsWith('--scope=')) { parsed.scope = arg.slice('--scope='.length); continue; }
682
+ if (arg === '--path') { parsed.path = scoped.rest[++i]; continue; }
683
+ if (arg.startsWith('--path=')) { parsed.path = arg.slice('--path='.length); continue; }
684
+ if (arg === '--evidence') { parsed.evidence = scoped.rest[++i]; continue; }
685
+ if (arg.startsWith('--evidence=')) { parsed.evidence = arg.slice('--evidence='.length); continue; }
686
+ if (arg === '--recommendation') { parsed.recommendation = scoped.rest[++i]; continue; }
687
+ if (arg.startsWith('--recommendation=')) { parsed.recommendation = arg.slice('--recommendation='.length); continue; }
688
+ if (arg === '--route') { parsed.route = scoped.rest[++i]; continue; }
689
+ if (arg.startsWith('--route=')) { parsed.route = arg.slice('--route='.length); continue; }
690
+ if (arg === '--blocking-count') { parsed.blockingCount = scoped.rest[++i]; continue; }
691
+ if (arg.startsWith('--blocking-count=')) { parsed.blockingCount = arg.slice('--blocking-count='.length); continue; }
692
+ if (arg === '--warning-count') { parsed.warningCount = scoped.rest[++i]; continue; }
693
+ if (arg.startsWith('--warning-count=')) { parsed.warningCount = arg.slice('--warning-count='.length); continue; }
694
+ if (arg === '--output') { parsed.output = scoped.rest[++i]; continue; }
695
+ if (arg.startsWith('--output=')) { parsed.output = arg.slice('--output='.length); continue; }
696
+ }
697
+
698
+ return parsed;
699
+ }
700
+
701
+ async function runReviewCommand(args) {
702
+ const [subcommand, ...rest] = args;
703
+
704
+ if (!subcommand || subcommand === '--help' || subcommand === '-h') {
705
+ console.error('Use: cc-devflow review start --change <changeId> [--change-key <key>] [--cwd <path>]');
706
+ return 3;
707
+ }
708
+
709
+ const reviewRunners = {
710
+ start: null,
711
+ 'record-node': 'runReviewRecordNode',
712
+ 'add-finding': 'runReviewAddFinding',
713
+ close: 'runReviewClose',
714
+ render: 'runReviewRender'
715
+ };
716
+
717
+ if (subcommand === 'start') {
718
+ const options = parseReviewStartArgs(rest);
719
+ if (!options.changeId) {
720
+ console.error('review start --change is required.');
721
+ return 3;
722
+ }
723
+
724
+ const { runReviewStart } = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/operations/review-records.js'));
725
+ const result = await runReviewStart({
726
+ repoRoot: path.resolve(options.cwd || process.cwd()),
727
+ changeId: options.changeId,
728
+ changeKey: options.changeKey,
729
+ mode: options.mode,
730
+ scope: options.scope,
731
+ baseSha: options.baseSha,
732
+ headSha: options.headSha,
733
+ selectedNodes: options.selectedNodes,
734
+ skippedNodes: options.skippedNodes,
735
+ riskLanes: options.riskLanes
736
+ });
737
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
738
+ return result.code;
739
+ }
740
+
741
+ if (reviewRunners[subcommand]) {
742
+ const options = parseReviewEventArgs(rest);
743
+ if (!options.changeId) {
744
+ console.error(`review ${subcommand} --change is required.`);
745
+ return 3;
746
+ }
747
+
748
+ const runnerName = reviewRunners[subcommand];
749
+ const runners = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/operations/review-records.js'));
750
+ const result = await runners[runnerName]({
751
+ repoRoot: path.resolve(options.cwd || process.cwd()),
752
+ changeId: options.changeId,
753
+ changeKey: options.changeKey,
754
+ reviewId: options.reviewId,
755
+ nodeId: options.nodeId,
756
+ mode: options.mode,
757
+ target: options.target,
758
+ status: options.status,
759
+ coverage: options.coverage,
760
+ evidenceRefs: options.evidenceRefs,
761
+ findings: options.findings,
762
+ next: options.next,
763
+ findingId: options.findingId,
764
+ severity: options.severity,
765
+ confidence: options.confidence,
766
+ displayTier: options.displayTier,
767
+ fingerprint: options.fingerprint,
768
+ scope: options.scope,
769
+ path: options.path,
770
+ evidence: options.evidence,
771
+ recommendation: options.recommendation,
772
+ route: options.route,
773
+ blockingCount: options.blockingCount,
774
+ warningCount: options.warningCount,
775
+ output: options.output
776
+ });
777
+ if (result.code !== 0) {
778
+ console.error(result.stderr || result.error || `review ${subcommand} failed`);
779
+ return result.code;
780
+ }
781
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
782
+ return result.code;
783
+ }
784
+
785
+ console.error(`Unknown review command: ${subcommand}`);
786
+ return 3;
787
+ }
788
+
540
789
  function runNextChangeKey(args) {
541
790
  const parsed = { prefix: null, description: null, cwd: null };
542
791
 
@@ -699,6 +948,14 @@ async function main() {
699
948
  return runQueryCommand(rest);
700
949
  }
701
950
 
951
+ if (command === 'task-contract') {
952
+ return runTaskContractCommand(rest);
953
+ }
954
+
955
+ if (command === 'review') {
956
+ return runReviewCommand(rest);
957
+ }
958
+
702
959
  if (command === 'next-change-key') {
703
960
  return runNextChangeKey(rest);
704
961
  }
@@ -67,8 +67,8 @@ Use this when the only thing you know is the file in front of you.
67
67
  | `roadmap.json` | `cc-roadmap` editable machine truth source | [pdca-loop/roadmap.json](./pdca-loop/roadmap.json) |
68
68
  | `ROADMAP.md` | `cc-roadmap` generated human view | [pdca-loop/ROADMAP.md](./pdca-loop/ROADMAP.md) |
69
69
  | `BACKLOG.md` | deprecated `cc-roadmap` -> `cc-plan` projection | [pdca-loop/BACKLOG.md](./pdca-loop/BACKLOG.md) |
70
- | `design.md` | `cc-plan` | [pdca-loop/design.md](./pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md) or [full-design-blocked/design.md](./full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md) |
71
- | `tasks.md` | `cc-plan` or `cc-do` | [pdca-loop/tasks.md](./pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md) |
70
+ | `tasks.md` | `cc-plan`, `cc-investigate`, or `cc-do` | [pdca-loop/tasks.md](./pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md) |
71
+ | `design.md` | legacy `cc-plan` fallback | [pdca-loop/design.md](./pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md) or [full-design-blocked/design.md](./full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md) |
72
72
  | `task-manifest.json` | `cc-do` | [pdca-loop/task-manifest.json](./pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json) |
73
73
  | `report-card.json` | `cc-check` | [pdca-loop/report-card.json](./pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json), [full-design-blocked/report-card.json](./full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json), or [local-handoff/report-card.json](./local-handoff/changes/REQ-003-audit-log-export/review/report-card.json) |
74
74
  | `pr-brief.md` | `cc-act` | [pdca-loop/pr-brief.md](./pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md) |
@@ -127,7 +127,7 @@ If both are true, you are usually in `cc-act` local handoff territory, not back
127
127
  If you only have one minute, open these files in order:
128
128
 
129
129
  1. example `README.md`
130
- 2. change `planning/design.md`
130
+ 2. change `planning/tasks.md`
131
131
  3. `report-card.json` or the single final handoff file
132
132
 
133
133
  That should already tell you:
@@ -140,7 +140,9 @@ That should already tell you:
140
140
 
141
141
  `devflow/changes/<change>/` should stay lean.
142
142
 
143
- - Durable truth only: `change-state.json`, planning docs, `task-manifest.json`, optional `team-state.json`, task `checkpoint.json`, `report-card.json`, and one final handoff file.
143
+ - Durable truth only: CLI-generated `change-meta.json`, `planning/tasks.md`, CLI-generated `task-manifest.json`, review ledger/findings records, optional CLI logs for debug/failure, `report-card.json`, and one final handoff file. Do not generate task `context.md`, `checkpoint.json`, or AI-written process files.
144
+ - Machine JSON is CLI-owned: run `cc-devflow task-contract compile` / `validate`; do not handwrite `task-manifest.json` or `change-meta.json`.
145
+ - Legacy `planning/design.md`, `planning/analysis.md`, and `cc-review-*.md` are readable fallback inputs for older examples, not new default writes.
144
146
  - Runtime scratch belongs in `devflow/workspaces/<change>/`, not beside the durable record.
145
147
 
146
148
  ## If You Still Want The Split Views
@@ -1,17 +1,17 @@
1
1
  {
2
- "updatedAt": "2026-05-11",
2
+ "updatedAt": "2026-05-13",
3
3
  "skills": {
4
4
  "cc-roadmap": "5.3.0",
5
5
  "cc-next": "1.0.1",
6
- "cc-dev": "1.0.0",
7
- "cc-plan": "3.8.5",
8
- "cc-investigate": "1.4.1",
9
- "cc-do": "1.6.5",
10
- "cc-review": "1.3.0",
6
+ "cc-dev": "1.0.2",
7
+ "cc-plan": "3.9.2",
8
+ "cc-investigate": "1.5.1",
9
+ "cc-do": "1.6.8",
10
+ "cc-review": "2.0.0",
11
11
  "cc-pr-review": "1.0.0",
12
12
  "cc-pr-land": "1.0.0",
13
- "cc-check": "1.10.1",
14
- "cc-act": "1.8.7",
13
+ "cc-check": "1.11.2",
14
+ "cc-act": "1.8.9",
15
15
  "cc-spec-init": "1.1.0"
16
16
  },
17
17
  "examples": [
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Example version: `1.0.0`
6
6
  - Last reviewed: `2026-04-17`
7
- - Bound skills: `cc-roadmap@5.3.0`, `cc-plan@3.8.5`, `cc-do@1.6.5`, `cc-check@1.10.1`
7
+ - Bound skills: `cc-roadmap@5.3.0`, `cc-plan@3.9.2`, `cc-do@1.6.8`, `cc-check@1.11.2`
8
8
 
9
9
  This example shows a requirement that **looked executable**, but `cc-check` correctly stopped it and sent it back to `cc-plan`.
10
10
 
@@ -43,8 +43,8 @@ The sample shows what happens when implementation moved before the integration d
43
43
  - `roadmap.json` (editable roadmap truth)
44
44
  - `ROADMAP.md` (generated view)
45
45
  - `BACKLOG.md` (deprecated projection)
46
- - `changes/REQ-002-bulk-invite-import/planning/design.md`
47
46
  - `changes/REQ-002-bulk-invite-import/planning/tasks.md`
47
+ - `changes/REQ-002-bulk-invite-import/planning/design.md` (legacy fallback sample)
48
48
  - `changes/REQ-002-bulk-invite-import/planning/task-manifest.json`
49
49
  - `changes/REQ-002-bulk-invite-import/review/report-card.json`
50
50
 
@@ -4,7 +4,8 @@
4
4
 
5
5
  - Requirement version: `REQ-002.v2`
6
6
  - Design version: `design.v2`
7
- - CC-Plan skill version: `3.8.5`
7
+ - CC-Plan skill version: `3.9.2`
8
+ - Work branch: `REQ/002-bulk-invite-import`
8
9
  - Requirement ID: `REQ-002`
9
10
  - Design mode: `full-design`
10
11
  - Why not `tiny-design`: the feature crosses import parsing, invite rules, billing limits, duplicate handling, and audit logging
@@ -6,8 +6,9 @@
6
6
  "requirementId": "REQ-002",
7
7
  "requirementVersion": "REQ-002.v2",
8
8
  "planningMeta": {
9
- "reqPlanSkillVersion": "3.8.5",
9
+ "reqPlanSkillVersion": "3.9.2",
10
10
  "designVersion": "design.v2",
11
+ "workBranch": "REQ/002-bulk-invite-import",
11
12
  "approvedAt": null,
12
13
  "basedOnOption": "Option B",
13
14
  "aiLeverageDecisionLens": {
@@ -236,7 +237,7 @@
236
237
  ],
237
238
  "evidence": [
238
239
  "passing test output",
239
- "checkpoint summary"
240
+ "CLI log summary"
240
241
  ],
241
242
  "context": {
242
243
  "readFiles": [
@@ -4,7 +4,8 @@
4
4
 
5
5
  - Requirement version: `REQ-002.v2`
6
6
  - Design version: `design.v2`
7
- - CC-Plan skill version: `3.8.5`
7
+ - CC-Plan skill version: `3.9.2`
8
+ - Work branch: `REQ/002-bulk-invite-import`
8
9
  - Source roadmap item: `RM-010`
9
10
  - Source roadmap version: `roadmap.v2`
10
11
 
@@ -42,12 +43,14 @@
42
43
  ClaudeCode / Codex 执行本计划时,必须把本文件当成任务模板合同,而不是普通 TODO 列表。
43
44
 
44
45
  - Template source: `assets/TASKS_TEMPLATE.md`
46
+ - Context index first: run `cc-devflow query workflow-context --change <changeId> --change-key <changeKey> --cwd <repo-root> --data-only --no-trace --compact` before opening deep sections; use `packetOnly` plus `mustNotForget` first, verify `sourceHashes`, open `defaultOpen` refs only when needed, and reserve `deepOpen` for matching `openWhen.conditions`.
45
47
  - Task selection: read `planning/task-manifest.json.currentTaskId`; if empty, run the ready-task selector before choosing work.
46
48
  - Task block rule: read the full task block before coding; title-only execution is invalid.
47
49
  - Completion rule: after verification and review gates pass, run the completion script; do not manually edit checkbox, status, or `currentTaskId`.
48
- - Completion failure: if the script fails, fix the missing checkpoint / review / dependency evidence and rerun it. Do not bypass it by editing JSON or Markdown.
50
+ - Completion failure: if the script fails, fix the missing review / dependency evidence and rerun it. Do not bypass it by editing JSON or Markdown.
49
51
 
50
52
  ```bash
53
+ cc-devflow query workflow-context --change <changeId> --change-key <changeKey> --cwd <repo-root> --data-only --no-trace --compact
51
54
  SCRIPT_ROOT=".claude/skills/cc-do/scripts"
52
55
  if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then
53
56
  SCRIPT_ROOT=".codex/skills/cc-do/scripts"
@@ -65,7 +68,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
65
68
  Read first: `design.md`, `src/invite/bulk-import.ts`
66
69
  Verification: `npm test -- src/invite/bulk-import.test.ts`
67
70
  Evidence: failing output
68
- Completion: after verification evidence and required checkpoint/review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T001`; do not hand-edit status.
71
+ Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T001`; do not hand-edit status.
69
72
  Test seam: bulk invite rules and admin upload UI behavior
70
73
  Public verification path: Run the bulk invite rule and admin panel tests through their public flows
71
74
  Allowed mocks: file upload boundary / billing / seat limit boundary
@@ -77,8 +80,8 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
77
80
  Files: `src/invite/bulk-import.ts`
78
81
  Read first: `design.md`, `src/invite/bulk-import.test.ts`
79
82
  Verification: `npm test -- src/invite/bulk-import.test.ts`
80
- Evidence: passing output + checkpoint
81
- Completion: after verification evidence and required checkpoint/review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T002`; do not hand-edit status.
83
+ Evidence: passing output + Git diff
84
+ Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T002`; do not hand-edit status.
82
85
  Test seam: bulk invite rules and admin upload UI behavior
83
86
  Public verification path: Run the bulk invite rule and admin panel tests through their public flows
84
87
  Allowed mocks: file upload boundary / billing / seat limit boundary
@@ -93,7 +96,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
93
96
  Read first: `design.md`, `src/admin/BulkInvitePanel.tsx`
94
97
  Verification: `npm test -- src/admin/BulkInvitePanel.test.tsx`
95
98
  Evidence: failing output
96
- Completion: after verification evidence and required checkpoint/review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T003`; do not hand-edit status.
99
+ Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T003`; do not hand-edit status.
97
100
  Test seam: bulk invite rules and admin upload UI behavior
98
101
  Public verification path: Run the bulk invite rule and admin panel tests through their public flows
99
102
  Allowed mocks: file upload boundary / billing / seat limit boundary
@@ -106,7 +109,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
106
109
  Read first: `design.md`, `src/admin/BulkInvitePanel.test.tsx`
107
110
  Verification: `npm test -- src/admin/BulkInvitePanel.test.tsx`
108
111
  Evidence: passing output + review notes
109
- Completion: after verification evidence and required checkpoint/review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T004`; do not hand-edit status.
112
+ Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T004`; do not hand-edit status.
110
113
  Test seam: bulk invite rules and admin upload UI behavior
111
114
  Public verification path: Run the bulk invite rule and admin panel tests through their public flows
112
115
  Allowed mocks: file upload boundary / billing / seat limit boundary
@@ -123,7 +126,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
123
126
  - `npm test -- src/invite/bulk-import.test.ts`
124
127
  - `npm test -- src/admin/BulkInvitePanel.test.tsx`
125
128
  Evidence: passing output + review notes
126
- Completion: after verification evidence and required checkpoint/review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T005`; do not hand-edit status.
129
+ Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T005`; do not hand-edit status.
127
130
  Test seam: bulk invite rules and admin upload UI behavior
128
131
  Public verification path: Run the bulk invite rule and admin panel tests through their public flows
129
132
  Allowed mocks: file upload boundary / billing / seat limit boundary
@@ -31,7 +31,7 @@
31
31
  {
32
32
  "claim": "requirements-met",
33
33
  "requiredProof": "line-by-line planning/tasks.md and task-manifest.json checklist",
34
- "commandOrArtifact": "planning/design.md + planning/task-manifest.json",
34
+ "commandOrArtifact": "planning/tasks.md#Contract Summary + planning/task-manifest.json",
35
35
  "exitStatus": null,
36
36
  "keyObservation": "duplicate-email and seat-limit semantics are still underspecified",
37
37
  "status": "blocked"
@@ -129,7 +129,7 @@
129
129
  "reviewPacket": {
130
130
  "baseSha": "example-base",
131
131
  "headSha": "example-head",
132
- "requirements": "planning/design.md",
132
+ "requirements": "planning/tasks.md#Contract Summary",
133
133
  "implemented": "bulk invite import implementation",
134
134
  "reviewerContext": "requirement diff, plan completion, scope drift, docs staleness"
135
135
  },
@@ -140,7 +140,7 @@
140
140
  "confidence": "high",
141
141
  "source": "diff-review",
142
142
  "summary": "duplicate-email behavior is still underspecified",
143
- "evidence": "planning/design.md does not freeze row-level duplicate semantics",
143
+ "evidence": "planning/tasks.md#Contract Summary does not freeze row-level duplicate semantics",
144
144
  "action": "reroute-cc-plan",
145
145
  "triageStatus": "clarification-needed",
146
146
  "confidenceScore": 9,
@@ -153,7 +153,7 @@
153
153
  "confidence": "high",
154
154
  "source": "diff-review",
155
155
  "summary": "seat-limit partial-failure semantics are not frozen in design.md",
156
- "evidence": "planning/design.md lacks accepted row-outcome matrix",
156
+ "evidence": "planning/tasks.md#Contract Summary lacks accepted row-outcome matrix",
157
157
  "action": "reroute-cc-plan",
158
158
  "triageStatus": "clarification-needed",
159
159
  "confidenceScore": 9,
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Example version: `1.0.0`
6
6
  - Last reviewed: `2026-04-17`
7
- - Bound skills: `cc-roadmap@5.3.0`, `cc-plan@3.8.5`, `cc-do@1.6.5`, `cc-check@1.10.1`, `cc-act@1.8.7`
7
+ - Bound skills: `cc-roadmap@5.3.0`, `cc-plan@3.9.2`, `cc-do@1.6.8`, `cc-check@1.11.2`, `cc-act@1.8.9`
8
8
 
9
9
  This example shows verified work that is **ready to move forward**, but `cc-act` still chooses `local-handoff`.
10
10
 
@@ -39,8 +39,8 @@ But the current environment is local-only:
39
39
  - `roadmap.json` (editable roadmap truth)
40
40
  - `ROADMAP.md` (generated view)
41
41
  - `BACKLOG.md` (deprecated projection)
42
- - `changes/REQ-003-audit-log-export/planning/design.md`
43
42
  - `changes/REQ-003-audit-log-export/planning/tasks.md`
43
+ - `changes/REQ-003-audit-log-export/planning/design.md` (legacy fallback sample)
44
44
  - `changes/REQ-003-audit-log-export/planning/task-manifest.json`
45
45
  - `changes/REQ-003-audit-log-export/review/report-card.json`
46
46
  - `changes/REQ-003-audit-log-export/handoff/resume-index.md`
@@ -4,7 +4,8 @@
4
4
 
5
5
  - Requirement version: `REQ-003.v1`
6
6
  - Design version: `design.v1`
7
- - CC-Plan skill version: `3.8.5`
7
+ - CC-Plan skill version: `3.9.2`
8
+ - Work branch: `REQ/003-audit-log-export`
8
9
  - Requirement ID: `REQ-003`
9
10
  - Design mode: `tiny-design`
10
11
  - Why this stays `tiny-design`: the patch adds one export action inside the existing admin audit UI without changing data contracts