ultra-builder-pro-cli 0.24.2 → 0.25.1

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 (41) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/adapters/claude.js +104 -0
  3. package/adapters/codex.js +363 -40
  4. package/adapters/grok.js +1254 -58
  5. package/adapters/kimi.js +682 -13
  6. package/adapters/opencode.js +132 -11
  7. package/docs/AGENT-CONTEXT.md +14 -0
  8. package/docs/ARTIFACT-AUTHORITY.md +13 -0
  9. package/docs/COMMIT-HASH-BACKFILL.md +25 -18
  10. package/docs/RUNTIME-COMPAT-MATRIX.md +18 -2
  11. package/mcp-server/lib/artifact-registry.cjs +181 -51
  12. package/mcp-server/lib/baseline-workflow.cjs +160 -23
  13. package/mcp-server/lib/change-workflow.cjs +21 -16
  14. package/mcp-server/lib/context-envelope.cjs +124 -51
  15. package/mcp-server/lib/decision-records.cjs +164 -78
  16. package/mcp-server/lib/kernel-change-workflow.cjs +2029 -0
  17. package/mcp-server/lib/legacy-change-workflow.cjs +294 -71
  18. package/mcp-server/lib/managed-file-write.cjs +56 -0
  19. package/mcp-server/lib/prd-parser.cjs +2 -2
  20. package/mcp-server/lib/runtime-paths.cjs +43 -16
  21. package/mcp-server/lib/stage-checkpoints.cjs +163 -9
  22. package/mcp-server/lib/state-db.cjs +186 -8
  23. package/mcp-server/lib/state-ops.cjs +214 -31
  24. package/mcp-server/lib/task-contract.cjs +404 -0
  25. package/mcp-server/lib/task-expander.cjs +2 -2
  26. package/mcp-server/lib/task-ledger.cjs +175 -62
  27. package/mcp-server/lib/ultra-facade.cjs +1786 -169
  28. package/mcp-server/lib/worker-packet.cjs +2 -2
  29. package/mcp-server/server.cjs +23 -4
  30. package/orchestrator/parallel-orchestrator.cjs +114 -27
  31. package/orchestrator/session-runner.cjs +25 -136
  32. package/package.json +1 -1
  33. package/skills/ultra-change/SKILL.md +6 -1
  34. package/skills/ultra-dev/SKILL.md +9 -4
  35. package/skills/ultra-plan/SKILL.md +13 -4
  36. package/skills/ultra-plan/references/semantic-preflight.md +6 -4
  37. package/spec/mcp-tools.yaml +114 -9
  38. package/spec/schemas/context-file.v4.5.schema.json +2 -2
  39. package/spec/schemas/state-db.sql +10 -6
  40. package/spec/schemas/task-ledger.v2.schema.json +23 -8
  41. package/spec/schemas/tasks.v4.5.schema.json +34 -12
@@ -52,7 +52,7 @@ tools:
52
52
 
53
53
  - name: ultra.record
54
54
  family: ultra
55
- description: Record one or more typed draft facts or actions with per-entry idempotency. Semantic rejections are returned as mutable diagnostics rather than transport errors.
55
+ description: Record one or more typed draft facts or actions with per-entry idempotency. Entry data is checked against its kind/action contract so one invalid batch item can return a mutable diagnostic without hiding the other results.
56
56
  phase: '24'
57
57
  writer_role: mcp
58
58
  input_schema:
@@ -71,6 +71,7 @@ tools:
71
71
  kind:
72
72
  type: string
73
73
  enum: [baseline, change_contract, decision, task_contract, task_outcome, artifact, event]
74
+ description: Selects the entry data contract. Task contracts own durable intent; Task outcomes own status and post-commit attestation.
74
75
  action:
75
76
  type: string
76
77
  enum:
@@ -81,14 +82,80 @@ tools:
81
82
  - open
82
83
  - revise
83
84
  - cancel
85
+ - supersede
84
86
  - define
85
87
  - remove
86
88
  - complete
87
89
  - block
88
90
  - reopen
91
+ - attest_commit
89
92
  - bind
90
93
  - append
91
- data: { type: object }
94
+ description: Valid actions are checked with kind at runtime; task_outcome uses start, block, reopen, complete, or attest_commit.
95
+ data:
96
+ type: object
97
+ description: |
98
+ Every kind/action selects one exact data contract. Unknown fields,
99
+ wrong scalar/container types, invalid closed mechanical enums,
100
+ malformed digests, and mismatched authority references return an entry-level mutable
101
+ VALIDATION_ERROR before SQLite or filesystem mutation.
102
+
103
+ baseline uses mode greenfield|brownfield; spec kinds
104
+ discovery|product|architecture|quality|delivery|other; evidence kinds
105
+ source|docs|runtime|test|deploy|external; verification status
106
+ pass|known_red|not_run; gap status open|accepted|resolved|deferred and
107
+ category baseline_blocker|documentation_drift|known_defect|
108
+ technical_debt|unknown|future_change. blocking and acceptance flags
109
+ are booleans, never truthy strings.
110
+
111
+ change_contract/open accepts a bounded caller-defined kind; quick,
112
+ standard, major, and incident are recommended Skill-level profiles,
113
+ docs_impact.status unknown|required|none, risk flags
114
+ public_contract|schema_migration|data_migration|authorization|
115
+ security|multi_module|external_integration|release_semantics are
116
+ recommended Skill-level labels rather than a closed MCP vocabulary, and
117
+ research status none|bounded|required with mode
118
+ product|feature|architecture|custom are likewise recommended profiles;
119
+ bounded repository-defined status, mode, and risk labels remain valid.
120
+ revise uses {id, patch};
121
+ cancel uses {id}. supersede uses an archived or cancelled source id,
122
+ a successor_id, and optional title/kind/intent overrides. Draft
123
+ semantic corrections remain reversible; immutable history creates a
124
+ linked active successor instead of reopening in place.
125
+
126
+ decision/accept has exact scope {baseline_id} or {change_id};
127
+ applied_refs items are exactly {ref, field, digest?}. effects and
128
+ provenance are JSON objects; non_goals is a string array.
129
+
130
+ Task contracts are structurally exact. task_contract/define requires
131
+ id, title, and bounded non-empty type and priority strings.
132
+ architecture|feature|bugfix and P0|P1|P2|P3 are recommended
133
+ Skill-level vocabulary, not SQLite business verdicts.
134
+ id matches [A-Za-z0-9_-]+ and title has at least 3 characters.
135
+ Optional complexity is integer 1..10, estimated_days is >0,
136
+ slice_kind is an optional bounded caller-defined string; tracer_bullet,
137
+ expand_contract, and integration_checkpoint are recommended profiles.
138
+ deps/files_modified are non-empty-string arrays, and
139
+ acceptance/context_refs are object arrays. task_contract/revise uses
140
+ {id, patch} and permits contract fields, including corrected
141
+ title/type, only. status, session_id, stale, tag, context_file, and
142
+ completion_commit are runtime-owned and forbidden in Task Contracts.
143
+ task_outcome start|block|reopen uses {id}. complete uses exactly
144
+ {id, packet_digest} with a 64-hex packet digest; patch and
145
+ completion_commit are forbidden.
146
+ After durable completion is synced and committed, attest_commit uses
147
+ exactly {id, completion_commit}; the commit is a full 40- or 64-hex
148
+ Git object id recorded as checkout-local proof.
149
+
150
+ artifact/bind uses owner_type project|baseline|change|task|workflow,
151
+ status current|stale|terminal|archived, 64-lowercase-hex content
152
+ digests, and exact reference items {type, id, relation}; type is
153
+ artifact|project|baseline|change|task|workflow|external. Current
154
+ public authority rejects workflow-owned legacy references.
155
+
156
+ event/append is exactly {type, task_id?, change_id?, session_id?,
157
+ runtime?, payload?}. Identifiers/runtime are strings or null and
158
+ payload is a JSON object.
92
159
  idempotency_key: { type: string, minLength: 3 }
93
160
  output_schema: { type: object }
94
161
  errors:
@@ -115,7 +182,15 @@ tools:
115
182
  properties:
116
183
  change_id: { type: string, minLength: 1 }
117
184
  task_id: { type: string, minLength: 1 }
118
- payload: { type: object }
185
+ payload:
186
+ type: object
187
+ description: |
188
+ Stage-specific semantic fields remain model-owned. Kernel-owned evidence
189
+ is an object array whose kind/ref/summary/digest/artifact_id values are
190
+ strings when present. diagnostics is an exact object array with required
191
+ string code and optional string severity/message plus JSON details.
192
+ Evidence authority, current bytes, scope, checkpoint identity, and the
193
+ accepted receipt are validated atomically.
119
194
  idempotency_key: { type: string, minLength: 3 }
120
195
  output_schema: { type: object }
121
196
  errors:
@@ -140,8 +215,13 @@ tools:
140
215
  additionalProperties: false
141
216
  properties:
142
217
  action: { type: string, enum: [inspect, import, publish, migrate] }
143
- reason: { type: string }
144
- idempotency_key: { type: string }
218
+ reason:
219
+ type: string
220
+ description: Allowed only for publish.
221
+ idempotency_key:
222
+ type: string
223
+ minLength: 3
224
+ description: Required only for publish; binds the exact request and ledger generation.
145
225
  output_schema: { type: object }
146
226
  errors:
147
227
  - { code: VALIDATION_ERROR, description: 'input failed structural validation' }
@@ -160,9 +240,24 @@ tools:
160
240
  additionalProperties: false
161
241
  properties:
162
242
  action: { type: string, enum: [admission, acquire, get, list, heartbeat, release] }
163
- scope: { type: object }
164
- payload: { type: object }
165
- idempotency_key: { type: string }
243
+ scope:
244
+ type: object
245
+ description: |
246
+ admission/acquire/list use task_id (list may omit it); get/heartbeat/release
247
+ use sid. Unknown scope fields are rejected.
248
+ payload:
249
+ type: object
250
+ description: |
251
+ admission/get/list/heartbeat accept no payload fields. acquire accepts only
252
+ role, runtime, output_path, output_schema, evidence_refs, diff_range,
253
+ changed_files, takeover, and worktree_base. release accepts status
254
+ completed|crashed and optional boolean remove_worktree. Acquire, heartbeat,
255
+ and release compensate Session, lease, Worker Packet, and worktree effects
256
+ if their durable receipt fails.
257
+ idempotency_key:
258
+ type: string
259
+ minLength: 3
260
+ description: Required for acquire, heartbeat, and release.
166
261
  output_schema: { type: object }
167
262
  errors:
168
263
  - { code: VALIDATION_ERROR, description: 'input failed structural validation' }
@@ -181,7 +276,17 @@ tools:
181
276
  additionalProperties: false
182
277
  properties:
183
278
  change_id: { type: string, minLength: 1 }
184
- payload: { type: object }
279
+ payload:
280
+ type: object
281
+ additionalProperties: false
282
+ properties:
283
+ summary: { type: string }
284
+ baseline_updates:
285
+ type: array
286
+ items: { type: string }
287
+ no_baseline_change_reason: { type: string }
288
+ reconciliation_path: { type: string }
289
+ description: The payload cannot replace the caller-declared change_id.
185
290
  idempotency_key: { type: string, minLength: 3 }
186
291
  output_schema: { type: object }
187
292
  errors:
@@ -20,8 +20,8 @@
20
20
  "x-derived": true,
21
21
  "description": "DERIVED from state.db tasks.status; written by projector, not by humans"
22
22
  },
23
- "priority": { "type": "string", "enum": ["P0", "P1", "P2", "P3"] },
24
- "type": { "type": "string", "enum": ["architecture", "feature", "bugfix"] },
23
+ "priority": { "type": "string", "minLength": 1, "maxLength": 80 },
24
+ "type": { "type": "string", "minLength": 1, "maxLength": 80 },
25
25
  "session_id": { "type": "string", "x-derived": true },
26
26
  "schema_version": { "const": "4.5" },
27
27
  "generated_at": { "type": "string", "format": "date-time" }
@@ -59,7 +59,7 @@ CREATE INDEX IF NOT EXISTS baselines_status ON baselines(status, updated_at);
59
59
  CREATE TABLE IF NOT EXISTS changes (
60
60
  id TEXT PRIMARY KEY,
61
61
  title TEXT NOT NULL,
62
- kind TEXT NOT NULL CHECK (kind IN ('quick', 'standard', 'major', 'incident')),
62
+ kind TEXT NOT NULL CHECK (length(trim(kind)) BETWEEN 1 AND 80),
63
63
  status TEXT NOT NULL DEFAULT 'active'
64
64
  CHECK (status IN ('active', 'blocked', 'ready', 'archived', 'cancelled')),
65
65
  intent TEXT NOT NULL,
@@ -71,6 +71,7 @@ CREATE TABLE IF NOT EXISTS changes (
71
71
  research_disposition_json TEXT NOT NULL DEFAULT '{}',
72
72
  alignment_thread_id TEXT REFERENCES decision_threads(id) ON DELETE SET NULL,
73
73
  base_commit TEXT,
74
+ supersedes_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
74
75
  artifact_root TEXT NOT NULL,
75
76
  created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
76
77
  updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
@@ -81,13 +82,14 @@ CREATE INDEX IF NOT EXISTS changes_status ON changes(status, created_at);
81
82
  CREATE INDEX IF NOT EXISTS changes_kind ON changes(kind, created_at);
82
83
 
83
84
  -- ──────────────────────────── tasks ───────────────────────────────────────
84
- -- Authoritative task row. tasks.json is generated from this table by the
85
- -- projector (Phase 2.6). Manual edits to tasks.json are overwritten.
85
+ -- Checkout-local operational task authority. The Git-facing tasks.json is a
86
+ -- durable team checkpoint published/imported through ultra.sync; live
87
+ -- projections stay below .ultra/.runtime and are never edited manually.
86
88
  CREATE TABLE IF NOT EXISTS tasks (
87
89
  id TEXT PRIMARY KEY,
88
90
  title TEXT NOT NULL,
89
- type TEXT NOT NULL CHECK (type IN ('architecture', 'feature', 'bugfix')),
90
- priority TEXT NOT NULL CHECK (priority IN ('P0', 'P1', 'P2', 'P3')),
91
+ type TEXT NOT NULL CHECK (length(trim(type)) BETWEEN 1 AND 80),
92
+ priority TEXT NOT NULL CHECK (length(trim(priority)) BETWEEN 1 AND 80),
91
93
  complexity INTEGER CHECK (complexity BETWEEN 1 AND 10),
92
94
  estimated_days REAL CHECK (estimated_days IS NULL OR estimated_days > 0),
93
95
  status TEXT NOT NULL DEFAULT 'pending'
@@ -99,7 +101,7 @@ CREATE TABLE IF NOT EXISTS tasks (
99
101
  tag TEXT, -- git branch tag (Phase 7.2)
100
102
  trace_to TEXT, -- spec anchor reference
101
103
  outcome TEXT, -- observable result owned by this task
102
- slice_kind TEXT CHECK (slice_kind IS NULL OR slice_kind IN ('tracer_bullet', 'expand_contract', 'integration_checkpoint')),
104
+ slice_kind TEXT CHECK (slice_kind IS NULL OR length(trim(slice_kind)) BETWEEN 1 AND 80),
103
105
  public_seam TEXT, -- externally observable seam exercised by the slice
104
106
  verification_command TEXT, -- exact task-level verification command
105
107
  acceptance_json TEXT NOT NULL DEFAULT '[]',
@@ -635,3 +637,5 @@ INSERT OR IGNORE INTO schema_version (version, description)
635
637
  VALUES ('21.0', 'Seven-tool persistence kernel, reversible stage checkpoints, canonical context envelopes, normalized decisions, and worker packets');
636
638
  INSERT OR IGNORE INTO schema_version (version, description)
637
639
  VALUES ('22.0', 'Checkpoint-native baseline authority plus byte-bound Context Envelopes and Worker Packets');
640
+ INSERT OR IGNORE INTO schema_version (version, description)
641
+ VALUES ('23.0', 'Open semantic vocabularies, mutable Change drafts, and linked immutable-archive successors');
@@ -67,7 +67,7 @@
67
67
  "properties": {
68
68
  "id": { "type": "string" },
69
69
  "title": { "type": "string", "minLength": 1 },
70
- "kind": { "type": "string", "enum": ["quick", "standard", "major", "incident"] },
70
+ "kind": { "type": "string", "minLength": 1, "maxLength": 80 },
71
71
  "status": { "type": "string", "enum": ["active", "archived", "cancelled"] },
72
72
  "intent": { "type": "string", "minLength": 1 },
73
73
  "docs_impact": { "type": "object" },
@@ -79,6 +79,7 @@
79
79
  "base_commit": { "type": "string" },
80
80
  "artifact_root": { "type": "string", "minLength": 1 },
81
81
  "closed_at": { "type": "string" },
82
+ "supersedes_id": { "type": "string", "minLength": 1 },
82
83
  "revision": { "type": "integer", "minimum": 1 },
83
84
  "parent_digest": {
84
85
  "type": ["string", "null"],
@@ -223,6 +224,7 @@
223
224
  },
224
225
  "task": {
225
226
  "type": "object",
227
+ "description": "Git-facing durable Task authority. Checkout-local session_id, tag, context_file, completion_commit, created_at, and updated_at are intentionally forbidden.",
226
228
  "required": [
227
229
  "id",
228
230
  "title",
@@ -244,22 +246,35 @@
244
246
  "properties": {
245
247
  "id": { "type": "string", "pattern": "^[a-zA-Z0-9_\\-]+$" },
246
248
  "title": { "type": "string", "minLength": 3 },
247
- "type": { "type": "string", "enum": ["architecture", "feature", "bugfix"] },
248
- "priority": { "type": "string", "enum": ["P0", "P1", "P2", "P3"] },
249
+ "type": { "type": "string", "minLength": 1, "maxLength": 80 },
250
+ "priority": { "type": "string", "minLength": 1, "maxLength": 80 },
249
251
  "complexity": { "type": "integer", "minimum": 1, "maximum": 10 },
250
252
  "estimated_days": { "type": "number", "exclusiveMinimum": 0 },
251
253
  "status": {
252
254
  "type": "string",
253
- "enum": ["pending", "completed", "blocked", "expanded"]
255
+ "enum": ["pending", "completed", "blocked", "expanded"],
256
+ "description": "Durable Task outcome. Checkout-local in_progress is never published."
257
+ },
258
+ "deps": {
259
+ "type": "array",
260
+ "items": { "type": "string", "minLength": 1 },
261
+ "description": "Durable dependency Task ids."
262
+ },
263
+ "files_modified": {
264
+ "type": "array",
265
+ "items": { "type": "string", "minLength": 1 },
266
+ "description": "Durable path-level conflict surface."
267
+ },
268
+ "stale": {
269
+ "type": "boolean",
270
+ "description": "Runtime-derived freshness fact published for team handoff."
254
271
  },
255
- "deps": { "type": "array", "items": { "type": "string" } },
256
- "files_modified": { "type": "array", "items": { "type": "string" } },
257
- "stale": { "type": "boolean" },
258
272
  "trace_to": { "type": "string" },
259
273
  "outcome": { "type": "string" },
260
274
  "slice_kind": {
261
275
  "type": "string",
262
- "enum": ["tracer_bullet", "expand_contract", "integration_checkpoint"]
276
+ "minLength": 1,
277
+ "maxLength": 80
263
278
  },
264
279
  "public_seam": { "type": "string" },
265
280
  "verification_command": { "type": "string" },
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://ultra-builder-pro.dev/spec/tasks.v4.5.schema.json",
4
4
  "title": "tasks.json projection (v4.5)",
5
- "description": "Read-only projection of the tasks table. Generated by the projector; manual edits are overwritten. Status and dependencies are derived from state.db. Authority boundary: docs/DECISIONS.md.",
5
+ "description": "Read-only checkout-local projection of the tasks table. Generated by the projector; manual edits are overwritten. It includes both durable Task authority and runtime-only fields that never enter the Git team ledger. Authority boundary: docs/DECISIONS.md.",
6
6
  "type": "object",
7
7
  "required": ["schema_version", "generated_at", "tasks"],
8
8
  "additionalProperties": false,
@@ -18,13 +18,14 @@
18
18
  "$defs": {
19
19
  "task": {
20
20
  "type": "object",
21
+ "description": "Live Task projection. task_contract may write contract fields only; status/session/freshness/context/timestamps and completion attestation are runtime-owned.",
21
22
  "required": ["id", "title", "type", "priority", "status", "created_at", "updated_at"],
22
23
  "additionalProperties": false,
23
24
  "properties": {
24
25
  "id": { "type": "string", "pattern": "^[a-zA-Z0-9_\\-]+$" },
25
26
  "title": { "type": "string", "minLength": 3 },
26
- "type": { "type": "string", "enum": ["architecture", "feature", "bugfix"] },
27
- "priority": { "type": "string", "enum": ["P0", "P1", "P2", "P3"] },
27
+ "type": { "type": "string", "minLength": 1, "maxLength": 80 },
28
+ "priority": { "type": "string", "minLength": 1, "maxLength": 80 },
28
29
  "complexity": { "type": "integer", "minimum": 1, "maximum": 10 },
29
30
  "estimated_days": { "type": "number", "exclusiveMinimum": 0 },
30
31
  "status": {
@@ -35,14 +36,14 @@
35
36
  },
36
37
  "deps": {
37
38
  "type": "array",
38
- "items": { "type": "string" },
39
+ "items": { "type": "string", "minLength": 1 },
39
40
  "x-derived": true,
40
41
  "description": "DERIVED from state.db tasks.deps JSON"
41
42
  },
42
43
  "files_modified": {
43
44
  "type": "array",
44
- "items": { "type": "string" },
45
- "description": "Phase 8B conflict surface; new in v4.5"
45
+ "items": { "type": "string", "minLength": 1 },
46
+ "description": "Durable path-level conflict surface."
46
47
  },
47
48
  "session_id": {
48
49
  "type": "string",
@@ -54,20 +55,41 @@
54
55
  "x-derived": true,
55
56
  "description": "DERIVED from staleness propagation (Phase 5.3)"
56
57
  },
57
- "tag": { "type": "string" },
58
+ "tag": {
59
+ "type": "string",
60
+ "x-derived": true,
61
+ "description": "Checkout-local runtime tag; never task_contract input."
62
+ },
58
63
  "trace_to": { "type": "string" },
59
64
  "outcome": { "type": "string" },
60
- "slice_kind": { "type": "string", "enum": ["tracer_bullet", "expand_contract", "integration_checkpoint"] },
65
+ "slice_kind": { "type": "string", "minLength": 1, "maxLength": 80 },
61
66
  "public_seam": { "type": "string" },
62
67
  "verification_command": { "type": "string" },
63
68
  "acceptance": { "type": "array", "items": { "type": "object" } },
64
69
  "context_refs": { "type": "array", "items": { "type": "object" } },
65
70
  "docs_impact": { "type": "object" },
66
71
  "ownership": { "type": "object" },
67
- "context_file": { "type": "string" },
68
- "completion_commit": { "type": "string", "pattern": "^[0-9a-f]{7,40}$" },
69
- "created_at": { "type": "string", "format": "date-time" },
70
- "updated_at": { "type": "string", "format": "date-time" }
72
+ "context_file": {
73
+ "type": "string",
74
+ "x-derived": true,
75
+ "description": "Checkout-local generated Context path; never task_contract input."
76
+ },
77
+ "completion_commit": {
78
+ "type": "string",
79
+ "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
80
+ "x-derived": true,
81
+ "description": "Checkout-local integrated commit proof written only by task_outcome/attest_commit."
82
+ },
83
+ "created_at": {
84
+ "type": "string",
85
+ "format": "date-time",
86
+ "x-derived": true
87
+ },
88
+ "updated_at": {
89
+ "type": "string",
90
+ "format": "date-time",
91
+ "x-derived": true
92
+ }
71
93
  }
72
94
  }
73
95
  }