@claudexor/schema 1.0.0 → 2.0.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 (248) hide show
  1. package/dist/agent-capabilities.d.ts +88 -16
  2. package/dist/agent-capabilities.d.ts.map +1 -1
  3. package/dist/agent-capabilities.js +49 -18
  4. package/dist/agent-capabilities.js.map +1 -1
  5. package/dist/apply-eligibility.d.ts.map +1 -1
  6. package/dist/apply-eligibility.js +22 -6
  7. package/dist/apply-eligibility.js.map +1 -1
  8. package/dist/attachment.d.ts +113 -48
  9. package/dist/attachment.d.ts.map +1 -1
  10. package/dist/attachment.js +60 -45
  11. package/dist/attachment.js.map +1 -1
  12. package/dist/auth.d.ts +1423 -0
  13. package/dist/auth.d.ts.map +1 -0
  14. package/dist/auth.js +317 -0
  15. package/dist/auth.js.map +1 -0
  16. package/dist/budget.d.ts +133 -16
  17. package/dist/budget.d.ts.map +1 -1
  18. package/dist/budget.js +65 -22
  19. package/dist/budget.js.map +1 -1
  20. package/dist/config.d.ts +449 -115
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +114 -41
  23. package/dist/config.js.map +1 -1
  24. package/dist/context.d.ts +6 -6
  25. package/dist/context.d.ts.map +1 -1
  26. package/dist/context.js +31 -7
  27. package/dist/context.js.map +1 -1
  28. package/dist/control-operation-responses.d.ts +1172 -0
  29. package/dist/control-operation-responses.d.ts.map +1 -0
  30. package/dist/control-operation-responses.js +35 -0
  31. package/dist/control-operation-responses.js.map +1 -0
  32. package/dist/control-run-detail.d.ts +443 -242
  33. package/dist/control-run-detail.d.ts.map +1 -1
  34. package/dist/control-run-detail.js +72 -17
  35. package/dist/control-run-detail.js.map +1 -1
  36. package/dist/control-run-retry.d.ts +88 -0
  37. package/dist/control-run-retry.d.ts.map +1 -0
  38. package/dist/control-run-retry.js +40 -0
  39. package/dist/control-run-retry.js.map +1 -0
  40. package/dist/control-run-scope.d.ts +25 -0
  41. package/dist/control-run-scope.d.ts.map +1 -0
  42. package/dist/control-run-scope.js +22 -0
  43. package/dist/control-run-scope.js.map +1 -0
  44. package/dist/control-secret.d.ts +90 -0
  45. package/dist/control-secret.d.ts.map +1 -0
  46. package/dist/control-secret.js +35 -0
  47. package/dist/control-secret.js.map +1 -0
  48. package/dist/control-spec.d.ts +592 -0
  49. package/dist/control-spec.d.ts.map +1 -0
  50. package/dist/control-spec.js +85 -0
  51. package/dist/control-spec.js.map +1 -0
  52. package/dist/control-thread-apply.d.ts +175 -0
  53. package/dist/control-thread-apply.d.ts.map +1 -0
  54. package/dist/control-thread-apply.js +31 -0
  55. package/dist/control-thread-apply.js.map +1 -0
  56. package/dist/control-trust.d.ts +74 -10
  57. package/dist/control-trust.d.ts.map +1 -1
  58. package/dist/control-trust.js +31 -11
  59. package/dist/control-trust.js.map +1 -1
  60. package/dist/control.d.ts +1391 -878
  61. package/dist/control.d.ts.map +1 -1
  62. package/dist/control.js +468 -310
  63. package/dist/control.js.map +1 -1
  64. package/dist/decision.d.ts +10 -10
  65. package/dist/decision.d.ts.map +1 -1
  66. package/dist/decision.js +62 -15
  67. package/dist/decision.js.map +1 -1
  68. package/dist/delivery.d.ts +99 -0
  69. package/dist/delivery.d.ts.map +1 -0
  70. package/dist/delivery.js +19 -0
  71. package/dist/delivery.js.map +1 -0
  72. package/dist/events.d.ts +25 -2
  73. package/dist/events.d.ts.map +1 -1
  74. package/dist/events.js +25 -4
  75. package/dist/events.js.map +1 -1
  76. package/dist/gate.d.ts +2 -2
  77. package/dist/gate.d.ts.map +1 -1
  78. package/dist/gate.js +25 -5
  79. package/dist/gate.js.map +1 -1
  80. package/dist/harness.d.ts +558 -175
  81. package/dist/harness.d.ts.map +1 -1
  82. package/dist/harness.js +207 -82
  83. package/dist/harness.js.map +1 -1
  84. package/dist/index.d.ts +15 -0
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +15 -0
  87. package/dist/index.js.map +1 -1
  88. package/dist/operation.d.ts +185 -0
  89. package/dist/operation.d.ts.map +1 -0
  90. package/dist/operation.js +50 -0
  91. package/dist/operation.js.map +1 -0
  92. package/dist/orchestrate.d.ts +127 -22
  93. package/dist/orchestrate.d.ts.map +1 -1
  94. package/dist/orchestrate.js +61 -7
  95. package/dist/orchestrate.js.map +1 -1
  96. package/dist/primitives.d.ts.map +1 -1
  97. package/dist/primitives.js +4 -1
  98. package/dist/primitives.js.map +1 -1
  99. package/dist/problem.d.ts +29 -0
  100. package/dist/problem.d.ts.map +1 -0
  101. package/dist/problem.js +17 -0
  102. package/dist/problem.js.map +1 -0
  103. package/dist/project.d.ts +97 -0
  104. package/dist/project.d.ts.map +1 -0
  105. package/dist/project.js +27 -0
  106. package/dist/project.js.map +1 -0
  107. package/dist/quota.d.ts +251 -0
  108. package/dist/quota.d.ts.map +1 -0
  109. package/dist/quota.js +46 -0
  110. package/dist/quota.js.map +1 -0
  111. package/dist/raw.d.ts +195 -0
  112. package/dist/raw.d.ts.map +1 -0
  113. package/dist/raw.js +58 -0
  114. package/dist/raw.js.map +1 -0
  115. package/dist/recovery.d.ts +515 -0
  116. package/dist/recovery.d.ts.map +1 -0
  117. package/dist/recovery.js +93 -0
  118. package/dist/recovery.js.map +1 -0
  119. package/dist/request-requirements.d.ts +36 -0
  120. package/dist/request-requirements.d.ts.map +1 -0
  121. package/dist/request-requirements.js +26 -0
  122. package/dist/request-requirements.js.map +1 -0
  123. package/dist/review.d.ts +26 -26
  124. package/dist/review.d.ts.map +1 -1
  125. package/dist/review.js +50 -10
  126. package/dist/review.js.map +1 -1
  127. package/dist/route.d.ts +10 -10
  128. package/dist/route.d.ts.map +1 -1
  129. package/dist/route.js +19 -4
  130. package/dist/route.js.map +1 -1
  131. package/dist/setup.d.ts +9766 -0
  132. package/dist/setup.d.ts.map +1 -0
  133. package/dist/setup.js +450 -0
  134. package/dist/setup.js.map +1 -0
  135. package/dist/spec.d.ts +174 -57
  136. package/dist/spec.d.ts.map +1 -1
  137. package/dist/spec.js +69 -16
  138. package/dist/spec.js.map +1 -1
  139. package/dist/surface-run-controls.d.ts.map +1 -1
  140. package/dist/surface-run-controls.js +25 -21
  141. package/dist/surface-run-controls.js.map +1 -1
  142. package/dist/task.d.ts +1560 -58
  143. package/dist/task.d.ts.map +1 -1
  144. package/dist/task.js +97 -18
  145. package/dist/task.js.map +1 -1
  146. package/dist/telemetry.d.ts +233 -60
  147. package/dist/telemetry.d.ts.map +1 -1
  148. package/dist/telemetry.js +97 -15
  149. package/dist/telemetry.js.map +1 -1
  150. package/dist/thread.d.ts +68 -41
  151. package/dist/thread.d.ts.map +1 -1
  152. package/dist/thread.js +45 -11
  153. package/dist/thread.js.map +1 -1
  154. package/dist/workproduct.d.ts +3 -3
  155. package/dist/workproduct.d.ts.map +1 -1
  156. package/dist/workproduct.js.map +1 -1
  157. package/dist/workspace.d.ts +1 -1
  158. package/dist/workspace.d.ts.map +1 -1
  159. package/dist/workspace.js +12 -3
  160. package/dist/workspace.js.map +1 -1
  161. package/generated/AgentCapabilityCatalog.schema.json +53 -11
  162. package/generated/BudgetLease.schema.json +55 -6
  163. package/generated/BudgetObservation.schema.json +28 -7
  164. package/generated/ConformanceReport.schema.json +49 -0
  165. package/generated/ControlApplyCheckResponse.schema.json +34 -0
  166. package/generated/ControlArtifactListResponse.schema.json +57 -0
  167. package/generated/ControlAuthReadinessRefreshRequest.schema.json +38 -0
  168. package/generated/ControlAuthReadinessRefreshResponse.schema.json +85 -0
  169. package/generated/ControlDeliveryResponse.schema.json +136 -0
  170. package/generated/ControlHandshakeRequest.schema.json +26 -0
  171. package/generated/ControlHandshakeResponse.schema.json +30 -0
  172. package/generated/ControlHarnessListResponse.schema.json +103 -12
  173. package/generated/ControlHarnessSettingsPatch.schema.json +0 -12
  174. package/generated/ControlJournalEvent.schema.json +42 -0
  175. package/generated/ControlJournalExportReceipt.schema.json +49 -0
  176. package/generated/ControlJournalInspection.schema.json +149 -0
  177. package/generated/ControlJournalQuarantineReceipt.schema.json +55 -0
  178. package/generated/ControlJournalQuarantineRequest.schema.json +24 -0
  179. package/generated/ControlJournalValidation.schema.json +181 -0
  180. package/generated/ControlOperationCatalog.schema.json +128 -0
  181. package/generated/ControlOperationDescriptor.schema.json +110 -0
  182. package/generated/ControlProblem.schema.json +59 -0
  183. package/generated/ControlProject.schema.json +42 -0
  184. package/generated/ControlProjectListResponse.schema.json +54 -0
  185. package/generated/ControlProjectRegisterRequest.schema.json +19 -0
  186. package/generated/ControlProjectRelinkRequest.schema.json +19 -0
  187. package/generated/ControlQueuedRunInfo.schema.json +4 -2
  188. package/generated/ControlQuotaResponse.schema.json +176 -0
  189. package/generated/ControlResource.schema.json +59 -0
  190. package/generated/ControlRunAgainDraft.schema.json +499 -0
  191. package/generated/ControlRunDetail.schema.json +197 -30
  192. package/generated/ControlRunListResponse.schema.json +797 -0
  193. package/generated/ControlRunRetryResponse.schema.json +54 -0
  194. package/generated/ControlRunStartRequest.schema.json +83 -55
  195. package/generated/ControlRunStartResponse.schema.json +78 -0
  196. package/generated/ControlRunSummary.schema.json +140 -20
  197. package/generated/ControlSecretListResponse.schema.json +8 -14
  198. package/generated/ControlSecretMutationResponse.schema.json +32 -0
  199. package/generated/ControlSecretSetRequest.schema.json +27 -0
  200. package/generated/ControlSettingsSnapshot.schema.json +118 -44
  201. package/generated/ControlSettingsUpdateRequest.schema.json +110 -40
  202. package/generated/ControlSetupJob.schema.json +763 -65
  203. package/generated/ControlSetupJobCreateRequest.schema.json +11 -13
  204. package/generated/ControlSetupJobEvent.schema.json +861 -5
  205. package/generated/ControlSetupJobListFilter.schema.json +35 -0
  206. package/generated/ControlSetupJobListResponse.schema.json +763 -65
  207. package/generated/ControlSetupJobSnapshot.schema.json +870 -0
  208. package/generated/ControlSpecAnswersRequest.schema.json +74 -0
  209. package/generated/ControlSpecQuestionsRequest.schema.json +128 -2
  210. package/generated/ControlSpecSession.schema.json +249 -0
  211. package/generated/ControlSpecSessionListResponse.schema.json +261 -0
  212. package/generated/ControlThread.schema.json +20 -2
  213. package/generated/ControlThreadApplyResponse.schema.json +139 -0
  214. package/generated/ControlThreadDetail.schema.json +32 -4
  215. package/generated/ControlThreadListResponse.schema.json +20 -2
  216. package/generated/ControlThreadTurnRequest.schema.json +373 -0
  217. package/generated/ControlThreadTurnResponse.schema.json +73 -0
  218. package/generated/ControlThreadUpdateRequest.schema.json +1 -1
  219. package/generated/ControlTrustListResponse.schema.json +6 -0
  220. package/generated/ControlTrustState.schema.json +6 -0
  221. package/generated/ControlTrustUpdateRequest.schema.json +65 -3
  222. package/generated/ControlUploadCreateRequest.schema.json +37 -0
  223. package/generated/ControlUploadFinalizeRequest.schema.json +17 -0
  224. package/generated/ControlUploadStatus.schema.json +40 -0
  225. package/generated/DecisionRecord.schema.json +6 -3
  226. package/generated/GlobalConfig.schema.json +105 -58
  227. package/generated/HarnessEvent.schema.json +201 -10
  228. package/generated/HarnessManifest.schema.json +63 -12
  229. package/generated/HarnessStatusDto.schema.json +103 -12
  230. package/generated/OrchestrateContract.schema.json +32 -6
  231. package/generated/OrchestratePlan.schema.json +20 -0
  232. package/generated/OrchestratePlanProgress.schema.json +61 -0
  233. package/generated/PaidBudget.schema.json +42 -0
  234. package/generated/Project.schema.json +45 -0
  235. package/generated/ProjectConfig.schema.json +45 -18
  236. package/generated/RawContextPacket.schema.json +184 -0
  237. package/generated/RawGitPatchEnvelope.schema.json +70 -0
  238. package/generated/RunTelemetry.schema.json +80 -0
  239. package/generated/SecretMetadata.schema.json +4 -7
  240. package/generated/SpecPack.schema.json +118 -7
  241. package/generated/TaskContract.schema.json +159 -26
  242. package/generated/TestCommandInvocation.schema.json +45 -0
  243. package/generated/Thread.schema.json +62 -6
  244. package/generated/ThreadTurn.schema.json +24 -11
  245. package/generated/TrustConfig.schema.json +77 -0
  246. package/package.json +1 -1
  247. package/generated/ControlSetupJobConfirmRequest.schema.json +0 -18
  248. package/generated/ControlSpecFreezeRequest.schema.json +0 -83
@@ -0,0 +1,74 @@
1
+ {
2
+ "$ref": "#/definitions/ControlSpecAnswersRequest",
3
+ "definitions": {
4
+ "ControlSpecAnswersRequest": {
5
+ "type": "object",
6
+ "properties": {
7
+ "answers": {
8
+ "type": "array",
9
+ "items": {
10
+ "type": "object",
11
+ "properties": {
12
+ "question_id": {
13
+ "type": "string",
14
+ "minLength": 1,
15
+ "description": "Id of the question being answered."
16
+ },
17
+ "option_ids": {
18
+ "type": "array",
19
+ "items": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "description": "Non-empty identifier string."
23
+ },
24
+ "default": [],
25
+ "description": "Ids of the selected options."
26
+ },
27
+ "text": {
28
+ "type": [
29
+ "string",
30
+ "null"
31
+ ],
32
+ "default": null,
33
+ "description": "Free-text answer; null when only options were selected."
34
+ }
35
+ },
36
+ "required": [
37
+ "question_id"
38
+ ],
39
+ "additionalProperties": false,
40
+ "description": "The user's answer to one interview question."
41
+ },
42
+ "description": "Answers for the current interview tier."
43
+ },
44
+ "priorDecisions": {
45
+ "type": "array",
46
+ "items": {
47
+ "type": "object",
48
+ "properties": {
49
+ "question": {
50
+ "type": "string",
51
+ "description": "Question asked in a prior tier."
52
+ },
53
+ "answer": {
54
+ "type": "string",
55
+ "description": "The user's answer."
56
+ }
57
+ },
58
+ "required": [
59
+ "question",
60
+ "answer"
61
+ ],
62
+ "additionalProperties": false
63
+ }
64
+ }
65
+ },
66
+ "required": [
67
+ "answers"
68
+ ],
69
+ "additionalProperties": false,
70
+ "description": "Answers recorded against a durable spec session."
71
+ }
72
+ },
73
+ "$schema": "http://json-schema.org/draft-07/schema#"
74
+ }
@@ -6,6 +6,7 @@
6
6
  "properties": {
7
7
  "prompt": {
8
8
  "type": "string",
9
+ "minLength": 1,
9
10
  "description": "The user's request the interview is clarifying."
10
11
  },
11
12
  "scope": {
@@ -45,6 +46,131 @@
45
46
  },
46
47
  "description": "Harnesses eligible to generate the questions."
47
48
  },
49
+ "n": {
50
+ "type": "integer",
51
+ "exclusiveMinimum": 0
52
+ },
53
+ "effort": {
54
+ "type": "string",
55
+ "enum": [
56
+ "low",
57
+ "medium",
58
+ "high",
59
+ "xhigh",
60
+ "max"
61
+ ],
62
+ "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."
63
+ },
64
+ "paidBudget": {
65
+ "anyOf": [
66
+ {
67
+ "type": "object",
68
+ "properties": {
69
+ "kind": {
70
+ "type": "string",
71
+ "const": "unlimited"
72
+ }
73
+ },
74
+ "required": [
75
+ "kind"
76
+ ],
77
+ "additionalProperties": false
78
+ },
79
+ {
80
+ "type": "object",
81
+ "properties": {
82
+ "kind": {
83
+ "type": "string",
84
+ "const": "finite"
85
+ },
86
+ "maxUsd": {
87
+ "type": "number",
88
+ "minimum": 0
89
+ }
90
+ },
91
+ "required": [
92
+ "kind",
93
+ "maxUsd"
94
+ ],
95
+ "additionalProperties": false
96
+ }
97
+ ],
98
+ "description": "Incremental-cash budget: explicitly unlimited or a finite non-negative USD cap."
99
+ },
100
+ "web": {
101
+ "type": "string",
102
+ "enum": [
103
+ "off",
104
+ "auto",
105
+ "cached",
106
+ "live"
107
+ ],
108
+ "description": "External web/context policy for a run: off (no external context), auto (engine decides), cached (cached sources only), live (live web access). Separate from process/network sandboxing."
109
+ },
110
+ "reviewerModels": {
111
+ "type": "object",
112
+ "additionalProperties": {
113
+ "$ref": "#/definitions/ControlSpecQuestionsRequest/properties/harnesses/items"
114
+ },
115
+ "propertyNames": {
116
+ "enum": [
117
+ "openai",
118
+ "anthropic",
119
+ "google",
120
+ "cursor",
121
+ "opencode",
122
+ "xai",
123
+ "local",
124
+ "unknown"
125
+ ]
126
+ }
127
+ },
128
+ "reviewerEfforts": {
129
+ "type": "object",
130
+ "additionalProperties": {
131
+ "$ref": "#/definitions/ControlSpecQuestionsRequest/properties/effort"
132
+ },
133
+ "propertyNames": {
134
+ "enum": [
135
+ "openai",
136
+ "anthropic",
137
+ "google",
138
+ "cursor",
139
+ "opencode",
140
+ "xai",
141
+ "local",
142
+ "unknown"
143
+ ]
144
+ }
145
+ },
146
+ "reviewerPanel": {
147
+ "type": "array",
148
+ "items": {
149
+ "type": "object",
150
+ "properties": {
151
+ "harness": {
152
+ "type": "string",
153
+ "minLength": 1,
154
+ "pattern": "\\S",
155
+ "description": "Explicit reviewer harness id; repeated harness ids are allowed so one provider can review through multiple requested models."
156
+ },
157
+ "model": {
158
+ "$ref": "#/definitions/ControlSpecQuestionsRequest/properties/harnesses/items",
159
+ "description": "Per-reviewer model hint, passed to that harness only."
160
+ },
161
+ "effort": {
162
+ "$ref": "#/definitions/ControlSpecQuestionsRequest/properties/effort",
163
+ "description": "Per-reviewer effort hint, passed to that harness only."
164
+ }
165
+ },
166
+ "required": [
167
+ "harness"
168
+ ],
169
+ "additionalProperties": false,
170
+ "description": "One reviewer of an explicit reviewer panel."
171
+ },
172
+ "minItems": 1
173
+ },
48
174
  "priorDecisions": {
49
175
  "type": "array",
50
176
  "items": {
@@ -65,7 +191,7 @@
65
191
  ],
66
192
  "additionalProperties": false
67
193
  },
68
- "description": "Already-answered decisions from prior tiers, carried so each round goes deeper instead of re-asking."
194
+ "description": "Prior-tier decisions carried into the next interview tier."
69
195
  }
70
196
  },
71
197
  "required": [
@@ -73,7 +199,7 @@
73
199
  "scope"
74
200
  ],
75
201
  "additionalProperties": false,
76
- "description": "Request body to generate the next tier of spec interview questions."
202
+ "description": "Request to create a durable spec interview session."
77
203
  }
78
204
  },
79
205
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -0,0 +1,249 @@
1
+ {
2
+ "$ref": "#/definitions/ControlSpecSession",
3
+ "definitions": {
4
+ "ControlSpecSession": {
5
+ "type": "object",
6
+ "properties": {
7
+ "sessionId": {
8
+ "type": "string",
9
+ "minLength": 1,
10
+ "pattern": "\\S",
11
+ "description": "User-supplied string that must contain visible content, not just whitespace."
12
+ },
13
+ "prompt": {
14
+ "type": "string"
15
+ },
16
+ "scope": {
17
+ "type": "object",
18
+ "properties": {
19
+ "kind": {
20
+ "type": "string",
21
+ "const": "project"
22
+ },
23
+ "root": {
24
+ "type": "string"
25
+ },
26
+ "context": {
27
+ "type": "string",
28
+ "enum": [
29
+ "auto"
30
+ ],
31
+ "description": "Project context depth; auto is the only mode."
32
+ }
33
+ },
34
+ "required": [
35
+ "kind",
36
+ "root",
37
+ "context"
38
+ ],
39
+ "additionalProperties": false
40
+ },
41
+ "state": {
42
+ "type": "string",
43
+ "enum": [
44
+ "grounding",
45
+ "questions",
46
+ "answered",
47
+ "freezing",
48
+ "frozen",
49
+ "cancelled",
50
+ "failed",
51
+ "interrupted_unknown"
52
+ ]
53
+ },
54
+ "planRunId": {
55
+ "type": [
56
+ "string",
57
+ "null"
58
+ ]
59
+ },
60
+ "questions": {
61
+ "type": "array",
62
+ "items": {
63
+ "type": "object",
64
+ "properties": {
65
+ "id": {
66
+ "type": "string",
67
+ "minLength": 1,
68
+ "description": "Question id."
69
+ },
70
+ "tier": {
71
+ "type": "integer",
72
+ "minimum": 0,
73
+ "default": 0,
74
+ "description": "Hierarchical depth of the question (0 = foundational)."
75
+ },
76
+ "prompt": {
77
+ "type": "string",
78
+ "description": "The question text shown to the user."
79
+ },
80
+ "kind": {
81
+ "type": "string",
82
+ "enum": [
83
+ "single",
84
+ "multi",
85
+ "text"
86
+ ],
87
+ "description": "Answer shape of an interview question: single choice, multiple choice, or free text.",
88
+ "default": "single"
89
+ },
90
+ "options": {
91
+ "type": "array",
92
+ "items": {
93
+ "type": "object",
94
+ "properties": {
95
+ "id": {
96
+ "type": "string",
97
+ "minLength": 1,
98
+ "description": "Option id."
99
+ },
100
+ "label": {
101
+ "type": "string",
102
+ "description": "Human-readable option label."
103
+ }
104
+ },
105
+ "required": [
106
+ "id",
107
+ "label"
108
+ ],
109
+ "additionalProperties": false,
110
+ "description": "One selectable option of an interview question."
111
+ },
112
+ "default": [],
113
+ "description": "Selectable options; empty for pure free-text questions."
114
+ },
115
+ "allow_text": {
116
+ "type": "boolean",
117
+ "default": false,
118
+ "description": "Whether free-text is accepted in addition to or instead of options."
119
+ },
120
+ "rationale": {
121
+ "type": "string",
122
+ "description": "Why this question matters for the spec."
123
+ }
124
+ },
125
+ "required": [
126
+ "id",
127
+ "prompt"
128
+ ],
129
+ "additionalProperties": false,
130
+ "description": "One quiz card of the spec interview."
131
+ }
132
+ },
133
+ "answers": {
134
+ "type": "array",
135
+ "items": {
136
+ "type": "object",
137
+ "properties": {
138
+ "question_id": {
139
+ "type": "string",
140
+ "minLength": 1,
141
+ "description": "Id of the question being answered."
142
+ },
143
+ "option_ids": {
144
+ "type": "array",
145
+ "items": {
146
+ "type": "string",
147
+ "minLength": 1,
148
+ "description": "Non-empty identifier string."
149
+ },
150
+ "default": [],
151
+ "description": "Ids of the selected options."
152
+ },
153
+ "text": {
154
+ "type": [
155
+ "string",
156
+ "null"
157
+ ],
158
+ "default": null,
159
+ "description": "Free-text answer; null when only options were selected."
160
+ }
161
+ },
162
+ "required": [
163
+ "question_id"
164
+ ],
165
+ "additionalProperties": false,
166
+ "description": "The user's answer to one interview question."
167
+ }
168
+ },
169
+ "priorDecisions": {
170
+ "type": "array",
171
+ "items": {
172
+ "type": "object",
173
+ "properties": {
174
+ "question": {
175
+ "type": "string",
176
+ "description": "Question asked in a prior tier."
177
+ },
178
+ "answer": {
179
+ "type": "string",
180
+ "description": "The user's answer."
181
+ }
182
+ },
183
+ "required": [
184
+ "question",
185
+ "answer"
186
+ ],
187
+ "additionalProperties": false
188
+ }
189
+ },
190
+ "specId": {
191
+ "type": [
192
+ "string",
193
+ "null"
194
+ ]
195
+ },
196
+ "specDir": {
197
+ "type": [
198
+ "string",
199
+ "null"
200
+ ]
201
+ },
202
+ "specPath": {
203
+ "type": [
204
+ "string",
205
+ "null"
206
+ ]
207
+ },
208
+ "specHash": {
209
+ "type": [
210
+ "string",
211
+ "null"
212
+ ]
213
+ },
214
+ "error": {
215
+ "type": [
216
+ "string",
217
+ "null"
218
+ ]
219
+ },
220
+ "createdAt": {
221
+ "type": "string"
222
+ },
223
+ "updatedAt": {
224
+ "type": "string"
225
+ }
226
+ },
227
+ "required": [
228
+ "sessionId",
229
+ "prompt",
230
+ "scope",
231
+ "state",
232
+ "planRunId",
233
+ "questions",
234
+ "answers",
235
+ "priorDecisions",
236
+ "specId",
237
+ "specDir",
238
+ "specPath",
239
+ "specHash",
240
+ "error",
241
+ "createdAt",
242
+ "updatedAt"
243
+ ],
244
+ "additionalProperties": false,
245
+ "description": "Durable public projection of a spec interview session."
246
+ }
247
+ },
248
+ "$schema": "http://json-schema.org/draft-07/schema#"
249
+ }