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.
- package/.ultra-template/docs/research/README.md +11 -7
- package/.ultra-template/specs/architecture.md +36 -36
- package/.ultra-template/specs/discovery.md +46 -33
- package/.ultra-template/specs/product.md +38 -29
- package/.ultra-template/specs/research-distillate.md +48 -0
- package/.ultra-template/tasks/contexts/TEMPLATE.md +11 -28
- package/CHANGELOG.md +77 -1
- package/README.md +46 -24
- package/adapters/_shared/codex-assets.cjs +6 -2
- package/adapters/_shared/file-ops.cjs +6 -2
- package/adapters/_shared/handbook.cjs +2 -1
- package/adapters/claude.js +3 -2
- package/adapters/codex.js +1 -0
- package/adapters/kimi.js +3 -2
- package/adapters/opencode.js +3 -2
- package/agents/review-coordinator.md +9 -6
- package/commands/ultra-change.md +1 -1
- package/commands/ultra-plan.md +1 -1
- package/commands/ultra-research.md +1 -1
- package/commands/ultra-think.md +2 -2
- package/docs/AGENT-CONTEXT.md +43 -19
- package/docs/ARCHITECTURE.md +54 -13
- package/docs/PLAN.zh-CN.md +4 -2
- package/docs/ROADMAP.md +10 -4
- package/docs/RUNTIME-COMPAT-MATRIX.md +4 -4
- package/docs/STATE-DB-ACCESS-POLICY.md +33 -29
- package/docs/USER-HANDBOOK-CONTRACT.md +8 -2
- package/docs/WORKFLOW-LIFECYCLE.md +342 -0
- package/hooks/README.md +6 -1
- package/hooks/health_check.py +12 -3
- package/hooks/subagent_tracker.py +52 -77
- package/mcp-server/hook-event.cjs +34 -0
- package/mcp-server/lib/archive-journal.cjs +17 -5
- package/mcp-server/lib/baseline-workflow.cjs +158 -18
- package/mcp-server/lib/change-workflow.cjs +598 -85
- package/mcp-server/lib/context-spine.cjs +305 -25
- package/mcp-server/lib/decision-dialogue.cjs +713 -0
- package/mcp-server/lib/doctor.cjs +42 -3
- package/mcp-server/lib/init-project.cjs +210 -16
- package/mcp-server/lib/plan-store.cjs +4 -1
- package/mcp-server/lib/pricing.cjs +7 -10
- package/mcp-server/lib/project-breadcrumb.cjs +15 -0
- package/mcp-server/lib/projector.cjs +57 -3
- package/mcp-server/lib/spec-learning.cjs +79 -2
- package/mcp-server/lib/state-db.cjs +168 -8
- package/mcp-server/lib/state-ops.cjs +160 -9
- package/mcp-server/lib/workflow-state.cjs +2305 -0
- package/mcp-server/server.cjs +215 -15
- package/orchestrator/daemon.cjs +1 -2
- package/orchestrator/dispatch-rules.cjs +5 -31
- package/orchestrator/planner/plan-builder.cjs +21 -12
- package/package.json +13 -3
- package/skills/ultra-change/SKILL.md +94 -80
- package/skills/ultra-change/references/change-contract.md +36 -0
- package/skills/ultra-deliver/SKILL.md +76 -79
- package/skills/ultra-deliver/references/baseline-reconciliation.md +20 -0
- package/skills/ultra-dev/SKILL.md +62 -59
- package/skills/ultra-doctor/SKILL.md +61 -82
- package/skills/ultra-init/SKILL.md +101 -103
- package/skills/ultra-init/references/brownfield-adoption.md +2 -2
- package/skills/ultra-plan/SKILL.md +99 -85
- package/skills/ultra-plan/references/semantic-preflight.md +18 -0
- package/skills/ultra-research/SKILL.md +102 -60
- package/skills/ultra-research/references/00-problem-validation.md +36 -0
- package/skills/ultra-research/references/01-opportunity-discovery.md +33 -0
- package/skills/ultra-research/references/02-market-assessment.md +30 -0
- package/skills/ultra-research/references/03-competitive-landscape.md +31 -0
- package/skills/ultra-research/references/04-product-strategy.md +32 -0
- package/skills/ultra-research/references/05-assumptions-validation.md +31 -0
- package/skills/ultra-research/references/10-user-personas.md +29 -0
- package/skills/ultra-research/references/11-user-scenarios.md +28 -0
- package/skills/ultra-research/references/20-user-stories.md +30 -0
- package/skills/ultra-research/references/21-features-scope.md +29 -0
- package/skills/ultra-research/references/22-success-metrics.md +28 -0
- package/skills/ultra-research/references/30-architecture-context.md +30 -0
- package/skills/ultra-research/references/31-solution-strategy.md +28 -0
- package/skills/ultra-research/references/32-building-blocks.md +28 -0
- package/skills/ultra-research/references/40-deployment.md +29 -0
- package/skills/ultra-research/references/41-quality-risks.md +28 -0
- package/skills/ultra-research/references/99-synthesis.md +35 -0
- package/skills/ultra-review/SKILL.md +63 -73
- package/skills/ultra-review/references/review-modes.md +27 -0
- package/skills/ultra-review/references/unified-schema.md +25 -0
- package/skills/ultra-review/scripts/review_wait.py +40 -3
- package/skills/ultra-status/SKILL.md +41 -41
- package/skills/ultra-test/SKILL.md +54 -55
- package/skills/ultra-think/SKILL.md +26 -12
- package/skills/ultra-think/references/decision-dialogue.md +130 -0
- package/skills/ultra-verify/SKILL.md +1 -1
- package/skills/ultra-verify/references/{confidence-system.md → evidence-status.md} +3 -3
- package/spec/cli-protocol.md +17 -3
- package/spec/mcp-tools.yaml +683 -64
- package/spec/schemas/baseline-reconciliation.v1.schema.json +73 -0
- package/spec/schemas/delivery-report.v1.schema.json +111 -0
- package/spec/schemas/mcp-tools.schema.json +1 -1
- package/spec/schemas/state-db.sql +140 -1
- package/spec/schemas/tasks.v4.5.schema.json +8 -1
- package/spec/schemas/test-report.v1.schema.json +194 -0
- package/ultra-tools/cli.cjs +1 -1
- package/ultra-tools/commands/migrate.cjs +3 -3
- package/ultra-tools/commands/status.cjs +228 -12
- package/.ultra-template/delivery-report.json +0 -9
- package/.ultra-template/test-report.json +0 -8
- package/adapters/_shared/tests/file-ops.test.cjs +0 -54
- package/adapters/_shared/tests/frontmatter.test.cjs +0 -47
- package/adapters/_shared/tests/handbook.test.cjs +0 -101
- package/adapters/_shared/tests/path-rewrite.test.cjs +0 -60
- package/adapters/_shared/tests/provenance.test.cjs +0 -133
- package/adapters/_shared/tests/resolve-target.test.cjs +0 -75
- package/adapters/_shared/tests/runtime-assets.test.cjs +0 -149
- package/adapters/_shared/tests/settings-merge.test.cjs +0 -85
- package/adapters/_shared/tests/validate.test.cjs +0 -30
- package/adapters/tests/claude.test.cjs +0 -138
- package/adapters/tests/codex-hook.test.cjs +0 -142
- package/adapters/tests/codex.test.cjs +0 -430
- package/adapters/tests/kimi-hook.test.cjs +0 -149
- package/adapters/tests/kimi.test.cjs +0 -259
- package/adapters/tests/opencode.test.cjs +0 -357
- package/mcp-server/lib/archive-journal.test.cjs +0 -35
- package/mcp-server/lib/baseline-workflow.test.cjs +0 -477
- package/mcp-server/lib/change-workflow.test.cjs +0 -971
- package/mcp-server/lib/context-spine.test.cjs +0 -93
- package/mcp-server/lib/doctor.test.cjs +0 -148
- package/mcp-server/lib/plan-store.test.cjs +0 -132
- package/mcp-server/lib/prd-parser.test.cjs +0 -82
- package/mcp-server/lib/project-breadcrumb.test.cjs +0 -112
- package/mcp-server/lib/runtime-state.test.cjs +0 -92
- package/mcp-server/lib/spec-learning.test.cjs +0 -67
- package/mcp-server/lib/state-db.test.cjs +0 -314
- package/mcp-server/lib/task-expander.test.cjs +0 -169
- package/mcp-server/lib/topo.test.cjs +0 -158
- package/mcp-server/tests/circuit-breaker.test.cjs +0 -125
- package/mcp-server/tests/commit-hash-flow.test.cjs +0 -117
- package/mcp-server/tests/concurrency-update.test.cjs +0 -96
- package/mcp-server/tests/concurrency.test.cjs +0 -112
- package/mcp-server/tests/db-ops.test.cjs +0 -121
- package/mcp-server/tests/init-project.test.cjs +0 -393
- package/mcp-server/tests/migrate.test.cjs +0 -232
- package/mcp-server/tests/projector.test.cjs +0 -162
- package/mcp-server/tests/server-contract.test.cjs +0 -1467
- package/mcp-server/tests/staleness.test.cjs +0 -190
- package/mcp-server/tests/state-db.test.cjs +0 -106
- package/mcp-server/tests/state-ops.test.cjs +0 -449
- package/mcp-server/tests/tagged-tasks.test.cjs +0 -163
- package/mcp-server/tests/telemetry.test.cjs +0 -219
- package/orchestrator/planner/plan-builder.test.cjs +0 -165
- package/orchestrator/tests/auto-merge.test.cjs +0 -216
- package/orchestrator/tests/daemon.test.cjs +0 -311
- package/orchestrator/tests/dispatch-rules.test.cjs +0 -124
- package/orchestrator/tests/parallel-orchestrator.test.cjs +0 -233
- package/orchestrator/tests/phase-8b-gate.test.cjs +0 -183
- package/orchestrator/tests/recovery.test.cjs +0 -190
- package/orchestrator/tests/session-runner.test.cjs +0 -314
- package/orchestrator/tests/skill-miner.test.cjs +0 -147
- package/orchestrator/tests/worktree-manager.test.cjs +0 -148
- package/skills/ultra-research/references/architecture.md +0 -38
- package/skills/ultra-research/references/problem-product.md +0 -39
- package/skills/ultra-research/references/quality-delivery.md +0 -34
- package/skills/ultra-research/references/synthesis.md +0 -38
- package/skills/ultra-research/references/users-scope.md +0 -40
- package/ultra-tools/legacy-memory.test.cjs +0 -80
- package/ultra-tools/status-command.test.cjs +0 -181
- 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
|
+
}
|
package/ultra-tools/cli.cjs
CHANGED
|
@@ -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|
|
|
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':
|
|
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 ->
|
|
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: .)
|