ultra-builder-pro-cli 0.23.0 → 0.24.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 (95) hide show
  1. package/.ultra-template/docs/research/README.md +4 -4
  2. package/.ultra-template/tasks/tasks.json +4 -2
  3. package/CHANGELOG.md +72 -0
  4. package/README.md +55 -39
  5. package/adapters/_shared/codex-assets.cjs +121 -65
  6. package/adapters/_shared/interaction-contract.cjs +7 -1
  7. package/adapters/_shared/provenance.cjs +7 -2
  8. package/adapters/_shared/runtime-assets.cjs +3 -2
  9. package/adapters/_shared/runtime-native.cjs +132 -0
  10. package/adapters/claude.js +60 -30
  11. package/adapters/codex.js +178 -81
  12. package/adapters/grok.js +372 -0
  13. package/adapters/kimi.js +7 -3
  14. package/adapters/opencode.js +210 -32
  15. package/agents/code-reviewer.md +4 -2
  16. package/agents/debugger.md +4 -1
  17. package/agents/review-code.md +7 -3
  18. package/agents/review-comments.md +7 -4
  19. package/agents/review-coordinator.md +11 -7
  20. package/agents/review-design.md +8 -4
  21. package/agents/review-errors.md +8 -4
  22. package/agents/review-spec.md +8 -5
  23. package/agents/review-tests.md +7 -4
  24. package/agents/tdd-runner.md +5 -2
  25. package/bin/install.js +9 -4
  26. package/bin/orchestrator.js +4 -13
  27. package/docs/AGENT-CONTEXT.md +143 -229
  28. package/docs/ARCHITECTURE.md +205 -494
  29. package/docs/ARTIFACT-AUTHORITY.md +35 -28
  30. package/docs/LEGACY-CLI-CROSSWALK.md +1 -1
  31. package/docs/PLUGIN-ISOLATION-CONTRACT.md +12 -9
  32. package/docs/ROADMAP.md +85 -110
  33. package/docs/RUNTIME-COMPAT-MATRIX.md +139 -175
  34. package/docs/SKILL-AUTHORING.md +3 -3
  35. package/docs/STATE-DB-ACCESS-POLICY.md +13 -8
  36. package/docs/WORKFLOW-LIFECYCLE.md +189 -448
  37. package/hooks/README.md +11 -8
  38. package/hooks/active_task_context.py +16 -16
  39. package/hooks/adapters/grok.py +134 -0
  40. package/hooks/{context_spine.py → context_envelope.py} +26 -22
  41. package/hooks/health_check.py +29 -34
  42. package/hooks/pre_stop_check.py +22 -12
  43. package/hooks/subagent_tracker.py +1 -1
  44. package/hooks/workflow_checkpoint.py +14 -13
  45. package/hooks/workflow_context.py +11 -12
  46. package/hooks/workflow_resume.py +14 -13
  47. package/mcp-server/{breadcrumb.cjs → hook-context.cjs} +7 -9
  48. package/mcp-server/lib/baseline-workflow.cjs +108 -82
  49. package/mcp-server/lib/canonical-json.cjs +19 -0
  50. package/mcp-server/lib/change-authority.cjs +26 -0
  51. package/mcp-server/lib/change-workflow.cjs +630 -45
  52. package/mcp-server/lib/context-envelope.cjs +508 -0
  53. package/mcp-server/lib/decision-records.cjs +337 -0
  54. package/mcp-server/lib/doctor.cjs +91 -33
  55. package/mcp-server/lib/init-project.cjs +78 -39
  56. package/mcp-server/lib/managed-file-write.cjs +116 -0
  57. package/mcp-server/lib/plan-checkpoint.cjs +177 -0
  58. package/mcp-server/lib/project-context.cjs +178 -0
  59. package/mcp-server/lib/stage-checkpoints.cjs +309 -0
  60. package/mcp-server/lib/state-db.cjs +155 -24
  61. package/mcp-server/lib/state-ops.cjs +21 -3
  62. package/mcp-server/lib/task-ledger.cjs +522 -13
  63. package/mcp-server/lib/ultra-facade.cjs +757 -442
  64. package/mcp-server/lib/worker-packet.cjs +358 -0
  65. package/mcp-server/server.cjs +200 -1103
  66. package/orchestrator/daemon.cjs +27 -9
  67. package/orchestrator/parallel-orchestrator.cjs +111 -76
  68. package/orchestrator/session-runner.cjs +135 -34
  69. package/package.json +10 -3
  70. package/skills/ultra-change/SKILL.md +10 -8
  71. package/skills/ultra-deliver/SKILL.md +17 -19
  72. package/skills/ultra-dev/SKILL.md +20 -11
  73. package/skills/ultra-doctor/SKILL.md +4 -4
  74. package/skills/ultra-init/SKILL.md +6 -5
  75. package/skills/ultra-init/references/brownfield-adoption.md +20 -14
  76. package/skills/ultra-plan/SKILL.md +13 -9
  77. package/skills/ultra-research/SKILL.md +18 -9
  78. package/skills/ultra-review/SKILL.md +14 -9
  79. package/skills/ultra-review/references/unified-schema.md +2 -0
  80. package/skills/ultra-review/scripts/review_wait.py +8 -0
  81. package/skills/ultra-status/SKILL.md +2 -2
  82. package/skills/ultra-test/SKILL.md +10 -6
  83. package/skills/ultra-think/SKILL.md +8 -7
  84. package/skills/ultra-think/references/interaction-boundary.md +56 -0
  85. package/spec/cli-protocol.md +80 -199
  86. package/spec/mcp-tools.yaml +43 -2806
  87. package/spec/schemas/state-db.sql +107 -4
  88. package/spec/schemas/{task-ledger.v1.schema.json → task-ledger.v2.schema.json} +70 -6
  89. package/ultra-tools/commands/status.cjs +369 -243
  90. package/mcp-server/lib/context-spine.cjs +0 -1208
  91. package/mcp-server/lib/decision-dialogue.cjs +0 -1128
  92. package/mcp-server/lib/project-breadcrumb.cjs +0 -173
  93. package/mcp-server/lib/spec-learning.cjs +0 -284
  94. package/mcp-server/lib/workflow-state.cjs +0 -3129
  95. package/skills/ultra-think/references/decision-dialogue.md +0 -155
@@ -3,41 +3,33 @@
3
3
  # Validated by spec/schemas/mcp-tools.schema.json (run `npm run test:spec`).
4
4
  # Current authority boundary: docs/DECISIONS.md.
5
5
 
6
- version: '1.3'
6
+ version: '2.0'
7
7
 
8
8
  info:
9
9
  title: Ultra Builder Pro MCP tool contracts
10
- phase: '1.2'
10
+ phase: '24'
11
11
  trace_to: 'docs/DECISIONS.md and mcp-server/server.cjs'
12
12
  notes: |
13
13
  This published contract contains only tools registered by the MCP server.
14
14
  Host-native review, impact, skill discovery, and human-interaction capabilities
15
15
  are documented by each adapter's capability map rather than advertised as MCP.
16
- Generators consume this YAML to derive types, validators, and CLI parsers (R19).
17
- cli_subcommand values reserve stable names; runtime availability is defined by
18
- ultra-tools <family> --help. Task lifecycle skills use MCP and fail closed.
16
+ Generators consume this YAML to derive types, validators, and CLI parsers.
17
+ cli_subcommand values reserve stable names. Skills adapt semantic workflows;
18
+ MCP persists facts, creates immutable checkpoints, and protects only transactional
19
+ safety boundaries.
19
20
  Adding a tool requires: (a) update this file, (b) add valid+invalid
20
21
  fixture to spec/fixtures/{valid,invalid}/, (c) `npm run test:spec` green.
21
22
 
22
23
  families:
23
- - { name: ultra, description: 'narrow model-facing persistence and safety kernel', phase: '23' }
24
- - { name: task, description: 'authoritative task lifecycle on state.db', phase: '2' }
25
- - { name: session, description: 'execution-unit lifecycle with single-active-lease admission (D33)', phase: '4.5' }
26
- - { name: plan, description: 'execution-plan artifact export and query (D34)', phase: '8a' }
27
- - { name: baseline, description: 'project adoption, baseline evidence, convergence, and drift authority', phase: '11' }
28
- - { name: change, description: 'continuous post-delivery change lifecycle and convergence', phase: '9' }
29
- - { name: decision, description: 'durable owner-agent alignment, one-question presentation, and approved checkpoints', phase: '16' }
30
- - { name: workflow, description: 'durable cross-stage run position, evidence, outputs, blockers, and recovery', phase: '13' }
31
- - { name: artifact, description: 'typed semantic and evidence artifact ownership, digest, provenance, and dependency graph', phase: '20' }
32
- - { name: system, description: 'read-only diagnostics and explicit backup-first repair', phase: '9' }
24
+ - { name: ultra, description: 'model-facing persistence and safety kernel', phase: '24' }
33
25
 
34
26
  tools:
35
27
 
36
28
  # ───────────────────── public model-facing kernel ─────────────────────
37
29
  - name: ultra.context
38
30
  family: ultra
39
- description: Read the complete current Ultra spine and optionally compile one stage-scoped Context Manifest. This tool reports warnings and blockers without choosing the next semantic action.
40
- phase: '23'
31
+ description: Read one bounded canonical Context Envelope. This tool is side-effect free and reports diagnostics without choosing the next semantic action.
32
+ phase: '24'
41
33
  readonly: true
42
34
  writer_role: mcp
43
35
  input_schema:
@@ -61,7 +53,7 @@ tools:
61
53
  - name: ultra.record
62
54
  family: ultra
63
55
  description: Record one or more typed draft facts or actions with per-entry idempotency. Semantic rejections are returned as mutable diagnostics rather than transport errors.
64
- phase: '23'
56
+ phase: '24'
65
57
  writer_role: mcp
66
58
  input_schema:
67
59
  type: object
@@ -73,10 +65,29 @@ tools:
73
65
  minItems: 1
74
66
  items:
75
67
  type: object
76
- required: [operation, data, idempotency_key]
68
+ required: [kind, action, data, idempotency_key]
77
69
  additionalProperties: false
78
70
  properties:
79
- operation: { type: string, minLength: 3 }
71
+ kind:
72
+ type: string
73
+ enum: [baseline, change_contract, decision, task_contract, task_outcome, artifact, event]
74
+ action:
75
+ type: string
76
+ enum:
77
+ - initialize
78
+ - start
79
+ - observe
80
+ - accept
81
+ - open
82
+ - revise
83
+ - cancel
84
+ - define
85
+ - remove
86
+ - complete
87
+ - block
88
+ - reopen
89
+ - bind
90
+ - append
80
91
  data: { type: object }
81
92
  idempotency_key: { type: string, minLength: 3 }
82
93
  output_schema: { type: object }
@@ -89,8 +100,8 @@ tools:
89
100
 
90
101
  - name: ultra.checkpoint
91
102
  family: ultra
92
- description: Attempt one semantic stage checkpoint. Failed semantic checks return blockers and leave the draft mutable; accepted checkpoints commit durable authority once.
93
- phase: '23'
103
+ description: Commit one caller-declared stage checkpoint after validating scope, structure, idempotency, current file bytes, digests, and transactional publication. Semantic completeness remains a Skill/model judgment and is returned only as advisory diagnostics.
104
+ phase: '24'
94
105
  writer_role: mcp
95
106
  input_schema:
96
107
  type: object
@@ -111,20 +122,24 @@ tools:
111
122
  - { code: VALIDATION_ERROR, description: 'input failed structural validation' }
112
123
  - { code: STATE_CORRUPT, description: 'local authority cannot be checkpointed safely' }
113
124
  - { code: PATH_AUTHORITY_VIOLATION, description: 'checkpoint evidence escapes managed authority' }
125
+ - { code: CHECKPOINT_EVIDENCE_AUTHORITY_MISSING, description: 'declared checkpoint evidence is not current managed authority' }
126
+ - { code: CHECKPOINT_EVIDENCE_DIGEST_MISMATCH, description: 'declared checkpoint evidence bytes changed' }
127
+ - { code: CHECKPOINT_SCOPE_NOT_FOUND, description: 'the explicit Task or Change scope does not exist' }
128
+ - { code: CHECKPOINT_SCOPE_MISMATCH, description: 'the explicit Task does not belong to the supplied Change scope' }
114
129
  cli_subcommand: 'ultra checkpoint'
115
130
  emits_events: [ultra_checkpoint_accepted, ultra_checkpoint_rejected]
116
131
 
117
132
  - name: ultra.sync
118
133
  family: ultra
119
134
  description: Inspect, import, or publish the Git team checkpoint while preserving local sessions and rejecting real concurrent team-state conflicts.
120
- phase: '23'
135
+ phase: '24'
121
136
  writer_role: mcp
122
137
  input_schema:
123
138
  type: object
124
139
  required: [action]
125
140
  additionalProperties: false
126
141
  properties:
127
- action: { type: string, enum: [inspect, import, publish] }
142
+ action: { type: string, enum: [inspect, import, publish, migrate] }
128
143
  reason: { type: string }
129
144
  idempotency_key: { type: string }
130
145
  output_schema: { type: object }
@@ -137,7 +152,7 @@ tools:
137
152
  - name: ultra.session
138
153
  family: ultra
139
154
  description: Acquire, inspect, heartbeat, or release the small execution lease that requires transactional concurrency control.
140
- phase: '23'
155
+ phase: '24'
141
156
  writer_role: mcp
142
157
  input_schema:
143
158
  type: object
@@ -157,8 +172,8 @@ tools:
157
172
 
158
173
  - name: ultra.archive
159
174
  family: ultra
160
- description: Converge and archive one accepted Change through the recoverable filesystem and database transaction boundary.
161
- phase: '23'
175
+ description: Archive one caller-declared local Change handoff through a recoverable filesystem and database transaction. The kernel validates authority, paths, digests, reconciliation structure, and recovery safety without requiring a fixed semantic stage sequence.
176
+ phase: '24'
162
177
  writer_role: mcp
163
178
  input_schema:
164
179
  type: object
@@ -178,7 +193,7 @@ tools:
178
193
  - name: ultra.doctor
179
194
  family: ultra
180
195
  description: Inspect mechanical health and optionally apply only backup-first deterministic repairs. Semantic choices remain with the model and owner.
181
- phase: '23'
196
+ phase: '24'
182
197
  writer_role: mcp
183
198
  input_schema:
184
199
  type: object
@@ -190,2781 +205,3 @@ tools:
190
205
  - { code: STATE_CORRUPT, description: 'the state database cannot be inspected safely' }
191
206
  - { code: BACKUP_FAILED, description: 'a required recovery backup could not be created' }
192
207
  cli_subcommand: 'ultra doctor'
193
-
194
- # ─────────────────────────── task family ────────────────────────────────
195
- - name: task.create
196
- family: task
197
- description: Create a new task in state.db. Emits task_created event. If `id` is omitted the server mints a uuid. Child tasks inherit the parent's change ownership; conflicting ownership is rejected.
198
- phase: '2'
199
- writer_role: mcp
200
- input_schema:
201
- type: object
202
- required: [title, type, priority]
203
- additionalProperties: false
204
- properties:
205
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$', description: 'optional caller-supplied id; otherwise server mints a uuid' }
206
- title: { type: string, minLength: 3 }
207
- type: { type: string, enum: [architecture, feature, bugfix] }
208
- priority: { type: string, enum: [P0, P1, P2, P3] }
209
- complexity: { type: integer, minimum: 1, maximum: 10 }
210
- estimated_days: { type: number, exclusiveMinimum: 0, description: 'estimated implementation effort in days' }
211
- deps: { type: array, items: { type: string } }
212
- files_modified: { type: array, items: { type: string }, description: 'Phase 8A conflict detection' }
213
- parent_id: { type: string, description: 'Phase 8A.3 parent reference; the child inherits this task change ownership' }
214
- tag: { type: string, description: 'git branch tag (Phase 7.2)' }
215
- trace_to: { type: string, description: 'spec anchor (e.g. spec/mcp-tools.yaml#task.create)' }
216
- outcome: { type: string, minLength: 1, description: 'observable result owned by this task' }
217
- slice_kind: { type: string, enum: [tracer_bullet, expand_contract, integration_checkpoint] }
218
- public_seam: { type: string, minLength: 1, description: 'public or integration seam exercised by the slice' }
219
- verification_command: { type: string, minLength: 1, description: 'exact task-level verification command' }
220
- acceptance:
221
- type: array
222
- minItems: 1
223
- items:
224
- type: object
225
- required: [id, criterion, verification]
226
- additionalProperties: false
227
- properties:
228
- id: { type: string, minLength: 1 }
229
- criterion: { type: string, minLength: 1 }
230
- verification: { type: string, minLength: 1 }
231
- context_refs:
232
- type: array
233
- minItems: 1
234
- items:
235
- type: object
236
- required: [ref, reason]
237
- additionalProperties: false
238
- properties:
239
- ref: { type: string, minLength: 1 }
240
- reason: { type: string, minLength: 1 }
241
- kind: { type: string, enum: [spec, source, test, docs, external], default: source }
242
- required: { type: boolean, default: true }
243
- expected_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
244
- digest: { type: string, pattern: '^[0-9a-f]{64}$', description: 'legacy alias for expected_digest' }
245
- anchor: { type: string, minLength: 1 }
246
- scope: { type: string, minLength: 1 }
247
- freshness_policy: { type: string, enum: [digest, existence, advisory] }
248
- docs_impact:
249
- type: object
250
- required: [status, files, rationale]
251
- additionalProperties: false
252
- properties:
253
- status: { type: string, enum: [unknown, required, none] }
254
- files: { type: array, items: { type: string, minLength: 1 } }
255
- rationale: { type: ['string', 'null'] }
256
- ownership:
257
- type: object
258
- required: [owner]
259
- additionalProperties: false
260
- properties:
261
- owner: { type: string, minLength: 1 }
262
- reviewers: { type: array, items: { type: string, minLength: 1 }, default: [] }
263
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$', description: 'active or blocked continuous change unit owning this task; inherited from parent_id when omitted' }
264
- output_schema:
265
- type: object
266
- required: [id, status, created_at]
267
- additionalProperties: false
268
- properties:
269
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
270
- status: { type: string, enum: [pending] }
271
- created_at: { type: string, format: date-time }
272
- errors:
273
- - { code: VALIDATION_ERROR, description: 'input failed schema validation' }
274
- - { code: DUPLICATE_TASK_ID, description: 'task id already exists' }
275
- - { code: TASK_NOT_FOUND, description: 'parent task does not exist' }
276
- - { code: CHANGE_NOT_FOUND, description: 'assigned change does not exist' }
277
- - { code: CHANGE_NOT_MUTABLE, description: 'assigned change no longer accepts tasks' }
278
- - { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'child ownership conflicts with its parent change' }
279
- - { code: BASELINE_NOT_READY, description: 'ordinary task creation requires a ready baseline or an already-authorized active change' }
280
- - { code: LEGACY_STATE_MIGRATION_REQUIRED, description: 'non-empty v4.4 projection must be migrated before state-backed tools can run' }
281
- - { code: STATE_DB_LOCKED, description: 'database is locked', retriable: true }
282
- cli_subcommand: task create
283
- emits_events: [task_created]
284
- trace_to: '§7.3, §7.1'
285
-
286
- - name: task.update
287
- family: task
288
- description: Patch a task's mutable fields. status transitions enforced server-side.
289
- phase: '2'
290
- writer_role: mcp
291
- input_schema:
292
- type: object
293
- required: [id, patch]
294
- additionalProperties: false
295
- properties:
296
- id: { type: string }
297
- patch:
298
- type: object
299
- additionalProperties: false
300
- properties:
301
- status: { type: string, enum: [pending, in_progress, completed, blocked, expanded] }
302
- priority: { type: string, enum: [P0, P1, P2, P3] }
303
- complexity: { type: integer, minimum: 1, maximum: 10 }
304
- estimated_days: { type: number, exclusiveMinimum: 0 }
305
- deps: { type: array, items: { type: string } }
306
- files_modified: { type: array, items: { type: string } }
307
- session_id: { type: string }
308
- stale: { type: boolean }
309
- tag: { type: string }
310
- trace_to: { type: string }
311
- outcome: { type: string, minLength: 1 }
312
- slice_kind: { type: string, enum: [tracer_bullet, expand_contract, integration_checkpoint] }
313
- public_seam: { type: string, minLength: 1 }
314
- verification_command: { type: string, minLength: 1 }
315
- acceptance: { type: array, items: { type: object } }
316
- context_refs: { type: array, items: { type: object } }
317
- docs_impact: { type: object }
318
- ownership: { type: object }
319
- completion_commit: { type: string, pattern: '^[0-9a-f]{7,40}$' }
320
- change_id: { type: ['string', 'null'], pattern: '^[a-zA-Z0-9_\-]+$' }
321
- output_schema:
322
- type: object
323
- required: [ok, task]
324
- additionalProperties: false
325
- properties:
326
- ok: { type: boolean }
327
- task: { type: object }
328
- errors:
329
- - { code: TASK_NOT_FOUND, description: 'no task with given id' }
330
- - { code: ILLEGAL_STATUS_TRANSITION, description: 'transition rejected by state machine' }
331
- - { code: VALIDATION_ERROR, description: 'patch failed schema validation' }
332
- - { code: CHANGE_NOT_FOUND, description: 'assigned change does not exist' }
333
- - { code: CHANGE_NOT_MUTABLE, description: 'assigned change no longer accepts task updates' }
334
- - { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'task ownership conflicts with its parent or children' }
335
- - { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'task is not executable until its outcome, seam, checks, evidence context, docs impact, ownership, and traceability are complete' }
336
- - { code: TASK_STALE_RECONCILIATION_REQUIRED, description: 'stale can clear only while rebinding and validating the complete task execution contract' }
337
- - { code: LEGACY_STATE_MIGRATION_REQUIRED, description: 'non-empty v4.4 projection must be migrated before state-backed tools can run' }
338
- cli_subcommand: task update
339
- emits_events: [task_started, task_completed, task_blocked, task_stale_marked, task_contract_updated, task_contract_reconciled]
340
- trace_to: '§7.3, §7.2'
341
-
342
- - name: task.list
343
- family: task
344
- description: List tasks filtered by status / tag / time window.
345
- phase: '2'
346
- readonly: true
347
- writer_role: any
348
- input_schema:
349
- type: object
350
- additionalProperties: false
351
- properties:
352
- status: { type: string, enum: [pending, in_progress, completed, blocked, expanded, any] }
353
- tag: { type: string }
354
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
355
- since: { type: string, format: date-time }
356
- limit: { type: integer, minimum: 1, maximum: 1000 }
357
- output_schema:
358
- type: object
359
- required: [tasks, count]
360
- additionalProperties: false
361
- properties:
362
- tasks: { type: array, items: { type: object } }
363
- count: { type: integer, minimum: 0 }
364
- errors:
365
- - { code: VALIDATION_ERROR, description: 'filter failed schema validation' }
366
- - { code: LEGACY_STATE_MIGRATION_REQUIRED, description: 'non-empty v4.4 projection must be migrated before state-backed tools can run' }
367
- cli_subcommand: task list
368
- emits_events: []
369
- trace_to: '§7.3'
370
-
371
- - name: task.get
372
- family: task
373
- description: Fetch one task with its full row.
374
- phase: '2'
375
- readonly: true
376
- writer_role: any
377
- input_schema:
378
- type: object
379
- required: [id]
380
- additionalProperties: false
381
- properties:
382
- id: { type: string }
383
- output_schema:
384
- type: object
385
- required: [task]
386
- additionalProperties: false
387
- properties:
388
- task: { type: object }
389
- errors:
390
- - { code: TASK_NOT_FOUND, description: 'no task with given id' }
391
- cli_subcommand: task get
392
- emits_events: []
393
- trace_to: '§7.3'
394
-
395
- - name: task.ledger_get
396
- family: task
397
- description: Read the Git-facing durable baseline, Change, and task checkpoint ledger and compare it with local SQLite authority.
398
- phase: '21'
399
- readonly: true
400
- writer_role: any
401
- input_schema:
402
- type: object
403
- additionalProperties: false
404
- output_schema:
405
- type: object
406
- required: [ledger, health]
407
- additionalProperties: false
408
- properties:
409
- ledger: { type: ['object', 'null'] }
410
- health: { type: object }
411
- errors:
412
- - { code: TASK_LEDGER_INVALID, description: 'the Git ledger is malformed' }
413
- - { code: TASK_LEDGER_DIGEST_MISMATCH, description: 'ledger content does not match its digest' }
414
- - { code: TASK_LEDGER_UNSAFE, description: 'ledger path is a symlink or non-regular file' }
415
- cli_subcommand: task ledger-get
416
- emits_events: []
417
- trace_to: 'docs/ARTIFACT-AUTHORITY.md#team-task-ledger'
418
-
419
- - name: task.ledger_publish
420
- family: task
421
- description: Publish a low-frequency Git-facing baseline, Change, and task checkpoint from local SQLite authority.
422
- phase: '21'
423
- writer_role: mcp
424
- input_schema:
425
- type: object
426
- additionalProperties: false
427
- properties:
428
- reason:
429
- type: string
430
- minLength: 1
431
- default: manual_checkpoint
432
- output_schema:
433
- type: object
434
- required: [changed, path, generation, state_digest]
435
- additionalProperties: false
436
- properties:
437
- changed: { type: boolean }
438
- path: { type: string }
439
- generation: { type: integer, minimum: 0 }
440
- state_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
441
- migrated_legacy_projection: { type: boolean }
442
- legacy_backup_path: { type: string }
443
- errors:
444
- - { code: TASK_LEDGER_INVALID, description: 'the prior Git ledger is malformed' }
445
- - { code: TASK_LEDGER_DIGEST_MISMATCH, description: 'prior ledger content does not match its digest' }
446
- - { code: TASK_LEDGER_UNSAFE, description: 'ledger path is a symlink or non-regular file' }
447
- - { code: TASK_LEDGER_CHANGE_MISSING, description: 'a task has no portable owning Change' }
448
- - { code: TASK_LEDGER_LEGACY_CONFLICT, description: 'the legacy task projection differs from SQLite authority and cannot be replaced automatically' }
449
- - { code: TASK_LEDGER_REVALIDATION_REQUIRED, description: 'an imported ready baseline must converge in this checkout before publication' }
450
- cli_subcommand: task ledger-publish
451
- emits_events: [task_ledger_published]
452
- trace_to: 'docs/ARTIFACT-AUTHORITY.md#team-task-ledger'
453
-
454
- - name: task.ledger_import
455
- family: task
456
- description: Import a validated Git checkpoint into local SQLite authority with per-baseline, per-Change, and per-task conflict checks.
457
- phase: '21'
458
- writer_role: mcp
459
- input_schema:
460
- type: object
461
- additionalProperties: false
462
- output_schema:
463
- type: object
464
- required: [imported, preserved, deleted, imported_changes, preserved_changes, imported_baseline, preserved_baseline, generation, state_digest, requires_plan_revalidation, requires_baseline_revalidation, already_current]
465
- additionalProperties: false
466
- properties:
467
- imported: { type: integer, minimum: 0 }
468
- preserved: { type: integer, minimum: 0 }
469
- deleted: { type: integer, minimum: 0 }
470
- imported_changes: { type: integer, minimum: 0 }
471
- preserved_changes: { type: integer, minimum: 0 }
472
- imported_baseline: { type: boolean }
473
- preserved_baseline: { type: boolean }
474
- generation: { type: integer, minimum: 0 }
475
- state_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
476
- requires_plan_revalidation: { type: boolean }
477
- requires_baseline_revalidation: { type: boolean }
478
- already_current: { type: boolean }
479
- errors:
480
- - { code: TASK_LEDGER_INVALID, description: 'the Git ledger is malformed' }
481
- - { code: TASK_LEDGER_DIGEST_MISMATCH, description: 'ledger content does not match its digest' }
482
- - { code: TASK_LEDGER_UNSAFE, description: 'ledger path is a symlink or non-regular file' }
483
- - { code: TASK_LEDGER_CONFLICT, description: 'the same task changed locally and in Git' }
484
- - { code: TASK_LEDGER_ACTIVE_TASK_CONFLICT, description: 'Git changed a task with an active local session' }
485
- - { code: TASK_LEDGER_STALE, description: 'the Git ledger is older than the last local checkpoint' }
486
- - { code: TASK_LEDGER_HISTORY_CONFLICT, description: 'the Git ledger does not descend from the last local checkpoint' }
487
- - { code: TASK_LEDGER_CHANGE_MISSING, description: 'a task references an unavailable Change' }
488
- - { code: TASK_LEDGER_PARENT_MISSING, description: 'a task references an unavailable parent task' }
489
- - { code: TASK_LEDGER_CHANGE_CONFLICT, description: 'the same Change changed locally and in Git' }
490
- - { code: TASK_LEDGER_BASELINE_CONFLICT, description: 'the same baseline changed locally and in Git' }
491
- cli_subcommand: task ledger-import
492
- emits_events: [task_ledger_imported]
493
- trace_to: 'docs/ARTIFACT-AUTHORITY.md#team-task-ledger'
494
-
495
- - name: task.switch_tag
496
- family: task
497
- description: Change a task's tag (branch-scoped context partition, Phase 7.2). Emits task_tag_changed.
498
- phase: '7.2'
499
- writer_role: mcp
500
- input_schema:
501
- type: object
502
- required: [id, tag]
503
- additionalProperties: false
504
- properties:
505
- id: { type: string }
506
- tag: { type: ['string', 'null'] }
507
- output_schema:
508
- type: object
509
- required: [task_id, tag]
510
- additionalProperties: false
511
- properties:
512
- task_id: { type: string }
513
- tag: { type: ['string', 'null'] }
514
- from: { type: ['string', 'null'] }
515
- errors:
516
- - { code: TASK_NOT_FOUND, description: 'no task with given id' }
517
- - { code: VALIDATION_ERROR, description: 'task_id missing' }
518
- cli_subcommand: task switch-tag
519
- emits_events: [task_tag_changed]
520
- trace_to: '§6, D26'
521
-
522
- - name: task.delete
523
- family: task
524
- description: Hard-delete a task. Refuses if any in_progress session is bound.
525
- phase: '2'
526
- writer_role: mcp
527
- input_schema:
528
- type: object
529
- required: [id]
530
- additionalProperties: false
531
- properties:
532
- id: { type: string }
533
- force: { type: boolean, default: false }
534
- output_schema:
535
- type: object
536
- required: [ok]
537
- additionalProperties: false
538
- properties:
539
- ok: { type: boolean }
540
- errors:
541
- - { code: TASK_NOT_FOUND, description: 'no task with given id' }
542
- - { code: SESSION_ACTIVE, description: 'task has an active session; pass force=true to override' }
543
- cli_subcommand: task delete
544
- emits_events: []
545
- trace_to: '§7.3'
546
-
547
- - name: task.init_project
548
- family: task
549
- description: |
550
- Bootstrap `.ultra/`, classify the repository, initialize or preserve local
551
- Git authority, and complete the initialization workflow. It creates no
552
- research run; research begins only through an explicit workflow.start.
553
- phase: '3'
554
- writer_role: mcp
555
- input_schema:
556
- type: object
557
- required: [target_dir, project_name]
558
- additionalProperties: false
559
- properties:
560
- target_dir:
561
- type: string
562
- description: absolute or repo-relative path of the project root where `.ultra/` will be created
563
- project_name:
564
- type: string
565
- minLength: 1
566
- project_type:
567
- type: string
568
- enum: [web, api, cli, fullstack, other]
569
- description: optional; skill will pass detected value when available
570
- stack:
571
- type: string
572
- description: optional tech stack descriptor (comma-separated for fullstack)
573
- mode:
574
- type: string
575
- enum: [auto, greenfield, brownfield]
576
- default: auto
577
- description: auto detects whether meaningful project content already exists
578
- git_mode:
579
- type: string
580
- enum: [auto, initialize, skip]
581
- default: auto
582
- description: preserve an existing repository, initialize a missing local repository by default, or explicitly keep a non-Git workspace
583
- resume:
584
- type: boolean
585
- default: false
586
- description: preserve an existing `.ultra/`, upgrade its schema, and install only missing current scaffold files
587
- scope:
588
- type: array
589
- minItems: 1
590
- uniqueItems: true
591
- items: { type: string, minLength: 1 }
592
- default: ['.']
593
- description: project-relative repository roots governed by the initial baseline
594
- overwrite:
595
- type: boolean
596
- default: false
597
- description: when true, back up an existing `.ultra/` to `.ultra.backup.<ts>` then re-create
598
- source_template:
599
- type: string
600
- description: override path to the template root (defaults to bundled templates/.ultra/)
601
- output_schema:
602
- type: object
603
- required: [created_path, state_db_path, status, mode, baseline, copied_files, repository_profile, git, workflow]
604
- additionalProperties: false
605
- properties:
606
- created_path:
607
- type: string
608
- description: absolute path to the created `.ultra/` directory
609
- state_db_path:
610
- type: string
611
- description: absolute path to the initialized authoritative SQLite database
612
- status:
613
- type: string
614
- enum: [created, overwritten, resumed]
615
- mode:
616
- type: string
617
- enum: [greenfield, brownfield]
618
- baseline:
619
- type: object
620
- required: [id, mode, status, scope]
621
- additionalProperties: true
622
- copied_files:
623
- type: array
624
- items: { type: string }
625
- description: paths relative to created_path
626
- repository_profile:
627
- type: object
628
- description: bounded classification evidence used to route greenfield or brownfield adoption
629
- git:
630
- type: object
631
- required: [requested_mode, status, repository_root, branch, head, gitignore_path, gitignore_changed, initial_commit_required]
632
- additionalProperties: false
633
- properties:
634
- requested_mode: { type: string, enum: [auto, initialize, skip] }
635
- status: { type: string, enum: [initialized, existing, skipped] }
636
- repository_root: { type: ['string', 'null'] }
637
- branch: { type: ['string', 'null'] }
638
- head: { type: ['string', 'null'] }
639
- gitignore_path: { type: ['string', 'null'] }
640
- gitignore_changed: { type: boolean }
641
- initial_commit_required: { type: boolean }
642
- workflow:
643
- type: object
644
- description: completed initialization provenance, research status, and the allowed or required transitions
645
- backup_path:
646
- type: string
647
- description: set only when status=overwritten
648
- migration_backup_path:
649
- type: string
650
- description: pre-migration database backup created while resuming an older schema
651
- runtime_migration_backup_path:
652
- type: string
653
- description: verified backup of a legacy runtime layout moved into `.ultra/.runtime/`
654
- team_checkpoint:
655
- type: object
656
- additionalProperties: false
657
- required: [generation, state_digest, imported_tasks, deleted_tasks, imported_changes, imported_baseline, requires_plan_revalidation, requires_baseline_revalidation, already_current]
658
- properties:
659
- generation: { type: integer, minimum: 0 }
660
- state_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
661
- imported_tasks: { type: integer, minimum: 0 }
662
- deleted_tasks: { type: integer, minimum: 0 }
663
- imported_changes: { type: integer, minimum: 0 }
664
- imported_baseline: { type: boolean }
665
- requires_plan_revalidation: { type: boolean }
666
- requires_baseline_revalidation: { type: boolean }
667
- already_current: { type: boolean }
668
- published:
669
- type: boolean
670
- description: true when resume replaced a matching legacy task projection with a new team checkpoint
671
- migrated_legacy_projection:
672
- type: boolean
673
- description: true when the prior tracked file used the supported legacy projection format
674
- legacy_backup_path:
675
- type: string
676
- description: exact-byte backup of the replaced legacy task projection
677
- errors:
678
- - { code: ULTRA_DIR_EXISTS, description: '.ultra/ already exists and overwrite=false' }
679
- - { code: TEMPLATE_MISSING, description: 'source_template path does not exist' }
680
- - { code: TARGET_NOT_DIR, description: 'target_dir is not a directory' }
681
- - { code: BASELINE_SCOPE_MISSING, description: 'a selected baseline scope does not exist' }
682
- - { code: LEGACY_STATE_MIGRATION_REQUIRED, description: 'projection-only tasks must be imported before resume' }
683
- - { code: STATE_AUTHORITY_CONFLICT, description: 'projection tasks and authoritative state cannot be reconciled automatically' }
684
- - { code: STATE_PROJECTION_INVALID, description: 'the existing task projection is malformed' }
685
- - { code: TASK_LEDGER_LEGACY_CONFLICT, description: 'the legacy task projection differs from SQLite authority and cannot be upgraded automatically' }
686
- - { code: GIT_INIT_FAILED, description: 'the local Git repository or Ultra ignore rule could not be initialized' }
687
- - { code: GITIGNORE_UNSAFE, description: 'root .gitignore is a symlink or non-file and cannot be updated safely' }
688
- - { code: GITIGNORE_INEFFECTIVE, description: 'the effective Git rules still expose the `.ultra` authority' }
689
- - { code: IO_ERROR, description: 'filesystem write failed', retriable: true }
690
- cli_subcommand: task init-project
691
- emits_events: [project_initialized, project_resumed]
692
- trace_to: 'mcp-server/lib/init-project.cjs'
693
-
694
- - name: task.expand
695
- family: task
696
- description: Validate and atomically persist child tasks derived by the current host from one parent task.
697
- phase: '8a'
698
- writer_role: mcp
699
- input_schema:
700
- type: object
701
- required: [id, children]
702
- additionalProperties: false
703
- properties:
704
- id: { type: string }
705
- children:
706
- type: array
707
- minItems: 1
708
- items:
709
- type: object
710
- required: [id, title, type, priority]
711
- additionalProperties: false
712
- properties:
713
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
714
- title: { type: string, minLength: 3, maxLength: 200 }
715
- type: { type: string, enum: [architecture, feature, bugfix] }
716
- priority: { type: string, enum: [P0, P1, P2, P3] }
717
- complexity: { type: integer, minimum: 1, maximum: 10 }
718
- deps: { type: array, items: { type: string } }
719
- files_modified: { type: array, items: { type: string } }
720
- output_schema:
721
- type: object
722
- required: [parent_id, children]
723
- additionalProperties: false
724
- properties:
725
- parent_id: { type: string }
726
- children: { type: array, items: { type: object } }
727
- errors:
728
- - { code: TASK_NOT_FOUND, description: 'parent id missing' }
729
- - { code: ALREADY_EXPANDED, description: 'task is already expanded' }
730
- - { code: CHANGE_NOT_FOUND, description: 'the parent task change does not exist' }
731
- - { code: CHANGE_NOT_MUTABLE, description: 'the parent task change no longer accepts children' }
732
- - { code: BASELINE_NOT_READY, description: 'child creation requires a ready baseline or the parent task to belong to an already-authorized active change' }
733
- - { code: INVALID_OUTPUT, description: 'the host-derived child task graph is invalid' }
734
- cli_subcommand: task expand
735
- emits_events: [task_expanded]
736
- trace_to: '§7.3, D34'
737
-
738
- - name: task.parse_prd
739
- family: task
740
- description: Validate a host-derived PRD task graph and optionally persist it inside the current plan workflow.
741
- phase: '8a'
742
- writer_role: mcp
743
- input_schema:
744
- type: object
745
- required: [tasks]
746
- additionalProperties: false
747
- properties:
748
- tasks:
749
- type: array
750
- minItems: 1
751
- items:
752
- type: object
753
- required: [id, title, type, priority]
754
- additionalProperties: false
755
- properties:
756
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
757
- title: { type: string, minLength: 3, maxLength: 200 }
758
- type: { type: string, enum: [architecture, feature, bugfix] }
759
- priority: { type: string, enum: [P0, P1, P2, P3] }
760
- complexity: { type: integer, minimum: 1, maximum: 10 }
761
- deps: { type: array, items: { type: string } }
762
- files_modified: { type: array, items: { type: string } }
763
- tag: { type: string }
764
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$', description: 'continuous change unit that will own every persisted parsed task' }
765
- dry_run: { type: boolean, default: false, description: 'when true, validate and preview without persisting to state.db' }
766
- output_schema:
767
- type: object
768
- required: [tasks, topo]
769
- additionalProperties: false
770
- properties:
771
- tasks: { type: array, items: { type: object } }
772
- topo: { type: array, items: { type: array, items: { type: string } } }
773
- errors:
774
- - { code: PARSE_FAILED, description: 'the host-derived PRD task graph is invalid' }
775
- - { code: CYCLE_DETECTED, description: 'the proposed task graph contains a dependency cycle' }
776
- - { code: CHANGE_REQUIRED, description: 'persisting a parsed task graph requires an owning change_id' }
777
- - { code: CHANGE_NOT_FOUND, description: 'assigned change does not exist' }
778
- - { code: CHANGE_NOT_MUTABLE, description: 'assigned change no longer accepts tasks' }
779
- - { code: BASELINE_NOT_READY, description: 'persisting parsed tasks requires a ready baseline or an already-authorized active change' }
780
- cli_subcommand: task parse-prd
781
- emits_events: [task_created]
782
- trace_to: '§7.3, D34'
783
-
784
- - name: task.dependency_topo
785
- family: task
786
- description: Compute topological waves for a set of tasks; consumed by execution-plan.
787
- phase: '8a'
788
- readonly: true
789
- input_schema:
790
- type: object
791
- additionalProperties: false
792
- oneOf:
793
- - required: [task_ids]
794
- - required: [change_id]
795
- properties:
796
- task_ids: { type: array, minItems: 1, uniqueItems: true, items: { type: string } }
797
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
798
- output_schema:
799
- type: object
800
- required: [waves]
801
- additionalProperties: false
802
- properties:
803
- waves: { type: array, items: { type: array, items: { type: string } } }
804
- cycles: { type: array, items: { type: array, items: { type: string } } }
805
- errors:
806
- - { code: CYCLE_DETECTED, description: 'dependency graph has cycles' }
807
- - { code: TASK_NOT_FOUND, description: 'an explicitly requested task does not exist' }
808
- - { code: CHANGE_NOT_FOUND, description: 'the requested owning change does not exist' }
809
- cli_subcommand: task topo
810
- emits_events: []
811
- trace_to: '§7.3, D34'
812
-
813
- - name: task.append_event
814
- family: task
815
- description: Append a non-authoritative observation to the event timeline. Lifecycle events are emitted only by their owning mutation tools. Returns the assigned subscribe cursor.
816
- phase: '2'
817
- writer_role: any
818
- input_schema:
819
- type: object
820
- required: [type]
821
- additionalProperties: false
822
- properties:
823
- task_id: { type: string }
824
- change_id: { type: string }
825
- session_id: { type: string }
826
- runtime: { type: string, enum: [claude, opencode, codex, kimi] }
827
- type:
828
- type: string
829
- enum:
830
- - context_updated
831
- - commit_pushed
832
- - merge_conflict
833
- - cost_alert
834
- - token_alert
835
- - circuit_open
836
- payload: { type: object }
837
- output_schema:
838
- type: object
839
- required: [event_id, ts]
840
- additionalProperties: false
841
- properties:
842
- event_id: { type: integer, minimum: 1 }
843
- ts: { type: string, format: date-time }
844
- errors:
845
- - { code: VALIDATION_ERROR, description: 'event payload failed validation' }
846
- - { code: STATE_DB_LOCKED, description: 'database is locked', retriable: true }
847
- cli_subcommand: task append-event
848
- emits_events: []
849
- trace_to: '§7.2, D31'
850
-
851
- - name: task.subscribe_events
852
- family: task
853
- description: Pull events with id > since_id. Cursor is monotonic (D31, R26).
854
- phase: '2'
855
- readonly: true
856
- input_schema:
857
- type: object
858
- required: [since_id]
859
- additionalProperties: false
860
- properties:
861
- since_id: { type: integer, minimum: 0 }
862
- types: { type: array, items: { type: string } }
863
- task_id: { type: string }
864
- limit: { type: integer, minimum: 1, maximum: 500, default: 100 }
865
- output_schema:
866
- type: object
867
- required: [events, next_since_id]
868
- additionalProperties: false
869
- properties:
870
- events: { type: array, items: { type: object } }
871
- next_since_id: { type: integer, minimum: 0 }
872
- errors:
873
- - { code: VALIDATION_ERROR, description: 'cursor or filter invalid' }
874
- cli_subcommand: task subscribe
875
- emits_events: []
876
- trace_to: '§7.2, D31'
877
-
878
- # ────────────────────────── session family ──────────────────────────────
879
- - name: session.spawn
880
- family: session
881
- description: Admit a plan-authorized execution session, create its isolated Git worktree and artifact directory, and register the lease. Change-owned tasks must retain their complete accepted contract, current completed plan, dependency readiness, and non-stale executable status. The current host launches its bounded worker inside the returned worktree.
882
- phase: '4.5'
883
- writer_role: mcp
884
- input_schema:
885
- type: object
886
- required: [task_id, runtime]
887
- additionalProperties: false
888
- properties:
889
- task_id: { type: string }
890
- runtime: { type: string, enum: [claude, opencode, codex, kimi] }
891
- takeover: { type: boolean, default: false, description: 'override active lease (D33 takeover strategy)' }
892
- worktree_base:
893
- type: string
894
- description: optional path resolving inside the repository `.ultra/.runtime/worktrees` boundary; outside paths are rejected
895
- output_schema:
896
- type: object
897
- required: [sid, worktree_path, artifact_dir, lease_expires_at, worktree_created]
898
- additionalProperties: false
899
- properties:
900
- sid: { type: string }
901
- worktree_path: { type: string }
902
- artifact_dir: { type: string }
903
- lease_expires_at: { type: string, format: date-time }
904
- worktree_created: { type: boolean }
905
- errors:
906
- - { code: TASK_NOT_FOUND, description: 'task id missing' }
907
- - { code: ADMISSION_DENIED, description: 'active lease exists; choose takeover/resume/abandon' }
908
- - { code: SESSION_CLOSE_PENDING, description: 'an unfinished durable close intent must recover before spawn or takeover' }
909
- - { code: NESTED_SESSION_FORBIDDEN, description: 'an active worker must resume its assigned session instead of recursively spawning another one' }
910
- - { code: TAKEOVER_FAILED, description: 'prior owned worker could not be terminated safely' }
911
- - { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'change-owned task contract is incomplete' }
912
- - { code: WORKFLOW_TASK_NOT_EXECUTABLE, description: 'task status or staleness blocks execution' }
913
- - { code: TASK_DEPENDENCIES_INCOMPLETE, description: 'one or more task dependencies have not converged' }
914
- - { code: WORKFLOW_PLAN_NOT_COMPLETED, description: 'owning change has no healthy completed plan workflow' }
915
- - { code: WORKFLOW_PLAN_TASK_SET_STALE, description: 'change task set differs from the current converged plan' }
916
- - { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'task contract differs from the current converged plan' }
917
- - { code: WORKFLOW_PLAN_CONTEXT_STALE, description: 'the planning Context no longer matches the current checkout or required references' }
918
- - { code: WORKFLOW_IMPLEMENTATION_CONTEXT_REQUIRED, description: 'the task has no exact ready implementation Context' }
919
- - { code: WORKFLOW_IMPLEMENTATION_CONTEXT_STALE, description: 'the task implementation Context is stale, blocked, or bound to different authority' }
920
- - { code: WORKTREE_SCOPE_INVALID, description: 'requested worktree base escapes the managed project boundary' }
921
- - { code: WORKTREE_FAILED, description: 'Git worktree creation failed or the repository has no usable HEAD' }
922
- - { code: WORKTREE_AUTHORITY_MISSING, description: 'central `.ultra/.runtime/state.db` disappeared before worktree binding' }
923
- - { code: WORKTREE_AUTHORITY_NOT_IGNORED, description: 'a safe local ignore rule for the `.ultra` authority link could not be established' }
924
- - { code: WORKTREE_AUTHORITY_CONFLICT, description: 'the isolated checkout already contains a conflicting `.ultra` entry' }
925
- - { code: WORKTREE_AUTHORITY_LINK_FAILED, description: 'the isolated checkout could not be linked to central Ultra authority' }
926
- cli_subcommand: session spawn
927
- emits_events: [session_spawned]
928
- trace_to: '§7.3, D20, D33'
929
-
930
- - name: session.close
931
- family: session
932
- description: Close a session and release its lease. Preserve the worktree by default; explicit cleanup succeeds only after Git proves it is clean and integrated.
933
- phase: '4.5'
934
- writer_role: mcp
935
- input_schema:
936
- type: object
937
- required: [sid, status]
938
- additionalProperties: false
939
- properties:
940
- sid: { type: string }
941
- status: { type: string, enum: [completed, crashed] }
942
- remove_worktree: { type: boolean, default: false }
943
- output_schema:
944
- type: object
945
- required: [ok, worktree_preserved]
946
- additionalProperties: false
947
- properties:
948
- ok: { type: boolean }
949
- worktree_preserved: { type: boolean }
950
- errors:
951
- - { code: SESSION_NOT_FOUND, description: 'sid unknown' }
952
- - { code: WORKER_SESSION_PARENT_OWNED, description: 'an active worker must exit and let its supervising parent settle the lease' }
953
- - { code: SESSION_SCOPE_VIOLATION, description: 'an active worker attempted to close a session it does not own' }
954
- - { code: WORKTREE_NOT_INTEGRATED, description: 'Explicit cleanup refused because work is uncommitted, unverified, or not integrated into the current checkout' }
955
- cli_subcommand: session close
956
- emits_events: [session_closed, session_crashed]
957
- trace_to: '§7.3, D32'
958
-
959
- - name: session.get
960
- family: session
961
- description: Fetch a session row.
962
- phase: '4.5'
963
- readonly: true
964
- input_schema:
965
- type: object
966
- required: [sid]
967
- additionalProperties: false
968
- properties:
969
- sid: { type: string }
970
- output_schema:
971
- type: object
972
- required: [session]
973
- additionalProperties: false
974
- properties:
975
- session: { type: object }
976
- errors:
977
- - { code: SESSION_NOT_FOUND, description: 'sid unknown' }
978
- cli_subcommand: session get
979
- emits_events: []
980
- trace_to: '§7.3'
981
-
982
- - name: session.list
983
- family: session
984
- description: List sessions filtered by status (default 'running') and optional task_id. Read-only snapshot for /ultra-status + orchestrator dashboards.
985
- phase: '4.5'
986
- readonly: true
987
- input_schema:
988
- type: object
989
- additionalProperties: false
990
- properties:
991
- status: { type: string, enum: [running, completed, crashed, orphan] }
992
- task_id: { type: string }
993
- limit: { type: integer, minimum: 1, maximum: 500, default: 100 }
994
- output_schema:
995
- type: object
996
- required: [sessions, count]
997
- additionalProperties: false
998
- properties:
999
- sessions: { type: array, items: { type: object } }
1000
- count: { type: integer, minimum: 0 }
1001
- errors:
1002
- - { code: STATE_DB_ERROR, description: 'database unavailable', retriable: true }
1003
- cli_subcommand: session list
1004
- emits_events: []
1005
- trace_to: '§7.3, Phase 4.5.4'
1006
-
1007
- - name: session.admission_check
1008
- family: session
1009
- description: Check the same task, dependency, current-plan, staleness, breaker, and lease gates enforced by session.spawn. Returns a recommended lease action only after workflow authority is executable.
1010
- phase: '4.5'
1011
- readonly: true
1012
- input_schema:
1013
- type: object
1014
- required: [task_id]
1015
- additionalProperties: false
1016
- properties:
1017
- task_id: { type: string }
1018
- runtime: { type: string, enum: [claude, opencode, codex, kimi] }
1019
- output_schema:
1020
- type: object
1021
- required: [can_spawn, recommended_action]
1022
- additionalProperties: false
1023
- properties:
1024
- can_spawn: { type: boolean }
1025
- conflict:
1026
- type: object
1027
- properties:
1028
- sid: { type: string }
1029
- status: { type: string }
1030
- heartbeat_age_ms: { type: integer, minimum: 0 }
1031
- recommended_action:
1032
- type: string
1033
- enum: [spawn, takeover, resume, abandon, recover_close, blocked_by_breaker]
1034
- errors:
1035
- - { code: TASK_NOT_FOUND, description: 'task id missing' }
1036
- - { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'change-owned task contract is incomplete' }
1037
- - { code: WORKFLOW_TASK_NOT_EXECUTABLE, description: 'task status or staleness blocks execution' }
1038
- - { code: TASK_DEPENDENCIES_INCOMPLETE, description: 'one or more task dependencies have not converged' }
1039
- - { code: WORKFLOW_PLAN_NOT_COMPLETED, description: 'owning change has no healthy completed plan workflow' }
1040
- - { code: WORKFLOW_PLAN_TASK_SET_STALE, description: 'change task set differs from the current converged plan' }
1041
- - { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'task contract differs from the current converged plan' }
1042
- - { code: WORKFLOW_PLAN_CONTEXT_STALE, description: 'the planning Context no longer matches the current checkout or required references' }
1043
- - { code: WORKFLOW_IMPLEMENTATION_CONTEXT_REQUIRED, description: 'the task has no exact ready implementation Context' }
1044
- - { code: WORKFLOW_IMPLEMENTATION_CONTEXT_STALE, description: 'the task implementation Context is stale, blocked, or bound to different authority' }
1045
- cli_subcommand: session admission
1046
- emits_events: []
1047
- trace_to: '§7.3, D33'
1048
-
1049
- - name: session.heartbeat
1050
- family: session
1051
- description: Refresh lease for a running session. Lease expires after grace period without heartbeat.
1052
- phase: '4.5'
1053
- writer_role: mcp
1054
- input_schema:
1055
- type: object
1056
- required: [sid]
1057
- additionalProperties: false
1058
- properties:
1059
- sid: { type: string }
1060
- output_schema:
1061
- type: object
1062
- required: [ok, lease_expires_at]
1063
- additionalProperties: false
1064
- properties:
1065
- ok: { type: boolean }
1066
- lease_expires_at: { type: string, format: date-time }
1067
- errors:
1068
- - { code: SESSION_NOT_FOUND, description: 'sid unknown' }
1069
- - { code: LEASE_EXPIRED, description: 'lease already expired; need takeover/resume' }
1070
- cli_subcommand: session heartbeat
1071
- emits_events: [session_heartbeat_lost]
1072
- trace_to: '§7.3, D32'
1073
-
1074
- - name: session.subscribe_events
1075
- family: session
1076
- description: Pull session-related events with cursor.
1077
- phase: '4.5'
1078
- readonly: true
1079
- input_schema:
1080
- type: object
1081
- required: [since_id]
1082
- additionalProperties: false
1083
- properties:
1084
- since_id: { type: integer, minimum: 0 }
1085
- sid: { type: string }
1086
- limit: { type: integer, minimum: 1, maximum: 500, default: 100 }
1087
- output_schema:
1088
- type: object
1089
- required: [events, next_since_id]
1090
- additionalProperties: false
1091
- properties:
1092
- events: { type: array, items: { type: object } }
1093
- next_since_id: { type: integer, minimum: 0 }
1094
- errors:
1095
- - { code: VALIDATION_ERROR, description: 'cursor invalid' }
1096
- cli_subcommand: session subscribe
1097
- emits_events: []
1098
- trace_to: '§7.3, D31'
1099
-
1100
- # ───────────────────────── baseline family ─────────────────────────────
1101
- - name: baseline.start
1102
- family: baseline
1103
- description: Start a greenfield baseline or brownfield adoption without overwriting a ready baseline implicitly.
1104
- phase: '11'
1105
- writer_role: mcp
1106
- input_schema:
1107
- type: object
1108
- required: [project_name, mode]
1109
- additionalProperties: false
1110
- allOf:
1111
- - if:
1112
- required: [replace_ready]
1113
- properties: { replace_ready: { const: true } }
1114
- then: { required: [replacement_authorization] }
1115
- - if: { required: [replacement_authorization] }
1116
- then:
1117
- required: [replace_ready]
1118
- properties: { replace_ready: { const: true } }
1119
- properties:
1120
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$', default: project-baseline }
1121
- project_name: { type: string, minLength: 1 }
1122
- project_type: { type: string, enum: [web, api, cli, fullstack, other] }
1123
- stack: { type: string }
1124
- mode: { type: string, enum: [greenfield, brownfield] }
1125
- scope: { type: array, minItems: 1, items: { type: string, minLength: 1 }, default: ['.'] }
1126
- repository_revision: { type: string, minLength: 1 }
1127
- replace_ready: { type: boolean, default: false }
1128
- replacement_authorization:
1129
- type: object
1130
- required: [approved_by, reason]
1131
- additionalProperties: false
1132
- properties:
1133
- approved_by: { type: string, minLength: 1 }
1134
- reason: { type: string, minLength: 3 }
1135
- replace_migrated: { type: boolean, default: false, description: explicitly supersede a compatibility-only migrated baseline and start evidence-backed adoption }
1136
- classification: { type: object, description: bounded repository classification evidence; content is limited to 32 KiB }
1137
- provider_refs:
1138
- type: object
1139
- additionalProperties: false
1140
- properties:
1141
- memory:
1142
- type: object
1143
- required: [provider]
1144
- additionalProperties: false
1145
- properties:
1146
- provider: { type: string }
1147
- project: { type: string }
1148
- reference: { type: string }
1149
- revision: { type: string }
1150
- indexed_head: { type: string }
1151
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1152
- code_graph:
1153
- type: object
1154
- required: [provider]
1155
- additionalProperties: false
1156
- properties:
1157
- provider: { type: string }
1158
- project: { type: string }
1159
- reference: { type: string }
1160
- revision: { type: string }
1161
- indexed_head: { type: string }
1162
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1163
- output_schema:
1164
- type: object
1165
- required: [baseline]
1166
- additionalProperties: false
1167
- properties:
1168
- baseline: { type: object }
1169
- errors:
1170
- - { code: BASELINE_EXISTS, description: 'a ready baseline requires explicit replacement' }
1171
- - { code: BASELINE_IN_PROGRESS, description: 'another adoption is already active' }
1172
- - { code: BASELINE_REPLACEMENT_AUTHORIZATION_REQUIRED, description: 'ready-baseline replacement lacks durable owner approval and rationale' }
1173
- - { code: BASELINE_REPLACEMENT_INVALID, description: 'replacement flags do not match the current baseline lifecycle or authorization payload' }
1174
- - { code: BASELINE_SCOPE_MISSING, description: 'a selected baseline scope does not exist' }
1175
- - { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
1176
- cli_subcommand: baseline start
1177
- emits_events: [baseline_started]
1178
-
1179
- - name: baseline.record
1180
- family: baseline
1181
- description: Replace the current adoption snapshot with bounded specification digests, evidence references, verification, unknowns, and provider metadata.
1182
- phase: '11'
1183
- writer_role: mcp
1184
- input_schema:
1185
- type: object
1186
- required: [id]
1187
- additionalProperties: false
1188
- properties:
1189
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1190
- repository_revision: { type: string, minLength: 1 }
1191
- scope: { type: array, minItems: 1, items: { type: string, minLength: 1 } }
1192
- spec_refs:
1193
- type: array
1194
- items:
1195
- type: object
1196
- required: [kind, path]
1197
- additionalProperties: false
1198
- properties:
1199
- kind: { type: string, enum: [discovery, product, architecture, quality, delivery, other] }
1200
- path: { type: string, minLength: 1 }
1201
- evidence:
1202
- type: array
1203
- items:
1204
- type: object
1205
- required: [kind, ref, summary]
1206
- additionalProperties: false
1207
- properties:
1208
- kind: { type: string, enum: [source, docs, runtime, test, deploy, external] }
1209
- ref: { type: string, minLength: 1 }
1210
- summary: { type: string, minLength: 1 }
1211
- verification:
1212
- type: array
1213
- items:
1214
- type: object
1215
- required: [name, command, status, evidence]
1216
- additionalProperties: false
1217
- properties:
1218
- name: { type: string, minLength: 1 }
1219
- command: { type: string, minLength: 1 }
1220
- status: { type: string, enum: [pass, known_red, not_run] }
1221
- evidence: { type: string, minLength: 1 }
1222
- rationale: { type: string, minLength: 1 }
1223
- unknowns:
1224
- type: array
1225
- items:
1226
- type: object
1227
- required: [summary, blocking]
1228
- additionalProperties: false
1229
- properties:
1230
- summary: { type: string, minLength: 1 }
1231
- blocking: { type: boolean }
1232
- owner: { type: string, minLength: 1 }
1233
- gaps:
1234
- type: array
1235
- items:
1236
- type: object
1237
- required: [id, category, summary]
1238
- additionalProperties: false
1239
- properties:
1240
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1241
- category: { type: string, enum: [baseline_blocker, documentation_drift, known_defect, technical_debt, unknown, future_change] }
1242
- status: { type: string, enum: [open, accepted, resolved, deferred], default: open }
1243
- blocking: { type: boolean, default: false }
1244
- summary: { type: string, minLength: 1 }
1245
- evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 }, default: [] }
1246
- owner: { type: ['string', 'null'], minLength: 1 }
1247
- resolution: { type: string, minLength: 1 }
1248
- classification: { type: object, description: bounded repository classification evidence; content is limited to 32 KiB }
1249
- provider_refs:
1250
- type: object
1251
- additionalProperties: false
1252
- properties:
1253
- memory:
1254
- type: object
1255
- required: [provider]
1256
- additionalProperties: false
1257
- properties:
1258
- provider: { type: string }
1259
- project: { type: string }
1260
- reference: { type: string }
1261
- revision: { type: string }
1262
- indexed_head: { type: string }
1263
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1264
- code_graph:
1265
- type: object
1266
- required: [provider]
1267
- additionalProperties: false
1268
- properties:
1269
- provider: { type: string }
1270
- project: { type: string }
1271
- reference: { type: string }
1272
- revision: { type: string }
1273
- indexed_head: { type: string }
1274
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1275
- output_schema:
1276
- type: object
1277
- required: [baseline]
1278
- additionalProperties: false
1279
- properties:
1280
- baseline: { type: object }
1281
- errors:
1282
- - { code: BASELINE_NOT_FOUND, description: 'baseline id does not exist' }
1283
- - { code: BASELINE_NOT_MUTABLE, description: 'ready and superseded baselines are immutable' }
1284
- - { code: BASELINE_GIT_HEAD_REQUIRED, description: 'Git is initialized but the owner-authorized initial checkpoint commit does not exist' }
1285
- - { code: BASELINE_SPEC_MISSING, description: 'a declared specification file does not exist' }
1286
- - { code: BASELINE_SCOPE_MISSING, description: 'a selected baseline scope does not exist' }
1287
- - { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
1288
- cli_subcommand: baseline record
1289
- emits_events: [baseline_recorded]
1290
-
1291
- - name: baseline.get
1292
- family: baseline
1293
- description: Read the current or named authoritative baseline with live digest and repository-revision health.
1294
- phase: '11'
1295
- readonly: true
1296
- input_schema:
1297
- type: object
1298
- additionalProperties: false
1299
- properties:
1300
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1301
- output_schema:
1302
- type: object
1303
- required: [baseline, health]
1304
- additionalProperties: false
1305
- properties:
1306
- baseline: { type: object }
1307
- health: { type: object }
1308
- errors:
1309
- - { code: BASELINE_NOT_FOUND, description: 'no matching baseline exists' }
1310
- cli_subcommand: baseline get
1311
- emits_events: []
1312
-
1313
- - name: baseline.converge
1314
- family: baseline
1315
- description: Approve a baseline only when its revision, specification digests, evidence, verification, and blocking unknowns satisfy deterministic gates.
1316
- phase: '11'
1317
- writer_role: mcp
1318
- input_schema:
1319
- type: object
1320
- required: [id, expected_revision, approved_by, approval_note]
1321
- additionalProperties: false
1322
- properties:
1323
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1324
- expected_revision: { type: string, minLength: 1 }
1325
- approved_by: { type: string, minLength: 1 }
1326
- approval_note: { type: string, minLength: 3 }
1327
- accept_known_red: { type: boolean, default: false }
1328
- accept_dirty_worktree: { type: boolean, default: false, description: explicitly freeze the exact recorded dirty-worktree digest into the baseline }
1329
- output_schema:
1330
- type: object
1331
- required: [ready, status, blockers, baseline]
1332
- additionalProperties: false
1333
- properties:
1334
- ready: { type: boolean }
1335
- status: { type: string, enum: [blocked, ready] }
1336
- blockers: { type: array, items: { type: string } }
1337
- baseline: { type: object }
1338
- errors:
1339
- - { code: BASELINE_NOT_FOUND, description: 'baseline id does not exist' }
1340
- - { code: BASELINE_NOT_CONVERGEABLE, description: 'baseline lifecycle does not allow convergence' }
1341
- - { code: BASELINE_NOT_READY, description: 'baseline evidence, gaps, revision, branch, worktree, or verification still blocks convergence' }
1342
- cli_subcommand: baseline converge
1343
- emits_events: [baseline_blocked, baseline_converged]
1344
-
1345
- # ────────────────────────── change family ──────────────────────────────
1346
- - name: change.create
1347
- family: change
1348
- description: Capture a continuous feature, fix, redesign, or incident change contract; incidents also register a five-section diagnosis artifact. Planning context is compiled separately.
1349
- phase: '9'
1350
- writer_role: mcp
1351
- input_schema:
1352
- type: object
1353
- required: [id, title, kind, intent, contract, classification, research_disposition]
1354
- additionalProperties: false
1355
- properties:
1356
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1357
- title: { type: string, minLength: 3 }
1358
- kind: { type: string, enum: [quick, standard, major, incident] }
1359
- intent: { type: string, minLength: 3 }
1360
- contract: &change_contract
1361
- type: object
1362
- required: [outcome, acceptance, non_goals, public_seams, recovery, unresolved_decisions]
1363
- additionalProperties: false
1364
- properties:
1365
- outcome: { type: string, minLength: 1 }
1366
- acceptance:
1367
- type: array
1368
- minItems: 1
1369
- items:
1370
- type: object
1371
- required: [id, criterion, verification]
1372
- additionalProperties: false
1373
- properties:
1374
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1375
- criterion: { type: string, minLength: 1 }
1376
- verification: { type: string, minLength: 1 }
1377
- non_goals: { type: array, minItems: 1, items: { type: string, minLength: 1 } }
1378
- public_seams: { type: array, minItems: 1, items: { type: string, minLength: 1 } }
1379
- recovery:
1380
- type: object
1381
- required: [strategy, verification]
1382
- additionalProperties: false
1383
- properties:
1384
- strategy: { type: string, minLength: 1 }
1385
- verification: { type: string, minLength: 1 }
1386
- unresolved_decisions:
1387
- type: array
1388
- items:
1389
- type: object
1390
- required: [id, summary, blocking]
1391
- additionalProperties: false
1392
- properties:
1393
- id: { type: string, minLength: 1 }
1394
- summary: { type: string, minLength: 1 }
1395
- blocking: { type: boolean }
1396
- owner: { type: ['string', 'null'] }
1397
- classification: &change_classification
1398
- type: object
1399
- required: [rationale, risk_flags]
1400
- additionalProperties: false
1401
- properties:
1402
- rationale: { type: string, minLength: 1 }
1403
- risk_flags:
1404
- type: array
1405
- uniqueItems: true
1406
- items:
1407
- type: string
1408
- enum: [public_contract, schema_migration, data_migration, authorization, security, multi_module, external_integration, release_semantics]
1409
- research_disposition: &change_research_disposition
1410
- type: object
1411
- required: [status, mode, selected_steps, rationale]
1412
- additionalProperties: false
1413
- properties:
1414
- status: { type: string, enum: [none, bounded, required] }
1415
- mode: { type: ['string', 'null'], enum: [product, feature, architecture, custom, null] }
1416
- selected_steps: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
1417
- rationale: { type: string, minLength: 1 }
1418
- alignment_thread_id: { type: string, description: 'confirmed decision checkpoint that produced this change contract' }
1419
- base_commit: { type: string, pattern: '^[0-9a-f]{7,40}$' }
1420
- baseline_bypass:
1421
- type: object
1422
- required: [reason, approved_by]
1423
- additionalProperties: false
1424
- properties:
1425
- reason: { type: string, minLength: 3 }
1426
- approved_by: { type: string, minLength: 1 }
1427
- description: incident-only break-glass approval when the project baseline is unhealthy
1428
- docs_impact:
1429
- type: object
1430
- additionalProperties: false
1431
- properties:
1432
- status: { type: string, enum: [unknown, required, none] }
1433
- files: { type: array, items: { type: string } }
1434
- rationale: { type: ['string', 'null'] }
1435
- provider_refs:
1436
- type: object
1437
- additionalProperties: false
1438
- properties:
1439
- memory:
1440
- type: object
1441
- required: [provider]
1442
- additionalProperties: false
1443
- properties:
1444
- provider: { type: string }
1445
- project: { type: string }
1446
- reference: { type: string }
1447
- revision: { type: string }
1448
- indexed_head: { type: string }
1449
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1450
- code_graph:
1451
- type: object
1452
- required: [provider]
1453
- additionalProperties: false
1454
- properties:
1455
- provider: { type: string }
1456
- project: { type: string }
1457
- reference: { type: string }
1458
- revision: { type: string }
1459
- indexed_head: { type: string }
1460
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1461
- output_schema:
1462
- type: object
1463
- required: [change, intent_path, context_manifest_path, workflow]
1464
- additionalProperties: false
1465
- properties:
1466
- change: { type: object }
1467
- intent_path: { type: string }
1468
- context_manifest_path: { type: ['string', 'null'] }
1469
- workflow: { type: object }
1470
- errors:
1471
- - { code: DUPLICATE_CHANGE_ID, description: 'change id already exists' }
1472
- - { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
1473
- - { code: VALIDATION_ERROR, description: 'change input failed validation' }
1474
- - { code: BASELINE_NOT_READY, description: 'ordinary work is blocked until the project baseline is healthy' }
1475
- - { code: BASELINE_BYPASS_REQUIRED, description: 'an incident on an unhealthy baseline requires explicit break-glass approval' }
1476
- - { code: CHANGE_CONTRACT_REQUIRED, description: 'outcome, acceptance, seams, recovery, or decisions are incomplete' }
1477
- - { code: CHANGE_CLASSIFICATION_REQUIRED, description: 'classification rationale or risk flags are incomplete' }
1478
- - { code: CHANGE_RESEARCH_DISPOSITION_REQUIRED, description: 'research routing is incomplete or inconsistent' }
1479
- - { code: CHANGE_PROFILE_ESCALATION_REQUIRED, description: 'quick profile conflicts with material risk or research' }
1480
- - { code: CHANGE_ALIGNMENT_REQUIRED, description: 'declared alignment thread is missing, unconfirmed, stale, not artifact-bound, bound to another authority, or not scoped to the current baseline' }
1481
- cli_subcommand: change create
1482
- emits_events: [change_created, workflow_started, workflow_step_updated, workflow_completed]
1483
-
1484
- - name: change.update
1485
- family: change
1486
- description: Update mutable change authority. Semantic changes invalidate only registered transitive consumers so affected tasks and contexts must be reconciled before execution.
1487
- phase: '9'
1488
- writer_role: mcp
1489
- input_schema:
1490
- type: object
1491
- required: [id, patch]
1492
- additionalProperties: false
1493
- properties:
1494
- id: { type: string }
1495
- patch:
1496
- type: object
1497
- additionalProperties: false
1498
- properties:
1499
- title: { type: string, minLength: 3 }
1500
- intent: { type: string, minLength: 3 }
1501
- status: { type: string, enum: [active, blocked, cancelled] }
1502
- docs_impact:
1503
- type: object
1504
- additionalProperties: false
1505
- properties:
1506
- status: { type: string, enum: [unknown, required, none] }
1507
- files: { type: array, items: { type: string } }
1508
- rationale: { type: ['string', 'null'] }
1509
- provider_refs:
1510
- type: object
1511
- additionalProperties: false
1512
- properties:
1513
- memory:
1514
- type: object
1515
- required: [provider]
1516
- additionalProperties: false
1517
- properties:
1518
- provider: { type: string }
1519
- project: { type: string }
1520
- reference: { type: string }
1521
- revision: { type: string }
1522
- indexed_head: { type: string }
1523
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1524
- code_graph:
1525
- type: object
1526
- required: [provider]
1527
- additionalProperties: false
1528
- properties:
1529
- provider: { type: string }
1530
- project: { type: string }
1531
- reference: { type: string }
1532
- revision: { type: string }
1533
- indexed_head: { type: string }
1534
- status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
1535
- contract: *change_contract
1536
- classification: *change_classification
1537
- research_disposition: *change_research_disposition
1538
- output_schema:
1539
- type: object
1540
- required: [ok, change]
1541
- additionalProperties: false
1542
- properties:
1543
- ok: { type: boolean }
1544
- change: { type: object }
1545
- errors:
1546
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1547
- - { code: CHANGE_NOT_MUTABLE, description: 'ready, archived, and cancelled changes are immutable' }
1548
- - { code: ILLEGAL_CHANGE_TRANSITION, description: 'change transition is not permitted' }
1549
- - { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
1550
- cli_subcommand: change update
1551
- emits_events: [task_stale_marked, change_updated]
1552
-
1553
- - name: change.delta
1554
- family: change
1555
- description: Record the typed Change-owned delta overlay against exact baseline anchors without mutating baseline specifications.
1556
- phase: '21'
1557
- writer_role: mcp
1558
- input_schema:
1559
- type: object
1560
- required:
1561
- [id, baseline_anchor, decisions, non_goals, acceptance, documentation_impact, unknowns, mutations]
1562
- additionalProperties: false
1563
- properties:
1564
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1565
- baseline_anchor:
1566
- type: object
1567
- required: [baseline_id, repository_revision, specs]
1568
- additionalProperties: false
1569
- properties:
1570
- baseline_id: { type: string, minLength: 1 }
1571
- repository_revision: { type: ['string', 'null'] }
1572
- specs:
1573
- type: array
1574
- items:
1575
- type: object
1576
- required: [path, digest]
1577
- additionalProperties: false
1578
- properties:
1579
- path: { type: string, minLength: 1 }
1580
- digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1581
- decisions:
1582
- type: array
1583
- items:
1584
- type: object
1585
- required: [id, summary]
1586
- additionalProperties: false
1587
- properties:
1588
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1589
- summary: { type: string, minLength: 1 }
1590
- rationale: { type: string, minLength: 1 }
1591
- non_goals: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
1592
- acceptance:
1593
- type: array
1594
- minItems: 1
1595
- items:
1596
- type: object
1597
- required: [id, criterion, verification]
1598
- additionalProperties: false
1599
- properties:
1600
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1601
- criterion: { type: string, minLength: 1 }
1602
- verification: { type: string, minLength: 1 }
1603
- documentation_impact:
1604
- type: object
1605
- required: [status, files, rationale]
1606
- additionalProperties: false
1607
- properties:
1608
- status: { type: string, enum: [none, required] }
1609
- files: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
1610
- rationale: { type: string, minLength: 3 }
1611
- unknowns:
1612
- type: array
1613
- items:
1614
- type: object
1615
- required: [id, summary, blocking]
1616
- additionalProperties: false
1617
- properties:
1618
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1619
- summary: { type: string, minLength: 1 }
1620
- blocking: { type: boolean }
1621
- no_semantic_change_reason: { type: string, minLength: 3 }
1622
- mutations:
1623
- type: array
1624
- items:
1625
- type: object
1626
- required:
1627
- [id, action, target_path, overlay_path, before_digest, after_digest, acceptance_refs, documentation_refs]
1628
- additionalProperties: false
1629
- properties:
1630
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1631
- action: { type: string, enum: [add, update] }
1632
- target_path: { type: string, minLength: 1 }
1633
- overlay_path: { type: string, minLength: 1 }
1634
- before_digest: { type: ['string', 'null'], pattern: '^[0-9a-f]{64}$' }
1635
- after_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1636
- acceptance_refs: { type: array, minItems: 1, uniqueItems: true, items: { type: string, minLength: 1 } }
1637
- documentation_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
1638
- allOf:
1639
- - if:
1640
- properties:
1641
- mutations: { maxItems: 0 }
1642
- then:
1643
- required: [no_semantic_change_reason]
1644
- output_schema:
1645
- type: object
1646
- required: [delta, artifact, payload_artifacts, progress_artifact]
1647
- additionalProperties: false
1648
- properties:
1649
- delta: { type: object }
1650
- artifact: { type: object }
1651
- payload_artifacts: { type: array, items: { type: object } }
1652
- progress_artifact: { type: object }
1653
- errors:
1654
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1655
- - { code: CHANGE_NOT_MUTABLE, description: 'terminal Change authority cannot accept a delta' }
1656
- - { code: CHANGE_DELTA_INVALID, description: 'delta shape or typed mutation contract is invalid' }
1657
- - { code: CHANGE_DELTA_CONTRACT_MISMATCH, description: 'delta does not match accepted Change non-goals, acceptance, or documentation impact' }
1658
- - { code: CHANGE_DELTA_BASELINE_CONFLICT, description: 'baseline id, revision, specification digest, or target bytes changed' }
1659
- - { code: CHANGE_DELTA_PAYLOAD_MISSING, description: 'a declared Change overlay file is missing' }
1660
- - { code: CHANGE_DELTA_PAYLOAD_STALE, description: 'a declared Change overlay digest is stale' }
1661
- cli_subcommand: change delta
1662
- emits_events: [artifact_recorded, spec_changed, change_delta_recorded]
1663
-
1664
- - name: change.documentation_reconcile
1665
- family: change
1666
- description: Record Change-owned documentation before/after digests, delta and acceptance trace, verification, and explicit consumer or no-consumer evidence.
1667
- phase: '21'
1668
- writer_role: mcp
1669
- input_schema:
1670
- type: object
1671
- required: [id, delta_artifact_id, delta_digest, documents]
1672
- additionalProperties: false
1673
- properties:
1674
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1675
- delta_artifact_id: { type: string, minLength: 1 }
1676
- delta_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1677
- no_change_reason: { type: string, minLength: 3 }
1678
- documents:
1679
- type: array
1680
- items:
1681
- type: object
1682
- required:
1683
- [path, action, overlay_path, before_digest, after_digest, delta_refs, acceptance_refs, verification, consumers]
1684
- additionalProperties: false
1685
- properties:
1686
- path: { type: string, minLength: 1 }
1687
- action: { type: string, enum: [add, update] }
1688
- overlay_path: { type: string, minLength: 1 }
1689
- before_digest: { type: ['string', 'null'], pattern: '^[0-9a-f]{64}$' }
1690
- after_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1691
- delta_refs: { type: array, minItems: 1, uniqueItems: true, items: { type: string } }
1692
- acceptance_refs: { type: array, minItems: 1, uniqueItems: true, items: { type: string } }
1693
- verification:
1694
- type: array
1695
- minItems: 1
1696
- items:
1697
- type: object
1698
- required: [command, status, evidence_refs]
1699
- additionalProperties: false
1700
- properties:
1701
- command: { type: string, minLength: 1 }
1702
- status: { type: string, const: pass }
1703
- evidence_refs:
1704
- type: array
1705
- minItems: 1
1706
- uniqueItems: true
1707
- items: { type: string, minLength: 1 }
1708
- consumers:
1709
- type: array
1710
- items:
1711
- type: object
1712
- required: [type, id, relation]
1713
- additionalProperties: false
1714
- properties:
1715
- type: { type: string, enum: [artifact, project, baseline, change, task, workflow, external] }
1716
- id: { type: string, minLength: 1 }
1717
- relation: { type: string, minLength: 1 }
1718
- no_consumer_reason: { type: string, minLength: 3 }
1719
- allOf:
1720
- - if:
1721
- properties:
1722
- documents: { maxItems: 0 }
1723
- then:
1724
- required: [no_change_reason]
1725
- output_schema:
1726
- type: object
1727
- required: [reconciliation, artifact, payload_artifacts, progress_artifact]
1728
- additionalProperties: false
1729
- properties:
1730
- reconciliation: { type: object }
1731
- artifact: { type: object }
1732
- payload_artifacts: { type: array, items: { type: object } }
1733
- progress_artifact: { type: object }
1734
- errors:
1735
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1736
- - { code: DOCUMENTATION_DELTA_AUTHORITY_INVALID, description: 'documentation is not bound to the current Change delta' }
1737
- - { code: DOCUMENTATION_RECONCILIATION_INCOMPLETE, description: 'declared documentation impact is not covered exactly' }
1738
- - { code: DOCUMENTATION_ORPHAN_UNRESOLVED, description: 'a changed document lacks a consumer or explicit no-consumer reason' }
1739
- - { code: DOCUMENTATION_BASELINE_CONFLICT, description: 'a documentation target changed after its before digest was recorded' }
1740
- - { code: DOCUMENTATION_EVIDENCE_STALE, description: 'documentation overlay bytes do not match the recorded after digest' }
1741
- cli_subcommand: change documentation-reconcile
1742
- emits_events: [artifact_recorded, spec_changed, documentation_reconciliation_recorded]
1743
-
1744
- - name: change.get
1745
- family: change
1746
- description: Read one continuous change unit and its specification-learning candidates from authoritative state.
1747
- phase: '9'
1748
- readonly: true
1749
- input_schema:
1750
- type: object
1751
- required: [id]
1752
- additionalProperties: false
1753
- properties:
1754
- id: { type: string }
1755
- output_schema:
1756
- type: object
1757
- required: [change]
1758
- additionalProperties: false
1759
- properties:
1760
- change: { type: object }
1761
- errors:
1762
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1763
- cli_subcommand: change get
1764
- emits_events: []
1765
-
1766
- - name: change.list
1767
- family: change
1768
- description: List continuous changes by lifecycle status or change kind.
1769
- phase: '9'
1770
- readonly: true
1771
- input_schema:
1772
- type: object
1773
- additionalProperties: false
1774
- properties:
1775
- status: { type: string, enum: [active, blocked, ready, archived, cancelled] }
1776
- kind: { type: string, enum: [quick, standard, major, incident] }
1777
- limit: { type: integer, minimum: 1, maximum: 500 }
1778
- output_schema:
1779
- type: object
1780
- required: [changes, count]
1781
- additionalProperties: false
1782
- properties:
1783
- changes: { type: array, items: { type: object } }
1784
- count: { type: integer, minimum: 0 }
1785
- errors:
1786
- - { code: VALIDATION_ERROR, description: 'change filter failed validation' }
1787
- cli_subcommand: change list
1788
- emits_events: []
1789
-
1790
- - name: change.context
1791
- family: change
1792
- description: Compile an immutable role-scoped Context Spine snapshot with authoritative readiness and allowed or required transitions. A host may attach a clearly non-authoritative recommendation.
1793
- phase: '10'
1794
- writer_role: mcp
1795
- input_schema:
1796
- type: object
1797
- required: [id]
1798
- additionalProperties: false
1799
- not:
1800
- required: [context_refs, spec_refs]
1801
- properties:
1802
- id: { type: string }
1803
- task_id: { type: string }
1804
- role: { type: string, enum: [plan, implement, check, review] }
1805
- gate: { type: string, enum: [alignment, planning, implementation, verification, review, convergence, recovery] }
1806
- spec_refs:
1807
- type: array
1808
- maxItems: 64
1809
- items:
1810
- type: object
1811
- required: [ref]
1812
- additionalProperties: false
1813
- properties:
1814
- ref: { type: string, minLength: 1, maxLength: 2048 }
1815
- reason: { type: string, minLength: 1, maxLength: 2048 }
1816
- required: { type: boolean, default: true }
1817
- expected_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1818
- anchor: { type: string, minLength: 1, maxLength: 512 }
1819
- scope: { type: string, minLength: 1, maxLength: 512 }
1820
- freshness_policy: { type: string, enum: [digest, existence, advisory] }
1821
- context_refs:
1822
- type: array
1823
- maxItems: 64
1824
- items:
1825
- type: object
1826
- required: [ref, reason]
1827
- additionalProperties: false
1828
- properties:
1829
- ref: { type: string, minLength: 1, maxLength: 2048 }
1830
- kind: { type: string, enum: [spec, source, test, docs, external], default: source }
1831
- reason: { type: string, minLength: 3, maxLength: 2048 }
1832
- required: { type: boolean, default: true }
1833
- digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1834
- expected_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1835
- anchor: { type: string, minLength: 1, maxLength: 512 }
1836
- scope: { type: string, minLength: 1, maxLength: 512 }
1837
- freshness_policy: { type: string, enum: [digest, existence, advisory] }
1838
- budget:
1839
- type: object
1840
- additionalProperties: false
1841
- properties:
1842
- max_tokens: { type: integer, minimum: 1, default: 12000 }
1843
- max_files: { type: integer, minimum: 1, default: 12 }
1844
- execution_contract:
1845
- type: object
1846
- additionalProperties: false
1847
- properties:
1848
- context_budget_percent: { type: integer, minimum: 1, maximum: 100, default: 40 }
1849
- recommendation:
1850
- type: object
1851
- required: [workflow, rationale]
1852
- additionalProperties: false
1853
- properties:
1854
- workflow: { type: string, minLength: 1 }
1855
- rationale: { type: string, minLength: 3 }
1856
- output_schema:
1857
- type: object
1858
- required: [manifest_path, manifest_hash, manifest]
1859
- additionalProperties: false
1860
- properties:
1861
- manifest_path: { type: string }
1862
- manifest_hash: { type: string, pattern: '^[0-9a-f]{64}$' }
1863
- manifest: { type: object }
1864
- errors:
1865
- - { code: VALIDATION_ERROR, description: 'context role, gate, references, budget, or execution contract is invalid' }
1866
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1867
- - { code: CHANGE_TERMINAL, description: 'terminal change cannot compile a new context' }
1868
- - { code: TASK_NOT_FOUND, description: 'task id is not linked to the change' }
1869
- - { code: EXECUTION_CONTRACT_CONFLICT, description: 'Prompt input attempted to override the DB-backed task seam or verification command' }
1870
- - { code: EXECUTION_CONTEXT_REFS_CONFLICT, description: 'Prompt input attempted to override DB-backed task context references' }
1871
- - { code: CONTEXT_LEGACY_NEXT_ACTION_UNSUPPORTED, description: 'a canonical next action is not an MCP authority field; use a non-authoritative host recommendation' }
1872
- - { code: CONTEXT_PROVIDER_REFS_MUTATION_UNSUPPORTED, description: 'provider references must be updated through change.update before context compilation' }
1873
- cli_subcommand: change context
1874
- emits_events: [context_updated]
1875
-
1876
- - name: change.breadcrumb
1877
- family: change
1878
- description: Read the compact DB-derived Context Spine position, readiness, allowed transitions, and any mechanically required recovery transition.
1879
- phase: '10'
1880
- readonly: true
1881
- writer_role: any
1882
- input_schema:
1883
- type: object
1884
- additionalProperties: false
1885
- properties:
1886
- id: { type: string }
1887
- output_schema:
1888
- type: object
1889
- required: [breadcrumb]
1890
- additionalProperties: false
1891
- properties:
1892
- breadcrumb: { type: object }
1893
- errors:
1894
- - { code: CHANGE_NOT_FOUND, description: 'explicit change id does not exist' }
1895
- - { code: STATE_DB_ERROR, description: 'runtime state could not be read' }
1896
- cli_subcommand: change breadcrumb
1897
- emits_events: []
1898
-
1899
- - name: change.learning_propose
1900
- family: change
1901
- description: Propose one stable implementation discovery for approval-gated baseline specification convergence.
1902
- phase: '10'
1903
- writer_role: mcp
1904
- input_schema:
1905
- type: object
1906
- required: [change_id, target_ref, summary]
1907
- additionalProperties: false
1908
- properties:
1909
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1910
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1911
- task_id: { type: string }
1912
- target_ref: { type: string, minLength: 1 }
1913
- summary: { type: string, minLength: 3 }
1914
- evidence: { type: array, items: { type: string, minLength: 1 } }
1915
- output_schema:
1916
- type: object
1917
- required: [candidate]
1918
- additionalProperties: false
1919
- properties:
1920
- candidate: { type: object }
1921
- errors:
1922
- - { code: VALIDATION_ERROR, description: 'candidate id, target, summary, or evidence is invalid' }
1923
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1924
- - { code: CHANGE_NOT_MUTABLE, description: 'learning must resolve before convergence' }
1925
- - { code: TASK_NOT_FOUND, description: 'task is not linked to the change' }
1926
- - { code: DUPLICATE_LEARNING_ID, description: 'candidate id already exists' }
1927
- cli_subcommand: change learning-propose
1928
- emits_events: [spec_learning_proposed]
1929
-
1930
- - name: change.learning_resolve
1931
- family: change
1932
- description: Approve, reject, or mark applied one specification-learning candidate through a guarded state transition.
1933
- phase: '10'
1934
- writer_role: mcp
1935
- input_schema:
1936
- type: object
1937
- required: [change_id, candidate_id, decision]
1938
- additionalProperties: false
1939
- properties:
1940
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1941
- candidate_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
1942
- decision: { type: string, enum: [approve, reject, apply] }
1943
- resolution: { type: string }
1944
- applied_ref: { type: string, minLength: 3 }
1945
- before_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1946
- after_digest: { type: string, pattern: '^[0-9a-f]{64}$' }
1947
- apply_evidence: { type: array, minItems: 1, uniqueItems: true, items: { type: string, minLength: 3 } }
1948
- output_schema:
1949
- type: object
1950
- required: [candidate]
1951
- additionalProperties: false
1952
- properties:
1953
- candidate: { type: object }
1954
- errors:
1955
- - { code: VALIDATION_ERROR, description: 'decision or required resolution is invalid' }
1956
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1957
- - { code: LEARNING_NOT_FOUND, description: 'candidate id does not exist for the change' }
1958
- - { code: ILLEGAL_LEARNING_TRANSITION, description: 'candidate state transition is not permitted' }
1959
- - { code: LEARNING_APPLY_EVIDENCE_REQUIRED, description: 'apply requires exact target, before and after digests, and evidence' }
1960
- - { code: LEARNING_APPLY_EVIDENCE_MISMATCH, description: 'apply evidence does not match the current target artifact' }
1961
- cli_subcommand: change learning-resolve
1962
- emits_events: [spec_learning_resolved]
1963
-
1964
- - name: change.converge
1965
- family: change
1966
- description: Deterministically verify task, spec, test, documentation, review, context, and incident diagnosis structure before closure.
1967
- phase: '9'
1968
- writer_role: mcp
1969
- input_schema:
1970
- type: object
1971
- required: [id]
1972
- additionalProperties: false
1973
- properties:
1974
- id: { type: string }
1975
- output_schema:
1976
- type: object
1977
- required: [ready, status, blockers]
1978
- additionalProperties: false
1979
- properties:
1980
- ready: { type: boolean }
1981
- status: { type: string, enum: [blocked, ready] }
1982
- blockers: { type: array, items: { type: string } }
1983
- verification_path: { type: string }
1984
- errors:
1985
- - { code: CHANGE_NOT_FOUND, description: 'change id does not exist' }
1986
- - { code: CHANGE_NOT_CONVERGEABLE, description: 'change lifecycle does not allow convergence' }
1987
- - { code: CONVERGENCE_EVIDENCE_AUTHORITY_VIOLATION, description: 'Prompt-supplied gate verdicts cannot replace DB-backed workflow evidence' }
1988
- cli_subcommand: change converge
1989
- emits_events: [change_blocked, change_converged]
1990
-
1991
- - name: change.archive
1992
- family: change
1993
- description: Archive a converged change after explicit baseline-spec reconciliation.
1994
- phase: '9'
1995
- writer_role: mcp
1996
- input_schema:
1997
- type: object
1998
- required: [id, summary, reconciliation_path]
1999
- additionalProperties: false
2000
- properties:
2001
- id: { type: string }
2002
- summary: { type: string, minLength: 3 }
2003
- baseline_updates: { type: array, items: { type: string } }
2004
- no_baseline_change_reason: { type: string, minLength: 3 }
2005
- reconciliation_path: { type: string, minLength: 3 }
2006
- output_schema:
2007
- type: object
2008
- required: [change, archive_path]
2009
- additionalProperties: false
2010
- properties:
2011
- change: { type: object }
2012
- archive_path: { type: string }
2013
- errors:
2014
- - { code: CHANGE_NOT_READY, description: 'change has not passed convergence' }
2015
- - { code: BASELINE_RECONCILIATION_REQUIRED, description: 'baseline update or explicit no-change reason required' }
2016
- - { code: BASELINE_FILE_MISSING, description: 'a declared baseline update does not exist' }
2017
- - { code: BASELINE_RECONCILIATION_INCOMPLETE, description: 'repository revision or tracked specification digests remain stale after reconciliation' }
2018
- - { code: BASELINE_RECONCILIATION_MANIFEST_REQUIRED, description: 'a change-bound reconciliation manifest is required' }
2019
- - { code: BASELINE_RECONCILIATION_MANIFEST_INVALID, description: 'semantic changes, digests, resolutions, or verification are invalid' }
2020
- - { code: ARCHIVE_EXISTS, description: 'archive target already exists' }
2021
- cli_subcommand: change archive
2022
- emits_events: [change_archived]
2023
-
2024
- # ────────────────────────── decision family ────────────────────────────
2025
- - name: decision.thread_start
2026
- family: decision
2027
- description: Start one durable owner-agent alignment thread bound to baseline, change, or workflow authority.
2028
- phase: '16'
2029
- writer_role: mcp
2030
- input_schema:
2031
- type: object
2032
- required: [id, purpose]
2033
- additionalProperties: false
2034
- properties:
2035
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2036
- purpose: { type: string, minLength: 3 }
2037
- mode: { type: string, enum: [guided, fast, autonomous, diagnostic], default: guided }
2038
- baseline_id: { type: string }
2039
- change_id: { type: string }
2040
- workflow_run_id: { type: string }
2041
- output_schema:
2042
- type: object
2043
- required: [thread]
2044
- additionalProperties: false
2045
- properties:
2046
- thread: { type: object }
2047
- errors:
2048
- - { code: DECISION_AUTHORITY_REQUIRED, description: 'thread has no baseline, change, or workflow authority' }
2049
- - { code: DECISION_AUTHORITY_MISMATCH, description: 'thread authority differs from its workflow binding' }
2050
- - { code: DECISION_THREAD_IN_PROGRESS, description: 'the same authority and purpose already has an active thread' }
2051
- - { code: DUPLICATE_DECISION_THREAD, description: 'decision thread id already exists' }
2052
- - { code: VALIDATION_ERROR, description: 'thread input is incomplete or invalid' }
2053
- cli_subcommand: decision thread-start
2054
- emits_events: [decision_thread_started]
2055
-
2056
- - name: decision.get
2057
- family: decision
2058
- description: Read one decision thread with its current question, normalized decisions, and checkpoint authority.
2059
- phase: '16'
2060
- readonly: true
2061
- input_schema:
2062
- type: object
2063
- required: [id]
2064
- additionalProperties: false
2065
- properties:
2066
- id: { type: string }
2067
- output_schema:
2068
- type: object
2069
- required: [thread]
2070
- additionalProperties: false
2071
- properties:
2072
- thread: { type: object }
2073
- errors:
2074
- - { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
2075
- cli_subcommand: decision get
2076
- emits_events: []
2077
-
2078
- - name: decision.list
2079
- family: decision
2080
- description: List durable decision threads by authority, mode, or lifecycle state for recovery and status reporting.
2081
- phase: '16'
2082
- readonly: true
2083
- input_schema:
2084
- type: object
2085
- additionalProperties: false
2086
- properties:
2087
- status: { type: string, enum: [active, checkpoint_ready, completed, confirmed, cancelled] }
2088
- mode: { type: string, enum: [guided, fast, autonomous, diagnostic] }
2089
- baseline_id: { type: string }
2090
- change_id: { type: string }
2091
- workflow_run_id: { type: string }
2092
- limit: { type: integer, minimum: 1, maximum: 500, default: 100 }
2093
- output_schema:
2094
- type: object
2095
- required: [threads, count]
2096
- additionalProperties: false
2097
- properties:
2098
- threads: { type: array, items: { type: object } }
2099
- count: { type: integer, minimum: 0 }
2100
- errors:
2101
- - { code: STATE_DB_ERROR, description: 'decision thread state could not be read' }
2102
- cli_subcommand: decision list
2103
- emits_events: []
2104
-
2105
- - name: decision.open
2106
- family: decision
2107
- description: Open the sole user-facing decision in a thread with evidence, recommendation, credible alternatives, and durable effects.
2108
- phase: '16'
2109
- writer_role: mcp
2110
- input_schema:
2111
- type: object
2112
- required: [id, thread_id, phase, question, why_now, recommendation, effects]
2113
- additionalProperties: false
2114
- properties:
2115
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2116
- thread_id: { type: string }
2117
- phase: { type: string, minLength: 1 }
2118
- question: { type: string, minLength: 1 }
2119
- why_now: { type: string, minLength: 1 }
2120
- recommendation: { type: string, minLength: 1 }
2121
- options:
2122
- type: array
2123
- maxItems: 3
2124
- items: &decision_option
2125
- type: object
2126
- required: [id, label, tradeoff]
2127
- additionalProperties: false
2128
- properties:
2129
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2130
- label: { type: string, minLength: 1 }
2131
- tradeoff: { type: string, minLength: 1 }
2132
- evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
2133
- dependency_ids: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
2134
- effects: { type: object, minProperties: 1 }
2135
- blocking: { type: boolean, default: true }
2136
- output_schema:
2137
- type: object
2138
- required: [thread]
2139
- additionalProperties: false
2140
- properties:
2141
- thread: { type: object }
2142
- errors:
2143
- - { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
2144
- - { code: DECISION_ALREADY_OPEN, description: 'another decision is already awaiting an answer' }
2145
- - { code: DECISION_CHECKPOINT_PENDING, description: 'the prepared checkpoint must be confirmed or revised first' }
2146
- - { code: DECISION_DEPENDENCY_UNRESOLVED, description: 'a declared decision dependency is unresolved' }
2147
- - { code: DUPLICATE_DECISION_ID, description: 'decision item id already exists' }
2148
- - { code: VALIDATION_ERROR, description: 'question, recommendation, options, evidence, or effects are invalid' }
2149
- cli_subcommand: decision open
2150
- emits_events: [decision_opened]
2151
-
2152
- - name: decision.resolve
2153
- family: decision
2154
- description: Resolve the current question as an explicit normalized owner decision without storing the conversation transcript.
2155
- phase: '16'
2156
- writer_role: mcp
2157
- input_schema:
2158
- type: object
2159
- required: [id, decision, rationale, decided_by]
2160
- additionalProperties: false
2161
- properties:
2162
- id: { type: string }
2163
- decision: { type: string, minLength: 1 }
2164
- rationale: { type: string, minLength: 1 }
2165
- decided_by: { type: string, minLength: 1 }
2166
- output_schema:
2167
- type: object
2168
- required: [thread]
2169
- additionalProperties: false
2170
- properties:
2171
- thread: { type: object }
2172
- errors:
2173
- - { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
2174
- - { code: DECISION_NOT_OPEN, description: 'decision item is no longer awaiting an answer' }
2175
- - { code: VALIDATION_ERROR, description: 'normalized owner decision is incomplete' }
2176
- cli_subcommand: decision resolve
2177
- emits_events: [decision_resolved]
2178
-
2179
- - name: decision.delegate
2180
- family: decision
2181
- description: Record explicit owner delegation for a reversible decision, including the selected result and non-negotiable guardrails.
2182
- phase: '16'
2183
- writer_role: mcp
2184
- input_schema:
2185
- type: object
2186
- required: [id, delegated_to, decision, rationale, guardrails]
2187
- additionalProperties: false
2188
- properties:
2189
- id: { type: string }
2190
- delegated_to: { type: string, minLength: 1 }
2191
- decision: { type: string, minLength: 1 }
2192
- rationale: { type: string, minLength: 1 }
2193
- guardrails: { type: array, minItems: 1, uniqueItems: true, items: { type: string, minLength: 1 } }
2194
- output_schema:
2195
- type: object
2196
- required: [thread]
2197
- additionalProperties: false
2198
- properties:
2199
- thread: { type: object }
2200
- errors:
2201
- - { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
2202
- - { code: DECISION_NOT_OPEN, description: 'decision item is no longer awaiting an answer' }
2203
- - { code: VALIDATION_ERROR, description: 'delegation result or guardrails are incomplete' }
2204
- cli_subcommand: decision delegate
2205
- emits_events: [decision_resolved]
2206
-
2207
- - name: decision.defer
2208
- family: decision
2209
- description: Defer the current decision with explicit consequences and a deterministic condition for revisiting it.
2210
- phase: '16'
2211
- writer_role: mcp
2212
- input_schema:
2213
- type: object
2214
- required: [id, reason, consequences, revisit_condition]
2215
- additionalProperties: false
2216
- properties:
2217
- id: { type: string }
2218
- reason: { type: string, minLength: 1 }
2219
- consequences: { type: string, minLength: 1 }
2220
- revisit_condition: { type: string, minLength: 1 }
2221
- output_schema:
2222
- type: object
2223
- required: [thread]
2224
- additionalProperties: false
2225
- properties:
2226
- thread: { type: object }
2227
- errors:
2228
- - { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
2229
- - { code: DECISION_NOT_OPEN, description: 'decision item is no longer awaiting an answer' }
2230
- - { code: VALIDATION_ERROR, description: 'deferral consequence or revisit condition is incomplete' }
2231
- cli_subcommand: decision defer
2232
- emits_events: [decision_resolved]
2233
-
2234
- - name: decision.supersede
2235
- family: decision
2236
- description: Preserve a prior resolved decision and reopen alignment with one replacement question when evidence or owner intent changes.
2237
- phase: '16'
2238
- writer_role: mcp
2239
- input_schema:
2240
- type: object
2241
- required: [id, reason, replacement]
2242
- additionalProperties: false
2243
- properties:
2244
- id: { type: string }
2245
- reason: { type: string, minLength: 1 }
2246
- replacement:
2247
- type: object
2248
- required: [id, phase, question, why_now, recommendation, effects]
2249
- additionalProperties: false
2250
- properties:
2251
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2252
- phase: { type: string, minLength: 1 }
2253
- question: { type: string, minLength: 1 }
2254
- why_now: { type: string, minLength: 1 }
2255
- recommendation: { type: string, minLength: 1 }
2256
- options: { type: array, maxItems: 3, items: *decision_option }
2257
- evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
2258
- dependency_ids: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
2259
- effects: { type: object, minProperties: 1 }
2260
- blocking: { type: boolean, default: true }
2261
- output_schema:
2262
- type: object
2263
- required: [thread]
2264
- additionalProperties: false
2265
- properties:
2266
- thread: { type: object }
2267
- errors:
2268
- - { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
2269
- - { code: DECISION_NOT_SUPERSEDEABLE, description: 'decision item cannot be revised from its current state' }
2270
- - { code: DECISION_ALREADY_OPEN, description: 'another decision is already awaiting an answer' }
2271
- - { code: VALIDATION_ERROR, description: 'replacement question or revision reason is invalid' }
2272
- cli_subcommand: decision supersede
2273
- emits_events: [decision_opened]
2274
-
2275
- - name: decision.complete
2276
- family: decision
2277
- description: Complete a decision thread after its normalized state is settled, without creating an approval receipt or artifact checkpoint.
2278
- phase: '19'
2279
- writer_role: mcp
2280
- input_schema:
2281
- type: object
2282
- required: [id, summary]
2283
- additionalProperties: false
2284
- properties:
2285
- id: { type: string, minLength: 1 }
2286
- summary: { type: string, minLength: 1 }
2287
- applied_refs:
2288
- type: array
2289
- maxItems: 20
2290
- items:
2291
- type: object
2292
- required: [kind, ref]
2293
- additionalProperties: false
2294
- allOf:
2295
- - if:
2296
- properties:
2297
- kind: { enum: [baseline, change, workflow, task] }
2298
- required: [kind]
2299
- then:
2300
- required: [field, value]
2301
- - if:
2302
- properties:
2303
- kind: { enum: [spec, artifact] }
2304
- required: [kind]
2305
- then:
2306
- required: [digest]
2307
- not:
2308
- anyOf:
2309
- - { required: [field] }
2310
- - { required: [value] }
2311
- properties:
2312
- kind: { type: string, enum: [baseline, change, workflow, task, spec, artifact] }
2313
- ref: { type: string, minLength: 1 }
2314
- field: { type: string, minLength: 1 }
2315
- value: {}
2316
- digest: { type: string, pattern: '^[0-9a-f]{64}$' }
2317
- output_schema:
2318
- type: object
2319
- required: [thread]
2320
- additionalProperties: false
2321
- properties:
2322
- thread: { type: object }
2323
- errors:
2324
- - { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
2325
- - { code: DECISION_THREAD_NOT_MUTABLE, description: 'the decision thread is already terminal' }
2326
- - { code: DECISION_CHECKPOINT_PENDING, description: 'a prepared artifact checkpoint must be confirmed or revised first' }
2327
- - { code: DECISION_ALIGNMENT_BLOCKING, description: 'an unanswered question or blocking deferral prevents completion' }
2328
- - { code: DECISION_APPLIED_REF_NOT_FOUND, description: 'an applied authority reference cannot be read back from the current project state' }
2329
- - { code: DECISION_APPLIED_REF_FIELD_NOT_FOUND, description: 'a row-backed applied authority field does not exist' }
2330
- - { code: DECISION_APPLIED_REF_VALUE_MISMATCH, description: 'a row-backed applied authority value does not match current state' }
2331
- - { code: DECISION_APPLIED_REF_STALE, description: 'an applied field, specification, or artifact digest does not match current content' }
2332
- - { code: VALIDATION_ERROR, description: 'the completion summary or applied authority references are invalid' }
2333
- cli_subcommand: decision complete
2334
- emits_events: [decision_thread_completed]
2335
-
2336
- - name: decision.checkpoint
2337
- family: decision
2338
- description: Prepare or confirm a decision checkpoint, including renewal of unchanged decisions against current artifacts; change- and workflow-bound threads require an artifact, while a standalone baseline thread may record an explicit no-artifact reason.
2339
- phase: '16'
2340
- writer_role: mcp
2341
- input_schema:
2342
- type: object
2343
- required: [id, action]
2344
- additionalProperties: false
2345
- properties:
2346
- id: { type: string }
2347
- action: { type: string, enum: [prepare, confirm] }
2348
- summary: { type: string, minLength: 1 }
2349
- approved_by: { type: string, minLength: 1 }
2350
- approval_note: { type: string, minLength: 3 }
2351
- artifacts:
2352
- type: array
2353
- items:
2354
- type: object
2355
- required: [path, kind]
2356
- additionalProperties: false
2357
- properties:
2358
- path: { type: string, minLength: 1 }
2359
- kind: { type: string, minLength: 1 }
2360
- no_artifact_reason: { type: string, minLength: 3 }
2361
- output_schema:
2362
- type: object
2363
- required: [thread]
2364
- additionalProperties: false
2365
- properties:
2366
- thread: { type: object }
2367
- errors:
2368
- - { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
2369
- - { code: DECISION_THREAD_NOT_MUTABLE, description: 'cancelled decision thread cannot be checkpointed' }
2370
- - { code: DECISION_ALIGNMENT_BLOCKING, description: 'an open or deferred blocking decision prevents checkpointing' }
2371
- - { code: DECISION_CHECKPOINT_STALE, description: 'prepared decision digest no longer matches current authority' }
2372
- - { code: DECISION_ARTIFACT_REQUIRED, description: 'confirmation lacks required artifact bindings; no-artifact reasons are allowed only for standalone baseline thinking' }
2373
- - { code: DECISION_ARTIFACT_MISSING, description: 'a declared checkpoint artifact does not exist' }
2374
- - { code: VALIDATION_ERROR, description: 'checkpoint action, approval, or artifact input is invalid' }
2375
- cli_subcommand: decision checkpoint
2376
- emits_events: [decision_checkpoint_prepared, decision_checkpoint_confirmed]
2377
-
2378
- # ────────────────────────── workflow family ────────────────────────────
2379
- - name: workflow.start
2380
- family: workflow
2381
- description: Start one durable Ultra workflow run. For research, the host supplies normalized accepted semantic coverage after user-model alignment; MCP records and validates the state without choosing or proving user intent.
2382
- phase: '13'
2383
- writer_role: mcp
2384
- input_schema:
2385
- type: object
2386
- required: [kind, subject]
2387
- additionalProperties: false
2388
- properties:
2389
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2390
- kind: { type: string, enum: [init, research, plan, change, dev, test, review, deliver] }
2391
- subject: { type: string, minLength: 3 }
2392
- mode: { type: string, enum: [full, adoption, product, feature, architecture, custom] }
2393
- selected_steps: { type: array, uniqueItems: true, items: { type: string } }
2394
- coverage:
2395
- type: array
2396
- minItems: 1
2397
- items:
2398
- type: object
2399
- required: [step_id, disposition, rationale]
2400
- additionalProperties: false
2401
- properties:
2402
- step_id: { type: string, minLength: 1 }
2403
- disposition: { type: string, enum: [execute, verify_existing, reuse, not_applicable, deferred] }
2404
- rationale: { type: string, minLength: 3 }
2405
- evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
2406
- accepted_by: { type: string, minLength: 1 }
2407
- consequence: { type: string, minLength: 3 }
2408
- baseline_id: { type: string }
2409
- change_id: { type: string }
2410
- task_id: { type: string }
2411
- metadata: { type: object }
2412
- output_schema:
2413
- type: object
2414
- required: [workflow]
2415
- additionalProperties: false
2416
- properties:
2417
- workflow: { type: object }
2418
- errors:
2419
- - { code: VALIDATION_ERROR, description: 'definition, mode, selection, or linked authority is invalid' }
2420
- - { code: DUPLICATE_WORKFLOW_ID, description: 'workflow id already exists' }
2421
- - { code: WORKFLOW_IN_PROGRESS, description: 'the same authority already has an active workflow of this kind' }
2422
- - { code: WORKFLOW_CHANGE_NOT_FOUND, description: 'the requested change authority does not exist' }
2423
- - { code: WORKFLOW_SCOPE_INVALID, description: 'the workflow kind received a task or change scope that it does not own' }
2424
- - { code: WORKFLOW_CHANGE_RUN_REQUIRED, description: 'change-bound stages require the owning durable change workflow; legacy gaps route through doctor repair' }
2425
- - { code: WORKFLOW_BASELINE_MISMATCH, description: 'a supplied stage baseline differs from the baseline bound by the owning change workflow' }
2426
- - { code: WORKFLOW_BASELINE_NOT_READY, description: 'the baseline bound to the change is no longer ready' }
2427
- - { code: WORKFLOW_BASELINE_REQUIRED, description: 'a baseline-free plan is valid only for an approved incident break-glass change' }
2428
- - { code: WORKFLOW_CHANGE_NOT_MUTABLE, description: 'the owning change does not accept a new workflow of this stage' }
2429
- - { code: WORKFLOW_AUTHORITY_REQUIRED, description: 'the workflow is missing its required baseline, change, or task authority' }
2430
- - { code: WORKFLOW_CHANGE_DECISION_BLOCKING, description: 'the change contains unresolved material owner decisions' }
2431
- - { code: WORKFLOW_CHANGE_RESEARCH_INCOMPLETE, description: 'the change-bound research disposition is not current and complete' }
2432
- - { code: WORKFLOW_RESEARCH_COVERAGE_REQUIRED, description: 'research requires accepted coverage with at least one applicable semantic area beyond synthesis' }
2433
- - { code: WORKFLOW_RESEARCH_COVERAGE_EVIDENCE_REQUIRED, description: 'reuse, verification, and not-applicable dispositions require evidence references' }
2434
- - { code: WORKFLOW_RESEARCH_SYNTHESIS_REQUIRED, description: 'research synthesis must execute, verify, or reuse durable evidence' }
2435
- - { code: WORKFLOW_RESEARCH_MODE_MISMATCH, description: 'the selected research mode does not match its authority or baseline mode' }
2436
- - { code: WORKFLOW_SELECTION_REASON_REQUIRED, description: 'research requires the model evidence rationale for its selected coverage' }
2437
- - { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'dev cannot start until the linked task contract is executable' }
2438
- - { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'linked task and change authority disagree' }
2439
- - { code: TASK_DEPENDENCIES_INCOMPLETE, description: 'dev cannot start while a task dependency remains incomplete' }
2440
- - { code: WORKFLOW_TASK_NOT_EXECUTABLE, description: 'the linked task status or stale marker forbids execution' }
2441
- - { code: WORKFLOW_PLAN_NOT_COMPLETED, description: 'dev requires a completed current change plan' }
2442
- - { code: WORKFLOW_PLAN_TASK_SET_STALE, description: 'the authoritative task set changed after plan convergence' }
2443
- - { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'a task contract was invalidated or changed after plan convergence' }
2444
- cli_subcommand: workflow start
2445
- emits_events: [workflow_started]
2446
-
2447
- - name: workflow.get
2448
- family: workflow
2449
- description: Read one workflow run with every step, current recovery position, blockers, and output freshness.
2450
- phase: '13'
2451
- readonly: true
2452
- input_schema:
2453
- type: object
2454
- required: [id]
2455
- additionalProperties: false
2456
- properties:
2457
- id: { type: string }
2458
- output_schema:
2459
- type: object
2460
- required: [workflow]
2461
- additionalProperties: false
2462
- properties:
2463
- workflow: { type: object }
2464
- errors:
2465
- - { code: WORKFLOW_NOT_FOUND, description: 'workflow id does not exist' }
2466
- cli_subcommand: workflow get
2467
- emits_events: []
2468
-
2469
- - name: workflow.list
2470
- family: workflow
2471
- description: List workflow runs by phase, state, baseline, change, or task authority.
2472
- phase: '13'
2473
- readonly: true
2474
- input_schema:
2475
- type: object
2476
- additionalProperties: false
2477
- properties:
2478
- kind: { type: string, enum: [init, research, plan, change, dev, test, review, deliver] }
2479
- status: { type: string, enum: [active, blocked, ready, completed, cancelled] }
2480
- baseline_id: { type: string }
2481
- change_id: { type: string }
2482
- task_id: { type: string }
2483
- limit: { type: integer, minimum: 1, maximum: 500, default: 100 }
2484
- output_schema:
2485
- type: object
2486
- required: [workflows, count]
2487
- additionalProperties: false
2488
- properties:
2489
- workflows: { type: array, items: { type: object } }
2490
- count: { type: integer, minimum: 0 }
2491
- errors:
2492
- - { code: STATE_DB_ERROR, description: 'workflow state could not be read' }
2493
- cli_subcommand: workflow list
2494
- emits_events: []
2495
-
2496
- - name: workflow.step
2497
- family: workflow
2498
- description: Record one canonical workflow-step transition with bounded evidence, durable output digests, decisions, or blockers.
2499
- phase: '13'
2500
- writer_role: mcp
2501
- input_schema:
2502
- type: object
2503
- required: [id, step_id, status]
2504
- additionalProperties: false
2505
- properties:
2506
- id: { type: string }
2507
- step_id: { type: string }
2508
- status: { type: string, enum: [in_progress, completed, skipped, blocked] }
2509
- evidence:
2510
- type: array
2511
- items:
2512
- type: object
2513
- required: [kind, ref, summary]
2514
- additionalProperties: false
2515
- properties:
2516
- kind: { type: string, minLength: 1 }
2517
- ref: { type: string, minLength: 1 }
2518
- summary: { type: string, minLength: 1 }
2519
- outputs:
2520
- type: array
2521
- items:
2522
- type: object
2523
- required: [path, kind]
2524
- additionalProperties: false
2525
- properties:
2526
- path: { type: string, minLength: 1 }
2527
- kind: { type: string, minLength: 1 }
2528
- decisions: { type: array, items: { type: object } }
2529
- semantic_records:
2530
- type: array
2531
- items:
2532
- type: object
2533
- required: [id, kind, status, summary, source_ref, evidence_refs, attributes, links]
2534
- additionalProperties: false
2535
- properties:
2536
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2537
- kind: { type: string, minLength: 1 }
2538
- status: { type: string, enum: [observed, verified, decided, accepted, unknown, not_applicable] }
2539
- summary: { type: string, minLength: 1 }
2540
- source_ref: { type: string, minLength: 3 }
2541
- evidence_refs: { type: array, minItems: 1, items: { type: string, minLength: 1 } }
2542
- attributes: { type: object }
2543
- links:
2544
- type: array
2545
- items:
2546
- type: object
2547
- required: [relation, target]
2548
- additionalProperties: false
2549
- properties:
2550
- relation: { type: string, minLength: 1 }
2551
- target: { type: string, minLength: 1 }
2552
- blockers: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
2553
- output_schema:
2554
- type: object
2555
- required: [workflow]
2556
- additionalProperties: false
2557
- properties:
2558
- workflow: { type: object }
2559
- errors:
2560
- - { code: WORKFLOW_NOT_FOUND, description: 'workflow id does not exist' }
2561
- - { code: WORKFLOW_NOT_MUTABLE, description: 'completed and cancelled workflows cannot accept step updates' }
2562
- - { code: WORKFLOW_STEP_NOT_FOUND, description: 'step is not part of the canonical workflow' }
2563
- - { code: ILLEGAL_WORKFLOW_STEP_TRANSITION, description: 'the requested step-state transition is not permitted' }
2564
- - { code: WORKFLOW_STEP_OUT_OF_ORDER, description: 'an earlier selected step remains incomplete' }
2565
- - { code: VALIDATION_ERROR, description: 'step evidence, output, decision, semantic, or blocker input is malformed' }
2566
- - { code: WORKFLOW_EVIDENCE_REQUIRED, description: 'the step cannot complete without evidence' }
2567
- - { code: WORKFLOW_OUTPUT_REQUIRED, description: 'the step cannot complete without a durable output' }
2568
- - { code: WORKFLOW_OUTPUT_MISSING, description: 'a declared output file is missing' }
2569
- - { code: WORKFLOW_ARTIFACT_SCOPE_INVALID, description: 'a Change-bound semantic or evidence artifact escaped its owning Change root' }
2570
- - { code: WORKFLOW_RESEARCH_REPORT_REQUIRED, description: 'a research step requires its immutable workflow-and-step-bound report path' }
2571
- - { code: WORKFLOW_RESEARCH_REPORT_INVALID, description: 'the research report is missing its required evidence structure' }
2572
- - { code: WORKFLOW_RESEARCH_SYNTHESIS_INCOMPLETE, description: 'full or adoption synthesis did not bind all baseline specifications and the distillate' }
2573
- - { code: WORKFLOW_SEMANTIC_RECORDS_REQUIRED, description: 'a research step did not persist typed semantic results' }
2574
- - { code: WORKFLOW_SEMANTIC_RECORD_INVALID, description: 'a semantic record does not satisfy its step contract' }
2575
- - { code: WORKFLOW_SEMANTIC_SOURCE_INVALID, description: 'a semantic record source is missing, outside the project, or lacks an anchor' }
2576
- - { code: WORKFLOW_SYNTHESIS_TRACE_INVALID, description: 'synthesis references missing research semantic records' }
2577
- - { code: WORKFLOW_BLOCKER_REQUIRED, description: 'blocked state requires a specific blocker code' }
2578
- - { code: WORKFLOW_CONTEXT_OUTPUT_REQUIRED, description: 'the stage requires its immutable Context Manifest v3 output' }
2579
- - { code: WORKFLOW_CONTEXT_MISMATCH, description: 'the context role, gate, change, task, or readiness does not match the stage' }
2580
- - { code: WORKFLOW_CONTEXT_AUTHORITY_MISMATCH, description: 'the context artifact does not match its DB snapshot row' }
2581
- - { code: WORKFLOW_CONTEXT_STALE, description: 'the context artifact no longer matches the current checkout' }
2582
- - { code: WORKFLOW_TASKS_REQUIRED, description: 'the stage requires at least one task bound to the change' }
2583
- - { code: WORKFLOW_TASK_NOT_COMPLETED, description: 'the required task development state has not converged' }
2584
- - { code: WORKFLOW_GATE_MISSING, description: 'a required completed dev, test, or review gate is missing' }
2585
- - { code: WORKFLOW_GATE_STALE, description: 'a required task or gate no longer matches current authority or checkout state' }
2586
- - { code: WORKFLOW_REVIEW_NOT_APPROVED, description: 'the required independent review axes have not passed' }
2587
- - { code: WORKFLOW_TEST_NOT_PASSED, description: 'the required current test gate has not passed' }
2588
- - { code: WORKFLOW_SESSION_ACTIVE, description: 'delivery is blocked while a bound execution session remains active' }
2589
- - { code: DECISION_ALIGNMENT_BLOCKING, description: 'matching owner decisions or artifact checkpoints are not current' }
2590
- cli_subcommand: workflow step
2591
- emits_events: [workflow_step_updated, workflow_blocked]
2592
-
2593
- - name: workflow.revise
2594
- family: workflow
2595
- description: Create a candidate revision of a completed workflow while preserving the accepted run and its provenance.
2596
- phase: '21'
2597
- writer_role: mcp
2598
- input_schema:
2599
- type: object
2600
- required: [id, replacement_id, subject, reason]
2601
- additionalProperties: false
2602
- properties:
2603
- id: { type: string, minLength: 1 }
2604
- replacement_id: { type: string, minLength: 1 }
2605
- subject: { type: string, minLength: 1 }
2606
- reason: { type: string, minLength: 3 }
2607
- output_schema:
2608
- type: object
2609
- required: [workflow]
2610
- additionalProperties: false
2611
- properties:
2612
- workflow: { type: object }
2613
- errors:
2614
- - { code: WORKFLOW_NOT_FOUND, description: 'prior workflow id does not exist' }
2615
- - { code: WORKFLOW_REVISION_SOURCE_NOT_ACCEPTED, description: 'only a completed workflow can be revised' }
2616
- - { code: WORKFLOW_ALREADY_SUPERSEDED, description: 'the prior workflow already has a replacement authority' }
2617
- - { code: WORKFLOW_IN_PROGRESS, description: 'a competing active workflow owns the same scope' }
2618
- cli_subcommand: workflow revise
2619
- emits_events: [workflow_started, workflow_revision_started]
2620
-
2621
- - name: workflow.supersede
2622
- family: workflow
2623
- description: Promote a completed candidate revision to current authority and invalidate only its transitive registry consumers.
2624
- phase: '21'
2625
- writer_role: mcp
2626
- input_schema:
2627
- type: object
2628
- required: [id, replacement_id, reason]
2629
- additionalProperties: false
2630
- properties:
2631
- id: { type: string, minLength: 1 }
2632
- replacement_id: { type: string, minLength: 1 }
2633
- reason: { type: string, minLength: 3 }
2634
- output_schema:
2635
- type: object
2636
- required: [superseded, workflow, invalidated, idempotent]
2637
- additionalProperties: false
2638
- properties:
2639
- superseded: { type: object }
2640
- workflow: { type: object }
2641
- invalidated: { type: array, items: { type: object } }
2642
- idempotent: { type: boolean }
2643
- errors:
2644
- - { code: WORKFLOW_NOT_FOUND, description: 'prior or replacement workflow id does not exist' }
2645
- - { code: WORKFLOW_SUPERSESSION_NOT_ACCEPTED, description: 'both workflow revisions must be completed' }
2646
- - { code: WORKFLOW_SUPERSESSION_AUTHORITY_MISMATCH, description: 'replacement binding or revision provenance differs' }
2647
- - { code: WORKFLOW_OUTPUT_STALE, description: 'replacement output authority is stale' }
2648
- - { code: WORKFLOW_ALREADY_SUPERSEDED, description: 'another replacement already owns authority' }
2649
- cli_subcommand: workflow supersede
2650
- emits_events: [workflow_superseded, workflow_invalidated, task_stale_marked]
2651
-
2652
- - name: workflow.complete
2653
- family: workflow
2654
- description: Complete a ready workflow only when every selected step is complete and every recorded output digest remains current. Plan approval is optional unless the host identified a material owner decision.
2655
- phase: '13'
2656
- writer_role: mcp
2657
- input_schema:
2658
- type: object
2659
- required: [id]
2660
- additionalProperties: false
2661
- properties:
2662
- id: { type: string }
2663
- approval:
2664
- type: object
2665
- required: [approved_by, approval_note]
2666
- additionalProperties: false
2667
- properties:
2668
- approved_by: { type: string, minLength: 1 }
2669
- approval_note: { type: string, minLength: 3 }
2670
- approved_at: { type: string, format: date-time }
2671
- output_schema:
2672
- type: object
2673
- required: [workflow]
2674
- additionalProperties: false
2675
- properties:
2676
- workflow: { type: object }
2677
- errors:
2678
- - { code: WORKFLOW_NOT_FOUND, description: 'workflow id does not exist' }
2679
- - { code: WORKFLOW_NOT_READY, description: 'selected steps or blockers remain incomplete' }
2680
- - { code: WORKFLOW_OUTPUT_STALE, description: 'a recorded output changed or disappeared' }
2681
- - { code: VALIDATION_ERROR, description: 'approval or completion input is malformed' }
2682
- - { code: WORKFLOW_TASKS_REQUIRED, description: 'plan completion requires a non-empty authoritative task set' }
2683
- - { code: TASK_NOT_FOUND, description: 'a task referenced by the authoritative plan no longer exists' }
2684
- - { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'one or more planned tasks lack an executable contract' }
2685
- - { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'a planned task is not owned by the workflow change' }
2686
- - { code: TASK_DEPENDENCY_MISSING, description: 'a planned dependency does not exist' }
2687
- - { code: TASK_DEPENDENCY_CYCLE, description: 'the planned task graph contains a cycle' }
2688
- - { code: WORKFLOW_PLAN_ARTIFACT_INVALID, description: 'the plan workflow did not produce exactly one valid JSON execution plan' }
2689
- - { code: WORKFLOW_PLAN_ARTIFACT_STALE, description: 'the execution-plan artifact differs from current DB task authority' }
2690
- - { code: WORKFLOW_PLAN_COVERAGE_INCOMPLETE, description: 'one or more accepted change outcomes have no executable task coverage' }
2691
- - { code: WORKFLOW_PLAN_ORPHAN_TASK, description: 'a task trace does not resolve to accepted change or research authority' }
2692
- - { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'a task was invalidated or changed before plan convergence' }
2693
- - { code: WORKFLOW_QUICK_PLAN_TOO_LARGE, description: 'a quick change contains more than one executable task' }
2694
- - { code: WORKFLOW_TASK_NOT_COMPLETED, description: 'dev convergence requires its task to be completed' }
2695
- - { code: WORKFLOW_APPROVAL_REQUIRED, description: 'when optional plan approval is supplied it requires approved_by and approval_note fields' }
2696
- - { code: WORKFLOW_SUMMARY_AUTHORITY_VIOLATION, description: 'Prompt summary fields are not allowed to replace DB-derived gate evidence or the complete change task set' }
2697
- - { code: WORKFLOW_APPROVAL_AUTHORITY_VIOLATION, description: 'only the plan workflow accepts completion approval' }
2698
- - { code: WORKFLOW_GATE_MISSING, description: 'a required completed dev, test, or review gate is missing' }
2699
- - { code: WORKFLOW_GATE_STALE, description: 'a required gate no longer matches its task contract or commit ancestry' }
2700
- - { code: WORKFLOW_REPORT_INVALID, description: 'a required report is malformed or incomplete' }
2701
- - { code: WORKFLOW_REPORT_CONTEXT_MISMATCH, description: 'a report is not bound to the recorded stage context digest' }
2702
- - { code: WORKFLOW_REPORT_REVISION_STALE, description: 'a report does not match the current full Git HEAD' }
2703
- - { code: WORKFLOW_REPORT_WORKTREE_STALE, description: 'a report does not match the current worktree digest' }
2704
- - { code: WORKFLOW_REPORT_TASK_SET_STALE, description: 'a report task set no longer matches the authoritative execution scope' }
2705
- - { code: WORKFLOW_REPORT_BASELINE_MISMATCH, description: 'a report no longer matches current baseline authority' }
2706
- - { code: WORKFLOW_REPORT_CHANGE_MISMATCH, description: 'a report is bound to a different change' }
2707
- - { code: WORKFLOW_REPORT_VERDICT_CONFLICT, description: 'the declared verdict conflicts with failures or blocking evidence' }
2708
- - { code: WORKFLOW_VERIFICATION_PROFILE_INVALID, description: 'the selected verification dimensions or exclusion rationale are invalid' }
2709
- - { code: WORKFLOW_REGRESSION_SIGNAL_MISSING, description: 'a reported regression fix lacks a failing-before signal' }
2710
- - { code: WORKFLOW_REVIEW_MODE_MISMATCH, description: 'the review summary scope differs from the workflow scope' }
2711
- - { code: WORKFLOW_REVIEW_EVIDENCE_MISMATCH, description: 'the review worker roster differs from persisted specialist artifacts' }
2712
- - { code: WORKFLOW_REVIEW_FINDINGS_MISMATCH, description: 'the unified review findings differ from specialist evidence' }
2713
- - { code: WORKFLOW_REVIEW_NOT_APPROVED, description: 'both independent review axes must pass' }
2714
- - { code: WORKFLOW_TEST_NOT_PASSED, description: 'the current change-level test gate did not pass' }
2715
- - { code: WORKFLOW_SESSION_ACTIVE, description: 'delivery cannot converge while an execution session remains active' }
2716
- - { code: WORKFLOW_CONTEXT_NOT_READY, description: 'delivery evidence lacks a current ready context manifest' }
2717
- - { code: WORKFLOW_CONTEXT_STALE, description: 'a required Context reference or bound task/change authority changed after compilation; optional drift remains a summary warning' }
2718
- - { code: WORKFLOW_DELIVERY_CHECK_FAILED, description: 'one or more local delivery checks did not pass' }
2719
- - { code: WORKFLOW_CHANGE_NOT_ARCHIVED, description: 'delivery completion requires an archived change' }
2720
- - { code: WORKFLOW_RELEASE_AUTHORITY_MISMATCH, description: 'a local delivery report attempted to claim external release authority' }
2721
- - { code: DECISION_ALIGNMENT_BLOCKING, description: 'matching owner decisions or artifact checkpoints are not current' }
2722
- cli_subcommand: workflow complete
2723
- emits_events: [workflow_completed, plan_approved]
2724
-
2725
- # ───────────────────────── artifact family ─────────────────────────────
2726
- - name: artifact.record
2727
- family: artifact
2728
- description: Register the current bytes of one semantic or evidence file, replace its dependency edges transactionally, and invalidate exact downstream consumers when its digest changes.
2729
- phase: '20'
2730
- writer_role: mcp
2731
- input_schema:
2732
- type: object
2733
- required: [owner_type, owner_id, kind, path, provenance, source_refs, consumer_refs]
2734
- additionalProperties: false
2735
- properties:
2736
- id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2737
- owner_type: { type: string, enum: [project, baseline, change, task, workflow] }
2738
- owner_id: { type: string, minLength: 1 }
2739
- kind: { type: string, minLength: 1 }
2740
- path: { type: string, minLength: 1 }
2741
- status: { type: string, enum: [current, stale, terminal, archived], default: current }
2742
- expected_before_digest:
2743
- type: [string, 'null']
2744
- pattern: '^[a-f0-9]{64}$'
2745
- provenance: { type: object, additionalProperties: true }
2746
- metadata: { type: object, additionalProperties: true }
2747
- source_refs:
2748
- type: array
2749
- items:
2750
- type: object
2751
- required: [type, id, relation]
2752
- additionalProperties: false
2753
- properties:
2754
- type: { type: string, enum: [artifact, project, baseline, change, task, workflow, external] }
2755
- id: { type: string, minLength: 1 }
2756
- relation: { type: string, minLength: 1 }
2757
- consumer_refs:
2758
- type: array
2759
- items:
2760
- type: object
2761
- required: [type, id, relation]
2762
- additionalProperties: false
2763
- properties:
2764
- type: { type: string, enum: [artifact, project, baseline, change, task, workflow, external] }
2765
- id: { type: string, minLength: 1 }
2766
- relation: { type: string, minLength: 1 }
2767
- output_schema:
2768
- type: object
2769
- required: [artifact, changed, invalidated]
2770
- additionalProperties: false
2771
- properties:
2772
- artifact:
2773
- type: object
2774
- required: [id, owner_type, owner_id, kind, path, digest, before_digest, after_digest, managed, status, provenance, metadata, source_refs, consumer_refs, created_at, updated_at]
2775
- additionalProperties: false
2776
- properties:
2777
- id: { type: string }
2778
- owner_type: { type: string, enum: [project, baseline, change, task, workflow] }
2779
- owner_id: { type: string }
2780
- kind: { type: string }
2781
- path: { type: string }
2782
- digest: { type: [string, 'null'] }
2783
- before_digest: { type: [string, 'null'] }
2784
- after_digest: { type: [string, 'null'] }
2785
- managed: { type: boolean }
2786
- status: { type: string, enum: [current, stale, terminal, archived] }
2787
- provenance: { type: object }
2788
- metadata: { type: object }
2789
- source_refs:
2790
- type: array
2791
- items:
2792
- type: object
2793
- required: [type, id, relation]
2794
- additionalProperties: false
2795
- properties:
2796
- type: { type: string }
2797
- id: { type: string }
2798
- relation: { type: string }
2799
- consumer_refs:
2800
- type: array
2801
- items:
2802
- type: object
2803
- required: [type, id, relation]
2804
- additionalProperties: false
2805
- properties:
2806
- type: { type: string }
2807
- id: { type: string }
2808
- relation: { type: string }
2809
- created_at: { type: string }
2810
- updated_at: { type: string }
2811
- changed: { type: boolean }
2812
- invalidated:
2813
- type: array
2814
- items:
2815
- type: object
2816
- required: [type, id]
2817
- additionalProperties: false
2818
- properties:
2819
- type: { type: string }
2820
- id: { type: string }
2821
- errors:
2822
- - { code: ARTIFACT_FILE_MISSING, description: 'declared artifact file does not exist' }
2823
- - { code: ARTIFACT_PATH_INVALID, description: 'artifact path escapes the project or is not a regular file' }
2824
- - { code: ARTIFACT_PATH_EXEMPT, description: 'runtime, scratch, or generated projection path cannot become semantic authority' }
2825
- - { code: ARTIFACT_OWNER_MISSING, description: 'typed artifact owner does not exist' }
2826
- - { code: ARTIFACT_ENDPOINT_MISSING, description: 'a dependency endpoint does not exist' }
2827
- - { code: ARTIFACT_DIGEST_CONFLICT, description: 'expected prior digest does not match current registry authority' }
2828
- - { code: ARTIFACT_AUTHORITY_CONFLICT, description: 'artifact id is bound to another authority or the canonical path already has an active authority' }
2829
- - { code: ARTIFACT_GRAPH_SELF_EDGE, description: 'an artifact cannot directly depend on itself' }
2830
- - { code: ARTIFACT_GRAPH_CYCLE, description: 'replacement edges would create a dependency cycle' }
2831
- cli_subcommand: artifact record
2832
- emits_events: [artifact_recorded, spec_changed, task_stale_marked]
2833
-
2834
- - name: artifact.get
2835
- family: artifact
2836
- description: Read one registered artifact together with its typed ownership, provenance, and normalized source and consumer edges.
2837
- phase: '20'
2838
- readonly: true
2839
- input_schema:
2840
- type: object
2841
- additionalProperties: false
2842
- oneOf:
2843
- - required: [id]
2844
- - required: [path]
2845
- properties:
2846
- id: { type: string, minLength: 1 }
2847
- path: { type: string, minLength: 1 }
2848
- output_schema:
2849
- type: object
2850
- required: [artifact]
2851
- additionalProperties: false
2852
- properties:
2853
- artifact:
2854
- type: object
2855
- required: [id, owner_type, owner_id, kind, path, digest, before_digest, after_digest, managed, status, provenance, metadata, source_refs, consumer_refs, created_at, updated_at]
2856
- additionalProperties: false
2857
- properties:
2858
- id: { type: string }
2859
- owner_type: { type: string, enum: [project, baseline, change, task, workflow] }
2860
- owner_id: { type: string }
2861
- kind: { type: string }
2862
- path: { type: string }
2863
- digest: { type: [string, 'null'] }
2864
- before_digest: { type: [string, 'null'] }
2865
- after_digest: { type: [string, 'null'] }
2866
- managed: { type: boolean }
2867
- status: { type: string, enum: [current, stale, terminal, archived] }
2868
- provenance: { type: object }
2869
- metadata: { type: object }
2870
- source_refs: { type: array, items: { type: object } }
2871
- consumer_refs: { type: array, items: { type: object } }
2872
- created_at: { type: string }
2873
- updated_at: { type: string }
2874
- errors:
2875
- - { code: ARTIFACT_NOT_FOUND, description: 'artifact id or path is not registered' }
2876
- - { code: ARTIFACT_DUPLICATE_AUTHORITY, description: 'path lookup resolves to multiple active authorities and requires an id' }
2877
- - { code: VALIDATION_ERROR, description: 'exactly one lookup key is required' }
2878
- cli_subcommand: artifact get
2879
- emits_events: []
2880
-
2881
- # ────────────────────────── system family ──────────────────────────────
2882
- - name: system.doctor
2883
- family: system
2884
- description: Inspect Ultra runtime health and optionally perform backup-first recovery and projection repair.
2885
- phase: '9'
2886
- writer_role: mcp
2887
- input_schema:
2888
- type: object
2889
- additionalProperties: false
2890
- properties:
2891
- repair: { type: boolean, default: false }
2892
- output_schema:
2893
- type: object
2894
- required: [status, checks, repair_performed]
2895
- additionalProperties: true
2896
- properties:
2897
- status: { type: string, enum: [healthy, degraded] }
2898
- checks: { type: object }
2899
- repair_performed: { type: boolean }
2900
- backup_path: { type: string }
2901
- repair: { type: object }
2902
- errors:
2903
- - { code: BACKUP_FAILED, description: 'state database backup failed before repair' }
2904
- - { code: STATE_DB_ERROR, description: 'runtime state could not be inspected' }
2905
- cli_subcommand: system doctor
2906
- emits_events: []
2907
-
2908
- # ────────────────────────── plan family (D34) ───────────────────────────
2909
- - name: plan.export
2910
- family: plan
2911
- description: Render deterministic plan.json and plan.md under the owning Change artifact root from the current planning Context Manifest.
2912
- phase: '8a'
2913
- writer_role: mcp
2914
- input_schema:
2915
- type: object
2916
- required: [change_id]
2917
- additionalProperties: false
2918
- properties:
2919
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2920
- output_schema:
2921
- type: object
2922
- required: [plan_path, plan_md_path, wave_count]
2923
- additionalProperties: false
2924
- properties:
2925
- plan_path: { type: string }
2926
- plan_md_path: { type: string }
2927
- wave_count: { type: integer, minimum: 0 }
2928
- errors:
2929
- - { code: NO_TASKS, description: 'no tasks to plan' }
2930
- - { code: CHANGE_NOT_FOUND, description: 'owning change does not exist' }
2931
- - { code: CHANGE_NOT_MUTABLE, description: 'owning change no longer accepts planning output' }
2932
- - { code: PLAN_CONTEXT_REQUIRED, description: 'the owning Change has no plan/planning Context Manifest' }
2933
- - { code: PLAN_CONTEXT_STALE, description: 'the plan/planning Context Manifest is stale or blocked' }
2934
- - { code: PLAN_ARTIFACT_PATH_UNSAFE, description: 'the Change artifact root, an ancestor, or a plan target is a symlink or escapes the physical project root' }
2935
- - { code: PLAN_PUBLISH_CONFLICT, description: 'plan.json or plan.md changed after publication preparation; concurrent bytes are preserved' }
2936
- - { code: PLAN_PUBLISH_FAILED, description: 'the journaled plan.json and plan.md publication could not complete and was rolled back' }
2937
- - { code: PLAN_RECOVERY_REQUIRED, description: 'an interrupted plan publication must be recovered before state mutation continues' }
2938
- - { code: ARTIFACT_AUTHORITY_CONFLICT, description: 'plan.json or plan.md already has another active registry authority' }
2939
- - { code: ARTIFACT_DIGEST_CONFLICT, description: 'the registered plan authority changed before publication' }
2940
- - { code: WRITE_FAILED, description: 'cannot write plan file' }
2941
- cli_subcommand: plan export
2942
- emits_events: [plan_exported]
2943
- trace_to: '§7.3, D34'
2944
-
2945
- - name: plan.get
2946
- family: plan
2947
- description: Read a section of the owning Change's persisted plan.json artifact.
2948
- phase: '8a'
2949
- readonly: true
2950
- input_schema:
2951
- type: object
2952
- required: [change_id]
2953
- additionalProperties: false
2954
- properties:
2955
- change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
2956
- section: { type: string, enum: [tasks, topo, conflicts, all], default: all }
2957
- output_schema:
2958
- type: object
2959
- required: [plan]
2960
- additionalProperties: false
2961
- properties:
2962
- plan: { type: object }
2963
- errors:
2964
- - { code: NO_PLAN, description: 'no plan has been computed yet' }
2965
- - { code: CHANGE_NOT_FOUND, description: 'owning change does not exist' }
2966
- - { code: PLAN_CHANGE_MISMATCH, description: 'current plan artifact belongs to another change' }
2967
- - { code: PLAN_ARTIFACT_INVALID, description: 'plan.json is unsafe, malformed, stale, or does not match the current Change-owned registry authority' }
2968
- cli_subcommand: plan get
2969
- emits_events: []
2970
- trace_to: '§7.3, D34'