engineering-process 0.1.0__py3-none-any.whl

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 (69) hide show
  1. engineering_process/__init__.py +3 -0
  2. engineering_process/_download_worker.py +73 -0
  3. engineering_process/_supervisor_posix.py +162 -0
  4. engineering_process/_supervisor_windows.py +148 -0
  5. engineering_process/_windows_job.py +419 -0
  6. engineering_process/bootstrap.py +217 -0
  7. engineering_process/bundles.py +81 -0
  8. engineering_process/cli.py +1012 -0
  9. engineering_process/contracts.py +1274 -0
  10. engineering_process/distribution.py +90 -0
  11. engineering_process/environment.py +753 -0
  12. engineering_process/helper_launch.py +37 -0
  13. engineering_process/lifecycle.py +1024 -0
  14. engineering_process/managed.py +89 -0
  15. engineering_process/markdown.py +78 -0
  16. engineering_process/publication.py +463 -0
  17. engineering_process/requirements-build.txt +1 -0
  18. engineering_process/requirements-dev.txt +10 -0
  19. engineering_process/requirements-runtime.txt +3 -0
  20. engineering_process/runner.py +191 -0
  21. engineering_process/runtime.py +55 -0
  22. engineering_process/skills.py +118 -0
  23. engineering_process/supervision.py +72 -0
  24. engineering_process/syncing.py +398 -0
  25. engineering_process/tooling.py +891 -0
  26. engineering_process-0.1.0.data/data/share/engineering-process/bundles.json +47 -0
  27. engineering_process-0.1.0.data/data/share/engineering-process/examples/change.json +26 -0
  28. engineering_process-0.1.0.data/data/share/engineering-process/examples/plan.json +28 -0
  29. engineering_process-0.1.0.data/data/share/engineering-process/examples/project.json +54 -0
  30. engineering_process-0.1.0.data/data/share/engineering-process/examples/review.json +31 -0
  31. engineering_process-0.1.0.data/data/share/engineering-process/schemas/change.schema.json +88 -0
  32. engineering_process-0.1.0.data/data/share/engineering-process/schemas/lifecycle.schema.json +122 -0
  33. engineering_process-0.1.0.data/data/share/engineering-process/schemas/plan.schema.json +105 -0
  34. engineering_process-0.1.0.data/data/share/engineering-process/schemas/process-lock.schema.json +39 -0
  35. engineering_process-0.1.0.data/data/share/engineering-process/schemas/project.schema.json +515 -0
  36. engineering_process-0.1.0.data/data/share/engineering-process/schemas/review.schema.json +140 -0
  37. engineering_process-0.1.0.data/data/share/engineering-process/schemas/reviewer-attestation.schema.json +30 -0
  38. engineering_process-0.1.0.data/data/share/engineering-process/schemas/verification.schema.json +120 -0
  39. engineering_process-0.1.0.data/data/share/engineering-process/skills/assess-design/SKILL.md +39 -0
  40. engineering_process-0.1.0.data/data/share/engineering-process/skills/build-frontend/SKILL.md +38 -0
  41. engineering_process-0.1.0.data/data/share/engineering-process/skills/build-frontend-foundation/SKILL.md +36 -0
  42. engineering_process-0.1.0.data/data/share/engineering-process/skills/change-api/SKILL.md +36 -0
  43. engineering_process-0.1.0.data/data/share/engineering-process/skills/cross-repo-change/SKILL.md +37 -0
  44. engineering_process-0.1.0.data/data/share/engineering-process/skills/define-change-contract/SKILL.md +40 -0
  45. engineering_process-0.1.0.data/data/share/engineering-process/skills/design-module/SKILL.md +37 -0
  46. engineering_process-0.1.0.data/data/share/engineering-process/skills/evolve-process/SKILL.md +37 -0
  47. engineering_process-0.1.0.data/data/share/engineering-process/skills/finish-change/SKILL.md +34 -0
  48. engineering_process-0.1.0.data/data/share/engineering-process/skills/govern-ui/SKILL.md +40 -0
  49. engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-change/SKILL.md +41 -0
  50. engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-module/SKILL.md +36 -0
  51. engineering_process-0.1.0.data/data/share/engineering-process/skills/implement-use-case/SKILL.md +36 -0
  52. engineering_process-0.1.0.data/data/share/engineering-process/skills/integrate-mcp/SKILL.md +37 -0
  53. engineering_process-0.1.0.data/data/share/engineering-process/skills/maintain-docs/SKILL.md +35 -0
  54. engineering_process-0.1.0.data/data/share/engineering-process/skills/plan-change/SKILL.md +37 -0
  55. engineering_process-0.1.0.data/data/share/engineering-process/skills/publish-change/SKILL.md +38 -0
  56. engineering_process-0.1.0.data/data/share/engineering-process/skills/review-change/SKILL.md +49 -0
  57. engineering_process-0.1.0.data/data/share/engineering-process/skills/run-change/SKILL.md +51 -0
  58. engineering_process-0.1.0.data/data/share/engineering-process/skills/run-change/references/execution.md +88 -0
  59. engineering_process-0.1.0.data/data/share/engineering-process/skills/run-project-command/SKILL.md +55 -0
  60. engineering_process-0.1.0.data/data/share/engineering-process/skills/specify-use-case/SKILL.md +37 -0
  61. engineering_process-0.1.0.data/data/share/engineering-process/skills/verify-change/SKILL.md +38 -0
  62. engineering_process-0.1.0.data/data/share/engineering-process/templates/AGENTS.process.md +17 -0
  63. engineering_process-0.1.0.data/data/share/engineering-process/templates/PULL_REQUEST_TEMPLATE.md +27 -0
  64. engineering_process-0.1.0.dist-info/METADATA +387 -0
  65. engineering_process-0.1.0.dist-info/RECORD +69 -0
  66. engineering_process-0.1.0.dist-info/WHEEL +5 -0
  67. engineering_process-0.1.0.dist-info/entry_points.txt +2 -0
  68. engineering_process-0.1.0.dist-info/licenses/LICENSE +21 -0
  69. engineering_process-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,515 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://engineering-process.invalid/schemas/project.schema.json",
4
+ "title": "Engineering process project manifest",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "project", "lifecycle", "profiles"],
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string"
11
+ },
12
+ "schemaVersion": {
13
+ "enum": [1, 2, 3]
14
+ },
15
+ "project": {
16
+ "type": "string",
17
+ "maxLength": 128,
18
+ "pattern": "^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$"
19
+ },
20
+ "lifecycle": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["requiredProfiles"],
24
+ "properties": {
25
+ "requiredProfiles": {
26
+ "type": "array",
27
+ "minItems": 1,
28
+ "uniqueItems": true,
29
+ "items": {
30
+ "type": "string",
31
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
32
+ }
33
+ }
34
+ }
35
+ },
36
+ "profiles": {
37
+ "type": "object",
38
+ "minProperties": 1,
39
+ "propertyNames": {
40
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
41
+ },
42
+ "additionalProperties": {
43
+ "type": "array",
44
+ "minItems": 1,
45
+ "items": {
46
+ "$ref": "#/$defs/check"
47
+ }
48
+ }
49
+ },
50
+ "environment": {
51
+ "$ref": "#/$defs/environment"
52
+ }
53
+ },
54
+ "allOf": [
55
+ {
56
+ "if": {"properties": {"schemaVersion": {"const": 1}}, "required": ["schemaVersion"]},
57
+ "then": {"not": {"required": ["environment"]}}
58
+ },
59
+ {
60
+ "if": {"properties": {"schemaVersion": {"const": 2}}, "required": ["schemaVersion"]},
61
+ "then": {
62
+ "required": ["environment"],
63
+ "properties": {
64
+ "environment": {
65
+ "not": {"required": ["foregroundOnly"]},
66
+ "properties": {
67
+ "managedTools": {
68
+ "items": {
69
+ "properties": {
70
+ "artifacts": {
71
+ "items": {
72
+ "properties": {
73
+ "commands": {
74
+ "additionalProperties": {"type": "string"}
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ },
87
+ {
88
+ "if": {"properties": {"schemaVersion": {"const": 3}}, "required": ["schemaVersion"]},
89
+ "then": {
90
+ "required": ["environment"],
91
+ "properties": {
92
+ "environment": {
93
+ "required": ["foregroundOnly"],
94
+ "properties": {
95
+ "managedTools": {
96
+ "items": {
97
+ "properties": {
98
+ "artifacts": {
99
+ "items": {
100
+ "allOf": [
101
+ {
102
+ "properties": {
103
+ "commands": {
104
+ "additionalProperties": {
105
+ "oneOf": [
106
+ {
107
+ "type": "string",
108
+ "pattern": "^(?!/)(?!.*\\\\)(?!.*:)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*\\/$).+$"
109
+ },
110
+ {
111
+ "type": "object",
112
+ "properties": {
113
+ "executable": {
114
+ "pattern": "^(?!/)(?!.*\\\\)(?!.*:)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*\\/$).+$"
115
+ },
116
+ "script": {
117
+ "pattern": "^(?!/)(?!.*\\\\)(?!.*:)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*//)(?!.*\\/$).+$"
118
+ }
119
+ }
120
+ }
121
+ ]
122
+ }
123
+ }
124
+ }
125
+ },
126
+ {
127
+ "if": {
128
+ "properties": {"platform": {"pattern": "^windows-"}},
129
+ "required": ["platform"]
130
+ },
131
+ "then": {
132
+ "properties": {
133
+ "commands": {
134
+ "additionalProperties": {
135
+ "oneOf": [
136
+ {"type": "string", "pattern": "\\.[eE][xX][eE]$"},
137
+ {
138
+ "type": "object",
139
+ "properties": {
140
+ "executable": {"pattern": "\\.[eE][xX][eE]$"}
141
+ }
142
+ }
143
+ ]
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ ],
161
+ "$defs": {
162
+ "check": {
163
+ "type": "object",
164
+ "additionalProperties": false,
165
+ "required": ["id", "run", "timeoutSeconds"],
166
+ "properties": {
167
+ "id": {
168
+ "type": "string",
169
+ "maxLength": 64,
170
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
171
+ },
172
+ "run": {
173
+ "type": "array",
174
+ "minItems": 1,
175
+ "items": {
176
+ "type": "string",
177
+ "minLength": 1
178
+ }
179
+ },
180
+ "timeoutSeconds": {
181
+ "type": "integer",
182
+ "minimum": 1,
183
+ "maximum": 86400
184
+ },
185
+ "workingDirectory": {
186
+ "type": "string",
187
+ "minLength": 1,
188
+ "maxLength": 512
189
+ }
190
+ }
191
+ },
192
+ "environment": {
193
+ "type": "object",
194
+ "additionalProperties": false,
195
+ "required": ["defaultProfile", "profiles", "requirements", "managedTools", "setupActions"],
196
+ "properties": {
197
+ "defaultProfile": {
198
+ "type": "string",
199
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
200
+ },
201
+ "foregroundOnly": {
202
+ "const": true
203
+ },
204
+ "profiles": {
205
+ "type": "object",
206
+ "minProperties": 1,
207
+ "propertyNames": {
208
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
209
+ },
210
+ "additionalProperties": {
211
+ "type": "array",
212
+ "minItems": 1,
213
+ "uniqueItems": true,
214
+ "items": {
215
+ "type": "string",
216
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
217
+ }
218
+ }
219
+ },
220
+ "requirements": {
221
+ "type": "array",
222
+ "minItems": 1,
223
+ "maxItems": 128,
224
+ "items": {
225
+ "$ref": "#/$defs/environmentRequirement"
226
+ }
227
+ },
228
+ "managedTools": {
229
+ "type": "array",
230
+ "maxItems": 64,
231
+ "items": {
232
+ "$ref": "#/$defs/managedTool"
233
+ }
234
+ },
235
+ "setupActions": {
236
+ "type": "array",
237
+ "maxItems": 128,
238
+ "items": {
239
+ "$ref": "#/$defs/setupAction"
240
+ }
241
+ }
242
+ }
243
+ },
244
+ "managedTool": {
245
+ "type": "object",
246
+ "additionalProperties": false,
247
+ "required": ["id", "version", "artifacts"],
248
+ "properties": {
249
+ "id": {
250
+ "type": "string",
251
+ "maxLength": 64,
252
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
253
+ },
254
+ "version": {
255
+ "type": "string",
256
+ "maxLength": 128,
257
+ "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z._+-]*[0-9A-Za-z])?$"
258
+ },
259
+ "artifacts": {
260
+ "type": "array",
261
+ "minItems": 1,
262
+ "maxItems": 16,
263
+ "items": {
264
+ "$ref": "#/$defs/managedToolArtifact"
265
+ }
266
+ }
267
+ }
268
+ },
269
+ "managedToolArtifact": {
270
+ "type": "object",
271
+ "additionalProperties": false,
272
+ "required": [
273
+ "platform",
274
+ "url",
275
+ "checksum",
276
+ "archiveFormat",
277
+ "stripComponents",
278
+ "maxDownloadBytes",
279
+ "maxExtractedBytes",
280
+ "maxFiles",
281
+ "commands"
282
+ ],
283
+ "properties": {
284
+ "platform": {
285
+ "type": "string",
286
+ "pattern": "^(?:linux-(?:glibc|musl)-(?:x64|arm64)|macos-(?:x64|arm64)|windows-(?:x64|arm64))$"
287
+ },
288
+ "url": {
289
+ "type": "string",
290
+ "maxLength": 2048,
291
+ "pattern": "^https://"
292
+ },
293
+ "checksum": {
294
+ "type": "string",
295
+ "pattern": "^(?:sha256:[0-9a-f]{64}|sha512:[0-9a-f]{128})$"
296
+ },
297
+ "archiveFormat": {
298
+ "enum": ["file", "tar.gz", "zip"]
299
+ },
300
+ "stripComponents": {
301
+ "type": "integer",
302
+ "minimum": 0,
303
+ "maximum": 1
304
+ },
305
+ "maxDownloadBytes": {
306
+ "type": "integer",
307
+ "minimum": 1,
308
+ "maximum": 4294967296
309
+ },
310
+ "maxExtractedBytes": {
311
+ "type": "integer",
312
+ "minimum": 1,
313
+ "maximum": 8589934592
314
+ },
315
+ "maxFiles": {
316
+ "type": "integer",
317
+ "minimum": 1,
318
+ "maximum": 1000000
319
+ },
320
+ "commands": {
321
+ "type": "object",
322
+ "minProperties": 1,
323
+ "propertyNames": {
324
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._+-]*$"
325
+ },
326
+ "additionalProperties": {
327
+ "oneOf": [
328
+ {
329
+ "type": "string",
330
+ "minLength": 1,
331
+ "maxLength": 512
332
+ },
333
+ {
334
+ "type": "object",
335
+ "additionalProperties": false,
336
+ "required": ["executable", "script"],
337
+ "properties": {
338
+ "executable": {
339
+ "type": "string",
340
+ "minLength": 1,
341
+ "maxLength": 512
342
+ },
343
+ "script": {
344
+ "type": "string",
345
+ "minLength": 1,
346
+ "maxLength": 512
347
+ }
348
+ }
349
+ }
350
+ ]
351
+ }
352
+ }
353
+ }
354
+ },
355
+ "environmentRequirement": {
356
+ "type": "object",
357
+ "additionalProperties": false,
358
+ "required": ["id", "description", "probe", "remediation"],
359
+ "properties": {
360
+ "id": {
361
+ "type": "string",
362
+ "maxLength": 64,
363
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
364
+ },
365
+ "description": {
366
+ "type": "string",
367
+ "minLength": 1,
368
+ "maxLength": 512
369
+ },
370
+ "probe": {
371
+ "$ref": "#/$defs/environmentCommand"
372
+ },
373
+ "remediation": {
374
+ "type": "string",
375
+ "minLength": 1,
376
+ "maxLength": 1024
377
+ },
378
+ "setupAction": {
379
+ "type": "string",
380
+ "maxLength": 64,
381
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
382
+ }
383
+ }
384
+ },
385
+ "environmentCommand": {
386
+ "type": "object",
387
+ "additionalProperties": false,
388
+ "required": ["run", "timeoutSeconds", "readOnly"],
389
+ "properties": {
390
+ "run": {
391
+ "type": "array",
392
+ "minItems": 1,
393
+ "items": {
394
+ "type": "string",
395
+ "minLength": 1
396
+ }
397
+ },
398
+ "timeoutSeconds": {
399
+ "type": "integer",
400
+ "minimum": 1,
401
+ "maximum": 86400
402
+ },
403
+ "readOnly": {
404
+ "const": true
405
+ },
406
+ "workingDirectory": {
407
+ "type": "string",
408
+ "minLength": 1,
409
+ "maxLength": 512
410
+ },
411
+ "outputStream": {
412
+ "enum": ["combined", "stderr", "stdout"]
413
+ },
414
+ "outputRegex": {
415
+ "type": "string",
416
+ "minLength": 1,
417
+ "maxLength": 1024
418
+ }
419
+ }
420
+ },
421
+ "setupAction": {
422
+ "oneOf": [
423
+ {"$ref": "#/$defs/commandSetupAction"},
424
+ {"$ref": "#/$defs/managedToolSetupAction"}
425
+ ]
426
+ },
427
+ "commandSetupAction": {
428
+ "type": "object",
429
+ "additionalProperties": false,
430
+ "required": ["id", "kind", "run", "timeoutSeconds", "mutations"],
431
+ "properties": {
432
+ "id": {
433
+ "type": "string",
434
+ "maxLength": 64,
435
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
436
+ },
437
+ "kind": {
438
+ "const": "command"
439
+ },
440
+ "run": {
441
+ "type": "array",
442
+ "minItems": 1,
443
+ "items": {
444
+ "type": "string",
445
+ "minLength": 1
446
+ }
447
+ },
448
+ "timeoutSeconds": {
449
+ "type": "integer",
450
+ "minimum": 1,
451
+ "maximum": 86400
452
+ },
453
+ "workingDirectory": {
454
+ "type": "string",
455
+ "minLength": 1,
456
+ "maxLength": 512
457
+ },
458
+ "mutations": {
459
+ "type": "array",
460
+ "minItems": 1,
461
+ "uniqueItems": true,
462
+ "items": {
463
+ "enum": [
464
+ "host-configuration",
465
+ "network",
466
+ "project-files",
467
+ "user-files"
468
+ ]
469
+ }
470
+ },
471
+ "requires": {
472
+ "type": "array",
473
+ "uniqueItems": true,
474
+ "items": {
475
+ "type": "string",
476
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
477
+ }
478
+ }
479
+ }
480
+ },
481
+ "managedToolSetupAction": {
482
+ "type": "object",
483
+ "additionalProperties": false,
484
+ "required": ["id", "kind", "tool", "timeoutSeconds"],
485
+ "properties": {
486
+ "id": {
487
+ "type": "string",
488
+ "maxLength": 64,
489
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
490
+ },
491
+ "kind": {
492
+ "const": "managed-tool"
493
+ },
494
+ "tool": {
495
+ "type": "string",
496
+ "maxLength": 64,
497
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
498
+ },
499
+ "timeoutSeconds": {
500
+ "type": "integer",
501
+ "minimum": 1,
502
+ "maximum": 86400
503
+ },
504
+ "requires": {
505
+ "type": "array",
506
+ "uniqueItems": true,
507
+ "items": {
508
+ "type": "string",
509
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
510
+ }
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://engineering-process.invalid/schemas/review.schema.json",
4
+ "title": "Independent engineering review report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "changeId",
10
+ "cycle",
11
+ "checkpoint",
12
+ "workspaceFingerprint",
13
+ "comparisonBase",
14
+ "reviewer",
15
+ "independence",
16
+ "verdict",
17
+ "findings"
18
+ ],
19
+ "properties": {
20
+ "$schema": {"type": "string"},
21
+ "schemaVersion": {"const": 2},
22
+ "changeId": {
23
+ "type": "string",
24
+ "maxLength": 64,
25
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
26
+ },
27
+ "cycle": {"type": "integer", "minimum": 1},
28
+ "checkpoint": {"type": "string", "minLength": 1, "maxLength": 256},
29
+ "workspaceFingerprint": {
30
+ "type": "string",
31
+ "pattern": "^sha256:[0-9a-f]{64}$"
32
+ },
33
+ "comparisonBase": {"type": "string", "minLength": 1, "maxLength": 256},
34
+ "reviewer": {"$ref": "#/$defs/actor"},
35
+ "independence": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["method", "attestedBy", "evidence"],
39
+ "properties": {
40
+ "method": {"enum": ["isolated-context", "separate-person"]},
41
+ "attestedBy": {"type": "string", "minLength": 1, "maxLength": 256},
42
+ "evidence": {"type": "string", "minLength": 1, "maxLength": 2000}
43
+ }
44
+ },
45
+ "verdict": {"enum": ["approved", "changes-requested"]},
46
+ "findings": {
47
+ "type": "array",
48
+ "items": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": [
52
+ "id",
53
+ "severity",
54
+ "path",
55
+ "line",
56
+ "summary",
57
+ "evidence",
58
+ "status",
59
+ "resolutionEvidence"
60
+ ],
61
+ "properties": {
62
+ "id": {
63
+ "type": "string",
64
+ "maxLength": 64,
65
+ "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
66
+ },
67
+ "severity": {"enum": ["critical", "high", "medium", "low"]},
68
+ "path": {"type": "string", "minLength": 1, "maxLength": 1000},
69
+ "line": {"type": ["integer", "null"], "minimum": 1},
70
+ "summary": {"type": "string", "minLength": 1, "maxLength": 1000},
71
+ "evidence": {"type": "string", "minLength": 1, "maxLength": 4000},
72
+ "status": {"enum": ["open", "resolved", "deferred", "false-positive"]},
73
+ "resolutionEvidence": {"type": ["string", "null"], "maxLength": 4000}
74
+ },
75
+ "allOf": [
76
+ {
77
+ "if": {"properties": {"status": {"const": "open"}}},
78
+ "then": {"properties": {"resolutionEvidence": {"type": "null"}}}
79
+ },
80
+ {
81
+ "if": {
82
+ "properties": {
83
+ "status": {"enum": ["resolved", "deferred", "false-positive"]}
84
+ }
85
+ },
86
+ "then": {
87
+ "properties": {
88
+ "resolutionEvidence": {"type": "string", "minLength": 1}
89
+ }
90
+ }
91
+ }
92
+ ]
93
+ }
94
+ }
95
+ },
96
+ "allOf": [
97
+ {
98
+ "if": {"properties": {"verdict": {"const": "approved"}}},
99
+ "then": {
100
+ "properties": {
101
+ "findings": {
102
+ "items": {
103
+ "properties": {
104
+ "status": {"enum": ["resolved", "false-positive"]}
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ },
111
+ {
112
+ "if": {"properties": {"verdict": {"const": "changes-requested"}}},
113
+ "then": {
114
+ "properties": {
115
+ "findings": {
116
+ "contains": {
117
+ "properties": {
118
+ "status": {"enum": ["open", "deferred"]}
119
+ },
120
+ "required": ["status"]
121
+ },
122
+ "minContains": 1
123
+ }
124
+ }
125
+ }
126
+ }
127
+ ],
128
+ "$defs": {
129
+ "actor": {
130
+ "type": "object",
131
+ "additionalProperties": false,
132
+ "required": ["actorId", "contextId", "kind"],
133
+ "properties": {
134
+ "actorId": {"type": "string", "minLength": 1, "maxLength": 256},
135
+ "contextId": {"type": "string", "minLength": 1, "maxLength": 256},
136
+ "kind": {"enum": ["agent", "human"]}
137
+ }
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://engineering-process.invalid/schemas/reviewer-attestation.schema.json",
4
+ "title": "Agent-neutral independent reviewer attestation",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["reviewer", "independence"],
8
+ "properties": {
9
+ "reviewer": {
10
+ "type": "object",
11
+ "additionalProperties": false,
12
+ "required": ["actorId", "contextId", "kind"],
13
+ "properties": {
14
+ "actorId": {"type": "string", "minLength": 1, "maxLength": 256},
15
+ "contextId": {"type": "string", "minLength": 1, "maxLength": 256},
16
+ "kind": {"enum": ["agent", "human"]}
17
+ }
18
+ },
19
+ "independence": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["method", "attestedBy", "evidence"],
23
+ "properties": {
24
+ "method": {"enum": ["isolated-context", "separate-person"]},
25
+ "attestedBy": {"type": "string", "minLength": 1, "maxLength": 256},
26
+ "evidence": {"type": "string", "minLength": 1, "maxLength": 2000}
27
+ }
28
+ }
29
+ }
30
+ }