@claudexor/schema 3.0.4 → 3.1.1

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 (146) hide show
  1. package/dist/agent-capabilities.d.ts +45 -8
  2. package/dist/agent-capabilities.d.ts.map +1 -1
  3. package/dist/agent-capabilities.js +14 -0
  4. package/dist/agent-capabilities.js.map +1 -1
  5. package/dist/apply-eligibility.d.ts +384 -18
  6. package/dist/apply-eligibility.d.ts.map +1 -1
  7. package/dist/apply-eligibility.js +20 -1
  8. package/dist/apply-eligibility.js.map +1 -1
  9. package/dist/budget.d.ts +84 -9
  10. package/dist/budget.d.ts.map +1 -1
  11. package/dist/budget.js +46 -0
  12. package/dist/budget.js.map +1 -1
  13. package/dist/config.d.ts +97 -65
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +12 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/control-operation-responses.d.ts +311 -89
  18. package/dist/control-operation-responses.d.ts.map +1 -1
  19. package/dist/control-operation-responses.js +33 -3
  20. package/dist/control-operation-responses.js.map +1 -1
  21. package/dist/control-run-detail.d.ts +613 -163
  22. package/dist/control-run-detail.d.ts.map +1 -1
  23. package/dist/control-run-detail.js +28 -2
  24. package/dist/control-run-detail.js.map +1 -1
  25. package/dist/control-run-retry.d.ts +1 -1
  26. package/dist/control-run-scope.d.ts +1 -1
  27. package/dist/control-thread-apply.d.ts +10 -0
  28. package/dist/control-thread-apply.d.ts.map +1 -1
  29. package/dist/control.d.ts +791 -232
  30. package/dist/control.d.ts.map +1 -1
  31. package/dist/control.js +76 -2
  32. package/dist/control.js.map +1 -1
  33. package/dist/decision.d.ts +205 -9
  34. package/dist/decision.d.ts.map +1 -1
  35. package/dist/decision.js +69 -1
  36. package/dist/decision.js.map +1 -1
  37. package/dist/deep-scan.d.ts +27 -0
  38. package/dist/deep-scan.d.ts.map +1 -0
  39. package/dist/deep-scan.js +27 -0
  40. package/dist/deep-scan.js.map +1 -0
  41. package/dist/delivery.d.ts +13 -0
  42. package/dist/delivery.d.ts.map +1 -1
  43. package/dist/delivery.js +15 -0
  44. package/dist/delivery.js.map +1 -1
  45. package/dist/effort.d.ts +132 -0
  46. package/dist/effort.d.ts.map +1 -0
  47. package/dist/effort.js +167 -0
  48. package/dist/effort.js.map +1 -0
  49. package/dist/events.d.ts +59 -4
  50. package/dist/events.d.ts.map +1 -1
  51. package/dist/events.js +91 -0
  52. package/dist/events.js.map +1 -1
  53. package/dist/gate.d.ts +2 -2
  54. package/dist/harness.d.ts +209 -28
  55. package/dist/harness.d.ts.map +1 -1
  56. package/dist/harness.js +107 -14
  57. package/dist/harness.js.map +1 -1
  58. package/dist/index.d.ts +4 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +4 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/operation.d.ts +193 -10
  63. package/dist/operation.d.ts.map +1 -1
  64. package/dist/operation.js +45 -0
  65. package/dist/operation.js.map +1 -1
  66. package/dist/output-schema-dialect.d.ts +22 -0
  67. package/dist/output-schema-dialect.d.ts.map +1 -0
  68. package/dist/output-schema-dialect.js +37 -0
  69. package/dist/output-schema-dialect.js.map +1 -0
  70. package/dist/output-schema.d.ts +26 -2
  71. package/dist/output-schema.d.ts.map +1 -1
  72. package/dist/output-schema.js +313 -16
  73. package/dist/output-schema.js.map +1 -1
  74. package/dist/plan.d.ts +2 -2
  75. package/dist/problem.d.ts +3 -3
  76. package/dist/project.d.ts +47 -12
  77. package/dist/project.d.ts.map +1 -1
  78. package/dist/project.js +32 -0
  79. package/dist/project.js.map +1 -1
  80. package/dist/readiness.d.ts +62 -7
  81. package/dist/readiness.d.ts.map +1 -1
  82. package/dist/recovery.d.ts +14 -14
  83. package/dist/review.d.ts +7 -7
  84. package/dist/route.d.ts +2 -2
  85. package/dist/setup.d.ts +288 -94
  86. package/dist/setup.d.ts.map +1 -1
  87. package/dist/setup.js +90 -6
  88. package/dist/setup.js.map +1 -1
  89. package/dist/status-projection.d.ts +79 -4
  90. package/dist/status-projection.d.ts.map +1 -1
  91. package/dist/status-projection.js +161 -4
  92. package/dist/status-projection.js.map +1 -1
  93. package/dist/task.d.ts +70 -53
  94. package/dist/task.d.ts.map +1 -1
  95. package/dist/task.js +18 -8
  96. package/dist/task.js.map +1 -1
  97. package/dist/telemetry.d.ts +795 -32
  98. package/dist/telemetry.d.ts.map +1 -1
  99. package/dist/telemetry.js +177 -4
  100. package/dist/telemetry.js.map +1 -1
  101. package/dist/tool-ref.d.ts +14 -0
  102. package/dist/tool-ref.d.ts.map +1 -1
  103. package/dist/tool-ref.js +15 -0
  104. package/dist/tool-ref.js.map +1 -1
  105. package/dist/work-report.d.ts +131 -0
  106. package/dist/work-report.d.ts.map +1 -0
  107. package/dist/work-report.js +124 -0
  108. package/dist/work-report.js.map +1 -0
  109. package/dist/workspace.d.ts +2 -2
  110. package/generated/AgentCapabilityCatalog.schema.json +39 -8
  111. package/generated/ControlApplyCheckResponse.schema.json +5 -0
  112. package/generated/ControlDeliveryResponse.schema.json +14 -0
  113. package/generated/ControlHarnessListResponse.schema.json +64 -9
  114. package/generated/ControlHarnessSettingsPatch.schema.json +4 -8
  115. package/generated/ControlOperationCatalog.schema.json +74 -0
  116. package/generated/ControlOperationDescriptor.schema.json +74 -0
  117. package/generated/ControlOperationParameter.schema.json +75 -0
  118. package/generated/ControlProjectRemoveReceipt.schema.json +58 -0
  119. package/generated/ControlRunAgainDraft.schema.json +14 -7
  120. package/generated/ControlRunDetail.schema.json +406 -16
  121. package/generated/ControlRunListResponse.schema.json +232 -10
  122. package/generated/ControlRunStartRequest.schema.json +14 -7
  123. package/generated/ControlRunSummary.schema.json +218 -9
  124. package/generated/ControlSettingsSnapshot.schema.json +4 -8
  125. package/generated/ControlSettingsUpdateRequest.schema.json +4 -8
  126. package/generated/ControlSetupJobCreateRequest.schema.json +2 -1
  127. package/generated/ControlSetupJobEvent.schema.json +28 -0
  128. package/generated/ControlSetupJobSnapshot.schema.json +28 -0
  129. package/generated/ControlThreadApplyResponse.schema.json +14 -0
  130. package/generated/ControlThreadDetail.schema.json +94 -1
  131. package/generated/ControlThreadTurnRequest.schema.json +14 -7
  132. package/generated/DecisionRecord.schema.json +178 -2
  133. package/generated/GlobalConfig.schema.json +4 -8
  134. package/generated/HarnessEvent.schema.json +79 -1
  135. package/generated/HarnessManifest.schema.json +64 -9
  136. package/generated/HarnessStatusDto.schema.json +64 -9
  137. package/generated/McpRunHandleResult.schema.json +286 -1
  138. package/generated/McpRunToolResult.schema.json +171 -1
  139. package/generated/ProjectConfig.schema.json +26 -0
  140. package/generated/RoutePoolDegradedPayload.schema.json +79 -0
  141. package/generated/RunEvent.schema.json +8 -1
  142. package/generated/RunFailure.schema.json +23 -1
  143. package/generated/RunTelemetry.schema.json +376 -1
  144. package/generated/StructuredOutputConformance.schema.json +83 -0
  145. package/generated/TaskContract.schema.json +13 -1
  146. package/package.json +2 -2
@@ -344,21 +344,76 @@
344
344
  "default": false,
345
345
  "description": "The harness can constrain its final message to a caller-supplied JSON Schema (native structured-output flag)."
346
346
  },
347
+ "work_report_transport": {
348
+ "type": "string",
349
+ "enum": [
350
+ "constrained",
351
+ "validated",
352
+ "unsupported"
353
+ ],
354
+ "default": "unsupported",
355
+ "description": "How the harness carries the D-16 WorkReport envelope: constrained (native schema transport), validated (whole-answer JSON), or unsupported (work_state stays unverified)."
356
+ },
357
+ "structured_output_channel": {
358
+ "type": "string",
359
+ "enum": [
360
+ "side_tool",
361
+ "final_message"
362
+ ],
363
+ "default": "final_message",
364
+ "description": "Where a schema-constrained answer surfaces: side_tool (rides a tool; final message stays markdown) or final_message (constrains the final message itself)."
365
+ },
347
366
  "effort_levels": {
348
367
  "type": "array",
349
368
  "items": {
350
369
  "type": "string",
351
- "enum": [
352
- "low",
353
- "medium",
354
- "high",
355
- "xhigh",
356
- "max"
357
- ],
358
- "description": "Cross-harness reasoning-effort level, weakest to strongest; adapters declare the subset they support and a shared normalizer clamps requests onto the nearest supported level."
370
+ "minLength": 1,
371
+ "maxLength": 32,
372
+ "pattern": "^[a-z0-9]+(?:[_-][a-z0-9]+)*$",
373
+ "description": "Cross-harness reasoning-effort level as a lowercase slug (open vocabulary, mirroring the vendor contract); adapters advertise the levels they accept per model, ordered weakest to strongest by the vendor itself, and a shared normalizer passes advertised levels through, clamps inside the vendor order, and refuses levels the advertised ladder has never seen."
359
374
  },
360
375
  "default": [],
361
- "description": "Ordered (weakest to strongest) reasoning-effort levels this harness actually accepts; empty means effort is not a tunable surface."
376
+ "description": "Ordered (weakest to strongest) reasoning-effort levels this harness accepts across all its models; empty means effort is not a tunable surface."
377
+ },
378
+ "model_effort_levels": {
379
+ "type": "object",
380
+ "additionalProperties": {
381
+ "type": "object",
382
+ "properties": {
383
+ "levels": {
384
+ "type": "array",
385
+ "items": {
386
+ "$ref": "#/definitions/HarnessStatusDto/properties/manifest/anyOf/0/properties/capabilities/properties/effort_levels/items"
387
+ },
388
+ "default": [],
389
+ "description": "Ordered (weakest to strongest) reasoning-effort levels this model advertises, in the vendor's own order."
390
+ },
391
+ "default": {
392
+ "anyOf": [
393
+ {
394
+ "$ref": "#/definitions/HarnessStatusDto/properties/manifest/anyOf/0/properties/capabilities/properties/effort_levels/items"
395
+ },
396
+ {
397
+ "type": "null"
398
+ }
399
+ ],
400
+ "description": "The effort level the vendor uses for this model when none is requested.",
401
+ "default": null
402
+ }
403
+ },
404
+ "additionalProperties": false,
405
+ "description": "Reasoning-effort vocabulary a single model advertises."
406
+ },
407
+ "default": {},
408
+ "description": "Per-model advertised reasoning-effort vocabulary keyed by model id; a model absent here falls back to the harness-wide effort_levels union."
409
+ },
410
+ "effort_levels_verified_against": {
411
+ "type": [
412
+ "string",
413
+ "null"
414
+ ],
415
+ "default": null,
416
+ "description": "Vendor CLI version the effort ladders were last verified against; null = never verified / not applicable."
362
417
  },
363
418
  "known_models": {
364
419
  "type": "array",
@@ -109,7 +109,11 @@
109
109
  "stuck_no_progress",
110
110
  "wall_clock_exceeded",
111
111
  "user_cancelled",
112
- "crash_interrupted"
112
+ "crash_interrupted",
113
+ "input_required",
114
+ "work_incomplete",
115
+ "context_capacity_exhausted",
116
+ "work_report_contract"
113
117
  ],
114
118
  "description": "Typed reason qualifying a non-clean terminal; null on a clean success."
115
119
  },
@@ -119,6 +123,82 @@
119
123
  ],
120
124
  "description": "Typed reason qualifying a non-clean terminal; null on a clean success.",
121
125
  "default": null
126
+ },
127
+ "work_state": {
128
+ "type": "object",
129
+ "properties": {
130
+ "state": {
131
+ "type": "string",
132
+ "enum": [
133
+ "completed",
134
+ "needs_input",
135
+ "incomplete",
136
+ "unverified"
137
+ ],
138
+ "description": "Folded work state: the WorkReport state, or unverified when no report was obtainable (transport unsupported / lane gated)."
139
+ },
140
+ "source": {
141
+ "type": "string",
142
+ "enum": [
143
+ "constrained",
144
+ "validated",
145
+ "absent"
146
+ ],
147
+ "description": "Provenance of a WorkReport: constrained (native schema transport), validated (whole-answer JSON), or absent (no transport could carry one — a disclosed absence, not a failure)."
148
+ },
149
+ "required_inputs": {
150
+ "type": "array",
151
+ "items": {
152
+ "type": "object",
153
+ "properties": {
154
+ "kind": {
155
+ "type": "string",
156
+ "enum": [
157
+ "file",
158
+ "context",
159
+ "credential",
160
+ "permission",
161
+ "decision",
162
+ "external_dependency"
163
+ ],
164
+ "description": "Category of a missing input a needs_input/incomplete report lists: a file, additional context, a credential, a permission, a human decision, or an external dependency."
165
+ },
166
+ "locator": {
167
+ "anyOf": [
168
+ {
169
+ "type": "string",
170
+ "maxLength": 512
171
+ },
172
+ {
173
+ "type": "null"
174
+ }
175
+ ],
176
+ "default": null,
177
+ "description": "Concrete pointer to the missing thing (path/url/name); null when unnameable."
178
+ },
179
+ "description": {
180
+ "type": "string",
181
+ "maxLength": 1024,
182
+ "description": "Human-readable description of what is needed and why."
183
+ }
184
+ },
185
+ "required": [
186
+ "kind",
187
+ "description"
188
+ ],
189
+ "additionalProperties": false,
190
+ "description": "One blocking input a needs_input/incomplete WorkReport lists."
191
+ },
192
+ "maxItems": 16,
193
+ "description": "Carried through from a needs_input/incomplete WorkReport for honest disclosure."
194
+ }
195
+ },
196
+ "required": [
197
+ "state",
198
+ "source"
199
+ ],
200
+ "additionalProperties": false,
201
+ "description": "D-16 model-attested work outcome, orthogonal to lifecycle; a needs_input/incomplete state vetoes applyability and exit 0. Absent on runs with no work_report transport."
122
202
  }
123
203
  },
124
204
  "required": [
@@ -221,6 +301,211 @@
221
301
  ],
222
302
  "description": "Derived plan readiness (plan runs only, D17); null otherwise.",
223
303
  "default": null
304
+ },
305
+ "council": {
306
+ "anyOf": [
307
+ {
308
+ "type": "object",
309
+ "properties": {
310
+ "requested": {
311
+ "type": "integer",
312
+ "exclusiveMinimum": 0,
313
+ "description": "Requested member count (n; 2..4)."
314
+ },
315
+ "drafted": {
316
+ "type": "integer",
317
+ "minimum": 0,
318
+ "description": "Members whose draft survived to the merge."
319
+ },
320
+ "degraded": {
321
+ "type": "boolean",
322
+ "default": false,
323
+ "description": "True when fewer members drafted than requested (failures disclosed per member)."
324
+ },
325
+ "mergedBy": {
326
+ "type": [
327
+ "string",
328
+ "null"
329
+ ],
330
+ "default": null,
331
+ "description": "Harness that produced the unified plan (the primary); null if the merge failed."
332
+ },
333
+ "members": {
334
+ "type": "array",
335
+ "items": {
336
+ "type": "object",
337
+ "properties": {
338
+ "harnessId": {
339
+ "type": "string",
340
+ "minLength": 1,
341
+ "description": "Harness that drafted (or merged) this member's plan."
342
+ },
343
+ "role": {
344
+ "type": "string",
345
+ "enum": [
346
+ "primary",
347
+ "member"
348
+ ],
349
+ "description": "primary = the merger that synthesizes the unified plan; member = draft only."
350
+ },
351
+ "status": {
352
+ "type": "string",
353
+ "enum": [
354
+ "drafted",
355
+ "failed",
356
+ "merged"
357
+ ],
358
+ "description": "drafted = draft landed; merged = this member produced the unified plan; failed."
359
+ },
360
+ "error": {
361
+ "type": [
362
+ "string",
363
+ "null"
364
+ ],
365
+ "default": null,
366
+ "description": "First redacted draft error; null unless the member failed."
367
+ }
368
+ },
369
+ "required": [
370
+ "harnessId",
371
+ "role",
372
+ "status"
373
+ ],
374
+ "additionalProperties": false,
375
+ "description": "One council member's role and draft/merge outcome."
376
+ },
377
+ "default": [],
378
+ "description": "Per-member role and outcome."
379
+ }
380
+ },
381
+ "required": [
382
+ "requested",
383
+ "drafted"
384
+ ],
385
+ "additionalProperties": false,
386
+ "description": "Council membership + merge disclosure for a --council plan run."
387
+ },
388
+ {
389
+ "type": "null"
390
+ }
391
+ ],
392
+ "description": "Council membership + merge disclosure (QA-023b); null for solo/non-plan runs.",
393
+ "default": null
394
+ },
395
+ "budget": {
396
+ "anyOf": [
397
+ {
398
+ "type": "object",
399
+ "properties": {
400
+ "paidBudget": {
401
+ "anyOf": [
402
+ {
403
+ "type": "object",
404
+ "properties": {
405
+ "kind": {
406
+ "type": "string",
407
+ "const": "unlimited"
408
+ }
409
+ },
410
+ "required": [
411
+ "kind"
412
+ ],
413
+ "additionalProperties": false
414
+ },
415
+ {
416
+ "type": "object",
417
+ "properties": {
418
+ "kind": {
419
+ "type": "string",
420
+ "const": "finite"
421
+ },
422
+ "maxUsd": {
423
+ "type": "number",
424
+ "minimum": 0
425
+ }
426
+ },
427
+ "required": [
428
+ "kind",
429
+ "maxUsd"
430
+ ],
431
+ "additionalProperties": false
432
+ }
433
+ ],
434
+ "description": "Incremental-cash budget: explicitly unlimited or a finite non-negative USD cap.",
435
+ "default": {
436
+ "kind": "unlimited"
437
+ }
438
+ },
439
+ "spendUsd": {
440
+ "type": [
441
+ "number",
442
+ "null"
443
+ ],
444
+ "default": null,
445
+ "description": "CASH spend so far in USD; null when unknown."
446
+ },
447
+ "valuationUsd": {
448
+ "type": [
449
+ "number",
450
+ "null"
451
+ ],
452
+ "default": null,
453
+ "description": "Subscription valuation in USD (separate from billed cash); null when unknown — never a fabricated $0 (QA-023c)."
454
+ },
455
+ "valuationKnowledge": {
456
+ "type": "string",
457
+ "enum": [
458
+ "exact",
459
+ "estimated",
460
+ "unknown"
461
+ ],
462
+ "default": "unknown",
463
+ "description": "Confidence of valuationUsd: 'estimated' when token-derived, 'unknown' when no usage was reported (valuationUsd is then null), 'exact' when natively priced."
464
+ },
465
+ "remainingUsd": {
466
+ "type": [
467
+ "number",
468
+ "null"
469
+ ],
470
+ "default": null,
471
+ "description": "Remaining budget in USD; null when no cap or unknown spend."
472
+ },
473
+ "estimated": {
474
+ "type": "boolean",
475
+ "default": false,
476
+ "description": "True when spend is token-derived rather than natively reported."
477
+ },
478
+ "source": {
479
+ "type": "string",
480
+ "enum": [
481
+ "decision",
482
+ "events",
483
+ "settings",
484
+ "unknown"
485
+ ],
486
+ "default": "unknown",
487
+ "description": "Where the snapshot came from: the decision record, live events, settings, or unknown."
488
+ },
489
+ "evidence": {
490
+ "type": "string",
491
+ "enum": [
492
+ "complete",
493
+ "incomplete",
494
+ "unavailable"
495
+ ],
496
+ "description": "Integrity of the canonical events this spend fallback read: 'incomplete' when malformed/non-object event lines were skipped, 'unavailable' when the events file was unreadable, else 'complete'. A non-complete value means the projected spend may disagree with disk truth.",
497
+ "default": "complete"
498
+ }
499
+ },
500
+ "additionalProperties": false,
501
+ "description": "Budget snapshot for a run: cap, spend, and provenance."
502
+ },
503
+ {
504
+ "type": "null"
505
+ }
506
+ ],
507
+ "description": "Run budget snapshot (cash + subscription valuation, QA-023c); null when unavailable.",
508
+ "default": null
224
509
  }
225
510
  },
226
511
  "required": [
@@ -85,7 +85,11 @@
85
85
  "stuck_no_progress",
86
86
  "wall_clock_exceeded",
87
87
  "user_cancelled",
88
- "crash_interrupted"
88
+ "crash_interrupted",
89
+ "input_required",
90
+ "work_incomplete",
91
+ "context_capacity_exhausted",
92
+ "work_report_contract"
89
93
  ],
90
94
  "description": "Typed reason qualifying a non-clean terminal; null on a clean success."
91
95
  },
@@ -95,6 +99,82 @@
95
99
  ],
96
100
  "description": "Typed reason qualifying a non-clean terminal; null on a clean success.",
97
101
  "default": null
102
+ },
103
+ "work_state": {
104
+ "type": "object",
105
+ "properties": {
106
+ "state": {
107
+ "type": "string",
108
+ "enum": [
109
+ "completed",
110
+ "needs_input",
111
+ "incomplete",
112
+ "unverified"
113
+ ],
114
+ "description": "Folded work state: the WorkReport state, or unverified when no report was obtainable (transport unsupported / lane gated)."
115
+ },
116
+ "source": {
117
+ "type": "string",
118
+ "enum": [
119
+ "constrained",
120
+ "validated",
121
+ "absent"
122
+ ],
123
+ "description": "Provenance of a WorkReport: constrained (native schema transport), validated (whole-answer JSON), or absent (no transport could carry one — a disclosed absence, not a failure)."
124
+ },
125
+ "required_inputs": {
126
+ "type": "array",
127
+ "items": {
128
+ "type": "object",
129
+ "properties": {
130
+ "kind": {
131
+ "type": "string",
132
+ "enum": [
133
+ "file",
134
+ "context",
135
+ "credential",
136
+ "permission",
137
+ "decision",
138
+ "external_dependency"
139
+ ],
140
+ "description": "Category of a missing input a needs_input/incomplete report lists: a file, additional context, a credential, a permission, a human decision, or an external dependency."
141
+ },
142
+ "locator": {
143
+ "anyOf": [
144
+ {
145
+ "type": "string",
146
+ "maxLength": 512
147
+ },
148
+ {
149
+ "type": "null"
150
+ }
151
+ ],
152
+ "default": null,
153
+ "description": "Concrete pointer to the missing thing (path/url/name); null when unnameable."
154
+ },
155
+ "description": {
156
+ "type": "string",
157
+ "maxLength": 1024,
158
+ "description": "Human-readable description of what is needed and why."
159
+ }
160
+ },
161
+ "required": [
162
+ "kind",
163
+ "description"
164
+ ],
165
+ "additionalProperties": false,
166
+ "description": "One blocking input a needs_input/incomplete WorkReport lists."
167
+ },
168
+ "maxItems": 16,
169
+ "description": "Carried through from a needs_input/incomplete WorkReport for honest disclosure."
170
+ }
171
+ },
172
+ "required": [
173
+ "state",
174
+ "source"
175
+ ],
176
+ "additionalProperties": false,
177
+ "description": "D-16 model-attested work outcome, orthogonal to lifecycle; a needs_input/incomplete state vetoes applyability and exit 0. Absent on runs with no work_report transport."
98
178
  }
99
179
  },
100
180
  "required": [
@@ -196,6 +276,96 @@
196
276
  ],
197
277
  "description": "Derived plan readiness for plan tools (D17); null for non-plan tools.",
198
278
  "default": null
279
+ },
280
+ "council": {
281
+ "anyOf": [
282
+ {
283
+ "type": "object",
284
+ "properties": {
285
+ "requested": {
286
+ "type": "integer",
287
+ "exclusiveMinimum": 0,
288
+ "description": "Requested member count (n; 2..4)."
289
+ },
290
+ "drafted": {
291
+ "type": "integer",
292
+ "minimum": 0,
293
+ "description": "Members whose draft survived to the merge."
294
+ },
295
+ "degraded": {
296
+ "type": "boolean",
297
+ "default": false,
298
+ "description": "True when fewer members drafted than requested (failures disclosed per member)."
299
+ },
300
+ "mergedBy": {
301
+ "type": [
302
+ "string",
303
+ "null"
304
+ ],
305
+ "default": null,
306
+ "description": "Harness that produced the unified plan (the primary); null if the merge failed."
307
+ },
308
+ "members": {
309
+ "type": "array",
310
+ "items": {
311
+ "type": "object",
312
+ "properties": {
313
+ "harnessId": {
314
+ "type": "string",
315
+ "minLength": 1,
316
+ "description": "Harness that drafted (or merged) this member's plan."
317
+ },
318
+ "role": {
319
+ "type": "string",
320
+ "enum": [
321
+ "primary",
322
+ "member"
323
+ ],
324
+ "description": "primary = the merger that synthesizes the unified plan; member = draft only."
325
+ },
326
+ "status": {
327
+ "type": "string",
328
+ "enum": [
329
+ "drafted",
330
+ "failed",
331
+ "merged"
332
+ ],
333
+ "description": "drafted = draft landed; merged = this member produced the unified plan; failed."
334
+ },
335
+ "error": {
336
+ "type": [
337
+ "string",
338
+ "null"
339
+ ],
340
+ "default": null,
341
+ "description": "First redacted draft error; null unless the member failed."
342
+ }
343
+ },
344
+ "required": [
345
+ "harnessId",
346
+ "role",
347
+ "status"
348
+ ],
349
+ "additionalProperties": false,
350
+ "description": "One council member's role and draft/merge outcome."
351
+ },
352
+ "default": [],
353
+ "description": "Per-member role and outcome."
354
+ }
355
+ },
356
+ "required": [
357
+ "requested",
358
+ "drafted"
359
+ ],
360
+ "additionalProperties": false,
361
+ "description": "Council membership + merge disclosure for a --council plan run."
362
+ },
363
+ {
364
+ "type": "null"
365
+ }
366
+ ],
367
+ "description": "Council membership + merge disclosure (QA-023b); null for solo/non-plan tools or deferred handles.",
368
+ "default": null
199
369
  }
200
370
  },
201
371
  "required": [
@@ -112,6 +112,32 @@
112
112
  "additionalProperties": false,
113
113
  "default": {},
114
114
  "description": "Safe project routing preference; paid fallback remains user-global."
115
+ },
116
+ "constraints": {
117
+ "type": "object",
118
+ "properties": {
119
+ "protected_paths": {
120
+ "type": "array",
121
+ "items": {
122
+ "type": "string",
123
+ "minLength": 1,
124
+ "allOf": [
125
+ {
126
+ "pattern": "\\S"
127
+ },
128
+ {
129
+ "pattern": "^(?!\\/)(?![A-Za-z]:)(?!.*\\\\)(?!.*\\0)(?!.*\\/\\/)(?!.*\\/$)(?!.*(?:^|\\/)\\.\\.?(?:\\/|$))\\S(?:.*\\S)?$"
130
+ }
131
+ ],
132
+ "description": "Canonical repo-relative glob whose matching changes require human approval before apply."
133
+ },
134
+ "default": [],
135
+ "description": "Restriction-only repo-relative globs whose matching changes require a human decision before apply; empty by default."
136
+ }
137
+ },
138
+ "additionalProperties": false,
139
+ "default": {},
140
+ "description": "Safe project restrictions that can only narrow what an unattended run may apply."
115
141
  }
116
142
  },
117
143
  "additionalProperties": false,