musubi-sdd 5.0.0 → 5.6.1
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/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +164 -145
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +247 -125
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +83 -80
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +53 -44
- package/src/monitoring/incident-manager.js +123 -103
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +82 -59
- package/src/monitoring/quality-dashboard.js +51 -39
- package/src/monitoring/release-manager.js +70 -50
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- package/src/validators/traceability-validator.js +7 -11
|
@@ -9,21 +9,25 @@ Guide for implementing Service Level Objectives (SLOs) and Service Level Indicat
|
|
|
9
9
|
## Key Concepts
|
|
10
10
|
|
|
11
11
|
### SLI (Service Level Indicator)
|
|
12
|
+
|
|
12
13
|
A quantitative measure of service behavior.
|
|
13
14
|
|
|
14
15
|
**Example**: 99.5% of requests return successfully in under 200ms.
|
|
15
16
|
|
|
16
17
|
### SLO (Service Level Objective)
|
|
18
|
+
|
|
17
19
|
A target value for an SLI.
|
|
18
20
|
|
|
19
21
|
**Example**: 99.9% availability over 30 days.
|
|
20
22
|
|
|
21
23
|
### SLA (Service Level Agreement)
|
|
24
|
+
|
|
22
25
|
A contract with consequences for missing SLOs.
|
|
23
26
|
|
|
24
27
|
**Example**: If uptime < 99.9%, customer gets 10% credit.
|
|
25
28
|
|
|
26
29
|
### Error Budget
|
|
30
|
+
|
|
27
31
|
The acceptable amount of downtime/errors.
|
|
28
32
|
|
|
29
33
|
**Example**: 99.9% availability = 43 minutes downtime/month budget.
|
|
@@ -33,32 +37,37 @@ The acceptable amount of downtime/errors.
|
|
|
33
37
|
## Common SLIs
|
|
34
38
|
|
|
35
39
|
### 1. Availability
|
|
40
|
+
|
|
36
41
|
```
|
|
37
42
|
Availability = (Successful Requests / Total Requests) × 100
|
|
38
43
|
```
|
|
39
44
|
|
|
40
45
|
### 2. Latency
|
|
46
|
+
|
|
41
47
|
```
|
|
42
48
|
Latency SLI = Requests < Threshold / Total Requests
|
|
43
49
|
```
|
|
44
50
|
|
|
45
51
|
| Percentile | Typical Target |
|
|
46
|
-
|
|
47
|
-
| p50
|
|
48
|
-
| p95
|
|
49
|
-
| p99
|
|
52
|
+
| ---------- | -------------- |
|
|
53
|
+
| p50 | < 100ms |
|
|
54
|
+
| p95 | < 250ms |
|
|
55
|
+
| p99 | < 500ms |
|
|
50
56
|
|
|
51
57
|
### 3. Throughput
|
|
58
|
+
|
|
52
59
|
```
|
|
53
60
|
Throughput = Requests per Second (RPS)
|
|
54
61
|
```
|
|
55
62
|
|
|
56
63
|
### 4. Error Rate
|
|
64
|
+
|
|
57
65
|
```
|
|
58
66
|
Error Rate = (Failed Requests / Total Requests) × 100
|
|
59
67
|
```
|
|
60
68
|
|
|
61
69
|
### 5. Saturation
|
|
70
|
+
|
|
62
71
|
```
|
|
63
72
|
CPU Utilization, Memory Usage, Queue Depth
|
|
64
73
|
```
|
|
@@ -70,12 +79,12 @@ CPU Utilization, Memory Usage, Queue Depth
|
|
|
70
79
|
### Step 1: Identify Critical User Journeys
|
|
71
80
|
|
|
72
81
|
```markdown
|
|
73
|
-
| Journey
|
|
74
|
-
|
|
75
|
-
| Login
|
|
76
|
-
| Checkout | Payment processing
|
|
77
|
-
| Search
|
|
78
|
-
| Browse
|
|
82
|
+
| Journey | Description | Importance |
|
|
83
|
+
| -------- | ------------------- | ---------- |
|
|
84
|
+
| Login | User authentication | Critical |
|
|
85
|
+
| Checkout | Payment processing | Critical |
|
|
86
|
+
| Search | Product search | High |
|
|
87
|
+
| Browse | Catalog browsing | Medium |
|
|
79
88
|
```
|
|
80
89
|
|
|
81
90
|
### Step 2: Define SLIs for Each Journey
|
|
@@ -85,16 +94,16 @@ journeys:
|
|
|
85
94
|
login:
|
|
86
95
|
slis:
|
|
87
96
|
- type: availability
|
|
88
|
-
measure:
|
|
97
|
+
measure: '% of successful logins'
|
|
89
98
|
- type: latency
|
|
90
|
-
measure:
|
|
91
|
-
|
|
99
|
+
measure: 'p99 login time'
|
|
100
|
+
|
|
92
101
|
checkout:
|
|
93
102
|
slis:
|
|
94
103
|
- type: availability
|
|
95
|
-
measure:
|
|
104
|
+
measure: '% of successful checkouts'
|
|
96
105
|
- type: latency
|
|
97
|
-
measure:
|
|
106
|
+
measure: 'p95 checkout time'
|
|
98
107
|
```
|
|
99
108
|
|
|
100
109
|
### Step 3: Set SLO Targets
|
|
@@ -104,11 +113,11 @@ slos:
|
|
|
104
113
|
login-availability:
|
|
105
114
|
target: 99.9%
|
|
106
115
|
window: 30 days
|
|
107
|
-
|
|
116
|
+
|
|
108
117
|
login-latency-p99:
|
|
109
118
|
target: 500ms
|
|
110
119
|
window: 30 days
|
|
111
|
-
|
|
120
|
+
|
|
112
121
|
checkout-availability:
|
|
113
122
|
target: 99.95%
|
|
114
123
|
window: 30 days
|
|
@@ -118,29 +127,32 @@ slos:
|
|
|
118
127
|
|
|
119
128
|
## SLO Document Template
|
|
120
129
|
|
|
121
|
-
|
|
130
|
+
````markdown
|
|
122
131
|
# SLO Document: [Service Name]
|
|
123
132
|
|
|
124
133
|
## Service Overview
|
|
134
|
+
|
|
125
135
|
[Brief description of the service]
|
|
126
136
|
|
|
127
137
|
## SLO Summary
|
|
128
138
|
|
|
129
|
-
| SLO
|
|
130
|
-
|
|
131
|
-
| Availability
|
|
132
|
-
| Latency (p99) | < 200ms | 30 days | P1
|
|
133
|
-
| Error Rate
|
|
139
|
+
| SLO | Target | Window | Priority |
|
|
140
|
+
| ------------- | ------- | ------- | -------- |
|
|
141
|
+
| Availability | 99.9% | 30 days | P0 |
|
|
142
|
+
| Latency (p99) | < 200ms | 30 days | P1 |
|
|
143
|
+
| Error Rate | < 0.1% | 30 days | P1 |
|
|
134
144
|
|
|
135
145
|
## Detailed SLOs
|
|
136
146
|
|
|
137
147
|
### Availability
|
|
148
|
+
|
|
138
149
|
- **SLI**: Percentage of successful HTTP responses (2xx, 3xx)
|
|
139
150
|
- **Target**: 99.9%
|
|
140
151
|
- **Window**: Rolling 30 days
|
|
141
152
|
- **Error Budget**: 43.2 minutes/month
|
|
142
153
|
|
|
143
154
|
### Latency
|
|
155
|
+
|
|
144
156
|
- **SLI**: p99 latency of all API requests
|
|
145
157
|
- **Target**: < 200ms
|
|
146
158
|
- **Window**: Rolling 30 days
|
|
@@ -148,35 +160,40 @@ slos:
|
|
|
148
160
|
## Measurement
|
|
149
161
|
|
|
150
162
|
### Data Sources
|
|
163
|
+
|
|
151
164
|
- Prometheus metrics
|
|
152
165
|
- Application logs
|
|
153
166
|
- Synthetic monitoring
|
|
154
167
|
|
|
155
168
|
### Queries
|
|
169
|
+
|
|
156
170
|
```promql
|
|
157
171
|
# Availability
|
|
158
|
-
sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
|
|
159
|
-
/
|
|
172
|
+
sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
|
|
173
|
+
/
|
|
160
174
|
sum(rate(http_requests_total[5m]))
|
|
161
175
|
|
|
162
176
|
# Latency p99
|
|
163
|
-
histogram_quantile(0.99,
|
|
177
|
+
histogram_quantile(0.99,
|
|
164
178
|
sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
|
|
165
179
|
)
|
|
166
180
|
```
|
|
181
|
+
````
|
|
167
182
|
|
|
168
183
|
## Alerting
|
|
169
184
|
|
|
170
|
-
| Alert
|
|
171
|
-
|
|
172
|
-
| Burn Rate High
|
|
173
|
-
| Burn Rate Warning | 5% budget burned in 6h | Warning
|
|
185
|
+
| Alert | Condition | Severity |
|
|
186
|
+
| ----------------- | ---------------------- | -------- |
|
|
187
|
+
| Burn Rate High | 2% budget burned in 1h | Critical |
|
|
188
|
+
| Burn Rate Warning | 5% budget burned in 6h | Warning |
|
|
174
189
|
|
|
175
190
|
## Escalation
|
|
191
|
+
|
|
176
192
|
- **P0**: Page on-call immediately
|
|
177
193
|
- **P1**: Alert on-call, respond within 1h
|
|
178
194
|
- **P2**: Next business day
|
|
179
|
-
|
|
195
|
+
|
|
196
|
+
````
|
|
180
197
|
|
|
181
198
|
---
|
|
182
199
|
|
|
@@ -200,7 +217,7 @@ histogram_quantile(0.99,
|
|
|
200
217
|
- All hands on reliability
|
|
201
218
|
- Only critical fixes deployed
|
|
202
219
|
- Requires director approval to deploy
|
|
203
|
-
|
|
220
|
+
````
|
|
204
221
|
|
|
205
222
|
---
|
|
206
223
|
|
|
@@ -210,13 +227,13 @@ histogram_quantile(0.99,
|
|
|
210
227
|
|
|
211
228
|
```promql
|
|
212
229
|
# 5-minute availability
|
|
213
|
-
sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
|
|
214
|
-
/
|
|
230
|
+
sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
|
|
231
|
+
/
|
|
215
232
|
sum(rate(http_requests_total[5m]))
|
|
216
233
|
|
|
217
234
|
# 30-day availability
|
|
218
|
-
sum(increase(http_requests_total{status=~"2..|3.."}[30d]))
|
|
219
|
-
/
|
|
235
|
+
sum(increase(http_requests_total{status=~"2..|3.."}[30d]))
|
|
236
|
+
/
|
|
220
237
|
sum(increase(http_requests_total[30d]))
|
|
221
238
|
```
|
|
222
239
|
|
|
@@ -224,13 +241,13 @@ sum(increase(http_requests_total[30d]))
|
|
|
224
241
|
|
|
225
242
|
```promql
|
|
226
243
|
# p99 latency
|
|
227
|
-
histogram_quantile(0.99,
|
|
244
|
+
histogram_quantile(0.99,
|
|
228
245
|
sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
|
|
229
246
|
)
|
|
230
247
|
|
|
231
248
|
# Percentage of requests under 200ms
|
|
232
|
-
sum(rate(http_request_duration_seconds_bucket{le="0.2"}[5m]))
|
|
233
|
-
/
|
|
249
|
+
sum(rate(http_request_duration_seconds_bucket{le="0.2"}[5m]))
|
|
250
|
+
/
|
|
234
251
|
sum(rate(http_request_duration_seconds_count[5m]))
|
|
235
252
|
```
|
|
236
253
|
|
|
@@ -240,11 +257,11 @@ sum(rate(http_request_duration_seconds_count[5m]))
|
|
|
240
257
|
# Error budget remaining (as percentage)
|
|
241
258
|
1 - (
|
|
242
259
|
(1 - (
|
|
243
|
-
sum(increase(http_requests_total{status=~"2..|3.."}[30d]))
|
|
244
|
-
/
|
|
260
|
+
sum(increase(http_requests_total{status=~"2..|3.."}[30d]))
|
|
261
|
+
/
|
|
245
262
|
sum(increase(http_requests_total[30d]))
|
|
246
|
-
))
|
|
247
|
-
/
|
|
263
|
+
))
|
|
264
|
+
/
|
|
248
265
|
(1 - 0.999) # SLO target
|
|
249
266
|
)
|
|
250
267
|
```
|
|
@@ -257,9 +274,9 @@ sum(rate(http_request_duration_seconds_count[5m]))
|
|
|
257
274
|
# Grafana dashboard panels
|
|
258
275
|
|
|
259
276
|
panels:
|
|
260
|
-
- title:
|
|
277
|
+
- title: 'Current Availability'
|
|
261
278
|
type: stat
|
|
262
|
-
query:
|
|
279
|
+
query: 'availability_sli'
|
|
263
280
|
thresholds:
|
|
264
281
|
- value: 0.999
|
|
265
282
|
color: green
|
|
@@ -268,18 +285,18 @@ panels:
|
|
|
268
285
|
- value: 0
|
|
269
286
|
color: red
|
|
270
287
|
|
|
271
|
-
- title:
|
|
288
|
+
- title: 'Error Budget Remaining'
|
|
272
289
|
type: gauge
|
|
273
|
-
query:
|
|
290
|
+
query: 'error_budget_remaining'
|
|
274
291
|
max: 100
|
|
275
|
-
|
|
276
|
-
- title:
|
|
292
|
+
|
|
293
|
+
- title: 'Latency p99'
|
|
277
294
|
type: timeseries
|
|
278
|
-
query:
|
|
279
|
-
|
|
280
|
-
- title:
|
|
295
|
+
query: 'latency_p99'
|
|
296
|
+
|
|
297
|
+
- title: 'Error Budget Burn Rate'
|
|
281
298
|
type: timeseries
|
|
282
|
-
query:
|
|
299
|
+
query: 'burn_rate_1h'
|
|
283
300
|
```
|
|
284
301
|
|
|
285
302
|
---
|
|
@@ -287,16 +304,19 @@ panels:
|
|
|
287
304
|
## SLO Review Checklist
|
|
288
305
|
|
|
289
306
|
### Weekly
|
|
307
|
+
|
|
290
308
|
- [ ] Check error budget status
|
|
291
309
|
- [ ] Review any SLO breaches
|
|
292
310
|
- [ ] Assess burn rate trends
|
|
293
311
|
|
|
294
312
|
### Monthly
|
|
313
|
+
|
|
295
314
|
- [ ] SLO performance report
|
|
296
315
|
- [ ] Error budget consumption analysis
|
|
297
316
|
- [ ] Review and adjust targets if needed
|
|
298
317
|
|
|
299
318
|
### Quarterly
|
|
319
|
+
|
|
300
320
|
- [ ] Comprehensive SLO review
|
|
301
321
|
- [ ] Update user journey mapping
|
|
302
322
|
- [ ] Refine SLI definitions
|
|
@@ -11,27 +11,30 @@ SOLID is an acronym for five design principles that make software designs more u
|
|
|
11
11
|
> **A class should have only one reason to change.**
|
|
12
12
|
|
|
13
13
|
### Definition
|
|
14
|
+
|
|
14
15
|
A class should have only one job or responsibility. If a class has multiple responsibilities, changes to one responsibility may affect the other.
|
|
15
16
|
|
|
16
17
|
### Bad Example ❌
|
|
18
|
+
|
|
17
19
|
```typescript
|
|
18
20
|
class UserService {
|
|
19
21
|
createUser(data: UserData): User {
|
|
20
22
|
// Create user
|
|
21
23
|
const user = this.repository.create(data);
|
|
22
|
-
|
|
24
|
+
|
|
23
25
|
// Send welcome email (second responsibility!)
|
|
24
26
|
this.emailService.send(user.email, 'Welcome!');
|
|
25
|
-
|
|
27
|
+
|
|
26
28
|
// Log activity (third responsibility!)
|
|
27
29
|
this.logger.log(`User created: ${user.id}`);
|
|
28
|
-
|
|
30
|
+
|
|
29
31
|
return user;
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
```
|
|
33
35
|
|
|
34
36
|
### Good Example ✅
|
|
37
|
+
|
|
35
38
|
```typescript
|
|
36
39
|
class UserService {
|
|
37
40
|
createUser(data: UserData): User {
|
|
@@ -48,6 +51,7 @@ class UserEventHandler {
|
|
|
48
51
|
```
|
|
49
52
|
|
|
50
53
|
### Checklist
|
|
54
|
+
|
|
51
55
|
- [ ] Does the class have only one reason to change?
|
|
52
56
|
- [ ] Can you describe the class responsibility in one sentence without "and"?
|
|
53
57
|
- [ ] Are all methods related to the same responsibility?
|
|
@@ -59,9 +63,11 @@ class UserEventHandler {
|
|
|
59
63
|
> **Software entities should be open for extension but closed for modification.**
|
|
60
64
|
|
|
61
65
|
### Definition
|
|
66
|
+
|
|
62
67
|
You should be able to extend a class's behavior without modifying its existing code.
|
|
63
68
|
|
|
64
69
|
### Bad Example ❌
|
|
70
|
+
|
|
65
71
|
```typescript
|
|
66
72
|
class PaymentProcessor {
|
|
67
73
|
processPayment(type: string, amount: number): void {
|
|
@@ -77,6 +83,7 @@ class PaymentProcessor {
|
|
|
77
83
|
```
|
|
78
84
|
|
|
79
85
|
### Good Example ✅
|
|
86
|
+
|
|
80
87
|
```typescript
|
|
81
88
|
interface PaymentMethod {
|
|
82
89
|
process(amount: number): PaymentResult;
|
|
@@ -108,6 +115,7 @@ class PaymentProcessor {
|
|
|
108
115
|
```
|
|
109
116
|
|
|
110
117
|
### Checklist
|
|
118
|
+
|
|
111
119
|
- [ ] Can new features be added without modifying existing code?
|
|
112
120
|
- [ ] Are extension points (interfaces, abstract classes) defined?
|
|
113
121
|
- [ ] Does adding a new case require only adding new code?
|
|
@@ -119,21 +127,26 @@ class PaymentProcessor {
|
|
|
119
127
|
> **Subtypes must be substitutable for their base types.**
|
|
120
128
|
|
|
121
129
|
### Definition
|
|
130
|
+
|
|
122
131
|
Objects of a superclass should be replaceable with objects of its subclasses without affecting program correctness.
|
|
123
132
|
|
|
124
133
|
### Bad Example ❌
|
|
134
|
+
|
|
125
135
|
```typescript
|
|
126
136
|
class Rectangle {
|
|
127
|
-
constructor(
|
|
128
|
-
|
|
137
|
+
constructor(
|
|
138
|
+
public width: number,
|
|
139
|
+
public height: number
|
|
140
|
+
) {}
|
|
141
|
+
|
|
129
142
|
setWidth(width: number): void {
|
|
130
143
|
this.width = width;
|
|
131
144
|
}
|
|
132
|
-
|
|
145
|
+
|
|
133
146
|
setHeight(height: number): void {
|
|
134
147
|
this.height = height;
|
|
135
148
|
}
|
|
136
|
-
|
|
149
|
+
|
|
137
150
|
area(): number {
|
|
138
151
|
return this.width * this.height;
|
|
139
152
|
}
|
|
@@ -144,7 +157,7 @@ class Square extends Rectangle {
|
|
|
144
157
|
this.width = width;
|
|
145
158
|
this.height = width; // Violates LSP!
|
|
146
159
|
}
|
|
147
|
-
|
|
160
|
+
|
|
148
161
|
setHeight(height: number): void {
|
|
149
162
|
this.width = height;
|
|
150
163
|
this.height = height; // Violates LSP!
|
|
@@ -160,14 +173,18 @@ function testRectangle(rect: Rectangle): void {
|
|
|
160
173
|
```
|
|
161
174
|
|
|
162
175
|
### Good Example ✅
|
|
176
|
+
|
|
163
177
|
```typescript
|
|
164
178
|
interface Shape {
|
|
165
179
|
area(): number;
|
|
166
180
|
}
|
|
167
181
|
|
|
168
182
|
class Rectangle implements Shape {
|
|
169
|
-
constructor(
|
|
170
|
-
|
|
183
|
+
constructor(
|
|
184
|
+
public width: number,
|
|
185
|
+
public height: number
|
|
186
|
+
) {}
|
|
187
|
+
|
|
171
188
|
area(): number {
|
|
172
189
|
return this.width * this.height;
|
|
173
190
|
}
|
|
@@ -175,7 +192,7 @@ class Rectangle implements Shape {
|
|
|
175
192
|
|
|
176
193
|
class Square implements Shape {
|
|
177
194
|
constructor(public side: number) {}
|
|
178
|
-
|
|
195
|
+
|
|
179
196
|
area(): number {
|
|
180
197
|
return this.side * this.side;
|
|
181
198
|
}
|
|
@@ -183,6 +200,7 @@ class Square implements Shape {
|
|
|
183
200
|
```
|
|
184
201
|
|
|
185
202
|
### Checklist
|
|
203
|
+
|
|
186
204
|
- [ ] Can subclass be used anywhere parent is expected?
|
|
187
205
|
- [ ] Do subclasses honor the parent's contract?
|
|
188
206
|
- [ ] Are there any overridden methods that change expected behavior?
|
|
@@ -194,9 +212,11 @@ class Square implements Shape {
|
|
|
194
212
|
> **Clients should not be forced to depend on interfaces they do not use.**
|
|
195
213
|
|
|
196
214
|
### Definition
|
|
215
|
+
|
|
197
216
|
Many specific interfaces are better than one general-purpose interface. Don't force classes to implement methods they don't need.
|
|
198
217
|
|
|
199
218
|
### Bad Example ❌
|
|
219
|
+
|
|
200
220
|
```typescript
|
|
201
221
|
interface Worker {
|
|
202
222
|
work(): void;
|
|
@@ -205,19 +225,32 @@ interface Worker {
|
|
|
205
225
|
}
|
|
206
226
|
|
|
207
227
|
class HumanWorker implements Worker {
|
|
208
|
-
work(): void {
|
|
209
|
-
|
|
210
|
-
|
|
228
|
+
work(): void {
|
|
229
|
+
/* ... */
|
|
230
|
+
}
|
|
231
|
+
eat(): void {
|
|
232
|
+
/* ... */
|
|
233
|
+
}
|
|
234
|
+
sleep(): void {
|
|
235
|
+
/* ... */
|
|
236
|
+
}
|
|
211
237
|
}
|
|
212
238
|
|
|
213
239
|
class RobotWorker implements Worker {
|
|
214
|
-
work(): void {
|
|
215
|
-
|
|
216
|
-
|
|
240
|
+
work(): void {
|
|
241
|
+
/* ... */
|
|
242
|
+
}
|
|
243
|
+
eat(): void {
|
|
244
|
+
throw new Error("Robots don't eat!");
|
|
245
|
+
} // Forced to implement!
|
|
246
|
+
sleep(): void {
|
|
247
|
+
throw new Error("Robots don't sleep!");
|
|
248
|
+
} // Forced to implement!
|
|
217
249
|
}
|
|
218
250
|
```
|
|
219
251
|
|
|
220
252
|
### Good Example ✅
|
|
253
|
+
|
|
221
254
|
```typescript
|
|
222
255
|
interface Workable {
|
|
223
256
|
work(): void;
|
|
@@ -232,18 +265,27 @@ interface Sleepable {
|
|
|
232
265
|
}
|
|
233
266
|
|
|
234
267
|
class HumanWorker implements Workable, Eatable, Sleepable {
|
|
235
|
-
work(): void {
|
|
236
|
-
|
|
237
|
-
|
|
268
|
+
work(): void {
|
|
269
|
+
/* ... */
|
|
270
|
+
}
|
|
271
|
+
eat(): void {
|
|
272
|
+
/* ... */
|
|
273
|
+
}
|
|
274
|
+
sleep(): void {
|
|
275
|
+
/* ... */
|
|
276
|
+
}
|
|
238
277
|
}
|
|
239
278
|
|
|
240
279
|
class RobotWorker implements Workable {
|
|
241
|
-
work(): void {
|
|
280
|
+
work(): void {
|
|
281
|
+
/* ... */
|
|
282
|
+
}
|
|
242
283
|
// No need to implement eat or sleep!
|
|
243
284
|
}
|
|
244
285
|
```
|
|
245
286
|
|
|
246
287
|
### Checklist
|
|
288
|
+
|
|
247
289
|
- [ ] Are interfaces focused and cohesive?
|
|
248
290
|
- [ ] Do implementing classes use all interface methods?
|
|
249
291
|
- [ ] Can large interfaces be split into smaller ones?
|
|
@@ -255,9 +297,11 @@ class RobotWorker implements Workable {
|
|
|
255
297
|
> **High-level modules should not depend on low-level modules. Both should depend on abstractions.**
|
|
256
298
|
|
|
257
299
|
### Definition
|
|
300
|
+
|
|
258
301
|
Depend on abstractions (interfaces), not concrete implementations. This allows for flexibility and easier testing.
|
|
259
302
|
|
|
260
303
|
### Bad Example ❌
|
|
304
|
+
|
|
261
305
|
```typescript
|
|
262
306
|
class MySQLDatabase {
|
|
263
307
|
query(sql: string): any[] {
|
|
@@ -267,7 +311,7 @@ class MySQLDatabase {
|
|
|
267
311
|
|
|
268
312
|
class UserRepository {
|
|
269
313
|
private database = new MySQLDatabase(); // Tight coupling!
|
|
270
|
-
|
|
314
|
+
|
|
271
315
|
findById(id: string): User {
|
|
272
316
|
return this.database.query(`SELECT * FROM users WHERE id = '${id}'`);
|
|
273
317
|
}
|
|
@@ -275,6 +319,7 @@ class UserRepository {
|
|
|
275
319
|
```
|
|
276
320
|
|
|
277
321
|
### Good Example ✅
|
|
322
|
+
|
|
278
323
|
```typescript
|
|
279
324
|
interface Database {
|
|
280
325
|
query(sql: string): any[];
|
|
@@ -294,7 +339,7 @@ class PostgreSQLDatabase implements Database {
|
|
|
294
339
|
|
|
295
340
|
class UserRepository {
|
|
296
341
|
constructor(private database: Database) {} // Injected!
|
|
297
|
-
|
|
342
|
+
|
|
298
343
|
findById(id: string): User {
|
|
299
344
|
return this.database.query(`SELECT * FROM users WHERE id = '${id}'`);
|
|
300
345
|
}
|
|
@@ -309,6 +354,7 @@ const repository = new UserRepository(new MockDatabase());
|
|
|
309
354
|
```
|
|
310
355
|
|
|
311
356
|
### Checklist
|
|
357
|
+
|
|
312
358
|
- [ ] Do high-level modules depend on abstractions?
|
|
313
359
|
- [ ] Are dependencies injected rather than created internally?
|
|
314
360
|
- [ ] Can implementations be swapped without code changes?
|
|
@@ -317,13 +363,13 @@ const repository = new UserRepository(new MockDatabase());
|
|
|
317
363
|
|
|
318
364
|
## SOLID Summary Table
|
|
319
365
|
|
|
320
|
-
| Principle
|
|
321
|
-
|
|
322
|
-
| Single Responsibility | S
|
|
323
|
-
| Open/Closed
|
|
324
|
-
| Liskov Substitution
|
|
325
|
-
| Interface Segregation | I
|
|
326
|
-
| Dependency Inversion
|
|
366
|
+
| Principle | Acronym | Key Idea |
|
|
367
|
+
| --------------------- | ------- | ------------------------- |
|
|
368
|
+
| Single Responsibility | S | One class, one job |
|
|
369
|
+
| Open/Closed | O | Extend, don't modify |
|
|
370
|
+
| Liskov Substitution | L | Subtypes are replaceable |
|
|
371
|
+
| Interface Segregation | I | Small, focused interfaces |
|
|
372
|
+
| Dependency Inversion | D | Depend on abstractions |
|
|
327
373
|
|
|
328
374
|
---
|
|
329
375
|
|
|
@@ -331,13 +377,13 @@ const repository = new UserRepository(new MockDatabase());
|
|
|
331
377
|
|
|
332
378
|
### Constitutional Alignment
|
|
333
379
|
|
|
334
|
-
| Principle | Constitutional Article
|
|
335
|
-
|
|
336
|
-
| SRP
|
|
337
|
-
| OCP
|
|
338
|
-
| LSP
|
|
339
|
-
| ISP
|
|
340
|
-
| DIP
|
|
380
|
+
| Principle | Constitutional Article |
|
|
381
|
+
| --------- | ----------------------------------------------------- |
|
|
382
|
+
| SRP | Article VII: Simplicity Gate |
|
|
383
|
+
| OCP | Article I: Library-First (extensible libraries) |
|
|
384
|
+
| LSP | Article III: Test-First (substitutable mocks) |
|
|
385
|
+
| ISP | Article VIII: Anti-Abstraction (focused interfaces) |
|
|
386
|
+
| DIP | Article IX: Integration-First (testable dependencies) |
|
|
341
387
|
|
|
342
388
|
### When to Apply
|
|
343
389
|
|