patchdrill 0.1.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 (169) hide show
  1. package/.patchdrill.yml +33 -0
  2. package/CHANGELOG.md +150 -0
  3. package/CONTRIBUTING.md +59 -0
  4. package/LICENSE +21 -0
  5. package/README.md +601 -0
  6. package/SECURITY.md +28 -0
  7. package/action.yml +338 -0
  8. package/dist/baseline.d.ts +9 -0
  9. package/dist/baseline.js +38 -0
  10. package/dist/baseline.js.map +1 -0
  11. package/dist/cli.d.ts +19 -0
  12. package/dist/cli.js +662 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/codeowners.d.ts +14 -0
  15. package/dist/codeowners.js +104 -0
  16. package/dist/codeowners.js.map +1 -0
  17. package/dist/command-plan.d.ts +3 -0
  18. package/dist/command-plan.js +26 -0
  19. package/dist/command-plan.js.map +1 -0
  20. package/dist/demo.d.ts +5 -0
  21. package/dist/demo.js +525 -0
  22. package/dist/demo.js.map +1 -0
  23. package/dist/dependency.d.ts +4 -0
  24. package/dist/dependency.js +1424 -0
  25. package/dist/dependency.js.map +1 -0
  26. package/dist/doctor.d.ts +26 -0
  27. package/dist/doctor.js +183 -0
  28. package/dist/doctor.js.map +1 -0
  29. package/dist/evidence.d.ts +64 -0
  30. package/dist/evidence.js +352 -0
  31. package/dist/evidence.js.map +1 -0
  32. package/dist/git.d.ts +16 -0
  33. package/dist/git.js +349 -0
  34. package/dist/git.js.map +1 -0
  35. package/dist/i18n-catalog.d.ts +8 -0
  36. package/dist/i18n-catalog.js +446 -0
  37. package/dist/i18n-catalog.js.map +1 -0
  38. package/dist/i18n.d.ts +20 -0
  39. package/dist/i18n.js +67 -0
  40. package/dist/i18n.js.map +1 -0
  41. package/dist/init.d.ts +13 -0
  42. package/dist/init.js +312 -0
  43. package/dist/init.js.map +1 -0
  44. package/dist/markdown-links.d.ts +18 -0
  45. package/dist/markdown-links.js +180 -0
  46. package/dist/markdown-links.js.map +1 -0
  47. package/dist/package-scripts.d.ts +3 -0
  48. package/dist/package-scripts.js +55 -0
  49. package/dist/package-scripts.js.map +1 -0
  50. package/dist/planner.d.ts +8 -0
  51. package/dist/planner.js +2351 -0
  52. package/dist/planner.js.map +1 -0
  53. package/dist/policy.d.ts +12 -0
  54. package/dist/policy.js +255 -0
  55. package/dist/policy.js.map +1 -0
  56. package/dist/project.d.ts +2 -0
  57. package/dist/project.js +1085 -0
  58. package/dist/project.js.map +1 -0
  59. package/dist/release-readiness.d.ts +25 -0
  60. package/dist/release-readiness.js +426 -0
  61. package/dist/release-readiness.js.map +1 -0
  62. package/dist/report-annotations.d.ts +3 -0
  63. package/dist/report-annotations.js +28 -0
  64. package/dist/report-annotations.js.map +1 -0
  65. package/dist/report-contract.d.ts +2 -0
  66. package/dist/report-contract.js +82 -0
  67. package/dist/report-contract.js.map +1 -0
  68. package/dist/report-html.d.ts +7 -0
  69. package/dist/report-html.js +706 -0
  70. package/dist/report-html.js.map +1 -0
  71. package/dist/report-sarif.d.ts +2 -0
  72. package/dist/report-sarif.js +90 -0
  73. package/dist/report-sarif.js.map +1 -0
  74. package/dist/report.d.ts +14 -0
  75. package/dist/report.js +310 -0
  76. package/dist/report.js.map +1 -0
  77. package/dist/risk.d.ts +19 -0
  78. package/dist/risk.js +1226 -0
  79. package/dist/risk.js.map +1 -0
  80. package/dist/runner.d.ts +8 -0
  81. package/dist/runner.js +113 -0
  82. package/dist/runner.js.map +1 -0
  83. package/dist/scan.d.ts +2 -0
  84. package/dist/scan.js +195 -0
  85. package/dist/scan.js.map +1 -0
  86. package/dist/schema.d.ts +12 -0
  87. package/dist/schema.js +30 -0
  88. package/dist/schema.js.map +1 -0
  89. package/dist/stack-coverage.d.ts +8 -0
  90. package/dist/stack-coverage.js +94 -0
  91. package/dist/stack-coverage.js.map +1 -0
  92. package/dist/types.d.ts +206 -0
  93. package/dist/types.js +2 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/verification.d.ts +11 -0
  96. package/dist/verification.js +108 -0
  97. package/dist/verification.js.map +1 -0
  98. package/docs/ANNOTATIONS.md +34 -0
  99. package/docs/ARCHITECTURE.md +79 -0
  100. package/docs/BASELINES.md +32 -0
  101. package/docs/CASE_STUDIES.md +106 -0
  102. package/docs/CODEOWNERS.md +23 -0
  103. package/docs/DASHBOARD.md +87 -0
  104. package/docs/EVIDENCE.md +55 -0
  105. package/docs/LAUNCH_PLAYBOOK.md +103 -0
  106. package/docs/MONOREPOS.md +74 -0
  107. package/docs/POLICY.md +98 -0
  108. package/docs/PROOF_PACKS.md +57 -0
  109. package/docs/PR_COMMENTS.md +56 -0
  110. package/docs/RELEASE.md +35 -0
  111. package/docs/ROADMAP.md +152 -0
  112. package/docs/RULE_CATALOG.md +90 -0
  113. package/docs/SARIF.md +74 -0
  114. package/docs/SCHEMAS.md +49 -0
  115. package/docs/SECURITY_POSTURE.md +32 -0
  116. package/docs/STACK_COVERAGE.md +20 -0
  117. package/docs/assets/patchdrill-demo.svg +21 -0
  118. package/docs/media/patchdrill-dashboard.png +0 -0
  119. package/docs/media/patchdrill-demo.gif +0 -0
  120. package/examples/case-studies/README.md +20 -0
  121. package/examples/demo/README.md +21 -0
  122. package/examples/demo/patchdrill-demo-summary.md +35 -0
  123. package/examples/demo/patchdrill-demo.html +623 -0
  124. package/examples/demo/patchdrill-demo.json +355 -0
  125. package/examples/demo/patchdrill-demo.md +120 -0
  126. package/examples/demo/patchdrill-demo.sarif +195 -0
  127. package/examples/report.md +128 -0
  128. package/examples/risky-agent-pr/README.md +15 -0
  129. package/examples/risky-agent-pr/patchdrill-demo-summary.md +41 -0
  130. package/examples/risky-agent-pr/patchdrill-demo.html +681 -0
  131. package/examples/risky-agent-pr/patchdrill-demo.json +483 -0
  132. package/examples/risky-agent-pr/patchdrill-demo.md +140 -0
  133. package/examples/risky-agent-pr/patchdrill-demo.sarif +398 -0
  134. package/fixtures/stacks/README.md +4 -0
  135. package/fixtures/stacks/android-gradle/fixture.json +33 -0
  136. package/fixtures/stacks/aspnet-core-service/fixture.json +36 -0
  137. package/fixtures/stacks/bazel-workspace/fixture.json +30 -0
  138. package/fixtures/stacks/buck2-workspace/fixture.json +30 -0
  139. package/fixtures/stacks/cargo-workspace/fixture.json +48 -0
  140. package/fixtures/stacks/django-app/fixture.json +25 -0
  141. package/fixtures/stacks/docker-compose/fixture.json +17 -0
  142. package/fixtures/stacks/dockerfile-service/fixture.json +17 -0
  143. package/fixtures/stacks/dotnet-service/fixture.json +36 -0
  144. package/fixtures/stacks/dotnet-solution-filter/fixture.json +62 -0
  145. package/fixtures/stacks/fastapi-app/fixture.json +29 -0
  146. package/fixtures/stacks/go-workspace/fixture.json +48 -0
  147. package/fixtures/stacks/java-gradle/fixture.json +29 -0
  148. package/fixtures/stacks/java-maven/fixture.json +32 -0
  149. package/fixtures/stacks/kubernetes-helm/fixture.json +25 -0
  150. package/fixtures/stacks/kubernetes-kustomize/fixture.json +21 -0
  151. package/fixtures/stacks/nested-go-workspace/fixture.json +51 -0
  152. package/fixtures/stacks/nextjs-app/fixture.json +34 -0
  153. package/fixtures/stacks/node-turbo-workspace/fixture.json +39 -0
  154. package/fixtures/stacks/pants-python/fixture.json +33 -0
  155. package/fixtures/stacks/php-composer/fixture.json +31 -0
  156. package/fixtures/stacks/python-service/fixture.json +21 -0
  157. package/fixtures/stacks/rails-app/fixture.json +25 -0
  158. package/fixtures/stacks/spring-boot-gradle/fixture.json +29 -0
  159. package/fixtures/stacks/spring-boot-maven/fixture.json +43 -0
  160. package/fixtures/stacks/swift-package/fixture.json +21 -0
  161. package/fixtures/stacks/terraform-module/fixture.json +17 -0
  162. package/fixtures/stacks/uv-python-service/fixture.json +47 -0
  163. package/fixtures/stacks/xcode-app/fixture.json +72 -0
  164. package/package.json +80 -0
  165. package/schemas/patchdrill-doctor.schema.json +171 -0
  166. package/schemas/patchdrill-evidence.schema.json +239 -0
  167. package/schemas/patchdrill-policy.schema.json +170 -0
  168. package/schemas/patchdrill-release-check.schema.json +78 -0
  169. package/schemas/patchdrill-report.schema.json +647 -0
@@ -0,0 +1,355 @@
1
+ {
2
+ "schemaVersion": "1",
3
+ "generatedAt": "2026-06-01T00:00:00.000Z",
4
+ "root": "/demo/checkout",
5
+ "base": "origin/main",
6
+ "head": "feature/auth-session-hardening",
7
+ "summary": {
8
+ "status": "warn",
9
+ "riskScore": 58,
10
+ "confidenceScore": 82,
11
+ "changedFileCount": 5,
12
+ "additions": 186,
13
+ "deletions": 42,
14
+ "requiredCommandCount": 3,
15
+ "failedCommandCount": 0
16
+ },
17
+ "changedFiles": [
18
+ {
19
+ "path": "apps/api/src/auth/session.ts",
20
+ "status": "modified",
21
+ "additions": 54,
22
+ "deletions": 16,
23
+ "binary": false,
24
+ "owners": [
25
+ "@acme/security"
26
+ ]
27
+ },
28
+ {
29
+ "path": "apps/api/src/auth/session.test.ts",
30
+ "status": "modified",
31
+ "additions": 48,
32
+ "deletions": 4,
33
+ "binary": false,
34
+ "owners": [
35
+ "@acme/security"
36
+ ]
37
+ },
38
+ {
39
+ "path": "packages/db/migrations/20260601090000_add_session_rotation.sql",
40
+ "status": "added",
41
+ "additions": 38,
42
+ "deletions": 0,
43
+ "binary": false,
44
+ "owners": [
45
+ "@acme/data"
46
+ ]
47
+ },
48
+ {
49
+ "path": ".github/workflows/deploy.yml",
50
+ "status": "modified",
51
+ "additions": 22,
52
+ "deletions": 12,
53
+ "binary": false,
54
+ "owners": [
55
+ "@acme/platform"
56
+ ]
57
+ },
58
+ {
59
+ "path": "package-lock.json",
60
+ "status": "modified",
61
+ "additions": 24,
62
+ "deletions": 10,
63
+ "binary": false
64
+ }
65
+ ],
66
+ "addedLines": 186,
67
+ "projectSignals": [
68
+ {
69
+ "ecosystem": "node",
70
+ "manifestPath": "package.json",
71
+ "packageManager": "pnpm",
72
+ "taskRunner": "turbo",
73
+ "scripts": {
74
+ "typecheck": "turbo run typecheck",
75
+ "test": "turbo run test",
76
+ "build": "turbo run build",
77
+ "test:e2e": "playwright test"
78
+ },
79
+ "workspacePackages": [
80
+ {
81
+ "name": "@acme/api",
82
+ "projectName": "api",
83
+ "path": "apps/api",
84
+ "scripts": {
85
+ "typecheck": "tsc --noEmit",
86
+ "test": "vitest run",
87
+ "build": "tsup"
88
+ },
89
+ "targets": [
90
+ "typecheck",
91
+ "test",
92
+ "build"
93
+ ],
94
+ "dependencies": [
95
+ "@acme/db"
96
+ ]
97
+ },
98
+ {
99
+ "name": "@acme/db",
100
+ "projectName": "db",
101
+ "path": "packages/db",
102
+ "scripts": {
103
+ "test": "vitest run"
104
+ },
105
+ "targets": [
106
+ "test"
107
+ ]
108
+ }
109
+ ]
110
+ },
111
+ {
112
+ "ecosystem": "github-actions",
113
+ "manifestPath": ".github/workflows/deploy.yml"
114
+ }
115
+ ],
116
+ "affectedPackages": [
117
+ {
118
+ "name": "@acme/api",
119
+ "projectName": "api",
120
+ "path": "apps/api",
121
+ "scripts": {
122
+ "typecheck": "tsc --noEmit",
123
+ "test": "vitest run",
124
+ "build": "tsup"
125
+ },
126
+ "targets": [
127
+ "typecheck",
128
+ "test",
129
+ "build"
130
+ ],
131
+ "dependencies": [
132
+ "@acme/db"
133
+ ]
134
+ }
135
+ ],
136
+ "dependencyChanges": [
137
+ {
138
+ "file": "package-lock.json",
139
+ "packageName": "@acme/session-store",
140
+ "packagePath": "node_modules/@acme/session-store",
141
+ "dependencyType": "lockfile",
142
+ "changeType": "updated",
143
+ "before": "1.8.2",
144
+ "after": "1.9.0"
145
+ }
146
+ ],
147
+ "packageScriptChanges": [],
148
+ "policy": {
149
+ "path": ".patchdrill.yml",
150
+ "ignoredPaths": [
151
+ "dist/**",
152
+ "coverage/**"
153
+ ],
154
+ "failOn": "high",
155
+ "maxRisk": 69,
156
+ "ruleCount": 2,
157
+ "requiredCommandCount": 1,
158
+ "optionalCommandCount": 1
159
+ },
160
+ "codeOwners": {
161
+ "path": ".github/CODEOWNERS",
162
+ "ruleCount": 3
163
+ },
164
+ "baseline": {
165
+ "path": "previous-patchdrill-report.json",
166
+ "previousStatus": "warn",
167
+ "currentStatus": "warn",
168
+ "previousRiskScore": 44,
169
+ "currentRiskScore": 58,
170
+ "riskDelta": 14,
171
+ "newFindingCount": 2,
172
+ "resolvedFindingCount": 1,
173
+ "unchangedFindingCount": 3
174
+ },
175
+ "findings": [
176
+ {
177
+ "ruleId": "file.high-impact-area",
178
+ "severity": "high",
179
+ "title": "High-impact product area changed",
180
+ "detail": "Authentication/session code changed and needs strong proof before merge.",
181
+ "file": "apps/api/src/auth/session.ts",
182
+ "remediation": "Require owner review and targeted session regression evidence.",
183
+ "tags": [
184
+ "security",
185
+ "auth"
186
+ ]
187
+ },
188
+ {
189
+ "ruleId": "file.high-impact-area",
190
+ "severity": "high",
191
+ "title": "Data migration review required",
192
+ "detail": "A database migration can alter production session state.",
193
+ "file": "packages/db/migrations/20260601090000_add_session_rotation.sql",
194
+ "remediation": "Attach dry-run, rollback, and data-owner approval notes.",
195
+ "tags": [
196
+ "data",
197
+ "migration"
198
+ ]
199
+ },
200
+ {
201
+ "ruleId": "workflow.environment-oidc-token",
202
+ "severity": "medium",
203
+ "title": "OIDC deployment job should use a protected environment",
204
+ "detail": "A deployment workflow can mint cloud credentials without an explicit GitHub environment gate.",
205
+ "file": ".github/workflows/deploy.yml",
206
+ "line": 34,
207
+ "remediation": "Attach a protected environment or document why this job cannot deploy.",
208
+ "tags": [
209
+ "ci",
210
+ "oidc",
211
+ "supply-chain"
212
+ ]
213
+ },
214
+ {
215
+ "ruleId": "file.lockfile",
216
+ "severity": "low",
217
+ "title": "Dependency lockfile changed",
218
+ "detail": "@acme/session-store changed from 1.8.2 to 1.9.0.",
219
+ "file": "package-lock.json",
220
+ "remediation": "Review release notes and verify transitive dependency impact.",
221
+ "tags": [
222
+ "dependencies"
223
+ ]
224
+ }
225
+ ],
226
+ "commandPlan": [
227
+ {
228
+ "id": "node-turbo-api-typecheck",
229
+ "label": "Typecheck affected API package",
230
+ "command": "pnpm exec turbo run typecheck --filter=@acme/api",
231
+ "reason": "Auth source changed in @acme/api.",
232
+ "ecosystem": "node",
233
+ "required": true,
234
+ "packageName": "@acme/api",
235
+ "packagePath": "apps/api"
236
+ },
237
+ {
238
+ "id": "node-turbo-api-test",
239
+ "label": "Test affected API package",
240
+ "command": "pnpm exec turbo run test --filter=@acme/api",
241
+ "reason": "Session behavior changed and matching tests exist.",
242
+ "ecosystem": "node",
243
+ "required": true,
244
+ "packageName": "@acme/api",
245
+ "packagePath": "apps/api"
246
+ },
247
+ {
248
+ "id": "policy-contract-tests",
249
+ "label": "Contract tests",
250
+ "command": "pnpm run test:contracts",
251
+ "reason": "Repository policy requires contract tests for auth/session changes.",
252
+ "ecosystem": "general",
253
+ "required": true
254
+ },
255
+ {
256
+ "id": "node-e2e",
257
+ "label": "Browser e2e",
258
+ "command": "pnpm run test:e2e",
259
+ "reason": "Optional browser coverage is available for session rotation flows.",
260
+ "ecosystem": "node",
261
+ "required": false
262
+ }
263
+ ],
264
+ "commandResults": [
265
+ {
266
+ "id": "node-turbo-api-typecheck",
267
+ "command": "pnpm exec turbo run typecheck --filter=@acme/api",
268
+ "exitCode": 0,
269
+ "durationMs": 8421,
270
+ "stdout": "@acme/api:typecheck: cache miss, executing\n@acme/api:typecheck: ok\n",
271
+ "stderr": ""
272
+ },
273
+ {
274
+ "id": "node-turbo-api-test",
275
+ "command": "pnpm exec turbo run test --filter=@acme/api",
276
+ "exitCode": 0,
277
+ "durationMs": 12544,
278
+ "stdout": "@acme/api:test: 42 tests passed\n",
279
+ "stderr": ""
280
+ },
281
+ {
282
+ "id": "policy-contract-tests",
283
+ "command": "pnpm run test:contracts",
284
+ "exitCode": 0,
285
+ "durationMs": 15038,
286
+ "stdout": "contract auth-session passed\ncontract deployment-claims passed\n",
287
+ "stderr": ""
288
+ }
289
+ ],
290
+ "verification": {
291
+ "summary": {
292
+ "plannedRequired": 3,
293
+ "plannedOptional": 1,
294
+ "run": 3,
295
+ "passed": 3,
296
+ "failed": 0,
297
+ "timedOut": 0,
298
+ "missingRequired": 0,
299
+ "skippedOptional": 1,
300
+ "unplannedResults": 0
301
+ },
302
+ "commands": [
303
+ {
304
+ "id": "node-turbo-api-typecheck",
305
+ "label": "Typecheck affected API package",
306
+ "command": "pnpm exec turbo run typecheck --filter=@acme/api",
307
+ "reason": "Auth source changed in @acme/api.",
308
+ "ecosystem": "node",
309
+ "required": true,
310
+ "planned": true,
311
+ "status": "passed",
312
+ "packageName": "@acme/api",
313
+ "packagePath": "apps/api",
314
+ "exitCode": 0,
315
+ "durationMs": 8421
316
+ },
317
+ {
318
+ "id": "node-turbo-api-test",
319
+ "label": "Test affected API package",
320
+ "command": "pnpm exec turbo run test --filter=@acme/api",
321
+ "reason": "Session behavior changed and matching tests exist.",
322
+ "ecosystem": "node",
323
+ "required": true,
324
+ "planned": true,
325
+ "status": "passed",
326
+ "packageName": "@acme/api",
327
+ "packagePath": "apps/api",
328
+ "exitCode": 0,
329
+ "durationMs": 12544
330
+ },
331
+ {
332
+ "id": "policy-contract-tests",
333
+ "label": "Contract tests",
334
+ "command": "pnpm run test:contracts",
335
+ "reason": "Repository policy requires contract tests for auth/session changes.",
336
+ "ecosystem": "general",
337
+ "required": true,
338
+ "planned": true,
339
+ "status": "passed",
340
+ "exitCode": 0,
341
+ "durationMs": 15038
342
+ },
343
+ {
344
+ "id": "node-e2e",
345
+ "label": "Browser e2e",
346
+ "command": "pnpm run test:e2e",
347
+ "reason": "Optional browser coverage is available for session rotation flows.",
348
+ "ecosystem": "node",
349
+ "required": false,
350
+ "planned": true,
351
+ "status": "skipped-optional"
352
+ }
353
+ ]
354
+ }
355
+ }
@@ -0,0 +1,120 @@
1
+ # PatchDrill Report
2
+
3
+ Status: **WARN**
4
+ Risk score: **58/100**
5
+ Confidence score: **82/100**
6
+ Generated: 2026-06-01T00:00:00.000Z
7
+ Schema version: 1
8
+
9
+ ## Summary
10
+
11
+ - Changed files: 5
12
+ - Additions / deletions: +186 / -42
13
+ - Required verification commands: 3
14
+ - Failed verification commands: 0
15
+ - Verification evidence: 3 run, 3 passed, 0 failed, 0 timed out, 0 missing required, 1 optional skipped
16
+ - Added lines inspected: 186
17
+
18
+ ## Policy
19
+
20
+ - Config: .patchdrill.yml
21
+ - Ignored path patterns: 2
22
+ - Fail-on severity: high
23
+ - Max risk: 69
24
+ - Policy rules: 2
25
+ - Policy commands: 1 required, 1 optional
26
+
27
+ ## Code Owners
28
+
29
+ - Config: .github/CODEOWNERS
30
+ - Rules: 3
31
+
32
+ ## Baseline
33
+
34
+ - Baseline report: previous-patchdrill-report.json
35
+ - Status: warn -> warn
36
+ - Risk: 44/100 -> 58/100 (+14)
37
+ - Findings: 2 new, 1 resolved, 3 unchanged
38
+
39
+ ## Project Signals
40
+
41
+ | Ecosystem | Framework | Entrypoint | Manifest | Package manager | Task runner |
42
+ | --- | --- | --- | --- | --- | --- |
43
+ | node | | | package.json | pnpm | turbo |
44
+ | github-actions | | | .github/workflows/deploy.yml | | |
45
+
46
+ ## Affected Workspace Packages
47
+
48
+ | Package | Path |
49
+ | --- | --- |
50
+ | @acme/api | apps/api |
51
+
52
+ ## Dependency Changes
53
+
54
+ | File | Type | Package | Path | Change | Before | After |
55
+ | --- | --- | --- | --- | --- | --- | --- |
56
+ | package-lock.json | lockfile | @acme/session-store | node_modules/@acme/session-store | updated | 1.8.2 | 1.9.0 |
57
+
58
+ ## Changed Files
59
+
60
+ | File | Status | +/- | Owners |
61
+ | --- | --- | --- | --- |
62
+ | apps/api/src/auth/session.ts | modified | +54 / -16 | @acme/security |
63
+ | apps/api/src/auth/session.test.ts | modified | +48 / -4 | @acme/security |
64
+ | packages/db/migrations/20260601090000_add_session_rotation.sql | added | +38 / -0 | @acme/data |
65
+ | .github/workflows/deploy.yml | modified | +22 / -12 | @acme/platform |
66
+ | package-lock.json | modified | +24 / -10 | |
67
+
68
+ ## Findings
69
+
70
+ | Severity | Rule | Finding | Location | Remediation |
71
+ | --- | --- | --- | --- | --- |
72
+ | high | file.high-impact-area | High-impact product area changed: Authentication/session code changed and needs strong proof before merge. | apps/api/src/auth/session.ts | Require owner review and targeted session regression evidence. |
73
+ | high | file.high-impact-area | Data migration review required: A database migration can alter production session state. | packages/db/migrations/20260601090000_add_session_rotation.sql | Attach dry-run, rollback, and data-owner approval notes. |
74
+ | medium | workflow.environment-oidc-token | OIDC deployment job should use a protected environment: A deployment workflow can mint cloud credentials without an explicit GitHub environment gate. | .github/workflows/deploy.yml:34 | Attach a protected environment or document why this job cannot deploy. |
75
+ | low | file.lockfile | Dependency lockfile changed: @acme/session-store changed from 1.8.2 to 1.9.0. | package-lock.json | Review release notes and verify transitive dependency impact. |
76
+
77
+ ## Verification Plan
78
+
79
+ | Required | Package | Command | Result | Reason |
80
+ | --- | --- | --- | --- | --- |
81
+ | yes | @acme/api | `pnpm exec turbo run typecheck --filter=@acme/api` | passed | Auth source changed in @acme/api. |
82
+ | yes | @acme/api | `pnpm exec turbo run test --filter=@acme/api` | passed | Session behavior changed and matching tests exist. |
83
+ | yes | | `pnpm run test:contracts` | passed | Repository policy requires contract tests for auth/session changes. |
84
+ | no | | `pnpm run test:e2e` | skipped optional | Optional browser coverage is available for session rotation flows. |
85
+
86
+ ## Command Results
87
+
88
+ ### `pnpm exec turbo run typecheck --filter=@acme/api`
89
+
90
+ - Exit code: 0
91
+ - Duration: 8421ms
92
+
93
+ ```text
94
+ @acme/api:typecheck: cache miss, executing
95
+ @acme/api:typecheck: ok
96
+ ```
97
+
98
+ ### `pnpm exec turbo run test --filter=@acme/api`
99
+
100
+ - Exit code: 0
101
+ - Duration: 12544ms
102
+
103
+ ```text
104
+ @acme/api:test: 42 tests passed
105
+ ```
106
+
107
+ ### `pnpm run test:contracts`
108
+
109
+ - Exit code: 0
110
+ - Duration: 15038ms
111
+
112
+ ```text
113
+ contract auth-session passed
114
+ contract deployment-claims passed
115
+ ```
116
+
117
+ ## Reviewer Notes
118
+
119
+ - Treat this report as triage evidence, not a replacement for review.
120
+ - High-impact areas still need human sign-off even when automated commands pass.
@@ -0,0 +1,195 @@
1
+ {
2
+ "version": "2.1.0",
3
+ "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
4
+ "runs": [
5
+ {
6
+ "tool": {
7
+ "driver": {
8
+ "name": "PatchDrill",
9
+ "informationUri": "https://github.com/seungdori/patchdrill",
10
+ "rules": [
11
+ {
12
+ "id": "file.high-impact-area",
13
+ "name": "Data migration review required",
14
+ "shortDescription": {
15
+ "text": "Data migration review required"
16
+ },
17
+ "help": {
18
+ "text": "Attach dry-run, rollback, and data-owner approval notes."
19
+ },
20
+ "properties": {
21
+ "severity": "high",
22
+ "tags": [
23
+ "data",
24
+ "migration"
25
+ ]
26
+ }
27
+ },
28
+ {
29
+ "id": "workflow.environment-oidc-token",
30
+ "name": "OIDC deployment job should use a protected environment",
31
+ "shortDescription": {
32
+ "text": "OIDC deployment job should use a protected environment"
33
+ },
34
+ "help": {
35
+ "text": "Attach a protected environment or document why this job cannot deploy."
36
+ },
37
+ "properties": {
38
+ "severity": "medium",
39
+ "tags": [
40
+ "ci",
41
+ "oidc",
42
+ "supply-chain"
43
+ ]
44
+ }
45
+ },
46
+ {
47
+ "id": "file.lockfile",
48
+ "name": "Dependency lockfile changed",
49
+ "shortDescription": {
50
+ "text": "Dependency lockfile changed"
51
+ },
52
+ "help": {
53
+ "text": "Review release notes and verify transitive dependency impact."
54
+ },
55
+ "properties": {
56
+ "severity": "low",
57
+ "tags": [
58
+ "dependencies"
59
+ ]
60
+ }
61
+ }
62
+ ]
63
+ }
64
+ },
65
+ "invocations": [
66
+ {
67
+ "executionSuccessful": true,
68
+ "properties": {
69
+ "status": "warn",
70
+ "riskScore": 58,
71
+ "confidenceScore": 82
72
+ }
73
+ }
74
+ ],
75
+ "results": [
76
+ {
77
+ "ruleId": "file.high-impact-area",
78
+ "level": "error",
79
+ "message": {
80
+ "text": "High-impact product area changed: Authentication/session code changed and needs strong proof before merge. Remediation: Require owner review and targeted session regression evidence."
81
+ },
82
+ "locations": [
83
+ {
84
+ "physicalLocation": {
85
+ "artifactLocation": {
86
+ "uri": "apps/api/src/auth/session.ts"
87
+ },
88
+ "region": {
89
+ "startLine": 1
90
+ }
91
+ }
92
+ }
93
+ ],
94
+ "properties": {
95
+ "severity": "high",
96
+ "tags": [
97
+ "security",
98
+ "auth"
99
+ ]
100
+ },
101
+ "partialFingerprints": {
102
+ "patchdrillFinding": "1c19812835c3b6a32febeb8bc84e02b7e9a6bd1f08faa2620792e86cfdb43c77"
103
+ }
104
+ },
105
+ {
106
+ "ruleId": "file.high-impact-area",
107
+ "level": "error",
108
+ "message": {
109
+ "text": "Data migration review required: A database migration can alter production session state. Remediation: Attach dry-run, rollback, and data-owner approval notes."
110
+ },
111
+ "locations": [
112
+ {
113
+ "physicalLocation": {
114
+ "artifactLocation": {
115
+ "uri": "packages/db/migrations/20260601090000_add_session_rotation.sql"
116
+ },
117
+ "region": {
118
+ "startLine": 1
119
+ }
120
+ }
121
+ }
122
+ ],
123
+ "properties": {
124
+ "severity": "high",
125
+ "tags": [
126
+ "data",
127
+ "migration"
128
+ ]
129
+ },
130
+ "partialFingerprints": {
131
+ "patchdrillFinding": "09f68fa17d892e6441ec1ee58e0db1531675121edf5db634e1ff31a238635e28"
132
+ }
133
+ },
134
+ {
135
+ "ruleId": "workflow.environment-oidc-token",
136
+ "level": "warning",
137
+ "message": {
138
+ "text": "OIDC deployment job should use a protected environment: A deployment workflow can mint cloud credentials without an explicit GitHub environment gate. Remediation: Attach a protected environment or document why this job cannot deploy."
139
+ },
140
+ "locations": [
141
+ {
142
+ "physicalLocation": {
143
+ "artifactLocation": {
144
+ "uri": ".github/workflows/deploy.yml"
145
+ },
146
+ "region": {
147
+ "startLine": 34
148
+ }
149
+ }
150
+ }
151
+ ],
152
+ "properties": {
153
+ "severity": "medium",
154
+ "tags": [
155
+ "ci",
156
+ "oidc",
157
+ "supply-chain"
158
+ ]
159
+ },
160
+ "partialFingerprints": {
161
+ "patchdrillFinding": "d1195d6fb484dff935b2007c8f47ba3b37baa26a9952e27293505ab1923f34b2"
162
+ }
163
+ },
164
+ {
165
+ "ruleId": "file.lockfile",
166
+ "level": "note",
167
+ "message": {
168
+ "text": "Dependency lockfile changed: @acme/session-store changed from 1.8.2 to 1.9.0. Remediation: Review release notes and verify transitive dependency impact."
169
+ },
170
+ "locations": [
171
+ {
172
+ "physicalLocation": {
173
+ "artifactLocation": {
174
+ "uri": "package-lock.json"
175
+ },
176
+ "region": {
177
+ "startLine": 1
178
+ }
179
+ }
180
+ }
181
+ ],
182
+ "properties": {
183
+ "severity": "low",
184
+ "tags": [
185
+ "dependencies"
186
+ ]
187
+ },
188
+ "partialFingerprints": {
189
+ "patchdrillFinding": "5cdefc8ce238a88cde78ab92957d8d0b3f84483f99a431e5dd9af6c80012c92d"
190
+ }
191
+ }
192
+ ]
193
+ }
194
+ ]
195
+ }