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.
- package/CHANGELOG.md +79 -1
- package/README.md +45 -26
- package/adapters/_shared/codex-assets.cjs +38 -0
- package/adapters/_shared/handbook.cjs +10 -1
- package/adapters/_shared/path-rewrite.cjs +3 -0
- package/adapters/_shared/runtime-assets.cjs +3 -1
- package/adapters/_shared/tests/handbook.test.cjs +9 -1
- package/adapters/_shared/tests/path-rewrite.test.cjs +3 -1
- package/adapters/_shared/tests/runtime-assets.test.cjs +5 -1
- package/adapters/kimi.js +642 -0
- package/adapters/opencode.js +46 -17
- package/adapters/tests/claude.test.cjs +4 -1
- package/adapters/tests/codex.test.cjs +4 -3
- package/adapters/tests/kimi-hook.test.cjs +122 -0
- package/adapters/tests/kimi.test.cjs +259 -0
- package/adapters/tests/opencode.test.cjs +46 -3
- package/bin/handbook.js +2 -2
- package/bin/install.js +9 -4
- package/bin/orchestrator.js +1 -1
- package/docs/AGENT-CONTEXT.md +39 -15
- package/docs/ARCHITECTURE.md +35 -9
- package/docs/PLAN.zh-CN.md +5 -4
- package/docs/ROADMAP.md +8 -7
- package/docs/RUNTIME-COMPAT-MATRIX.md +110 -64
- package/docs/USER-HANDBOOK-CONTRACT.md +13 -3
- package/hooks/README.md +6 -4
- package/hooks/active_task_context.py +14 -0
- package/hooks/adapters/kimi.py +162 -0
- package/hooks/context_spine.py +218 -0
- package/hooks/health_check.py +1 -1
- package/hooks/workflow_context.py +16 -123
- package/hooks/workflow_resume.py +21 -0
- package/mcp-server/lib/change-workflow.cjs +89 -11
- package/mcp-server/lib/change-workflow.test.cjs +202 -7
- package/mcp-server/lib/context-spine.cjs +331 -0
- package/mcp-server/lib/context-spine.test.cjs +73 -0
- package/mcp-server/lib/spec-learning.cjs +191 -0
- package/mcp-server/lib/spec-learning.test.cjs +62 -0
- package/mcp-server/lib/state-db.cjs +149 -4
- package/mcp-server/lib/state-db.test.cjs +61 -0
- package/mcp-server/server.cjs +31 -1
- package/mcp-server/tests/db-ops.test.cjs +3 -3
- package/mcp-server/tests/init-project.test.cjs +2 -2
- package/mcp-server/tests/server-contract.test.cjs +74 -0
- package/mcp-server/tests/state-db.test.cjs +20 -3
- package/package.json +4 -2
- package/skills/learn/SKILL.md +1 -0
- package/skills/ultra-change/SKILL.md +91 -118
- package/skills/ultra-deliver/SKILL.md +93 -221
- package/skills/ultra-dev/SKILL.md +81 -310
- package/skills/ultra-doctor/SKILL.md +1 -0
- package/skills/ultra-init/SKILL.md +1 -0
- package/skills/ultra-plan/SKILL.md +72 -292
- package/skills/ultra-review/SKILL.md +79 -407
- package/skills/ultra-status/SKILL.md +55 -168
- package/skills/ultra-test/SKILL.md +64 -183
- package/skills/ultra-think/SKILL.md +1 -0
- package/spec/cli-protocol.md +3 -0
- package/spec/mcp-tools.yaml +136 -7
- package/spec/schemas/skill-manifest.schema.json +2 -2
- package/spec/schemas/state-db.sql +35 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ultra-change
|
|
3
|
-
description: "
|
|
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 —
|
|
19
|
+
# ultra-change — Delta Entry and Alignment Gate
|
|
16
20
|
|
|
17
|
-
Use this
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
25
|
+
## Authority boundary
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
##
|
|
31
|
+
## 1. Establish the change
|
|
37
32
|
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
+
## 2. Write only the delta
|
|
55
53
|
|
|
56
|
-
|
|
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
|
-
|
|
64
|
-
changes
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
##
|
|
111
|
+
## 5. Handle discoveries without silent spec drift
|
|
85
112
|
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
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 —
|
|
17
|
+
# ultra-deliver — Converge, Archive, Release
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
23
|
+
## 1. Bind the delivery
|
|
24
24
|
|
|
25
|
-
Call `change.list` for
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
1.
|
|
78
|
-
2.
|
|
79
|
-
3.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
4.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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.
|