jettypod 4.1.2 → 4.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.
Files changed (179) hide show
  1. package/.nvmrc +1 -0
  2. package/docs/COMPLETE-TESTING-STRATEGY.md +970 -0
  3. package/docs/DECISIONS.md +10 -12
  4. package/docs/NODE_VERSION.md +83 -0
  5. package/docs/TDD-INFRASTRUCTURE-STRATEGY.md +1374 -0
  6. package/docs/TESTING-FOR-NON-ENGINEERS.md +1588 -0
  7. package/docs/TESTING-STRATEGY-AUDIT.md +698 -0
  8. package/hooks/post-checkout +17 -0
  9. package/hooks/post-merge +17 -0
  10. package/hooks/pre-commit +30 -0
  11. package/jettypod.js +259 -120
  12. package/lib/coverage-tracker.js +218 -0
  13. package/lib/database.js +2 -0
  14. package/lib/db-export.js +192 -0
  15. package/lib/db-import.js +193 -0
  16. package/lib/external-transition-handler.js +32 -0
  17. package/lib/git-hook-helpers.js +174 -0
  18. package/lib/git-root.js +90 -0
  19. package/lib/infrastructure-chore-generator.js +45 -0
  20. package/lib/install-hooks.js +52 -0
  21. package/lib/jettypod-backup.js +238 -0
  22. package/lib/merge-lock.js +193 -0
  23. package/lib/migrations/012-add-worktree-path.js +38 -0
  24. package/lib/migrations/013-worktrees-table.js +86 -0
  25. package/lib/migrations/014-migrate-worktree-data.js +161 -0
  26. package/lib/migrations/015-merge-locks-table.js +67 -0
  27. package/lib/pattern-finder.js +152 -0
  28. package/lib/process-manager.js +140 -0
  29. package/lib/production-standards-reader.js +13 -2
  30. package/lib/production-standards-writer.js +85 -0
  31. package/lib/skills/feature-planning/dry-run-validator.js +135 -0
  32. package/lib/skills/feature-planning/validation-formatter.js +160 -0
  33. package/lib/smart-conflict-detection.js +168 -0
  34. package/lib/smart-fetch-rebase.js +614 -0
  35. package/lib/step-definition-parser.js +76 -0
  36. package/lib/unit-test-generator.js +232 -0
  37. package/lib/verification-command-generator.js +66 -0
  38. package/lib/worktree-diagnostics.js +413 -0
  39. package/lib/worktree-facade.js +174 -0
  40. package/lib/worktree-manager.js +636 -0
  41. package/lib/worktree-reconciler.js +429 -0
  42. package/package.json +30 -3
  43. package/skills-templates/external-transition/SKILL.md +34 -3
  44. package/skills-templates/feature-planning/SKILL.md +190 -24
  45. package/skills-templates/production-mode/SKILL.md +127 -9
  46. package/skills-templates/speed-mode/SKILL.md +454 -51
  47. package/skills-templates/stable-mode/SKILL.md +285 -76
  48. package/.claude/PROTECT_SKILLS.md +0 -28
  49. package/.claude/settings.json +0 -24
  50. package/.claude/settings.local.json +0 -16
  51. package/.claude/skills/epic-planning/SKILL.md +0 -297
  52. package/.claude/skills/external-transition/SKILL.md +0 -384
  53. package/.claude/skills/feature-planning/SKILL.md +0 -464
  54. package/.claude/skills/production-mode/SKILL.md +0 -369
  55. package/.claude/skills/speed-mode/SKILL.md +0 -481
  56. package/.claude/skills/stable-mode/SKILL.md +0 -713
  57. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/epic-planning/SKILL.md +0 -297
  58. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/feature-planning/SKILL.md +0 -464
  59. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/speed-mode/SKILL.md +0 -467
  60. package/.claude/skills.backup-2025-11-10T23-33-09-368Z/stable-mode/SKILL.md +0 -673
  61. package/.claude/skills.backup-2025-11-11T16-15-10-070Z/epic-discover/SKILL.md +0 -297
  62. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/epic-planning/SKILL.md +0 -297
  63. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/feature-planning/SKILL.md +0 -464
  64. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/speed-mode/SKILL.md +0 -467
  65. package/.claude/skills.backup-2025-11-11T16-42-43-212Z/stable-mode/SKILL.md +0 -673
  66. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/epic-planning/SKILL.md +0 -297
  67. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/feature-planning/SKILL.md +0 -464
  68. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/speed-mode/SKILL.md +0 -467
  69. package/.claude/skills.backup-2025-11-11T17-06-09-783Z/stable-mode/SKILL.md +0 -673
  70. package/.devpod/current-work.json +0 -10
  71. package/.devpod/work.db +0 -0
  72. package/.github/workflows/test-safety.yml +0 -85
  73. package/.jettypod/config.json +0 -5
  74. package/.jettypod/current-work.json +0 -10
  75. package/.jettypod/hooks/README.md +0 -77
  76. package/.jettypod/hooks/protect-claude-md.js +0 -338
  77. package/.jettypod/test-work.db +0 -0
  78. package/.jettypod/work.db +0 -0
  79. package/CLAUDE.md +0 -49
  80. package/SPEED-STABLE-AUDIT.md +0 -853
  81. package/SYSTEM-BEHAVIOR.md +0 -2199
  82. package/TEST_SAFETY_AUDIT.md +0 -314
  83. package/TEST_SAFETY_IMPLEMENTATION.md +0 -97
  84. package/cucumber-report.html +0 -45
  85. package/dist/devpod-linux +0 -0
  86. package/dist/devpod-macos +0 -0
  87. package/dist/devpod-win.exe +0 -0
  88. package/docs/features/jettypod-standards-explained.md +0 -543
  89. package/docs/features/standards-inventory.md +0 -257
  90. package/features/auto-generate-production-chores.feature +0 -13
  91. package/features/backlog-command.feature +0 -26
  92. package/features/backlog-filtering-production.feature +0 -10
  93. package/features/claude-md-protection/steps.js +0 -498
  94. package/features/decisions/index.js +0 -490
  95. package/features/decisions/index.test.js +0 -208
  96. package/features/fix-text-wrapping.feature +0 -42
  97. package/features/git-hooks/git-hooks.feature +0 -30
  98. package/features/git-hooks/index.js +0 -93
  99. package/features/git-hooks/index.test.js +0 -137
  100. package/features/git-hooks/post-commit +0 -56
  101. package/features/git-hooks/post-merge +0 -47
  102. package/features/git-hooks/pre-commit +0 -28
  103. package/features/git-hooks/simple-steps.js +0 -53
  104. package/features/git-hooks/simple-test.feature +0 -10
  105. package/features/git-hooks/steps.js +0 -196
  106. package/features/jettypod-update-command.feature +0 -46
  107. package/features/mode-prompts/index.js +0 -95
  108. package/features/mode-prompts/simple-steps.js +0 -44
  109. package/features/mode-prompts/simple-test.feature +0 -9
  110. package/features/mode-prompts/validation.test.js +0 -120
  111. package/features/multiple-claude-instances.feature +0 -121
  112. package/features/production-mode-skill.feature +0 -121
  113. package/features/refactor-mode/steps.js +0 -217
  114. package/features/refactor-mode.feature +0 -49
  115. package/features/simplify-external-transition.feature +0 -166
  116. package/features/skills-update/index.test.js +0 -216
  117. package/features/step_definitions/backlog-command.steps.js +0 -37
  118. package/features/step_definitions/fix-text-wrapping.steps.js +0 -271
  119. package/features/step_definitions/multiple-claude-instances.steps.js +0 -621
  120. package/features/step_definitions/production-mode-skill.steps.js +0 -862
  121. package/features/step_definitions/simplify-external-transition.steps.js +0 -370
  122. package/features/step_definitions/terminal-logo.steps.js +0 -145
  123. package/features/step_definitions/update-command.steps.js +0 -183
  124. package/features/support/hooks.js +0 -9
  125. package/features/terminal-logo/index.js +0 -39
  126. package/features/terminal-logo/terminal-logo.feature +0 -30
  127. package/features/update-command/index.js +0 -181
  128. package/features/update-command/index.test.js +0 -225
  129. package/features/work-commands/bug-workflow-display.feature +0 -22
  130. package/features/work-commands/index.js +0 -498
  131. package/features/work-commands/simple-steps.js +0 -69
  132. package/features/work-commands/stable-tests.feature +0 -57
  133. package/features/work-commands/steps.js +0 -1174
  134. package/features/work-commands/validation.test.js +0 -88
  135. package/features/work-commands/work-commands.feature +0 -13
  136. package/features/work-tracking/discovery-validation.test.js +0 -228
  137. package/features/work-tracking/index.js +0 -1921
  138. package/features/work-tracking/mode-required.feature +0 -112
  139. package/features/work-tracking/phase-tracking.test.js +0 -482
  140. package/features/work-tracking/prototype-tracking.test.js +0 -485
  141. package/features/work-tracking/tree-view.test.js +0 -310
  142. package/features/work-tracking/work-set-mode.feature +0 -71
  143. package/features/work-tracking/work-start-mode.feature +0 -88
  144. package/full-test.txt +0 -0
  145. package/lib/bug-workflow.test.js +0 -177
  146. package/lib/claudemd.test.js +0 -195
  147. package/lib/config.test.js +0 -511
  148. package/lib/constants.test.js +0 -164
  149. package/lib/current-work.test.js +0 -146
  150. package/lib/database-project-config.test.js +0 -111
  151. package/lib/database.test.js +0 -106
  152. package/lib/decisions-generator.test.js +0 -457
  153. package/lib/decisions-helpers.test.js +0 -310
  154. package/lib/git-coordinator.js +0 -167
  155. package/lib/git.test.js +0 -145
  156. package/lib/migrations/002-default-work-item-modes.test.js +0 -351
  157. package/lib/production-chore-generator.test.js +0 -432
  158. package/lib/production-context-detector.test.js +0 -277
  159. package/lib/production-scenario-appender.test.js +0 -235
  160. package/lib/production-scenario-validator.test.js +0 -246
  161. package/lib/production-standards-reader.test.js +0 -270
  162. package/lib/project-state.test.js +0 -92
  163. package/lib/push-queue.js +0 -417
  164. package/lib/queue-processor.js +0 -74
  165. package/lib/test-helpers.js +0 -202
  166. package/lib/test-helpers.test.js +0 -255
  167. package/prototypes/2025-01-11-production-mode-autonomous.js +0 -119
  168. package/prototypes/2025-01-11-production-mode-collaborative.js +0 -166
  169. package/prototypes/2025-01-11-production-mode-guided.js +0 -217
  170. package/prototypes/2025-01-11-production-mode-smart-context.js +0 -347
  171. package/prototypes/2025-01-11-production-standards-example.md +0 -204
  172. package/prototypes/2025-11-10-backlog-filtering-tree-aware.js +0 -242
  173. package/prototypes/test/index.html +0 -1
  174. package/setup-dist-repo.sh +0 -68
  175. package/test-production-standards-engine.js +0 -130
  176. package/test-results.json +0 -2195
  177. package/test-safety-check.sh +0 -80
  178. package/work-item-tracking-plan.md +0 -199
  179. /package/{.jettypod/devpod.db → jettypod.db} +0 -0
@@ -1,369 +0,0 @@
1
- ---
2
- name: production-mode
3
- description: Guide implementation of production mode chores with production standards validation. Use when user starts work on a production mode chore. Detects context (Scenario A/B/C), validates/generates scenarios, and implements production hardening comprehensively.
4
- ---
5
-
6
- # Production Mode Skill
7
-
8
- Guides Claude Code through production mode implementation with focus on security, scale, and compliance. Autonomous execution - Claude Code writes the code.
9
-
10
- ## Instructions
11
-
12
- When this skill is activated, you are helping implement a production mode chore to add production hardening. Follow this structured approach:
13
-
14
- ### Overview
15
-
16
- **Production Mode Goal:** Harden features for production deployment with security, performance, and compliance standards.
17
-
18
- **CRITICAL CONTEXT DETECTION:**
19
- - Production mode has **3 different starting scenarios** (A/B/C)
20
- - **Must detect context first** before proceeding
21
- - Different workflows for each scenario
22
-
23
- **Key Principles:**
24
- - **Context-aware execution** - adapt to Scenario A/B/C
25
- - **Standards-driven** - use production standards from external-transition
26
- - **Autonomous execution** - Claude Code writes code, user confirms approach
27
- - **Comprehensive hardening** - security, performance, compliance, infrastructure
28
-
29
- **User Profile:** May not know how to code - Claude Code does the implementation autonomously.
30
-
31
- ---
32
-
33
- ## Implementation Steps
34
-
35
- ### Step 0: Detect Production Context (CRITICAL FIRST STEP)
36
-
37
- **MUST RUN FIRST:** Detect which scenario applies to this feature.
38
-
39
- **Code to detect context:**
40
-
41
- ```javascript
42
- const { detectContext } = require('../../lib/production-context-detector');
43
- const { getCurrentWork } = require('../../lib/current-work');
44
- const { getDb } = require('../../lib/database');
45
-
46
- try {
47
- const currentWork = getCurrentWork();
48
-
49
- if (!currentWork) {
50
- console.error('❌ No current work found. Run: jettypod work start <chore-id>');
51
- return;
52
- }
53
-
54
- if (!currentWork.parent_id) {
55
- console.error('❌ Current work has no parent feature.');
56
- return;
57
- }
58
-
59
- const featureId = currentWork.parent_id;
60
- const scenario = await detectContext(featureId);
61
-
62
- console.log(`📋 Detected: ${scenario}`);
63
-
64
- // Proceed with appropriate workflow
65
- if (scenario === 'SCENARIO_A') {
66
- // Fresh from stable mode - quick validation
67
- } else if (scenario === 'SCENARIO_B') {
68
- // Gap in time - re-validation
69
- } else {
70
- // Scenario C - generate from standards
71
- }
72
- } catch (err) {
73
- console.error('❌ Context detection failed:', err.message);
74
- return;
75
- }
76
- ```
77
-
78
- **Three Scenarios:**
79
-
80
- **Scenario A: Fresh from Stable (Hot Context)**
81
- - Production scenarios exist
82
- - Production chores exist
83
- - Completed stable ≤ 1 day ago
84
- - **Workflow:** Quick validation → fill gaps → implement
85
-
86
- **Scenario B: Gap in Time (Cold Context)**
87
- - Production scenarios exist
88
- - Production chores exist
89
- - Completed stable > 1 day ago OR project state changed
90
- - **Workflow:** Re-validate → update scenarios → implement
91
-
92
- **Scenario C: Post External-Transition (New Infrastructure)**
93
- - NO production scenarios exist
94
- - NO production chores exist
95
- - **Workflow:** Generate scenarios → create chores → implement
96
-
97
- ---
98
-
99
- ### Step 1: Read Production Standards
100
-
101
- **For all scenarios:** Read production standards file.
102
-
103
- ```javascript
104
- const { readStandards, standardsFileExists } = require('../../lib/production-standards-reader');
105
-
106
- try {
107
- if (!standardsFileExists()) {
108
- console.error('❌ Production standards file not found.');
109
- console.log('Run external-transition first to generate production standards.');
110
- return;
111
- }
112
-
113
- const standards = await readStandards();
114
- console.log(`📋 Loaded ${standards.standards.length} production standards`);
115
- console.log(`Preset: ${standards.preset}`);
116
-
117
- // Show domains
118
- const domains = await getDomains();
119
- console.log(`Domains: ${domains.join(', ')}`);
120
- } catch (err) {
121
- console.error('❌ Failed to read production standards:', err.message);
122
- return;
123
- }
124
- ```
125
-
126
- ---
127
-
128
- ### Step 2A: Validate Scenarios (Scenario A - Hot Context)
129
-
130
- **For Scenario A only:** Quick validation of existing scenarios.
131
-
132
- ```javascript
133
- const { validateScenarios } = require('../../lib/production-scenario-validator');
134
- const { getDb } = require('../../lib/database');
135
-
136
- try {
137
- // Get feature scenario file
138
- const db = getDb();
139
- const feature = await new Promise((resolve, reject) => {
140
- db.get('SELECT * FROM work_items WHERE id = ?', [featureId], (err, row) => {
141
- if (err) reject(err);
142
- resolve(row);
143
- });
144
- });
145
-
146
- if (!feature.scenario_file) {
147
- console.error('❌ Feature has no scenario file.');
148
- return;
149
- }
150
-
151
- // Validate scenarios against standards
152
- const validation = await validateScenarios(feature.scenario_file, standards);
153
-
154
- console.log(`✅ Validation complete:`);
155
- console.log(` - Covered: ${validation.covered}/${validation.total} standards`);
156
- console.log(` - Gaps: ${validation.gaps.length}`);
157
-
158
- if (validation.hasGaps) {
159
- console.log('\n⚠️ Missing scenarios for:');
160
- validation.gaps.forEach(gap => {
161
- console.log(` - ${gap.domain}: ${gap.standardId}`);
162
- console.log(` ${gap.reasoning}`);
163
- });
164
-
165
- // Generate and append missing scenarios
166
- const { generateScenariosFromStandards } = require('../../lib/production-scenario-generator');
167
- const { appendScenarios } = require('../../lib/production-scenario-appender');
168
-
169
- const missingStandards = { standards: validation.gaps };
170
- const newScenarios = await generateScenariosFromStandards(missingStandards);
171
-
172
- await appendScenarios(feature.scenario_file, newScenarios);
173
- console.log(`✅ Added ${newScenarios.length} missing scenarios`);
174
- } else {
175
- console.log('✅ All standards are covered by existing scenarios');
176
- }
177
- } catch (err) {
178
- console.error('❌ Validation failed:', err.message);
179
- return;
180
- }
181
- ```
182
-
183
- ---
184
-
185
- ### Step 2B: Re-Validate Scenarios (Scenario B - Cold Context)
186
-
187
- **For Scenario B only:** Re-validate with current standards.
188
-
189
- ```javascript
190
- const { validateScenarios } = require('../../lib/production-scenario-validator');
191
- const config = require('../../lib/config');
192
-
193
- try {
194
- console.log('🔄 Re-validating scenarios against current standards...');
195
-
196
- // Check if project state changed
197
- const projectConfig = config.read();
198
- console.log(`Project state: ${projectConfig.project_state}`);
199
-
200
- // Get feature scenario file
201
- const db = getDb();
202
- const feature = await new Promise((resolve, reject) => {
203
- db.get('SELECT * FROM work_items WHERE id = ?', [featureId], (err, row) => {
204
- if (err) reject(err);
205
- resolve(row);
206
- });
207
- });
208
-
209
- // Validate scenarios
210
- const validation = await validateScenarios(feature.scenario_file, standards);
211
-
212
- console.log(`✅ Re-validation complete:`);
213
- console.log(` - Covered: ${validation.covered}/${validation.total} standards`);
214
- console.log(` - New gaps: ${validation.gaps.length}`);
215
-
216
- if (validation.hasGaps) {
217
- console.log('\n⚠️ Standards added/changed since last run:');
218
- validation.gaps.forEach(gap => {
219
- console.log(` - ${gap.domain}: ${gap.standardId}`);
220
- });
221
-
222
- // Generate and append missing scenarios
223
- const { generateScenariosFromStandards } = require('../../lib/production-scenario-generator');
224
- const { appendScenarios } = require('../../lib/production-scenario-appender');
225
-
226
- const missingStandards = { standards: validation.gaps };
227
- const newScenarios = await generateScenariosFromStandards(missingStandards);
228
-
229
- await appendScenarios(feature.scenario_file, newScenarios);
230
- console.log(`✅ Updated with ${newScenarios.length} new scenarios`);
231
- }
232
- } catch (err) {
233
- console.error('❌ Re-validation failed:', err.message);
234
- return;
235
- }
236
- ```
237
-
238
- ---
239
-
240
- ### Step 2C: Generate Scenarios (Scenario C - Post-Transition)
241
-
242
- **For Scenario C only:** Generate production scenarios from standards.
243
-
244
- ```javascript
245
- const { generateScenariosFromStandards } = require('../../lib/production-scenario-generator');
246
- const { appendScenarios } = require('../../lib/production-scenario-appender');
247
- const { getDb } = require('../../lib/database');
248
-
249
- try {
250
- console.log('✨ Generating production scenarios from standards...');
251
-
252
- // Get feature
253
- const db = getDb();
254
- const feature = await new Promise((resolve, reject) => {
255
- db.get('SELECT * FROM work_items WHERE id = ?', [featureId], (err, row) => {
256
- if (err) reject(err);
257
- resolve(row);
258
- });
259
- });
260
-
261
- if (!feature.scenario_file) {
262
- console.error('❌ Feature has no scenario file.');
263
- return;
264
- }
265
-
266
- // Generate scenarios
267
- const scenarios = await generateScenariosFromStandards(standards);
268
-
269
- console.log(`✅ Generated ${scenarios.length} production scenarios`);
270
- console.log('Domains covered:', [...new Set(standards.standards.map(s => s.domain))].join(', '));
271
-
272
- // Append to feature file
273
- await appendScenarios(feature.scenario_file, scenarios);
274
- console.log(`✅ Appended scenarios to ${feature.scenario_file}`);
275
-
276
- // Create production chores if none exist
277
- const { generateChoresFromStandards } = require('../../lib/production-chore-generator');
278
- const chores = generateChoresFromStandards(standards, feature.title);
279
-
280
- console.log(`\n📋 Proposed ${chores.length} production chores:`);
281
- chores.forEach((chore, i) => {
282
- console.log(`\n${i + 1}. ${chore.title}`);
283
- console.log(` ${chore.description.split('\n')[0]}`);
284
- });
285
-
286
- console.log('\n✅ Production scenarios ready. Create chores to implement them.');
287
- } catch (err) {
288
- console.error('❌ Scenario generation failed:', err.message);
289
- return;
290
- }
291
- ```
292
-
293
- ---
294
-
295
- ### Step 3: Implement Production Chore
296
-
297
- **For all scenarios:** Implement the current production chore.
298
-
299
- ```javascript
300
- const { getCurrentWork } = require('../../lib/current-work');
301
- const fs = require('fs');
302
-
303
- try {
304
- const currentWork = getCurrentWork();
305
-
306
- console.log(`\n🚀 Implementing: ${currentWork.title}`);
307
- console.log(`Description: ${currentWork.description}`);
308
-
309
- // Parse chore to understand which standard to implement
310
- // Implementation follows the acceptance criteria from the standard
311
-
312
- // Example: If chore is about TLS enforcement
313
- // 1. Read the standard's acceptance criteria
314
- // 2. Implement code that satisfies the criteria
315
- // 3. Add tests based on scenario steps
316
-
317
- console.log('\n✅ Implementation complete');
318
- console.log('Run: npx cucumber-js to verify scenarios pass');
319
- } catch (err) {
320
- console.error('❌ Implementation failed:', err.message);
321
- return;
322
- }
323
- ```
324
-
325
- ---
326
-
327
- ## Key Differences from Stable Mode
328
-
329
- **Stable Mode:**
330
- - Adds error handling to speed code
331
- - Validates inputs, handles edge cases
332
- - Makes existing features robust
333
-
334
- **Production Mode:**
335
- - Hardens features for production deployment
336
- - Implements security, scale, compliance standards
337
- - Adds monitoring, backup, failover capabilities
338
- - Standards-driven (not just adding error handling)
339
-
340
- **Example:**
341
-
342
- **Stable Mode Chore:** "Add error handling to login feature"
343
- → Validates email format, handles network errors, shows error messages
344
-
345
- **Production Mode Chore:** "Add security hardening to login feature"
346
- → Rate limiting, brute force protection, MFA support, audit logging
347
-
348
- ---
349
-
350
- ## Validation
351
-
352
- Before completing production mode, ensure:
353
- - [ ] Context detected correctly (A/B/C)
354
- - [ ] Production standards read successfully
355
- - [ ] All production scenarios pass
356
- - [ ] Security measures implemented per standards
357
- - [ ] Performance targets met per standards
358
- - [ ] Compliance requirements satisfied
359
- - [ ] Monitoring and observability added
360
- - [ ] Documentation updated
361
-
362
- ---
363
-
364
- ## Next Steps After Production Mode
365
-
366
- Once all production chores complete:
367
- 1. Feature is production-ready
368
- 2. Can be deployed to external environment
369
- 3. Meets all standards for scale, security, compliance