ultra-builder-pro-cli 0.15.0 → 0.17.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/specs/research-distillate.md +4 -3
- package/CHANGELOG.md +120 -1
- package/README.md +67 -30
- package/adapters/_shared/codex-assets.cjs +10 -5
- package/adapters/_shared/handbook.cjs +3 -2
- package/adapters/_shared/interaction-contract.cjs +61 -0
- package/adapters/claude.js +1 -1
- package/adapters/opencode.js +1 -1
- package/bin/orchestrator.js +175 -19
- package/commands/ultra-change.md +1 -1
- package/commands/ultra-deliver.md +3 -3
- package/commands/ultra-init.md +1 -1
- package/commands/ultra-plan.md +1 -1
- package/commands/ultra-research.md +2 -2
- package/commands/ultra-review.md +10 -0
- package/commands/ultra-status.md +1 -1
- package/commands/ultra-test.md +1 -1
- package/commands/ultra-think.md +2 -2
- package/docs/AGENT-CONTEXT.md +38 -18
- package/docs/ARCHITECTURE.md +91 -13
- package/docs/LEGACY-CLI-CROSSWALK.md +163 -0
- package/docs/PLAN.zh-CN.md +19 -12
- package/docs/ROADMAP.md +5 -3
- package/docs/RUNTIME-COMPAT-MATRIX.md +4 -4
- package/docs/STATE-DB-ACCESS-POLICY.md +8 -6
- package/docs/USER-HANDBOOK-CONTRACT.md +8 -2
- package/docs/WORKFLOW-LIFECYCLE.md +179 -39
- package/hooks/pre_stop_check.py +3 -2
- package/mcp-server/lib/baseline-workflow.cjs +84 -16
- package/mcp-server/lib/change-workflow.cjs +107 -39
- package/mcp-server/lib/context-spine.cjs +215 -87
- package/mcp-server/lib/decision-dialogue.cjs +713 -0
- package/mcp-server/lib/doctor.cjs +9 -0
- package/mcp-server/lib/git-bootstrap.cjs +240 -0
- package/mcp-server/lib/init-project.cjs +178 -41
- package/mcp-server/lib/project-breadcrumb.cjs +23 -14
- package/mcp-server/lib/state-db.cjs +279 -9
- package/mcp-server/lib/state-ops.cjs +64 -1
- package/mcp-server/lib/workflow-state.cjs +313 -205
- package/mcp-server/server.cjs +112 -34
- package/orchestrator/auto-merge.cjs +19 -0
- package/orchestrator/daemon.cjs +104 -0
- package/orchestrator/parallel-orchestrator.cjs +371 -49
- package/orchestrator/session-runner.cjs +354 -25
- package/package.json +2 -1
- package/skills/ultra-change/SKILL.md +69 -65
- package/skills/ultra-deliver/SKILL.md +37 -58
- package/skills/ultra-dev/SKILL.md +55 -49
- package/skills/ultra-doctor/SKILL.md +44 -49
- package/skills/ultra-init/SKILL.md +78 -100
- package/skills/ultra-plan/SKILL.md +78 -79
- package/skills/ultra-research/SKILL.md +99 -98
- package/skills/ultra-review/SKILL.md +38 -47
- package/skills/ultra-review/references/review-modes.md +5 -3
- package/skills/ultra-review/references/unified-schema.md +26 -6
- package/skills/ultra-review/scripts/review_wait.py +12 -0
- package/skills/ultra-status/SKILL.md +34 -40
- package/skills/ultra-test/SKILL.md +61 -48
- package/skills/ultra-think/SKILL.md +47 -47
- package/skills/ultra-think/references/decision-dialogue.md +106 -0
- package/spec/cli-protocol.md +46 -2
- package/spec/mcp-tools.yaml +444 -29
- package/spec/schemas/delivery-report.v1.schema.json +1 -46
- package/spec/schemas/mcp-tools.schema.json +1 -1
- package/spec/schemas/state-db.sql +66 -2
- package/spec/schemas/test-report.v1.schema.json +45 -14
- package/ultra-tools/cli.cjs +1 -1
- package/ultra-tools/commands/session.cjs +10 -3
- package/ultra-tools/commands/status.cjs +34 -14
- package/ultra-tools/commands/system.cjs +2 -2
- package/ultra-tools/commands/task.cjs +3 -0
package/spec/mcp-tools.yaml
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Validated by spec/schemas/mcp-tools.schema.json (run `npm run test:spec`).
|
|
4
4
|
# Trace: PLAN §7.3, decisions D12 / D29 / D31-D34.
|
|
5
5
|
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.3'
|
|
7
7
|
|
|
8
8
|
info:
|
|
9
9
|
title: Ultra Builder Pro MCP tool contracts
|
|
@@ -25,6 +25,7 @@ families:
|
|
|
25
25
|
- { name: plan, description: 'execution-plan artifact export and query (D34)', phase: '8a' }
|
|
26
26
|
- { name: baseline, description: 'project adoption, baseline evidence, convergence, and drift authority', phase: '11' }
|
|
27
27
|
- { name: change, description: 'continuous post-delivery change lifecycle and convergence', phase: '9' }
|
|
28
|
+
- { name: decision, description: 'durable owner-agent alignment, one-question presentation, and approved checkpoints', phase: '16' }
|
|
28
29
|
- { name: workflow, description: 'durable cross-stage run position, evidence, outputs, blockers, and recovery', phase: '13' }
|
|
29
30
|
- { name: system, description: 'read-only diagnostics and explicit backup-first repair', phase: '9' }
|
|
30
31
|
|
|
@@ -167,9 +168,10 @@ tools:
|
|
|
167
168
|
- { code: CHANGE_NOT_MUTABLE, description: 'assigned change no longer accepts task updates' }
|
|
168
169
|
- { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'task ownership conflicts with its parent or children' }
|
|
169
170
|
- { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'task is not executable until its outcome, seam, checks, evidence context, docs impact, ownership, and traceability are complete' }
|
|
171
|
+
- { code: TASK_STALE_RECONCILIATION_REQUIRED, description: 'stale can clear only while rebinding and validating the complete task execution contract' }
|
|
170
172
|
- { code: LEGACY_STATE_MIGRATION_REQUIRED, description: 'non-empty v4.4 projection must be migrated before state-backed tools can run' }
|
|
171
173
|
cli_subcommand: task update
|
|
172
|
-
emits_events: [task_started, task_completed, task_blocked, task_stale_marked]
|
|
174
|
+
emits_events: [task_started, task_completed, task_blocked, task_stale_marked, task_contract_updated, task_contract_reconciled]
|
|
173
175
|
trace_to: '§7.3, §7.2'
|
|
174
176
|
|
|
175
177
|
- name: task.list
|
|
@@ -280,9 +282,9 @@ tools:
|
|
|
280
282
|
- name: task.init_project
|
|
281
283
|
family: task
|
|
282
284
|
description: |
|
|
283
|
-
Bootstrap `.ultra
|
|
284
|
-
|
|
285
|
-
|
|
285
|
+
Bootstrap `.ultra/`, classify the repository, initialize or preserve local
|
|
286
|
+
Git authority, and complete the initialization workflow. It creates no
|
|
287
|
+
research run; research begins only through an explicit workflow.start.
|
|
286
288
|
phase: '3'
|
|
287
289
|
writer_role: mcp
|
|
288
290
|
input_schema:
|
|
@@ -308,6 +310,11 @@ tools:
|
|
|
308
310
|
enum: [auto, greenfield, brownfield]
|
|
309
311
|
default: auto
|
|
310
312
|
description: auto detects whether meaningful project content already exists
|
|
313
|
+
git_mode:
|
|
314
|
+
type: string
|
|
315
|
+
enum: [auto, initialize, skip]
|
|
316
|
+
default: auto
|
|
317
|
+
description: preserve an existing repository, initialize a missing local repository by default, or explicitly keep a non-Git workspace
|
|
311
318
|
resume:
|
|
312
319
|
type: boolean
|
|
313
320
|
default: false
|
|
@@ -328,7 +335,7 @@ tools:
|
|
|
328
335
|
description: override path to the template root (defaults to bundled templates/.ultra/)
|
|
329
336
|
output_schema:
|
|
330
337
|
type: object
|
|
331
|
-
required: [created_path, state_db_path, status, mode, baseline, copied_files, repository_profile, workflow]
|
|
338
|
+
required: [created_path, state_db_path, status, mode, baseline, copied_files, repository_profile, git, workflow]
|
|
332
339
|
additionalProperties: false
|
|
333
340
|
properties:
|
|
334
341
|
created_path:
|
|
@@ -354,9 +361,22 @@ tools:
|
|
|
354
361
|
repository_profile:
|
|
355
362
|
type: object
|
|
356
363
|
description: bounded classification evidence used to route greenfield or brownfield adoption
|
|
364
|
+
git:
|
|
365
|
+
type: object
|
|
366
|
+
required: [requested_mode, status, repository_root, branch, head, gitignore_path, gitignore_changed, initial_commit_required]
|
|
367
|
+
additionalProperties: false
|
|
368
|
+
properties:
|
|
369
|
+
requested_mode: { type: string, enum: [auto, initialize, skip] }
|
|
370
|
+
status: { type: string, enum: [initialized, existing, skipped] }
|
|
371
|
+
repository_root: { type: ['string', 'null'] }
|
|
372
|
+
branch: { type: ['string', 'null'] }
|
|
373
|
+
head: { type: ['string', 'null'] }
|
|
374
|
+
gitignore_path: { type: ['string', 'null'] }
|
|
375
|
+
gitignore_changed: { type: boolean }
|
|
376
|
+
initial_commit_required: { type: boolean }
|
|
357
377
|
workflow:
|
|
358
378
|
type: object
|
|
359
|
-
description:
|
|
379
|
+
description: completed initialization provenance, research status, and the allowed or required transitions
|
|
360
380
|
backup_path:
|
|
361
381
|
type: string
|
|
362
382
|
description: set only when status=overwritten
|
|
@@ -371,6 +391,9 @@ tools:
|
|
|
371
391
|
- { code: LEGACY_STATE_MIGRATION_REQUIRED, description: 'projection-only tasks must be imported before resume' }
|
|
372
392
|
- { code: STATE_AUTHORITY_CONFLICT, description: 'projection tasks and authoritative state cannot be reconciled automatically' }
|
|
373
393
|
- { code: STATE_PROJECTION_INVALID, description: 'the existing task projection is malformed' }
|
|
394
|
+
- { code: GIT_INIT_FAILED, description: 'the local Git repository or Ultra ignore rule could not be initialized' }
|
|
395
|
+
- { code: GITIGNORE_UNSAFE, description: 'root .gitignore is a symlink or non-file and cannot be updated safely' }
|
|
396
|
+
- { code: GITIGNORE_INEFFECTIVE, description: 'the effective Git rules still expose the `.ultra` authority' }
|
|
374
397
|
- { code: IO_ERROR, description: 'filesystem write failed', retriable: true }
|
|
375
398
|
cli_subcommand: task init-project
|
|
376
399
|
emits_events: [project_initialized, project_resumed]
|
|
@@ -422,7 +445,7 @@ tools:
|
|
|
422
445
|
|
|
423
446
|
- name: task.parse_prd
|
|
424
447
|
family: task
|
|
425
|
-
description: Validate a host-derived PRD task graph and optionally persist it
|
|
448
|
+
description: Validate a host-derived PRD task graph and optionally persist it inside the current plan workflow.
|
|
426
449
|
phase: '8a'
|
|
427
450
|
writer_role: mcp
|
|
428
451
|
input_schema:
|
|
@@ -447,7 +470,7 @@ tools:
|
|
|
447
470
|
files_modified: { type: array, items: { type: string } }
|
|
448
471
|
tag: { type: string }
|
|
449
472
|
change_id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$', description: 'continuous change unit that will own every persisted parsed task' }
|
|
450
|
-
dry_run: { type: boolean, default: false, description: 'when true,
|
|
473
|
+
dry_run: { type: boolean, default: false, description: 'when true, validate and preview without persisting to state.db' }
|
|
451
474
|
output_schema:
|
|
452
475
|
type: object
|
|
453
476
|
required: [tasks, topo]
|
|
@@ -563,7 +586,7 @@ tools:
|
|
|
563
586
|
# ────────────────────────── session family ──────────────────────────────
|
|
564
587
|
- name: session.spawn
|
|
565
588
|
family: session
|
|
566
|
-
description:
|
|
589
|
+
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.
|
|
567
590
|
phase: '4.5'
|
|
568
591
|
writer_role: mcp
|
|
569
592
|
input_schema:
|
|
@@ -574,26 +597,43 @@ tools:
|
|
|
574
597
|
task_id: { type: string }
|
|
575
598
|
runtime: { type: string, enum: [claude, opencode, codex, kimi] }
|
|
576
599
|
takeover: { type: boolean, default: false, description: 'override active lease (D33 takeover strategy)' }
|
|
577
|
-
worktree_base:
|
|
600
|
+
worktree_base:
|
|
601
|
+
type: string
|
|
602
|
+
description: optional path resolving inside the repository `.ultra/worktrees` boundary; outside paths are rejected
|
|
578
603
|
output_schema:
|
|
579
604
|
type: object
|
|
580
|
-
required: [sid, worktree_path, artifact_dir, lease_expires_at]
|
|
605
|
+
required: [sid, worktree_path, artifact_dir, lease_expires_at, worktree_created]
|
|
581
606
|
additionalProperties: false
|
|
582
607
|
properties:
|
|
583
608
|
sid: { type: string }
|
|
584
609
|
worktree_path: { type: string }
|
|
585
610
|
artifact_dir: { type: string }
|
|
586
611
|
lease_expires_at: { type: string, format: date-time }
|
|
612
|
+
worktree_created: { type: boolean }
|
|
587
613
|
errors:
|
|
588
614
|
- { code: TASK_NOT_FOUND, description: 'task id missing' }
|
|
589
615
|
- { code: ADMISSION_DENIED, description: 'active lease exists; choose takeover/resume/abandon' }
|
|
616
|
+
- { code: NESTED_SESSION_FORBIDDEN, description: 'an active worker must resume its assigned session instead of recursively spawning another one' }
|
|
617
|
+
- { code: TAKEOVER_FAILED, description: 'prior owned worker could not be terminated safely' }
|
|
618
|
+
- { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'change-owned task contract is incomplete' }
|
|
619
|
+
- { code: WORKFLOW_TASK_NOT_EXECUTABLE, description: 'task status or staleness blocks execution' }
|
|
620
|
+
- { code: TASK_DEPENDENCIES_INCOMPLETE, description: 'one or more task dependencies have not converged' }
|
|
621
|
+
- { code: WORKFLOW_PLAN_NOT_COMPLETED, description: 'owning change has no healthy completed plan workflow' }
|
|
622
|
+
- { code: WORKFLOW_PLAN_TASK_SET_STALE, description: 'change task set differs from the current converged plan' }
|
|
623
|
+
- { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'task contract differs from the current converged plan' }
|
|
624
|
+
- { code: WORKTREE_SCOPE_INVALID, description: 'requested worktree base escapes the managed project boundary' }
|
|
625
|
+
- { code: WORKTREE_FAILED, description: 'Git worktree creation failed or the repository has no usable HEAD' }
|
|
626
|
+
- { code: WORKTREE_AUTHORITY_MISSING, description: 'central `.ultra/state.db` disappeared before worktree binding' }
|
|
627
|
+
- { code: WORKTREE_AUTHORITY_NOT_IGNORED, description: 'a safe local ignore rule for the `.ultra` authority link could not be established' }
|
|
628
|
+
- { code: WORKTREE_AUTHORITY_CONFLICT, description: 'the isolated checkout already contains a conflicting `.ultra` entry' }
|
|
629
|
+
- { code: WORKTREE_AUTHORITY_LINK_FAILED, description: 'the isolated checkout could not be linked to central Ultra authority' }
|
|
590
630
|
cli_subcommand: session spawn
|
|
591
631
|
emits_events: [session_spawned]
|
|
592
632
|
trace_to: '§7.3, D20, D33'
|
|
593
633
|
|
|
594
634
|
- name: session.close
|
|
595
635
|
family: session
|
|
596
|
-
description: Close a session and release its lease.
|
|
636
|
+
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.
|
|
597
637
|
phase: '4.5'
|
|
598
638
|
writer_role: mcp
|
|
599
639
|
input_schema:
|
|
@@ -603,14 +643,19 @@ tools:
|
|
|
603
643
|
properties:
|
|
604
644
|
sid: { type: string }
|
|
605
645
|
status: { type: string, enum: [completed, crashed, orphan] }
|
|
646
|
+
remove_worktree: { type: boolean, default: false }
|
|
606
647
|
output_schema:
|
|
607
648
|
type: object
|
|
608
|
-
required: [ok]
|
|
649
|
+
required: [ok, worktree_preserved]
|
|
609
650
|
additionalProperties: false
|
|
610
651
|
properties:
|
|
611
652
|
ok: { type: boolean }
|
|
653
|
+
worktree_preserved: { type: boolean }
|
|
612
654
|
errors:
|
|
613
655
|
- { code: SESSION_NOT_FOUND, description: 'sid unknown' }
|
|
656
|
+
- { code: WORKER_SESSION_PARENT_OWNED, description: 'an active worker must exit and let its supervising parent settle the lease' }
|
|
657
|
+
- { code: SESSION_SCOPE_VIOLATION, description: 'an active worker attempted to close a session it does not own' }
|
|
658
|
+
- { code: WORKTREE_NOT_INTEGRATED, description: 'Explicit cleanup refused because work is uncommitted, unverified, or not integrated into the current checkout' }
|
|
614
659
|
cli_subcommand: session close
|
|
615
660
|
emits_events: [session_closed, session_crashed, session_orphaned]
|
|
616
661
|
trace_to: '§7.3, D32'
|
|
@@ -665,7 +710,7 @@ tools:
|
|
|
665
710
|
|
|
666
711
|
- name: session.admission_check
|
|
667
712
|
family: session
|
|
668
|
-
description: Check
|
|
713
|
+
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.
|
|
669
714
|
phase: '4.5'
|
|
670
715
|
readonly: true
|
|
671
716
|
input_schema:
|
|
@@ -692,6 +737,12 @@ tools:
|
|
|
692
737
|
enum: [spawn, takeover, resume, abandon, blocked_by_breaker]
|
|
693
738
|
errors:
|
|
694
739
|
- { code: TASK_NOT_FOUND, description: 'task id missing' }
|
|
740
|
+
- { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'change-owned task contract is incomplete' }
|
|
741
|
+
- { code: WORKFLOW_TASK_NOT_EXECUTABLE, description: 'task status or staleness blocks execution' }
|
|
742
|
+
- { code: TASK_DEPENDENCIES_INCOMPLETE, description: 'one or more task dependencies have not converged' }
|
|
743
|
+
- { code: WORKFLOW_PLAN_NOT_COMPLETED, description: 'owning change has no healthy completed plan workflow' }
|
|
744
|
+
- { code: WORKFLOW_PLAN_TASK_SET_STALE, description: 'change task set differs from the current converged plan' }
|
|
745
|
+
- { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'task contract differs from the current converged plan' }
|
|
695
746
|
cli_subcommand: session admission
|
|
696
747
|
emits_events: []
|
|
697
748
|
trace_to: '§7.3, D33'
|
|
@@ -931,6 +982,7 @@ tools:
|
|
|
931
982
|
errors:
|
|
932
983
|
- { code: BASELINE_NOT_FOUND, description: 'baseline id does not exist' }
|
|
933
984
|
- { code: BASELINE_NOT_MUTABLE, description: 'ready and superseded baselines are immutable' }
|
|
985
|
+
- { code: BASELINE_GIT_HEAD_REQUIRED, description: 'Git is initialized but the owner-authorized initial checkpoint commit does not exist' }
|
|
934
986
|
- { code: BASELINE_SPEC_MISSING, description: 'a declared specification file does not exist' }
|
|
935
987
|
- { code: BASELINE_SCOPE_MISSING, description: 'a selected baseline scope does not exist' }
|
|
936
988
|
- { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
|
|
@@ -994,7 +1046,7 @@ tools:
|
|
|
994
1046
|
# ────────────────────────── change family ──────────────────────────────
|
|
995
1047
|
- name: change.create
|
|
996
1048
|
family: change
|
|
997
|
-
description:
|
|
1049
|
+
description: Capture a continuous feature, fix, redesign, or incident change contract; incidents also register a five-section diagnosis artifact. Planning context is compiled separately.
|
|
998
1050
|
phase: '9'
|
|
999
1051
|
writer_role: mcp
|
|
1000
1052
|
input_schema:
|
|
@@ -1064,6 +1116,7 @@ tools:
|
|
|
1064
1116
|
mode: { type: ['string', 'null'], enum: [product, feature, architecture, custom, null] }
|
|
1065
1117
|
selected_steps: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1066
1118
|
rationale: { type: string, minLength: 1 }
|
|
1119
|
+
alignment_thread_id: { type: string, description: 'confirmed decision checkpoint that produced this change contract' }
|
|
1067
1120
|
base_commit: { type: string, pattern: '^[0-9a-f]{7,40}$' }
|
|
1068
1121
|
baseline_bypass:
|
|
1069
1122
|
type: object
|
|
@@ -1113,7 +1166,7 @@ tools:
|
|
|
1113
1166
|
properties:
|
|
1114
1167
|
change: { type: object }
|
|
1115
1168
|
intent_path: { type: string }
|
|
1116
|
-
context_manifest_path: { type: string }
|
|
1169
|
+
context_manifest_path: { type: ['string', 'null'] }
|
|
1117
1170
|
workflow: { type: object }
|
|
1118
1171
|
errors:
|
|
1119
1172
|
- { code: DUPLICATE_CHANGE_ID, description: 'change id already exists' }
|
|
@@ -1125,12 +1178,13 @@ tools:
|
|
|
1125
1178
|
- { code: CHANGE_CLASSIFICATION_REQUIRED, description: 'classification rationale or risk flags are incomplete' }
|
|
1126
1179
|
- { code: CHANGE_RESEARCH_DISPOSITION_REQUIRED, description: 'research routing is incomplete or inconsistent' }
|
|
1127
1180
|
- { code: CHANGE_PROFILE_ESCALATION_REQUIRED, description: 'quick profile conflicts with material risk or research' }
|
|
1181
|
+
- { 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' }
|
|
1128
1182
|
cli_subcommand: change create
|
|
1129
|
-
emits_events: [change_created,
|
|
1183
|
+
emits_events: [change_created, workflow_started, workflow_step_updated, workflow_completed]
|
|
1130
1184
|
|
|
1131
1185
|
- name: change.update
|
|
1132
1186
|
family: change
|
|
1133
|
-
description: Update change
|
|
1187
|
+
description: Update mutable change authority. Semantic changes invalidate every derived task and compiled context so they must be reconciled before execution.
|
|
1134
1188
|
phase: '9'
|
|
1135
1189
|
writer_role: mcp
|
|
1136
1190
|
input_schema:
|
|
@@ -1195,7 +1249,7 @@ tools:
|
|
|
1195
1249
|
- { code: ILLEGAL_CHANGE_TRANSITION, description: 'change transition is not permitted' }
|
|
1196
1250
|
- { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
|
|
1197
1251
|
cli_subcommand: change update
|
|
1198
|
-
emits_events: [change_updated]
|
|
1252
|
+
emits_events: [task_stale_marked, change_updated]
|
|
1199
1253
|
|
|
1200
1254
|
- name: change.get
|
|
1201
1255
|
family: change
|
|
@@ -1245,7 +1299,7 @@ tools:
|
|
|
1245
1299
|
|
|
1246
1300
|
- name: change.context
|
|
1247
1301
|
family: change
|
|
1248
|
-
description: Compile an immutable role-scoped Context Spine snapshot
|
|
1302
|
+
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.
|
|
1249
1303
|
phase: '10'
|
|
1250
1304
|
writer_role: mcp
|
|
1251
1305
|
input_schema:
|
|
@@ -1297,6 +1351,13 @@ tools:
|
|
|
1297
1351
|
revision: { type: string }
|
|
1298
1352
|
indexed_head: { type: string }
|
|
1299
1353
|
status: { type: string, enum: [available, unavailable, fresh, stale, unknown] }
|
|
1354
|
+
recommendation:
|
|
1355
|
+
type: object
|
|
1356
|
+
required: [workflow, rationale]
|
|
1357
|
+
additionalProperties: false
|
|
1358
|
+
properties:
|
|
1359
|
+
workflow: { type: string, minLength: 1 }
|
|
1360
|
+
rationale: { type: string, minLength: 3 }
|
|
1300
1361
|
code_graph:
|
|
1301
1362
|
type: object
|
|
1302
1363
|
required: [provider]
|
|
@@ -1323,14 +1384,14 @@ tools:
|
|
|
1323
1384
|
- { code: TASK_NOT_FOUND, description: 'task id is not linked to the change' }
|
|
1324
1385
|
- { code: EXECUTION_CONTRACT_CONFLICT, description: 'Prompt input attempted to override the DB-backed task seam or verification command' }
|
|
1325
1386
|
- { code: EXECUTION_CONTEXT_REFS_CONFLICT, description: 'Prompt input attempted to override DB-backed task context references' }
|
|
1326
|
-
- { code:
|
|
1387
|
+
- { code: CONTEXT_LEGACY_NEXT_ACTION_UNSUPPORTED, description: 'a canonical next action is not an MCP authority field; use a non-authoritative host recommendation' }
|
|
1327
1388
|
- { code: PROVIDER_CONTENT_FORBIDDEN, description: 'provider payload content must remain external' }
|
|
1328
1389
|
cli_subcommand: change context
|
|
1329
1390
|
emits_events: [context_updated]
|
|
1330
1391
|
|
|
1331
1392
|
- name: change.breadcrumb
|
|
1332
1393
|
family: change
|
|
1333
|
-
description: Read the compact DB-derived Context Spine position, readiness, and
|
|
1394
|
+
description: Read the compact DB-derived Context Spine position, readiness, allowed transitions, and any mechanically required recovery transition.
|
|
1334
1395
|
phase: '10'
|
|
1335
1396
|
readonly: true
|
|
1336
1397
|
writer_role: any
|
|
@@ -1476,10 +1537,303 @@ tools:
|
|
|
1476
1537
|
cli_subcommand: change archive
|
|
1477
1538
|
emits_events: [change_archived]
|
|
1478
1539
|
|
|
1540
|
+
# ────────────────────────── decision family ────────────────────────────
|
|
1541
|
+
- name: decision.thread_start
|
|
1542
|
+
family: decision
|
|
1543
|
+
description: Start one durable owner-agent alignment thread bound to baseline, change, or workflow authority.
|
|
1544
|
+
phase: '16'
|
|
1545
|
+
writer_role: mcp
|
|
1546
|
+
input_schema:
|
|
1547
|
+
type: object
|
|
1548
|
+
required: [id, purpose]
|
|
1549
|
+
additionalProperties: false
|
|
1550
|
+
properties:
|
|
1551
|
+
id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
|
|
1552
|
+
purpose: { type: string, minLength: 3 }
|
|
1553
|
+
mode: { type: string, enum: [guided, fast, autonomous, diagnostic], default: guided }
|
|
1554
|
+
baseline_id: { type: string }
|
|
1555
|
+
change_id: { type: string }
|
|
1556
|
+
workflow_run_id: { type: string }
|
|
1557
|
+
output_schema:
|
|
1558
|
+
type: object
|
|
1559
|
+
required: [thread]
|
|
1560
|
+
additionalProperties: false
|
|
1561
|
+
properties:
|
|
1562
|
+
thread: { type: object }
|
|
1563
|
+
errors:
|
|
1564
|
+
- { code: DECISION_AUTHORITY_REQUIRED, description: 'thread has no baseline, change, or workflow authority' }
|
|
1565
|
+
- { code: DECISION_AUTHORITY_MISMATCH, description: 'thread authority differs from its workflow binding' }
|
|
1566
|
+
- { code: DECISION_THREAD_IN_PROGRESS, description: 'the same authority and purpose already has an active thread' }
|
|
1567
|
+
- { code: DUPLICATE_DECISION_THREAD, description: 'decision thread id already exists' }
|
|
1568
|
+
- { code: VALIDATION_ERROR, description: 'thread input is incomplete or invalid' }
|
|
1569
|
+
cli_subcommand: decision thread-start
|
|
1570
|
+
emits_events: [decision_thread_started]
|
|
1571
|
+
|
|
1572
|
+
- name: decision.get
|
|
1573
|
+
family: decision
|
|
1574
|
+
description: Read one decision thread with its current question, normalized decisions, and checkpoint authority.
|
|
1575
|
+
phase: '16'
|
|
1576
|
+
readonly: true
|
|
1577
|
+
input_schema:
|
|
1578
|
+
type: object
|
|
1579
|
+
required: [id]
|
|
1580
|
+
additionalProperties: false
|
|
1581
|
+
properties:
|
|
1582
|
+
id: { type: string }
|
|
1583
|
+
output_schema:
|
|
1584
|
+
type: object
|
|
1585
|
+
required: [thread]
|
|
1586
|
+
additionalProperties: false
|
|
1587
|
+
properties:
|
|
1588
|
+
thread: { type: object }
|
|
1589
|
+
errors:
|
|
1590
|
+
- { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
|
|
1591
|
+
cli_subcommand: decision get
|
|
1592
|
+
emits_events: []
|
|
1593
|
+
|
|
1594
|
+
- name: decision.list
|
|
1595
|
+
family: decision
|
|
1596
|
+
description: List durable decision threads by authority, mode, or lifecycle state for recovery and status reporting.
|
|
1597
|
+
phase: '16'
|
|
1598
|
+
readonly: true
|
|
1599
|
+
input_schema:
|
|
1600
|
+
type: object
|
|
1601
|
+
additionalProperties: false
|
|
1602
|
+
properties:
|
|
1603
|
+
status: { type: string, enum: [active, checkpoint_ready, confirmed, cancelled] }
|
|
1604
|
+
mode: { type: string, enum: [guided, fast, autonomous, diagnostic] }
|
|
1605
|
+
baseline_id: { type: string }
|
|
1606
|
+
change_id: { type: string }
|
|
1607
|
+
workflow_run_id: { type: string }
|
|
1608
|
+
limit: { type: integer, minimum: 1, maximum: 500, default: 100 }
|
|
1609
|
+
output_schema:
|
|
1610
|
+
type: object
|
|
1611
|
+
required: [threads, count]
|
|
1612
|
+
additionalProperties: false
|
|
1613
|
+
properties:
|
|
1614
|
+
threads: { type: array, items: { type: object } }
|
|
1615
|
+
count: { type: integer, minimum: 0 }
|
|
1616
|
+
errors:
|
|
1617
|
+
- { code: STATE_DB_ERROR, description: 'decision thread state could not be read' }
|
|
1618
|
+
cli_subcommand: decision list
|
|
1619
|
+
emits_events: []
|
|
1620
|
+
|
|
1621
|
+
- name: decision.open
|
|
1622
|
+
family: decision
|
|
1623
|
+
description: Open the sole user-facing decision in a thread with evidence, recommendation, credible alternatives, and durable effects.
|
|
1624
|
+
phase: '16'
|
|
1625
|
+
writer_role: mcp
|
|
1626
|
+
input_schema:
|
|
1627
|
+
type: object
|
|
1628
|
+
required: [id, thread_id, phase, question, why_now, recommendation, effects]
|
|
1629
|
+
additionalProperties: false
|
|
1630
|
+
properties:
|
|
1631
|
+
id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
|
|
1632
|
+
thread_id: { type: string }
|
|
1633
|
+
phase: { type: string, minLength: 1 }
|
|
1634
|
+
question: { type: string, minLength: 1 }
|
|
1635
|
+
why_now: { type: string, minLength: 1 }
|
|
1636
|
+
recommendation: { type: string, minLength: 1 }
|
|
1637
|
+
options:
|
|
1638
|
+
type: array
|
|
1639
|
+
maxItems: 3
|
|
1640
|
+
items: &decision_option
|
|
1641
|
+
type: object
|
|
1642
|
+
required: [id, label, tradeoff]
|
|
1643
|
+
additionalProperties: false
|
|
1644
|
+
properties:
|
|
1645
|
+
id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
|
|
1646
|
+
label: { type: string, minLength: 1 }
|
|
1647
|
+
tradeoff: { type: string, minLength: 1 }
|
|
1648
|
+
evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1649
|
+
dependency_ids: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1650
|
+
effects: { type: object, minProperties: 1 }
|
|
1651
|
+
blocking: { type: boolean, default: true }
|
|
1652
|
+
output_schema:
|
|
1653
|
+
type: object
|
|
1654
|
+
required: [thread]
|
|
1655
|
+
additionalProperties: false
|
|
1656
|
+
properties:
|
|
1657
|
+
thread: { type: object }
|
|
1658
|
+
errors:
|
|
1659
|
+
- { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
|
|
1660
|
+
- { code: DECISION_ALREADY_OPEN, description: 'another decision is already awaiting an answer' }
|
|
1661
|
+
- { code: DECISION_CHECKPOINT_PENDING, description: 'the prepared checkpoint must be confirmed or revised first' }
|
|
1662
|
+
- { code: DECISION_DEPENDENCY_UNRESOLVED, description: 'a declared decision dependency is unresolved' }
|
|
1663
|
+
- { code: DUPLICATE_DECISION_ID, description: 'decision item id already exists' }
|
|
1664
|
+
- { code: VALIDATION_ERROR, description: 'question, recommendation, options, evidence, or effects are invalid' }
|
|
1665
|
+
cli_subcommand: decision open
|
|
1666
|
+
emits_events: [decision_opened]
|
|
1667
|
+
|
|
1668
|
+
- name: decision.resolve
|
|
1669
|
+
family: decision
|
|
1670
|
+
description: Resolve the current question as an explicit normalized owner decision without storing the conversation transcript.
|
|
1671
|
+
phase: '16'
|
|
1672
|
+
writer_role: mcp
|
|
1673
|
+
input_schema:
|
|
1674
|
+
type: object
|
|
1675
|
+
required: [id, decision, rationale, decided_by]
|
|
1676
|
+
additionalProperties: false
|
|
1677
|
+
properties:
|
|
1678
|
+
id: { type: string }
|
|
1679
|
+
decision: { type: string, minLength: 1 }
|
|
1680
|
+
rationale: { type: string, minLength: 1 }
|
|
1681
|
+
decided_by: { type: string, minLength: 1 }
|
|
1682
|
+
output_schema:
|
|
1683
|
+
type: object
|
|
1684
|
+
required: [thread]
|
|
1685
|
+
additionalProperties: false
|
|
1686
|
+
properties:
|
|
1687
|
+
thread: { type: object }
|
|
1688
|
+
errors:
|
|
1689
|
+
- { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
|
|
1690
|
+
- { code: DECISION_NOT_OPEN, description: 'decision item is no longer awaiting an answer' }
|
|
1691
|
+
- { code: VALIDATION_ERROR, description: 'normalized owner decision is incomplete' }
|
|
1692
|
+
cli_subcommand: decision resolve
|
|
1693
|
+
emits_events: [decision_resolved]
|
|
1694
|
+
|
|
1695
|
+
- name: decision.delegate
|
|
1696
|
+
family: decision
|
|
1697
|
+
description: Record explicit owner delegation for a reversible decision, including the selected result and non-negotiable guardrails.
|
|
1698
|
+
phase: '16'
|
|
1699
|
+
writer_role: mcp
|
|
1700
|
+
input_schema:
|
|
1701
|
+
type: object
|
|
1702
|
+
required: [id, delegated_to, decision, rationale, guardrails]
|
|
1703
|
+
additionalProperties: false
|
|
1704
|
+
properties:
|
|
1705
|
+
id: { type: string }
|
|
1706
|
+
delegated_to: { type: string, minLength: 1 }
|
|
1707
|
+
decision: { type: string, minLength: 1 }
|
|
1708
|
+
rationale: { type: string, minLength: 1 }
|
|
1709
|
+
guardrails: { type: array, minItems: 1, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1710
|
+
output_schema:
|
|
1711
|
+
type: object
|
|
1712
|
+
required: [thread]
|
|
1713
|
+
additionalProperties: false
|
|
1714
|
+
properties:
|
|
1715
|
+
thread: { type: object }
|
|
1716
|
+
errors:
|
|
1717
|
+
- { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
|
|
1718
|
+
- { code: DECISION_NOT_OPEN, description: 'decision item is no longer awaiting an answer' }
|
|
1719
|
+
- { code: VALIDATION_ERROR, description: 'delegation result or guardrails are incomplete' }
|
|
1720
|
+
cli_subcommand: decision delegate
|
|
1721
|
+
emits_events: [decision_resolved]
|
|
1722
|
+
|
|
1723
|
+
- name: decision.defer
|
|
1724
|
+
family: decision
|
|
1725
|
+
description: Defer the current decision with explicit consequences and a deterministic condition for revisiting it.
|
|
1726
|
+
phase: '16'
|
|
1727
|
+
writer_role: mcp
|
|
1728
|
+
input_schema:
|
|
1729
|
+
type: object
|
|
1730
|
+
required: [id, reason, consequences, revisit_condition]
|
|
1731
|
+
additionalProperties: false
|
|
1732
|
+
properties:
|
|
1733
|
+
id: { type: string }
|
|
1734
|
+
reason: { type: string, minLength: 1 }
|
|
1735
|
+
consequences: { type: string, minLength: 1 }
|
|
1736
|
+
revisit_condition: { type: string, minLength: 1 }
|
|
1737
|
+
output_schema:
|
|
1738
|
+
type: object
|
|
1739
|
+
required: [thread]
|
|
1740
|
+
additionalProperties: false
|
|
1741
|
+
properties:
|
|
1742
|
+
thread: { type: object }
|
|
1743
|
+
errors:
|
|
1744
|
+
- { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
|
|
1745
|
+
- { code: DECISION_NOT_OPEN, description: 'decision item is no longer awaiting an answer' }
|
|
1746
|
+
- { code: VALIDATION_ERROR, description: 'deferral consequence or revisit condition is incomplete' }
|
|
1747
|
+
cli_subcommand: decision defer
|
|
1748
|
+
emits_events: [decision_resolved]
|
|
1749
|
+
|
|
1750
|
+
- name: decision.supersede
|
|
1751
|
+
family: decision
|
|
1752
|
+
description: Preserve a prior resolved decision and reopen alignment with one replacement question when evidence or owner intent changes.
|
|
1753
|
+
phase: '16'
|
|
1754
|
+
writer_role: mcp
|
|
1755
|
+
input_schema:
|
|
1756
|
+
type: object
|
|
1757
|
+
required: [id, reason, replacement]
|
|
1758
|
+
additionalProperties: false
|
|
1759
|
+
properties:
|
|
1760
|
+
id: { type: string }
|
|
1761
|
+
reason: { type: string, minLength: 1 }
|
|
1762
|
+
replacement:
|
|
1763
|
+
type: object
|
|
1764
|
+
required: [id, phase, question, why_now, recommendation, effects]
|
|
1765
|
+
additionalProperties: false
|
|
1766
|
+
properties:
|
|
1767
|
+
id: { type: string, pattern: '^[a-zA-Z0-9_\-]+$' }
|
|
1768
|
+
phase: { type: string, minLength: 1 }
|
|
1769
|
+
question: { type: string, minLength: 1 }
|
|
1770
|
+
why_now: { type: string, minLength: 1 }
|
|
1771
|
+
recommendation: { type: string, minLength: 1 }
|
|
1772
|
+
options: { type: array, maxItems: 3, items: *decision_option }
|
|
1773
|
+
evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1774
|
+
dependency_ids: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1775
|
+
effects: { type: object, minProperties: 1 }
|
|
1776
|
+
blocking: { type: boolean, default: true }
|
|
1777
|
+
output_schema:
|
|
1778
|
+
type: object
|
|
1779
|
+
required: [thread]
|
|
1780
|
+
additionalProperties: false
|
|
1781
|
+
properties:
|
|
1782
|
+
thread: { type: object }
|
|
1783
|
+
errors:
|
|
1784
|
+
- { code: DECISION_NOT_FOUND, description: 'decision item id does not exist' }
|
|
1785
|
+
- { code: DECISION_NOT_SUPERSEDEABLE, description: 'decision item cannot be revised from its current state' }
|
|
1786
|
+
- { code: DECISION_ALREADY_OPEN, description: 'another decision is already awaiting an answer' }
|
|
1787
|
+
- { code: VALIDATION_ERROR, description: 'replacement question or revision reason is invalid' }
|
|
1788
|
+
cli_subcommand: decision supersede
|
|
1789
|
+
emits_events: [decision_opened]
|
|
1790
|
+
|
|
1791
|
+
- name: decision.checkpoint
|
|
1792
|
+
family: decision
|
|
1793
|
+
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.
|
|
1794
|
+
phase: '16'
|
|
1795
|
+
writer_role: mcp
|
|
1796
|
+
input_schema:
|
|
1797
|
+
type: object
|
|
1798
|
+
required: [id, action]
|
|
1799
|
+
additionalProperties: false
|
|
1800
|
+
properties:
|
|
1801
|
+
id: { type: string }
|
|
1802
|
+
action: { type: string, enum: [prepare, confirm] }
|
|
1803
|
+
summary: { type: string, minLength: 1 }
|
|
1804
|
+
approved_by: { type: string, minLength: 1 }
|
|
1805
|
+
approval_note: { type: string, minLength: 3 }
|
|
1806
|
+
artifacts:
|
|
1807
|
+
type: array
|
|
1808
|
+
items:
|
|
1809
|
+
type: object
|
|
1810
|
+
required: [path, kind]
|
|
1811
|
+
additionalProperties: false
|
|
1812
|
+
properties:
|
|
1813
|
+
path: { type: string, minLength: 1 }
|
|
1814
|
+
kind: { type: string, minLength: 1 }
|
|
1815
|
+
no_artifact_reason: { type: string, minLength: 3 }
|
|
1816
|
+
output_schema:
|
|
1817
|
+
type: object
|
|
1818
|
+
required: [thread]
|
|
1819
|
+
additionalProperties: false
|
|
1820
|
+
properties:
|
|
1821
|
+
thread: { type: object }
|
|
1822
|
+
errors:
|
|
1823
|
+
- { code: DECISION_THREAD_NOT_FOUND, description: 'decision thread id does not exist' }
|
|
1824
|
+
- { code: DECISION_THREAD_NOT_MUTABLE, description: 'cancelled decision thread cannot be checkpointed' }
|
|
1825
|
+
- { code: DECISION_ALIGNMENT_BLOCKING, description: 'an open or deferred blocking decision prevents checkpointing' }
|
|
1826
|
+
- { code: DECISION_CHECKPOINT_STALE, description: 'prepared decision digest no longer matches current authority' }
|
|
1827
|
+
- { code: DECISION_ARTIFACT_REQUIRED, description: 'confirmation lacks required artifact bindings; no-artifact reasons are allowed only for standalone baseline thinking' }
|
|
1828
|
+
- { code: DECISION_ARTIFACT_MISSING, description: 'a declared checkpoint artifact does not exist' }
|
|
1829
|
+
- { code: VALIDATION_ERROR, description: 'checkpoint action, approval, or artifact input is invalid' }
|
|
1830
|
+
cli_subcommand: decision checkpoint
|
|
1831
|
+
emits_events: [decision_checkpoint_prepared, decision_checkpoint_confirmed]
|
|
1832
|
+
|
|
1479
1833
|
# ────────────────────────── workflow family ────────────────────────────
|
|
1480
1834
|
- name: workflow.start
|
|
1481
1835
|
family: workflow
|
|
1482
|
-
description: Start one durable Ultra workflow run
|
|
1836
|
+
description: Start one durable Ultra workflow run. For full or adoption research, the host model must disposition every semantic coverage area without being forced to execute every area.
|
|
1483
1837
|
phase: '13'
|
|
1484
1838
|
writer_role: mcp
|
|
1485
1839
|
input_schema:
|
|
@@ -1492,6 +1846,20 @@ tools:
|
|
|
1492
1846
|
subject: { type: string, minLength: 3 }
|
|
1493
1847
|
mode: { type: string, enum: [full, adoption, product, feature, architecture, custom] }
|
|
1494
1848
|
selected_steps: { type: array, uniqueItems: true, items: { type: string } }
|
|
1849
|
+
coverage:
|
|
1850
|
+
type: array
|
|
1851
|
+
minItems: 1
|
|
1852
|
+
items:
|
|
1853
|
+
type: object
|
|
1854
|
+
required: [step_id, disposition, rationale]
|
|
1855
|
+
additionalProperties: false
|
|
1856
|
+
properties:
|
|
1857
|
+
step_id: { type: string, minLength: 1 }
|
|
1858
|
+
disposition: { type: string, enum: [execute, verify_existing, reuse, not_applicable, deferred] }
|
|
1859
|
+
rationale: { type: string, minLength: 3 }
|
|
1860
|
+
evidence_refs: { type: array, uniqueItems: true, items: { type: string, minLength: 1 } }
|
|
1861
|
+
accepted_by: { type: string, minLength: 1 }
|
|
1862
|
+
consequence: { type: string, minLength: 3 }
|
|
1495
1863
|
baseline_id: { type: string }
|
|
1496
1864
|
change_id: { type: string }
|
|
1497
1865
|
task_id: { type: string }
|
|
@@ -1509,10 +1877,24 @@ tools:
|
|
|
1509
1877
|
- { code: WORKFLOW_CHANGE_NOT_FOUND, description: 'the requested change authority does not exist' }
|
|
1510
1878
|
- { code: WORKFLOW_CHANGE_RUN_REQUIRED, description: 'change-bound stages require the owning durable change workflow; legacy gaps route through doctor repair' }
|
|
1511
1879
|
- { code: WORKFLOW_BASELINE_MISMATCH, description: 'a supplied stage baseline differs from the baseline bound by the owning change workflow' }
|
|
1880
|
+
- { code: WORKFLOW_BASELINE_NOT_READY, description: 'the baseline bound to the change is no longer ready' }
|
|
1512
1881
|
- { code: WORKFLOW_BASELINE_REQUIRED, description: 'a baseline-free plan is valid only for an approved incident break-glass change' }
|
|
1513
1882
|
- { code: WORKFLOW_CHANGE_NOT_MUTABLE, description: 'the owning change does not accept a new workflow of this stage' }
|
|
1883
|
+
- { code: WORKFLOW_AUTHORITY_REQUIRED, description: 'the workflow is missing its required baseline, change, or task authority' }
|
|
1884
|
+
- { code: WORKFLOW_CHANGE_DECISION_BLOCKING, description: 'the change contains unresolved material owner decisions' }
|
|
1885
|
+
- { code: WORKFLOW_CHANGE_RESEARCH_INCOMPLETE, description: 'the change-bound research disposition is not current and complete' }
|
|
1886
|
+
- { code: WORKFLOW_RESEARCH_COVERAGE_REQUIRED, description: 'full and adoption research require a disposition for every semantic area' }
|
|
1887
|
+
- { code: WORKFLOW_RESEARCH_COVERAGE_EVIDENCE_REQUIRED, description: 'reuse, verification, and not-applicable dispositions require evidence references' }
|
|
1888
|
+
- { code: WORKFLOW_RESEARCH_SYNTHESIS_REQUIRED, description: 'research synthesis must execute, verify, or reuse durable evidence' }
|
|
1889
|
+
- { code: WORKFLOW_RESEARCH_MODE_MISMATCH, description: 'the selected research mode does not match its authority or baseline mode' }
|
|
1890
|
+
- { code: WORKFLOW_SELECTION_REASON_REQUIRED, description: 'bounded research requires an explicit owner-selected scope reason' }
|
|
1514
1891
|
- { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'dev cannot start until the linked task contract is executable' }
|
|
1515
1892
|
- { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'linked task and change authority disagree' }
|
|
1893
|
+
- { code: TASK_DEPENDENCIES_INCOMPLETE, description: 'dev cannot start while a task dependency remains incomplete' }
|
|
1894
|
+
- { code: WORKFLOW_TASK_NOT_EXECUTABLE, description: 'the linked task status or stale marker forbids execution' }
|
|
1895
|
+
- { code: WORKFLOW_PLAN_NOT_COMPLETED, description: 'dev requires a completed current change plan' }
|
|
1896
|
+
- { code: WORKFLOW_PLAN_TASK_SET_STALE, description: 'the authoritative task set changed after plan convergence' }
|
|
1897
|
+
- { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'a task contract was invalidated or changed after plan convergence' }
|
|
1516
1898
|
cli_subcommand: workflow start
|
|
1517
1899
|
emits_events: [workflow_started]
|
|
1518
1900
|
|
|
@@ -1630,8 +2012,11 @@ tools:
|
|
|
1630
2012
|
workflow: { type: object }
|
|
1631
2013
|
errors:
|
|
1632
2014
|
- { code: WORKFLOW_NOT_FOUND, description: 'workflow id does not exist' }
|
|
2015
|
+
- { code: WORKFLOW_NOT_MUTABLE, description: 'completed and cancelled workflows cannot accept step updates' }
|
|
1633
2016
|
- { code: WORKFLOW_STEP_NOT_FOUND, description: 'step is not part of the canonical workflow' }
|
|
2017
|
+
- { code: ILLEGAL_WORKFLOW_STEP_TRANSITION, description: 'the requested step-state transition is not permitted' }
|
|
1634
2018
|
- { code: WORKFLOW_STEP_OUT_OF_ORDER, description: 'an earlier selected step remains incomplete' }
|
|
2019
|
+
- { code: VALIDATION_ERROR, description: 'step evidence, output, decision, semantic, or blocker input is malformed' }
|
|
1635
2020
|
- { code: WORKFLOW_EVIDENCE_REQUIRED, description: 'the step cannot complete without evidence' }
|
|
1636
2021
|
- { code: WORKFLOW_OUTPUT_REQUIRED, description: 'the step cannot complete without a durable output' }
|
|
1637
2022
|
- { code: WORKFLOW_OUTPUT_MISSING, description: 'a declared output file is missing' }
|
|
@@ -1640,19 +2025,27 @@ tools:
|
|
|
1640
2025
|
- { code: WORKFLOW_RESEARCH_SYNTHESIS_INCOMPLETE, description: 'full or adoption synthesis did not bind all baseline specifications and the distillate' }
|
|
1641
2026
|
- { code: WORKFLOW_SEMANTIC_RECORDS_REQUIRED, description: 'a research step did not persist typed semantic results' }
|
|
1642
2027
|
- { code: WORKFLOW_SEMANTIC_RECORD_INVALID, description: 'a semantic record does not satisfy its step contract' }
|
|
2028
|
+
- { code: WORKFLOW_SEMANTIC_SOURCE_INVALID, description: 'a semantic record source is missing, outside the project, or lacks an anchor' }
|
|
1643
2029
|
- { code: WORKFLOW_SYNTHESIS_TRACE_INVALID, description: 'synthesis references missing research semantic records' }
|
|
1644
2030
|
- { code: WORKFLOW_BLOCKER_REQUIRED, description: 'blocked state requires a specific blocker code' }
|
|
1645
|
-
- { code: WORKFLOW_CONTEXT_OUTPUT_REQUIRED, description: 'the stage requires its immutable Context Manifest
|
|
2031
|
+
- { code: WORKFLOW_CONTEXT_OUTPUT_REQUIRED, description: 'the stage requires its immutable Context Manifest v3 output' }
|
|
1646
2032
|
- { code: WORKFLOW_CONTEXT_MISMATCH, description: 'the context role, gate, change, task, or readiness does not match the stage' }
|
|
1647
2033
|
- { code: WORKFLOW_CONTEXT_AUTHORITY_MISMATCH, description: 'the context artifact does not match its DB snapshot row' }
|
|
1648
2034
|
- { code: WORKFLOW_CONTEXT_STALE, description: 'the context artifact no longer matches the current checkout' }
|
|
1649
|
-
- { code:
|
|
2035
|
+
- { code: WORKFLOW_TASKS_REQUIRED, description: 'the stage requires at least one task bound to the change' }
|
|
2036
|
+
- { code: WORKFLOW_TASK_NOT_COMPLETED, description: 'the required task development state has not converged' }
|
|
2037
|
+
- { code: WORKFLOW_GATE_MISSING, description: 'a required completed dev, test, or review gate is missing' }
|
|
2038
|
+
- { code: WORKFLOW_GATE_STALE, description: 'a required task or gate no longer matches current authority or checkout state' }
|
|
2039
|
+
- { code: WORKFLOW_REVIEW_NOT_APPROVED, description: 'the required independent review axes have not passed' }
|
|
2040
|
+
- { code: WORKFLOW_TEST_NOT_PASSED, description: 'the required current test gate has not passed' }
|
|
2041
|
+
- { code: WORKFLOW_SESSION_ACTIVE, description: 'delivery is blocked while a bound execution session remains active' }
|
|
2042
|
+
- { code: DECISION_ALIGNMENT_BLOCKING, description: 'matching owner decisions or artifact checkpoints are not current' }
|
|
1650
2043
|
cli_subcommand: workflow step
|
|
1651
2044
|
emits_events: [workflow_step_updated, workflow_blocked]
|
|
1652
2045
|
|
|
1653
2046
|
- name: workflow.complete
|
|
1654
2047
|
family: workflow
|
|
1655
|
-
description: Complete a ready workflow only when every selected step is complete and every recorded output digest remains current.
|
|
2048
|
+
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.
|
|
1656
2049
|
phase: '13'
|
|
1657
2050
|
writer_role: mcp
|
|
1658
2051
|
input_schema:
|
|
@@ -1679,12 +2072,21 @@ tools:
|
|
|
1679
2072
|
- { code: WORKFLOW_NOT_FOUND, description: 'workflow id does not exist' }
|
|
1680
2073
|
- { code: WORKFLOW_NOT_READY, description: 'selected steps or blockers remain incomplete' }
|
|
1681
2074
|
- { code: WORKFLOW_OUTPUT_STALE, description: 'a recorded output changed or disappeared' }
|
|
2075
|
+
- { code: VALIDATION_ERROR, description: 'approval or completion input is malformed' }
|
|
1682
2076
|
- { code: WORKFLOW_TASKS_REQUIRED, description: 'plan completion requires a non-empty authoritative task set' }
|
|
2077
|
+
- { code: TASK_NOT_FOUND, description: 'a task referenced by the authoritative plan no longer exists' }
|
|
1683
2078
|
- { code: TASK_EXECUTION_CONTRACT_INCOMPLETE, description: 'one or more planned tasks lack an executable contract' }
|
|
2079
|
+
- { code: TASK_CHANGE_OWNERSHIP_MISMATCH, description: 'a planned task is not owned by the workflow change' }
|
|
1684
2080
|
- { code: TASK_DEPENDENCY_MISSING, description: 'a planned dependency does not exist' }
|
|
1685
2081
|
- { code: TASK_DEPENDENCY_CYCLE, description: 'the planned task graph contains a cycle' }
|
|
2082
|
+
- { code: WORKFLOW_PLAN_ARTIFACT_INVALID, description: 'the plan workflow did not produce exactly one valid JSON execution plan' }
|
|
2083
|
+
- { code: WORKFLOW_PLAN_ARTIFACT_STALE, description: 'the execution-plan artifact differs from current DB task authority' }
|
|
2084
|
+
- { code: WORKFLOW_PLAN_COVERAGE_INCOMPLETE, description: 'one or more accepted change outcomes have no executable task coverage' }
|
|
2085
|
+
- { code: WORKFLOW_PLAN_ORPHAN_TASK, description: 'a task trace does not resolve to accepted change or research authority' }
|
|
2086
|
+
- { code: WORKFLOW_PLAN_TASK_CONTRACT_STALE, description: 'a task was invalidated or changed before plan convergence' }
|
|
2087
|
+
- { code: WORKFLOW_QUICK_PLAN_TOO_LARGE, description: 'a quick change contains more than one executable task' }
|
|
1686
2088
|
- { code: WORKFLOW_TASK_NOT_COMPLETED, description: 'dev convergence requires its task to be completed' }
|
|
1687
|
-
- { code: WORKFLOW_APPROVAL_REQUIRED, description: 'plan
|
|
2089
|
+
- { code: WORKFLOW_APPROVAL_REQUIRED, description: 'when optional plan approval is supplied it requires approved_by and approval_note fields' }
|
|
1688
2090
|
- { code: WORKFLOW_SUMMARY_AUTHORITY_VIOLATION, description: 'Prompt summary fields are not allowed to replace DB-derived gate evidence or the complete change task set' }
|
|
1689
2091
|
- { code: WORKFLOW_APPROVAL_AUTHORITY_VIOLATION, description: 'only the plan workflow accepts completion approval' }
|
|
1690
2092
|
- { code: WORKFLOW_GATE_MISSING, description: 'a required completed dev, test, or review gate is missing' }
|
|
@@ -1693,10 +2095,23 @@ tools:
|
|
|
1693
2095
|
- { code: WORKFLOW_REPORT_CONTEXT_MISMATCH, description: 'a report is not bound to the recorded stage context digest' }
|
|
1694
2096
|
- { code: WORKFLOW_REPORT_REVISION_STALE, description: 'a report does not match the current full Git HEAD' }
|
|
1695
2097
|
- { code: WORKFLOW_REPORT_WORKTREE_STALE, description: 'a report does not match the current worktree digest' }
|
|
2098
|
+
- { code: WORKFLOW_REPORT_TASK_SET_STALE, description: 'a report task set no longer matches the authoritative execution scope' }
|
|
2099
|
+
- { code: WORKFLOW_REPORT_BASELINE_MISMATCH, description: 'a report no longer matches current baseline authority' }
|
|
2100
|
+
- { code: WORKFLOW_REPORT_CHANGE_MISMATCH, description: 'a report is bound to a different change' }
|
|
2101
|
+
- { code: WORKFLOW_REPORT_VERDICT_CONFLICT, description: 'the declared verdict conflicts with failures or blocking evidence' }
|
|
2102
|
+
- { code: WORKFLOW_VERIFICATION_PROFILE_INVALID, description: 'the selected verification dimensions or exclusion rationale are invalid' }
|
|
2103
|
+
- { code: WORKFLOW_REGRESSION_SIGNAL_MISSING, description: 'a reported regression fix lacks a failing-before signal' }
|
|
2104
|
+
- { code: WORKFLOW_REVIEW_MODE_MISMATCH, description: 'the review summary scope differs from the workflow scope' }
|
|
2105
|
+
- { code: WORKFLOW_REVIEW_EVIDENCE_MISMATCH, description: 'the review worker roster differs from persisted specialist artifacts' }
|
|
2106
|
+
- { code: WORKFLOW_REVIEW_FINDINGS_MISMATCH, description: 'the unified review findings differ from specialist evidence' }
|
|
1696
2107
|
- { code: WORKFLOW_REVIEW_NOT_APPROVED, description: 'both independent review axes must pass' }
|
|
1697
2108
|
- { code: WORKFLOW_TEST_NOT_PASSED, description: 'the current change-level test gate did not pass' }
|
|
2109
|
+
- { code: WORKFLOW_SESSION_ACTIVE, description: 'delivery cannot converge while an execution session remains active' }
|
|
2110
|
+
- { code: WORKFLOW_CONTEXT_NOT_READY, description: 'delivery evidence lacks a current ready context manifest' }
|
|
2111
|
+
- { code: WORKFLOW_DELIVERY_CHECK_FAILED, description: 'one or more local delivery checks did not pass' }
|
|
1698
2112
|
- { code: WORKFLOW_CHANGE_NOT_ARCHIVED, description: 'delivery completion requires an archived change' }
|
|
1699
|
-
- { code: WORKFLOW_RELEASE_AUTHORITY_MISMATCH, description: '
|
|
2113
|
+
- { code: WORKFLOW_RELEASE_AUTHORITY_MISMATCH, description: 'a local delivery report attempted to claim external release authority' }
|
|
2114
|
+
- { code: DECISION_ALIGNMENT_BLOCKING, description: 'matching owner decisions or artifact checkpoints are not current' }
|
|
1700
2115
|
cli_subcommand: workflow complete
|
|
1701
2116
|
emits_events: [workflow_completed, plan_approved]
|
|
1702
2117
|
|