open-research-protocol 0.3.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 (94) hide show
  1. package/AGENT_INTEGRATION.md +94 -0
  2. package/INSTALL.md +159 -0
  3. package/LICENSE +22 -0
  4. package/PROTOCOL.md +140 -0
  5. package/README.md +312 -0
  6. package/bin/orp.js +38 -0
  7. package/cli/orp.py +3595 -0
  8. package/cone/CONTEXT_LOG.md +33 -0
  9. package/docs/AGENT_LOOP.md +63 -0
  10. package/docs/CHOOSING_OR_IGNORING_INSTRUMENTS.md +128 -0
  11. package/docs/CODA_ORP_CONTRACT.md +222 -0
  12. package/docs/CORE_ABILITY_REFOCUS_CHECKLIST.md +62 -0
  13. package/docs/DISCOVER.md +69 -0
  14. package/docs/EXTERNAL_CONTRIBUTION_GOVERNANCE.md +275 -0
  15. package/docs/MATHLIB_COLLABORATION_FLOW_PROMPT.md +112 -0
  16. package/docs/NPM_RELEASE_CHECKLIST.md +55 -0
  17. package/docs/ORP_V1_ATOMIC_DISCOVERY_EVOLUTION.md +186 -0
  18. package/docs/OSS_CONTRIBUTION_AGENT_LOOP.md +69 -0
  19. package/docs/PRESENTATION_BOW.md +100 -0
  20. package/docs/PROFILE_PACKS.md +227 -0
  21. package/docs/SUNFLOWER_CODA_PR_GOVERNANCE_MAPPING.md +77 -0
  22. package/docs/WHY_INSTRUMENTS.md +118 -0
  23. package/examples/README.md +21 -0
  24. package/examples/example_claim.md +33 -0
  25. package/examples/example_failed.md +24 -0
  26. package/examples/example_verification.md +36 -0
  27. package/examples/orp.erdos-problems.catalog.yml +88 -0
  28. package/examples/orp.external-pr-governance.yml +223 -0
  29. package/examples/orp.sunflower-coda.atomic.yml +144 -0
  30. package/examples/orp.sunflower-coda.live-compare.yml +181 -0
  31. package/examples/orp.sunflower-coda.pr-governance.yml +253 -0
  32. package/examples/packet.problem_scope.example.json +123 -0
  33. package/examples/reports/README.md +16 -0
  34. package/examples/reports/sunflower_live_compare_20.RUN_SUMMARY.md +37 -0
  35. package/examples/reports/sunflower_live_compare_367.RUN_SUMMARY.md +37 -0
  36. package/examples/reports/sunflower_live_compare_857.RUN_SUMMARY.md +37 -0
  37. package/llms.txt +58 -0
  38. package/modules/instruments/ADVERSARIAL/README.md +109 -0
  39. package/modules/instruments/ADVERSARIAL/TEMPLATE.md +27 -0
  40. package/modules/instruments/COMPRESSION/README.md +112 -0
  41. package/modules/instruments/COMPRESSION/TEMPLATE.md +27 -0
  42. package/modules/instruments/INSTRUMENT_TEMPLATE.md +30 -0
  43. package/modules/instruments/ORBIT/README.md +124 -0
  44. package/modules/instruments/ORBIT/TEMPLATE.md +28 -0
  45. package/modules/instruments/README.md +179 -0
  46. package/package.json +54 -0
  47. package/packs/README.md +16 -0
  48. package/packs/erdos-open-problems/README.md +287 -0
  49. package/packs/erdos-open-problems/data/README.md +43 -0
  50. package/packs/erdos-open-problems/data/erdos_open_problems.md +697 -0
  51. package/packs/erdos-open-problems/data/erdos_problems.active.json +15561 -0
  52. package/packs/erdos-open-problems/data/erdos_problems.all.json +26289 -0
  53. package/packs/erdos-open-problems/data/erdos_problems.closed.json +10760 -0
  54. package/packs/erdos-open-problems/data/erdos_problems.open.json +15561 -0
  55. package/packs/erdos-open-problems/docs/SUNFLOWER_ADAPTER_DEPENDENCIES.md +63 -0
  56. package/packs/erdos-open-problems/pack.yml +131 -0
  57. package/packs/erdos-open-problems/profiles/erdos-problems-catalog-sync.yml.tmpl +99 -0
  58. package/packs/erdos-open-problems/profiles/sunflower-live-compare.yml.tmpl +188 -0
  59. package/packs/erdos-open-problems/profiles/sunflower-mathlib-pr-governance.yml.tmpl +253 -0
  60. package/packs/erdos-open-problems/profiles/sunflower-problem857-discovery-public-repo.yml.tmpl +152 -0
  61. package/packs/erdos-open-problems/profiles/sunflower-problem857-discovery.yml.tmpl +154 -0
  62. package/packs/external-pr-governance/README.md +116 -0
  63. package/packs/external-pr-governance/adapters/formal-conjectures/README.md +35 -0
  64. package/packs/external-pr-governance/adapters/mathlib/README.md +37 -0
  65. package/packs/external-pr-governance/pack.yml +146 -0
  66. package/packs/external-pr-governance/profiles/oss-feedback-hardening.yml.tmpl +92 -0
  67. package/packs/external-pr-governance/profiles/oss-pr-governance.yml.tmpl +233 -0
  68. package/packs/issue-smashers/README.md +92 -0
  69. package/packs/issue-smashers/adapters/formal-conjectures/README.md +17 -0
  70. package/packs/issue-smashers/adapters/generic-github/README.md +16 -0
  71. package/packs/issue-smashers/adapters/mathlib/README.md +32 -0
  72. package/packs/issue-smashers/bootstrap/README.md +19 -0
  73. package/packs/issue-smashers/bootstrap/setup-issue-smashers.sh +18 -0
  74. package/packs/issue-smashers/examples/issue-smashers.workspace.yml +24 -0
  75. package/packs/issue-smashers/pack.yml +178 -0
  76. package/packs/issue-smashers/profiles/issue-smashers-feedback-hardening.yml.tmpl +102 -0
  77. package/packs/issue-smashers/profiles/issue-smashers.yml.tmpl +258 -0
  78. package/scripts/npm-postinstall-check.js +31 -0
  79. package/scripts/orp +11 -0
  80. package/scripts/orp-agent-integrate.sh +197 -0
  81. package/scripts/orp-checkpoint.sh +184 -0
  82. package/scripts/orp-erdos-problems-sync.py +580 -0
  83. package/scripts/orp-init.sh +50 -0
  84. package/scripts/orp-pack-fetch.py +155 -0
  85. package/scripts/orp-pack-install.py +2273 -0
  86. package/scripts/orp-pack-render.py +188 -0
  87. package/spec/v1/LIFECYCLE_MAPPING.md +40 -0
  88. package/spec/v1/orp.config.schema.json +385 -0
  89. package/spec/v1/packet.schema.json +552 -0
  90. package/spec/v1/profile-pack.schema.json +95 -0
  91. package/templates/CLAIM.md +33 -0
  92. package/templates/FAILED_TOPIC.md +19 -0
  93. package/templates/ISSUE_TEMPLATE.md +22 -0
  94. package/templates/VERIFICATION_RECORD.md +34 -0
@@ -0,0 +1,552 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://orp.dev/spec/v1/packet.schema.json",
4
+ "title": "ORP Packet v1",
5
+ "description": "Machine-readable ORP packet for collaboration and discovery workflows.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "packet_id",
11
+ "kind",
12
+ "created_at_utc",
13
+ "protocol_boundary",
14
+ "repo",
15
+ "run",
16
+ "lifecycle",
17
+ "gates",
18
+ "summary",
19
+ "artifacts"
20
+ ],
21
+ "properties": {
22
+ "schema_version": {
23
+ "type": "string",
24
+ "const": "1.0.0"
25
+ },
26
+ "packet_id": {
27
+ "type": "string",
28
+ "pattern": "^[A-Za-z0-9._:-]+$"
29
+ },
30
+ "kind": {
31
+ "type": "string",
32
+ "enum": [
33
+ "pr",
34
+ "claim",
35
+ "verification",
36
+ "problem_scope",
37
+ "atom_pass"
38
+ ]
39
+ },
40
+ "created_at_utc": {
41
+ "type": "string",
42
+ "format": "date-time"
43
+ },
44
+ "protocol_boundary": {
45
+ "$ref": "#/$defs/protocol_boundary"
46
+ },
47
+ "repo": {
48
+ "$ref": "#/$defs/repo"
49
+ },
50
+ "run": {
51
+ "$ref": "#/$defs/run"
52
+ },
53
+ "lifecycle": {
54
+ "$ref": "#/$defs/lifecycle"
55
+ },
56
+ "claim_context": {
57
+ "$ref": "#/$defs/claim_context"
58
+ },
59
+ "atomic_context": {
60
+ "$ref": "#/$defs/atomic_context"
61
+ },
62
+ "gates": {
63
+ "type": "array",
64
+ "items": {
65
+ "$ref": "#/$defs/gate_result"
66
+ }
67
+ },
68
+ "summary": {
69
+ "$ref": "#/$defs/summary"
70
+ },
71
+ "evidence_status": {
72
+ "$ref": "#/$defs/evidence_status"
73
+ },
74
+ "artifacts": {
75
+ "$ref": "#/$defs/artifacts"
76
+ }
77
+ },
78
+ "allOf": [
79
+ {
80
+ "if": {
81
+ "properties": {
82
+ "kind": {
83
+ "enum": [
84
+ "pr",
85
+ "claim",
86
+ "verification"
87
+ ]
88
+ }
89
+ }
90
+ },
91
+ "then": {
92
+ "required": [
93
+ "claim_context"
94
+ ]
95
+ }
96
+ },
97
+ {
98
+ "if": {
99
+ "properties": {
100
+ "kind": {
101
+ "enum": [
102
+ "problem_scope",
103
+ "atom_pass"
104
+ ]
105
+ }
106
+ }
107
+ },
108
+ "then": {
109
+ "required": [
110
+ "atomic_context"
111
+ ]
112
+ }
113
+ }
114
+ ],
115
+ "$defs": {
116
+ "protocol_boundary": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "required": [
120
+ "process_only",
121
+ "evidence_paths"
122
+ ],
123
+ "properties": {
124
+ "process_only": {
125
+ "type": "boolean",
126
+ "const": true
127
+ },
128
+ "evidence_paths": {
129
+ "type": "array",
130
+ "items": {
131
+ "type": "string"
132
+ }
133
+ },
134
+ "note": {
135
+ "type": "string"
136
+ }
137
+ }
138
+ },
139
+ "repo": {
140
+ "type": "object",
141
+ "additionalProperties": false,
142
+ "required": [
143
+ "root_path"
144
+ ],
145
+ "properties": {
146
+ "root_path": {
147
+ "type": "string"
148
+ },
149
+ "git": {
150
+ "type": "object",
151
+ "additionalProperties": false,
152
+ "required": [
153
+ "present",
154
+ "branch",
155
+ "commit"
156
+ ],
157
+ "properties": {
158
+ "present": {
159
+ "type": "boolean"
160
+ },
161
+ "remote": {
162
+ "type": "string"
163
+ },
164
+ "branch": {
165
+ "type": "string"
166
+ },
167
+ "commit": {
168
+ "type": "string"
169
+ }
170
+ }
171
+ }
172
+ }
173
+ },
174
+ "run": {
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "required": [
178
+ "run_id",
179
+ "tool",
180
+ "started_at_utc",
181
+ "ended_at_utc"
182
+ ],
183
+ "properties": {
184
+ "run_id": {
185
+ "type": "string",
186
+ "pattern": "^[A-Za-z0-9._:-]+$"
187
+ },
188
+ "tool": {
189
+ "type": "object",
190
+ "additionalProperties": false,
191
+ "required": [
192
+ "name",
193
+ "version"
194
+ ],
195
+ "properties": {
196
+ "name": {
197
+ "type": "string"
198
+ },
199
+ "version": {
200
+ "type": "string"
201
+ }
202
+ }
203
+ },
204
+ "deterministic_input_hash": {
205
+ "type": "string"
206
+ },
207
+ "started_at_utc": {
208
+ "type": "string",
209
+ "format": "date-time"
210
+ },
211
+ "ended_at_utc": {
212
+ "type": "string",
213
+ "format": "date-time"
214
+ },
215
+ "duration_ms": {
216
+ "type": "integer",
217
+ "minimum": 0
218
+ }
219
+ }
220
+ },
221
+ "lifecycle": {
222
+ "type": "object",
223
+ "additionalProperties": false,
224
+ "required": [
225
+ "workflow_state"
226
+ ],
227
+ "properties": {
228
+ "workflow_state": {
229
+ "type": "string",
230
+ "enum": [
231
+ "draft",
232
+ "ready",
233
+ "reviewed",
234
+ "accepted",
235
+ "blocked",
236
+ "retracted"
237
+ ]
238
+ },
239
+ "claim_level": {
240
+ "type": "string",
241
+ "enum": [
242
+ "Exact",
243
+ "Verified",
244
+ "Heuristic",
245
+ "Conjecture"
246
+ ]
247
+ },
248
+ "claim_status": {
249
+ "type": "string",
250
+ "enum": [
251
+ "Draft",
252
+ "In review",
253
+ "Verified",
254
+ "Blocked",
255
+ "Retracted"
256
+ ]
257
+ },
258
+ "atom_status": {
259
+ "type": "string",
260
+ "enum": [
261
+ "todo",
262
+ "in_progress",
263
+ "blocked",
264
+ "done"
265
+ ]
266
+ },
267
+ "state_note": {
268
+ "type": "string"
269
+ }
270
+ }
271
+ },
272
+ "claim_context": {
273
+ "type": "object",
274
+ "additionalProperties": false,
275
+ "required": [
276
+ "claim_id"
277
+ ],
278
+ "properties": {
279
+ "claim_id": {
280
+ "type": "string"
281
+ },
282
+ "canonical_artifacts": {
283
+ "type": "array",
284
+ "items": {
285
+ "type": "string"
286
+ }
287
+ }
288
+ }
289
+ },
290
+ "atomic_context": {
291
+ "type": "object",
292
+ "additionalProperties": false,
293
+ "required": [
294
+ "board_id",
295
+ "problem_id"
296
+ ],
297
+ "properties": {
298
+ "board_id": {
299
+ "type": "string"
300
+ },
301
+ "problem_id": {
302
+ "type": "string"
303
+ },
304
+ "ticket_id": {
305
+ "type": "string"
306
+ },
307
+ "gate_id": {
308
+ "type": "string"
309
+ },
310
+ "atom_id": {
311
+ "type": "string"
312
+ },
313
+ "dependencies": {
314
+ "type": "array",
315
+ "items": {
316
+ "type": "string"
317
+ }
318
+ },
319
+ "ready_queue_size": {
320
+ "type": "integer",
321
+ "minimum": 0
322
+ },
323
+ "board_snapshot_path": {
324
+ "type": "string"
325
+ },
326
+ "starter_scaffold": {
327
+ "type": "boolean"
328
+ },
329
+ "starter_note": {
330
+ "type": "string"
331
+ },
332
+ "route_status": {
333
+ "type": "object",
334
+ "additionalProperties": {
335
+ "type": "object",
336
+ "additionalProperties": false,
337
+ "required": [
338
+ "done",
339
+ "total",
340
+ "strict_done",
341
+ "strict_total"
342
+ ],
343
+ "properties": {
344
+ "done": {
345
+ "type": "integer",
346
+ "minimum": 0
347
+ },
348
+ "total": {
349
+ "type": "integer",
350
+ "minimum": 0
351
+ },
352
+ "strict_done": {
353
+ "type": "integer",
354
+ "minimum": 0
355
+ },
356
+ "strict_total": {
357
+ "type": "integer",
358
+ "minimum": 0
359
+ }
360
+ }
361
+ }
362
+ }
363
+ }
364
+ },
365
+ "gate_result": {
366
+ "type": "object",
367
+ "additionalProperties": false,
368
+ "required": [
369
+ "gate_id",
370
+ "phase",
371
+ "command",
372
+ "status",
373
+ "exit_code",
374
+ "duration_ms"
375
+ ],
376
+ "properties": {
377
+ "gate_id": {
378
+ "type": "string"
379
+ },
380
+ "phase": {
381
+ "type": "string",
382
+ "enum": [
383
+ "scope_lock",
384
+ "structure_kernel",
385
+ "quant_assembly",
386
+ "interface_lift",
387
+ "verification",
388
+ "custom"
389
+ ]
390
+ },
391
+ "command": {
392
+ "type": "string"
393
+ },
394
+ "status": {
395
+ "type": "string",
396
+ "enum": [
397
+ "pass",
398
+ "fail",
399
+ "error",
400
+ "skipped"
401
+ ]
402
+ },
403
+ "exit_code": {
404
+ "type": "integer"
405
+ },
406
+ "duration_ms": {
407
+ "type": "integer",
408
+ "minimum": 0
409
+ },
410
+ "stdout_path": {
411
+ "type": "string"
412
+ },
413
+ "stderr_path": {
414
+ "type": "string"
415
+ },
416
+ "evidence_paths": {
417
+ "type": "array",
418
+ "items": {
419
+ "type": "string"
420
+ }
421
+ },
422
+ "evidence_status": {
423
+ "type": "string",
424
+ "enum": [
425
+ "process_only",
426
+ "starter_scaffold",
427
+ "starter_stub",
428
+ "evidence"
429
+ ]
430
+ },
431
+ "evidence_note": {
432
+ "type": "string"
433
+ }
434
+ }
435
+ },
436
+ "summary": {
437
+ "type": "object",
438
+ "additionalProperties": false,
439
+ "required": [
440
+ "overall_result",
441
+ "gates_passed",
442
+ "gates_failed",
443
+ "gates_total"
444
+ ],
445
+ "properties": {
446
+ "overall_result": {
447
+ "type": "string",
448
+ "enum": [
449
+ "PASS",
450
+ "FAIL",
451
+ "INCONCLUSIVE"
452
+ ]
453
+ },
454
+ "gates_passed": {
455
+ "type": "integer",
456
+ "minimum": 0
457
+ },
458
+ "gates_failed": {
459
+ "type": "integer",
460
+ "minimum": 0
461
+ },
462
+ "gates_total": {
463
+ "type": "integer",
464
+ "minimum": 0
465
+ },
466
+ "note": {
467
+ "type": "string"
468
+ }
469
+ }
470
+ },
471
+ "evidence_status": {
472
+ "type": "object",
473
+ "additionalProperties": false,
474
+ "required": [
475
+ "overall",
476
+ "starter_scaffold",
477
+ "strongest_evidence_paths",
478
+ "notes"
479
+ ],
480
+ "properties": {
481
+ "overall": {
482
+ "type": "string"
483
+ },
484
+ "starter_scaffold": {
485
+ "type": "boolean"
486
+ },
487
+ "stub_gates": {
488
+ "type": "array",
489
+ "items": {
490
+ "type": "string"
491
+ }
492
+ },
493
+ "starter_scaffold_gates": {
494
+ "type": "array",
495
+ "items": {
496
+ "type": "string"
497
+ }
498
+ },
499
+ "evidence_gates": {
500
+ "type": "array",
501
+ "items": {
502
+ "type": "string"
503
+ }
504
+ },
505
+ "process_only_gates": {
506
+ "type": "array",
507
+ "items": {
508
+ "type": "string"
509
+ }
510
+ },
511
+ "strongest_evidence_paths": {
512
+ "type": "array",
513
+ "items": {
514
+ "type": "string"
515
+ }
516
+ },
517
+ "notes": {
518
+ "type": "array",
519
+ "items": {
520
+ "type": "string"
521
+ }
522
+ }
523
+ }
524
+ },
525
+ "artifacts": {
526
+ "type": "object",
527
+ "additionalProperties": false,
528
+ "required": [
529
+ "packet_json_path",
530
+ "packet_md_path",
531
+ "artifact_root"
532
+ ],
533
+ "properties": {
534
+ "packet_json_path": {
535
+ "type": "string"
536
+ },
537
+ "packet_md_path": {
538
+ "type": "string"
539
+ },
540
+ "artifact_root": {
541
+ "type": "string"
542
+ },
543
+ "extra_paths": {
544
+ "type": "array",
545
+ "items": {
546
+ "type": "string"
547
+ }
548
+ }
549
+ }
550
+ }
551
+ }
552
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://orp.dev/spec/v1/profile-pack.schema.json",
4
+ "title": "ORP Profile Pack Metadata v1",
5
+ "description": "Metadata contract for downloadable ORP profile packs.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "pack_id",
11
+ "name",
12
+ "version",
13
+ "description",
14
+ "templates"
15
+ ],
16
+ "properties": {
17
+ "schema_version": {
18
+ "type": "string",
19
+ "const": "1.0.0"
20
+ },
21
+ "pack_id": {
22
+ "type": "string",
23
+ "pattern": "^[a-z0-9][a-z0-9-]*$"
24
+ },
25
+ "name": {
26
+ "type": "string"
27
+ },
28
+ "version": {
29
+ "type": "string"
30
+ },
31
+ "description": {
32
+ "type": "string"
33
+ },
34
+ "orp_version_min": {
35
+ "type": "string"
36
+ },
37
+ "variables": {
38
+ "type": "object",
39
+ "additionalProperties": {
40
+ "$ref": "#/$defs/variable"
41
+ }
42
+ },
43
+ "templates": {
44
+ "type": "object",
45
+ "additionalProperties": {
46
+ "$ref": "#/$defs/template"
47
+ }
48
+ }
49
+ },
50
+ "$defs": {
51
+ "variable": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": [
55
+ "description"
56
+ ],
57
+ "properties": {
58
+ "description": {
59
+ "type": "string"
60
+ },
61
+ "required": {
62
+ "type": "boolean"
63
+ },
64
+ "default": {
65
+ "type": "string"
66
+ }
67
+ }
68
+ },
69
+ "template": {
70
+ "type": "object",
71
+ "additionalProperties": false,
72
+ "required": [
73
+ "path",
74
+ "description"
75
+ ],
76
+ "properties": {
77
+ "path": {
78
+ "type": "string"
79
+ },
80
+ "description": {
81
+ "type": "string"
82
+ },
83
+ "output_hint": {
84
+ "type": "string"
85
+ },
86
+ "default_profiles": {
87
+ "type": "array",
88
+ "items": {
89
+ "type": "string"
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,33 @@
1
+ # Claim
2
+
3
+ ## Title
4
+
5
+ ## Claim ID
6
+ Example: `CLAIM-YYYYMMDD-<short-name>`
7
+
8
+ ## Claim Level
9
+ Choose one: **Exact / Verified / Heuristic / Conjecture**
10
+
11
+ ## Statement (1–5 sentences)
12
+
13
+ ## Scope / Assumptions
14
+
15
+ ## Instrument (optional)
16
+ - Instrument(s) used:
17
+ - Instrument parameters explored (if any):
18
+
19
+ ## Canonical Artifacts (source of truth)
20
+ List exact paths (code/data/paper/proof/logs). ORP docs are not evidence.
21
+
22
+ ## Verification Hook
23
+ (Required for Exact/Verified; recommended for Heuristic/Conjecture.)
24
+ - Command(s) to run:
25
+ - Expected outputs:
26
+ - Determinism notes (seeds, versions, environment):
27
+
28
+ ## Status
29
+ Draft / In review / Verified / Blocked / Retracted
30
+ > Status reflects workflow state; Claim Level reflects epistemic strength.
31
+
32
+ ## Next Hook
33
+ What this enables next (one concrete step).
@@ -0,0 +1,19 @@
1
+ # Failed Path Record
2
+
3
+ > Note: This record documents a failure of an approach, not a person.
4
+
5
+ ## Topic
6
+
7
+ ## Summary (1–3 sentences)
8
+
9
+ ## What was attempted
10
+
11
+ ## Why it failed
12
+ Be specific: counterexample, missing lemma, performance barrier, ambiguity, etc.
13
+
14
+ ## Evidence (canonical artifacts)
15
+ Paths + any verification record that supports the failure.
16
+
17
+ ## What this rules out
18
+
19
+ ## What might still work (next hook)