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.
Files changed (71) hide show
  1. package/.ultra-template/specs/research-distillate.md +4 -3
  2. package/CHANGELOG.md +120 -1
  3. package/README.md +67 -30
  4. package/adapters/_shared/codex-assets.cjs +10 -5
  5. package/adapters/_shared/handbook.cjs +3 -2
  6. package/adapters/_shared/interaction-contract.cjs +61 -0
  7. package/adapters/claude.js +1 -1
  8. package/adapters/opencode.js +1 -1
  9. package/bin/orchestrator.js +175 -19
  10. package/commands/ultra-change.md +1 -1
  11. package/commands/ultra-deliver.md +3 -3
  12. package/commands/ultra-init.md +1 -1
  13. package/commands/ultra-plan.md +1 -1
  14. package/commands/ultra-research.md +2 -2
  15. package/commands/ultra-review.md +10 -0
  16. package/commands/ultra-status.md +1 -1
  17. package/commands/ultra-test.md +1 -1
  18. package/commands/ultra-think.md +2 -2
  19. package/docs/AGENT-CONTEXT.md +38 -18
  20. package/docs/ARCHITECTURE.md +91 -13
  21. package/docs/LEGACY-CLI-CROSSWALK.md +163 -0
  22. package/docs/PLAN.zh-CN.md +19 -12
  23. package/docs/ROADMAP.md +5 -3
  24. package/docs/RUNTIME-COMPAT-MATRIX.md +4 -4
  25. package/docs/STATE-DB-ACCESS-POLICY.md +8 -6
  26. package/docs/USER-HANDBOOK-CONTRACT.md +8 -2
  27. package/docs/WORKFLOW-LIFECYCLE.md +179 -39
  28. package/hooks/pre_stop_check.py +3 -2
  29. package/mcp-server/lib/baseline-workflow.cjs +84 -16
  30. package/mcp-server/lib/change-workflow.cjs +107 -39
  31. package/mcp-server/lib/context-spine.cjs +215 -87
  32. package/mcp-server/lib/decision-dialogue.cjs +713 -0
  33. package/mcp-server/lib/doctor.cjs +9 -0
  34. package/mcp-server/lib/git-bootstrap.cjs +240 -0
  35. package/mcp-server/lib/init-project.cjs +178 -41
  36. package/mcp-server/lib/project-breadcrumb.cjs +23 -14
  37. package/mcp-server/lib/state-db.cjs +279 -9
  38. package/mcp-server/lib/state-ops.cjs +64 -1
  39. package/mcp-server/lib/workflow-state.cjs +313 -205
  40. package/mcp-server/server.cjs +112 -34
  41. package/orchestrator/auto-merge.cjs +19 -0
  42. package/orchestrator/daemon.cjs +104 -0
  43. package/orchestrator/parallel-orchestrator.cjs +371 -49
  44. package/orchestrator/session-runner.cjs +354 -25
  45. package/package.json +2 -1
  46. package/skills/ultra-change/SKILL.md +69 -65
  47. package/skills/ultra-deliver/SKILL.md +37 -58
  48. package/skills/ultra-dev/SKILL.md +55 -49
  49. package/skills/ultra-doctor/SKILL.md +44 -49
  50. package/skills/ultra-init/SKILL.md +78 -100
  51. package/skills/ultra-plan/SKILL.md +78 -79
  52. package/skills/ultra-research/SKILL.md +99 -98
  53. package/skills/ultra-review/SKILL.md +38 -47
  54. package/skills/ultra-review/references/review-modes.md +5 -3
  55. package/skills/ultra-review/references/unified-schema.md +26 -6
  56. package/skills/ultra-review/scripts/review_wait.py +12 -0
  57. package/skills/ultra-status/SKILL.md +34 -40
  58. package/skills/ultra-test/SKILL.md +61 -48
  59. package/skills/ultra-think/SKILL.md +47 -47
  60. package/skills/ultra-think/references/decision-dialogue.md +106 -0
  61. package/spec/cli-protocol.md +46 -2
  62. package/spec/mcp-tools.yaml +444 -29
  63. package/spec/schemas/delivery-report.v1.schema.json +1 -46
  64. package/spec/schemas/mcp-tools.schema.json +1 -1
  65. package/spec/schemas/state-db.sql +66 -2
  66. package/spec/schemas/test-report.v1.schema.json +45 -14
  67. package/ultra-tools/cli.cjs +1 -1
  68. package/ultra-tools/commands/session.cjs +10 -3
  69. package/ultra-tools/commands/status.cjs +34 -14
  70. package/ultra-tools/commands/system.cjs +2 -2
  71. package/ultra-tools/commands/task.cjs +3 -0
@@ -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.2'
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/` and start an authoritative greenfield or brownfield
284
- baseline. Auto mode detects meaningful existing project content before
285
- copying specification templates and creating state.db.
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: durable initialization and research run ids, states, mode, and exact next route
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 after the Ultra planning approval gate.
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, do not persist to state.db — used by ultra-plan gate to preview before approve' }
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: Register execution-session intent, lease, and proposed worktree/artifact paths. The orchestrator creates the process and worktree after this admission step.
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: { type: string }
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 whether spawning a new session for task_id is allowed (D33). Returns recommended action.
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: Create a continuous feature, fix, redesign, or incident change unit and its initial context manifest; incidents also register a five-section diagnosis artifact.
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, context_updated, workflow_started, workflow_step_updated]
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 intent, documentation impact, external provider metadata, or active status.
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 whose execution seam and next action are derived from authoritative task and workflow state.
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: CONTEXT_NEXT_ACTION_AUTHORITY_VIOLATION, description: 'next action is derived from workflow and task state and cannot be supplied by Prompt input' }
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 single recommended next action.
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 from its canonical step definition. Research defaults to the complete seventeen-step flow and never infers a reduced product posture.
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 v2 output' }
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: WORKFLOW_RELEASE_AUTHORIZATION_INVALID, description: 'release-if-authorized requires one complete durable owner decision' }
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 convergence requires explicit approved_by and approval_note fields' }
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: 'delivery release claims differ from the durable owner authorization decision' }
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