ultra-builder-pro-cli 0.14.0 → 0.16.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 (163) hide show
  1. package/.ultra-template/docs/research/README.md +11 -7
  2. package/.ultra-template/specs/architecture.md +36 -36
  3. package/.ultra-template/specs/discovery.md +46 -33
  4. package/.ultra-template/specs/product.md +38 -29
  5. package/.ultra-template/specs/research-distillate.md +48 -0
  6. package/.ultra-template/tasks/contexts/TEMPLATE.md +11 -28
  7. package/CHANGELOG.md +77 -1
  8. package/README.md +46 -24
  9. package/adapters/_shared/codex-assets.cjs +6 -2
  10. package/adapters/_shared/file-ops.cjs +6 -2
  11. package/adapters/_shared/handbook.cjs +2 -1
  12. package/adapters/claude.js +3 -2
  13. package/adapters/codex.js +1 -0
  14. package/adapters/kimi.js +3 -2
  15. package/adapters/opencode.js +3 -2
  16. package/agents/review-coordinator.md +9 -6
  17. package/commands/ultra-change.md +1 -1
  18. package/commands/ultra-plan.md +1 -1
  19. package/commands/ultra-research.md +1 -1
  20. package/commands/ultra-think.md +2 -2
  21. package/docs/AGENT-CONTEXT.md +43 -19
  22. package/docs/ARCHITECTURE.md +54 -13
  23. package/docs/PLAN.zh-CN.md +4 -2
  24. package/docs/ROADMAP.md +10 -4
  25. package/docs/RUNTIME-COMPAT-MATRIX.md +4 -4
  26. package/docs/STATE-DB-ACCESS-POLICY.md +33 -29
  27. package/docs/USER-HANDBOOK-CONTRACT.md +8 -2
  28. package/docs/WORKFLOW-LIFECYCLE.md +342 -0
  29. package/hooks/README.md +6 -1
  30. package/hooks/health_check.py +12 -3
  31. package/hooks/subagent_tracker.py +52 -77
  32. package/mcp-server/hook-event.cjs +34 -0
  33. package/mcp-server/lib/archive-journal.cjs +17 -5
  34. package/mcp-server/lib/baseline-workflow.cjs +158 -18
  35. package/mcp-server/lib/change-workflow.cjs +598 -85
  36. package/mcp-server/lib/context-spine.cjs +305 -25
  37. package/mcp-server/lib/decision-dialogue.cjs +713 -0
  38. package/mcp-server/lib/doctor.cjs +42 -3
  39. package/mcp-server/lib/init-project.cjs +210 -16
  40. package/mcp-server/lib/plan-store.cjs +4 -1
  41. package/mcp-server/lib/pricing.cjs +7 -10
  42. package/mcp-server/lib/project-breadcrumb.cjs +15 -0
  43. package/mcp-server/lib/projector.cjs +57 -3
  44. package/mcp-server/lib/spec-learning.cjs +79 -2
  45. package/mcp-server/lib/state-db.cjs +168 -8
  46. package/mcp-server/lib/state-ops.cjs +160 -9
  47. package/mcp-server/lib/workflow-state.cjs +2305 -0
  48. package/mcp-server/server.cjs +215 -15
  49. package/orchestrator/daemon.cjs +1 -2
  50. package/orchestrator/dispatch-rules.cjs +5 -31
  51. package/orchestrator/planner/plan-builder.cjs +21 -12
  52. package/package.json +13 -3
  53. package/skills/ultra-change/SKILL.md +94 -80
  54. package/skills/ultra-change/references/change-contract.md +36 -0
  55. package/skills/ultra-deliver/SKILL.md +76 -79
  56. package/skills/ultra-deliver/references/baseline-reconciliation.md +20 -0
  57. package/skills/ultra-dev/SKILL.md +62 -59
  58. package/skills/ultra-doctor/SKILL.md +61 -82
  59. package/skills/ultra-init/SKILL.md +101 -103
  60. package/skills/ultra-init/references/brownfield-adoption.md +2 -2
  61. package/skills/ultra-plan/SKILL.md +99 -85
  62. package/skills/ultra-plan/references/semantic-preflight.md +18 -0
  63. package/skills/ultra-research/SKILL.md +102 -60
  64. package/skills/ultra-research/references/00-problem-validation.md +36 -0
  65. package/skills/ultra-research/references/01-opportunity-discovery.md +33 -0
  66. package/skills/ultra-research/references/02-market-assessment.md +30 -0
  67. package/skills/ultra-research/references/03-competitive-landscape.md +31 -0
  68. package/skills/ultra-research/references/04-product-strategy.md +32 -0
  69. package/skills/ultra-research/references/05-assumptions-validation.md +31 -0
  70. package/skills/ultra-research/references/10-user-personas.md +29 -0
  71. package/skills/ultra-research/references/11-user-scenarios.md +28 -0
  72. package/skills/ultra-research/references/20-user-stories.md +30 -0
  73. package/skills/ultra-research/references/21-features-scope.md +29 -0
  74. package/skills/ultra-research/references/22-success-metrics.md +28 -0
  75. package/skills/ultra-research/references/30-architecture-context.md +30 -0
  76. package/skills/ultra-research/references/31-solution-strategy.md +28 -0
  77. package/skills/ultra-research/references/32-building-blocks.md +28 -0
  78. package/skills/ultra-research/references/40-deployment.md +29 -0
  79. package/skills/ultra-research/references/41-quality-risks.md +28 -0
  80. package/skills/ultra-research/references/99-synthesis.md +35 -0
  81. package/skills/ultra-review/SKILL.md +63 -73
  82. package/skills/ultra-review/references/review-modes.md +27 -0
  83. package/skills/ultra-review/references/unified-schema.md +25 -0
  84. package/skills/ultra-review/scripts/review_wait.py +40 -3
  85. package/skills/ultra-status/SKILL.md +41 -41
  86. package/skills/ultra-test/SKILL.md +54 -55
  87. package/skills/ultra-think/SKILL.md +26 -12
  88. package/skills/ultra-think/references/decision-dialogue.md +130 -0
  89. package/skills/ultra-verify/SKILL.md +1 -1
  90. package/skills/ultra-verify/references/{confidence-system.md → evidence-status.md} +3 -3
  91. package/spec/cli-protocol.md +17 -3
  92. package/spec/mcp-tools.yaml +683 -64
  93. package/spec/schemas/baseline-reconciliation.v1.schema.json +73 -0
  94. package/spec/schemas/delivery-report.v1.schema.json +111 -0
  95. package/spec/schemas/mcp-tools.schema.json +1 -1
  96. package/spec/schemas/state-db.sql +140 -1
  97. package/spec/schemas/tasks.v4.5.schema.json +8 -1
  98. package/spec/schemas/test-report.v1.schema.json +194 -0
  99. package/ultra-tools/cli.cjs +1 -1
  100. package/ultra-tools/commands/migrate.cjs +3 -3
  101. package/ultra-tools/commands/status.cjs +228 -12
  102. package/.ultra-template/delivery-report.json +0 -9
  103. package/.ultra-template/test-report.json +0 -8
  104. package/adapters/_shared/tests/file-ops.test.cjs +0 -54
  105. package/adapters/_shared/tests/frontmatter.test.cjs +0 -47
  106. package/adapters/_shared/tests/handbook.test.cjs +0 -101
  107. package/adapters/_shared/tests/path-rewrite.test.cjs +0 -60
  108. package/adapters/_shared/tests/provenance.test.cjs +0 -133
  109. package/adapters/_shared/tests/resolve-target.test.cjs +0 -75
  110. package/adapters/_shared/tests/runtime-assets.test.cjs +0 -149
  111. package/adapters/_shared/tests/settings-merge.test.cjs +0 -85
  112. package/adapters/_shared/tests/validate.test.cjs +0 -30
  113. package/adapters/tests/claude.test.cjs +0 -138
  114. package/adapters/tests/codex-hook.test.cjs +0 -142
  115. package/adapters/tests/codex.test.cjs +0 -430
  116. package/adapters/tests/kimi-hook.test.cjs +0 -149
  117. package/adapters/tests/kimi.test.cjs +0 -259
  118. package/adapters/tests/opencode.test.cjs +0 -357
  119. package/mcp-server/lib/archive-journal.test.cjs +0 -35
  120. package/mcp-server/lib/baseline-workflow.test.cjs +0 -477
  121. package/mcp-server/lib/change-workflow.test.cjs +0 -971
  122. package/mcp-server/lib/context-spine.test.cjs +0 -93
  123. package/mcp-server/lib/doctor.test.cjs +0 -148
  124. package/mcp-server/lib/plan-store.test.cjs +0 -132
  125. package/mcp-server/lib/prd-parser.test.cjs +0 -82
  126. package/mcp-server/lib/project-breadcrumb.test.cjs +0 -112
  127. package/mcp-server/lib/runtime-state.test.cjs +0 -92
  128. package/mcp-server/lib/spec-learning.test.cjs +0 -67
  129. package/mcp-server/lib/state-db.test.cjs +0 -314
  130. package/mcp-server/lib/task-expander.test.cjs +0 -169
  131. package/mcp-server/lib/topo.test.cjs +0 -158
  132. package/mcp-server/tests/circuit-breaker.test.cjs +0 -125
  133. package/mcp-server/tests/commit-hash-flow.test.cjs +0 -117
  134. package/mcp-server/tests/concurrency-update.test.cjs +0 -96
  135. package/mcp-server/tests/concurrency.test.cjs +0 -112
  136. package/mcp-server/tests/db-ops.test.cjs +0 -121
  137. package/mcp-server/tests/init-project.test.cjs +0 -393
  138. package/mcp-server/tests/migrate.test.cjs +0 -232
  139. package/mcp-server/tests/projector.test.cjs +0 -162
  140. package/mcp-server/tests/server-contract.test.cjs +0 -1467
  141. package/mcp-server/tests/staleness.test.cjs +0 -190
  142. package/mcp-server/tests/state-db.test.cjs +0 -106
  143. package/mcp-server/tests/state-ops.test.cjs +0 -449
  144. package/mcp-server/tests/tagged-tasks.test.cjs +0 -163
  145. package/mcp-server/tests/telemetry.test.cjs +0 -219
  146. package/orchestrator/planner/plan-builder.test.cjs +0 -165
  147. package/orchestrator/tests/auto-merge.test.cjs +0 -216
  148. package/orchestrator/tests/daemon.test.cjs +0 -311
  149. package/orchestrator/tests/dispatch-rules.test.cjs +0 -124
  150. package/orchestrator/tests/parallel-orchestrator.test.cjs +0 -233
  151. package/orchestrator/tests/phase-8b-gate.test.cjs +0 -183
  152. package/orchestrator/tests/recovery.test.cjs +0 -190
  153. package/orchestrator/tests/session-runner.test.cjs +0 -314
  154. package/orchestrator/tests/skill-miner.test.cjs +0 -147
  155. package/orchestrator/tests/worktree-manager.test.cjs +0 -148
  156. package/skills/ultra-research/references/architecture.md +0 -38
  157. package/skills/ultra-research/references/problem-product.md +0 -39
  158. package/skills/ultra-research/references/quality-delivery.md +0 -34
  159. package/skills/ultra-research/references/synthesis.md +0 -38
  160. package/skills/ultra-research/references/users-scope.md +0 -40
  161. package/ultra-tools/legacy-memory.test.cjs +0 -80
  162. package/ultra-tools/status-command.test.cjs +0 -181
  163. package/ultra-tools/system-command.test.cjs +0 -309
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultra-builder-pro.dev/schemas/baseline-reconciliation.v1.schema.json",
4
+ "title": "Ultra baseline reconciliation v1",
5
+ "type": "object",
6
+ "required": [
7
+ "$schema", "change_id", "baseline_id", "baseline_updates", "semantic_changes",
8
+ "resolved_gap_ids", "resolved_unknowns", "verification"
9
+ ],
10
+ "additionalProperties": false,
11
+ "properties": {
12
+ "$schema": { "const": "ultra-baseline-reconciliation-v1" },
13
+ "change_id": { "type": "string", "minLength": 1 },
14
+ "baseline_id": { "type": ["string", "null"] },
15
+ "baseline_updates": {
16
+ "type": "array",
17
+ "uniqueItems": true,
18
+ "items": { "type": "string", "minLength": 1 }
19
+ },
20
+ "semantic_changes": {
21
+ "type": "array",
22
+ "items": {
23
+ "type": "object",
24
+ "required": ["id", "action", "source_ref", "before_digest", "after_digest"],
25
+ "additionalProperties": false,
26
+ "properties": {
27
+ "id": { "type": "string", "pattern": "^[a-zA-Z0-9_-]+$" },
28
+ "action": { "enum": ["add", "update"] },
29
+ "source_ref": { "type": "string", "pattern": "^[^#]+#[^#]+$" },
30
+ "before_digest": { "type": ["string", "null"], "pattern": "^[0-9a-f]{64}$" },
31
+ "after_digest": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
32
+ }
33
+ }
34
+ },
35
+ "resolved_gap_ids": {
36
+ "type": "array", "uniqueItems": true,
37
+ "items": { "type": "string", "minLength": 1 }
38
+ },
39
+ "resolved_unknowns": {
40
+ "type": "array", "uniqueItems": true,
41
+ "items": { "type": "string", "minLength": 1 }
42
+ },
43
+ "verification": {
44
+ "type": "array",
45
+ "minItems": 1,
46
+ "items": {
47
+ "type": "object",
48
+ "required": ["name", "command", "status", "evidence"],
49
+ "additionalProperties": false,
50
+ "properties": {
51
+ "name": { "type": "string", "minLength": 1 },
52
+ "command": { "type": "string", "minLength": 1 },
53
+ "status": { "const": "pass" },
54
+ "evidence": { "type": "string", "minLength": 1 }
55
+ }
56
+ }
57
+ },
58
+ "semantic_no_change_reason": { "type": ["string", "null"], "minLength": 3 }
59
+ },
60
+ "allOf": [
61
+ {
62
+ "if": { "properties": { "baseline_updates": { "maxItems": 0 } } },
63
+ "then": {
64
+ "required": ["semantic_no_change_reason"],
65
+ "properties": {
66
+ "semantic_changes": { "maxItems": 0 },
67
+ "semantic_no_change_reason": { "type": "string", "minLength": 3 }
68
+ }
69
+ },
70
+ "else": { "properties": { "semantic_changes": { "minItems": 1 } } }
71
+ }
72
+ ]
73
+ }
@@ -0,0 +1,111 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultra-builder-pro.dev/schemas/delivery-report.v1.schema.json",
4
+ "title": "Ultra delivery report v1",
5
+ "type": "object",
6
+ "required": [
7
+ "$schema", "change_id", "archive_status", "baseline_id", "baseline_status",
8
+ "git_commit", "worktree_digest", "context_digest", "checks", "release", "rollback", "timestamp"
9
+ ],
10
+ "additionalProperties": false,
11
+ "properties": {
12
+ "$schema": { "const": "ultra-delivery-report-v1" },
13
+ "change_id": { "type": ["string", "null"] },
14
+ "archive_status": { "type": ["string", "null"], "enum": ["archived", null] },
15
+ "baseline_id": { "type": ["string", "null"] },
16
+ "baseline_status": { "type": ["string", "null"] },
17
+ "git_commit": { "type": ["string", "null"] },
18
+ "worktree_digest": { "type": ["string", "null"], "pattern": "^[0-9a-f]{64}$" },
19
+ "context_digest": { "type": ["string", "null"], "pattern": "^[0-9a-f]{64}$" },
20
+ "checks": {
21
+ "type": "array",
22
+ "items": {
23
+ "type": "object",
24
+ "required": ["command", "status", "exit_code", "evidence"],
25
+ "additionalProperties": false,
26
+ "properties": {
27
+ "command": { "type": "string", "minLength": 1 },
28
+ "status": { "enum": ["pass", "fail"] },
29
+ "exit_code": { "type": "integer" },
30
+ "evidence": { "type": "string", "minLength": 1 }
31
+ },
32
+ "allOf": [
33
+ {
34
+ "if": { "properties": { "status": { "const": "pass" } } },
35
+ "then": { "properties": { "exit_code": { "const": 0 } } }
36
+ },
37
+ {
38
+ "if": { "properties": { "status": { "const": "fail" } } },
39
+ "then": { "properties": { "exit_code": { "not": { "const": 0 } } } }
40
+ }
41
+ ]
42
+ }
43
+ },
44
+ "release": {
45
+ "type": "object",
46
+ "required": ["authorized", "performed", "evidence"],
47
+ "additionalProperties": false,
48
+ "properties": {
49
+ "authorized": { "type": "boolean" },
50
+ "performed": { "type": "boolean" },
51
+ "evidence": {
52
+ "type": "array",
53
+ "items": {
54
+ "type": "object",
55
+ "required": ["kind", "reference", "status", "evidence"],
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "kind": { "enum": ["commit", "push", "tag", "registry", "deploy", "release", "other"] },
59
+ "reference": { "type": "string", "minLength": 1 },
60
+ "status": { "const": "pass" },
61
+ "evidence": { "type": "string", "minLength": 1 }
62
+ }
63
+ }
64
+ },
65
+ "version": { "type": "string" },
66
+ "tag": { "type": "string" },
67
+ "commit": { "type": "string" },
68
+ "registry": { "type": "string" },
69
+ "remote": { "type": "string" }
70
+ },
71
+ "allOf": [
72
+ {
73
+ "if": { "properties": { "authorized": { "const": true } } },
74
+ "then": {
75
+ "properties": {
76
+ "performed": { "const": true },
77
+ "evidence": { "minItems": 1 }
78
+ }
79
+ },
80
+ "else": {
81
+ "properties": {
82
+ "performed": { "const": false },
83
+ "evidence": { "maxItems": 0 }
84
+ }
85
+ }
86
+ }
87
+ ]
88
+ },
89
+ "rollback": { "type": ["string", "null"] },
90
+ "timestamp": { "type": ["string", "null"], "format": "date-time" }
91
+ },
92
+ "allOf": [
93
+ {
94
+ "if": { "properties": { "archive_status": { "const": "archived" } } },
95
+ "then": {
96
+ "properties": {
97
+ "change_id": { "type": "string", "minLength": 1 },
98
+ "baseline_id": { "type": "string", "minLength": 1 },
99
+ "baseline_status": { "type": "string", "minLength": 1 },
100
+ "context_digest": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
101
+ "checks": {
102
+ "minItems": 1,
103
+ "items": { "properties": { "status": { "const": "pass" }, "exit_code": { "const": 0 } } }
104
+ },
105
+ "rollback": { "type": "string", "minLength": 1 },
106
+ "timestamp": { "type": "string", "format": "date-time" }
107
+ }
108
+ }
109
+ }
110
+ ]
111
+ }
@@ -60,7 +60,7 @@
60
60
  },
61
61
  "family": {
62
62
  "type": "string",
63
- "enum": ["task", "memory", "review", "impact", "skill", "session", "ask", "plan", "baseline", "change", "system"]
63
+ "enum": ["task", "memory", "review", "impact", "skill", "session", "ask", "plan", "baseline", "change", "decision", "workflow", "system"]
64
64
  },
65
65
  "description": { "type": "string", "minLength": 10 },
66
66
  "phase": {
@@ -33,6 +33,7 @@ CREATE TABLE IF NOT EXISTS baselines (
33
33
  worktree_digest TEXT,
34
34
  worktree_files_json TEXT NOT NULL DEFAULT '[]',
35
35
  worktree_accepted INTEGER NOT NULL DEFAULT 0 CHECK (worktree_accepted IN (0, 1)),
36
+ known_red_accepted INTEGER NOT NULL DEFAULT 0 CHECK (known_red_accepted IN (0, 1)),
36
37
  spec_refs_json TEXT NOT NULL DEFAULT '[]',
37
38
  evidence_json TEXT NOT NULL DEFAULT '[]',
38
39
  verification_json TEXT NOT NULL DEFAULT '[]',
@@ -40,6 +41,7 @@ CREATE TABLE IF NOT EXISTS baselines (
40
41
  gaps_json TEXT NOT NULL DEFAULT '[]',
41
42
  classification_json TEXT NOT NULL DEFAULT '{}',
42
43
  provider_refs_json TEXT NOT NULL DEFAULT '{}',
44
+ research_run_id TEXT,
43
45
  approved_by TEXT,
44
46
  approval_note TEXT,
45
47
  started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
@@ -62,6 +64,10 @@ CREATE TABLE IF NOT EXISTS changes (
62
64
  docs_impact_json TEXT NOT NULL DEFAULT '{"status":"unknown","files":[],"rationale":null}',
63
65
  provider_refs_json TEXT NOT NULL DEFAULT '{}',
64
66
  baseline_bypass_json TEXT,
67
+ contract_json TEXT NOT NULL DEFAULT '{}',
68
+ classification_json TEXT NOT NULL DEFAULT '{}',
69
+ research_disposition_json TEXT NOT NULL DEFAULT '{}',
70
+ alignment_thread_id TEXT REFERENCES decision_threads(id) ON DELETE SET NULL,
65
71
  base_commit TEXT,
66
72
  artifact_root TEXT NOT NULL,
67
73
  created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
@@ -88,9 +94,16 @@ CREATE TABLE IF NOT EXISTS tasks (
88
94
  files_modified TEXT, -- JSON array of paths (Phase 8B conflict detection)
89
95
  session_id TEXT, -- current owning session (Phase 4.5)
90
96
  stale INTEGER NOT NULL DEFAULT 0 CHECK (stale IN (0, 1)),
91
- complexity_hint TEXT CHECK (complexity_hint IN ('haiku', 'sonnet', 'opus')),
92
97
  tag TEXT, -- git branch tag (Phase 7.2)
93
98
  trace_to TEXT, -- spec anchor reference
99
+ outcome TEXT, -- observable result owned by this task
100
+ slice_kind TEXT CHECK (slice_kind IS NULL OR slice_kind IN ('tracer_bullet', 'expand_contract', 'integration_checkpoint')),
101
+ public_seam TEXT, -- externally observable seam exercised by the slice
102
+ verification_command TEXT, -- exact task-level verification command
103
+ acceptance_json TEXT NOT NULL DEFAULT '[]',
104
+ context_refs_json TEXT NOT NULL DEFAULT '[]',
105
+ docs_impact_json TEXT NOT NULL DEFAULT '{"status":"unknown","files":[],"rationale":null}',
106
+ ownership_json TEXT NOT NULL DEFAULT '{}',
94
107
  context_file TEXT, -- projection target path
95
108
  completion_commit TEXT, -- backfilled hash (Phase 2.8)
96
109
  change_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
@@ -261,6 +274,10 @@ CREATE TABLE IF NOT EXISTS spec_learning_candidates (
261
274
  status TEXT NOT NULL DEFAULT 'proposed'
262
275
  CHECK (status IN ('proposed', 'approved', 'rejected', 'applied')),
263
276
  resolution TEXT,
277
+ applied_ref TEXT,
278
+ before_digest TEXT,
279
+ after_digest TEXT,
280
+ apply_evidence_json TEXT NOT NULL DEFAULT '[]',
264
281
  proposed_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
265
282
  resolved_at TEXT,
266
283
  applied_at TEXT
@@ -328,6 +345,120 @@ CREATE TABLE IF NOT EXISTS event_consumers (
328
345
  updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
329
346
  );
330
347
 
348
+ -- ──────────────────────────── workflow runs ───────────────────────────────
349
+ -- Skills own judgment and artifact content. MCP owns durable transitions,
350
+ -- evidence references, output digests, blockers, and recovery position.
351
+ CREATE TABLE IF NOT EXISTS workflow_runs (
352
+ id TEXT PRIMARY KEY,
353
+ kind TEXT NOT NULL
354
+ CHECK (kind IN ('init', 'research', 'plan', 'change', 'dev', 'test', 'review', 'deliver')),
355
+ mode TEXT,
356
+ subject TEXT NOT NULL,
357
+ definition_version TEXT NOT NULL DEFAULT '1.0',
358
+ status TEXT NOT NULL DEFAULT 'active'
359
+ CHECK (status IN ('active', 'blocked', 'ready', 'completed', 'cancelled')),
360
+ current_step TEXT,
361
+ baseline_id TEXT REFERENCES baselines(id) ON DELETE SET NULL,
362
+ change_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
363
+ task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
364
+ metadata_json TEXT NOT NULL DEFAULT '{}',
365
+ blockers_json TEXT NOT NULL DEFAULT '[]',
366
+ approval_json TEXT,
367
+ summary_json TEXT NOT NULL DEFAULT '{}',
368
+ started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
369
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
370
+ completed_at TEXT
371
+ );
372
+
373
+ CREATE INDEX IF NOT EXISTS workflow_runs_status
374
+ ON workflow_runs(status, kind, updated_at);
375
+ CREATE INDEX IF NOT EXISTS workflow_runs_baseline
376
+ ON workflow_runs(baseline_id, kind, updated_at);
377
+ CREATE INDEX IF NOT EXISTS workflow_runs_change
378
+ ON workflow_runs(change_id, kind, updated_at);
379
+ CREATE INDEX IF NOT EXISTS workflow_runs_task
380
+ ON workflow_runs(task_id, kind, updated_at);
381
+
382
+ CREATE TABLE IF NOT EXISTS workflow_steps (
383
+ run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
384
+ step_id TEXT NOT NULL,
385
+ position INTEGER NOT NULL CHECK (position >= 0),
386
+ title TEXT NOT NULL,
387
+ required INTEGER NOT NULL DEFAULT 1 CHECK (required IN (0, 1)),
388
+ status TEXT NOT NULL DEFAULT 'pending'
389
+ CHECK (status IN ('pending', 'in_progress', 'completed', 'skipped', 'blocked')),
390
+ evidence_json TEXT NOT NULL DEFAULT '[]',
391
+ outputs_json TEXT NOT NULL DEFAULT '[]',
392
+ decisions_json TEXT NOT NULL DEFAULT '[]',
393
+ semantic_records_json TEXT NOT NULL DEFAULT '[]',
394
+ blockers_json TEXT NOT NULL DEFAULT '[]',
395
+ skip_reason TEXT,
396
+ started_at TEXT,
397
+ completed_at TEXT,
398
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
399
+ PRIMARY KEY (run_id, step_id)
400
+ );
401
+
402
+ CREATE UNIQUE INDEX IF NOT EXISTS workflow_steps_position
403
+ ON workflow_steps(run_id, position);
404
+ CREATE INDEX IF NOT EXISTS workflow_steps_status
405
+ ON workflow_steps(run_id, status, position);
406
+
407
+ -- ──────────────────────────── decision dialogue ─────────────────────────
408
+ -- The host owns reasoning and normalized decision content. MCP owns one-at-a-
409
+ -- time presentation, durable authority, checkpoints, and recovery. Raw prompts
410
+ -- and transcripts never belong in these tables.
411
+ CREATE TABLE IF NOT EXISTS decision_threads (
412
+ id TEXT PRIMARY KEY,
413
+ purpose TEXT NOT NULL,
414
+ mode TEXT NOT NULL DEFAULT 'guided'
415
+ CHECK (mode IN ('guided', 'fast', 'autonomous', 'diagnostic')),
416
+ status TEXT NOT NULL DEFAULT 'active'
417
+ CHECK (status IN ('active', 'checkpoint_ready', 'confirmed', 'cancelled')),
418
+ baseline_id TEXT REFERENCES baselines(id) ON DELETE SET NULL,
419
+ change_id TEXT REFERENCES changes(id) ON DELETE CASCADE,
420
+ workflow_run_id TEXT REFERENCES workflow_runs(id) ON DELETE CASCADE,
421
+ summary_json TEXT NOT NULL DEFAULT '{}',
422
+ checkpoint_json TEXT NOT NULL DEFAULT '{}',
423
+ started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
424
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
425
+ confirmed_at TEXT,
426
+ CHECK (baseline_id IS NOT NULL OR change_id IS NOT NULL OR workflow_run_id IS NOT NULL)
427
+ );
428
+
429
+ CREATE INDEX IF NOT EXISTS decision_threads_status
430
+ ON decision_threads(status, updated_at);
431
+ CREATE INDEX IF NOT EXISTS decision_threads_authority
432
+ ON decision_threads(baseline_id, change_id, workflow_run_id, status);
433
+
434
+ CREATE TABLE IF NOT EXISTS decision_items (
435
+ id TEXT PRIMARY KEY,
436
+ thread_id TEXT NOT NULL REFERENCES decision_threads(id) ON DELETE CASCADE,
437
+ sequence INTEGER NOT NULL CHECK (sequence > 0),
438
+ phase TEXT NOT NULL,
439
+ question TEXT NOT NULL,
440
+ why_now TEXT NOT NULL,
441
+ recommendation TEXT NOT NULL,
442
+ options_json TEXT NOT NULL DEFAULT '[]',
443
+ evidence_refs_json TEXT NOT NULL DEFAULT '[]',
444
+ dependency_ids_json TEXT NOT NULL DEFAULT '[]',
445
+ effects_json TEXT NOT NULL DEFAULT '{}',
446
+ blocking INTEGER NOT NULL DEFAULT 1 CHECK (blocking IN (0, 1)),
447
+ status TEXT NOT NULL DEFAULT 'open'
448
+ CHECK (status IN ('open', 'answered', 'delegated', 'deferred', 'superseded')),
449
+ resolution_json TEXT NOT NULL DEFAULT '{}',
450
+ supersedes_id TEXT REFERENCES decision_items(id) ON DELETE SET NULL,
451
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
452
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
453
+ resolved_at TEXT,
454
+ UNIQUE (thread_id, sequence)
455
+ );
456
+
457
+ CREATE UNIQUE INDEX IF NOT EXISTS decision_items_one_open
458
+ ON decision_items(thread_id) WHERE status = 'open';
459
+ CREATE INDEX IF NOT EXISTS decision_items_status
460
+ ON decision_items(thread_id, status, sequence);
461
+
331
462
  -- ──────────────────────────── seed: schema_version ────────────────────────
332
463
  INSERT OR IGNORE INTO schema_version (version, description)
333
464
  VALUES ('4.5', 'Phase 2 initial — tasks/events/sessions/schema_version/migration_history/telemetry/specs_refs');
@@ -347,3 +478,11 @@ INSERT OR IGNORE INTO schema_version (version, description)
347
478
  VALUES ('11.0', 'Greenfield and brownfield baseline adoption, convergence, and drift authority');
348
479
  INSERT OR IGNORE INTO schema_version (version, description)
349
480
  VALUES ('12.0', 'Evidence-backed repository snapshots, gap ledger, safe re-adoption, and incident break-glass governance');
481
+ INSERT OR IGNORE INTO schema_version (version, description)
482
+ VALUES ('13.0', 'Durable cross-stage workflow runs, step evidence, output digests, blockers, and recovery');
483
+ INSERT OR IGNORE INTO schema_version (version, description)
484
+ VALUES ('14.0', 'Continuously revalidated baseline authority and persisted known-red acceptance');
485
+ INSERT OR IGNORE INTO schema_version (version, description)
486
+ VALUES ('15.0', 'Typed research semantics, complete change contracts, verified learning application, and reconciliation provenance');
487
+ INSERT OR IGNORE INTO schema_version (version, description)
488
+ VALUES ('16.0', 'Durable one-question decision dialogue, owner checkpoints, and workflow alignment gates');
@@ -54,9 +54,16 @@
54
54
  "x-derived": true,
55
55
  "description": "DERIVED from staleness propagation (Phase 5.3)"
56
56
  },
57
- "complexity_hint": { "type": "string", "enum": ["haiku", "sonnet", "opus"] },
58
57
  "tag": { "type": "string" },
59
58
  "trace_to": { "type": "string" },
59
+ "outcome": { "type": "string" },
60
+ "slice_kind": { "type": "string", "enum": ["tracer_bullet", "expand_contract", "integration_checkpoint"] },
61
+ "public_seam": { "type": "string" },
62
+ "verification_command": { "type": "string" },
63
+ "acceptance": { "type": "array", "items": { "type": "object" } },
64
+ "context_refs": { "type": "array", "items": { "type": "object" } },
65
+ "docs_impact": { "type": "object" },
66
+ "ownership": { "type": "object" },
60
67
  "context_file": { "type": "string" },
61
68
  "completion_commit": { "type": "string", "pattern": "^[0-9a-f]{7,40}$" },
62
69
  "created_at": { "type": "string", "format": "date-time" },
@@ -0,0 +1,194 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultra-builder-pro.dev/schemas/test-report.v1.schema.json",
4
+ "title": "Ultra test report v1",
5
+ "type": "object",
6
+ "required": [
7
+ "$schema", "change_id", "task_ids", "git_commit", "worktree_digest",
8
+ "context_digest", "acceptance", "commands", "public_seams", "failures",
9
+ "recovery", "verification_dimensions", "regression_signal", "passed", "run_count",
10
+ "timestamp", "blocking_issues"
11
+ ],
12
+ "additionalProperties": false,
13
+ "properties": {
14
+ "$schema": { "const": "ultra-test-report-v1" },
15
+ "change_id": { "type": ["string", "null"] },
16
+ "task_ids": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
17
+ "git_commit": { "type": ["string", "null"] },
18
+ "worktree_digest": { "type": ["string", "null"], "pattern": "^[0-9a-f]{64}$" },
19
+ "context_digest": { "type": ["string", "null"], "pattern": "^[0-9a-f]{64}$" },
20
+ "acceptance": {
21
+ "type": "array",
22
+ "items": {
23
+ "type": "object",
24
+ "required": ["id", "status", "evidence"],
25
+ "additionalProperties": false,
26
+ "properties": {
27
+ "id": { "type": "string", "minLength": 1 },
28
+ "status": { "enum": ["pass", "fail"] },
29
+ "evidence": { "type": "string", "minLength": 1 }
30
+ }
31
+ }
32
+ },
33
+ "commands": {
34
+ "type": "array",
35
+ "items": {
36
+ "type": "object",
37
+ "required": ["command", "status", "exit_code", "evidence"],
38
+ "additionalProperties": false,
39
+ "properties": {
40
+ "command": { "type": "string", "minLength": 1 },
41
+ "status": { "enum": ["pass", "fail"] },
42
+ "exit_code": { "type": "integer" },
43
+ "evidence": { "type": "string", "minLength": 1 }
44
+ },
45
+ "allOf": [
46
+ {
47
+ "if": { "properties": { "status": { "const": "pass" } } },
48
+ "then": { "properties": { "exit_code": { "const": 0 } } }
49
+ },
50
+ {
51
+ "if": { "properties": { "status": { "const": "fail" } } },
52
+ "then": { "properties": { "exit_code": { "not": { "const": 0 } } } }
53
+ }
54
+ ]
55
+ }
56
+ },
57
+ "public_seams": {
58
+ "type": "array",
59
+ "items": {
60
+ "type": "object",
61
+ "required": ["seam", "status", "evidence"],
62
+ "additionalProperties": false,
63
+ "properties": {
64
+ "seam": { "type": "string", "minLength": 1 },
65
+ "status": { "enum": ["pass", "fail"] },
66
+ "evidence": { "type": "string", "minLength": 1 }
67
+ }
68
+ }
69
+ },
70
+ "failures": {
71
+ "type": "array",
72
+ "items": {
73
+ "type": "object",
74
+ "required": ["symptom", "status", "evidence"],
75
+ "additionalProperties": false,
76
+ "properties": {
77
+ "symptom": { "type": "string", "minLength": 1 },
78
+ "status": { "enum": ["resolved", "unresolved"] },
79
+ "evidence": { "type": "string", "minLength": 1 }
80
+ }
81
+ }
82
+ },
83
+ "recovery": {
84
+ "type": "array",
85
+ "items": {
86
+ "type": "object",
87
+ "required": ["scenario", "status", "evidence"],
88
+ "additionalProperties": false,
89
+ "properties": {
90
+ "scenario": { "type": "string", "minLength": 1 },
91
+ "status": { "enum": ["pass", "fail"] },
92
+ "evidence": { "type": "string", "minLength": 1 }
93
+ }
94
+ }
95
+ },
96
+ "verification_dimensions": {
97
+ "type": "object",
98
+ "required": [
99
+ "acceptance", "regression", "integration", "static_analysis",
100
+ "build", "performance", "security", "recovery"
101
+ ],
102
+ "additionalProperties": false,
103
+ "properties": {
104
+ "acceptance": { "$ref": "#/$defs/verificationDimension" },
105
+ "regression": { "$ref": "#/$defs/verificationDimension" },
106
+ "integration": { "$ref": "#/$defs/verificationDimension" },
107
+ "static_analysis": { "$ref": "#/$defs/verificationDimension" },
108
+ "build": { "$ref": "#/$defs/verificationDimension" },
109
+ "performance": { "$ref": "#/$defs/verificationDimension" },
110
+ "security": { "$ref": "#/$defs/verificationDimension" },
111
+ "recovery": { "$ref": "#/$defs/verificationDimension" }
112
+ }
113
+ },
114
+ "regression_signal": {
115
+ "type": ["object", "null"],
116
+ "required": ["command", "expected_red", "observed_red", "observed_green", "deterministic", "evidence"],
117
+ "additionalProperties": false,
118
+ "properties": {
119
+ "command": { "type": "string", "minLength": 1 },
120
+ "expected_red": { "type": "string", "minLength": 1 },
121
+ "observed_red": { "type": "boolean" },
122
+ "observed_green": { "type": "boolean" },
123
+ "deterministic": { "type": "boolean" },
124
+ "duration_ms": { "type": "number", "minimum": 0 },
125
+ "evidence": { "type": "string", "minLength": 1 }
126
+ }
127
+ },
128
+ "passed": { "type": "boolean" },
129
+ "run_count": { "type": "integer", "minimum": 0 },
130
+ "timestamp": { "type": ["string", "null"], "format": "date-time" },
131
+ "blocking_issues": { "type": "array", "items": { "type": "string" } }
132
+ },
133
+ "$defs": {
134
+ "verificationDimension": {
135
+ "type": "object",
136
+ "required": ["status", "evidence", "rationale"],
137
+ "additionalProperties": false,
138
+ "properties": {
139
+ "status": { "enum": ["pass", "fail", "not_run", "not_applicable"] },
140
+ "evidence": {
141
+ "type": "array",
142
+ "items": { "type": "string", "minLength": 1 }
143
+ },
144
+ "rationale": { "type": "string", "minLength": 3 }
145
+ },
146
+ "allOf": [
147
+ {
148
+ "if": { "properties": { "status": { "enum": ["pass", "fail"] } } },
149
+ "then": { "properties": { "evidence": { "minItems": 1 } } }
150
+ }
151
+ ]
152
+ }
153
+ },
154
+ "allOf": [
155
+ {
156
+ "if": { "properties": { "passed": { "const": true } } },
157
+ "then": {
158
+ "properties": {
159
+ "change_id": { "type": "string", "minLength": 1 },
160
+ "context_digest": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
161
+ "acceptance": {
162
+ "minItems": 1,
163
+ "items": { "properties": { "status": { "const": "pass" } } }
164
+ },
165
+ "commands": {
166
+ "minItems": 1,
167
+ "items": { "properties": { "status": { "const": "pass" }, "exit_code": { "const": 0 } } }
168
+ },
169
+ "public_seams": {
170
+ "minItems": 1,
171
+ "items": { "properties": { "status": { "const": "pass" } } }
172
+ },
173
+ "failures": { "items": { "properties": { "status": { "const": "resolved" } } } },
174
+ "recovery": { "items": { "properties": { "status": { "const": "pass" } } } },
175
+ "verification_dimensions": {
176
+ "properties": {
177
+ "acceptance": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
178
+ "regression": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
179
+ "integration": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
180
+ "static_analysis": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
181
+ "build": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
182
+ "performance": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
183
+ "security": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } },
184
+ "recovery": { "properties": { "status": { "enum": ["pass", "not_applicable"] } } }
185
+ }
186
+ },
187
+ "run_count": { "minimum": 1 },
188
+ "timestamp": { "type": "string", "format": "date-time" },
189
+ "blocking_issues": { "maxItems": 0 }
190
+ }
191
+ }
192
+ }
193
+ ]
194
+ }
@@ -38,7 +38,7 @@ SUBCOMMANDS:
38
38
  system doctor [--repair] | restore | rebaseline
39
39
  status [--cost] [--since <duration>] [--json]
40
40
  db init | checkpoint | vacuum | integrity | backup (Phase 2)
41
- migrate --from=<4.4|4.5> --to=<4.5|12.0> [--dry|--rollback]
41
+ migrate --from=<4.4|4.5> --to=<4.5|16.0> [--dry|--rollback]
42
42
  legacy-memory inspect | archive | prune --confirm DELETE_ULTRA_LEGACY_MEMORY
43
43
 
44
44
  --help / -h show this message
@@ -4,7 +4,7 @@ const fs = require('node:fs');
4
4
  const path = require('node:path');
5
5
 
6
6
  const {
7
- initStateDb, openStateDb, closeStateDb, MIGRATED_GAPS,
7
+ EXPECTED_VERSION, initStateDb, openStateDb, closeStateDb, MIGRATED_GAPS,
8
8
  } = require('../../mcp-server/lib/state-db.cjs');
9
9
  const ops = require('../../mcp-server/lib/state-ops.cjs');
10
10
  const projector = require('../../mcp-server/lib/projector.cjs');
@@ -12,7 +12,7 @@ const projector = require('../../mcp-server/lib/projector.cjs');
12
12
  const DEFAULT_FROM = '4.4';
13
13
  const SUPPORTED_TRANSITIONS = Object.freeze({
14
14
  '4.4': '4.5',
15
- '4.5': '12.0',
15
+ '4.5': EXPECTED_VERSION,
16
16
  });
17
17
 
18
18
  // Frozen SQL — values flow through parameter bindings.
@@ -443,7 +443,7 @@ const USAGE = `ultra-tools migrate --from=<version> --to=<version> [flags]
443
443
 
444
444
  Supported transitions:
445
445
  4.4 -> 4.5 import the legacy task projection into authoritative state
446
- 4.5 -> 12.0 import a projection-only project into current authoritative state
446
+ 4.5 -> ${EXPECTED_VERSION} import a projection-only project into current authoritative state
447
447
 
448
448
  Flags:
449
449
  --source-dir <dir> project root containing .ultra/ (default: .)