ultra-builder-pro-cli 0.8.1 → 0.10.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 (61) hide show
  1. package/CHANGELOG.md +79 -1
  2. package/README.md +45 -26
  3. package/adapters/_shared/codex-assets.cjs +38 -0
  4. package/adapters/_shared/handbook.cjs +10 -1
  5. package/adapters/_shared/path-rewrite.cjs +3 -0
  6. package/adapters/_shared/runtime-assets.cjs +3 -1
  7. package/adapters/_shared/tests/handbook.test.cjs +9 -1
  8. package/adapters/_shared/tests/path-rewrite.test.cjs +3 -1
  9. package/adapters/_shared/tests/runtime-assets.test.cjs +5 -1
  10. package/adapters/kimi.js +642 -0
  11. package/adapters/opencode.js +46 -17
  12. package/adapters/tests/claude.test.cjs +4 -1
  13. package/adapters/tests/codex.test.cjs +4 -3
  14. package/adapters/tests/kimi-hook.test.cjs +122 -0
  15. package/adapters/tests/kimi.test.cjs +259 -0
  16. package/adapters/tests/opencode.test.cjs +46 -3
  17. package/bin/handbook.js +2 -2
  18. package/bin/install.js +9 -4
  19. package/bin/orchestrator.js +1 -1
  20. package/docs/AGENT-CONTEXT.md +39 -15
  21. package/docs/ARCHITECTURE.md +35 -9
  22. package/docs/PLAN.zh-CN.md +5 -4
  23. package/docs/ROADMAP.md +8 -7
  24. package/docs/RUNTIME-COMPAT-MATRIX.md +110 -64
  25. package/docs/USER-HANDBOOK-CONTRACT.md +13 -3
  26. package/hooks/README.md +6 -4
  27. package/hooks/active_task_context.py +14 -0
  28. package/hooks/adapters/kimi.py +162 -0
  29. package/hooks/context_spine.py +218 -0
  30. package/hooks/health_check.py +1 -1
  31. package/hooks/workflow_context.py +16 -123
  32. package/hooks/workflow_resume.py +21 -0
  33. package/mcp-server/lib/change-workflow.cjs +89 -11
  34. package/mcp-server/lib/change-workflow.test.cjs +202 -7
  35. package/mcp-server/lib/context-spine.cjs +331 -0
  36. package/mcp-server/lib/context-spine.test.cjs +73 -0
  37. package/mcp-server/lib/spec-learning.cjs +191 -0
  38. package/mcp-server/lib/spec-learning.test.cjs +62 -0
  39. package/mcp-server/lib/state-db.cjs +149 -4
  40. package/mcp-server/lib/state-db.test.cjs +61 -0
  41. package/mcp-server/server.cjs +31 -1
  42. package/mcp-server/tests/db-ops.test.cjs +3 -3
  43. package/mcp-server/tests/init-project.test.cjs +2 -2
  44. package/mcp-server/tests/server-contract.test.cjs +74 -0
  45. package/mcp-server/tests/state-db.test.cjs +20 -3
  46. package/package.json +4 -2
  47. package/skills/learn/SKILL.md +1 -0
  48. package/skills/ultra-change/SKILL.md +91 -118
  49. package/skills/ultra-deliver/SKILL.md +93 -221
  50. package/skills/ultra-dev/SKILL.md +81 -310
  51. package/skills/ultra-doctor/SKILL.md +1 -0
  52. package/skills/ultra-init/SKILL.md +1 -0
  53. package/skills/ultra-plan/SKILL.md +72 -292
  54. package/skills/ultra-review/SKILL.md +79 -407
  55. package/skills/ultra-status/SKILL.md +55 -168
  56. package/skills/ultra-test/SKILL.md +64 -183
  57. package/skills/ultra-think/SKILL.md +1 -0
  58. package/spec/cli-protocol.md +3 -0
  59. package/spec/mcp-tools.yaml +136 -7
  60. package/spec/schemas/skill-manifest.schema.json +2 -2
  61. package/spec/schemas/state-db.sql +35 -2
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: ultra-change
3
- description: "Start or resume a continuous post-delivery change, compile bounded context, declare documentation impact, and route the change through implementation and convergence."
3
+ description: "Open or resume a continuous change, capture its delta and decisions, compile bounded role context, and route one executable slice."
4
+ user-invocable: true
4
5
  runtime: all
5
6
  mcp_tools_required:
6
7
  - change.create
@@ -8,142 +9,114 @@ mcp_tools_required:
8
9
  - change.get
9
10
  - change.list
10
11
  - change.context
12
+ - change.breadcrumb
13
+ - change.learning_propose
14
+ - change.learning_resolve
11
15
  - task.create
12
16
  - task.list
13
17
  ---
14
18
 
15
- # ultra-change — Continuous Change Entry
19
+ # ultra-change — Delta Entry and Alignment Gate
16
20
 
17
- Use this workflow for daily fixes, small features, redesigns, and incidents after
18
- the initial `init → research → plan → dev → test → deliver` baseline exists.
19
- Each piece of work becomes one durable change unit instead of an informal edit
20
- that drifts away from specifications and verification evidence.
21
+ Use this after the first baseline delivery for fixes, small features, redesigns,
22
+ incidents, and maintenance. It keeps specifications live through a delta → implement
23
+ → learn → converge loop.
21
24
 
22
- ## Authority and provider boundary
25
+ ## Authority boundary
23
26
 
24
- - `.ultra/state.db` is authoritative for the change, its tasks, events, incidents,
25
- context snapshots, and projection status.
26
- - `.ultra/changes/active/<change-id>/` contains inspectable artifacts, not a
27
- second state authority.
28
- - Memory and code graph are external providers. Pass only metadata references:
29
- `provider`, `project`, `reference`, `revision`, `indexed_head`, and `status`.
30
- - Never paste recalled memories, graph nodes, embeddings, summaries, or provider
31
- payloads into `provider_refs`. If provider data is unavailable, record
32
- `status: unavailable` and continue with current-checkout evidence.
33
- - If any required change/task MCP operation is unavailable, stop. Do not edit
34
- `state.db`, `tasks.json`, or context projections directly.
27
+ All change and task lifecycle writes use the live MCP tools. Do not write raw SQLite
28
+ or mutate generated task/context projections. Provider payloads stay in their owning
29
+ memory or graph system; Ultra stores metadata references only.
35
30
 
36
- ## Arguments
31
+ ## 1. Establish the change
37
32
 
38
- - `$1`: existing change id, or a short title for a new change.
39
- - Optional flags/concepts: `quick`, `standard`, `major`, `incident` and an
40
- explicit documentation impact.
33
+ Call `change.list` and `change.breadcrumb` first.
41
34
 
42
- ## 1. Resume before creating
35
+ - Resume the single matching active/blocked change.
36
+ - If several may match, require an explicit id.
37
+ - Otherwise auto-discover repository facts, then ask only the highest-value unresolved
38
+ question. Do not ask the user for branch, stack, paths, or behavior already visible.
43
39
 
44
- Call `change.list` for `active` and `blocked` changes. If `$1` matches an
45
- existing id, call `change.get` and resume it. If the request clearly belongs to
46
- an active change, show the match and continue there rather than creating a
47
- duplicate.
40
+ Capture:
48
41
 
49
- Do not resume `ready`, `archived`, or `cancelled` work as a new mutation. Create
50
- a follow-up change that links to the prior archive in its intent.
42
+ - observable problem or requested outcome;
43
+ - acceptance and explicit non-goals;
44
+ - affected public seam or integration boundary;
45
+ - documentation impact: `required` paths, `none` with rationale, or blocking `unknown`;
46
+ - kind: `quick`, `standard`, `major`, or `incident`;
47
+ - decision inventory: accepted decisions, rejected alternatives, and unresolved choices.
51
48
 
52
- ## 2. Classify the change
49
+ Create with `change.create` using a stable kebab-case id. Update an existing packet
50
+ with `change.update`; never create a parallel packet for the same outcome.
53
51
 
54
- Choose the smallest honest kind:
52
+ ## 2. Write only the delta
55
53
 
56
- | Kind | Use when | Required convergence evidence |
57
- |---|---|---|
58
- | `quick` | localized fix or tiny behavior change | diff, tests, spec |
59
- | `standard` | normal feature or cross-file change | diff, tests, spec, docs, review |
60
- | `major` | architecture, public contract, migration, or broad redesign | diff, tests, spec, docs, review |
61
- | `incident` | canonical debug lane for a production/runtime failure | diagnosis, diff, tests |
54
+ The bounded packet is:
62
55
 
63
- When uncertain between two kinds, choose the higher-risk kind. Classification
64
- changes the proof required; it must not be used to bypass evidence.
65
-
66
- ## 3. Declare intent and documentation impact
67
-
68
- Before implementation, write a concise intent with:
69
-
70
- - observed problem or requested outcome;
71
- - acceptance behavior and non-goals;
72
- - affected contract/surface;
73
- - recovery or rollback concern when material.
74
-
75
- Documentation impact is mandatory:
56
+ ```text
57
+ .ultra/changes/active/<change-id>/
58
+ intent.md
59
+ delta/ # standard and major
60
+ plan.md # standard and major
61
+ diagnosis.md # incident
62
+ context-manifest.json # MCP projection
63
+ spec-learning.json # MCP projection
64
+ verification.md # convergence projection
65
+ ```
76
66
 
77
- - `required`: list every baseline document expected to change;
78
- - `none`: provide a concrete rationale;
79
- - `unknown`: allowed only while investigating and blocks convergence.
67
+ `intent.md` records outcome, acceptance, non-goals, docs impact, and decisions.
68
+ Delta files describe only differences from the baseline. An incident diagnosis must
69
+ record symptom, earliest bad state, root-cause hypothesis, discriminating evidence,
70
+ and recovery boundary.
71
+
72
+ ## 3. Create an executable slice
73
+
74
+ Prefer the smallest vertical `tracer_bullet` that crosses a live public seam. Split
75
+ only when ownership or verification is genuinely independent. Each task must declare:
76
+
77
+ - one observable outcome and linked `change_id`;
78
+ - bounded files/contracts and dependencies;
79
+ - `public_seam` that proves reachability;
80
+ - exact `verification_command`;
81
+ - expected red signal for a bug/incident;
82
+ - documentation impact.
83
+
84
+ Persist tasks with `task.create`. Generated `tasks.json` is never an input authority.
85
+
86
+ ## 4. Compile Context Manifest v2
87
+
88
+ Call `change.context` for the next task with:
89
+
90
+ ```json
91
+ {
92
+ "id": "<change-id>",
93
+ "task_id": "<task-id>",
94
+ "role": "plan",
95
+ "gate": "planning",
96
+ "context_refs": [{"ref":"<path>","kind":"spec","reason":"defines acceptance","required":true}],
97
+ "budget": {"max_tokens":12000,"max_files":12},
98
+ "execution_contract": {
99
+ "slice_kind":"tracer_bullet",
100
+ "public_seam":"<reachable boundary>",
101
+ "verification_command":"<exact command>",
102
+ "context_budget_percent":40
103
+ }
104
+ }
105
+ ```
80
106
 
81
- Create the change with `change.create`. Use a stable kebab-case id. External
82
- provider references are optional and metadata-only.
107
+ Include only files needed for the current role and gate. Missing required references,
108
+ digest drift, file-count overflow, or a fresh-context budget over 40% blocks readiness.
109
+ Use `expand_contract` only for an explicitly approved wider slice.
83
110
 
84
- ## 4. Build the delta packet
111
+ ## 5. Handle discoveries without silent spec drift
85
112
 
86
- The change directory is the bounded execution packet:
113
+ When implementation reveals a stable requirement, invariant, or public behavior not
114
+ in the baseline, call `change.learning_propose` with evidence and target document.
115
+ It is a candidate, not an automatic edit. A human/primary-agent decision must approve
116
+ or reject it; approved learning is marked applied only after the baseline was updated.
87
117
 
88
- ```text
89
- .ultra/changes/active/<change-id>/
90
- intent.md
91
- context-manifest.json
92
- delta/ # required for standard and major
93
- plan.md # required for standard and major
94
- diagnosis.md # created and structurally required for incident
95
- verification.md # generated by convergence
96
- ```
118
+ ## Exit contract
97
119
 
98
- For `standard` and `major`, write delta documents under `delta/` describing
99
- what changes relative to the current baseline. Do not copy the whole baseline.
100
- Write `plan.md` with live entry points, files/contracts, tests, documentation,
101
- and rollback. For `quick`, add only artifacts needed to make the decision and
102
- evidence inspectable. For `incident`, complete the generated `diagnosis.md` with
103
- non-empty `Reproduction`, `Hypotheses`, `Root cause`, `Regression test`, and
104
- `Recovery` sections. Free-form convergence evidence never substitutes for this
105
- durable diagnosis artifact.
106
-
107
- Create at least one task through `task.create` with `change_id` set. Split only
108
- when ownership, dependencies, or independent verification justify it. All task
109
- status changes remain MCP-authoritative.
110
-
111
- ## 5. Compile task context
112
-
113
- Call `change.context` before implementation and again whenever any of these
114
- changes: git HEAD, task set, relevant specs, allowed paths, or provider revision.
115
- Supply only the minimum task/spec/path references needed for the current slice.
116
-
117
- Inspect `context-manifest.json` before handing work to an agent. A stale git head
118
- or task set is a hard signal to recompile. Provider `status: stale` is visible
119
- context, not permission to silently refresh or mutate the external provider.
120
-
121
- ## 6. Route execution
122
-
123
- - For `incident`, diagnosis is the first execution slice. Route it to the bundled
124
- `debugger` agent when the Host exposes native subagents; otherwise the primary
125
- Host follows the same four-phase method. Supply only the compiled change/task
126
- context. The primary Host owns the fix, updates `diagnosis.md`, and reruns the
127
- discriminating regression test.
128
- - Implement one linked task with `/ultra-dev <task-id>`.
129
- - Run `/ultra-test` for project-level evidence.
130
- - Run `/ultra-review` when the change kind requires review.
131
- - Update baseline docs declared in `docs_impact` during the change, not after
132
- memory has gone cold.
133
- - Finish with `/ultra-deliver`; it runs deterministic change convergence and
134
- archive reconciliation before release actions.
135
-
136
- If work exposes a new requirement, update the change intent/delta and recompile
137
- context before continuing. Never let code become the only record of the change.
138
-
139
- ## 7. Report
140
-
141
- Return the change id, kind, artifact root, linked tasks, documentation impact,
142
- context freshness, provider-reference status, and exact next workflow. Separate
143
- provider unavailability from an Ultra runtime incident.
144
-
145
- ## What this skill does not do
146
-
147
- - It does not implement, test, review, release, or repair runtime state.
148
- - It does not own or synchronize Memory/code-graph content.
149
- - It does not bypass user approval for destructive or external release actions.
120
+ Call `change.breadcrumb` and report the compiled task, readiness, blockers, and its
121
+ single next action. Do not claim alignment while documentation impact is unknown,
122
+ context is stale, or a material decision remains unresolved.
@@ -1,239 +1,111 @@
1
1
  ---
2
2
  name: ultra-deliver
3
- description: "Converge and deliver a verified baseline or continuous change: reconcile specs, build/test, archive evidence, version, tag, and push."
3
+ description: "Converge an implementation, approved specification learning, independent review axes, and release evidence into one recoverable baseline."
4
+ user-invocable: true
4
5
  runtime: all
5
6
  mcp_tools_required:
6
7
  - change.list
7
8
  - change.get
8
9
  - change.context
10
+ - change.breadcrumb
11
+ - change.learning_resolve
9
12
  - change.converge
10
13
  - change.archive
11
14
  cli_fallback: "direct user interaction"
12
15
  ---
13
16
 
14
- # ultra-deliver — Phase 3.5
17
+ # ultra-deliver — Converge, Archive, Release
15
18
 
16
- Release the current working tree and close its continuous-change packet when
17
- one exists. `.ultra/test-report.json` is the test gate; `change.converge` is the
18
- deterministic closure gate; `.ultra/delivery-report.json` is the release report.
19
- Change lifecycle writes go through MCP only.
20
-
21
- ## Prerequisites (all validations are blocking)
19
+ Deliver the current baseline or one continuous-change packet. Change lifecycle writes
20
+ use MCP only; `.ultra/test-report.json`, review sessions, and delivery reports are
21
+ evidence artifacts.
22
22
 
23
- ### Validation 0 — Resolve continuous change
23
+ ## 1. Bind the delivery
24
24
 
25
- Call `change.list` for `active`, `blocked`, and `ready` work.
25
+ 1. Call `change.list` for active, blocked, and ready changes.
26
+ 2. Bind exactly one relevant change; require an id when ambiguous. Initial baseline
27
+ delivery may use `change_id: null`.
28
+ 3. Call `change.breadcrumb`. A stale/blocked context or incomplete linked task blocks.
29
+ 4. Verify `.ultra/test-report.json` exists, passed, matches the change, and records the
30
+ current full HEAD plus at least one public seam.
31
+ 5. Verify the latest review session matches the same HEAD and has passing independent
32
+ `spec_fidelity` and `engineering_standards` axes.
26
33
 
27
- - Exactly one relevant change → bind delivery to that id.
28
- - More than one → require an explicit id; never guess which change to archive.
29
- - None → allow initial-baseline delivery, but record `change_id: null`.
30
- - Active/blocked change → its linked tasks must all be completed and its
31
- `test-report.json.change_id` must match.
32
- - Ready change → do not rerun convergence blindly; verify its existing
33
- verification artifact still matches current HEAD before archive.
34
-
35
- ### Validation 1 — `/ultra-test` passed
36
-
37
- Read `.ultra/test-report.json`:
38
- - File must exist → else: "Run `/ultra-test` first" → **EXIT**
39
- - `passed === true` → else: show `blocking_issues`, **EXIT**
40
- - `git_commit === current HEAD` → else: "Code changed since last test;
41
- re-run `/ultra-test`" → **EXIT**
34
+ Do not reuse evidence from another checkout, commit, task set, or change.
42
35
 
43
- ### Validation 2 — No uncommitted changes
44
-
45
- `git status --porcelain` must be empty. If dirty, ask through the current
46
- Host's native user-interaction surface:
47
- - A: "Auto-commit all changes" → `git add -A && git commit -m "chore: pre-delivery cleanup"`
48
- - B: "Review changes first" → `git diff --stat` → re-ask
49
- - C: "Block delivery" → **EXIT**
50
-
51
- Commit failure (conflicts, hook rejection) → surface error and **EXIT**.
52
-
53
- ## Workflow
36
+ ## 2. Reconcile specification learning
54
37
 
55
- ### Step 1 — Documentation Update (MANDATORY)
56
-
57
- **1.1 CHANGELOG.md** (required):
58
- 1. `git log --oneline <last-tag>..HEAD`
59
- 2. Categorize by Conventional Commit type: `feat:` → Added, `fix:` → Fixed,
60
- `chore:` → Maintenance, `refactor:` → Changed, `docs:` → Documentation,
61
- `test:` → Tests, `perf:` → Performance.
62
- 3. Insert a new version section at the top of CHANGELOG.md.
63
- 4. Verify: Read CHANGELOG.md; confirm new version section exists.
64
-
65
- **1.2 Technical debt report** (required):
66
- 1. Grep source for `TODO:` / `FIXME:` / `HACK:` / `XXX:`.
67
- 2. Generate / refresh `.ultra/docs/technical-debt.md`:
68
- ```markdown
69
- # Technical Debt (<date>, <commit>)
70
- | File | Line | Kind | Note |
71
- |------|------|------|------|
72
- | src/foo.ts | 42 | TODO | "remove after v1.3" |
73
- ```
74
- 3. Verify: file reflects current grep output.
75
-
76
- **1.3 README.md** (conditional — public API changed):
77
- 1. Diff exported API signatures since last release (`git diff <last-tag>..HEAD -- 'src/**'`)
78
- 2. If signatures changed, update README usage examples
79
- 3. Verify examples match the new API
80
-
81
- **1.4 Baseline specification reconciliation** (continuous change):
82
-
83
- 1. Read `intent.md`, `delta/`, and `docs_impact` from the bound change.
84
- 2. Merge accepted deltas into the declared baseline documents.
85
- 3. Record every updated project-relative path as `baseline_updates`.
86
- 4. If no baseline file changes, write a specific `no_baseline_change_reason`.
87
- 5. Verify no `[NEEDS CLARIFICATION]` or unresolved delta remains for delivered behavior.
88
-
89
- **Checklist**:
90
- - [ ] CHANGELOG.md updated
91
- - [ ] technical-debt.md refreshed
92
- - [ ] README.md reflects current API (if applicable)
93
- - [ ] active delta reconciled into baseline, or explicit no-change rationale exists
94
-
95
- Any unchecked → fix, then continue.
96
-
97
- ### Step 2 — Production Build
98
-
99
- Detect build command (priority order):
100
- 1. `package.json → scripts.build` → `npm run build` (or `pnpm build`/`yarn build`
101
- based on lockfile)
102
- 2. `Makefile` → `make build` or `make release`
103
- 3. `Cargo.toml` → `cargo build --release`
104
- 4. `go.mod` → `go build ./...`
105
- 5. Nothing detected → ask the user for the command
106
-
107
- Non-zero exit → block with stderr captured, then ask the user:
108
- - A: "Fix error and retry"
109
- - B: "Abort delivery"
110
-
111
- ### Step 3 — Version + convergence + release
112
-
113
- **3.1 Determine version bump**:
114
- - `git log <last-tag>..HEAD --oneline` → analyze commit types
115
- - `feat:` → minor, `BREAKING CHANGE:` / `!:` → major, else patch
116
- - Display `<old> → <new>`; allow an explicit user override.
117
-
118
- **3.2 Update version in project files**:
119
- - `package.json`, `Cargo.toml`, `pyproject.toml`, etc.
120
- - Verify: read the file; confirm new version.
121
-
122
- **3.2a Re-run release evidence after docs/version edits**:
123
-
124
- - Run the exact relevant test, type-check, build, and package commands again.
125
- - Capture command, exit code, and result. Any non-zero exit blocks delivery.
126
- - Do not reuse a test report whose `change_id` or pre-change HEAD belongs to a
127
- different change as final evidence.
128
-
129
- **3.3 Release commit**:
130
- ```bash
131
- git add -A
132
- git commit -m "chore(release): v<X.Y.Z>"
133
- ```
134
- Verify with `git log -1 --oneline`.
135
-
136
- **3.4 Recompile context and converge the change** (skip only for initial baseline):
137
-
138
- For `active` or `blocked`, call `change.context` after the release commit so its
139
- git head and task set are current. Then call `change.converge` with the exact
140
- evidence required by kind:
141
-
142
- - `quick`: diff, tests, spec;
143
- - `standard` / `major`: diff, tests, spec, docs, review;
144
- - `incident`: diagnosis, diff, tests. The diagnosis evidence must point to the
145
- completed `diagnosis.md`; convergence separately validates all five required
146
- debugging sections and cannot be satisfied by the evidence string alone.
147
-
148
- Evidence must name concrete commands, artifacts, or file paths. If blockers are
149
- returned, stop before tag/push and route to the owning workflow. Do not weaken
150
- the change kind or mark failed evidence `not_applicable` merely to pass.
151
-
152
- **3.5 Archive after baseline reconciliation**:
153
-
154
- Call `change.archive` with the summary and either `baseline_updates` or the
155
- explicit no-change reason. This moves the packet from `changes/active` to the
156
- dated archive and records closure in state.db. Archive failure blocks release.
157
-
158
- **3.6 Git tag**:
159
- ```bash
160
- git tag v<X.Y.Z>
161
- ```
162
- Verify with `git tag -l v<X.Y.Z>`.
163
-
164
- **3.7 Push to remote**:
165
- ```bash
166
- git push origin main # release commit
167
- git push origin v<X.Y.Z> # version tag
168
- ```
169
- Verify with `git ls-remote --tags origin | grep v<X.Y.Z>`.
170
-
171
- **Release checklist**:
172
- - [ ] Version determined and displayed
173
- - [ ] Version file updated and verified
174
- - [ ] Release commit created and verified
175
- - [ ] Change context current, convergence ready, baseline reconciled, archive complete
176
- - [ ] Git tag created and verified
177
- - [ ] Commit and tag pushed and verified on remote
178
-
179
- Any failure → stop immediately; do NOT continue; surface last-step error.
180
-
181
- ### Step 4 — Persist `.ultra/delivery-report.json`
182
-
183
- ```jsonc
184
- {
185
- "timestamp": "<ISO8601>",
186
- "version": "<X.Y.Z>",
187
- "git_tag": "v<X.Y.Z>",
188
- "git_commit": "<HEAD SHA>",
189
- "change_id": "<archived-change-id-or-null>",
190
- "change_archive_path": "<path-or-null>",
191
- "convergence_ready": true,
192
- "baseline_updates": ["<project-relative-path>"],
193
- "changelog_updated": true,
194
- "technical_debt_refreshed": true,
195
- "build_success": true,
196
- "pushed": true
197
- }
198
- ```
199
-
200
- ### Step 5 — Report
201
-
202
- Print a tight release summary: change id/archive, baseline files reconciled,
203
- tag, commit, exact verification commands, outstanding technical-debt count,
204
- and next suggested action. After release, daily work starts with `/ultra-change`.
205
-
206
- ## Deliverables Checklist (final)
207
-
208
- - [ ] `/ultra-test` passed (verified via test-report.json)
209
- - [ ] Uncommitted changes handled
210
- - [ ] CHANGELOG + technical-debt refreshed (README if API changed)
211
- - [ ] Production build exit 0
212
- - [ ] Continuous change converged and archived (when present)
213
- - [ ] Version bumped, tagged, pushed
214
- - [ ] delivery-report.json written
215
-
216
- ## MCP → CLI fallback matrix
217
-
218
- | Purpose | MCP tool | CLI fallback |
219
- |---------|----------|--------------|
220
- | Resolve dirty-tree action | none | current Host's native user-interaction surface |
221
- | Override version bump | none | current Host's native user-interaction surface |
222
- | Resolve/bind change | `change.list` / `change.get` | none; fail closed |
223
- | Refresh context | `change.context` | none; fail closed |
224
- | Deterministic closure | `change.converge` / `change.archive` | none; fail closed |
225
-
226
- ## What this skill DOES NOT do
227
-
228
- - Does NOT replace `/ultra-test`; it re-runs the exact release evidence after
229
- documentation and version changes so the shipped commit is verified
230
- - Does NOT publish to npm / crates.io / PyPI (Phase 9 handles distribution)
231
- - Does NOT directly mutate state.db or external provider state
232
-
233
- ## Integration
234
-
235
- | | |
236
- |---|---|
237
- | **Input** | bound change (if any), test/review artifacts, current repo |
238
- | **Output** | archived change, reconciled baseline, delivery report, git tag + remote push |
239
- | **Next** | deploy/announce; next daily change begins with `/ultra-change` |
38
+ Call `change.get` for authoritative `learning_candidates`; use the packet's
39
+ `spec-learning.json` only as the inspectable projection.
40
+
41
+ - `proposed`: require approve or reject through `change.learning_resolve`.
42
+ - `approved`: update the declared baseline target, verify the edit, then mark `apply`.
43
+ - `rejected`: preserve the reason as decision evidence.
44
+ - `applied`: verify the target still contains the accepted behavior.
45
+
46
+ Any proposed or approved candidate blocks convergence. This is the mandatory path that
47
+ keeps baseline specs alive after daily changes; it is not cross-session memory.
48
+
49
+ Reconcile accepted `delta/` content and declared documentation impact into baseline
50
+ documents. Record `baseline_updates`, or a specific no-change reason. No unresolved
51
+ placeholder, unknown docs impact, or delivered-only-in-delta behavior may remain.
52
+
53
+ ## 3. Verify the release candidate
54
+
55
+ Require a clean, reviewed release commit. If changes remain, show the diff and obtain
56
+ explicit approval before committing. Never auto-stage unrelated user changes.
57
+
58
+ Run exact project commands for:
59
+
60
+ 1. focused regression/acceptance feedback loop;
61
+ 2. full relevant tests;
62
+ 3. static checks and production build;
63
+ 4. package/install/doctor smoke where the product is distributed;
64
+ 5. public-seam acceptance and rollback/recovery sanity.
65
+
66
+ Record commands, exit results, and current HEAD. Any post-test edit invalidates the
67
+ test and review gates.
68
+
69
+ ## 4. Compile final role context
70
+
71
+ Call `change.context` at the release commit with `role=review`, `gate=convergence`,
72
+ current required refs/digests, the public seam, exact verification command, and the
73
+ single next action `Archive the converged change`. Readiness must be `ready`.
74
+
75
+ ## 5. Converge
76
+
77
+ Call `change.converge` with evidence rows for:
78
+
79
+ - `diff`: reviewed release diff and public seam;
80
+ - `tests`: exact signal object (`command`, expected/observed red, observed green,
81
+ deterministic, duration when known) and seam;
82
+ - `spec`: baseline/delta and applied learning evidence;
83
+ - `docs`: updated paths or explicit non-applicability;
84
+ - `review`, `axis=spec_fidelity`;
85
+ - `review`, `axis=engineering_standards`;
86
+ - `diagnosis` for incidents.
87
+
88
+ Do not collapse the two review axes or substitute prose for the signal fields. If
89
+ convergence returns blockers, fix the named source and rerun the invalidated gates.
90
+
91
+ ## 6. Archive and release
92
+
93
+ After `ready=true`, call `change.archive` with summary and `baseline_updates` (or the
94
+ validated no-change reason). Then:
95
+
96
+ 1. determine the semantic version from user-visible compatibility;
97
+ 2. update version and changelog;
98
+ 3. rerun release verification if version files changed;
99
+ 4. create a non-force commit/tag and push only with explicit release authorization;
100
+ 5. publish the package/release through the repository's authenticated workflow;
101
+ 6. verify the remote tag/release and registry version independently.
102
+
103
+ Write `.ultra/delivery-report.json` with change id, archived status, commit, version,
104
+ commands, package/release identifiers, baseline updates, rollback notes, and timestamp.
105
+
106
+ ## Completion gate
107
+
108
+ Delivery is complete only when the change is archived, local and remote commit/tag
109
+ agree, registry/release verification is current, and the worktree contains no
110
+ unexplained scope. Report the outcome first, exact evidence next, and residual risks
111
+ last. Never say “published” based only on a local version bump.