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,681 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<link rel="icon" href="data:,">
|
|
7
|
+
<title>PatchDrill Dashboard</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root {
|
|
10
|
+
color-scheme: light;
|
|
11
|
+
--bg: #f6f7f9;
|
|
12
|
+
--panel: #ffffff;
|
|
13
|
+
--text: #15181e;
|
|
14
|
+
--muted: #5c6470;
|
|
15
|
+
--border: #d9dee7;
|
|
16
|
+
--code-bg: #f0f3f7;
|
|
17
|
+
--pass: #0b6b43;
|
|
18
|
+
--pass-bg: #e5f5ed;
|
|
19
|
+
--warn: #9a5b00;
|
|
20
|
+
--warn-bg: #fff0d6;
|
|
21
|
+
--fail: #a12828;
|
|
22
|
+
--fail-bg: #fde7e7;
|
|
23
|
+
--info: #285da1;
|
|
24
|
+
--info-bg: #e7f0fb;
|
|
25
|
+
--shadow: 0 1px 2px rgb(16 24 40 / 8%);
|
|
26
|
+
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
* {
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
body {
|
|
34
|
+
margin: 0;
|
|
35
|
+
background: var(--bg);
|
|
36
|
+
color: var(--text);
|
|
37
|
+
line-height: 1.5;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
main {
|
|
41
|
+
width: min(1180px, calc(100% - 32px));
|
|
42
|
+
margin: 0 auto;
|
|
43
|
+
padding: 32px 0 48px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
header {
|
|
47
|
+
display: grid;
|
|
48
|
+
gap: 18px;
|
|
49
|
+
margin-bottom: 22px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
h1,
|
|
53
|
+
h2,
|
|
54
|
+
h3,
|
|
55
|
+
p {
|
|
56
|
+
margin: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
h1 {
|
|
60
|
+
font-size: 32px;
|
|
61
|
+
line-height: 1.15;
|
|
62
|
+
letter-spacing: 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
h2 {
|
|
66
|
+
font-size: 19px;
|
|
67
|
+
line-height: 1.25;
|
|
68
|
+
letter-spacing: 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
h3 {
|
|
72
|
+
font-size: 15px;
|
|
73
|
+
line-height: 1.3;
|
|
74
|
+
letter-spacing: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.eyebrow {
|
|
78
|
+
color: var(--muted);
|
|
79
|
+
font-size: 13px;
|
|
80
|
+
font-weight: 700;
|
|
81
|
+
letter-spacing: .08em;
|
|
82
|
+
text-transform: uppercase;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.header-row,
|
|
86
|
+
.section-heading,
|
|
87
|
+
.finding-head,
|
|
88
|
+
summary {
|
|
89
|
+
align-items: center;
|
|
90
|
+
display: flex;
|
|
91
|
+
gap: 12px;
|
|
92
|
+
justify-content: space-between;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.context {
|
|
96
|
+
color: var(--muted);
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-wrap: wrap;
|
|
99
|
+
font-size: 13px;
|
|
100
|
+
gap: 8px 16px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.grid {
|
|
104
|
+
display: grid;
|
|
105
|
+
gap: 12px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.metrics {
|
|
109
|
+
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.two-column {
|
|
113
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.metric,
|
|
117
|
+
.finding,
|
|
118
|
+
.table-wrap,
|
|
119
|
+
details {
|
|
120
|
+
background: var(--panel);
|
|
121
|
+
border: 1px solid var(--border);
|
|
122
|
+
border-radius: 8px;
|
|
123
|
+
box-shadow: var(--shadow);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
section {
|
|
127
|
+
display: grid;
|
|
128
|
+
gap: 14px;
|
|
129
|
+
margin-top: 24px;
|
|
130
|
+
padding: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.metric {
|
|
134
|
+
min-width: 0;
|
|
135
|
+
padding: 14px;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.metric-label {
|
|
139
|
+
color: var(--muted);
|
|
140
|
+
font-size: 12px;
|
|
141
|
+
font-weight: 700;
|
|
142
|
+
text-transform: uppercase;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.metric-value {
|
|
146
|
+
font-size: 24px;
|
|
147
|
+
font-weight: 760;
|
|
148
|
+
line-height: 1.2;
|
|
149
|
+
margin-top: 6px;
|
|
150
|
+
overflow-wrap: anywhere;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.metric-detail {
|
|
154
|
+
color: var(--muted);
|
|
155
|
+
font-size: 12px;
|
|
156
|
+
margin-top: 4px;
|
|
157
|
+
overflow-wrap: anywhere;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.bar {
|
|
161
|
+
background: #e7ebf1;
|
|
162
|
+
border-radius: 999px;
|
|
163
|
+
height: 8px;
|
|
164
|
+
margin-top: 10px;
|
|
165
|
+
overflow: hidden;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.bar span {
|
|
169
|
+
display: block;
|
|
170
|
+
height: 100%;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.bar .pass {
|
|
174
|
+
background: var(--pass);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.bar .warn {
|
|
178
|
+
background: var(--warn);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.bar .fail {
|
|
182
|
+
background: var(--fail);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.trend-table td,
|
|
186
|
+
.trend-table th {
|
|
187
|
+
white-space: nowrap;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.trend-risk {
|
|
191
|
+
align-items: center;
|
|
192
|
+
display: grid;
|
|
193
|
+
gap: 8px;
|
|
194
|
+
grid-template-columns: 54px minmax(120px, 1fr);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.pill {
|
|
198
|
+
border-radius: 999px;
|
|
199
|
+
display: inline-flex;
|
|
200
|
+
font-size: 12px;
|
|
201
|
+
font-weight: 760;
|
|
202
|
+
gap: 6px;
|
|
203
|
+
line-height: 1;
|
|
204
|
+
padding: 7px 9px;
|
|
205
|
+
text-transform: uppercase;
|
|
206
|
+
white-space: nowrap;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.pass {
|
|
210
|
+
background: var(--pass-bg);
|
|
211
|
+
color: var(--pass);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.warn {
|
|
215
|
+
background: var(--warn-bg);
|
|
216
|
+
color: var(--warn);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.fail,
|
|
220
|
+
.critical,
|
|
221
|
+
.high {
|
|
222
|
+
background: var(--fail-bg);
|
|
223
|
+
color: var(--fail);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.medium {
|
|
227
|
+
background: var(--warn-bg);
|
|
228
|
+
color: var(--warn);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.low,
|
|
232
|
+
.info {
|
|
233
|
+
background: var(--info-bg);
|
|
234
|
+
color: var(--info);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.muted,
|
|
238
|
+
.empty {
|
|
239
|
+
color: var(--muted);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.table-wrap {
|
|
243
|
+
overflow-x: auto;
|
|
244
|
+
border-radius: 8px;
|
|
245
|
+
box-shadow: var(--shadow);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
table {
|
|
249
|
+
border-collapse: collapse;
|
|
250
|
+
font-size: 13px;
|
|
251
|
+
min-width: 720px;
|
|
252
|
+
width: 100%;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
th,
|
|
256
|
+
td {
|
|
257
|
+
border-bottom: 1px solid var(--border);
|
|
258
|
+
padding: 10px;
|
|
259
|
+
text-align: left;
|
|
260
|
+
vertical-align: top;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
th {
|
|
264
|
+
color: var(--muted);
|
|
265
|
+
font-size: 12px;
|
|
266
|
+
text-transform: uppercase;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
tr:last-child td {
|
|
270
|
+
border-bottom: 0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
code,
|
|
274
|
+
pre {
|
|
275
|
+
background: var(--code-bg);
|
|
276
|
+
border-radius: 6px;
|
|
277
|
+
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
278
|
+
font-size: 12px;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
code {
|
|
282
|
+
padding: 2px 5px;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
pre {
|
|
286
|
+
margin: 10px 0 0;
|
|
287
|
+
max-height: 360px;
|
|
288
|
+
overflow: auto;
|
|
289
|
+
padding: 12px;
|
|
290
|
+
white-space: pre-wrap;
|
|
291
|
+
word-break: break-word;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.finding-list {
|
|
295
|
+
display: grid;
|
|
296
|
+
gap: 10px;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.finding {
|
|
300
|
+
display: grid;
|
|
301
|
+
gap: 8px;
|
|
302
|
+
padding: 14px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.finding-title {
|
|
306
|
+
font-weight: 760;
|
|
307
|
+
overflow-wrap: anywhere;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.detail-list {
|
|
311
|
+
display: grid;
|
|
312
|
+
gap: 8px;
|
|
313
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.detail-item {
|
|
317
|
+
border: 1px solid var(--border);
|
|
318
|
+
border-radius: 8px;
|
|
319
|
+
padding: 12px;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.detail-label {
|
|
323
|
+
color: var(--muted);
|
|
324
|
+
font-size: 12px;
|
|
325
|
+
font-weight: 700;
|
|
326
|
+
text-transform: uppercase;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.detail-value {
|
|
330
|
+
margin-top: 4px;
|
|
331
|
+
overflow-wrap: anywhere;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
details {
|
|
335
|
+
padding: 0;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
summary {
|
|
339
|
+
cursor: pointer;
|
|
340
|
+
font-weight: 700;
|
|
341
|
+
list-style: none;
|
|
342
|
+
padding: 14px;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
summary::-webkit-details-marker {
|
|
346
|
+
display: none;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.command-body {
|
|
350
|
+
border-top: 1px solid var(--border);
|
|
351
|
+
padding: 0 14px 14px;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
@media (max-width: 900px) {
|
|
355
|
+
.metrics,
|
|
356
|
+
.two-column,
|
|
357
|
+
.detail-list {
|
|
358
|
+
grid-template-columns: 1fr;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.header-row,
|
|
362
|
+
.section-heading,
|
|
363
|
+
.finding-head,
|
|
364
|
+
summary {
|
|
365
|
+
align-items: flex-start;
|
|
366
|
+
flex-direction: column;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
main {
|
|
370
|
+
width: min(100% - 20px, 1180px);
|
|
371
|
+
padding-top: 20px;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
</style>
|
|
375
|
+
</head>
|
|
376
|
+
<body>
|
|
377
|
+
<main>
|
|
378
|
+
<header>
|
|
379
|
+
<div class="header-row">
|
|
380
|
+
<div>
|
|
381
|
+
<p class="eyebrow">PatchDrill</p>
|
|
382
|
+
<h1>Verification Dashboard</h1>
|
|
383
|
+
</div>
|
|
384
|
+
<span class="pill fail">FAIL</span>
|
|
385
|
+
</div>
|
|
386
|
+
<div class="context"><span>Base: origin/main</span><span>Head: agent/refactor-release-flow</span><span>Generated: 2026-06-01T00:00:00.000Z</span><span>Schema: 1</span></div>
|
|
387
|
+
</header>
|
|
388
|
+
|
|
389
|
+
<div class="grid metrics">
|
|
390
|
+
<div class="metric">
|
|
391
|
+
<div class="metric-label">Risk score</div>
|
|
392
|
+
<div class="metric-value">94/100</div>
|
|
393
|
+
<div class="metric-detail">Higher means more review proof is needed.</div>
|
|
394
|
+
<div class="bar" aria-hidden="true"><span class="fail" style="width: 94%;"></span></div>
|
|
395
|
+
</div>
|
|
396
|
+
<div class="metric">
|
|
397
|
+
<div class="metric-label">Confidence</div>
|
|
398
|
+
<div class="metric-value">21/100</div>
|
|
399
|
+
<div class="metric-detail">Higher means stronger verification evidence.</div>
|
|
400
|
+
<div class="bar" aria-hidden="true"><span class="pass" style="width: 21%;"></span></div>
|
|
401
|
+
</div>
|
|
402
|
+
<div class="metric">
|
|
403
|
+
<div class="metric-label">Changed files</div>
|
|
404
|
+
<div class="metric-value">8</div>
|
|
405
|
+
<div class="metric-detail">+326 / -78</div>
|
|
406
|
+
</div>
|
|
407
|
+
<div class="metric">
|
|
408
|
+
<div class="metric-label">Required checks</div>
|
|
409
|
+
<div class="metric-value">4</div>
|
|
410
|
+
<div class="metric-detail">2 passed, 1 failed, 1 missing</div>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="metric">
|
|
413
|
+
<div class="metric-label">Added lines</div>
|
|
414
|
+
<div class="metric-value">326</div>
|
|
415
|
+
<div class="metric-detail">Diff lines scanned for risky content.</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
<section>
|
|
422
|
+
<div class="section-heading">
|
|
423
|
+
<h2>Findings</h2>
|
|
424
|
+
<span class="pill fail">8 total</span>
|
|
425
|
+
</div>
|
|
426
|
+
<div class="finding-list">
|
|
427
|
+
<article class="finding">
|
|
428
|
+
<div class="finding-head">
|
|
429
|
+
<div>
|
|
430
|
+
<div class="finding-title">Privileged workflow checks out pull request code</div>
|
|
431
|
+
<div class="metric-detail">.github/workflows/release.yml:19</div>
|
|
432
|
+
</div>
|
|
433
|
+
<span class="pill critical">critical</span>
|
|
434
|
+
</div>
|
|
435
|
+
<p>A pull_request_target workflow can run untrusted pull request code while write tokens or repository secrets are available.</p>
|
|
436
|
+
<p class="muted">Remediation: Use pull_request for untrusted code, remove PR-head checkout, or split the privileged publishing step behind an environment gate.</p>
|
|
437
|
+
<p class="muted">Rule: <code>workflow.pull-request-target-head-checkout</code></p>
|
|
438
|
+
<p class="muted">Tags: ci, supply-chain, github-actions</p>
|
|
439
|
+
</article><article class="finding">
|
|
440
|
+
<div class="finding-head">
|
|
441
|
+
<div>
|
|
442
|
+
<div class="finding-title">Secret-looking value added</div>
|
|
443
|
+
<div class="metric-detail">.env.example:8</div>
|
|
444
|
+
</div>
|
|
445
|
+
<span class="pill critical">critical</span>
|
|
446
|
+
</div>
|
|
447
|
+
<p>A newly added environment example contains a value with a live-key shape. The demo redacts the actual token body.</p>
|
|
448
|
+
<p class="muted">Remediation: Remove the value, rotate the credential if it was real, and use a non-secret placeholder such as <redacted>.</p>
|
|
449
|
+
<p class="muted">Rule: <code>secret.generic-assignment</code></p>
|
|
450
|
+
<p class="muted">Tags: secret, credentials</p>
|
|
451
|
+
</article><article class="finding">
|
|
452
|
+
<div class="finding-head">
|
|
453
|
+
<div>
|
|
454
|
+
<div class="finding-title">Agent instructions changed</div>
|
|
455
|
+
<div class="metric-detail">AGENTS.md</div>
|
|
456
|
+
</div>
|
|
457
|
+
<span class="pill high">high</span>
|
|
458
|
+
</div>
|
|
459
|
+
<p>Repository-level coding-agent instructions changed in the same patch as release and billing code.</p>
|
|
460
|
+
<p class="muted">Remediation: Review instruction changes separately and require maintainer approval before agent-visible rules change.</p>
|
|
461
|
+
<p class="muted">Rule: <code>agent.control-file</code></p>
|
|
462
|
+
<p class="muted">Tags: agentic-coding, review</p>
|
|
463
|
+
</article><article class="finding">
|
|
464
|
+
<div class="finding-head">
|
|
465
|
+
<div>
|
|
466
|
+
<div class="finding-title">High-impact product area changed</div>
|
|
467
|
+
<div class="metric-detail">apps/web/src/billing/checkout.ts</div>
|
|
468
|
+
</div>
|
|
469
|
+
<span class="pill high">high</span>
|
|
470
|
+
</div>
|
|
471
|
+
<p>Billing checkout and webhook code changed, which can affect payment capture, refunds, and entitlement state.</p>
|
|
472
|
+
<p class="muted">Remediation: Attach targeted billing regression tests and owner approval.</p>
|
|
473
|
+
<p class="muted">Rule: <code>file.high-impact-area</code></p>
|
|
474
|
+
<p class="muted">Tags: billing, payments</p>
|
|
475
|
+
</article><article class="finding">
|
|
476
|
+
<div class="finding-head">
|
|
477
|
+
<div>
|
|
478
|
+
<div class="finding-title">Verification script disabled: test</div>
|
|
479
|
+
<div class="metric-detail">package.json</div>
|
|
480
|
+
</div>
|
|
481
|
+
<span class="pill high">high</span>
|
|
482
|
+
</div>
|
|
483
|
+
<p>package.json verification script "test" now appears to exit successfully without running meaningful checks.</p>
|
|
484
|
+
<p class="muted">Remediation: Restore the real verification command or explain why this repository no longer has that check.</p>
|
|
485
|
+
<p class="muted">Rule: <code>package-script.disabled-verification</code></p>
|
|
486
|
+
<p class="muted">Tags: testing, ci, package-script</p>
|
|
487
|
+
</article><article class="finding">
|
|
488
|
+
<div class="finding-head">
|
|
489
|
+
<div>
|
|
490
|
+
<div class="finding-title">Package lifecycle script changed: postinstall</div>
|
|
491
|
+
<div class="metric-detail">package.json</div>
|
|
492
|
+
</div>
|
|
493
|
+
<span class="pill high">high</span>
|
|
494
|
+
</div>
|
|
495
|
+
<p>package.json lifecycle script "postinstall" was added, creating code that can run during install, prepare, pack, or publish flows.</p>
|
|
496
|
+
<p class="muted">Remediation: Review the script as executable supply-chain surface. Prefer explicit CI steps or documented commands over implicit install-time behavior.</p>
|
|
497
|
+
<p class="muted">Rule: <code>package-script.lifecycle</code></p>
|
|
498
|
+
<p class="muted">Tags: dependencies, supply-chain, package-script</p>
|
|
499
|
+
</article><article class="finding">
|
|
500
|
+
<div class="finding-head">
|
|
501
|
+
<div>
|
|
502
|
+
<div class="finding-title">Source changed without matching test changes</div>
|
|
503
|
+
<div class="metric-detail">apps/web/src/billing/checkout.ts</div>
|
|
504
|
+
</div>
|
|
505
|
+
<span class="pill medium">medium</span>
|
|
506
|
+
</div>
|
|
507
|
+
<p>Billing source files changed, but no matching checkout or webhook test files changed.</p>
|
|
508
|
+
<p class="muted">Remediation: Add or update tests covering signed webhook verification, failed payment paths, and entitlement updates.</p>
|
|
509
|
+
<p class="muted">Rule: <code>test.source-without-test-change</code></p>
|
|
510
|
+
<p class="muted">Tags: tests</p>
|
|
511
|
+
</article><article class="finding">
|
|
512
|
+
<div class="finding-head">
|
|
513
|
+
<div>
|
|
514
|
+
<div class="finding-title">Dependency lockfile changed</div>
|
|
515
|
+
<div class="metric-detail">package-lock.json</div>
|
|
516
|
+
</div>
|
|
517
|
+
<span class="pill low">low</span>
|
|
518
|
+
</div>
|
|
519
|
+
<p>@acme/payments changed from 4.2.0 to 4.3.0.</p>
|
|
520
|
+
<p class="muted">Remediation: Review release notes and verify transitive dependency impact.</p>
|
|
521
|
+
<p class="muted">Rule: <code>file.lockfile</code></p>
|
|
522
|
+
<p class="muted">Tags: dependencies</p>
|
|
523
|
+
</article>
|
|
524
|
+
</div>
|
|
525
|
+
</section>
|
|
526
|
+
|
|
527
|
+
<section>
|
|
528
|
+
<div class="section-heading">
|
|
529
|
+
<h2>Verification Plan</h2>
|
|
530
|
+
<span class="pill info">4 required, 1 optional</span>
|
|
531
|
+
</div>
|
|
532
|
+
<div class="table-wrap">
|
|
533
|
+
<table>
|
|
534
|
+
<thead>
|
|
535
|
+
<tr><th>Required</th><th>Package</th><th>Command</th><th>Result</th><th>Reason</th></tr>
|
|
536
|
+
</thead>
|
|
537
|
+
<tbody>
|
|
538
|
+
<tr><td><span class="pill warn">yes</span></td><td>@acme/web</td><td><code>npm run lint --workspace @acme/web</code></td><td><span class="pill pass">passed</span></td><td>Billing and release-adjacent source files changed.</td></tr><tr><td><span class="pill warn">yes</span></td><td>@acme/web</td><td><code>npm test --workspace @acme/web</code></td><td><span class="pill fail">failed (1)</span></td><td>Billing checkout and webhook behavior changed.</td></tr><tr><td><span class="pill warn">yes</span></td><td>@acme/web</td><td><code>npm run build --workspace @acme/web</code></td><td><span class="pill pass">passed</span></td><td>Production web package changed.</td></tr><tr><td><span class="pill warn">yes</span></td><td></td><td><code>gh workflow view release.yml --yaml</code></td><td><span class="pill warn">not run</span></td><td>Repository policy requires human-readable workflow evidence when privileged release jobs change.</td></tr><tr><td><span class="pill info">no</span></td><td>@acme/web</td><td><code>npm run test:e2e -- --grep billing</code></td><td><span class="pill info">skipped optional</span></td><td>Optional browser coverage is available for checkout flows.</td></tr>
|
|
539
|
+
</tbody>
|
|
540
|
+
</table>
|
|
541
|
+
</div>
|
|
542
|
+
</section>
|
|
543
|
+
|
|
544
|
+
<section>
|
|
545
|
+
<div class="section-heading">
|
|
546
|
+
<h2>Command Results</h2>
|
|
547
|
+
<span class="pill fail">1 failed</span>
|
|
548
|
+
</div>
|
|
549
|
+
<div class="grid">
|
|
550
|
+
<details>
|
|
551
|
+
<summary>
|
|
552
|
+
<span><code>npm run lint --workspace @acme/web</code></span>
|
|
553
|
+
<span class="pill pass">exit 0</span>
|
|
554
|
+
</summary>
|
|
555
|
+
<div class="command-body">
|
|
556
|
+
<p class="muted">Duration: 6240ms</p>
|
|
557
|
+
<h3>stdout</h3><pre>@acme/web lint: ok</pre>
|
|
558
|
+
</div>
|
|
559
|
+
</details><details>
|
|
560
|
+
<summary>
|
|
561
|
+
<span><code>npm test --workspace @acme/web</code></span>
|
|
562
|
+
<span class="pill fail">exit 1</span>
|
|
563
|
+
</summary>
|
|
564
|
+
<div class="command-body">
|
|
565
|
+
<p class="muted">Duration: 11982ms</p>
|
|
566
|
+
<h3>stdout</h3><pre>CheckoutService.test.ts: 38 passed, 1 failed
|
|
567
|
+
Webhook signature regression: expected 401, received 200</pre>
|
|
568
|
+
<h3>stderr</h3><pre>FAIL apps/web/src/billing/webhook.test.ts > rejects unsigned webhook payloads</pre>
|
|
569
|
+
</div>
|
|
570
|
+
</details><details>
|
|
571
|
+
<summary>
|
|
572
|
+
<span><code>npm run build --workspace @acme/web</code></span>
|
|
573
|
+
<span class="pill pass">exit 0</span>
|
|
574
|
+
</summary>
|
|
575
|
+
<div class="command-body">
|
|
576
|
+
<p class="muted">Duration: 18321ms</p>
|
|
577
|
+
<h3>stdout</h3><pre>vite v6.0.0 building for production...
|
|
578
|
+
built in 4.2s</pre>
|
|
579
|
+
</div>
|
|
580
|
+
</details>
|
|
581
|
+
</div>
|
|
582
|
+
</section>
|
|
583
|
+
|
|
584
|
+
<section>
|
|
585
|
+
<h2>Changed Files</h2>
|
|
586
|
+
<div class="table-wrap">
|
|
587
|
+
<table>
|
|
588
|
+
<thead>
|
|
589
|
+
<tr><th>File</th><th>Status</th><th>+/-</th><th>Owners</th></tr>
|
|
590
|
+
</thead>
|
|
591
|
+
<tbody>
|
|
592
|
+
<tr><td>AGENTS.md</td><td>modified</td><td>+28 / -4</td><td>@acme/platform</td></tr><tr><td>.github/workflows/release.yml</td><td>modified</td><td>+44 / -18</td><td>@acme/platform</td></tr><tr><td>apps/web/src/billing/checkout.ts</td><td>modified</td><td>+83 / -21</td><td>@acme/billing</td></tr><tr><td>apps/web/src/billing/webhook.ts</td><td>modified</td><td>+39 / -15</td><td>@acme/billing</td></tr><tr><td>scripts/deploy.sh</td><td>modified</td><td>+27 / -8</td><td>@acme/platform</td></tr><tr><td>.env.example</td><td>modified</td><td>+3 / -0</td><td>@acme/platform</td></tr><tr><td>package.json</td><td>modified</td><td>+14 / -4</td><td>@acme/platform</td></tr><tr><td>package-lock.json</td><td>modified</td><td>+88 / -8</td><td></td></tr>
|
|
593
|
+
</tbody>
|
|
594
|
+
</table>
|
|
595
|
+
</div>
|
|
596
|
+
</section>
|
|
597
|
+
|
|
598
|
+
<div class="grid two-column">
|
|
599
|
+
<section>
|
|
600
|
+
<h2>Project Signals</h2>
|
|
601
|
+
<div class="table-wrap">
|
|
602
|
+
<table>
|
|
603
|
+
<thead>
|
|
604
|
+
<tr><th>Ecosystem</th><th>Framework</th><th>Entrypoint</th><th>Manifest</th><th>Package manager</th><th>Task runner</th></tr>
|
|
605
|
+
</thead>
|
|
606
|
+
<tbody>
|
|
607
|
+
<tr><td>node</td><td></td><td></td><td>package.json</td><td>npm</td><td></td></tr><tr><td>github-actions</td><td></td><td></td><td>.github/workflows/release.yml</td><td></td><td></td></tr>
|
|
608
|
+
</tbody>
|
|
609
|
+
</table>
|
|
610
|
+
</div>
|
|
611
|
+
</section>
|
|
612
|
+
<section>
|
|
613
|
+
<h2>Review Context</h2>
|
|
614
|
+
<div class="detail-list">
|
|
615
|
+
<div class="detail-item">
|
|
616
|
+
<div class="detail-label">Policy</div>
|
|
617
|
+
<div class="detail-value">.patchdrill.yml (4 rules)</div>
|
|
618
|
+
</div><div class="detail-item">
|
|
619
|
+
<div class="detail-label">Policy commands</div>
|
|
620
|
+
<div class="detail-value">1 required, 1 optional</div>
|
|
621
|
+
</div><div class="detail-item">
|
|
622
|
+
<div class="detail-label">Fail-on</div>
|
|
623
|
+
<div class="detail-value">high</div>
|
|
624
|
+
</div><div class="detail-item">
|
|
625
|
+
<div class="detail-label">Max risk</div>
|
|
626
|
+
<div class="detail-value">69</div>
|
|
627
|
+
</div><div class="detail-item">
|
|
628
|
+
<div class="detail-label">Code owners</div>
|
|
629
|
+
<div class="detail-value">.github/CODEOWNERS (4 rules)</div>
|
|
630
|
+
</div><div class="detail-item">
|
|
631
|
+
<div class="detail-label">Baseline</div>
|
|
632
|
+
<div class="detail-value">main-patchdrill-report.json</div>
|
|
633
|
+
</div><div class="detail-item">
|
|
634
|
+
<div class="detail-label">Risk delta</div>
|
|
635
|
+
<div class="detail-value">+63</div>
|
|
636
|
+
</div><div class="detail-item">
|
|
637
|
+
<div class="detail-label">Findings delta</div>
|
|
638
|
+
<div class="detail-value">6 new, 0 resolved, 1 unchanged</div>
|
|
639
|
+
</div><div class="detail-item">
|
|
640
|
+
<div class="detail-label">Affected packages</div>
|
|
641
|
+
<div class="detail-value">@acme/web</div>
|
|
642
|
+
</div>
|
|
643
|
+
</div>
|
|
644
|
+
</section>
|
|
645
|
+
</div>
|
|
646
|
+
|
|
647
|
+
<section>
|
|
648
|
+
<h2>Dependency Changes</h2>
|
|
649
|
+
<div class="table-wrap">
|
|
650
|
+
<table>
|
|
651
|
+
<thead>
|
|
652
|
+
<tr><th>File</th><th>Type</th><th>Package</th><th>Path</th><th>Change</th><th>Before</th><th>After</th></tr>
|
|
653
|
+
</thead>
|
|
654
|
+
<tbody>
|
|
655
|
+
<tr><td>package-lock.json</td><td>lockfile</td><td>yaml</td><td>node_modules/yaml</td><td>updated</td><td>2.8.1</td><td>2.9.0</td></tr><tr><td>package-lock.json</td><td>lockfile</td><td>@acme/payments</td><td>node_modules/@acme/payments</td><td>updated</td><td>4.2.0</td><td>4.3.0</td></tr>
|
|
656
|
+
</tbody>
|
|
657
|
+
</table>
|
|
658
|
+
</div>
|
|
659
|
+
</section>
|
|
660
|
+
|
|
661
|
+
<section>
|
|
662
|
+
<h2>Package Script Changes</h2>
|
|
663
|
+
<div class="table-wrap">
|
|
664
|
+
<table>
|
|
665
|
+
<thead>
|
|
666
|
+
<tr><th>File</th><th>Script</th><th>Change</th><th>Before</th><th>After</th></tr>
|
|
667
|
+
</thead>
|
|
668
|
+
<tbody>
|
|
669
|
+
<tr><td>package.json</td><td><code>postinstall</code></td><td>added</td><td><code></code></td><td><code>node scripts/bootstrap-agent.js</code></td></tr><tr><td>package.json</td><td><code>test</code></td><td>updated</td><td><code>vitest run</code></td><td><code>true</code></td></tr>
|
|
670
|
+
</tbody>
|
|
671
|
+
</table>
|
|
672
|
+
</div>
|
|
673
|
+
</section>
|
|
674
|
+
|
|
675
|
+
<section>
|
|
676
|
+
<h2>Reviewer Notes</h2>
|
|
677
|
+
<p class="muted">Treat this dashboard as triage evidence, not a replacement for review. High-impact areas still need human sign-off even when automated commands pass.</p>
|
|
678
|
+
</section>
|
|
679
|
+
</main>
|
|
680
|
+
</body>
|
|
681
|
+
</html>
|