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,188 @@
1
+ #!/usr/bin/env python3
2
+ """Render ORP profile-pack templates into concrete config files."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ from pathlib import Path
8
+ import re
9
+ import sys
10
+ from typing import Any
11
+
12
+ import yaml
13
+
14
+
15
+ VAR_PATTERN = re.compile(r"\{\{([A-Z0-9_]+)\}\}")
16
+
17
+
18
+ def _load_yaml(path: Path) -> dict[str, Any]:
19
+ data = yaml.safe_load(path.read_text(encoding="utf-8"))
20
+ if not isinstance(data, dict):
21
+ raise RuntimeError(f"YAML root must be object: {path}")
22
+ return data
23
+
24
+
25
+ def _parse_kv(values: list[str]) -> dict[str, str]:
26
+ out: dict[str, str] = {}
27
+ for raw in values:
28
+ if "=" not in raw:
29
+ raise RuntimeError(f"invalid --var, expected KEY=VALUE: {raw}")
30
+ key, val = raw.split("=", 1)
31
+ key = key.strip()
32
+ if not re.fullmatch(r"[A-Z0-9_]+", key):
33
+ raise RuntimeError(f"invalid variable key: {key}")
34
+ out[key] = val
35
+ return out
36
+
37
+
38
+ def _load_pack(pack_root: Path) -> tuple[Path, dict[str, Any]]:
39
+ pack_yml = pack_root / "pack.yml"
40
+ if not pack_yml.exists():
41
+ raise RuntimeError(f"missing pack metadata: {pack_yml}")
42
+ return pack_yml, _load_yaml(pack_yml)
43
+
44
+
45
+ def _template_info(pack: dict[str, Any], template_id: str) -> dict[str, Any]:
46
+ templates = pack.get("templates")
47
+ if not isinstance(templates, dict):
48
+ raise RuntimeError("pack.yml missing templates object")
49
+ info = templates.get(template_id)
50
+ if not isinstance(info, dict):
51
+ raise RuntimeError(f"template not found: {template_id}")
52
+ return info
53
+
54
+
55
+ def _variables(pack: dict[str, Any], cli_vars: dict[str, str]) -> dict[str, str]:
56
+ spec = pack.get("variables", {})
57
+ if spec is None:
58
+ spec = {}
59
+ if not isinstance(spec, dict):
60
+ raise RuntimeError("pack.yml variables must be an object")
61
+
62
+ out: dict[str, str] = {}
63
+ for key, meta in spec.items():
64
+ if not isinstance(key, str) or not isinstance(meta, dict):
65
+ continue
66
+ default = meta.get("default")
67
+ if isinstance(default, str):
68
+ out[key] = default
69
+
70
+ out.update(cli_vars)
71
+
72
+ missing: list[str] = []
73
+ for key, meta in spec.items():
74
+ if not isinstance(meta, dict):
75
+ continue
76
+ required = bool(meta.get("required", False))
77
+ if required and (key not in out or out[key] == ""):
78
+ missing.append(key)
79
+ if missing:
80
+ raise RuntimeError("missing required variables: " + ", ".join(sorted(missing)))
81
+
82
+ return out
83
+
84
+
85
+ def _render_text(text: str, vars_map: dict[str, str]) -> str:
86
+ rendered = text
87
+ for key, value in vars_map.items():
88
+ rendered = rendered.replace("{{" + key + "}}", value)
89
+ unresolved = sorted(set(VAR_PATTERN.findall(rendered)))
90
+ if unresolved:
91
+ raise RuntimeError("unresolved template variables: " + ", ".join(unresolved))
92
+ return rendered
93
+
94
+
95
+ def cmd_list(args: argparse.Namespace) -> int:
96
+ pack_root = Path(args.pack).resolve()
97
+ pack_path, pack = _load_pack(pack_root)
98
+ print(f"pack: {pack.get('pack_id', '(unknown)')} ({pack_path})")
99
+ print(f"description: {pack.get('description', '')}")
100
+
101
+ variables = pack.get("variables", {})
102
+ if isinstance(variables, dict) and variables:
103
+ print("\nvariables:")
104
+ for key in sorted(variables):
105
+ meta = variables.get(key, {})
106
+ if not isinstance(meta, dict):
107
+ continue
108
+ req = "required" if bool(meta.get("required", False)) else "optional"
109
+ default = meta.get("default", "")
110
+ default_part = f" default={default}" if isinstance(default, str) and default != "" else ""
111
+ desc = str(meta.get("description", ""))
112
+ print(f"- {key} ({req}{default_part}): {desc}")
113
+
114
+ templates = pack.get("templates", {})
115
+ if not isinstance(templates, dict) or not templates:
116
+ print("\ntemplates: (none)")
117
+ return 0
118
+
119
+ print("\ntemplates:")
120
+ for tid, info in templates.items():
121
+ if not isinstance(info, dict):
122
+ continue
123
+ print(f"- {tid}")
124
+ print(f" path: {info.get('path', '')}")
125
+ print(f" description: {info.get('description', '')}")
126
+ if "output_hint" in info:
127
+ print(f" output_hint: {info.get('output_hint', '')}")
128
+ return 0
129
+
130
+
131
+ def cmd_render(args: argparse.Namespace) -> int:
132
+ pack_root = Path(args.pack).resolve()
133
+ _pack_path, pack = _load_pack(pack_root)
134
+ info = _template_info(pack, args.template)
135
+
136
+ rel_path = info.get("path")
137
+ if not isinstance(rel_path, str) or rel_path.strip() == "":
138
+ raise RuntimeError(f"template path missing for {args.template}")
139
+ template_path = (pack_root / rel_path).resolve()
140
+ if not template_path.exists():
141
+ raise RuntimeError(f"template file not found: {template_path}")
142
+
143
+ cli_vars = _parse_kv(args.var or [])
144
+ vars_map = _variables(pack, cli_vars)
145
+
146
+ template_text = template_path.read_text(encoding="utf-8")
147
+ rendered = _render_text(template_text, vars_map)
148
+
149
+ out_path = Path(args.out).resolve()
150
+ out_path.parent.mkdir(parents=True, exist_ok=True)
151
+ out_path.write_text(rendered, encoding="utf-8")
152
+
153
+ print(f"rendered template: {args.template}")
154
+ print(f"source: {template_path}")
155
+ print(f"output: {out_path}")
156
+ return 0
157
+
158
+
159
+ def build_parser() -> argparse.ArgumentParser:
160
+ p = argparse.ArgumentParser(description="Render ORP profile-pack templates")
161
+ p.add_argument("--pack", required=True, help="Pack root directory containing pack.yml")
162
+
163
+ mode = p.add_mutually_exclusive_group(required=True)
164
+ mode.add_argument("--list", action="store_true", help="List pack templates and variables")
165
+ mode.add_argument("--template", help="Template id to render")
166
+
167
+ p.add_argument("--var", action="append", default=[], help="Template variable KEY=VALUE (repeatable)")
168
+ p.add_argument("--out", default="", help="Output file path (required for render mode)")
169
+ return p
170
+
171
+
172
+ def main() -> int:
173
+ args = build_parser().parse_args()
174
+ if args.list:
175
+ return cmd_list(args)
176
+ if args.template:
177
+ if args.out.strip() == "":
178
+ raise RuntimeError("--out is required when rendering a template")
179
+ return cmd_render(args)
180
+ raise RuntimeError("invalid mode")
181
+
182
+
183
+ if __name__ == "__main__":
184
+ try:
185
+ raise SystemExit(main())
186
+ except RuntimeError as exc:
187
+ print(f"error: {exc}", file=sys.stderr)
188
+ raise SystemExit(2)
@@ -0,0 +1,40 @@
1
+ # ORP v1 Lifecycle Mapping
2
+
3
+ This mapping keeps current ORP semantics intact while adding atomic discovery states.
4
+
5
+ ## Claim-Level Mapping (current templates -> workflow state)
6
+
7
+ | Current field | Value | ORP `workflow_state` |
8
+ |---|---|---|
9
+ | `Claim Status` | `Draft` | `draft` |
10
+ | `Claim Status` | `In review` | `ready` |
11
+ | `Claim Status` | `Verified` | `reviewed` |
12
+ | `Claim Status` | `Blocked` | `blocked` |
13
+ | `Claim Status` | `Retracted` | `retracted` |
14
+
15
+ Notes:
16
+ - `Claim Level` (`Exact/Verified/Heuristic/Conjecture`) remains epistemic and separate from workflow state.
17
+ - `accepted` is optional and should be set only by an explicit acceptance action (maintainer/reviewer decision), not inferred automatically.
18
+
19
+ ## Atomic Board Mapping (sunflower-style atoms -> workflow state)
20
+
21
+ | Board atom status | ORP `workflow_state` |
22
+ |---|---|
23
+ | `todo` | `draft` |
24
+ | `in_progress` | `ready` |
25
+ | `blocked` | `blocked` |
26
+ | `done` | `reviewed` |
27
+
28
+ Notes:
29
+ - Promote to `accepted` at higher scopes only when closure criteria are met and explicitly recorded:
30
+ - all atoms in a gate are `done` -> gate can be marked accepted,
31
+ - all gates in a ticket are complete -> ticket can be marked accepted,
32
+ - route closure can be marked accepted once strict/loose checks pass.
33
+
34
+ ## Why this split matters
35
+
36
+ - `workflow_state` tracks execution/lifecycle.
37
+ - `claim_level` tracks epistemic strength.
38
+ - `atom_status` tracks discovery execution at atomic granularity.
39
+
40
+ This prevents drift between documentation claims, verification records, and board progress signals.
@@ -0,0 +1,385 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://orp.dev/spec/v1/orp.config.schema.json",
4
+ "title": "ORP Config v1",
5
+ "description": "Configuration for ORP runtime gates, lifecycle mapping, and profiles.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "version",
10
+ "project",
11
+ "lifecycle",
12
+ "gates",
13
+ "profiles"
14
+ ],
15
+ "properties": {
16
+ "version": {
17
+ "type": "string",
18
+ "const": "1"
19
+ },
20
+ "project": {
21
+ "$ref": "#/$defs/project"
22
+ },
23
+ "runtime": {
24
+ "$ref": "#/$defs/runtime"
25
+ },
26
+ "packet": {
27
+ "$ref": "#/$defs/packet"
28
+ },
29
+ "epistemic_status": {
30
+ "$ref": "#/$defs/epistemic_status"
31
+ },
32
+ "lifecycle": {
33
+ "$ref": "#/$defs/lifecycle"
34
+ },
35
+ "atomic_board": {
36
+ "$ref": "#/$defs/atomic_board"
37
+ },
38
+ "gates": {
39
+ "type": "array",
40
+ "items": {
41
+ "$ref": "#/$defs/gate"
42
+ }
43
+ },
44
+ "profiles": {
45
+ "type": "object",
46
+ "additionalProperties": {
47
+ "$ref": "#/$defs/profile"
48
+ }
49
+ }
50
+ },
51
+ "$defs": {
52
+ "project": {
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": [
56
+ "name",
57
+ "canonical_paths"
58
+ ],
59
+ "properties": {
60
+ "name": {
61
+ "type": "string"
62
+ },
63
+ "repo_root": {
64
+ "type": "string"
65
+ },
66
+ "canonical_paths": {
67
+ "type": "object",
68
+ "additionalProperties": {
69
+ "type": "string"
70
+ }
71
+ }
72
+ }
73
+ },
74
+ "runtime": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "properties": {
78
+ "shell": {
79
+ "type": "string"
80
+ },
81
+ "default_timeout_sec": {
82
+ "type": "integer",
83
+ "minimum": 1
84
+ },
85
+ "artifacts_root": {
86
+ "type": "string"
87
+ }
88
+ }
89
+ },
90
+ "packet": {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "properties": {
94
+ "default_kind": {
95
+ "type": "string",
96
+ "enum": [
97
+ "pr",
98
+ "claim",
99
+ "verification",
100
+ "problem_scope",
101
+ "atom_pass"
102
+ ]
103
+ },
104
+ "output_dir": {
105
+ "type": "string"
106
+ },
107
+ "write_markdown": {
108
+ "type": "boolean"
109
+ },
110
+ "deterministic_mode": {
111
+ "type": "boolean"
112
+ }
113
+ }
114
+ },
115
+ "lifecycle": {
116
+ "type": "object",
117
+ "additionalProperties": false,
118
+ "required": [
119
+ "claim_status_map",
120
+ "atom_status_map"
121
+ ],
122
+ "properties": {
123
+ "claim_status_map": {
124
+ "type": "object",
125
+ "additionalProperties": {
126
+ "type": "string",
127
+ "enum": [
128
+ "draft",
129
+ "ready",
130
+ "reviewed",
131
+ "accepted",
132
+ "blocked",
133
+ "retracted"
134
+ ]
135
+ }
136
+ },
137
+ "atom_status_map": {
138
+ "type": "object",
139
+ "additionalProperties": {
140
+ "type": "string",
141
+ "enum": [
142
+ "draft",
143
+ "ready",
144
+ "reviewed",
145
+ "accepted",
146
+ "blocked",
147
+ "retracted"
148
+ ]
149
+ }
150
+ },
151
+ "claim_level_values": {
152
+ "type": "array",
153
+ "items": {
154
+ "type": "string",
155
+ "enum": [
156
+ "Exact",
157
+ "Verified",
158
+ "Heuristic",
159
+ "Conjecture"
160
+ ]
161
+ }
162
+ }
163
+ }
164
+ },
165
+ "atomic_board": {
166
+ "type": "object",
167
+ "additionalProperties": false,
168
+ "properties": {
169
+ "enabled": {
170
+ "type": "boolean"
171
+ },
172
+ "board_path": {
173
+ "type": "string"
174
+ },
175
+ "refresh_command": {
176
+ "type": "string"
177
+ },
178
+ "ready_command": {
179
+ "type": "string"
180
+ },
181
+ "set_atom_command_template": {
182
+ "type": "string"
183
+ }
184
+ }
185
+ },
186
+ "gate": {
187
+ "type": "object",
188
+ "additionalProperties": false,
189
+ "required": [
190
+ "id",
191
+ "description",
192
+ "phase",
193
+ "command",
194
+ "pass"
195
+ ],
196
+ "properties": {
197
+ "id": {
198
+ "type": "string"
199
+ },
200
+ "description": {
201
+ "type": "string"
202
+ },
203
+ "phase": {
204
+ "type": "string",
205
+ "enum": [
206
+ "scope_lock",
207
+ "structure_kernel",
208
+ "quant_assembly",
209
+ "interface_lift",
210
+ "verification",
211
+ "custom"
212
+ ]
213
+ },
214
+ "command": {
215
+ "type": "string"
216
+ },
217
+ "working_dir": {
218
+ "type": "string"
219
+ },
220
+ "timeout_sec": {
221
+ "type": "integer",
222
+ "minimum": 1
223
+ },
224
+ "required": {
225
+ "type": "boolean"
226
+ },
227
+ "pass": {
228
+ "$ref": "#/$defs/pass_rule"
229
+ },
230
+ "evidence": {
231
+ "$ref": "#/$defs/evidence"
232
+ },
233
+ "on_fail": {
234
+ "type": "string",
235
+ "enum": [
236
+ "stop",
237
+ "continue",
238
+ "mark_blocked"
239
+ ]
240
+ }
241
+ }
242
+ },
243
+ "pass_rule": {
244
+ "type": "object",
245
+ "additionalProperties": false,
246
+ "required": [
247
+ "exit_codes"
248
+ ],
249
+ "properties": {
250
+ "exit_codes": {
251
+ "type": "array",
252
+ "items": {
253
+ "type": "integer"
254
+ }
255
+ },
256
+ "stdout_must_contain": {
257
+ "type": "array",
258
+ "items": {
259
+ "type": "string"
260
+ }
261
+ },
262
+ "stdout_must_not_contain": {
263
+ "type": "array",
264
+ "items": {
265
+ "type": "string"
266
+ }
267
+ },
268
+ "stderr_must_contain": {
269
+ "type": "array",
270
+ "items": {
271
+ "type": "string"
272
+ }
273
+ },
274
+ "stderr_must_not_contain": {
275
+ "type": "array",
276
+ "items": {
277
+ "type": "string"
278
+ }
279
+ },
280
+ "file_must_exist": {
281
+ "type": "array",
282
+ "items": {
283
+ "type": "string"
284
+ }
285
+ }
286
+ }
287
+ },
288
+ "evidence": {
289
+ "type": "object",
290
+ "additionalProperties": false,
291
+ "properties": {
292
+ "include_stdout": {
293
+ "type": "boolean"
294
+ },
295
+ "include_stderr": {
296
+ "type": "boolean"
297
+ },
298
+ "status": {
299
+ "type": "string",
300
+ "enum": [
301
+ "process_only",
302
+ "starter_scaffold",
303
+ "starter_stub",
304
+ "evidence"
305
+ ]
306
+ },
307
+ "note": {
308
+ "type": "string"
309
+ },
310
+ "paths": {
311
+ "type": "array",
312
+ "items": {
313
+ "type": "string"
314
+ }
315
+ }
316
+ }
317
+ },
318
+ "epistemic_status": {
319
+ "type": "object",
320
+ "additionalProperties": false,
321
+ "properties": {
322
+ "overall": {
323
+ "type": "string"
324
+ },
325
+ "starter_scaffold": {
326
+ "type": "boolean"
327
+ },
328
+ "include_last_erdos_sync": {
329
+ "type": "boolean"
330
+ },
331
+ "strongest_evidence_paths": {
332
+ "type": "array",
333
+ "items": {
334
+ "type": "string"
335
+ }
336
+ },
337
+ "notes": {
338
+ "type": "array",
339
+ "items": {
340
+ "type": "string"
341
+ }
342
+ }
343
+ }
344
+ },
345
+ "profile": {
346
+ "type": "object",
347
+ "additionalProperties": false,
348
+ "required": [
349
+ "description",
350
+ "mode",
351
+ "packet_kind",
352
+ "gate_ids"
353
+ ],
354
+ "properties": {
355
+ "description": {
356
+ "type": "string"
357
+ },
358
+ "mode": {
359
+ "type": "string",
360
+ "enum": [
361
+ "discovery",
362
+ "collaboration",
363
+ "review"
364
+ ]
365
+ },
366
+ "packet_kind": {
367
+ "type": "string",
368
+ "enum": [
369
+ "pr",
370
+ "claim",
371
+ "verification",
372
+ "problem_scope",
373
+ "atom_pass"
374
+ ]
375
+ },
376
+ "gate_ids": {
377
+ "type": "array",
378
+ "items": {
379
+ "type": "string"
380
+ }
381
+ }
382
+ }
383
+ }
384
+ }
385
+ }