tech-hub-skills 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/bin/cli.js +241 -0
  4. package/bin/copilot.js +182 -0
  5. package/bin/postinstall.js +42 -0
  6. package/package.json +46 -0
  7. package/tech_hub_skills/roles/ai-engineer/skills/01-prompt-engineering/README.md +252 -0
  8. package/tech_hub_skills/roles/ai-engineer/skills/02-rag-pipeline/README.md +448 -0
  9. package/tech_hub_skills/roles/ai-engineer/skills/03-agent-orchestration/README.md +599 -0
  10. package/tech_hub_skills/roles/ai-engineer/skills/04-llm-guardrails/README.md +735 -0
  11. package/tech_hub_skills/roles/ai-engineer/skills/05-vector-embeddings/README.md +711 -0
  12. package/tech_hub_skills/roles/ai-engineer/skills/06-llm-evaluation/README.md +777 -0
  13. package/tech_hub_skills/roles/azure/skills/01-infrastructure-fundamentals/README.md +264 -0
  14. package/tech_hub_skills/roles/azure/skills/02-data-factory/README.md +264 -0
  15. package/tech_hub_skills/roles/azure/skills/03-synapse-analytics/README.md +264 -0
  16. package/tech_hub_skills/roles/azure/skills/04-databricks/README.md +264 -0
  17. package/tech_hub_skills/roles/azure/skills/05-functions/README.md +264 -0
  18. package/tech_hub_skills/roles/azure/skills/06-kubernetes-service/README.md +264 -0
  19. package/tech_hub_skills/roles/azure/skills/07-openai-service/README.md +264 -0
  20. package/tech_hub_skills/roles/azure/skills/08-machine-learning/README.md +264 -0
  21. package/tech_hub_skills/roles/azure/skills/09-storage-adls/README.md +264 -0
  22. package/tech_hub_skills/roles/azure/skills/10-networking/README.md +264 -0
  23. package/tech_hub_skills/roles/azure/skills/11-sql-cosmos/README.md +264 -0
  24. package/tech_hub_skills/roles/azure/skills/12-event-hubs/README.md +264 -0
  25. package/tech_hub_skills/roles/code-review/skills/01-automated-code-review/README.md +394 -0
  26. package/tech_hub_skills/roles/code-review/skills/02-pr-review-workflow/README.md +427 -0
  27. package/tech_hub_skills/roles/code-review/skills/03-code-quality-gates/README.md +518 -0
  28. package/tech_hub_skills/roles/code-review/skills/04-reviewer-assignment/README.md +504 -0
  29. package/tech_hub_skills/roles/code-review/skills/05-review-analytics/README.md +540 -0
  30. package/tech_hub_skills/roles/data-engineer/skills/01-lakehouse-architecture/README.md +550 -0
  31. package/tech_hub_skills/roles/data-engineer/skills/02-etl-pipeline/README.md +580 -0
  32. package/tech_hub_skills/roles/data-engineer/skills/03-data-quality/README.md +579 -0
  33. package/tech_hub_skills/roles/data-engineer/skills/04-streaming-pipelines/README.md +608 -0
  34. package/tech_hub_skills/roles/data-engineer/skills/05-performance-optimization/README.md +547 -0
  35. package/tech_hub_skills/roles/data-governance/skills/01-data-catalog/README.md +112 -0
  36. package/tech_hub_skills/roles/data-governance/skills/02-data-lineage/README.md +129 -0
  37. package/tech_hub_skills/roles/data-governance/skills/03-data-quality-framework/README.md +182 -0
  38. package/tech_hub_skills/roles/data-governance/skills/04-access-control/README.md +39 -0
  39. package/tech_hub_skills/roles/data-governance/skills/05-master-data-management/README.md +40 -0
  40. package/tech_hub_skills/roles/data-governance/skills/06-compliance-privacy/README.md +46 -0
  41. package/tech_hub_skills/roles/data-scientist/skills/01-eda-automation/README.md +230 -0
  42. package/tech_hub_skills/roles/data-scientist/skills/02-statistical-modeling/README.md +264 -0
  43. package/tech_hub_skills/roles/data-scientist/skills/03-feature-engineering/README.md +264 -0
  44. package/tech_hub_skills/roles/data-scientist/skills/04-predictive-modeling/README.md +264 -0
  45. package/tech_hub_skills/roles/data-scientist/skills/05-customer-analytics/README.md +264 -0
  46. package/tech_hub_skills/roles/data-scientist/skills/06-campaign-analysis/README.md +264 -0
  47. package/tech_hub_skills/roles/data-scientist/skills/07-experimentation/README.md +264 -0
  48. package/tech_hub_skills/roles/data-scientist/skills/08-data-visualization/README.md +264 -0
  49. package/tech_hub_skills/roles/devops/skills/01-cicd-pipeline/README.md +264 -0
  50. package/tech_hub_skills/roles/devops/skills/02-container-orchestration/README.md +264 -0
  51. package/tech_hub_skills/roles/devops/skills/03-infrastructure-as-code/README.md +264 -0
  52. package/tech_hub_skills/roles/devops/skills/04-gitops/README.md +264 -0
  53. package/tech_hub_skills/roles/devops/skills/05-environment-management/README.md +264 -0
  54. package/tech_hub_skills/roles/devops/skills/06-automated-testing/README.md +264 -0
  55. package/tech_hub_skills/roles/devops/skills/07-release-management/README.md +264 -0
  56. package/tech_hub_skills/roles/devops/skills/08-monitoring-alerting/README.md +264 -0
  57. package/tech_hub_skills/roles/devops/skills/09-devsecops/README.md +265 -0
  58. package/tech_hub_skills/roles/finops/skills/01-cost-visibility/README.md +264 -0
  59. package/tech_hub_skills/roles/finops/skills/02-resource-tagging/README.md +264 -0
  60. package/tech_hub_skills/roles/finops/skills/03-budget-management/README.md +264 -0
  61. package/tech_hub_skills/roles/finops/skills/04-reserved-instances/README.md +264 -0
  62. package/tech_hub_skills/roles/finops/skills/05-spot-optimization/README.md +264 -0
  63. package/tech_hub_skills/roles/finops/skills/06-storage-tiering/README.md +264 -0
  64. package/tech_hub_skills/roles/finops/skills/07-compute-rightsizing/README.md +264 -0
  65. package/tech_hub_skills/roles/finops/skills/08-chargeback/README.md +264 -0
  66. package/tech_hub_skills/roles/ml-engineer/skills/01-mlops-pipeline/README.md +566 -0
  67. package/tech_hub_skills/roles/ml-engineer/skills/02-feature-engineering/README.md +655 -0
  68. package/tech_hub_skills/roles/ml-engineer/skills/03-model-training/README.md +704 -0
  69. package/tech_hub_skills/roles/ml-engineer/skills/04-model-serving/README.md +845 -0
  70. package/tech_hub_skills/roles/ml-engineer/skills/05-model-monitoring/README.md +874 -0
  71. package/tech_hub_skills/roles/mlops/skills/01-ml-pipeline-orchestration/README.md +264 -0
  72. package/tech_hub_skills/roles/mlops/skills/02-experiment-tracking/README.md +264 -0
  73. package/tech_hub_skills/roles/mlops/skills/03-model-registry/README.md +264 -0
  74. package/tech_hub_skills/roles/mlops/skills/04-feature-store/README.md +264 -0
  75. package/tech_hub_skills/roles/mlops/skills/05-model-deployment/README.md +264 -0
  76. package/tech_hub_skills/roles/mlops/skills/06-model-observability/README.md +264 -0
  77. package/tech_hub_skills/roles/mlops/skills/07-data-versioning/README.md +264 -0
  78. package/tech_hub_skills/roles/mlops/skills/08-ab-testing/README.md +264 -0
  79. package/tech_hub_skills/roles/mlops/skills/09-automated-retraining/README.md +264 -0
  80. package/tech_hub_skills/roles/platform-engineer/skills/01-internal-developer-platform/README.md +153 -0
  81. package/tech_hub_skills/roles/platform-engineer/skills/02-self-service-infrastructure/README.md +57 -0
  82. package/tech_hub_skills/roles/platform-engineer/skills/03-slo-sli-management/README.md +59 -0
  83. package/tech_hub_skills/roles/platform-engineer/skills/04-developer-experience/README.md +57 -0
  84. package/tech_hub_skills/roles/platform-engineer/skills/05-incident-management/README.md +73 -0
  85. package/tech_hub_skills/roles/platform-engineer/skills/06-capacity-management/README.md +59 -0
  86. package/tech_hub_skills/roles/product-designer/skills/01-requirements-discovery/README.md +407 -0
  87. package/tech_hub_skills/roles/product-designer/skills/02-user-research/README.md +382 -0
  88. package/tech_hub_skills/roles/product-designer/skills/03-brainstorming-ideation/README.md +437 -0
  89. package/tech_hub_skills/roles/product-designer/skills/04-ux-design/README.md +496 -0
  90. package/tech_hub_skills/roles/product-designer/skills/05-product-market-fit/README.md +376 -0
  91. package/tech_hub_skills/roles/product-designer/skills/06-stakeholder-management/README.md +412 -0
  92. package/tech_hub_skills/roles/security-architect/skills/01-pii-detection/README.md +319 -0
  93. package/tech_hub_skills/roles/security-architect/skills/02-threat-modeling/README.md +264 -0
  94. package/tech_hub_skills/roles/security-architect/skills/03-infrastructure-security/README.md +264 -0
  95. package/tech_hub_skills/roles/security-architect/skills/04-iam/README.md +264 -0
  96. package/tech_hub_skills/roles/security-architect/skills/05-application-security/README.md +264 -0
  97. package/tech_hub_skills/roles/security-architect/skills/06-secrets-management/README.md +264 -0
  98. package/tech_hub_skills/roles/security-architect/skills/07-security-monitoring/README.md +264 -0
  99. package/tech_hub_skills/roles/system-design/skills/01-architecture-patterns/README.md +337 -0
  100. package/tech_hub_skills/roles/system-design/skills/02-requirements-engineering/README.md +264 -0
  101. package/tech_hub_skills/roles/system-design/skills/03-scalability/README.md +264 -0
  102. package/tech_hub_skills/roles/system-design/skills/04-high-availability/README.md +264 -0
  103. package/tech_hub_skills/roles/system-design/skills/05-cost-optimization-design/README.md +264 -0
  104. package/tech_hub_skills/roles/system-design/skills/06-api-design/README.md +264 -0
  105. package/tech_hub_skills/roles/system-design/skills/07-observability-architecture/README.md +264 -0
  106. package/tech_hub_skills/roles/system-design/skills/08-process-automation/PROCESS_TEMPLATE.md +336 -0
  107. package/tech_hub_skills/roles/system-design/skills/08-process-automation/README.md +521 -0
  108. package/tech_hub_skills/skills/README.md +336 -0
  109. package/tech_hub_skills/skills/ai-engineer.md +104 -0
  110. package/tech_hub_skills/skills/azure.md +149 -0
  111. package/tech_hub_skills/skills/code-review.md +399 -0
  112. package/tech_hub_skills/skills/compliance-automation.md +747 -0
  113. package/tech_hub_skills/skills/data-engineer.md +113 -0
  114. package/tech_hub_skills/skills/data-governance.md +102 -0
  115. package/tech_hub_skills/skills/data-scientist.md +123 -0
  116. package/tech_hub_skills/skills/devops.md +160 -0
  117. package/tech_hub_skills/skills/docker.md +160 -0
  118. package/tech_hub_skills/skills/enterprise-dashboard.md +613 -0
  119. package/tech_hub_skills/skills/finops.md +184 -0
  120. package/tech_hub_skills/skills/ml-engineer.md +115 -0
  121. package/tech_hub_skills/skills/mlops.md +187 -0
  122. package/tech_hub_skills/skills/optimization-advisor.md +329 -0
  123. package/tech_hub_skills/skills/orchestrator.md +497 -0
  124. package/tech_hub_skills/skills/platform-engineer.md +102 -0
  125. package/tech_hub_skills/skills/process-automation.md +226 -0
  126. package/tech_hub_skills/skills/process-changelog.md +184 -0
  127. package/tech_hub_skills/skills/process-documentation.md +484 -0
  128. package/tech_hub_skills/skills/process-kanban.md +324 -0
  129. package/tech_hub_skills/skills/process-versioning.md +214 -0
  130. package/tech_hub_skills/skills/product-designer.md +104 -0
  131. package/tech_hub_skills/skills/project-starter.md +443 -0
  132. package/tech_hub_skills/skills/security-architect.md +135 -0
  133. package/tech_hub_skills/skills/system-design.md +126 -0
@@ -0,0 +1,427 @@
1
+ # cr-02: PR Review Workflow
2
+
3
+ Structured pull request review process with templates, checklists, and approval workflows.
4
+
5
+ ## Overview
6
+
7
+ A well-defined PR review workflow ensures consistent quality, faster reviews, and clear expectations for both authors and reviewers. This skill provides templates, checklists, and automation for enterprise PR management.
8
+
9
+ ## Capabilities
10
+
11
+ ### PR Templates
12
+ - Standard change template
13
+ - Feature template with design docs
14
+ - Bug fix template with root cause
15
+ - Security-sensitive change template
16
+ - Database migration template
17
+
18
+ ### Review Checklists
19
+ - Functionality verification
20
+ - Security considerations
21
+ - Performance impact
22
+ - Test coverage
23
+ - Documentation updates
24
+
25
+ ### Workflow Automation
26
+ - Auto-labeling based on changes
27
+ - Draft to ready transitions
28
+ - Review reminders
29
+ - Stale PR management
30
+ - Merge queue handling
31
+
32
+ ## Implementation
33
+
34
+ ### PR Template (.github/pull_request_template.md)
35
+
36
+ ```markdown
37
+ ## Summary
38
+ <!-- Describe your changes in 2-3 sentences -->
39
+
40
+ ## Type of Change
41
+ <!-- Check all that apply -->
42
+ - [ ] Bug fix (non-breaking change fixing an issue)
43
+ - [ ] New feature (non-breaking change adding functionality)
44
+ - [ ] Breaking change (fix or feature causing existing functionality to change)
45
+ - [ ] Refactoring (no functional changes)
46
+ - [ ] Documentation update
47
+ - [ ] Configuration change
48
+ - [ ] Security fix
49
+
50
+ ## Related Issues
51
+ <!-- Link any related issues: Fixes #123, Relates to #456 -->
52
+
53
+ ## Changes Made
54
+ <!-- List the main changes -->
55
+ -
56
+ -
57
+ -
58
+
59
+ ## Testing Done
60
+ <!-- Describe testing performed -->
61
+ - [ ] Unit tests added/updated
62
+ - [ ] Integration tests added/updated
63
+ - [ ] Manual testing completed
64
+ - [ ] Test coverage maintained/increased
65
+
66
+ ## Security Checklist
67
+ <!-- For all changes, verify -->
68
+ - [ ] No secrets or credentials committed
69
+ - [ ] No new dependencies with known vulnerabilities
70
+ - [ ] Input validation added where needed
71
+ - [ ] Authentication/authorization unchanged or reviewed
72
+ - [ ] Logging does not expose sensitive data
73
+
74
+ ## Performance Impact
75
+ <!-- Describe any performance implications -->
76
+ - [ ] No performance impact expected
77
+ - [ ] Performance tested (describe results)
78
+ - [ ] New database queries are optimized
79
+ - [ ] No N+1 queries introduced
80
+
81
+ ## Documentation
82
+ - [ ] README updated if needed
83
+ - [ ] API documentation updated
84
+ - [ ] Changelog entry added
85
+ - [ ] Architecture docs updated if needed
86
+
87
+ ## Rollback Plan
88
+ <!-- How to rollback if issues are found -->
89
+
90
+ ## Screenshots (if applicable)
91
+ <!-- Add screenshots for UI changes -->
92
+
93
+ ## Reviewer Notes
94
+ <!-- Any specific areas you'd like reviewers to focus on -->
95
+ ```
96
+
97
+ ### Security-Sensitive PR Template
98
+
99
+ ```markdown
100
+ ## Security Change Request
101
+
102
+ ### Summary
103
+ <!-- Describe the security-related change -->
104
+
105
+ ### Security Impact Assessment
106
+
107
+ **Risk Level**: [ ] Critical [ ] High [ ] Medium [ ] Low
108
+
109
+ **Affected Areas**:
110
+ - [ ] Authentication
111
+ - [ ] Authorization
112
+ - [ ] Data encryption
113
+ - [ ] Input validation
114
+ - [ ] Session management
115
+ - [ ] Logging/Audit
116
+ - [ ] API security
117
+ - [ ] Infrastructure
118
+
119
+ ### Threat Model Update
120
+ <!-- Link to updated threat model or describe changes -->
121
+
122
+ ### Security Review Checklist
123
+ - [ ] OWASP Top 10 considered
124
+ - [ ] STRIDE analysis performed
125
+ - [ ] Security architect reviewed (required for High/Critical)
126
+ - [ ] Pen testing scheduled if needed
127
+ - [ ] Security scanning passed
128
+
129
+ ### Compliance Impact
130
+ - [ ] No compliance impact
131
+ - [ ] GDPR implications reviewed
132
+ - [ ] SOC 2 controls affected
133
+ - [ ] PCI-DSS requirements considered
134
+
135
+ ### Required Approvers
136
+ - [ ] Security team member
137
+ - [ ] Code owner
138
+ - [ ] Platform team (if infrastructure)
139
+ ```
140
+
141
+ ### Review Checklist Automation
142
+
143
+ ```yaml
144
+ # .github/workflows/pr-checklist.yml
145
+ name: PR Review Checklist
146
+ on:
147
+ pull_request:
148
+ types: [opened, edited, synchronize]
149
+
150
+ jobs:
151
+ validate-checklist:
152
+ runs-on: ubuntu-latest
153
+ steps:
154
+ - uses: actions/checkout@v4
155
+
156
+ - name: Check PR template completion
157
+ uses: actions/github-script@v7
158
+ with:
159
+ script: |
160
+ const body = context.payload.pull_request.body || '';
161
+
162
+ const requiredSections = [
163
+ 'Summary',
164
+ 'Type of Change',
165
+ 'Testing Done',
166
+ 'Security Checklist'
167
+ ];
168
+
169
+ const missingSections = requiredSections.filter(
170
+ section => !body.includes(`## ${section}`)
171
+ );
172
+
173
+ if (missingSections.length > 0) {
174
+ core.setFailed(
175
+ `Missing required sections: ${missingSections.join(', ')}`
176
+ );
177
+ }
178
+
179
+ // Check for unchecked security items
180
+ const securitySection = body.match(/## Security Checklist[\s\S]*?(?=##|$)/);
181
+ if (securitySection) {
182
+ const unchecked = (securitySection[0].match(/- \[ \]/g) || []).length;
183
+ const checked = (securitySection[0].match(/- \[x\]/gi) || []).length;
184
+
185
+ if (unchecked > 0 && checked === 0) {
186
+ core.warning('Security checklist not completed');
187
+ }
188
+ }
189
+
190
+ - name: Label PR based on changes
191
+ uses: actions/labeler@v5
192
+ with:
193
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
194
+ ```
195
+
196
+ ### Auto-Labeling Configuration
197
+
198
+ ```yaml
199
+ # .github/labeler.yml
200
+ frontend:
201
+ - changed-files:
202
+ - any-glob-to-any-file:
203
+ - 'src/components/**'
204
+ - 'src/pages/**'
205
+ - '**/*.tsx'
206
+ - '**/*.css'
207
+
208
+ backend:
209
+ - changed-files:
210
+ - any-glob-to-any-file:
211
+ - 'src/api/**'
212
+ - 'src/services/**'
213
+ - '**/*.py'
214
+
215
+ database:
216
+ - changed-files:
217
+ - any-glob-to-any-file:
218
+ - '**/migrations/**'
219
+ - '**/*.sql'
220
+
221
+ infrastructure:
222
+ - changed-files:
223
+ - any-glob-to-any-file:
224
+ - 'terraform/**'
225
+ - 'kubernetes/**'
226
+ - '.github/workflows/**'
227
+ - 'Dockerfile*'
228
+
229
+ security:
230
+ - changed-files:
231
+ - any-glob-to-any-file:
232
+ - '**/auth/**'
233
+ - '**/security/**'
234
+ - '**/*secret*'
235
+ - '**/*password*'
236
+
237
+ documentation:
238
+ - changed-files:
239
+ - any-glob-to-any-file:
240
+ - '**/*.md'
241
+ - 'docs/**'
242
+
243
+ tests:
244
+ - changed-files:
245
+ - any-glob-to-any-file:
246
+ - '**/*.test.*'
247
+ - '**/*.spec.*'
248
+ - '**/tests/**'
249
+ ```
250
+
251
+ ### Review Reminder Workflow
252
+
253
+ ```yaml
254
+ # .github/workflows/pr-reminders.yml
255
+ name: PR Review Reminders
256
+ on:
257
+ schedule:
258
+ - cron: '0 9 * * 1-5' # 9 AM weekdays
259
+ workflow_dispatch:
260
+
261
+ jobs:
262
+ remind-reviewers:
263
+ runs-on: ubuntu-latest
264
+ steps:
265
+ - uses: actions/github-script@v7
266
+ with:
267
+ script: |
268
+ const { data: prs } = await github.rest.pulls.list({
269
+ owner: context.repo.owner,
270
+ repo: context.repo.repo,
271
+ state: 'open'
272
+ });
273
+
274
+ const now = new Date();
275
+ const ONE_DAY = 24 * 60 * 60 * 1000;
276
+
277
+ for (const pr of prs) {
278
+ if (pr.draft) continue;
279
+
280
+ const created = new Date(pr.created_at);
281
+ const age = (now - created) / ONE_DAY;
282
+
283
+ // Remind after 24 hours
284
+ if (age > 1 && age < 2) {
285
+ await github.rest.issues.createComment({
286
+ owner: context.repo.owner,
287
+ repo: context.repo.repo,
288
+ issue_number: pr.number,
289
+ body: ' **Reminder**: This PR has been awaiting review for over 24 hours.'
290
+ });
291
+ }
292
+
293
+ // Escalate after 48 hours
294
+ if (age > 2) {
295
+ await github.rest.issues.addLabels({
296
+ owner: context.repo.owner,
297
+ repo: context.repo.repo,
298
+ issue_number: pr.number,
299
+ labels: ['needs-attention']
300
+ });
301
+ }
302
+ }
303
+ ```
304
+
305
+ ### Review States Machine
306
+
307
+ ```python
308
+ """PR Review workflow state machine."""
309
+
310
+ from enum import Enum
311
+ from dataclasses import dataclass
312
+ from typing import List, Optional
313
+ from datetime import datetime
314
+
315
+ class ReviewState(Enum):
316
+ DRAFT = "draft"
317
+ READY_FOR_REVIEW = "ready_for_review"
318
+ IN_REVIEW = "in_review"
319
+ CHANGES_REQUESTED = "changes_requested"
320
+ APPROVED = "approved"
321
+ NEEDS_SECURITY_REVIEW = "needs_security_review"
322
+ SECURITY_APPROVED = "security_approved"
323
+ READY_TO_MERGE = "ready_to_merge"
324
+ MERGED = "merged"
325
+
326
+ @dataclass
327
+ class PRWorkflow:
328
+ """Manages PR review workflow state."""
329
+
330
+ pr_number: int
331
+ state: ReviewState = ReviewState.DRAFT
332
+ reviewers: List[str] = None
333
+ approvals: List[str] = None
334
+ security_review_required: bool = False
335
+ created_at: datetime = None
336
+ last_activity: datetime = None
337
+
338
+ def __post_init__(self):
339
+ self.reviewers = self.reviewers or []
340
+ self.approvals = self.approvals or []
341
+ self.created_at = self.created_at or datetime.now()
342
+ self.last_activity = self.last_activity or datetime.now()
343
+
344
+ def transition(self, new_state: ReviewState) -> bool:
345
+ """Transition to new state if valid."""
346
+ valid_transitions = {
347
+ ReviewState.DRAFT: [ReviewState.READY_FOR_REVIEW],
348
+ ReviewState.READY_FOR_REVIEW: [ReviewState.IN_REVIEW, ReviewState.DRAFT],
349
+ ReviewState.IN_REVIEW: [
350
+ ReviewState.CHANGES_REQUESTED,
351
+ ReviewState.APPROVED,
352
+ ReviewState.NEEDS_SECURITY_REVIEW
353
+ ],
354
+ ReviewState.CHANGES_REQUESTED: [ReviewState.IN_REVIEW],
355
+ ReviewState.APPROVED: [
356
+ ReviewState.READY_TO_MERGE,
357
+ ReviewState.NEEDS_SECURITY_REVIEW
358
+ ],
359
+ ReviewState.NEEDS_SECURITY_REVIEW: [
360
+ ReviewState.SECURITY_APPROVED,
361
+ ReviewState.CHANGES_REQUESTED
362
+ ],
363
+ ReviewState.SECURITY_APPROVED: [ReviewState.READY_TO_MERGE],
364
+ ReviewState.READY_TO_MERGE: [ReviewState.MERGED],
365
+ }
366
+
367
+ if new_state in valid_transitions.get(self.state, []):
368
+ self.state = new_state
369
+ self.last_activity = datetime.now()
370
+ return True
371
+ return False
372
+
373
+ def add_approval(self, reviewer: str) -> None:
374
+ """Add reviewer approval."""
375
+ if reviewer not in self.approvals:
376
+ self.approvals.append(reviewer)
377
+ self.last_activity = datetime.now()
378
+
379
+ def is_ready_to_merge(self) -> bool:
380
+ """Check if PR meets merge criteria."""
381
+ min_approvals = 2
382
+ has_approvals = len(self.approvals) >= min_approvals
383
+
384
+ if self.security_review_required:
385
+ return (has_approvals and
386
+ self.state == ReviewState.SECURITY_APPROVED)
387
+
388
+ return has_approvals and self.state == ReviewState.APPROVED
389
+
390
+ def get_blockers(self) -> List[str]:
391
+ """Get list of merge blockers."""
392
+ blockers = []
393
+
394
+ if len(self.approvals) < 2:
395
+ blockers.append(f"Need {2 - len(self.approvals)} more approval(s)")
396
+
397
+ if self.security_review_required and self.state != ReviewState.SECURITY_APPROVED:
398
+ blockers.append("Security review required")
399
+
400
+ if self.state == ReviewState.CHANGES_REQUESTED:
401
+ blockers.append("Changes requested by reviewer")
402
+
403
+ return blockers
404
+ ```
405
+
406
+ ## Metrics
407
+
408
+ | Metric | Target | Description |
409
+ |--------|--------|-------------|
410
+ | Template compliance | 100% | All PRs use templates |
411
+ | Checklist completion | > 90% | Security checklist done |
412
+ | Review SLA | < 24 hours | First review time |
413
+ | Stale PR count | 0 | No PRs > 7 days |
414
+
415
+ ## Connections
416
+
417
+ - **Inputs from**: Developer creates PR
418
+ - **Outputs to**: Reviewers, quality gates (cr-03)
419
+ - **Triggers**: Auto-labeling, reviewer assignment (cr-04)
420
+
421
+ ## Best Practices
422
+
423
+ 1. Keep PR templates concise but comprehensive
424
+ 2. Make security checklist mandatory, not optional
425
+ 3. Use auto-labeling to route reviews efficiently
426
+ 4. Set up reminders to prevent stale PRs
427
+ 5. Track template usage and iterate based on feedback