ultra-builder-pro-cli 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ultra-template/docs/research/README.md +4 -4
- package/CHANGELOG.md +45 -0
- package/README.md +21 -18
- package/adapters/_shared/codex-assets.cjs +121 -65
- package/adapters/_shared/interaction-contract.cjs +7 -1
- package/adapters/_shared/provenance.cjs +7 -2
- package/adapters/_shared/runtime-assets.cjs +3 -2
- package/adapters/_shared/runtime-native.cjs +132 -0
- package/adapters/claude.js +60 -30
- package/adapters/codex.js +178 -81
- package/adapters/grok.js +372 -0
- package/adapters/kimi.js +7 -3
- package/adapters/opencode.js +210 -32
- package/agents/code-reviewer.md +4 -2
- package/agents/debugger.md +4 -1
- package/agents/review-code.md +7 -3
- package/agents/review-comments.md +7 -4
- package/agents/review-coordinator.md +11 -7
- package/agents/review-design.md +8 -4
- package/agents/review-errors.md +8 -4
- package/agents/review-spec.md +8 -5
- package/agents/review-tests.md +7 -4
- package/agents/tdd-runner.md +5 -2
- package/bin/install.js +9 -4
- package/bin/orchestrator.js +4 -13
- package/docs/AGENT-CONTEXT.md +141 -229
- package/docs/ARCHITECTURE.md +203 -494
- package/docs/ARTIFACT-AUTHORITY.md +26 -22
- package/docs/PLUGIN-ISOLATION-CONTRACT.md +12 -9
- package/docs/ROADMAP.md +85 -110
- package/docs/RUNTIME-COMPAT-MATRIX.md +139 -175
- package/docs/SKILL-AUTHORING.md +3 -3
- package/docs/STATE-DB-ACCESS-POLICY.md +13 -8
- package/docs/WORKFLOW-LIFECYCLE.md +174 -448
- package/hooks/README.md +11 -8
- package/hooks/active_task_context.py +16 -16
- package/hooks/adapters/grok.py +134 -0
- package/hooks/{context_spine.py → context_envelope.py} +26 -22
- package/hooks/health_check.py +19 -29
- package/hooks/pre_stop_check.py +22 -12
- package/hooks/subagent_tracker.py +1 -1
- package/hooks/workflow_checkpoint.py +14 -13
- package/hooks/workflow_context.py +11 -12
- package/hooks/workflow_resume.py +14 -13
- package/mcp-server/{breadcrumb.cjs → hook-context.cjs} +7 -9
- package/mcp-server/lib/baseline-workflow.cjs +36 -38
- package/mcp-server/lib/canonical-json.cjs +19 -0
- package/mcp-server/lib/change-workflow.cjs +596 -44
- package/mcp-server/lib/context-envelope.cjs +508 -0
- package/mcp-server/lib/decision-records.cjs +337 -0
- package/mcp-server/lib/doctor.cjs +91 -33
- package/mcp-server/lib/init-project.cjs +78 -39
- package/mcp-server/lib/managed-file-write.cjs +116 -0
- package/mcp-server/lib/plan-checkpoint.cjs +177 -0
- package/mcp-server/lib/project-context.cjs +178 -0
- package/mcp-server/lib/stage-checkpoints.cjs +309 -0
- package/mcp-server/lib/state-db.cjs +155 -24
- package/mcp-server/lib/task-ledger.cjs +522 -13
- package/mcp-server/lib/ultra-facade.cjs +630 -442
- package/mcp-server/lib/worker-packet.cjs +358 -0
- package/mcp-server/server.cjs +200 -1103
- package/orchestrator/daemon.cjs +27 -9
- package/orchestrator/parallel-orchestrator.cjs +111 -76
- package/orchestrator/session-runner.cjs +135 -34
- package/package.json +10 -3
- package/skills/ultra-change/SKILL.md +9 -8
- package/skills/ultra-deliver/SKILL.md +3 -3
- package/skills/ultra-dev/SKILL.md +18 -11
- package/skills/ultra-doctor/SKILL.md +2 -2
- package/skills/ultra-init/SKILL.md +6 -5
- package/skills/ultra-init/references/brownfield-adoption.md +11 -8
- package/skills/ultra-plan/SKILL.md +10 -8
- package/skills/ultra-research/SKILL.md +12 -7
- package/skills/ultra-review/SKILL.md +9 -6
- package/skills/ultra-review/references/unified-schema.md +2 -0
- package/skills/ultra-review/scripts/review_wait.py +8 -0
- package/skills/ultra-status/SKILL.md +2 -2
- package/skills/ultra-test/SKILL.md +4 -2
- package/skills/ultra-think/SKILL.md +7 -7
- package/skills/ultra-think/references/interaction-boundary.md +56 -0
- package/spec/cli-protocol.md +80 -199
- package/spec/mcp-tools.yaml +37 -2804
- package/spec/schemas/state-db.sql +107 -4
- package/spec/schemas/{task-ledger.v1.schema.json → task-ledger.v2.schema.json} +70 -6
- package/ultra-tools/commands/status.cjs +369 -243
- package/mcp-server/lib/context-spine.cjs +0 -1208
- package/mcp-server/lib/decision-dialogue.cjs +0 -1128
- package/mcp-server/lib/project-breadcrumb.cjs +0 -173
- package/mcp-server/lib/spec-learning.cjs +0 -284
- package/mcp-server/lib/workflow-state.cjs +0 -3129
- package/skills/ultra-think/references/decision-dialogue.md +0 -155
package/spec/mcp-tools.yaml
CHANGED
|
@@ -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: '
|
|
6
|
+
version: '2.0'
|
|
7
7
|
|
|
8
8
|
info:
|
|
9
9
|
title: Ultra Builder Pro MCP tool contracts
|
|
10
|
-
phase: '
|
|
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
|
|
17
|
-
cli_subcommand values reserve stable names
|
|
18
|
-
|
|
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,
|
|
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
|
|
40
|
-
phase: '
|
|
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: '
|
|
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: [
|
|
68
|
+
required: [kind, action, data, idempotency_key]
|
|
77
69
|
additionalProperties: false
|
|
78
70
|
properties:
|
|
79
|
-
|
|
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 }
|
|
@@ -90,7 +101,7 @@ tools:
|
|
|
90
101
|
- name: ultra.checkpoint
|
|
91
102
|
family: ultra
|
|
92
103
|
description: Attempt one semantic stage checkpoint. Failed semantic checks return blockers and leave the draft mutable; accepted checkpoints commit durable authority once.
|
|
93
|
-
phase: '
|
|
104
|
+
phase: '24'
|
|
94
105
|
writer_role: mcp
|
|
95
106
|
input_schema:
|
|
96
107
|
type: object
|
|
@@ -117,14 +128,14 @@ tools:
|
|
|
117
128
|
- name: ultra.sync
|
|
118
129
|
family: ultra
|
|
119
130
|
description: Inspect, import, or publish the Git team checkpoint while preserving local sessions and rejecting real concurrent team-state conflicts.
|
|
120
|
-
phase: '
|
|
131
|
+
phase: '24'
|
|
121
132
|
writer_role: mcp
|
|
122
133
|
input_schema:
|
|
123
134
|
type: object
|
|
124
135
|
required: [action]
|
|
125
136
|
additionalProperties: false
|
|
126
137
|
properties:
|
|
127
|
-
action: { type: string, enum: [inspect, import, publish] }
|
|
138
|
+
action: { type: string, enum: [inspect, import, publish, migrate] }
|
|
128
139
|
reason: { type: string }
|
|
129
140
|
idempotency_key: { type: string }
|
|
130
141
|
output_schema: { type: object }
|
|
@@ -137,7 +148,7 @@ tools:
|
|
|
137
148
|
- name: ultra.session
|
|
138
149
|
family: ultra
|
|
139
150
|
description: Acquire, inspect, heartbeat, or release the small execution lease that requires transactional concurrency control.
|
|
140
|
-
phase: '
|
|
151
|
+
phase: '24'
|
|
141
152
|
writer_role: mcp
|
|
142
153
|
input_schema:
|
|
143
154
|
type: object
|
|
@@ -158,7 +169,7 @@ tools:
|
|
|
158
169
|
- name: ultra.archive
|
|
159
170
|
family: ultra
|
|
160
171
|
description: Converge and archive one accepted Change through the recoverable filesystem and database transaction boundary.
|
|
161
|
-
phase: '
|
|
172
|
+
phase: '24'
|
|
162
173
|
writer_role: mcp
|
|
163
174
|
input_schema:
|
|
164
175
|
type: object
|
|
@@ -178,7 +189,7 @@ tools:
|
|
|
178
189
|
- name: ultra.doctor
|
|
179
190
|
family: ultra
|
|
180
191
|
description: Inspect mechanical health and optionally apply only backup-first deterministic repairs. Semantic choices remain with the model and owner.
|
|
181
|
-
phase: '
|
|
192
|
+
phase: '24'
|
|
182
193
|
writer_role: mcp
|
|
183
194
|
input_schema:
|
|
184
195
|
type: object
|
|
@@ -190,2781 +201,3 @@ tools:
|
|
|
190
201
|
- { code: STATE_CORRUPT, description: 'the state database cannot be inspected safely' }
|
|
191
202
|
- { code: BACKUP_FAILED, description: 'a required recovery backup could not be created' }
|
|
192
203
|
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'
|