codex-genesis-harness 0.1.1 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebase/ARCHITECTURE_REVIEW_COMPLETE.md +216 -0
- package/.codebase/CURRENT_STATE.md +2 -0
- package/.codebase/DOMAIN_MODELS.md +5 -3
- package/.codebase/FILE_NAMING_CLARIFICATION.md +161 -0
- package/.codebase/HARNESS_COMPLETENESS_AUDIT.md +613 -0
- package/.codebase/IMPLEMENTATION_COMPLETE.md +429 -0
- package/.codebase/IMPLEMENTATION_HANDOFF.md +351 -0
- package/.codebase/IMPROVEMENTS_SUMMARY.md +419 -0
- package/.codebase/PHASE3_SKILLS_NAMING_COMPLETE.md +292 -0
- package/.codebase/PHASE_DEPENDENCY_MAP.md +486 -0
- package/.codebase/QUICK_START_SPEC_IMPACT.md +456 -0
- package/.codebase/README.md +139 -0
- package/.codebase/RECOVERY_POINTS.md +438 -0
- package/.codex/skills/genesis-api-sync/SKILL.md +354 -0
- package/.codex/skills/genesis-api-sync/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-api-sync/checklists/api-sync-checklist.md +101 -0
- package/.codex/skills/genesis-api-sync/examples/example.md +68 -0
- package/.codex/skills/genesis-api-sync/templates/api-change-template.md +257 -0
- package/.codex/skills/genesis-debug-guide/SKILL.md +479 -0
- package/.codex/skills/genesis-debug-guide/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-debug-guide/checklists/flaky-test-investigation.md +339 -0
- package/.codex/skills/genesis-debug-guide/checklists/production-bug-debug.md +210 -0
- package/.codex/skills/genesis-debug-guide/checklists/test-failure-debug.md +158 -0
- package/.codex/skills/genesis-debug-guide/examples/example.md +48 -0
- package/.codex/skills/genesis-debug-guide/observability/debug-commands.md +365 -0
- package/.codex/skills/genesis-debug-guide/playbooks/unit-test-failures.md +289 -0
- package/.codex/skills/genesis-debug-guide/templates/debug-investigation-log.md +288 -0
- package/.codex/skills/genesis-docs-automation/SKILL.md +1003 -0
- package/.codex/skills/genesis-docs-automation/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-docs-automation/checklists/docs-validation.md +359 -0
- package/.codex/skills/genesis-docs-automation/checklists/spec-alignment.md +312 -0
- package/.codex/skills/genesis-docs-automation/examples/example.md +59 -0
- package/.codex/skills/genesis-docs-automation/observability/docs-tracking.md +382 -0
- package/.codex/skills/genesis-docs-automation/playbooks/auto-update-flow.md +851 -0
- package/.codex/skills/genesis-docs-automation/playbooks/changelog-generation.md +491 -0
- package/.codex/skills/genesis-docs-automation/templates/changelog-entry-template.md +187 -0
- package/.codex/skills/genesis-docs-automation/templates/handoff-template.md +297 -0
- package/.codex/skills/genesis-harness/SKILL.md +734 -82
- package/.codex/skills/genesis-harness/checklists/bug-fix-qa.md +169 -0
- package/.codex/skills/genesis-harness/checklists/new-feature-qa.md +157 -0
- package/.codex/skills/genesis-harness/checklists/refactor-qa.md +216 -0
- package/.codex/skills/genesis-harness/checklists/requirements-validation.md +211 -0
- package/.codex/skills/genesis-harness/resources/change-impact-matrix-template.md +204 -0
- package/.codex/skills/genesis-harness/resources/foundation-phase-template.md +131 -0
- package/.codex/skills/genesis-harness/resources/phase-00-foundation-template.md +76 -0
- package/.codex/skills/genesis-harness/resources/post-implementation-guide.md +347 -0
- package/.codex/skills/genesis-harness/scripts/check-architecture-boundaries.sh +23 -23
- package/.codex/skills/genesis-harness/scripts/check-docs-sync.sh +24 -24
- package/.codex/skills/genesis-harness/scripts/check-no-debug-logs.sh +21 -21
- package/.codex/skills/genesis-harness/scripts/check-required-planning-files.sh +46 -46
- package/.codex/skills/genesis-harness/scripts/check-spec-changelog.sh +24 -24
- package/.codex/skills/genesis-harness/scripts/check-task-tracking.sh +25 -25
- package/.codex/skills/genesis-harness/scripts/compact-context.sh +54 -0
- package/.codex/skills/genesis-harness/scripts/create-adr.sh +74 -74
- package/.codex/skills/genesis-harness/scripts/create-bug.sh +160 -160
- package/.codex/skills/genesis-harness/scripts/create-feature.sh +217 -217
- package/.codex/skills/genesis-harness/scripts/detect-stack.sh +26 -26
- package/.codex/skills/genesis-harness/scripts/init-planning.sh +750 -719
- package/.codex/skills/genesis-harness/scripts/list-changed-files.sh +12 -12
- package/.codex/skills/genesis-harness/scripts/offload-log.sh +72 -0
- package/.codex/skills/genesis-harness/scripts/run-verification.sh +47 -47
- package/.codex/skills/genesis-harness/scripts/run-verify-loop.sh +75 -0
- package/.codex/skills/genesis-harness/scripts/update-state.sh +33 -33
- package/.codex/skills/genesis-harness-engineering/SKILL.md +159 -0
- package/.codex/skills/genesis-harness-engineering/checklists/checklist.md +48 -0
- package/.codex/skills/genesis-harness-engineering/examples/example.md +57 -0
- package/.codex/skills/genesis-harness-engineering/playbooks/harness-evolution.md +99 -0
- package/.codex/skills/genesis-harness-engineering/templates/harness-change-template.md +37 -0
- package/.codex/skills/genesis-observability-automation/SKILL.md +382 -0
- package/.codex/skills/genesis-observability-automation/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-observability-automation/examples/example.md +86 -0
- package/.codex/skills/genesis-performance-profiling/SKILL.md +510 -0
- package/.codex/skills/genesis-performance-profiling/agents/openai.yaml +6 -0
- package/.codex/skills/genesis-performance-profiling/checklists/optimization-verification.md +199 -0
- package/.codex/skills/genesis-performance-profiling/checklists/performance-baseline.md +183 -0
- package/.codex/skills/genesis-performance-profiling/examples/example.md +234 -0
- package/.codex/skills/genesis-performance-profiling/observability/performance-tracking.md +202 -0
- package/.codex/skills/genesis-performance-profiling/playbooks/load-testing-orchestration.md +593 -0
- package/.codex/skills/genesis-performance-profiling/playbooks/profiling-playbook.md +601 -0
- package/.codex/skills/genesis-performance-profiling/templates/load-test-config-template.md +428 -0
- package/.codex/skills/genesis-performance-profiling/templates/performance-report-template.md +238 -0
- package/.codex/skills/genesis-release-orchestration/SKILL.md +653 -0
- package/.codex/skills/genesis-release-orchestration/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-release-orchestration/checklists/post-deployment-verification.md +274 -0
- package/.codex/skills/genesis-release-orchestration/checklists/pre-release-validation.md +220 -0
- package/.codex/skills/genesis-release-orchestration/examples/example.md +78 -0
- package/.codex/skills/genesis-release-orchestration/observability/release-tracking.md +253 -0
- package/.codex/skills/genesis-release-orchestration/playbooks/canary-deployment-orchestration.md +472 -0
- package/.codex/skills/genesis-release-orchestration/playbooks/semantic-versioning-automation.md +494 -0
- package/.codex/skills/genesis-release-orchestration/templates/deployment-strategy-template.md +303 -0
- package/.codex/skills/genesis-release-orchestration/templates/release-runbook-template.md +420 -0
- package/.codex/skills/genesis-research-first/SKILL.md +237 -0
- package/.codex/skills/genesis-research-first/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-research-first/examples/example.md +85 -0
- package/.codex/skills/genesis-spec-propagation/SKILL.md +534 -0
- package/.codex/skills/genesis-spec-propagation/agents/openai.yaml +7 -0
- package/.codex/skills/genesis-spec-propagation/checklists/phase-update-verification.md +384 -0
- package/.codex/skills/genesis-spec-propagation/checklists/spec-change-detection.md +257 -0
- package/.codex/skills/genesis-spec-propagation/examples/example.md +63 -0
- package/.codex/skills/genesis-spec-propagation/observability/propagation-tracking.md +373 -0
- package/.codex/skills/genesis-spec-propagation/playbooks/breaking-change-propagation.md +692 -0
- package/.codex/skills/genesis-spec-propagation/playbooks/feature-change-propagation.md +434 -0
- package/.codex/skills/genesis-spec-propagation/templates/migration-guide-template.md +407 -0
- package/.codex/skills/spec-impact-engine/SKILL.md +504 -0
- package/.codex/skills/spec-impact-engine/agents/openai.yaml +7 -0
- package/.codex/skills/spec-impact-engine/detect-spec-changes.sh +262 -0
- package/.codex/skills/spec-impact-engine/examples/example.md +98 -0
- package/.codex/skills/spec-impact-engine/templates/impact-report.md +248 -0
- package/.codex/skills/spec-impact-engine/templates/migration-guide.md +223 -0
- package/.codex-plugin/plugin.json +1 -1
- package/README.EN.md +719 -0
- package/README.VI.md +712 -0
- package/README.md +261 -107
- package/VERSION +1 -1
- package/bin/genesis-harness.js +20 -11
- package/package.json +1 -1
- package/scripts/README.md +342 -0
- package/scripts/compact-context.sh +54 -0
- package/scripts/detect-changes.sh +152 -0
- package/scripts/install.sh +50 -41
- package/scripts/offload-log.sh +72 -0
- package/scripts/run-evals.sh +70 -43
- package/scripts/run-verify-loop.sh +75 -0
- package/scripts/uninstall.sh +52 -43
- package/scripts/verify.sh +165 -73
- package/.codex/skills/harness-engineering-skill/SKILL.md +0 -45
- package/.codex/skills/harness-engineering-skill/checklists/checklist.md +0 -8
- package/.codex/skills/harness-engineering-skill/examples/example.md +0 -4
- package/.codex/skills/harness-engineering-skill/templates/harness-change-template.md +0 -8
- /package/.codex/skills/{ai-provider-skill → genesis-ai-provider}/SKILL.md +0 -0
- /package/.codex/skills/{ai-provider-skill → genesis-ai-provider}/agents/openai.yaml +0 -0
- /package/.codex/skills/{ai-provider-skill → genesis-ai-provider}/checklists/checklist.md +0 -0
- /package/.codex/skills/{ai-provider-skill → genesis-ai-provider}/examples/example.md +0 -0
- /package/.codex/skills/{ai-provider-skill → genesis-ai-provider}/templates/provider-contract-template.md +0 -0
- /package/.codex/skills/{api-contract-skill → genesis-api-contract}/SKILL.md +0 -0
- /package/.codex/skills/{api-contract-skill → genesis-api-contract}/agents/openai.yaml +0 -0
- /package/.codex/skills/{api-contract-skill → genesis-api-contract}/checklists/checklist.md +0 -0
- /package/.codex/skills/{api-contract-skill → genesis-api-contract}/examples/example.md +0 -0
- /package/.codex/skills/{api-contract-skill → genesis-api-contract}/templates/api-contract-template.md +0 -0
- /package/.codex/skills/{architecture-skill → genesis-architecture}/SKILL.md +0 -0
- /package/.codex/skills/{architecture-skill → genesis-architecture}/agents/openai.yaml +0 -0
- /package/.codex/skills/{architecture-skill → genesis-architecture}/checklists/checklist.md +0 -0
- /package/.codex/skills/{architecture-skill → genesis-architecture}/examples/example.md +0 -0
- /package/.codex/skills/{architecture-skill → genesis-architecture}/templates/architecture-decision-template.md +0 -0
- /package/.codex/skills/{codebase-map-skill → genesis-codebase-map}/SKILL.md +0 -0
- /package/.codex/skills/{codebase-map-skill → genesis-codebase-map}/agents/openai.yaml +0 -0
- /package/.codex/skills/{codebase-map-skill → genesis-codebase-map}/checklists/checklist.md +0 -0
- /package/.codex/skills/{codebase-map-skill → genesis-codebase-map}/examples/example.md +0 -0
- /package/.codex/skills/{codebase-map-skill → genesis-codebase-map}/templates/map-update-template.md +0 -0
- /package/.codex/skills/{design-spec-skill → genesis-design-spec}/SKILL.md +0 -0
- /package/.codex/skills/{design-spec-skill → genesis-design-spec}/agents/openai.yaml +0 -0
- /package/.codex/skills/{design-spec-skill → genesis-design-spec}/checklists/checklist.md +0 -0
- /package/.codex/skills/{design-spec-skill → genesis-design-spec}/examples/example.md +0 -0
- /package/.codex/skills/{design-spec-skill → genesis-design-spec}/templates/design-spec-template.md +0 -0
- /package/.codex/skills/{docs-skill → genesis-docs}/SKILL.md +0 -0
- /package/.codex/skills/{docs-skill → genesis-docs}/agents/openai.yaml +0 -0
- /package/.codex/skills/{docs-skill → genesis-docs}/checklists/checklist.md +0 -0
- /package/.codex/skills/{docs-skill → genesis-docs}/examples/example.md +0 -0
- /package/.codex/skills/{docs-skill → genesis-docs}/templates/docs-update-template.md +0 -0
- /package/.codex/skills/{harness-engineering-skill → genesis-harness-engineering}/agents/openai.yaml +0 -0
- /package/.codex/skills/{pipeline-orchestration-skill → genesis-pipeline-orchestration}/SKILL.md +0 -0
- /package/.codex/skills/{pipeline-orchestration-skill → genesis-pipeline-orchestration}/agents/openai.yaml +0 -0
- /package/.codex/skills/{pipeline-orchestration-skill → genesis-pipeline-orchestration}/checklists/checklist.md +0 -0
- /package/.codex/skills/{pipeline-orchestration-skill → genesis-pipeline-orchestration}/examples/example.md +0 -0
- /package/.codex/skills/{pipeline-orchestration-skill → genesis-pipeline-orchestration}/templates/orchestration-template.md +0 -0
- /package/.codex/skills/{planning-skill → genesis-planning}/SKILL.md +0 -0
- /package/.codex/skills/{planning-skill → genesis-planning}/agents/openai.yaml +0 -0
- /package/.codex/skills/{planning-skill → genesis-planning}/checklists/checklist.md +0 -0
- /package/.codex/skills/{planning-skill → genesis-planning}/examples/example.md +0 -0
- /package/.codex/skills/{planning-skill → genesis-planning}/templates/plan-template.md +0 -0
- /package/.codex/skills/{release-skill → genesis-release}/SKILL.md +0 -0
- /package/.codex/skills/{release-skill → genesis-release}/agents/openai.yaml +0 -0
- /package/.codex/skills/{release-skill → genesis-release}/checklists/checklist.md +0 -0
- /package/.codex/skills/{release-skill → genesis-release}/examples/example.md +0 -0
- /package/.codex/skills/{release-skill → genesis-release}/templates/release-checklist-template.md +0 -0
- /package/.codex/skills/{research-skill → genesis-research}/SKILL.md +0 -0
- /package/.codex/skills/{research-skill → genesis-research}/agents/openai.yaml +0 -0
- /package/.codex/skills/{research-skill → genesis-research}/checklists/checklist.md +0 -0
- /package/.codex/skills/{research-skill → genesis-research}/examples/example.md +0 -0
- /package/.codex/skills/{research-skill → genesis-research}/templates/research-note-template.md +0 -0
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
# Breaking Change Propagation Playbook
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
**Scenario**: API field is removed or changed in incompatible way (breaking change)
|
|
6
|
+
|
|
7
|
+
**Complexity**: HIGH (requires manual review, migration strategy, backward compatibility considerations)
|
|
8
|
+
|
|
9
|
+
**Time**: 2-4 hours
|
|
10
|
+
|
|
11
|
+
**Manual Review**: Required (CRITICAL gate before propagation)
|
|
12
|
+
|
|
13
|
+
**Risk Level**: HIGH (can break production if not handled correctly)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Example: Removing Field from API Response
|
|
18
|
+
|
|
19
|
+
Suppose API response loses field `avatar`:
|
|
20
|
+
|
|
21
|
+
```diff
|
|
22
|
+
// OLD API response (v1)
|
|
23
|
+
{
|
|
24
|
+
"id": 123,
|
|
25
|
+
"name": "John Doe",
|
|
26
|
+
"avatar": "/avatars/john.jpg"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// NEW API response (v2)
|
|
30
|
+
{
|
|
31
|
+
"id": 123,
|
|
32
|
+
"name": "John Doe",
|
|
33
|
+
// "avatar" removed - client must migrate
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This is **BREAKING** because existing clients rely on `avatar` field.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Pre-Propagation: CRITICAL REVIEW GATE
|
|
42
|
+
|
|
43
|
+
### ⛔ STOP - Manual Review Required
|
|
44
|
+
|
|
45
|
+
**Do NOT auto-propagate breaking changes without this review.**
|
|
46
|
+
|
|
47
|
+
### Review Checklist
|
|
48
|
+
|
|
49
|
+
- [ ] Why is this field being removed? (business justification)
|
|
50
|
+
- [ ] Who are the consumers? (internal clients, external API users)
|
|
51
|
+
- [ ] How many consumers affected? (1 or 100+?)
|
|
52
|
+
- [ ] Can we do this gradually? (deprecation period?)
|
|
53
|
+
- [ ] Do we need a migration period? (6 months? 1 year?)
|
|
54
|
+
- [ ] Backward compatibility possible? (keep old field but deprecated)
|
|
55
|
+
- [ ] Communication plan: When do consumers migrate by?
|
|
56
|
+
|
|
57
|
+
### Decision: Which Strategy?
|
|
58
|
+
|
|
59
|
+
**Option A: Hard Break** (v2 breaking API)
|
|
60
|
+
- Remove field completely
|
|
61
|
+
- Old clients get error or field missing
|
|
62
|
+
- Requires immediate migration
|
|
63
|
+
- Timeline: All consumers migrate in 1-2 weeks
|
|
64
|
+
|
|
65
|
+
**Option B: Gradual Migration** (v1.5 → v2)
|
|
66
|
+
- Keep field for 6 months (deprecated)
|
|
67
|
+
- New field replaces it (e.g., `avatarUrl`)
|
|
68
|
+
- Clients migrate at their pace
|
|
69
|
+
- Timeline: All consumers migrate by end of year
|
|
70
|
+
|
|
71
|
+
**Option C: Parallel APIs** (v1 & v2 coexist)
|
|
72
|
+
- v1 API includes `avatar`
|
|
73
|
+
- v2 API replaces with `avatarUrl`
|
|
74
|
+
- Clients choose which version to use
|
|
75
|
+
- Timeline: Flexible, v1 sunset in 12 months
|
|
76
|
+
|
|
77
|
+
**Recommendation**: Choose Option B (gradual) for external APIs, Option A for internal
|
|
78
|
+
|
|
79
|
+
### Record Decision
|
|
80
|
+
|
|
81
|
+
```markdown
|
|
82
|
+
## BREAKING CHANGE: Remove 'avatar' Field
|
|
83
|
+
|
|
84
|
+
**Decision**: Gradual Migration (Option B)
|
|
85
|
+
|
|
86
|
+
**Timeline**:
|
|
87
|
+
- v1.5 (Current): avatar field deprecated, avatarUrl added
|
|
88
|
+
- Migration Period: 6 months (now to Dec 31, 2026)
|
|
89
|
+
- v2.0 (Jan 1, 2027): avatar field removed completely
|
|
90
|
+
|
|
91
|
+
**Deprecation Notice**:
|
|
92
|
+
"The 'avatar' field is deprecated as of v1.5.
|
|
93
|
+
Use 'avatarUrl' instead.
|
|
94
|
+
The 'avatar' field will be removed in v2.0 (Jan 1, 2027)."
|
|
95
|
+
|
|
96
|
+
**Communication**:
|
|
97
|
+
- Email all API consumers on signup date
|
|
98
|
+
- Add deprecation warning to API docs
|
|
99
|
+
- Provide migration guide & code examples
|
|
100
|
+
- Track migration progress (which clients updated)
|
|
101
|
+
|
|
102
|
+
**Sign-Off**: Engineering Lead + Product Manager
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Once approved**: Proceed with propagation.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Step 1: Create Migration Guide (30 min)
|
|
110
|
+
|
|
111
|
+
Create `docs/migration-v1-to-v2.md`:
|
|
112
|
+
|
|
113
|
+
```markdown
|
|
114
|
+
# Migration Guide: API v1 → v2
|
|
115
|
+
|
|
116
|
+
## Overview
|
|
117
|
+
|
|
118
|
+
The API is evolving from v1 to v2 with some breaking changes.
|
|
119
|
+
This guide helps you migrate your client in minutes.
|
|
120
|
+
|
|
121
|
+
## What Changed
|
|
122
|
+
|
|
123
|
+
### Field Removed: `avatar`
|
|
124
|
+
- **Removed in**: v2.0 (January 1, 2027)
|
|
125
|
+
- **Deprecation period**: 6 months
|
|
126
|
+
- **Replacement**: Use `avatarUrl` field instead
|
|
127
|
+
|
|
128
|
+
```diff
|
|
129
|
+
// v1 API Response
|
|
130
|
+
{
|
|
131
|
+
"id": 123,
|
|
132
|
+
"name": "John",
|
|
133
|
+
"avatar": "/avatars/john.jpg" // Deprecated
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// v2 API Response
|
|
137
|
+
{
|
|
138
|
+
"id": 123,
|
|
139
|
+
"name": "John",
|
|
140
|
+
"avatarUrl": "https://cdn.example.com/avatars/john.jpg" // New
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Migration Steps
|
|
145
|
+
|
|
146
|
+
### Step 1: Update Dependencies (5 min)
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm update @example/api-client@1.5.0
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Step 2: Update Code - Before
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
// v1: Using deprecated avatar field
|
|
156
|
+
const user = await api.getUser(123);
|
|
157
|
+
console.log(user.avatar); // "/avatars/john.jpg"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Step 3: Update Code - After
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
// v2: Using new avatarUrl field
|
|
164
|
+
const user = await api.getUser(123);
|
|
165
|
+
console.log(user.avatarUrl); // "https://cdn.example.com/avatars/john.jpg"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Step 4: Find All Usages
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# Find all references to deprecated field
|
|
172
|
+
grep -r "\.avatar" src/
|
|
173
|
+
grep -r "'avatar'" src/
|
|
174
|
+
grep -r '"avatar"' src/
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Step 5: Update UI Components
|
|
178
|
+
|
|
179
|
+
```javascript
|
|
180
|
+
// BEFORE
|
|
181
|
+
<img src={user.avatar} alt={user.name} />
|
|
182
|
+
|
|
183
|
+
// AFTER
|
|
184
|
+
<img src={user.avatarUrl} alt={user.name} />
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Testing
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Run your tests with new field
|
|
191
|
+
npm test
|
|
192
|
+
|
|
193
|
+
# Verify all tests pass
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Timeline
|
|
197
|
+
|
|
198
|
+
- **Now**: Deprecation announced, 6-month migration period starts
|
|
199
|
+
- **Dec 15, 2026**: Deprecation warnings increase (last 2 weeks)
|
|
200
|
+
- **Jan 1, 2027**: v2.0 released, `avatar` field removed
|
|
201
|
+
- **After Jan 1**: Old clients will receive 400 error or field missing
|
|
202
|
+
|
|
203
|
+
## Support
|
|
204
|
+
|
|
205
|
+
- Email: api-support@example.com
|
|
206
|
+
- Slack: #api-help
|
|
207
|
+
- Docs: https://docs.example.com/api/v2
|
|
208
|
+
- Migration Issues: GitHub Discussions
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Step 2: Phase 2 - Update Tests (30 min)
|
|
214
|
+
|
|
215
|
+
### 2a. Remove Test References to Deprecated Field
|
|
216
|
+
|
|
217
|
+
File: `tests/api.test.js`
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
// BEFORE - Testing deprecated field
|
|
221
|
+
test('should return user with avatar', async () => {
|
|
222
|
+
const user = await api.getUser(1);
|
|
223
|
+
expect(user.avatar).toBeDefined();
|
|
224
|
+
expect(user.avatar).toMatch(/^\/avatars\//);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// AFTER - Test removed (field no longer exists)
|
|
228
|
+
// ✅ Test deleted - avatar field no longer in API
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 2b. Add Tests for Deprecation Period
|
|
232
|
+
|
|
233
|
+
Add `tests/deprecation.test.js`:
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
describe('Deprecation: avatar field', () => {
|
|
237
|
+
test('should NOT include avatar field in v2 responses', async () => {
|
|
238
|
+
const user = await api.getUser(1);
|
|
239
|
+
expect(user).not.toHaveProperty('avatar');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('should include NEW avatarUrl field instead', async () => {
|
|
243
|
+
const user = await api.getUser(1);
|
|
244
|
+
expect(user).toHaveProperty('avatarUrl');
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('should include deprecation warning in headers', async () => {
|
|
248
|
+
const response = await api.getUser(1);
|
|
249
|
+
expect(response.headers['x-deprecated-fields']).toBeDefined();
|
|
250
|
+
expect(response.headers['x-deprecated-fields']).toContain('avatar');
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 2c. Update Mock Data
|
|
256
|
+
|
|
257
|
+
```javascript
|
|
258
|
+
// BEFORE
|
|
259
|
+
const mockUser = { id: 1, name: 'Alice', avatar: '/avatars/alice.jpg' };
|
|
260
|
+
|
|
261
|
+
// AFTER - Remove avatar, add avatarUrl
|
|
262
|
+
const mockUser = { id: 1, name: 'Alice', avatarUrl: 'https://cdn.example.com/avatars/alice.jpg' };
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 2d. Run Tests
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
npm test -- tests/
|
|
269
|
+
|
|
270
|
+
# All tests pass? ✅
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Step 3: Phase 3 - Update Backend Implementation (30 min)
|
|
276
|
+
|
|
277
|
+
### 3a. Remove Deprecated Field from Handler
|
|
278
|
+
|
|
279
|
+
File: `src/handlers/user.handler.js`
|
|
280
|
+
|
|
281
|
+
```javascript
|
|
282
|
+
// BEFORE - Returning deprecated field
|
|
283
|
+
async function getUser(req, res) {
|
|
284
|
+
const user = await db.users.findById(req.params.id);
|
|
285
|
+
return res.json({
|
|
286
|
+
id: user.id,
|
|
287
|
+
name: user.name,
|
|
288
|
+
avatar: user.avatar_path // Deprecated - remove
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// AFTER - Remove avatar, return avatarUrl
|
|
293
|
+
async function getUser(req, res) {
|
|
294
|
+
const user = await db.users.findById(req.params.id);
|
|
295
|
+
return res.json({
|
|
296
|
+
id: user.id,
|
|
297
|
+
name: user.name,
|
|
298
|
+
avatarUrl: user.avatar_url // New field
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 3b. Update Contract Schema
|
|
304
|
+
|
|
305
|
+
File: `contracts/api/response.json`
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"type": "object",
|
|
310
|
+
"properties": {
|
|
311
|
+
"id": { "type": "integer" },
|
|
312
|
+
"name": { "type": "string" },
|
|
313
|
+
"avatarUrl": { // New field
|
|
314
|
+
"type": ["string", "null"],
|
|
315
|
+
"description": "URL to user avatar"
|
|
316
|
+
}
|
|
317
|
+
// avatar field removed
|
|
318
|
+
},
|
|
319
|
+
"required": ["id", "name"]
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 3c. Update API Docstring
|
|
324
|
+
|
|
325
|
+
```javascript
|
|
326
|
+
/**
|
|
327
|
+
* GET /api/users/:id
|
|
328
|
+
*
|
|
329
|
+
* Returns user data (v2 format).
|
|
330
|
+
*
|
|
331
|
+
* BREAKING CHANGE (v2.0): Field 'avatar' removed.
|
|
332
|
+
* Use 'avatarUrl' instead.
|
|
333
|
+
*
|
|
334
|
+
* Migration guide: /docs/migration-v1-to-v2
|
|
335
|
+
* Deprecation period: Until January 1, 2027
|
|
336
|
+
*
|
|
337
|
+
* Response: { id, name, avatarUrl }
|
|
338
|
+
*/
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 3d. Add Deprecation Header (v1 only)
|
|
342
|
+
|
|
343
|
+
If supporting v1 for compatibility period:
|
|
344
|
+
|
|
345
|
+
```javascript
|
|
346
|
+
// v1 handler (deprecated)
|
|
347
|
+
app.get('/v1/users/:id', (req, res) => {
|
|
348
|
+
const user = await db.users.findById(req.params.id);
|
|
349
|
+
res.set('X-API-Version', '1.0');
|
|
350
|
+
res.set('X-Deprecated-Since', '2026-05-31');
|
|
351
|
+
res.set('X-Sunset', '2027-01-01');
|
|
352
|
+
res.set('X-Deprecated-Fields', 'avatar');
|
|
353
|
+
res.json({
|
|
354
|
+
id: user.id,
|
|
355
|
+
name: user.name,
|
|
356
|
+
avatar: user.avatar_path, // v1 still returns it
|
|
357
|
+
avatarUrl: user.avatar_url // v2 field preview
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// v2 handler (current)
|
|
362
|
+
app.get('/v2/users/:id', (req, res) => {
|
|
363
|
+
const user = await db.users.findById(req.params.id);
|
|
364
|
+
res.set('X-API-Version', '2.0');
|
|
365
|
+
res.json({
|
|
366
|
+
id: user.id,
|
|
367
|
+
name: user.name,
|
|
368
|
+
avatarUrl: user.avatar_url // Only new field
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### 3e. Validate Contract
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
npm run validate:contracts
|
|
377
|
+
|
|
378
|
+
# Expected: Valid ✅
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## Step 4: Phase 4 - Update Client SDK (20 min)
|
|
384
|
+
|
|
385
|
+
### 4a. Update Type Definitions
|
|
386
|
+
|
|
387
|
+
File: `types/api.ts`
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
// BEFORE
|
|
391
|
+
interface User {
|
|
392
|
+
id: number;
|
|
393
|
+
name: string;
|
|
394
|
+
avatar: string; // Deprecated
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// AFTER
|
|
398
|
+
interface User {
|
|
399
|
+
id: number;
|
|
400
|
+
name: string;
|
|
401
|
+
avatarUrl: string | null; // New field
|
|
402
|
+
// avatar removed
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// For v1 backward compatibility (optional)
|
|
406
|
+
interface UserV1 extends User {
|
|
407
|
+
avatar: string; // Deprecated - only in v1
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### 4b. Update Client Methods
|
|
412
|
+
|
|
413
|
+
```typescript
|
|
414
|
+
// Update method to return new type
|
|
415
|
+
async function fetchUser(id: number): Promise<User> {
|
|
416
|
+
const response = await fetch(`/api/users/${id}`);
|
|
417
|
+
return response.json(); // Now avatarUrl instead of avatar
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Provide helper for migration (optional)
|
|
421
|
+
function migrateUserToV2(userV1: UserV1): User {
|
|
422
|
+
return {
|
|
423
|
+
id: userV1.id,
|
|
424
|
+
name: userV1.name,
|
|
425
|
+
avatarUrl: userV1.avatar // Map old field to new
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### 4c. Add Deprecation Warning
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
/**
|
|
434
|
+
* @deprecated The 'avatar' field is removed in v2.
|
|
435
|
+
* Use 'avatarUrl' instead.
|
|
436
|
+
* Migration: https://docs.example.com/migration-v1-to-v2
|
|
437
|
+
* Removal date: 2027-01-01
|
|
438
|
+
*/
|
|
439
|
+
export interface UserV1 {
|
|
440
|
+
avatar: string;
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### 4d: Type Check
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
npm run tsc --noEmit
|
|
448
|
+
|
|
449
|
+
# No errors? ✅
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Step 5: Phase 5 - Update E2E Tests (20 min)
|
|
455
|
+
|
|
456
|
+
### 5a. Remove Tests for Deprecated Field
|
|
457
|
+
|
|
458
|
+
```javascript
|
|
459
|
+
// BEFORE - Testing deprecated field
|
|
460
|
+
test('should display user avatar', async ({ page }) => {
|
|
461
|
+
await page.goto('/users/1');
|
|
462
|
+
expect(page.locator('[data-avatar]')).toBeVisible();
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// AFTER - Test removed, feature uses new field
|
|
466
|
+
// ✅ Test deleted - avatar functionality replaced with avatarUrl
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### 5b. Add Tests for New Field
|
|
470
|
+
|
|
471
|
+
```javascript
|
|
472
|
+
test('should display user avatar using new avatarUrl field', async ({ page }) => {
|
|
473
|
+
await page.goto('/users/1');
|
|
474
|
+
const avatar = page.locator('[data-avatar-url]');
|
|
475
|
+
await expect(avatar).toBeVisible();
|
|
476
|
+
await expect(avatar).toHaveAttribute('src', /^https:\/\//);
|
|
477
|
+
});
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### 5c. Run E2E Tests
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
npm run test:e2e -- user.spec.ts
|
|
484
|
+
|
|
485
|
+
# All tests pass? ✅
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
## Step 6: Validation (10 min)
|
|
491
|
+
|
|
492
|
+
### 6a. Full Test Suite
|
|
493
|
+
|
|
494
|
+
```bash
|
|
495
|
+
npm run test
|
|
496
|
+
|
|
497
|
+
# Phase 2, 3, 4, 5 all pass? ✅
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### 6b. Breaking Change Validation
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
# Verify old field is truly gone
|
|
504
|
+
npm run test:contracts -- --breakingChanges
|
|
505
|
+
|
|
506
|
+
# Should show: 'avatar' field removed (BREAKING)
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
### 6c. Migration Documentation
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
# Verify migration guide exists and is complete
|
|
513
|
+
ls -la docs/migration-v1-to-v2.md
|
|
514
|
+
|
|
515
|
+
# Check content includes all scenarios
|
|
516
|
+
grep -i "migration steps" docs/migration-v1-to-v2.md
|
|
517
|
+
grep -i "timeline" docs/migration-v1-to-v2.md
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## Step 7: Communication (15 min)
|
|
523
|
+
|
|
524
|
+
### 7a. Update SPEC_CHANGELOG.md
|
|
525
|
+
|
|
526
|
+
```markdown
|
|
527
|
+
- 2026-05-31T14:30:00Z | BREAKING | Removed 'avatar' field from User response
|
|
528
|
+
Migration: Gradual deprecation period (6 months) then removal in v2.0
|
|
529
|
+
Timeline: Until January 1, 2027 to migrate
|
|
530
|
+
Migration guide: /docs/migration-v1-to-v2
|
|
531
|
+
Auto-updated phases: 2, 3, 4, 5
|
|
532
|
+
Requires: Manual consumer notification
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### 7b. Notify Consumers
|
|
536
|
+
|
|
537
|
+
Create notification template:
|
|
538
|
+
|
|
539
|
+
```
|
|
540
|
+
Subject: API Breaking Change: avatar field deprecation
|
|
541
|
+
|
|
542
|
+
Dear API Consumers,
|
|
543
|
+
|
|
544
|
+
Effective May 31, 2026, the 'avatar' field in the User API response is deprecated.
|
|
545
|
+
|
|
546
|
+
DEPRECATION PERIOD: Until January 1, 2027
|
|
547
|
+
ACTION: Migrate to use 'avatarUrl' field instead
|
|
548
|
+
|
|
549
|
+
Migration Guide: https://docs.example.com/migration-v1-to-v2
|
|
550
|
+
|
|
551
|
+
Questions? Contact: api-support@example.com
|
|
552
|
+
|
|
553
|
+
Best regards,
|
|
554
|
+
API Team
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
### 7c. Update API Documentation
|
|
558
|
+
|
|
559
|
+
- Add deprecation warning to API docs
|
|
560
|
+
- Link to migration guide
|
|
561
|
+
- Add upgrade timeline
|
|
562
|
+
- Provide code examples
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## Step 8: Release Planning (30 min)
|
|
567
|
+
|
|
568
|
+
### 8a. Version Strategy
|
|
569
|
+
|
|
570
|
+
- **v1.5.0**: Deprecation announced, new field available
|
|
571
|
+
- **v2.0.0**: Breaking change, old field removed
|
|
572
|
+
|
|
573
|
+
### 8b. Release Notes
|
|
574
|
+
|
|
575
|
+
```markdown
|
|
576
|
+
## v2.0.0 - Breaking Changes Release
|
|
577
|
+
|
|
578
|
+
### Breaking Changes
|
|
579
|
+
- REMOVED: User API 'avatar' field
|
|
580
|
+
- Replaced by: 'avatarUrl' field
|
|
581
|
+
- Migration guide: https://docs.example.com/migration-v1-to-v2
|
|
582
|
+
- Deprecation started: v1.5.0 (May 31, 2026)
|
|
583
|
+
|
|
584
|
+
### Migration Required
|
|
585
|
+
All clients must migrate to use 'avatarUrl' before deploying v2.0.0
|
|
586
|
+
|
|
587
|
+
### Support
|
|
588
|
+
- Migration assistance: api-support@example.com
|
|
589
|
+
- Slack channel: #api-help
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
### 8c: Rollback Strategy (if needed)
|
|
593
|
+
|
|
594
|
+
```markdown
|
|
595
|
+
## Rollback Procedure
|
|
596
|
+
|
|
597
|
+
If breaking change causes unexpected issues in production:
|
|
598
|
+
|
|
599
|
+
1. Identify affected consumers (check logs)
|
|
600
|
+
2. Revert v2.0.0 → v1.5.0:
|
|
601
|
+
```bash
|
|
602
|
+
git revert <v2.0.0-tag>
|
|
603
|
+
npm publish
|
|
604
|
+
```
|
|
605
|
+
3. Notify consumers of reversion
|
|
606
|
+
4. Schedule post-mortem (why did this break?)
|
|
607
|
+
5. Fix and re-release as v2.0.1
|
|
608
|
+
|
|
609
|
+
**Timeline**: Rollback can be done in < 1 hour
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Step 9: Sign-Off
|
|
615
|
+
|
|
616
|
+
- [ ] Migration guide written ✅
|
|
617
|
+
- [ ] Phase 2: Tests updated ✅
|
|
618
|
+
- [ ] Phase 3: Handler & contract updated ✅
|
|
619
|
+
- [ ] Phase 4: SDK types updated ✅
|
|
620
|
+
- [ ] Phase 5: E2E tests updated ✅
|
|
621
|
+
- [ ] All tests green ✅
|
|
622
|
+
- [ ] SPEC_CHANGELOG.md: Updated ✅
|
|
623
|
+
- [ ] Migration guide complete ✅
|
|
624
|
+
- [ ] Communication plan ready ✅
|
|
625
|
+
- [ ] Rollback strategy documented ✅
|
|
626
|
+
- [ ] Ready for code review ✅
|
|
627
|
+
- [ ] **ENGINEERING LEAD APPROVAL REQUIRED** ✅
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
## Common Issues & Recovery
|
|
632
|
+
|
|
633
|
+
### Issue: Clients Break Immediately
|
|
634
|
+
|
|
635
|
+
**Cause**: Didn't provide deprecation period, broke in-flight requests
|
|
636
|
+
|
|
637
|
+
**Recovery**:
|
|
638
|
+
1. Rollback to v1.5.0 immediately
|
|
639
|
+
2. Restore the `avatar` field for backward compatibility
|
|
640
|
+
3. Create longer deprecation period (6-12 months)
|
|
641
|
+
4. Re-plan breaking change for future release
|
|
642
|
+
|
|
643
|
+
### Issue: Some Clients Still Using Old Field
|
|
644
|
+
|
|
645
|
+
**Cause**: Deprecation communication missed some consumers
|
|
646
|
+
|
|
647
|
+
**Recovery**:
|
|
648
|
+
1. Extend migration timeline (add 3 months)
|
|
649
|
+
2. Provide tools to find field usage: `api-audit --field avatar`
|
|
650
|
+
3. Reach out to non-compliant consumers directly
|
|
651
|
+
4. Offer migration assistance
|
|
652
|
+
|
|
653
|
+
### Issue: Downstream Services Depend on Old Field
|
|
654
|
+
|
|
655
|
+
**Cause**: Internal services also use the deprecated field
|
|
656
|
+
|
|
657
|
+
**Recovery**:
|
|
658
|
+
1. Update internal services first (before public breaking change)
|
|
659
|
+
2. Add feature flag: `use_avatarUrl` (allow gradual rollout)
|
|
660
|
+
3. Test both code paths before removing old field
|
|
661
|
+
4. Remove old field after internal services upgraded
|
|
662
|
+
|
|
663
|
+
---
|
|
664
|
+
|
|
665
|
+
## Time Breakdown
|
|
666
|
+
|
|
667
|
+
| Task | Time |
|
|
668
|
+
|------|------|
|
|
669
|
+
| Pre-propagation review & decision | 30 min |
|
|
670
|
+
| Create migration guide | 30 min |
|
|
671
|
+
| Phase 2: Update tests | 30 min |
|
|
672
|
+
| Phase 3: Update handler | 30 min |
|
|
673
|
+
| Phase 4: Update SDK | 20 min |
|
|
674
|
+
| Phase 5: Update E2E | 20 min |
|
|
675
|
+
| Validation & testing | 10 min |
|
|
676
|
+
| Communication & docs | 15 min |
|
|
677
|
+
| Release planning | 30 min |
|
|
678
|
+
| **Total** | **225 min (3.75 hours)** |
|
|
679
|
+
|
|
680
|
+
---
|
|
681
|
+
|
|
682
|
+
## Success Criteria
|
|
683
|
+
|
|
684
|
+
✅ Migration guide is clear & comprehensive
|
|
685
|
+
✅ All tests pass (Phase 2-5)
|
|
686
|
+
✅ Breaking change is properly detected
|
|
687
|
+
✅ Consumers notified with migration timeline
|
|
688
|
+
✅ Deprecation period is sufficient (6+ months recommended)
|
|
689
|
+
✅ Rollback procedure is documented
|
|
690
|
+
✅ Engineering lead approved
|
|
691
|
+
✅ Ready for release & communication
|
|
692
|
+
|