claude-mpm 3.3.2__py3-none-any.whl → 3.4.2__py3-none-any.whl

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 (48) hide show
  1. claude_mpm/cli/commands/memory.py +192 -14
  2. claude_mpm/cli/parser.py +13 -1
  3. claude_mpm/constants.py +1 -0
  4. claude_mpm/core/claude_runner.py +61 -0
  5. claude_mpm/core/config.py +161 -1
  6. claude_mpm/core/simple_runner.py +61 -0
  7. claude_mpm/hooks/builtin/mpm_command_hook.py +5 -5
  8. claude_mpm/hooks/claude_hooks/hook_handler.py +211 -4
  9. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -3
  10. claude_mpm/hooks/memory_integration_hook.py +51 -5
  11. claude_mpm/scripts/socketio_daemon.py +49 -9
  12. claude_mpm/scripts/socketio_server_manager.py +370 -45
  13. claude_mpm/services/__init__.py +41 -5
  14. claude_mpm/services/agent_memory_manager.py +541 -51
  15. claude_mpm/services/exceptions.py +677 -0
  16. claude_mpm/services/health_monitor.py +892 -0
  17. claude_mpm/services/memory_builder.py +341 -7
  18. claude_mpm/services/memory_optimizer.py +6 -2
  19. claude_mpm/services/project_analyzer.py +771 -0
  20. claude_mpm/services/recovery_manager.py +670 -0
  21. claude_mpm/services/socketio_server.py +653 -36
  22. claude_mpm/services/standalone_socketio_server.py +703 -34
  23. claude_mpm/services/version_control/git_operations.py +26 -0
  24. {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.2.dist-info}/METADATA +34 -10
  25. {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.2.dist-info}/RECORD +30 -44
  26. claude_mpm/agents/agent-template.yaml +0 -83
  27. claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json +0 -6
  28. claude_mpm/cli/README.md +0 -109
  29. claude_mpm/cli_module/refactoring_guide.md +0 -253
  30. claude_mpm/core/agent_registry.py.bak +0 -312
  31. claude_mpm/core/base_service.py.bak +0 -406
  32. claude_mpm/hooks/README.md +0 -97
  33. claude_mpm/orchestration/SUBPROCESS_DESIGN.md +0 -66
  34. claude_mpm/schemas/README_SECURITY.md +0 -92
  35. claude_mpm/schemas/agent_schema.json +0 -395
  36. claude_mpm/schemas/agent_schema_documentation.md +0 -181
  37. claude_mpm/schemas/agent_schema_security_notes.md +0 -165
  38. claude_mpm/schemas/examples/standard_workflow.json +0 -505
  39. claude_mpm/schemas/ticket_workflow_documentation.md +0 -482
  40. claude_mpm/schemas/ticket_workflow_schema.json +0 -590
  41. claude_mpm/services/framework_claude_md_generator/README.md +0 -92
  42. claude_mpm/services/parent_directory_manager/README.md +0 -83
  43. claude_mpm/services/version_control/VERSION +0 -1
  44. /claude_mpm/{web → dashboard}/open_dashboard.py +0 -0
  45. {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.2.dist-info}/WHEEL +0 -0
  46. {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.2.dist-info}/entry_points.txt +0 -0
  47. {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.2.dist-info}/licenses/LICENSE +0 -0
  48. {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.2.dist-info}/top_level.txt +0 -0
@@ -1,165 +0,0 @@
1
- # Security Analysis: Agent Schema and Validation System
2
-
3
- ## Overview
4
- This document provides a comprehensive security analysis of the claude-mpm agent validation system, highlighting security features, considerations, and recommendations.
5
-
6
- ## Schema Security Features (agent_schema.json)
7
-
8
- ### 1. Input Validation
9
- - **Strict Type Enforcement**: All fields have explicit types preventing type confusion attacks
10
- - **Pattern Validation**: Agent IDs use pattern `^[a-z][a-z0-9_]*$` preventing injection attacks
11
- - **Enum Restrictions**: Tools and models restricted to known safe values
12
- - **Length Limits**: All string fields have min/max length to prevent memory exhaustion
13
- - Instructions: max 8000 characters
14
- - Name: max 50 characters
15
- - Description: max 200 characters
16
-
17
- ### 2. Resource Controls
18
- - **Memory Limits**: 512MB-8192MB range prevents OOM attacks
19
- - **CPU Limits**: 10%-100% prevents resource hogging
20
- - **Timeout Limits**: 30s-3600s prevents infinite operations
21
- - **Token Limits**: 1000-200000 prevents API abuse
22
-
23
- ### 3. Access Controls
24
- - **Network Access**: Default false, explicit opt-in required
25
- - **File Access Paths**: Explicit read/write path restrictions
26
- - **Tool Access**: Enumerated list prevents arbitrary tool usage
27
- - **Additional Properties**: Set to false preventing field injection
28
-
29
- ### 4. Dangerous Tool Combinations
30
- The schema allows these potentially dangerous combinations:
31
- - **Bash + Write**: Can create and execute arbitrary scripts
32
- - **docker + kubectl**: Container escape potential
33
- - **aws + gcloud + azure**: Multiple cloud access increases attack surface
34
-
35
- ## Validator Security Features (agent_validator.py)
36
-
37
- ### 1. File Operation Security
38
- - **Path Validation**: Checks file exists and is regular file
39
- - **File Size Limits**: 1MB max prevents memory exhaustion
40
- - **Symlink Protection**: Skips symlinks to prevent directory traversal
41
- - **Directory Limits**: Max 100 files per directory prevents DoS
42
-
43
- ### 2. Business Rule Security
44
- - **Double Validation**: Schema + business rules for defense in depth
45
- - **ID Format Checking**: Additional validation beyond schema pattern
46
- - **Resource Tier Validation**: Ensures limits match tier constraints
47
- - **Tool Compatibility**: Validates dangerous tool combinations
48
-
49
- ### 3. Migration Security
50
- - **Privilege Escalation Prevention**: Flags dangerous tools added during migration
51
- - **Functionality Preservation**: Ensures security constraints maintained
52
- - **Instruction Validation**: Prevents loss of security instructions
53
-
54
- ## Security Recommendations
55
-
56
- ### 1. Immediate Improvements
57
- ```python
58
- # Add to validator.py
59
- def _validate_path_injection(self, path: str) -> bool:
60
- """Prevent path traversal attacks"""
61
- if '..' in path or path.startswith('/'):
62
- return False
63
- return True
64
-
65
- def _validate_command_injection(self, value: str) -> bool:
66
- """Prevent command injection in string values"""
67
- dangerous_chars = ['$', '`', ';', '&', '|', '>', '<']
68
- return not any(char in value for char in dangerous_chars)
69
- ```
70
-
71
- ### 2. Schema Enhancements
72
- ```json
73
- {
74
- "capabilities": {
75
- "properties": {
76
- "sandbox_mode": {
77
- "type": "boolean",
78
- "default": true,
79
- "description": "Run agent in sandboxed environment"
80
- },
81
- "max_file_size": {
82
- "type": "integer",
83
- "default": 10485760,
84
- "description": "Maximum file size agent can read/write (10MB default)"
85
- }
86
- }
87
- }
88
- }
89
- ```
90
-
91
- ### 3. Audit Logging
92
- ```python
93
- def validate_agent(self, agent_data: Dict[str, Any]) -> ValidationResult:
94
- # Add security audit logging
95
- audit_log = {
96
- "timestamp": datetime.utcnow().isoformat(),
97
- "agent_id": agent_data.get("id"),
98
- "tools": agent_data.get("capabilities", {}).get("tools", []),
99
- "network_access": agent_data.get("capabilities", {}).get("network_access", False),
100
- "validation_result": "pending"
101
- }
102
- # Log to security audit trail
103
- ```
104
-
105
- ### 4. Runtime Security Checks
106
- - Implement runtime validation of actual tool usage vs declared tools
107
- - Monitor resource usage against declared limits
108
- - Validate file access against declared paths
109
- - Check for privilege escalation attempts
110
-
111
- ## Potential Security Issues
112
-
113
- ### 1. Missing Validations
114
- - No validation of hook configurations
115
- - No validation of file path patterns for malicious patterns
116
- - No rate limiting on validation operations
117
- - No cryptographic signing of agent configurations
118
-
119
- ### 2. Information Disclosure
120
- - Error messages may reveal system paths
121
- - Schema version in metadata could aid attackers
122
- - No sanitization of user-provided descriptions
123
-
124
- ### 3. Trust Boundaries
125
- - No verification of agent template sources
126
- - No integrity checking of loaded schemas
127
- - Migration process trusts old configurations
128
-
129
- ## Security Best Practices for Agent Authors
130
-
131
- 1. **Principle of Least Privilege**: Only request tools actually needed
132
- 2. **Avoid Dangerous Combinations**: Don't combine Bash with Write unless essential
133
- 3. **Explicit Path Restrictions**: Always specify file access paths
134
- 4. **Network Isolation**: Only enable network_access when required
135
- 5. **Resource Limits**: Set appropriate limits for agent workload
136
- 6. **Input Sanitization**: Never trust user input in agent instructions
137
- 7. **Secure Defaults**: Start with minimal permissions and add as needed
138
-
139
- ## Compliance Considerations
140
-
141
- ### OWASP Top 10 Coverage
142
- - **A01:2021 Broken Access Control**: ✓ Tool and file access restrictions
143
- - **A02:2021 Cryptographic Failures**: ⚠️ No encryption of agent configs
144
- - **A03:2021 Injection**: ✓ Pattern validation, enum restrictions
145
- - **A04:2021 Insecure Design**: ✓ Defense in depth validation
146
- - **A05:2021 Security Misconfiguration**: ✓ Secure defaults, explicit opt-in
147
- - **A06:2021 Vulnerable Components**: ⚠️ No component version checking
148
- - **A07:2021 Identification and Authentication**: N/A (handled elsewhere)
149
- - **A08:2021 Software and Data Integrity**: ⚠️ No integrity verification
150
- - **A09:2021 Security Logging**: ⚠️ Limited security event logging
151
- - **A10:2021 SSRF**: ✓ Network access controls
152
-
153
- ## Conclusion
154
-
155
- The claude-mpm validation system implements strong security controls through:
156
- - Strict schema validation with type safety
157
- - Resource limits preventing DoS attacks
158
- - Access controls for tools and files
159
- - Defense in depth with multiple validation layers
160
-
161
- Key areas for improvement:
162
- - Cryptographic signing of configurations
163
- - Enhanced audit logging
164
- - Runtime security monitoring
165
- - Integrity verification
@@ -1,505 +0,0 @@
1
- {
2
- "schema_version": "1.0.0",
3
- "workflow_id": "standard_workflow",
4
- "workflow_version": "1.0.0",
5
- "metadata": {
6
- "name": "Standard Ticket Workflow",
7
- "description": "Default workflow for general ticket management with clear status-resolution separation",
8
- "workflow_type": "standard",
9
- "author": "Claude MPM Team",
10
- "created_at": "2025-01-28T00:00:00Z",
11
- "updated_at": "2025-01-28T00:00:00Z",
12
- "tags": ["default", "general", "support"]
13
- },
14
- "status_states": {
15
- "states": [
16
- {
17
- "id": "open",
18
- "name": "Open",
19
- "description": "Ticket has been created but not yet assigned or started",
20
- "category": "initial",
21
- "is_default": true,
22
- "color": "#9E9E9E",
23
- "icon": "circle-o",
24
- "sla_hours": 24
25
- },
26
- {
27
- "id": "in_progress",
28
- "name": "In Progress",
29
- "description": "Ticket is actively being worked on by an assignee",
30
- "category": "active",
31
- "color": "#2196F3",
32
- "icon": "spinner",
33
- "sla_hours": 48
34
- },
35
- {
36
- "id": "pending",
37
- "name": "Pending",
38
- "description": "Ticket is waiting for external input, dependencies, or customer response",
39
- "category": "waiting",
40
- "color": "#FF9800",
41
- "icon": "clock-o"
42
- },
43
- {
44
- "id": "resolved",
45
- "name": "Resolved",
46
- "description": "Work is complete and solution has been implemented",
47
- "category": "terminal",
48
- "color": "#4CAF50",
49
- "icon": "check-circle"
50
- },
51
- {
52
- "id": "closed",
53
- "name": "Closed",
54
- "description": "Ticket is closed and no further action is required",
55
- "category": "terminal",
56
- "color": "#607D8B",
57
- "icon": "archive"
58
- },
59
- {
60
- "id": "reopened",
61
- "name": "Reopened",
62
- "description": "Previously closed ticket has been reopened for additional work",
63
- "category": "active",
64
- "color": "#9C27B0",
65
- "icon": "refresh"
66
- },
67
- {
68
- "id": "on_hold",
69
- "name": "On Hold",
70
- "description": "Work is temporarily suspended due to blockers or priorities",
71
- "category": "waiting",
72
- "color": "#795548",
73
- "icon": "pause-circle"
74
- },
75
- {
76
- "id": "escalated",
77
- "name": "Escalated",
78
- "description": "Ticket has been escalated to higher priority or management attention",
79
- "category": "active",
80
- "color": "#F44336",
81
- "icon": "exclamation-triangle",
82
- "sla_hours": 4
83
- },
84
- {
85
- "id": "canceled",
86
- "name": "Canceled",
87
- "description": "Ticket has been canceled before completion",
88
- "category": "terminal",
89
- "color": "#E91E63",
90
- "icon": "times-circle"
91
- }
92
- ],
93
- "default_status": "open"
94
- },
95
- "resolution_types": {
96
- "types": [
97
- {
98
- "id": "fixed",
99
- "name": "Fixed/Resolved",
100
- "description": "Issue was successfully fixed or request was fulfilled",
101
- "category": "successful",
102
- "requires_comment": false,
103
- "color": "#4CAF50",
104
- "icon": "check"
105
- },
106
- {
107
- "id": "wont_fix",
108
- "name": "Won't Fix",
109
- "description": "Deliberate decision made not to address the issue",
110
- "category": "unsuccessful",
111
- "requires_comment": true,
112
- "color": "#F44336",
113
- "icon": "ban"
114
- },
115
- {
116
- "id": "duplicate",
117
- "name": "Duplicate",
118
- "description": "Issue is a duplicate of another existing ticket",
119
- "category": "invalid",
120
- "requires_comment": true,
121
- "color": "#9E9E9E",
122
- "icon": "copy"
123
- },
124
- {
125
- "id": "cannot_reproduce",
126
- "name": "Cannot Reproduce",
127
- "description": "Issue cannot be reproduced or verified",
128
- "category": "invalid",
129
- "requires_comment": true,
130
- "color": "#FF9800",
131
- "icon": "question-circle"
132
- },
133
- {
134
- "id": "works_as_designed",
135
- "name": "Works as Designed",
136
- "description": "Reported behavior is intentional and not a bug",
137
- "category": "invalid",
138
- "requires_comment": false,
139
- "color": "#3F51B5",
140
- "icon": "info-circle"
141
- },
142
- {
143
- "id": "incomplete",
144
- "name": "Incomplete",
145
- "description": "Insufficient information provided to proceed",
146
- "category": "unsuccessful",
147
- "requires_comment": true,
148
- "color": "#795548",
149
- "icon": "file-text-o"
150
- },
151
- {
152
- "id": "user_error",
153
- "name": "User Error",
154
- "description": "Issue was due to user error or misunderstanding",
155
- "category": "invalid",
156
- "requires_comment": true,
157
- "color": "#607D8B",
158
- "icon": "user-times"
159
- },
160
- {
161
- "id": "configuration",
162
- "name": "Configuration",
163
- "description": "Issue was resolved through configuration changes only",
164
- "category": "successful",
165
- "requires_comment": false,
166
- "color": "#00BCD4",
167
- "icon": "cog"
168
- },
169
- {
170
- "id": "workaround",
171
- "name": "Workaround",
172
- "description": "A workaround has been provided as an alternative solution",
173
- "category": "successful",
174
- "requires_comment": true,
175
- "color": "#CDDC39",
176
- "icon": "lightbulb-o"
177
- },
178
- {
179
- "id": "documentation",
180
- "name": "Documentation",
181
- "description": "Issue was resolved by updating or providing documentation",
182
- "category": "successful",
183
- "requires_comment": false,
184
- "color": "#009688",
185
- "icon": "book"
186
- }
187
- ]
188
- },
189
- "transitions": {
190
- "rules": [
191
- {
192
- "from_status": "open",
193
- "to_status": "in_progress",
194
- "name": "Start Work",
195
- "description": "Begin working on the ticket",
196
- "required_fields": ["assignee"],
197
- "auto_assign": true
198
- },
199
- {
200
- "from_status": "open",
201
- "to_status": "escalated",
202
- "name": "Escalate",
203
- "description": "Escalate ticket for immediate attention",
204
- "permissions": ["escalate_ticket"]
205
- },
206
- {
207
- "from_status": "open",
208
- "to_status": "canceled",
209
- "name": "Cancel",
210
- "description": "Cancel ticket without starting work",
211
- "required_fields": ["resolution"]
212
- },
213
- {
214
- "from_status": "in_progress",
215
- "to_status": "pending",
216
- "name": "Wait for Input",
217
- "description": "Pause work to wait for external input"
218
- },
219
- {
220
- "from_status": "in_progress",
221
- "to_status": "on_hold",
222
- "name": "Put on Hold",
223
- "description": "Temporarily suspend work"
224
- },
225
- {
226
- "from_status": "in_progress",
227
- "to_status": "resolved",
228
- "name": "Resolve",
229
- "description": "Mark work as complete",
230
- "required_fields": ["resolution"]
231
- },
232
- {
233
- "from_status": "in_progress",
234
- "to_status": "escalated",
235
- "name": "Escalate",
236
- "description": "Escalate active ticket",
237
- "permissions": ["escalate_ticket"]
238
- },
239
- {
240
- "from_status": "pending",
241
- "to_status": "in_progress",
242
- "name": "Resume Work",
243
- "description": "Resume work after receiving input"
244
- },
245
- {
246
- "from_status": "on_hold",
247
- "to_status": "in_progress",
248
- "name": "Resume Work",
249
- "description": "Resume work from hold status"
250
- },
251
- {
252
- "from_status": "resolved",
253
- "to_status": "closed",
254
- "name": "Close",
255
- "description": "Close resolved ticket"
256
- },
257
- {
258
- "from_status": "resolved",
259
- "to_status": "reopened",
260
- "name": "Reopen",
261
- "description": "Reopen resolved ticket for additional work"
262
- },
263
- {
264
- "from_status": "closed",
265
- "to_status": "reopened",
266
- "name": "Reopen",
267
- "description": "Reopen closed ticket",
268
- "permissions": ["reopen_ticket"]
269
- },
270
- {
271
- "from_status": "reopened",
272
- "to_status": "in_progress",
273
- "name": "Start Rework",
274
- "description": "Begin working on reopened ticket",
275
- "required_fields": ["assignee"]
276
- },
277
- {
278
- "from_status": "escalated",
279
- "to_status": "in_progress",
280
- "name": "De-escalate",
281
- "description": "Return to normal priority",
282
- "permissions": ["escalate_ticket"]
283
- },
284
- {
285
- "from_status": "escalated",
286
- "to_status": "resolved",
287
- "name": "Resolve",
288
- "description": "Resolve escalated ticket",
289
- "required_fields": ["resolution"]
290
- },
291
- {
292
- "from_status": "*",
293
- "to_status": "canceled",
294
- "name": "Force Cancel",
295
- "description": "Cancel ticket from any state",
296
- "permissions": ["admin_ticket"],
297
- "required_fields": ["resolution"]
298
- }
299
- ],
300
- "allow_self_transitions": false
301
- },
302
- "status_resolution_mapping": {
303
- "mappings": [
304
- {
305
- "status_id": "resolved",
306
- "allowed_resolutions": [
307
- "fixed",
308
- "configuration",
309
- "workaround",
310
- "documentation"
311
- ],
312
- "requires_resolution": true,
313
- "default_resolution": "fixed"
314
- },
315
- {
316
- "status_id": "closed",
317
- "allowed_resolutions": [
318
- "fixed",
319
- "wont_fix",
320
- "duplicate",
321
- "cannot_reproduce",
322
- "works_as_designed",
323
- "incomplete",
324
- "user_error",
325
- "configuration",
326
- "workaround",
327
- "documentation"
328
- ],
329
- "requires_resolution": true
330
- },
331
- {
332
- "status_id": "canceled",
333
- "allowed_resolutions": [
334
- "duplicate",
335
- "wont_fix",
336
- "incomplete",
337
- "user_error",
338
- "works_as_designed"
339
- ],
340
- "requires_resolution": true,
341
- "default_resolution": "wont_fix"
342
- },
343
- {
344
- "status_id": "open",
345
- "allowed_resolutions": [],
346
- "requires_resolution": false
347
- },
348
- {
349
- "status_id": "in_progress",
350
- "allowed_resolutions": [],
351
- "requires_resolution": false
352
- },
353
- {
354
- "status_id": "pending",
355
- "allowed_resolutions": [],
356
- "requires_resolution": false
357
- },
358
- {
359
- "status_id": "on_hold",
360
- "allowed_resolutions": [],
361
- "requires_resolution": false
362
- },
363
- {
364
- "status_id": "escalated",
365
- "allowed_resolutions": [],
366
- "requires_resolution": false
367
- },
368
- {
369
- "status_id": "reopened",
370
- "allowed_resolutions": [],
371
- "requires_resolution": false
372
- }
373
- ]
374
- },
375
- "business_rules": {
376
- "auto_close": {
377
- "enabled": true,
378
- "days_after_resolved": 7,
379
- "excluded_resolutions": ["workaround"]
380
- },
381
- "reopen_rules": {
382
- "allow_reopen": true,
383
- "from_statuses": ["resolved", "closed"],
384
- "max_reopen_count": 3,
385
- "reopen_window_days": 30
386
- },
387
- "escalation_rules": [
388
- {
389
- "name": "High Priority SLA",
390
- "condition": {
391
- "status": "open",
392
- "hours_in_status": 4,
393
- "priority": "high"
394
- },
395
- "action": {
396
- "change_status": "escalated",
397
- "notify": ["manager", "on_call"]
398
- }
399
- },
400
- {
401
- "name": "Critical Priority SLA",
402
- "condition": {
403
- "status": "open",
404
- "hours_in_status": 1,
405
- "priority": "critical"
406
- },
407
- "action": {
408
- "change_status": "escalated",
409
- "change_priority": "critical",
410
- "notify": ["director", "manager", "on_call"]
411
- }
412
- },
413
- {
414
- "name": "Stale In Progress",
415
- "condition": {
416
- "status": "in_progress",
417
- "hours_in_status": 168
418
- },
419
- "action": {
420
- "notify": ["assignee", "manager"]
421
- }
422
- }
423
- ]
424
- },
425
- "ui_configuration": {
426
- "status_display_order": [
427
- "open",
428
- "in_progress",
429
- "pending",
430
- "on_hold",
431
- "escalated",
432
- "reopened",
433
- "resolved",
434
- "closed",
435
- "canceled"
436
- ],
437
- "resolution_display_order": [
438
- "fixed",
439
- "configuration",
440
- "workaround",
441
- "documentation",
442
- "duplicate",
443
- "cannot_reproduce",
444
- "works_as_designed",
445
- "user_error",
446
- "incomplete",
447
- "wont_fix"
448
- ],
449
- "quick_transitions": [
450
- {
451
- "from_status": "open",
452
- "to_status": "in_progress",
453
- "button_label": "Start Work",
454
- "button_style": "primary"
455
- },
456
- {
457
- "from_status": "in_progress",
458
- "to_status": "resolved",
459
- "button_label": "Resolve",
460
- "button_style": "success"
461
- },
462
- {
463
- "from_status": "in_progress",
464
- "to_status": "pending",
465
- "button_label": "Wait for Input",
466
- "button_style": "warning"
467
- },
468
- {
469
- "from_status": "resolved",
470
- "to_status": "closed",
471
- "button_label": "Close",
472
- "button_style": "secondary"
473
- },
474
- {
475
- "from_status": "resolved",
476
- "to_status": "reopened",
477
- "button_label": "Reopen",
478
- "button_style": "danger"
479
- }
480
- ]
481
- },
482
- "metrics": {
483
- "cycle_time_statuses": {
484
- "start": ["in_progress", "reopened"],
485
- "end": ["resolved", "closed", "canceled"]
486
- },
487
- "resolution_metrics": [
488
- {
489
- "name": "Success Rate",
490
- "resolution_ids": ["fixed", "configuration", "workaround", "documentation"],
491
- "metric_type": "success_rate"
492
- },
493
- {
494
- "name": "Invalid Rate",
495
- "resolution_ids": ["duplicate", "cannot_reproduce", "works_as_designed", "user_error"],
496
- "metric_type": "invalid_rate"
497
- },
498
- {
499
- "name": "Incomplete Rate",
500
- "resolution_ids": ["incomplete", "wont_fix"],
501
- "metric_type": "incomplete_rate"
502
- }
503
- ]
504
- }
505
- }