contract-driven-delivery 1.12.0 → 2.0.0

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 (38) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/README.md +58 -38
  3. package/assets/CLAUDE.template.md +4 -12
  4. package/assets/agents/backend-engineer.md +5 -26
  5. package/assets/agents/change-classifier.md +87 -27
  6. package/assets/agents/ci-cd-gatekeeper.md +4 -25
  7. package/assets/agents/contract-reviewer.md +4 -25
  8. package/assets/agents/dependency-security-reviewer.md +4 -24
  9. package/assets/agents/e2e-resilience-engineer.md +4 -25
  10. package/assets/agents/frontend-engineer.md +4 -25
  11. package/assets/agents/monkey-test-engineer.md +4 -25
  12. package/assets/agents/qa-reviewer.md +4 -25
  13. package/assets/agents/repo-context-scanner.md +4 -24
  14. package/assets/agents/spec-architect.md +4 -25
  15. package/assets/agents/spec-drift-auditor.md +4 -24
  16. package/assets/agents/stress-soak-engineer.md +4 -25
  17. package/assets/agents/test-strategist.md +4 -25
  18. package/assets/agents/ui-ux-reviewer.md +4 -24
  19. package/assets/agents/visual-reviewer.md +4 -24
  20. package/assets/cdd/model-policy.json +20 -1
  21. package/assets/hooks/post-tool-use-files-read.sh +55 -0
  22. package/assets/skills/cdd-close/SKILL.md +9 -9
  23. package/assets/skills/cdd-new/SKILL.md +201 -198
  24. package/assets/skills/cdd-resume/SKILL.md +16 -16
  25. package/assets/skills/contract-driven-delivery/SKILL.md +6 -0
  26. package/assets/skills/contract-driven-delivery/references/agent-log-protocol.md +147 -0
  27. package/assets/skills/contract-driven-delivery/scripts/generate_change_scaffold.py +1 -1
  28. package/assets/skills/contract-driven-delivery/scripts/validate_spec_traceability.py +1 -1
  29. package/assets/skills/contract-driven-delivery/templates/agent-log.example.yml +14 -0
  30. package/assets/skills/contract-driven-delivery/templates/change-classification.md +1 -1
  31. package/assets/skills/contract-driven-delivery/templates/tasks.yml +39 -0
  32. package/assets/specs-templates/change-classification.md +1 -1
  33. package/assets/specs-templates/context-manifest.md +8 -13
  34. package/assets/specs-templates/tasks.yml +39 -0
  35. package/dist/cli/index.js +11057 -829
  36. package/package.json +7 -3
  37. package/assets/skills/contract-driven-delivery/templates/tasks.md +0 -50
  38. package/assets/specs-templates/tasks.md +0 -52
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cdd-resume
3
- description: Resume an in-progress change across sessions. Reads tasks.md and agent-log/ to determine where to continue. Args: <change-id>
3
+ description: Resume an in-progress change across sessions. Reads tasks.yml and agent-log/ to determine where to continue. Args: <change-id>
4
4
  ---
5
5
 
6
6
  # cdd-resume — Resume a Change
@@ -17,9 +17,9 @@ Provide the `change-id`. If unsure, run `cdd-kit list` to see active changes.
17
17
 
18
18
  ## Step 0: Detect format version
19
19
 
20
- Before reading state, check if `specs/changes/<change-id>/tasks.md` starts with `---` (YAML frontmatter).
20
+ Before reading state, check if `specs/changes/<change-id>/tasks.yml` exists.
21
21
 
22
- If it does NOT start with `---`, this change was created with a pre-v1.11 version of cdd-kit. Run:
22
+ If only `specs/changes/<change-id>/tasks.md` exists (no `tasks.yml`), this change was created with a pre-v2.0 version of cdd-kit. Run:
23
23
 
24
24
  ```
25
25
  cdd-kit migrate <change-id>
@@ -27,8 +27,8 @@ cdd-kit migrate <change-id>
27
27
 
28
28
  Then commit the migration:
29
29
  ```
30
- git add specs/changes/<change-id>/tasks.md specs/changes/<change-id>/change-classification.md
31
- git commit -m "chore: migrate <change-id> to v1.11 format"
30
+ git add specs/changes/<change-id>/tasks.yml specs/changes/<change-id>/agent-log
31
+ git commit -m "chore: migrate <change-id> to v2.0 YAML format"
32
32
  ```
33
33
 
34
34
  If there are many mid-flight changes, suggest `cdd-kit migrate --all` instead.
@@ -38,17 +38,17 @@ If there are many mid-flight changes, suggest `cdd-kit migrate --all` instead.
38
38
  ## Step 1: Read current state
39
39
 
40
40
  Read only these state files first:
41
- - `specs/changes/<change-id>/tasks.md`
41
+ - `specs/changes/<change-id>/tasks.yml`
42
42
  - `specs/changes/<change-id>/context-manifest.md` if present
43
- - `specs/changes/<change-id>/agent-log/*.md`
43
+ - `specs/changes/<change-id>/agent-log/*.yml`
44
44
  - `specs/changes/<change-id>/change-classification.md`
45
45
 
46
46
  Do not run broad repository search during resume. Do not read `src/`, `tests/`, or `contracts/` unless the current `context-manifest.md` authorizes that path or an approved expansion lists it.
47
47
 
48
- From `tasks.md`:
49
- - Identify all `[x]` (done) items
50
- - Identify all `[-]` (N/A) items
51
- - Identify all `[ ]` (pending) items
48
+ From `tasks.yml`:
49
+ - Identify all `status: done` items
50
+ - Identify all `status: skipped` (N/A) items
51
+ - Identify all `status: pending` items
52
52
 
53
53
  Read `specs/changes/<change-id>/agent-log/` to list which agents have already run.
54
54
 
@@ -73,7 +73,7 @@ Tier: <tier>
73
73
  Status: <in-progress | gate-blocked>
74
74
 
75
75
  Completed agents: <list from agent-log/>
76
- Pending tasks: <list of [ ] items>
76
+ Pending tasks: <list of status: pending items>
77
77
  Pending context expansions: <none | list request ids and paths>
78
78
  Allowed context: <short summary from context-manifest.md>
79
79
 
@@ -86,7 +86,7 @@ Ask the user: "Continue from <next-agent>? (yes/no)"
86
86
 
87
87
  ## Step 3: Continue the flow
88
88
 
89
- If user confirms, resume from the next agent in the Tier sequence (refer to `/cdd-new` Step 3 for the agent order).
89
+ If user confirms, resume from the next agent in the Tier sequence (refer to `/cdd-new` Step 3 for the agent order, and `/cdd-new` "Agent stage badges" for the colored badges to use in your narration).
90
90
 
91
91
  **Critical**: Inject this block at the start of every agent prompt:
92
92
 
@@ -108,7 +108,7 @@ Continue until all required agents are done, then run `cdd-kit gate <change-id>`
108
108
 
109
109
  - Never re-run an agent that already has `status: complete` in its agent-log
110
110
  - Never start from Step 1 of `/cdd-new` — only resume from the next pending agent
111
- - Never use broad search to reconstruct state; resume from `tasks.md`, `context-manifest.md`, and `agent-log/`
111
+ - Never use broad search to reconstruct state; resume from `tasks.yml`, `context-manifest.md`, and `agent-log/`
112
112
  - Never continue past pending Context Expansion Requests
113
- - If tasks.md has `status: abandoned`, report to user and stop
114
- - If tasks.md has `status: gate-blocked`, go directly to gate retry (max 3)
113
+ - If tasks.yml has `status: abandoned`, report to user and stop
114
+ - If tasks.yml has `status: gate-blocked`, go directly to gate retry (max 3)
@@ -116,3 +116,9 @@ When using this skill, produce concrete artifact content instead of vague recomm
116
116
  - `scripts/validate_spec_traceability.py`: check coarse traceability between spec, tasks, tests, and CI gates.
117
117
 
118
118
  Run scripts with Python 3 from the repository root.
119
+
120
+ ## Output discipline (file formats)
121
+
122
+ - `tasks.yml`: structured YAML, validated by `src/schemas/tasks.schema.ts`.
123
+ - `agent-log/<agent>.yml`: structured YAML per `references/agent-log-protocol.md`.
124
+ - All other change artifacts remain markdown prose.
@@ -0,0 +1,147 @@
1
+ # Agent Log Protocol (YAML)
2
+
3
+ All cdd-kit agents share the same machine-verifiable agent-log format. This
4
+ file is the single source of truth — agent prompts reference it instead of
5
+ inlining the format. `cdd-kit gate` validates these files against
6
+ `src/schemas/agent-log.schema.ts` (JSON Schema, draft-07). Drift here equals
7
+ silent gate skips, so do not re-document this in agent prompts.
8
+
9
+ ## Output target
10
+
11
+ Each agent writes (or has main Claude write) one file per run:
12
+
13
+ ```
14
+ specs/changes/<change-id>/agent-log/<agent-name>.yml
15
+ ```
16
+
17
+ If the same agent runs more than once for a change (e.g., after fix-back),
18
+ overwrite the file — only the latest run is gate-relevant.
19
+
20
+ ## Required structure
21
+
22
+ The file is pure YAML (no markdown wrapping, no checklist).
23
+
24
+ ```yaml
25
+ change-id: <id>
26
+ agent: <agent-name>
27
+ timestamp: <ISO 8601 UTC, e.g. 2026-04-27T14:30:00Z>
28
+ status: complete # complete | needs-review | blocked
29
+ files-read:
30
+ - <repo-relative path>
31
+ - <repo-relative path>
32
+ artifacts:
33
+ - { type: <evidence-type>, pointer: <concrete pointer> }
34
+ - { type: <evidence-type>, pointer: <concrete pointer> }
35
+ next-action: <one line, or "none">
36
+ notes: <optional free-form>
37
+ ```
38
+
39
+ ### Field rules
40
+
41
+ | field | required | rule |
42
+ |---|---|---|
43
+ | `change-id` | yes | must equal the parent change directory name |
44
+ | `agent` | yes | canonical agent name (matches the agent's filename) |
45
+ | `timestamp` | yes | ISO 8601 UTC; used by spec-drift-auditor for ordering |
46
+ | `status` | yes | exactly one of `complete` \| `needs-review` \| `blocked` |
47
+ | `files-read` | conditional | required for context-governed changes (see below) |
48
+ | `artifacts` | yes | array of `{type, pointer}` objects, ≥ 1 item |
49
+ | `next-action` | yes | when `status: blocked`, ≥ 10 chars and not `none` |
50
+ | `notes` | no | optional |
51
+
52
+ #### `files-read`
53
+
54
+ Required when `tasks.yml` has `context-governance: v1`. Each entry is a
55
+ repo-relative path. Absolute paths and `..` traversal are rejected. If you
56
+ legitimately read nothing beyond your own change directory, write:
57
+
58
+ ```yaml
59
+ files-read:
60
+ - specs/changes/<change-id>/
61
+ ```
62
+
63
+ #### `artifacts`
64
+
65
+ Concrete pointers only. Allowed forms:
66
+
67
+ - `path/to/file.ts:10-45`
68
+ - `tests/foo.test.ts::should reject empty body`
69
+ - `cdd-kit gate <id>: 0 errors`
70
+ - `contracts/api/api-contract.md#endpoints`
71
+
72
+ Never `verified`, `OK`, `done`, or unscoped prose.
73
+
74
+ #### `next-action`
75
+
76
+ When `status: blocked`, this must be ≥ 10 chars, must not be `none`, `tbd`,
77
+ `investigate further`, or `n/a`, and must name the actual next step a human
78
+ can act on. When `status: complete`, `none` is acceptable.
79
+
80
+ ## Per-agent additional artifact requirements
81
+
82
+ Each agent prompt lists its own `### Required artifacts for this agent`. The
83
+ gate does not enforce those today; they are a discipline contract enforced by
84
+ `qa-reviewer` and `contract-reviewer`. If you add a required artifact in an
85
+ agent prompt, also update the qa-reviewer checklist.
86
+
87
+ ## Self-validation before submitting your response
88
+
89
+ **Every agent MUST self-validate its draft agent-log YAML before finishing.**
90
+ A malformed log forces `cdd-kit gate` to fail, which forces the skill to
91
+ re-invoke you, which costs the user another full agent round. Self-lint is
92
+ ~5 seconds; a re-run is minutes and dollars.
93
+
94
+ Before sending your final response, re-read the YAML you intend to write and
95
+ verify each item:
96
+
97
+ - [ ] **All required keys exist**: `change-id`, `agent`, `timestamp`,
98
+ `status`, `artifacts`, `next-action` (plus `files-read` for
99
+ context-governed changes).
100
+ - [ ] **`status` is one of**: `complete`, `needs-review`, `blocked` — not
101
+ `done`, `OK`, `pending`, `wip`, or anything else.
102
+ - [ ] **Every `artifacts` item is a `{type, pointer}` mapping** with a
103
+ concrete pointer:
104
+ - GOOD: `{ type: tests-added, pointer: "tests/foo.test.ts::should reject empty body" }`
105
+ - GOOD: `{ type: files-changed, pointer: "src/api/users.ts:45-67" }`
106
+ - GOOD: `{ type: test-output, pointer: "5 passed (last 10 lines: …)" }`
107
+ - BAD: `{ type: tests-added, pointer: verified }`
108
+ - BAD: `{ type: files-changed, pointer: yes }`
109
+ - BAD: `{ type: contract, pointer: OK }`
110
+ Reject any line whose pointer would not let a reviewer click through.
111
+ - [ ] **If `status: blocked`**, `next-action` is ≥ 10 chars, is NOT `none`,
112
+ `investigate further`, `tbd`, or `n/a`, and names the actual next step
113
+ a human can act on.
114
+ - [ ] **Every `files-read` entry**: repo-relative path, no leading `/`, no
115
+ `..`, no `~`. If you read your own change directory only, write
116
+ `- specs/changes/<change-id>/`.
117
+ - [ ] **YAML is parseable**: indentation is consistent (2 spaces), strings
118
+ with special characters (`:`, `#`, leading numbers like `001`) are
119
+ quoted.
120
+
121
+ If any check fails, **fix the YAML before sending your response**. Do not
122
+ ship a known-bad log and rely on the gate to catch it.
123
+
124
+ ## Gate enforcement summary
125
+
126
+ `cdd-kit gate` rejects an agent log when any of these are true:
127
+
128
+ 1. The file is missing for a tier-required agent (see CONTRACTS for tier matrix).
129
+ 2. YAML fails to parse, or top-level is not a mapping.
130
+ 3. `status` is missing or has an unknown value.
131
+ 4. `status: blocked` without a concrete `next-action`.
132
+ 5. `files-read` is missing for a context-governed change, or contains an
133
+ absolute path / `..` segment / forbidden path.
134
+ 6. Any `artifacts` item is missing `type` or `pointer`, or the array is empty.
135
+ 7. With `--strict`: any `artifacts` pointer that looks like a path but does
136
+ not exist on disk; or any runtime-logged read not declared in `files-read`.
137
+
138
+ ## Why this lives in references/
139
+
140
+ The historical mistake was duplicating the protocol inside every agent prompt.
141
+ Sixteen agents × ~30 lines = ~480 lines of identical text loaded on every
142
+ spawn. Moving it here:
143
+
144
+ - Cuts per-agent prompt size by 25–35%.
145
+ - Makes drift between agents impossible (one file to change).
146
+ - Lets gate.ts behavior, schemas, tests, and prompts stay in sync via this
147
+ single doc.
@@ -24,7 +24,7 @@ def main():
24
24
  'contracts.md':'contracts.md',
25
25
  'test-plan.md':'test-plan.md',
26
26
  'ci-gates.md':'ci-gates.md',
27
- 'tasks.md':'tasks.md',
27
+ 'tasks.yml':'tasks.yml',
28
28
  'qa-report.md':'qa-report.md',
29
29
  'regression-report.md':'regression-report.md',
30
30
  'archive.md':'archive.md',
@@ -2,7 +2,7 @@
2
2
  """Coarse traceability check for a change folder."""
3
3
  from pathlib import Path
4
4
  import argparse, sys
5
- REQUIRED=['change-classification.md','test-plan.md','ci-gates.md','tasks.md']
5
+ REQUIRED=['change-classification.md','test-plan.md','ci-gates.md','tasks.yml']
6
6
  def check_change_dir(d):
7
7
  """Check one change directory. Returns list of error strings (empty = pass)."""
8
8
  errors=[]
@@ -0,0 +1,14 @@
1
+ change-id: feat-001
2
+ agent: backend-engineer
3
+ timestamp: 2026-04-27T14:30:00Z
4
+ status: complete
5
+ files-read:
6
+ - contracts/api/api-contract.md
7
+ - src/api/users.ts
8
+ - specs/changes/feat-001/test-plan.md
9
+ artifacts:
10
+ - { type: files-changed, pointer: "src/api/users.ts:45-67" }
11
+ - { type: tests-added, pointer: "tests/api/users.test.ts::should reject empty body" }
12
+ - { type: contracts-touched, pointer: "contracts/api/api-contract.md#endpoints" }
13
+ - { type: test-output, pointer: "5 passed (vitest run --filter users)" }
14
+ next-action: none
@@ -18,7 +18,7 @@
18
18
  - reason: (fill only if yes)
19
19
 
20
20
  ## Required Artifacts
21
- Always required: change-request.md, change-classification.md, test-plan.md, ci-gates.md, tasks.md
21
+ Always required: change-request.md, change-classification.md, test-plan.md, ci-gates.md, tasks.yml
22
22
 
23
23
  ## Optional Artifacts (default: no — set yes only with explicit reason)
24
24
  | artifact | create? | reason |
@@ -0,0 +1,39 @@
1
+ change-id: <change-id>
2
+ status: in-progress
3
+ tier: null
4
+ context-governance: v1
5
+ archive-tasks:
6
+ - "7.1"
7
+ - "7.2"
8
+ depends-on: []
9
+
10
+ tasks:
11
+ # status: pending | done | skipped
12
+ - { id: "1.1", section: Preparation, title: "Confirm classification and required artifacts", status: pending }
13
+ - { id: "1.2", section: Preparation, title: "Confirm contracts to update", status: pending }
14
+ - { id: "1.3", section: Preparation, title: "Confirm CI/CD gate plan", status: pending }
15
+ - { id: "2.1", section: "Contract Updates", title: "API contract", status: pending }
16
+ - { id: "2.2", section: "Contract Updates", title: "CSS/UI contract", status: pending }
17
+ - { id: "2.3", section: "Contract Updates", title: "Env contract", status: pending }
18
+ - { id: "2.4", section: "Contract Updates", title: "Data shape contract", status: pending }
19
+ - { id: "2.5", section: "Contract Updates", title: "Business logic contract", status: pending }
20
+ - { id: "2.6", section: "Contract Updates", title: "CI/CD contract", status: pending }
21
+ - { id: "3.1", section: "Tests First", title: "Unit/contract tests", status: pending }
22
+ - { id: "3.2", section: "Tests First", title: "Integration tests", status: pending }
23
+ - { id: "3.3", section: "Tests First", title: "E2E/resilience tests", status: pending }
24
+ - { id: "3.4", section: "Tests First", title: "Data-boundary/monkey tests", status: pending }
25
+ - { id: "3.5", section: "Tests First", title: "Stress/soak tests if required", status: pending }
26
+ - { id: "4.1", section: Implementation, title: "Backend", status: pending }
27
+ - { id: "4.2", section: Implementation, title: "Frontend", status: pending }
28
+ - { id: "4.3", section: Implementation, title: "Env/deploy", status: pending }
29
+ - { id: "4.4", section: Implementation, title: "CI/CD workflows", status: pending }
30
+ - { id: "5.1", section: Review, title: "UI/UX review", status: pending }
31
+ - { id: "5.2", section: Review, title: "Visual review", status: pending }
32
+ - { id: "5.3", section: Review, title: "Contract review", status: pending }
33
+ - { id: "5.4", section: Review, title: "QA review", status: pending }
34
+ - { id: "6.1", section: Verification, title: "Local gates", status: pending }
35
+ - { id: "6.2", section: Verification, title: "PR required gates", status: pending }
36
+ - { id: "6.3", section: Verification, title: "Informational gates", status: pending }
37
+ - { id: "6.4", section: Verification, title: "Nightly/weekly/manual gates if required", status: pending }
38
+ - { id: "7.1", section: Archive, title: "Archive change", status: pending }
39
+ - { id: "7.2", section: Archive, title: "Promote durable learnings to contracts or CLAUDE.md", status: pending }
@@ -18,7 +18,7 @@
18
18
  - reason: (fill only if yes)
19
19
 
20
20
  ## Required Artifacts
21
- Always required: change-request.md, change-classification.md, test-plan.md, ci-gates.md, tasks.md
21
+ Always required: change-request.md, change-classification.md, test-plan.md, ci-gates.md, tasks.yml
22
22
 
23
23
  ## Optional Artifacts (default: no — set yes only with explicit reason)
24
24
  | artifact | create? | reason |
@@ -1,22 +1,16 @@
1
1
  # Context Manifest
2
2
 
3
- This manifest defines the approved context boundaries for agents working on this change.
3
+ This manifest defines the approved context boundaries for agents working on
4
+ this change. The forbidden-paths baseline lives in `.cdd/context-policy.json`
5
+ and is automatically applied by `cdd-kit gate` — do not duplicate it here.
4
6
 
5
7
  ## Affected Surfaces
6
8
  -
7
9
 
8
10
  ## Allowed Paths
9
11
  - specs/changes/<change-id>/
10
-
11
- ## Forbidden Paths
12
- - .claude/worktrees/**
13
- - .git/**
14
- - node_modules/**
15
- - dist/**
16
- - build/**
17
- - assets/**
18
- - specs/archive/**
19
- - specs/changes/* except specs/changes/<change-id>/
12
+ - specs/context/project-map.md
13
+ - specs/context/contracts-index.md
20
14
 
21
15
  ## Required Contracts
22
16
  -
@@ -35,8 +29,8 @@ This manifest defines the approved context boundaries for agents working on this
35
29
  ## Context Expansion Requests
36
30
 
37
31
  <!--
38
- Agents must request context expansion instead of reading outside their work packet.
39
- Use this format only for real requests:
32
+ Agents must request context expansion instead of reading outside their work
33
+ packet. Format example for real requests:
40
34
 
41
35
  - request-id: CER-001
42
36
  requested_paths:
@@ -44,6 +38,7 @@ Use this format only for real requests:
44
38
  reason: why this file is required
45
39
  status: pending
46
40
  -->
41
+ -
47
42
 
48
43
  ## Approved Expansions
49
44
  -
@@ -0,0 +1,39 @@
1
+ change-id: <change-id>
2
+ status: in-progress
3
+ tier: null
4
+ context-governance: v1
5
+ archive-tasks:
6
+ - "7.1"
7
+ - "7.2"
8
+ depends-on: []
9
+
10
+ tasks:
11
+ # status: pending | done | skipped
12
+ - { id: "1.1", section: Preparation, title: "Confirm classification and required artifacts", status: pending }
13
+ - { id: "1.2", section: Preparation, title: "Confirm contracts to update", status: pending }
14
+ - { id: "1.3", section: Preparation, title: "Confirm CI/CD gate plan", status: pending }
15
+ - { id: "2.1", section: "Contract Updates", title: "API contract", status: pending }
16
+ - { id: "2.2", section: "Contract Updates", title: "CSS/UI contract", status: pending }
17
+ - { id: "2.3", section: "Contract Updates", title: "Env contract", status: pending }
18
+ - { id: "2.4", section: "Contract Updates", title: "Data shape contract", status: pending }
19
+ - { id: "2.5", section: "Contract Updates", title: "Business logic contract", status: pending }
20
+ - { id: "2.6", section: "Contract Updates", title: "CI/CD contract", status: pending }
21
+ - { id: "3.1", section: "Tests First", title: "Unit/contract tests", status: pending }
22
+ - { id: "3.2", section: "Tests First", title: "Integration tests", status: pending }
23
+ - { id: "3.3", section: "Tests First", title: "E2E/resilience tests", status: pending }
24
+ - { id: "3.4", section: "Tests First", title: "Data-boundary/monkey tests", status: pending }
25
+ - { id: "3.5", section: "Tests First", title: "Stress/soak tests if required", status: pending }
26
+ - { id: "4.1", section: Implementation, title: "Backend", status: pending }
27
+ - { id: "4.2", section: Implementation, title: "Frontend", status: pending }
28
+ - { id: "4.3", section: Implementation, title: "Env/deploy", status: pending }
29
+ - { id: "4.4", section: Implementation, title: "CI/CD workflows", status: pending }
30
+ - { id: "5.1", section: Review, title: "UI/UX review", status: pending }
31
+ - { id: "5.2", section: Review, title: "Visual review", status: pending }
32
+ - { id: "5.3", section: Review, title: "Contract review", status: pending }
33
+ - { id: "5.4", section: Review, title: "QA review", status: pending }
34
+ - { id: "6.1", section: Verification, title: "Local gates", status: pending }
35
+ - { id: "6.2", section: Verification, title: "PR required gates", status: pending }
36
+ - { id: "6.3", section: Verification, title: "Informational gates", status: pending }
37
+ - { id: "6.4", section: Verification, title: "Nightly/weekly/manual gates if required", status: pending }
38
+ - { id: "7.1", section: Archive, title: "Archive change", status: pending }
39
+ - { id: "7.2", section: Archive, title: "Promote durable learnings to contracts or CLAUDE.md", status: pending }