ultra-builder-pro-cli 0.24.1 → 0.25.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/CHANGELOG.md +63 -0
- package/README.md +10 -0
- package/adapters/claude.js +104 -0
- package/adapters/codex.js +363 -40
- package/adapters/grok.js +1254 -58
- package/adapters/kimi.js +682 -13
- package/adapters/opencode.js +132 -11
- package/agents/code-reviewer.md +4 -5
- package/agents/debugger.md +8 -8
- package/docs/AGENT-CONTEXT.md +30 -4
- package/docs/ARCHITECTURE.md +24 -5
- package/docs/ARTIFACT-AUTHORITY.md +13 -0
- package/docs/COMMIT-HASH-BACKFILL.md +25 -18
- package/docs/RUNTIME-COMPAT-MATRIX.md +18 -2
- package/docs/STATE-DB-ACCESS-POLICY.md +8 -1
- package/mcp-server/lib/artifact-registry.cjs +188 -107
- package/mcp-server/lib/baseline-workflow.cjs +160 -23
- package/mcp-server/lib/change-packet.cjs +4 -32
- package/mcp-server/lib/change-workflow.cjs +36 -2755
- package/mcp-server/lib/context-envelope.cjs +124 -51
- package/mcp-server/lib/decision-records.cjs +164 -78
- package/mcp-server/lib/kernel-change-workflow.cjs +2029 -0
- package/mcp-server/lib/legacy-change-workflow.cjs +3032 -0
- package/mcp-server/lib/managed-file-write.cjs +56 -0
- package/mcp-server/lib/prd-parser.cjs +2 -2
- package/mcp-server/lib/stage-checkpoints.cjs +163 -9
- package/mcp-server/lib/state-db.cjs +186 -8
- package/mcp-server/lib/state-ops.cjs +214 -31
- package/mcp-server/lib/task-contract.cjs +404 -0
- package/mcp-server/lib/task-expander.cjs +8 -3
- package/mcp-server/lib/task-ledger.cjs +175 -62
- package/mcp-server/lib/ultra-facade.cjs +1895 -172
- package/mcp-server/lib/worker-packet.cjs +2 -2
- package/mcp-server/server.cjs +24 -5
- package/orchestrator/parallel-orchestrator.cjs +114 -27
- package/orchestrator/session-runner.cjs +25 -136
- package/package.json +1 -1
- package/skills/ultra-change/SKILL.md +6 -1
- package/skills/ultra-dev/SKILL.md +9 -4
- package/skills/ultra-plan/SKILL.md +13 -4
- package/skills/ultra-plan/references/semantic-preflight.md +6 -4
- package/spec/mcp-tools.yaml +114 -9
- package/spec/schemas/context-file.v4.5.schema.json +2 -2
- package/spec/schemas/state-db.sql +10 -6
- package/spec/schemas/task-ledger.v2.schema.json +23 -8
- package/spec/schemas/tasks.v4.5.schema.json +34 -12
package/spec/mcp-tools.yaml
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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:
|
|
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:
|
|
144
|
-
|
|
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:
|
|
164
|
-
|
|
165
|
-
|
|
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:
|
|
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", "
|
|
24
|
-
"type": { "type": "string", "
|
|
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
|
|
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
|
-
--
|
|
85
|
-
--
|
|
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
|
|
90
|
-
priority TEXT NOT NULL CHECK (priority
|
|
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
|
|
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", "
|
|
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", "
|
|
248
|
-
"priority": { "type": "string", "
|
|
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
|
-
"
|
|
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.
|
|
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", "
|
|
27
|
-
"priority": { "type": "string", "
|
|
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": "
|
|
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":
|
|
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", "
|
|
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":
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
}
|