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.
- package/.patchdrill.yml +33 -0
- package/CHANGELOG.md +150 -0
- package/CONTRIBUTING.md +59 -0
- package/LICENSE +21 -0
- package/README.md +601 -0
- package/SECURITY.md +28 -0
- package/action.yml +338 -0
- package/dist/baseline.d.ts +9 -0
- package/dist/baseline.js +38 -0
- package/dist/baseline.js.map +1 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.js +662 -0
- package/dist/cli.js.map +1 -0
- package/dist/codeowners.d.ts +14 -0
- package/dist/codeowners.js +104 -0
- package/dist/codeowners.js.map +1 -0
- package/dist/command-plan.d.ts +3 -0
- package/dist/command-plan.js +26 -0
- package/dist/command-plan.js.map +1 -0
- package/dist/demo.d.ts +5 -0
- package/dist/demo.js +525 -0
- package/dist/demo.js.map +1 -0
- package/dist/dependency.d.ts +4 -0
- package/dist/dependency.js +1424 -0
- package/dist/dependency.js.map +1 -0
- package/dist/doctor.d.ts +26 -0
- package/dist/doctor.js +183 -0
- package/dist/doctor.js.map +1 -0
- package/dist/evidence.d.ts +64 -0
- package/dist/evidence.js +352 -0
- package/dist/evidence.js.map +1 -0
- package/dist/git.d.ts +16 -0
- package/dist/git.js +349 -0
- package/dist/git.js.map +1 -0
- package/dist/i18n-catalog.d.ts +8 -0
- package/dist/i18n-catalog.js +446 -0
- package/dist/i18n-catalog.js.map +1 -0
- package/dist/i18n.d.ts +20 -0
- package/dist/i18n.js +67 -0
- package/dist/i18n.js.map +1 -0
- package/dist/init.d.ts +13 -0
- package/dist/init.js +312 -0
- package/dist/init.js.map +1 -0
- package/dist/markdown-links.d.ts +18 -0
- package/dist/markdown-links.js +180 -0
- package/dist/markdown-links.js.map +1 -0
- package/dist/package-scripts.d.ts +3 -0
- package/dist/package-scripts.js +55 -0
- package/dist/package-scripts.js.map +1 -0
- package/dist/planner.d.ts +8 -0
- package/dist/planner.js +2351 -0
- package/dist/planner.js.map +1 -0
- package/dist/policy.d.ts +12 -0
- package/dist/policy.js +255 -0
- package/dist/policy.js.map +1 -0
- package/dist/project.d.ts +2 -0
- package/dist/project.js +1085 -0
- package/dist/project.js.map +1 -0
- package/dist/release-readiness.d.ts +25 -0
- package/dist/release-readiness.js +426 -0
- package/dist/release-readiness.js.map +1 -0
- package/dist/report-annotations.d.ts +3 -0
- package/dist/report-annotations.js +28 -0
- package/dist/report-annotations.js.map +1 -0
- package/dist/report-contract.d.ts +2 -0
- package/dist/report-contract.js +82 -0
- package/dist/report-contract.js.map +1 -0
- package/dist/report-html.d.ts +7 -0
- package/dist/report-html.js +706 -0
- package/dist/report-html.js.map +1 -0
- package/dist/report-sarif.d.ts +2 -0
- package/dist/report-sarif.js +90 -0
- package/dist/report-sarif.js.map +1 -0
- package/dist/report.d.ts +14 -0
- package/dist/report.js +310 -0
- package/dist/report.js.map +1 -0
- package/dist/risk.d.ts +19 -0
- package/dist/risk.js +1226 -0
- package/dist/risk.js.map +1 -0
- package/dist/runner.d.ts +8 -0
- package/dist/runner.js +113 -0
- package/dist/runner.js.map +1 -0
- package/dist/scan.d.ts +2 -0
- package/dist/scan.js +195 -0
- package/dist/scan.js.map +1 -0
- package/dist/schema.d.ts +12 -0
- package/dist/schema.js +30 -0
- package/dist/schema.js.map +1 -0
- package/dist/stack-coverage.d.ts +8 -0
- package/dist/stack-coverage.js +94 -0
- package/dist/stack-coverage.js.map +1 -0
- package/dist/types.d.ts +206 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verification.d.ts +11 -0
- package/dist/verification.js +108 -0
- package/dist/verification.js.map +1 -0
- package/docs/ANNOTATIONS.md +34 -0
- package/docs/ARCHITECTURE.md +79 -0
- package/docs/BASELINES.md +32 -0
- package/docs/CASE_STUDIES.md +106 -0
- package/docs/CODEOWNERS.md +23 -0
- package/docs/DASHBOARD.md +87 -0
- package/docs/EVIDENCE.md +55 -0
- package/docs/LAUNCH_PLAYBOOK.md +103 -0
- package/docs/MONOREPOS.md +74 -0
- package/docs/POLICY.md +98 -0
- package/docs/PROOF_PACKS.md +57 -0
- package/docs/PR_COMMENTS.md +56 -0
- package/docs/RELEASE.md +35 -0
- package/docs/ROADMAP.md +152 -0
- package/docs/RULE_CATALOG.md +90 -0
- package/docs/SARIF.md +74 -0
- package/docs/SCHEMAS.md +49 -0
- package/docs/SECURITY_POSTURE.md +32 -0
- package/docs/STACK_COVERAGE.md +20 -0
- package/docs/assets/patchdrill-demo.svg +21 -0
- package/docs/media/patchdrill-dashboard.png +0 -0
- package/docs/media/patchdrill-demo.gif +0 -0
- package/examples/case-studies/README.md +20 -0
- package/examples/demo/README.md +21 -0
- package/examples/demo/patchdrill-demo-summary.md +35 -0
- package/examples/demo/patchdrill-demo.html +623 -0
- package/examples/demo/patchdrill-demo.json +355 -0
- package/examples/demo/patchdrill-demo.md +120 -0
- package/examples/demo/patchdrill-demo.sarif +195 -0
- package/examples/report.md +128 -0
- package/examples/risky-agent-pr/README.md +15 -0
- package/examples/risky-agent-pr/patchdrill-demo-summary.md +41 -0
- package/examples/risky-agent-pr/patchdrill-demo.html +681 -0
- package/examples/risky-agent-pr/patchdrill-demo.json +483 -0
- package/examples/risky-agent-pr/patchdrill-demo.md +140 -0
- package/examples/risky-agent-pr/patchdrill-demo.sarif +398 -0
- package/fixtures/stacks/README.md +4 -0
- package/fixtures/stacks/android-gradle/fixture.json +33 -0
- package/fixtures/stacks/aspnet-core-service/fixture.json +36 -0
- package/fixtures/stacks/bazel-workspace/fixture.json +30 -0
- package/fixtures/stacks/buck2-workspace/fixture.json +30 -0
- package/fixtures/stacks/cargo-workspace/fixture.json +48 -0
- package/fixtures/stacks/django-app/fixture.json +25 -0
- package/fixtures/stacks/docker-compose/fixture.json +17 -0
- package/fixtures/stacks/dockerfile-service/fixture.json +17 -0
- package/fixtures/stacks/dotnet-service/fixture.json +36 -0
- package/fixtures/stacks/dotnet-solution-filter/fixture.json +62 -0
- package/fixtures/stacks/fastapi-app/fixture.json +29 -0
- package/fixtures/stacks/go-workspace/fixture.json +48 -0
- package/fixtures/stacks/java-gradle/fixture.json +29 -0
- package/fixtures/stacks/java-maven/fixture.json +32 -0
- package/fixtures/stacks/kubernetes-helm/fixture.json +25 -0
- package/fixtures/stacks/kubernetes-kustomize/fixture.json +21 -0
- package/fixtures/stacks/nested-go-workspace/fixture.json +51 -0
- package/fixtures/stacks/nextjs-app/fixture.json +34 -0
- package/fixtures/stacks/node-turbo-workspace/fixture.json +39 -0
- package/fixtures/stacks/pants-python/fixture.json +33 -0
- package/fixtures/stacks/php-composer/fixture.json +31 -0
- package/fixtures/stacks/python-service/fixture.json +21 -0
- package/fixtures/stacks/rails-app/fixture.json +25 -0
- package/fixtures/stacks/spring-boot-gradle/fixture.json +29 -0
- package/fixtures/stacks/spring-boot-maven/fixture.json +43 -0
- package/fixtures/stacks/swift-package/fixture.json +21 -0
- package/fixtures/stacks/terraform-module/fixture.json +17 -0
- package/fixtures/stacks/uv-python-service/fixture.json +47 -0
- package/fixtures/stacks/xcode-app/fixture.json +72 -0
- package/package.json +80 -0
- package/schemas/patchdrill-doctor.schema.json +171 -0
- package/schemas/patchdrill-evidence.schema.json +239 -0
- package/schemas/patchdrill-policy.schema.json +170 -0
- package/schemas/patchdrill-release-check.schema.json +78 -0
- 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
|
+
}
|