ultra-builder-pro-cli 0.25.1 → 0.26.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 (241) hide show
  1. package/.ultra-template/contexts/TEMPLATE.md +87 -0
  2. package/.ultra-template/decisions/.gitkeep +1 -0
  3. package/.ultra-template/evidence/.gitkeep +1 -0
  4. package/.ultra-template/north-star.md +46 -0
  5. package/.ultra-template/research/.gitkeep +1 -0
  6. package/.ultra-template/specs/discovery.md +2 -2
  7. package/.ultra-template/tasks.json +3 -0
  8. package/.ultra-template/test-report.json +27 -0
  9. package/CHANGELOG.md +40 -0
  10. package/README.md +217 -579
  11. package/adapters/_shared/delegate-profiles/kimi-read-only.md +15 -0
  12. package/adapters/_shared/delegate-profiles/kimi-write.md +17 -0
  13. package/adapters/_shared/file-ops.cjs +76 -2
  14. package/adapters/_shared/host-profile.cjs +97 -0
  15. package/adapters/_shared/plugin-core.cjs +204 -0
  16. package/adapters/_shared/runtime-assets.cjs +31 -96
  17. package/adapters/claude.js +92 -291
  18. package/adapters/codex.js +309 -842
  19. package/adapters/grok.js +143 -1469
  20. package/adapters/kimi.js +124 -1053
  21. package/adapters/opencode.js +230 -742
  22. package/bin/delegate-worker.cjs +323 -0
  23. package/bin/delegate.cjs +456 -0
  24. package/bin/install.js +38 -11
  25. package/docs/ARCHITECTURE.md +122 -216
  26. package/docs/ARTIFACT-AUTHORITY.md +90 -268
  27. package/docs/DECISIONS.md +75 -87
  28. package/docs/PHILOSOPHY.md +177 -0
  29. package/docs/PLUGIN-ISOLATION-CONTRACT.md +62 -39
  30. package/docs/RUNTIME-COMPAT-MATRIX.md +99 -156
  31. package/docs/SKILL-AUTHORING.md +94 -73
  32. package/docs/WORKFLOW-LIFECYCLE.md +93 -189
  33. package/hooks/README.md +17 -37
  34. package/hooks/_common.py +113 -0
  35. package/hooks/adapters/codex.py +9 -16
  36. package/hooks/adapters/grok.py +5 -5
  37. package/hooks/adapters/kimi.py +8 -14
  38. package/hooks/block_dangerous_commands.py +95 -0
  39. package/hooks/compact_context.py +65 -0
  40. package/hooks/mid_workflow_recall.py +25 -0
  41. package/hooks/post_edit_guard.py +105 -0
  42. package/hooks/session_context.py +30 -0
  43. package/package.json +17 -52
  44. package/skills/ultra-change/SKILL.md +97 -50
  45. package/skills/ultra-change/references/change-contract.md +40 -1
  46. package/skills/ultra-delegate/SKILL.md +82 -0
  47. package/skills/ultra-delegate/references/delegation-contract.md +51 -0
  48. package/skills/ultra-delegate/scripts/delegate_wait.py +86 -0
  49. package/skills/ultra-deliver/SKILL.md +61 -42
  50. package/skills/ultra-deliver/references/baseline-reconciliation.md +39 -20
  51. package/skills/ultra-dev/SKILL.md +96 -62
  52. package/skills/ultra-dev/references/debugging.md +22 -0
  53. package/skills/ultra-domain-modeling/SKILL.md +79 -0
  54. package/skills/ultra-grilling/SKILL.md +79 -0
  55. package/skills/ultra-init/SKILL.md +94 -37
  56. package/skills/ultra-init/references/brownfield-adoption.md +33 -83
  57. package/skills/ultra-init/scripts/init_project.cjs +84 -0
  58. package/skills/ultra-plan/SKILL.md +88 -68
  59. package/skills/ultra-research/SKILL.md +62 -48
  60. package/skills/ultra-research/references/00-problem-validation.md +5 -5
  61. package/skills/ultra-research/references/01-opportunity-discovery.md +3 -3
  62. package/skills/ultra-research/references/02-market-assessment.md +5 -4
  63. package/skills/ultra-research/references/03-competitive-landscape.md +3 -3
  64. package/skills/ultra-research/references/04-product-strategy.md +3 -3
  65. package/skills/ultra-research/references/05-assumptions-validation.md +5 -5
  66. package/skills/ultra-research/references/10-user-personas.md +3 -2
  67. package/skills/ultra-research/references/11-user-scenarios.md +3 -3
  68. package/skills/ultra-research/references/20-user-stories.md +4 -3
  69. package/skills/ultra-research/references/21-features-scope.md +3 -2
  70. package/skills/ultra-research/references/22-success-metrics.md +3 -3
  71. package/skills/ultra-research/references/30-architecture-context.md +3 -3
  72. package/skills/ultra-research/references/31-solution-strategy.md +3 -3
  73. package/skills/ultra-research/references/32-building-blocks.md +3 -3
  74. package/skills/ultra-research/references/40-deployment.md +3 -3
  75. package/skills/ultra-research/references/41-quality-risks.md +3 -3
  76. package/skills/ultra-research/references/99-synthesis.md +7 -7
  77. package/skills/ultra-review/SKILL.md +59 -32
  78. package/skills/ultra-review/references/code.md +17 -0
  79. package/skills/ultra-review/references/comments.md +12 -0
  80. package/skills/ultra-review/references/design.md +12 -0
  81. package/skills/ultra-review/references/errors.md +13 -0
  82. package/skills/ultra-review/references/spec.md +13 -0
  83. package/skills/ultra-review/references/tests.md +12 -0
  84. package/skills/ultra-review/references/worker-packet.md +40 -0
  85. package/skills/ultra-review/scripts/review_wait.py +26 -15
  86. package/skills/ultra-status/SKILL.md +61 -36
  87. package/skills/ultra-tdd/SKILL.md +81 -0
  88. package/skills/ultra-tdd/references/templates/README.md +20 -0
  89. package/skills/ultra-tdd/references/templates/feature-flag-default-audit.sh +79 -0
  90. package/skills/ultra-tdd/references/templates/persistence-real.ts +78 -0
  91. package/skills/ultra-tdd/references/templates/testcontainer-postgres.py +78 -0
  92. package/skills/ultra-tdd/references/templates/testcontainer-postgres.ts +73 -0
  93. package/skills/ultra-tdd/references/templates/vertical-slice.ts +66 -0
  94. package/skills/ultra-tdd/references/test-execution.md +18 -0
  95. package/skills/ultra-test/SKILL.md +70 -30
  96. package/skills/ultra-test/references/export-syntax.md +18 -0
  97. package/skills/ultra-test/scripts/worktree_digest.cjs +54 -0
  98. package/skills/ultra-think/SKILL.md +49 -27
  99. package/skills/ultra-think/references/autonomy-boundary.md +48 -0
  100. package/skills/ultra-think/references/interaction-boundary.md +18 -33
  101. package/.ultra-template/docs/research/README.md +0 -55
  102. package/.ultra-template/reports/templates/delivery-report.json +0 -17
  103. package/.ultra-template/reports/templates/test-report.json +0 -18
  104. package/.ultra-template/tasks/tasks.json +0 -15
  105. package/.ultra-template/templates/task-context.md +0 -19
  106. package/adapters/_shared/codex-assets.cjs +0 -725
  107. package/adapters/_shared/codex-ultra-tools-entry.cjs +0 -11
  108. package/adapters/_shared/interaction-contract.cjs +0 -129
  109. package/adapters/_shared/path-rewrite.cjs +0 -79
  110. package/adapters/_shared/runtime-native.cjs +0 -132
  111. package/adapters/_shared/settings-merge.cjs +0 -76
  112. package/agents/code-reviewer.md +0 -42
  113. package/agents/debugger.md +0 -40
  114. package/agents/review-code.md +0 -49
  115. package/agents/review-comments.md +0 -38
  116. package/agents/review-coordinator.md +0 -56
  117. package/agents/review-design.md +0 -40
  118. package/agents/review-errors.md +0 -43
  119. package/agents/review-spec.md +0 -39
  120. package/agents/review-tests.md +0 -40
  121. package/agents/tdd-runner.md +0 -38
  122. package/bin/orchestrator.js +0 -383
  123. package/commands/ultra-change.md +0 -10
  124. package/commands/ultra-deliver.md +0 -10
  125. package/commands/ultra-dev.md +0 -10
  126. package/commands/ultra-doctor.md +0 -10
  127. package/commands/ultra-init.md +0 -10
  128. package/commands/ultra-plan.md +0 -10
  129. package/commands/ultra-research.md +0 -10
  130. package/commands/ultra-review.md +0 -10
  131. package/commands/ultra-status.md +0 -10
  132. package/commands/ultra-test.md +0 -10
  133. package/commands/ultra-think.md +0 -10
  134. package/docs/AGENT-CONTEXT.md +0 -191
  135. package/docs/COMMIT-HASH-BACKFILL.md +0 -51
  136. package/docs/LEGACY-CLI-CROSSWALK.md +0 -175
  137. package/docs/ROADMAP.md +0 -101
  138. package/docs/STATE-DB-ACCESS-POLICY.md +0 -161
  139. package/hooks/active_task_context.py +0 -152
  140. package/hooks/context_envelope.py +0 -100
  141. package/hooks/health_check.py +0 -196
  142. package/hooks/pre_stop_check.py +0 -66
  143. package/hooks/runtime_paths.py +0 -396
  144. package/hooks/subagent_tracker.py +0 -88
  145. package/hooks/workflow_checkpoint.py +0 -76
  146. package/hooks/workflow_context.py +0 -48
  147. package/hooks/workflow_resume.py +0 -84
  148. package/mcp-server/hook-context.cjs +0 -38
  149. package/mcp-server/hook-event.cjs +0 -34
  150. package/mcp-server/lib/archive-journal.cjs +0 -1119
  151. package/mcp-server/lib/archive-mutation-worker.py +0 -365
  152. package/mcp-server/lib/artifact-registry.cjs +0 -1232
  153. package/mcp-server/lib/baseline-workflow.cjs +0 -1193
  154. package/mcp-server/lib/canonical-json.cjs +0 -19
  155. package/mcp-server/lib/change-authority.cjs +0 -26
  156. package/mcp-server/lib/change-packet.cjs +0 -790
  157. package/mcp-server/lib/change-workflow.cjs +0 -65
  158. package/mcp-server/lib/context-envelope.cjs +0 -581
  159. package/mcp-server/lib/context-paths.cjs +0 -142
  160. package/mcp-server/lib/decision-records.cjs +0 -423
  161. package/mcp-server/lib/delivery-transaction.cjs +0 -471
  162. package/mcp-server/lib/doctor-backup-worker.cjs +0 -328
  163. package/mcp-server/lib/doctor.cjs +0 -627
  164. package/mcp-server/lib/git-bootstrap.cjs +0 -651
  165. package/mcp-server/lib/init-project.cjs +0 -1021
  166. package/mcp-server/lib/kernel-change-workflow.cjs +0 -2029
  167. package/mcp-server/lib/legacy-change-workflow.cjs +0 -3032
  168. package/mcp-server/lib/managed-file-write.cjs +0 -172
  169. package/mcp-server/lib/plan-checkpoint.cjs +0 -177
  170. package/mcp-server/lib/plan-publication-worker.cjs +0 -830
  171. package/mcp-server/lib/plan-store.cjs +0 -794
  172. package/mcp-server/lib/prd-parser.cjs +0 -83
  173. package/mcp-server/lib/pricing.cjs +0 -44
  174. package/mcp-server/lib/project-context.cjs +0 -178
  175. package/mcp-server/lib/projector.cjs +0 -386
  176. package/mcp-server/lib/provider-refs.cjs +0 -42
  177. package/mcp-server/lib/runtime-paths.cjs +0 -1714
  178. package/mcp-server/lib/runtime-state.cjs +0 -222
  179. package/mcp-server/lib/safe-project-file.cjs +0 -385
  180. package/mcp-server/lib/stage-checkpoints.cjs +0 -463
  181. package/mcp-server/lib/state-authority.cjs +0 -95
  182. package/mcp-server/lib/state-db.cjs +0 -1580
  183. package/mcp-server/lib/state-ops.cjs +0 -1428
  184. package/mcp-server/lib/task-contract.cjs +0 -404
  185. package/mcp-server/lib/task-expander.cjs +0 -105
  186. package/mcp-server/lib/task-ledger.cjs +0 -1964
  187. package/mcp-server/lib/telemetry.cjs +0 -85
  188. package/mcp-server/lib/topo.cjs +0 -131
  189. package/mcp-server/lib/ultra-facade.cjs +0 -2684
  190. package/mcp-server/lib/worker-packet.cjs +0 -358
  191. package/mcp-server/server.cjs +0 -437
  192. package/orchestrator/auto-merge.cjs +0 -128
  193. package/orchestrator/daemon.cjs +0 -264
  194. package/orchestrator/dispatch-rules.cjs +0 -78
  195. package/orchestrator/parallel-orchestrator.cjs +0 -903
  196. package/orchestrator/planner/plan-builder.cjs +0 -125
  197. package/orchestrator/recovery.cjs +0 -188
  198. package/orchestrator/session-close-journal-worker.cjs +0 -5
  199. package/orchestrator/session-close-journal.cjs +0 -1014
  200. package/orchestrator/session-runner.cjs +0 -1153
  201. package/orchestrator/worktree-manager.cjs +0 -282
  202. package/settings.json +0 -7
  203. package/skills/cc-collab/SKILL.md +0 -42
  204. package/skills/code-review-expert/SKILL.md +0 -43
  205. package/skills/code-review-expert/references/correctness-reliability.md +0 -30
  206. package/skills/code-review-expert/references/design-boundaries.md +0 -26
  207. package/skills/code-review-expert/references/removal-plan.md +0 -24
  208. package/skills/codex-collab/SKILL.md +0 -49
  209. package/skills/codex-collab/evals/evals.json +0 -35
  210. package/skills/integration-rules/SKILL.md +0 -32
  211. package/skills/security-rules/SKILL.md +0 -38
  212. package/skills/testing-rules/SKILL.md +0 -32
  213. package/skills/ultra-doctor/SKILL.md +0 -41
  214. package/skills/ultra-plan/references/semantic-preflight.md +0 -20
  215. package/skills/ultra-verify/SKILL.md +0 -46
  216. package/skills/ultra-verify/evals/evals.json +0 -46
  217. package/skills/ultra-verify/references/cross-verify-modes.md +0 -28
  218. package/skills/ultra-verify/references/evidence-status.md +0 -21
  219. package/skills/ultra-verify/scripts/verify_wait.py +0 -94
  220. package/spec/cli-protocol.md +0 -102
  221. package/spec/mcp-tools.yaml +0 -312
  222. package/spec/schemas/baseline-reconciliation.v1.schema.json +0 -73
  223. package/spec/schemas/change-delta.v1.schema.json +0 -153
  224. package/spec/schemas/command-manifest.schema.json +0 -29
  225. package/spec/schemas/context-file.v4.5.schema.json +0 -54
  226. package/spec/schemas/delivery-report.v1.schema.json +0 -66
  227. package/spec/schemas/documentation-reconciliation.v1.schema.json +0 -106
  228. package/spec/schemas/mcp-tools.schema.json +0 -136
  229. package/spec/schemas/skill-manifest.schema.json +0 -24
  230. package/spec/schemas/state-db.sql +0 -641
  231. package/spec/schemas/task-ledger.v2.schema.json +0 -296
  232. package/spec/schemas/tasks.v4.5.schema.json +0 -96
  233. package/spec/schemas/test-report.v1.schema.json +0 -225
  234. package/ultra-tools/cli.cjs +0 -129
  235. package/ultra-tools/commands/db.cjs +0 -226
  236. package/ultra-tools/commands/legacy-memory.cjs +0 -159
  237. package/ultra-tools/commands/migrate.cjs +0 -1386
  238. package/ultra-tools/commands/session.cjs +0 -213
  239. package/ultra-tools/commands/status.cjs +0 -559
  240. package/ultra-tools/commands/system.cjs +0 -498
  241. package/ultra-tools/commands/task.cjs +0 -105
@@ -1,641 +0,0 @@
1
- -- Ultra Builder Pro — authoritative state schema
2
- -- This file builds .ultra/.runtime/state.db, the source of truth for all
3
- -- baseline / change / task / session / event / telemetry data. The Git-facing
4
- -- tasks.json is a durable team checkpoint; live task and Context views under
5
- -- .ultra/.runtime/projections are generated projections.
6
- --
7
- -- Authority boundary: docs/DECISIONS.md.
8
- --
9
- -- PRAGMAs are applied by mcp-server/lib/state-db.ts on connection open;
10
- -- they cannot be persisted in CREATE statements but are documented here.
11
- -- PRAGMA journal_mode=WAL; -- multi-reader / single-writer (R21)
12
- -- PRAGMA synchronous=NORMAL; -- WAL durability vs perf
13
- -- PRAGMA busy_timeout=5000; -- block up to 5s on lock (R25)
14
- -- PRAGMA foreign_keys=ON; -- enforce FK constraints
15
-
16
- -- ──────────────────────────── project baseline ─────────────────────────────
17
- -- The baseline is the approved, repository-scoped snapshot that every change
18
- -- is measured against. It stores digests and evidence references, never source,
19
- -- prompt, transcript, general memory-provider, or code-graph payloads.
20
- CREATE TABLE IF NOT EXISTS baselines (
21
- id TEXT PRIMARY KEY,
22
- project_name TEXT NOT NULL,
23
- project_type TEXT,
24
- stack TEXT,
25
- mode TEXT NOT NULL CHECK (mode IN ('greenfield', 'brownfield', 'migrated')),
26
- status TEXT NOT NULL DEFAULT 'draft'
27
- CHECK (status IN ('draft', 'adopting', 'blocked', 'ready', 'superseded')),
28
- repository_root TEXT NOT NULL DEFAULT '.',
29
- scope_json TEXT NOT NULL DEFAULT '["."]',
30
- repository_revision TEXT,
31
- repository_branch TEXT,
32
- worktree_state TEXT NOT NULL DEFAULT 'unavailable'
33
- CHECK (worktree_state IN ('clean', 'dirty', 'unborn', 'unavailable')),
34
- worktree_digest TEXT,
35
- worktree_files_json TEXT NOT NULL DEFAULT '[]',
36
- worktree_accepted INTEGER NOT NULL DEFAULT 0 CHECK (worktree_accepted IN (0, 1)),
37
- known_red_accepted INTEGER NOT NULL DEFAULT 0 CHECK (known_red_accepted IN (0, 1)),
38
- spec_refs_json TEXT NOT NULL DEFAULT '[]',
39
- evidence_json TEXT NOT NULL DEFAULT '[]',
40
- verification_json TEXT NOT NULL DEFAULT '[]',
41
- unknowns_json TEXT NOT NULL DEFAULT '[]',
42
- gaps_json TEXT NOT NULL DEFAULT '[]',
43
- classification_json TEXT NOT NULL DEFAULT '{}',
44
- provider_refs_json TEXT NOT NULL DEFAULT '{}',
45
- research_run_id TEXT,
46
- research_checkpoint_id TEXT,
47
- approved_by TEXT,
48
- approval_note TEXT,
49
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
50
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
51
- converged_at TEXT
52
- );
53
-
54
- CREATE INDEX IF NOT EXISTS baselines_status ON baselines(status, updated_at);
55
-
56
- -- ──────────────────────────── changes ─────────────────────────────────────
57
- -- A project baseline is continuous; each feature, fix, incident, or redesign
58
- -- is an independently converged change unit. Only changes become terminal.
59
- CREATE TABLE IF NOT EXISTS changes (
60
- id TEXT PRIMARY KEY,
61
- title TEXT NOT NULL,
62
- kind TEXT NOT NULL CHECK (length(trim(kind)) BETWEEN 1 AND 80),
63
- status TEXT NOT NULL DEFAULT 'active'
64
- CHECK (status IN ('active', 'blocked', 'ready', 'archived', 'cancelled')),
65
- intent TEXT NOT NULL,
66
- docs_impact_json TEXT NOT NULL DEFAULT '{"status":"unknown","files":[],"rationale":null}',
67
- provider_refs_json TEXT NOT NULL DEFAULT '{}',
68
- baseline_bypass_json TEXT,
69
- contract_json TEXT NOT NULL DEFAULT '{}',
70
- classification_json TEXT NOT NULL DEFAULT '{}',
71
- research_disposition_json TEXT NOT NULL DEFAULT '{}',
72
- alignment_thread_id TEXT REFERENCES decision_threads(id) ON DELETE SET NULL,
73
- base_commit TEXT,
74
- supersedes_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
75
- artifact_root TEXT NOT NULL,
76
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
77
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
78
- closed_at TEXT
79
- );
80
-
81
- CREATE INDEX IF NOT EXISTS changes_status ON changes(status, created_at);
82
- CREATE INDEX IF NOT EXISTS changes_kind ON changes(kind, created_at);
83
-
84
- -- ──────────────────────────── tasks ───────────────────────────────────────
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.
88
- CREATE TABLE IF NOT EXISTS tasks (
89
- id TEXT PRIMARY KEY,
90
- title TEXT NOT NULL,
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),
93
- complexity INTEGER CHECK (complexity BETWEEN 1 AND 10),
94
- estimated_days REAL CHECK (estimated_days IS NULL OR estimated_days > 0),
95
- status TEXT NOT NULL DEFAULT 'pending'
96
- CHECK (status IN ('pending', 'in_progress', 'completed', 'blocked', 'expanded')),
97
- deps TEXT, -- JSON array of task ids
98
- files_modified TEXT, -- JSON array of paths (Phase 8B conflict detection)
99
- session_id TEXT, -- current owning session (Phase 4.5)
100
- stale INTEGER NOT NULL DEFAULT 0 CHECK (stale IN (0, 1)),
101
- tag TEXT, -- git branch tag (Phase 7.2)
102
- trace_to TEXT, -- spec anchor reference
103
- outcome TEXT, -- observable result owned by this task
104
- slice_kind TEXT CHECK (slice_kind IS NULL OR length(trim(slice_kind)) BETWEEN 1 AND 80),
105
- public_seam TEXT, -- externally observable seam exercised by the slice
106
- verification_command TEXT, -- exact task-level verification command
107
- acceptance_json TEXT NOT NULL DEFAULT '[]',
108
- context_refs_json TEXT NOT NULL DEFAULT '[]',
109
- docs_impact_json TEXT NOT NULL DEFAULT '{"status":"unknown","files":[],"rationale":null}',
110
- ownership_json TEXT NOT NULL DEFAULT '{}',
111
- context_file TEXT, -- projection target path
112
- completion_commit TEXT, -- checkout-local integrated commit evidence
113
- change_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
114
- parent_id TEXT REFERENCES tasks(id) ON DELETE SET NULL, -- Phase 8A.1: task.expand subtask→parent
115
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
116
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
117
- );
118
-
119
- CREATE INDEX IF NOT EXISTS tasks_status ON tasks(status);
120
- CREATE INDEX IF NOT EXISTS tasks_tag ON tasks(tag);
121
- CREATE INDEX IF NOT EXISTS tasks_session ON tasks(session_id) WHERE session_id IS NOT NULL;
122
- CREATE INDEX IF NOT EXISTS tasks_stale ON tasks(stale) WHERE stale = 1;
123
- CREATE INDEX IF NOT EXISTS tasks_parent ON tasks(parent_id) WHERE parent_id IS NOT NULL;
124
- CREATE INDEX IF NOT EXISTS tasks_change ON tasks(change_id) WHERE change_id IS NOT NULL;
125
-
126
- -- ──────────────────────────── events ──────────────────────────────────────
127
- -- Append-only event stream. id is the subscription cursor (D31, R26):
128
- -- subscribers pull `id > since_id` to avoid same-ms event loss that
129
- -- max(ts) would suffer.
130
- CREATE TABLE IF NOT EXISTS events (
131
- id INTEGER PRIMARY KEY AUTOINCREMENT,
132
- ts TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
133
- type TEXT NOT NULL,
134
- task_id TEXT,
135
- change_id TEXT,
136
- session_id TEXT,
137
- runtime TEXT CHECK (runtime IS NULL OR runtime IN ('claude', 'opencode', 'codex', 'kimi', 'grok')),
138
- payload_json TEXT
139
- );
140
-
141
- CREATE INDEX IF NOT EXISTS events_ts_type ON events(ts, type);
142
- CREATE INDEX IF NOT EXISTS events_task ON events(task_id, id);
143
- CREATE INDEX IF NOT EXISTS events_session ON events(session_id, id);
144
- CREATE INDEX IF NOT EXISTS events_change ON events(change_id, id);
145
-
146
- -- ──────────────────────────── sessions ────────────────────────────────────
147
- -- Authoritative session row. lease_expires_at + heartbeat_at live ONLY here
148
- -- (D32, R29) — no lease.json file. Worktree + artifact_dir are filesystem
149
- -- paths owned by the session.
150
- CREATE TABLE IF NOT EXISTS sessions (
151
- sid TEXT PRIMARY KEY,
152
- task_id TEXT NOT NULL REFERENCES tasks(id),
153
- runtime TEXT NOT NULL CHECK (runtime IN ('claude', 'opencode', 'codex', 'kimi', 'grok')),
154
- pid INTEGER,
155
- worktree_path TEXT NOT NULL,
156
- artifact_dir TEXT NOT NULL,
157
- status TEXT NOT NULL DEFAULT 'running'
158
- CHECK (status IN ('running', 'completed', 'crashed', 'orphan')),
159
- lease_expires_at TEXT NOT NULL,
160
- heartbeat_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
161
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
162
- );
163
-
164
- CREATE INDEX IF NOT EXISTS sessions_active ON sessions(status, task_id);
165
- CREATE INDEX IF NOT EXISTS sessions_lease ON sessions(lease_expires_at) WHERE status = 'running';
166
- CREATE UNIQUE INDEX IF NOT EXISTS sessions_one_active_task
167
- ON sessions(task_id) WHERE status = 'running';
168
-
169
- -- ──────────────────────────── schema_version ──────────────────────────────
170
- -- Cross-version misread guard (D30, R27). Single row per applied version.
171
- CREATE TABLE IF NOT EXISTS schema_version (
172
- version TEXT PRIMARY KEY,
173
- applied_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
174
- description TEXT
175
- );
176
-
177
- -- ──────────────────────────── migration_history ───────────────────────────
178
- -- Audit trail for every migration attempt (D30, R27).
179
- CREATE TABLE IF NOT EXISTS migration_history (
180
- id INTEGER PRIMARY KEY AUTOINCREMENT,
181
- from_version TEXT NOT NULL,
182
- to_version TEXT NOT NULL,
183
- direction TEXT NOT NULL CHECK (direction IN ('forward', 'rollback')),
184
- ts TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
185
- status TEXT NOT NULL CHECK (status IN ('success', 'failed', 'dry_run')),
186
- notes TEXT
187
- );
188
-
189
- CREATE INDEX IF NOT EXISTS migration_history_ts ON migration_history(ts);
190
-
191
- -- ──────────────────────────── telemetry ───────────────────────────────────
192
- -- Token / cost / tool-call counters per session.
193
- CREATE TABLE IF NOT EXISTS telemetry (
194
- id INTEGER PRIMARY KEY AUTOINCREMENT,
195
- session_id TEXT REFERENCES sessions(sid),
196
- event_type TEXT NOT NULL CHECK (event_type IN ('tool_call', 'token_usage', 'cost')),
197
- tokens_input INTEGER,
198
- tokens_output INTEGER,
199
- tool_name TEXT,
200
- cost_usd REAL,
201
- ts TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
202
- );
203
-
204
- CREATE INDEX IF NOT EXISTS telemetry_session ON telemetry(session_id, ts);
205
- CREATE INDEX IF NOT EXISTS telemetry_type ON telemetry(event_type, ts);
206
-
207
- -- ──────────────────────────── specs_refs ──────────────────────────────────
208
- -- Spec change tracking. Phase 5.3 staleness propagation reads this.
209
- CREATE TABLE IF NOT EXISTS specs_refs (
210
- spec_file TEXT NOT NULL,
211
- section TEXT NOT NULL,
212
- anchor TEXT,
213
- last_modified_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
214
- PRIMARY KEY (spec_file, section)
215
- );
216
-
217
- -- ──────────────────────────── circuit_breaker ─────────────────────────────
218
- -- Per-task failure accumulator (Phase 5.2). When failure_count crosses the
219
- -- threshold, tripped_at is stamped and `task_circuit_broken` fires. Admission
220
- -- control refuses new spawns for tripped tasks until manually reset.
221
- CREATE TABLE IF NOT EXISTS circuit_breaker (
222
- task_id TEXT PRIMARY KEY REFERENCES tasks(id) ON DELETE CASCADE,
223
- failure_count INTEGER NOT NULL DEFAULT 0,
224
- tripped_at TEXT,
225
- last_failure_at TEXT,
226
- last_failure_reason TEXT
227
- );
228
-
229
- CREATE INDEX IF NOT EXISTS circuit_breaker_tripped ON circuit_breaker(tripped_at)
230
- WHERE tripped_at IS NOT NULL;
231
-
232
- -- ──────────────────────────── change artifacts ────────────────────────────
233
- CREATE TABLE IF NOT EXISTS artifacts (
234
- id TEXT PRIMARY KEY,
235
- owner_type TEXT NOT NULL
236
- CHECK (owner_type IN ('project', 'baseline', 'change', 'task', 'workflow')),
237
- owner_id TEXT NOT NULL,
238
- change_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
239
- task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
240
- kind TEXT NOT NULL,
241
- path TEXT NOT NULL,
242
- digest TEXT,
243
- content_hash TEXT,
244
- before_digest TEXT,
245
- after_digest TEXT,
246
- provenance_json TEXT NOT NULL DEFAULT '{}',
247
- metadata_json TEXT,
248
- managed INTEGER NOT NULL DEFAULT 0 CHECK (managed IN (0, 1)),
249
- status TEXT NOT NULL DEFAULT 'current'
250
- CHECK (status IN ('current', 'stale', 'terminal', 'archived')),
251
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
252
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
253
- UNIQUE(owner_type, owner_id, kind, path)
254
- );
255
-
256
- CREATE INDEX IF NOT EXISTS artifacts_change ON artifacts(change_id, kind);
257
- CREATE INDEX IF NOT EXISTS artifacts_owner ON artifacts(owner_type, owner_id, status);
258
- CREATE INDEX IF NOT EXISTS artifacts_path ON artifacts(path, status);
259
- CREATE UNIQUE INDEX IF NOT EXISTS artifacts_one_active_path
260
- ON artifacts(path) WHERE status <> 'archived';
261
-
262
- CREATE TABLE IF NOT EXISTS artifact_edges (
263
- id INTEGER PRIMARY KEY AUTOINCREMENT,
264
- source_type TEXT NOT NULL
265
- CHECK (source_type IN ('artifact', 'project', 'baseline', 'change', 'task', 'workflow', 'external')),
266
- source_id TEXT NOT NULL,
267
- target_type TEXT NOT NULL
268
- CHECK (target_type IN ('artifact', 'project', 'baseline', 'change', 'task', 'workflow', 'external')),
269
- target_id TEXT NOT NULL,
270
- relation TEXT NOT NULL,
271
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
272
- UNIQUE(source_type, source_id, target_type, target_id, relation)
273
- );
274
-
275
- CREATE INDEX IF NOT EXISTS artifact_edges_source
276
- ON artifact_edges(source_type, source_id);
277
- CREATE INDEX IF NOT EXISTS artifact_edges_target
278
- ON artifact_edges(target_type, target_id);
279
-
280
- CREATE TABLE IF NOT EXISTS context_snapshots (
281
- id TEXT PRIMARY KEY,
282
- change_id TEXT NOT NULL REFERENCES changes(id) ON DELETE CASCADE,
283
- task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
284
- git_head TEXT,
285
- provider_refs_json TEXT NOT NULL DEFAULT '{}',
286
- manifest_path TEXT NOT NULL,
287
- manifest_hash TEXT NOT NULL,
288
- role TEXT NOT NULL DEFAULT 'plan'
289
- CHECK (role IN ('plan', 'implement', 'check', 'review')),
290
- gate TEXT NOT NULL DEFAULT 'alignment'
291
- CHECK (gate IN ('alignment', 'planning', 'implementation', 'verification', 'review', 'convergence', 'recovery')),
292
- next_action TEXT NOT NULL DEFAULT '',
293
- allowed_transitions_json TEXT NOT NULL DEFAULT '[]',
294
- required_transition TEXT,
295
- readiness TEXT NOT NULL DEFAULT 'ready'
296
- CHECK (readiness IN ('ready', 'blocked')),
297
- blockers_json TEXT NOT NULL DEFAULT '[]',
298
- context_json TEXT NOT NULL DEFAULT '{}',
299
- token_estimate INTEGER NOT NULL DEFAULT 0 CHECK (token_estimate >= 0),
300
- token_budget INTEGER NOT NULL DEFAULT 12000 CHECK (token_budget > 0),
301
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
302
- );
303
-
304
- CREATE INDEX IF NOT EXISTS context_snapshots_change ON context_snapshots(change_id, created_at);
305
- CREATE INDEX IF NOT EXISTS context_snapshots_binding
306
- ON context_snapshots(change_id, task_id, role, gate, created_at);
307
-
308
- CREATE TABLE IF NOT EXISTS spec_learning_candidates (
309
- id TEXT PRIMARY KEY,
310
- change_id TEXT NOT NULL REFERENCES changes(id) ON DELETE CASCADE,
311
- task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
312
- target_ref TEXT NOT NULL,
313
- summary TEXT NOT NULL,
314
- evidence_json TEXT NOT NULL DEFAULT '[]',
315
- status TEXT NOT NULL DEFAULT 'proposed'
316
- CHECK (status IN ('proposed', 'approved', 'rejected', 'applied')),
317
- resolution TEXT,
318
- applied_ref TEXT,
319
- before_digest TEXT,
320
- after_digest TEXT,
321
- apply_evidence_json TEXT NOT NULL DEFAULT '[]',
322
- proposed_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
323
- resolved_at TEXT,
324
- applied_at TEXT
325
- );
326
-
327
- CREATE INDEX IF NOT EXISTS spec_learning_change
328
- ON spec_learning_candidates(change_id, status, proposed_at);
329
-
330
- CREATE TABLE IF NOT EXISTS trace_links (
331
- id INTEGER PRIMARY KEY AUTOINCREMENT,
332
- change_id TEXT NOT NULL REFERENCES changes(id) ON DELETE CASCADE,
333
- task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
334
- source_ref TEXT NOT NULL,
335
- target_ref TEXT NOT NULL,
336
- relation TEXT NOT NULL,
337
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
338
- UNIQUE(change_id, source_ref, target_ref, relation)
339
- );
340
-
341
- CREATE INDEX IF NOT EXISTS trace_links_change ON trace_links(change_id, task_id);
342
-
343
- -- ──────────────────────────── runtime reliability ─────────────────────────
344
- CREATE TABLE IF NOT EXISTS incidents (
345
- id TEXT PRIMARY KEY,
346
- code TEXT NOT NULL,
347
- severity TEXT NOT NULL CHECK (severity IN ('warning', 'error', 'critical')),
348
- status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'resolved')),
349
- retryable INTEGER NOT NULL DEFAULT 0 CHECK (retryable IN (0, 1)),
350
- message TEXT NOT NULL,
351
- change_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
352
- task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
353
- session_id TEXT REFERENCES sessions(sid) ON DELETE SET NULL,
354
- source_kind TEXT,
355
- source_id TEXT,
356
- evidence_json TEXT,
357
- occurrence_count INTEGER NOT NULL DEFAULT 1,
358
- first_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
359
- last_seen_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
360
- resolved_at TEXT,
361
- resolution TEXT
362
- );
363
-
364
- CREATE INDEX IF NOT EXISTS incidents_open ON incidents(status, severity, last_seen_at);
365
- CREATE INDEX IF NOT EXISTS incidents_change ON incidents(change_id, status);
366
-
367
- CREATE TABLE IF NOT EXISTS projection_jobs (
368
- id INTEGER PRIMARY KEY AUTOINCREMENT,
369
- tool_name TEXT NOT NULL,
370
- event_cursor INTEGER NOT NULL DEFAULT 0,
371
- status TEXT NOT NULL DEFAULT 'pending'
372
- CHECK (status IN ('pending', 'running', 'completed', 'failed')),
373
- attempts INTEGER NOT NULL DEFAULT 0,
374
- max_attempts INTEGER NOT NULL DEFAULT 3 CHECK (max_attempts > 0),
375
- last_error TEXT,
376
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
377
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
378
- completed_at TEXT
379
- );
380
-
381
- CREATE INDEX IF NOT EXISTS projection_jobs_status ON projection_jobs(status, id);
382
-
383
- CREATE TABLE IF NOT EXISTS event_consumers (
384
- name TEXT PRIMARY KEY,
385
- cursor INTEGER NOT NULL DEFAULT 0 CHECK (cursor >= 0),
386
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
387
- );
388
-
389
- -- ──────────────────────────── workflow runs ───────────────────────────────
390
- -- Skills own judgment and artifact content. MCP owns durable transitions,
391
- -- evidence references, output digests, blockers, and recovery position.
392
- CREATE TABLE IF NOT EXISTS workflow_runs (
393
- id TEXT PRIMARY KEY,
394
- kind TEXT NOT NULL
395
- CHECK (kind IN ('init', 'research', 'plan', 'change', 'dev', 'test', 'review', 'deliver')),
396
- mode TEXT,
397
- subject TEXT NOT NULL,
398
- definition_version TEXT NOT NULL DEFAULT '1.0',
399
- status TEXT NOT NULL DEFAULT 'active'
400
- CHECK (status IN ('active', 'blocked', 'ready', 'completed', 'cancelled')),
401
- current_step TEXT,
402
- baseline_id TEXT REFERENCES baselines(id) ON DELETE SET NULL,
403
- change_id TEXT REFERENCES changes(id) ON DELETE SET NULL,
404
- task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
405
- metadata_json TEXT NOT NULL DEFAULT '{}',
406
- blockers_json TEXT NOT NULL DEFAULT '[]',
407
- approval_json TEXT,
408
- summary_json TEXT NOT NULL DEFAULT '{}',
409
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
410
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
411
- completed_at TEXT
412
- );
413
-
414
- CREATE INDEX IF NOT EXISTS workflow_runs_status
415
- ON workflow_runs(status, kind, updated_at);
416
- CREATE INDEX IF NOT EXISTS workflow_runs_baseline
417
- ON workflow_runs(baseline_id, kind, updated_at);
418
- CREATE INDEX IF NOT EXISTS workflow_runs_change
419
- ON workflow_runs(change_id, kind, updated_at);
420
- CREATE INDEX IF NOT EXISTS workflow_runs_task
421
- ON workflow_runs(task_id, kind, updated_at);
422
-
423
- CREATE TABLE IF NOT EXISTS workflow_steps (
424
- run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
425
- step_id TEXT NOT NULL,
426
- position INTEGER NOT NULL CHECK (position >= 0),
427
- title TEXT NOT NULL,
428
- required INTEGER NOT NULL DEFAULT 1 CHECK (required IN (0, 1)),
429
- status TEXT NOT NULL DEFAULT 'pending'
430
- CHECK (status IN ('pending', 'in_progress', 'completed', 'skipped', 'blocked')),
431
- evidence_json TEXT NOT NULL DEFAULT '[]',
432
- outputs_json TEXT NOT NULL DEFAULT '[]',
433
- decisions_json TEXT NOT NULL DEFAULT '[]',
434
- semantic_records_json TEXT NOT NULL DEFAULT '[]',
435
- blockers_json TEXT NOT NULL DEFAULT '[]',
436
- skip_reason TEXT,
437
- started_at TEXT,
438
- completed_at TEXT,
439
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
440
- PRIMARY KEY (run_id, step_id)
441
- );
442
-
443
- CREATE UNIQUE INDEX IF NOT EXISTS workflow_steps_position
444
- ON workflow_steps(run_id, position);
445
- CREATE INDEX IF NOT EXISTS workflow_steps_status
446
- ON workflow_steps(run_id, status, position);
447
-
448
- -- ──────────────────────────── decision dialogue ─────────────────────────
449
- -- The host owns reasoning, presentation, and normalized decision content. MCP
450
- -- owns the one-open-item invariant, pending recovery state, durable authority,
451
- -- checkpoints, and recovery. Raw prompts and transcripts never belong here.
452
- CREATE TABLE IF NOT EXISTS decision_threads (
453
- id TEXT PRIMARY KEY,
454
- purpose TEXT NOT NULL,
455
- mode TEXT NOT NULL DEFAULT 'guided'
456
- CHECK (mode IN ('guided', 'fast', 'autonomous', 'diagnostic')),
457
- status TEXT NOT NULL DEFAULT 'active'
458
- CHECK (status IN ('active', 'checkpoint_ready', 'completed', 'confirmed', 'cancelled')),
459
- baseline_id TEXT REFERENCES baselines(id) ON DELETE SET NULL,
460
- change_id TEXT REFERENCES changes(id) ON DELETE CASCADE,
461
- workflow_run_id TEXT REFERENCES workflow_runs(id) ON DELETE CASCADE,
462
- summary_json TEXT NOT NULL DEFAULT '{}',
463
- checkpoint_json TEXT NOT NULL DEFAULT '{}',
464
- started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
465
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
466
- completed_at TEXT,
467
- confirmed_at TEXT,
468
- CHECK (baseline_id IS NOT NULL OR change_id IS NOT NULL OR workflow_run_id IS NOT NULL)
469
- );
470
-
471
- CREATE INDEX IF NOT EXISTS decision_threads_status
472
- ON decision_threads(status, updated_at);
473
- CREATE INDEX IF NOT EXISTS decision_threads_authority
474
- ON decision_threads(baseline_id, change_id, workflow_run_id, status);
475
-
476
- CREATE TABLE IF NOT EXISTS decision_items (
477
- id TEXT PRIMARY KEY,
478
- thread_id TEXT NOT NULL REFERENCES decision_threads(id) ON DELETE CASCADE,
479
- sequence INTEGER NOT NULL CHECK (sequence > 0),
480
- phase TEXT NOT NULL,
481
- question TEXT NOT NULL,
482
- why_now TEXT NOT NULL,
483
- recommendation TEXT NOT NULL,
484
- options_json TEXT NOT NULL DEFAULT '[]',
485
- evidence_refs_json TEXT NOT NULL DEFAULT '[]',
486
- dependency_ids_json TEXT NOT NULL DEFAULT '[]',
487
- effects_json TEXT NOT NULL DEFAULT '{}',
488
- blocking INTEGER NOT NULL DEFAULT 1 CHECK (blocking IN (0, 1)),
489
- status TEXT NOT NULL DEFAULT 'open'
490
- CHECK (status IN ('open', 'answered', 'delegated', 'deferred', 'superseded')),
491
- resolution_json TEXT NOT NULL DEFAULT '{}',
492
- supersedes_id TEXT REFERENCES decision_items(id) ON DELETE SET NULL,
493
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
494
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
495
- resolved_at TEXT,
496
- UNIQUE (thread_id, sequence)
497
- );
498
-
499
- CREATE UNIQUE INDEX IF NOT EXISTS decision_items_one_open
500
- ON decision_items(thread_id) WHERE status = 'open';
501
- CREATE INDEX IF NOT EXISTS decision_items_status
502
- ON decision_items(thread_id, status, sequence);
503
-
504
- -- ──────────────────────────── public kernel checkpoints ─────────────────
505
- -- These rows record what the model actually checkpointed. They do not
506
- -- authorize a fixed workflow sequence. Drafts remain editable; an accepted
507
- -- revision is immutable and can only be superseded by a later revision.
508
- CREATE TABLE IF NOT EXISTS stage_checkpoints (
509
- id TEXT PRIMARY KEY,
510
- stage TEXT NOT NULL
511
- CHECK (stage IN ('init', 'research', 'change', 'plan', 'dev', 'test', 'review', 'deliver')),
512
- scope_type TEXT NOT NULL CHECK (scope_type IN ('project', 'baseline', 'change', 'task')),
513
- scope_id TEXT NOT NULL,
514
- revision INTEGER NOT NULL CHECK (revision > 0),
515
- status TEXT NOT NULL DEFAULT 'draft'
516
- CHECK (status IN ('draft', 'accepted', 'superseded')),
517
- payload_json TEXT NOT NULL DEFAULT '{}',
518
- evidence_json TEXT NOT NULL DEFAULT '[]',
519
- diagnostics_json TEXT NOT NULL DEFAULT '[]',
520
- context_envelope_id TEXT,
521
- digest TEXT NOT NULL,
522
- supersedes_id TEXT REFERENCES stage_checkpoints(id) ON DELETE SET NULL,
523
- idempotency_key TEXT NOT NULL UNIQUE,
524
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
525
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
526
- accepted_at TEXT,
527
- UNIQUE(stage, scope_type, scope_id, revision)
528
- );
529
-
530
- CREATE INDEX IF NOT EXISTS stage_checkpoints_scope
531
- ON stage_checkpoints(stage, scope_type, scope_id, revision);
532
- CREATE UNIQUE INDEX IF NOT EXISTS stage_checkpoints_one_draft
533
- ON stage_checkpoints(stage, scope_type, scope_id) WHERE status = 'draft';
534
- CREATE UNIQUE INDEX IF NOT EXISTS stage_checkpoints_one_accepted
535
- ON stage_checkpoints(stage, scope_type, scope_id) WHERE status = 'accepted';
536
-
537
- CREATE TABLE IF NOT EXISTS decision_records (
538
- id TEXT PRIMARY KEY,
539
- scope_type TEXT NOT NULL CHECK (scope_type IN ('baseline', 'change')),
540
- scope_id TEXT NOT NULL,
541
- question TEXT NOT NULL,
542
- recommendation TEXT NOT NULL,
543
- selection TEXT NOT NULL,
544
- effects_json TEXT NOT NULL DEFAULT '{}',
545
- non_goals_json TEXT NOT NULL DEFAULT '[]',
546
- owner TEXT NOT NULL,
547
- source TEXT NOT NULL,
548
- provenance_json TEXT NOT NULL DEFAULT '{}',
549
- applied_refs_json TEXT NOT NULL DEFAULT '[]',
550
- status TEXT NOT NULL DEFAULT 'accepted'
551
- CHECK (status IN ('accepted', 'superseded', 'cancelled')),
552
- digest TEXT NOT NULL,
553
- artifact_path TEXT NOT NULL,
554
- supersedes_id TEXT REFERENCES decision_records(id) ON DELETE SET NULL,
555
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
556
- updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
557
- );
558
-
559
- CREATE INDEX IF NOT EXISTS decision_records_scope
560
- ON decision_records(scope_type, scope_id, status, updated_at);
561
-
562
- CREATE TABLE IF NOT EXISTS context_envelopes (
563
- id TEXT PRIMARY KEY,
564
- stage TEXT NOT NULL,
565
- scope_type TEXT NOT NULL CHECK (scope_type IN ('project', 'baseline', 'change', 'task')),
566
- scope_id TEXT NOT NULL,
567
- digest TEXT NOT NULL UNIQUE,
568
- file_digest TEXT NOT NULL,
569
- payload_json TEXT NOT NULL,
570
- artifact_path TEXT,
571
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
572
- );
573
-
574
- CREATE INDEX IF NOT EXISTS context_envelopes_scope
575
- ON context_envelopes(stage, scope_type, scope_id, created_at);
576
-
577
- CREATE TABLE IF NOT EXISTS worker_packets (
578
- id TEXT PRIMARY KEY,
579
- role TEXT NOT NULL,
580
- scope_type TEXT NOT NULL CHECK (scope_type IN ('change', 'task')),
581
- scope_id TEXT NOT NULL,
582
- context_envelope_id TEXT NOT NULL REFERENCES context_envelopes(id),
583
- context_digest TEXT NOT NULL,
584
- task_digest TEXT,
585
- decision_digest TEXT,
586
- packet_digest TEXT NOT NULL UNIQUE,
587
- file_digest TEXT NOT NULL,
588
- status TEXT NOT NULL DEFAULT 'pending'
589
- CHECK (status IN ('pending', 'assigned', 'abandoned')),
590
- packet_path TEXT NOT NULL,
591
- output_path TEXT NOT NULL,
592
- assigned_at TEXT,
593
- abandoned_at TEXT,
594
- abandon_reason TEXT,
595
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
596
- );
597
-
598
- CREATE INDEX IF NOT EXISTS worker_packets_scope
599
- ON worker_packets(role, scope_type, scope_id, created_at);
600
-
601
- -- ──────────────────────────── seed: schema_version ────────────────────────
602
- INSERT OR IGNORE INTO schema_version (version, description)
603
- VALUES ('4.5', 'Phase 2 initial — tasks/events/sessions/schema_version/migration_history/telemetry/specs_refs');
604
- INSERT OR IGNORE INTO schema_version (version, description)
605
- VALUES ('5.2', 'Phase 5.2 — circuit_breaker table for per-task trip tracking');
606
- INSERT OR IGNORE INTO schema_version (version, description)
607
- VALUES ('8A.1', 'Phase 8A.1 — tasks.parent_id for task.expand parent→children');
608
- INSERT OR IGNORE INTO schema_version (version, description)
609
- VALUES ('8A.2', 'Phase 8A.2 — tasks.estimated_days preserved across MCP and v4.4 migration');
610
- INSERT OR IGNORE INTO schema_version (version, description)
611
- VALUES ('9.0', 'Continuous change units, context snapshots, trace links, incidents, projection outbox, and durable consumers');
612
- INSERT OR IGNORE INTO schema_version (version, description)
613
- VALUES ('9.1', 'Kimi runtime support in durable events and sessions');
614
- INSERT OR IGNORE INTO schema_version (version, description)
615
- VALUES ('10.0', 'Role-scoped context snapshots, deterministic breadcrumbs, and approval-gated specification learning');
616
- INSERT OR IGNORE INTO schema_version (version, description)
617
- VALUES ('11.0', 'Greenfield and brownfield baseline adoption, convergence, and drift authority');
618
- INSERT OR IGNORE INTO schema_version (version, description)
619
- VALUES ('12.0', 'Evidence-backed repository snapshots, gap ledger, safe re-adoption, and incident break-glass governance');
620
- INSERT OR IGNORE INTO schema_version (version, description)
621
- VALUES ('13.0', 'Durable cross-stage workflow runs, step evidence, output digests, blockers, and recovery');
622
- INSERT OR IGNORE INTO schema_version (version, description)
623
- VALUES ('14.0', 'Continuously revalidated baseline authority and persisted known-red acceptance');
624
- INSERT OR IGNORE INTO schema_version (version, description)
625
- VALUES ('15.0', 'Typed research semantics, complete change contracts, verified learning application, and reconciliation provenance');
626
- INSERT OR IGNORE INTO schema_version (version, description)
627
- VALUES ('16.0', 'Durable one-question decision dialogue, owner checkpoints, and workflow alignment gates');
628
- INSERT OR IGNORE INTO schema_version (version, description)
629
- VALUES ('17.0', 'Explicit unborn Git authority and owner-authorized baseline checkpoints');
630
- INSERT OR IGNORE INTO schema_version (version, description)
631
- VALUES ('18.0', 'Adaptive capability transitions, independent initialization, and recoverable workflow migration');
632
- INSERT OR IGNORE INTO schema_version (version, description)
633
- VALUES ('19.0', 'Non-ceremonial decision completion and host-neutral intent persistence');
634
- INSERT OR IGNORE INTO schema_version (version, description)
635
- VALUES ('20.0', 'Typed artifact registry, normalized dependency edges, and orphan diagnostics');
636
- INSERT OR IGNORE INTO schema_version (version, description)
637
- VALUES ('21.0', 'Seven-tool persistence kernel, reversible stage checkpoints, canonical context envelopes, normalized decisions, and worker packets');
638
- INSERT OR IGNORE INTO schema_version (version, description)
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');