ultra-builder-pro-cli 3.0.2 → 5.0.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 (41) hide show
  1. package/.ultra-template/contexts/TEMPLATE.md +6 -0
  2. package/CHANGELOG.md +73 -1
  3. package/README.md +126 -36
  4. package/README.zh-CN.md +440 -0
  5. package/adapters/_shared/host-profile.cjs +3 -151
  6. package/adapters/_shared/plugin-core.cjs +57 -0
  7. package/adapters/_shared/runtime-assets.cjs +64 -12
  8. package/bin/delegate-worker.cjs +2 -345
  9. package/bin/delegate.cjs +3 -530
  10. package/docs/ARCHITECTURE.md +59 -18
  11. package/docs/ARTIFACT-AUTHORITY.md +21 -5
  12. package/docs/DECISIONS.md +31 -10
  13. package/docs/PLUGIN-ISOLATION-CONTRACT.md +28 -12
  14. package/docs/RUNTIME-COMPAT-MATRIX.md +101 -22
  15. package/docs/SKILL-AUTHORING.md +15 -3
  16. package/docs/WORKFLOW-LIFECYCLE.md +83 -29
  17. package/docs/evals/ultra-5-0-journey-results.md +62 -0
  18. package/docs/evals/ultra-5-0-live-acp-conformance.md +93 -0
  19. package/docs/evals/ultra-5-0-route-journeys.md +145 -0
  20. package/package.json +2 -1
  21. package/skills/ultra-change/SKILL.md +30 -4
  22. package/skills/ultra-delegate/SKILL.md +80 -7
  23. package/skills/ultra-delegate/patches/zcode-acp-0.1.0-zcode-0.16.5.patch +184 -0
  24. package/skills/ultra-delegate/references/delegation-contract.md +60 -1
  25. package/skills/ultra-delegate/scripts/acp-conformance.cjs +287 -0
  26. package/skills/ultra-delegate/scripts/acp-driver.cjs +762 -0
  27. package/skills/ultra-delegate/scripts/agent-execution-driver.cjs +320 -0
  28. package/skills/ultra-delegate/scripts/cli-driver.cjs +61 -0
  29. package/skills/ultra-delegate/scripts/delegate-worker.cjs +328 -0
  30. package/skills/ultra-delegate/scripts/delegate.cjs +690 -0
  31. package/skills/ultra-delegate/scripts/host-profile.cjs +267 -0
  32. package/skills/ultra-deliver/SKILL.md +13 -0
  33. package/skills/ultra-dev/SKILL.md +18 -2
  34. package/skills/ultra-init/SKILL.md +12 -0
  35. package/skills/ultra-plan/SKILL.md +21 -3
  36. package/skills/ultra-research/SKILL.md +33 -5
  37. package/skills/ultra-status/SKILL.md +37 -7
  38. package/skills/ultra-status/references/route-contract.md +100 -0
  39. package/skills/ultra-test/SKILL.md +16 -1
  40. /package/{adapters/_shared → skills/ultra-delegate/scripts}/delegate-profiles/kimi-read-only.md +0 -0
  41. /package/{adapters/_shared → skills/ultra-delegate/scripts}/delegate-profiles/kimi-write.md +0 -0
@@ -0,0 +1,267 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+
6
+ const KIMI_PROFILE_ROOT = path.join(__dirname, 'delegate-profiles');
7
+ const ZCODE_BUNDLED_CLI = '/Applications/ZCode.app/Contents/Resources/glm/zcode.cjs';
8
+ const CLAUDE_ACP_PACKAGE = '@agentclientprotocol/claude-agent-acp@0.70.0';
9
+ const CODEX_ACP_PACKAGE = '@agentclientprotocol/codex-acp@1.6.2';
10
+ const ZCODE_ACP_SOURCE = Object.freeze({
11
+ repository: 'https://github.com/jpalmae/zcode-acp',
12
+ version: '0.1.0',
13
+ commit: '42fe149d4b501469343c01f23ba3801832306d53',
14
+ buildMarker: 'zcode-acp 0.1.0+ultra.zcode.0.16.5',
15
+ runtimeVersion: '0.16.5',
16
+ patch: Object.freeze({
17
+ path: 'skills/ultra-delegate/patches/zcode-acp-0.1.0-zcode-0.16.5.patch',
18
+ sha256: '174dfd0feafe84320556a84b5ae08b10e44c5515fea4992fd1d58af54cee4e3d',
19
+ compatibility: 'ZCode CLI 0.16.5 runtime-preferences handshake',
20
+ }),
21
+ });
22
+
23
+ // The ZCode app-bundled CLI is a verified-local surface, not a provider
24
+ // stability promise: official documentation plus a full recovery drill must
25
+ // both hold before any transport may claim 'supported'.
26
+ const TRANSPORT_MATURITY = Object.freeze({
27
+ claude: 'documented+verified',
28
+ codex: 'documented+verified',
29
+ opencode: 'documented+verified',
30
+ kimi: 'documented+verified',
31
+ grok: 'documented+verified',
32
+ zcode: 'experimental',
33
+ });
34
+
35
+ const ACP_CONFORMANCE = Object.freeze({
36
+ claude: Object.freeze({
37
+ status: 'passed',
38
+ evidence: 'docs/evals/ultra-5-0-live-acp-conformance.md#claude-code',
39
+ receiptSha256: '9b1d88cbd5e5b66a56e0cf19f34e7f2107f9e4b8fde9d80b9eadcdfc8f4a25e3',
40
+ }),
41
+ codex: Object.freeze({
42
+ status: 'passed',
43
+ evidence: 'docs/evals/ultra-5-0-live-acp-conformance.md#codex',
44
+ receiptSha256: 'e82287609397807fb6968dff104d7f6569499b53c77be6a186aa33939a4c629e',
45
+ }),
46
+ opencode: Object.freeze({
47
+ status: 'passed',
48
+ evidence: 'docs/evals/ultra-5-0-live-acp-conformance.md#opencode',
49
+ receiptSha256: '3575b148f6feb8c9f1472add705390e6d47b87be080403ec7006b66a29f7873b',
50
+ }),
51
+ kimi: Object.freeze({
52
+ status: 'passed',
53
+ evidence: 'docs/evals/ultra-5-0-live-acp-conformance.md#kimi-code',
54
+ receiptSha256: '30d8adec2877f80fadf0b20c3cb7fa6b732dea3598d7484c143f9835770301fe',
55
+ }),
56
+ grok: Object.freeze({
57
+ status: 'passed',
58
+ evidence: 'docs/evals/ultra-5-0-live-acp-conformance.md#grok-build',
59
+ receiptSha256: '370eeae12d63443188d519825ed8040fd8bba9b27fddb82e499d9cb590f4a33d',
60
+ }),
61
+ zcode: Object.freeze({
62
+ status: 'passed',
63
+ evidence: 'docs/evals/ultra-5-0-live-acp-conformance.md#zcode',
64
+ receiptSha256: '156080f88ed84a013fb26d93e5138230732d2ef0e2b5b10a7c3deb501d3548e9',
65
+ }),
66
+ });
67
+
68
+ function zcodeBinary({ platform = process.platform, exists = fs.existsSync } = {}) {
69
+ return platform === 'darwin' && exists(ZCODE_BUNDLED_CLI)
70
+ ? ZCODE_BUNDLED_CLI
71
+ : 'zcode';
72
+ }
73
+
74
+ function opencodePermission(writableRoots) {
75
+ const edit = { '*': 'deny' };
76
+ for (const root of writableRoots) {
77
+ if (root === '.') edit['*'] = 'allow';
78
+ else edit[`${root}/**`] = 'allow';
79
+ }
80
+ return JSON.stringify({
81
+ share: 'disabled',
82
+ permission: {
83
+ '*': 'deny',
84
+ read: 'allow',
85
+ glob: 'allow',
86
+ grep: 'allow',
87
+ list: 'allow',
88
+ lsp: 'allow',
89
+ edit,
90
+ external_directory: 'deny',
91
+ bash: 'deny',
92
+ task: 'deny',
93
+ webfetch: 'deny',
94
+ websearch: 'deny',
95
+ question: 'deny',
96
+ skill: 'deny',
97
+ },
98
+ });
99
+ }
100
+
101
+ const PROFILES = Object.freeze({
102
+ claude: Object.freeze({
103
+ binary: 'claude',
104
+ acp: Object.freeze({
105
+ surface: `official ${CLAUDE_ACP_PACKAGE} stdio adapter`,
106
+ transport: 'stdio',
107
+ protocolVersions: [1],
108
+ conformance: ACP_CONFORMANCE.claude,
109
+ command: () => 'npx',
110
+ argv: () => ['--yes', CLAUDE_ACP_PACKAGE],
111
+ }),
112
+ delegateArgv: (prompt, _cwd, options) => [
113
+ '-p', prompt,
114
+ '--permission-mode', options.readOnly ? 'plan' : 'acceptEdits',
115
+ '--no-session-persistence',
116
+ '--output-format', 'json',
117
+ '--tools', options.readOnly ? 'Read,Grep,Glob' : 'Read,Write,Edit,Grep,Glob',
118
+ ],
119
+ }),
120
+ codex: Object.freeze({
121
+ binary: 'codex',
122
+ acp: Object.freeze({
123
+ surface: `official ${CODEX_ACP_PACKAGE} stdio adapter`,
124
+ transport: 'stdio',
125
+ protocolVersions: [1],
126
+ conformance: ACP_CONFORMANCE.codex,
127
+ command: () => 'npx',
128
+ argv: () => ['--yes', CODEX_ACP_PACKAGE],
129
+ }),
130
+ delegateArgv: (prompt, cwd, options) => [
131
+ 'exec', '--ephemeral', '--ignore-user-config',
132
+ '--sandbox', options.readOnly ? 'read-only' : 'workspace-write',
133
+ '--cd', cwd,
134
+ '--config', 'sandbox_workspace_write.network_access=false',
135
+ '--output-schema', options.schemaFile,
136
+ '--output-last-message', options.hostOutput,
137
+ '--json', prompt,
138
+ ],
139
+ }),
140
+ opencode: Object.freeze({
141
+ binary: 'opencode',
142
+ acp: Object.freeze({
143
+ surface: 'native OpenCode ACP stdio server',
144
+ transport: 'stdio',
145
+ protocolVersions: [1],
146
+ conformance: ACP_CONFORMANCE.opencode,
147
+ command: ({ cliCommand }) => cliCommand,
148
+ argv: () => ['acp'],
149
+ }),
150
+ delegateArgv: (prompt, cwd) => [
151
+ 'run', '--dir', cwd, '--format', 'json', '--auto', prompt,
152
+ ],
153
+ delegateEnv: (options) => ({
154
+ OPENCODE_CONFIG_CONTENT: opencodePermission(options.writableRoots),
155
+ }),
156
+ }),
157
+ kimi: Object.freeze({
158
+ binary: 'kimi',
159
+ supportsModelSelection: true,
160
+ acp: Object.freeze({
161
+ surface: 'Kimi Code ACP stdio server',
162
+ transport: 'stdio',
163
+ protocolVersions: [1],
164
+ conformance: ACP_CONFORMANCE.kimi,
165
+ command: ({ cliCommand }) => cliCommand,
166
+ argv: () => ['acp'],
167
+ }),
168
+ delegateArgv: (prompt, _cwd, options) => {
169
+ const args = ['-p', prompt, '--output-format', 'stream-json'];
170
+ if (options.model) args.push('--model', options.model);
171
+ args.push(
172
+ '--agent-file',
173
+ path.join(
174
+ KIMI_PROFILE_ROOT,
175
+ options.readOnly ? 'kimi-read-only.md' : 'kimi-write.md',
176
+ ),
177
+ );
178
+ return args;
179
+ },
180
+ }),
181
+ grok: Object.freeze({
182
+ binary: 'grok',
183
+ acp: Object.freeze({
184
+ surface: 'Grok agent stdio candidate',
185
+ transport: 'stdio',
186
+ protocolVersions: [1],
187
+ conformance: ACP_CONFORMANCE.grok,
188
+ command: ({ cliCommand }) => cliCommand,
189
+ argv: () => ['agent', 'stdio'],
190
+ }),
191
+ delegateArgv: (prompt, cwd, options) => [
192
+ '--cwd', cwd, '--single', prompt,
193
+ '--permission-mode', options.readOnly ? 'plan' : 'acceptEdits',
194
+ '--sandbox', options.readOnly ? 'read-only' : 'workspace',
195
+ '--no-memory', '--no-subagents', '--disable-web-search',
196
+ '--verbatim',
197
+ '--max-turns', '12',
198
+ '--output-format', 'json',
199
+ ],
200
+ }),
201
+ zcode: Object.freeze({
202
+ binary: zcodeBinary(),
203
+ installedRuntimeOnly: true,
204
+ acp: Object.freeze({
205
+ surface: `installed ZCode Desktop runtime through zcode-acp ${ZCODE_ACP_SOURCE.version}`,
206
+ transport: 'stdio',
207
+ protocolVersions: [1],
208
+ conformance: ACP_CONFORMANCE.zcode,
209
+ command: ({ env }) => env.ULTRA_ZCODE_ACP_COMMAND || 'zcode-acp',
210
+ argv: ({ cliCommand }) => ['--zcode-path', cliCommand, '--no-browser'],
211
+ identityProbes: ({ command, cliCommand }) => [
212
+ {
213
+ label: 'zcode_bridge',
214
+ command,
215
+ args: ['--version'],
216
+ expectedStdout: ZCODE_ACP_SOURCE.buildMarker,
217
+ },
218
+ {
219
+ label: 'zcode_runtime',
220
+ command: cliCommand.endsWith('.cjs') ? process.execPath : cliCommand,
221
+ args: cliCommand.endsWith('.cjs') ? [cliCommand, '--version'] : ['--version'],
222
+ expectedStdout: ZCODE_ACP_SOURCE.runtimeVersion,
223
+ },
224
+ ],
225
+ }),
226
+ delegateArgv: (prompt, cwd, options) => [
227
+ '--cwd', cwd,
228
+ '--mode', options.readOnly ? 'plan' : 'edit',
229
+ '--json', '--no-color',
230
+ '--disallowedTools', options.readOnly
231
+ ? 'Bash Write Edit ApplyPatch Agent WebFetch WebSearch'
232
+ : 'Bash Agent WebFetch WebSearch',
233
+ '--prompt', prompt,
234
+ ],
235
+ }),
236
+ });
237
+
238
+ function hostProfile(runtime) {
239
+ const profile = PROFILES[runtime];
240
+ if (!profile) throw new Error(`unsupported delegate host: ${runtime}`);
241
+ return { ...profile, transportMaturity: TRANSPORT_MATURITY[runtime] };
242
+ }
243
+
244
+ // The live delegate surface names honestly what a run actually used. The ZCode
245
+ // headless transports are app-internal surfaces, never the documented ZCode
246
+ // Desktop interactive primary path, so every receipt that records one says so.
247
+ function transportSurface(runtime, binary = PROFILES[runtime] ? PROFILES[runtime].binary : undefined) {
248
+ if (runtime === 'zcode') {
249
+ const source = binary === ZCODE_BUNDLED_CLI ? 'the App-bundled headless CLI' : 'the zcode headless CLI on PATH';
250
+ return `${source} (experimental; not the documented ZCode Desktop interactive surface)`;
251
+ }
252
+ return 'documented non-interactive CLI';
253
+ }
254
+
255
+ module.exports = {
256
+ ACP_CONFORMANCE,
257
+ CLAUDE_ACP_PACKAGE,
258
+ CODEX_ACP_PACKAGE,
259
+ PROFILES,
260
+ TRANSPORT_MATURITY,
261
+ ZCODE_BUNDLED_CLI,
262
+ ZCODE_ACP_SOURCE,
263
+ hostProfile,
264
+ opencodePermission,
265
+ transportSurface,
266
+ zcodeBinary,
267
+ };
@@ -7,6 +7,18 @@ description: Reconcile one Change whose matching tasks are complete, run aggrega
7
7
 
8
8
  Delivery closes the local Change; readiness grants no commit, push, tag, publish, or deploy authority.
9
9
 
10
+ ## Route modes
11
+
12
+ | Mode | Entry | Observable exit | Next |
13
+ |---|---|---|---|
14
+ | `reconcile` | Explicit invocation or a valid Execution Grant for a tested active Change | Intent, implementation, specifications, documentation, evidence, and report agree, or changed files make the exact stale evidence visible | Recommend `ultra-test/reaudit` after changes, otherwise recommend explicit `ultra-deliver/finalize` |
15
+ | `finalize` | Current explicit owner invocation only | Fresh transport/evidence checks pass, version and package posture are owner-set, `delivery.md` is written, and the Change is locally archived | Report `idle` plus every separately authorized or unfinished release effect |
16
+
17
+ Follow `../ultra-status/references/route-contract.md`. Show a Route Card at entry, after
18
+ reconciliation, before the finalization checkpoint, and after archive or any stop.
19
+ Grant-aware continuation ends with `reconcile`; no Host metadata bit, report, or grant
20
+ turns `finalize` into an implicit mode.
21
+
10
22
  ## Before you start
11
23
 
12
24
  1. If model-selected, verify the live execution grant in `../ultra-change/references/execution-grant.md` — a current session-local activation or a stably verified durable work-package grant; without either, stop. A model-selected Deliver run under that grant may reconcile, review, and report, and then MUST stop before finalization: its inputs, writes, and effects end at the report. Only a current explicit owner invocation of `ultra-deliver` may finalize — writing `delivery.md`, deciding the version decision and package posture, and archiving the stable Change id with `git mv` are owner-invocation-only in every grant mode, and a grant never covers them.
@@ -178,4 +190,5 @@ Without release authority, stop after the recoverable local archive and report i
178
190
  trade-off rather than an established repository rule.
179
191
  - `../ultra-think/references/autonomy-boundary.md` — read before scope or evidence shrinks.
180
192
  - `../ultra-change/references/execution-grant.md` — read only for grant-activated continuation.
193
+ - `../ultra-status/references/route-contract.md` — owner-visible route, checkpoint, and recovery output.
181
194
  - `references/baseline-reconciliation.md` — exact `delivery.md` reconciliation contract.
@@ -7,6 +7,20 @@ description: Carry one planned task from a written implementation plan through r
7
7
 
8
8
  The model owns code reasoning and edits; repository files own the resumable contract.
9
9
 
10
+ ## Route modes
11
+
12
+ | Mode | Entry | Observable exit | Next |
13
+ |---|---|---|---|
14
+ | `execute` | Explicit task id or a valid Execution Grant covering one dependency-ready pending task | The named task has current acceptance evidence, final task review, completion context, and a read-back `completed` ledger row | Recommend the next exact `ultra-dev/execute` task or `ultra-test/audit` |
15
+ | `resume` | Explicit task id or a valid Execution Grant covering the unique in-progress task | Existing work is reconciled from Git, context, and Resume Note, then reaches the same completion evidence or a typed stop | Recommend the next exact task, `ultra-test/audit`, or the responsible repair route |
16
+ | `reopen` | Explicit task id or a valid Execution Grant after current evidence invalidates a completed task | The invalidated criteria are refreshed through a new review and the task is completed again, or the remaining gate is named | Recommend the next exact task or `ultra-test/reaudit` |
17
+
18
+ Follow `../ultra-status/references/route-contract.md`. Show a Route Card before the
19
+ first implementation edit, at material checkpoints or unavailable evidence, and after
20
+ the ledger readback. When context pressure threatens reliable continuation, finish the
21
+ nearest safe write, refresh the Resume Note, and recommend a fresh session rather than
22
+ pretending the task is still making invisible progress.
23
+
10
24
  ## Before you start
11
25
 
12
26
  1. If model-selected, verify the live execution grant in `../ultra-change/references/execution-grant.md` — a current session-local activation or a stably verified durable work-package grant; without either, stop.
@@ -229,8 +243,9 @@ historical evidence, then write and read back the ledger transition. Refresh the
229
243
  evidence, run task review for the new snapshot, and repeat this closeout sequence.
230
244
 
231
245
  Report the changed paths, the seam, the exact checks run, the review result, the
232
- evidence gaps and the residual risk. Recommend the next capability from what the
233
- files now say; do not invoke it.
246
+ evidence gaps and the residual risk. Recommend the next capability from what the files
247
+ now say. Continue only when its exact mode and effects remain inside the valid grant and
248
+ after showing the transition Route Card; otherwise do not invoke it.
234
249
 
235
250
  ## When the owner decides
236
251
 
@@ -245,5 +260,6 @@ authority. An interruption leaves the worktree as-is and names it in the Resume
245
260
  - `../ultra-think/references/autonomy-boundary.md` — read when spec and code disagree.
246
261
  - `../ultra-review/SKILL.md` — read when implementation evidence is ready for review.
247
262
  - `../ultra-change/references/execution-grant.md` — read only for grant-activated continuation.
263
+ - `../ultra-status/references/route-contract.md` — owner-visible route, checkpoint, and recovery output.
248
264
  - `../ultra-plan/references/task-evidence-v2.md` — canonical evidence, disposition, and task-review shape.
249
265
  - `references/debugging.md` — read for a reproduced failure before selecting a repair.
@@ -9,6 +9,17 @@ Initialization establishes places for later authority and records raw owner inta
9
9
  does not validate the problem, establish a North Star, build a product or architecture
10
10
  baseline, settle domain language, choose a Change, or start another public workflow.
11
11
 
12
+ ## Route modes
13
+
14
+ | Mode | Entry | Observable exit | Next |
15
+ |---|---|---|---|
16
+ | `create` | Explicit owner invocation when `.ultra/` is absent | Missing skeleton files and raw Project Brief are published and read back; Git exists | Recommend `ultra-research` in `baseline` mode |
17
+ | `recover` | Explicit owner invocation when the skeleton is partial or uncertain | Missing files are restored, preserved authority is byte-identical, and every unresolved repair is named | Recommend `ultra-research` in `baseline` mode when the brief is usable; otherwise resume `ultra-init/recover` |
18
+
19
+ Follow `../ultra-status/references/route-contract.md`. Derive a Route Card before the
20
+ first write and at the exit or any repair stop. Init never continues into Research on
21
+ its own, and its `Position` reports observed files rather than semantic progress.
22
+
12
23
  ## Before you start
13
24
 
14
25
  1. If `.ultra/changes/active/` exists, resolve at most one active `change_id`. Read
@@ -128,4 +139,5 @@ usable brief exists, but do not invoke it.
128
139
 
129
140
  - `../ultra-grilling/SKILL.md` — read before the first missing brief field.
130
141
  - `references/brownfield-adoption.md` — read when maintained behavior already exists.
142
+ - `../ultra-status/references/route-contract.md` — owner-visible route, checkpoint, and recovery output.
131
143
  - `../ultra-think/references/autonomy-boundary.md` — read before replacing authority.
@@ -7,6 +7,18 @@ description: Turn an evidenced Change intent into a dependency-valid task ledger
7
7
 
8
8
  Planning owns decomposition and technical design; files carry it across sessions and hosts.
9
9
 
10
+ ## Route modes
11
+
12
+ | Mode | Entry | Observable exit | Next |
13
+ |---|---|---|---|
14
+ | `decompose` | Explicit invocation or a valid Execution Grant for one accepted, evidenced Change | A dependency-valid task graph, contexts, acceptance mapping, review, and earliest observable slice are read back | Recommend the exact first `ultra-dev/execute` task |
15
+ | `recover` | Explicit invocation or a valid Execution Grant when the current Change's planning artifacts are incomplete or inconsistent | Ledger/context/trace defects are repaired or a bounded unavailable path is reported | Recommend the exact first `ultra-dev/execute` task, or `ultra-change/reconcile` for a product evidence gap |
16
+
17
+ Follow `../ultra-status/references/route-contract.md`. Show the Route Card before
18
+ decomposition, at any material posture decision, and after reporting the graph. The
19
+ first executable slice must name its real consumer, real data path, and owner-visible
20
+ observation; a task count or completed plan file is not early value.
21
+
10
22
  ## Before you start
11
23
 
12
24
  1. If model-selected, verify the live execution grant in `../ultra-change/references/execution-grant.md` — a current session-local activation or a stably verified durable work-package grant; without either, stop.
@@ -47,8 +59,11 @@ Keep the posture visible rather than silently drifting.
47
59
  Use `../ultra-grilling/SKILL.md` through the host-native question surface when the
48
60
  choice remains material, one question with a recommendation at a time.
49
61
 
50
- When the whole path is still unclear, recommend `ultra-research`; the Change is not yet
51
- evidenced enough to decompose. For one consequential trade-off, use `../ultra-think/SKILL.md`.
62
+ When a product or contract evidence gap leaves the whole path unclear, return the exact
63
+ gap to `ultra-change/reconcile`; Plan does not open Research directly. Change decides
64
+ whether to record a bounded Research Disposition. For ordinary technical uncertainty,
65
+ the model resolves it or writes one bounded spike/tracer task. For one consequential
66
+ trade-off, use `../ultra-think/SKILL.md`.
52
67
 
53
68
  ## Choose the plan shape
54
69
 
@@ -126,7 +141,9 @@ reached, preserve the findings and return the evidence to the responsible model
126
141
  owner. Attempt and finding counts never manufacture convergence or failure.
127
142
 
128
143
  Report the graph, frontier, seams, warnings and first task. Recommend the next explicit
129
- capability from the files; do not invoke it.
144
+ capability from the files. Under a valid grant covering that exact task, show the
145
+ transition Route Card before allowing Dev to re-verify and continue; otherwise do not
146
+ invoke it.
130
147
 
131
148
  ## When the owner decides
132
149
 
@@ -139,4 +156,5 @@ contract or material trade-off. The model owns decomposition and repairs broken
139
156
  - `../ultra-think/SKILL.md` — read when one evidenced decision blocks decomposition.
140
157
  - `../ultra-review/SKILL.md` — read after plan files pass mechanical verification.
141
158
  - `../ultra-change/references/execution-grant.md` — read only for grant-activated continuation.
159
+ - `../ultra-status/references/route-contract.md` — owner-visible route, checkpoint, and recovery output.
142
160
  - `references/task-evidence-v2.md` — canonical typed task evidence and task-review contract.
@@ -10,9 +10,26 @@ baseline plus later evidence-backed corrections. Web
10
10
  search is one evidence source, not the workflow: repository files, Git, tests, runtime,
11
11
  maintained documentation, owner decisions, and current primary sources all count.
12
12
 
13
+ ## Route modes
14
+
15
+ | Mode | Entry | Observable exit | Next |
16
+ |---|---|---|---|
17
+ | `baseline` | Explicit owner invocation with a usable Project Brief and no accepted baseline for the boundary | Selected reports, synthesis, specifications, vocabulary, and accepted North Star are read back; unknowns and omissions remain explicit | Recommend `ultra-change` in `intake` mode for the next bounded request |
18
+ | `change-scoped` | Explicit invocation or a valid Execution Grant for one active Change's recorded Research Disposition | The named exit evidence exists and the selected canonical sections are refreshed without changing Change acceptance | Return to the same `ultra-change` in `reconcile` mode |
19
+
20
+ Follow `../ultra-status/references/route-contract.md`. At entry, name the mode, entry
21
+ question, selected coverage, observable stop condition, and return route. Refresh the
22
+ Route Card at each material checkpoint, pause, and exit; lens counts are navigation, not
23
+ proof that Research is semantically complete.
24
+
13
25
  ## Before you start
14
26
 
15
- 1. If model-selected, verify the live execution grant in `../ultra-change/references/execution-grant.md` — a current session-local activation or a stably verified durable work-package grant; without either, stop.
27
+ 1. Resolve `baseline` or `change-scoped` from the artifacts and invocation. A
28
+ model-selected run is valid only for `change-scoped` mode under the live execution
29
+ grant in `../ultra-change/references/execution-grant.md` — a current session-local
30
+ activation or a stably verified durable work-package grant covering the same Change;
31
+ without it, stop and recommend explicit invocation. Baseline adoption is always an
32
+ explicit-entry mode.
16
33
  2. Resolve at most one active `change_id`, then read `.ultra/tasks.json` plus the
17
34
  `context_file` and `## Resume Note` of unfinished tasks whose `change_id` matches it,
18
35
  if any. Archived or abandoned unfinished rows are history, not the current frontier.
@@ -46,9 +63,15 @@ When coverage spans several lenses or the path itself is unclear, read
46
63
  for one already-bounded evidence question. Wayfinding selects the smallest useful
47
64
  coverage; it does not create workflow state or another semantic authority.
48
65
 
66
+ The derived brief records the entry question, selected lenses, deliberate omissions,
67
+ dependencies, source plan, material checkpoints, observable stop condition, and return
68
+ route. Read it on a fresh session instead of restarting completed evidence collection.
69
+
49
70
  Map the brief and unresolved specification sections to seventeen focused evidence
50
- lenses. Confirm the proposed coverage once with the owner. Load one reference
51
- at a time; the parent holds the question map, not every step prompt.
71
+ lenses. Show the proposed coverage once. Pause only when it expands an accepted boundary
72
+ or creates another material checkpoint; a covering Change Research Disposition does not
73
+ need a duplicate confirmation. Load one reference at a time; the parent holds the
74
+ question map, not every step prompt.
52
75
 
53
76
  The first six lenses have real semantic dependencies:
54
77
 
@@ -88,7 +111,8 @@ For scoped Research inside an active Change, answer only its recorded `Research
88
111
  Disposition` question and produce the named exit evidence. Research writes reports and
89
112
  the mapped canonical baseline sections; it does not silently rewrite Change acceptance.
90
113
  Return the evidence paths so `ultra-change` can reconcile the accepted intent before
91
- planning when that contract must change.
114
+ planning when that contract must change. The scoped run's return route is always the
115
+ same stable Change, even when the evidence supports the original intent unchanged.
92
116
 
93
117
  If web access is unavailable, record `[UNVERIFIED: no web access]` and continue with
94
118
  other evidence. Missing tooling lowers confidence; it does not manufacture a blocker.
@@ -115,7 +139,10 @@ or grants execution.
115
139
 
116
140
  Load `references/99-synthesis.md` only after selected reports exist. Read every promoted
117
141
  file back, verify trace anchors and source hashes, and report exact unresolved gaps.
118
- Recommend the next explicit public workflow from the resulting files; do not invoke it.
142
+ For `baseline`, recommend `ultra-change/intake`; for `change-scoped`, return the named
143
+ evidence to `ultra-change/reconcile`. Invoke neither unless the latter continuation is
144
+ covered by the same valid Execution Grant; when it is covered, show the transition Route
145
+ Card first and let Change re-verify its own mode and grant.
119
146
 
120
147
  ## When the owner decides
121
148
 
@@ -136,4 +163,5 @@ selects methods, and updates accepted files inside that frame.
136
163
  - `references/north-star-v2.md` — exact semantic structure, adoption, validation, and
137
164
  supersession contract.
138
165
  - `../ultra-change/references/execution-grant.md` — read only for grant-activated continuation.
166
+ - `../ultra-status/references/route-contract.md` — owner-visible route, checkpoint, and recovery output.
139
167
  - `../ultra-think/references/autonomy-boundary.md` — read before reducing authority.
@@ -9,22 +9,43 @@ This router is read-only. It separates verified files, model inference, and unav
9
9
  evidence, then recommends one explicit public capability without invoking it. It never
10
10
  persists a workflow-position field.
11
11
 
12
+ ## Route modes
13
+
14
+ | Mode | Entry | Observable exit | Next |
15
+ |---|---|---|---|
16
+ | `route` | Owner asks what is current or what to do next | One artifact-derived Route Card names the matched facts, unavailable evidence, and one recommended route | The named explicit route, or `idle` |
17
+ | `history` | Owner asks what changed, was rejected, or was superseded | Relevant decisions, Git revisions, archived/abandoned Changes, and unresolved contradictions are summarized without becoming authority | Return to `route` or the owner-selected revision route |
18
+ | `installation` | Owner asks whether Ultra is discovered and healthy on a Host | Installed version, provenance, Skill/hook discovery, drift, and reachable repair are reported read-only | Recommend the exact install/update/Doctor repair |
19
+ | `delegation` | Owner asks about a worker, handoff, ACP/CLI event, or terminal result | Transport observations and canonical authority are shown separately with a retry/cancel/integration path | Return to the requesting primary route |
20
+ | `recovery` | Authority is absent, ambiguous, stale, malformed, or temporarily unreadable | The earliest unsafe or unavailable fact and cheapest safe repair, retry, cancel, abandon, or fresh-session path are named | Recommend only the repair-capable explicit route |
21
+
22
+ Follow `references/route-contract.md` and use its `UBP Route Card` as the default output,
23
+ not an optional appendix. Expand history, installation, delegation, or recovery details
24
+ only when requested or needed to explain why the normal route is unavailable. Status is
25
+ a `router`: the Owner invokes it for read-only diagnosis, its Host implicit bit remains
26
+ off, and it supplies no continuation authority. Other public Skills derive their own
27
+ cards from the shared reference rather than invoking Status.
28
+
12
29
  ## Before you start
13
30
 
14
31
  1. Read `../ultra-change/references/change-contract.md` and apply its **Active Change
15
32
  authority resolution** before reading any active `intent.md` or relying on a current
16
33
  `change_id`. A positively observed absent `.ultra` uses the existing `ultra-init`
17
- route. Otherwise continue only from the rule's stable zero-or-one result; any typed
18
- diagnostic stops routing until its stated repair or retry succeeds. With one active
19
- Change, read `.ultra/tasks.json`, then tasks whose `change_id` matches it and the
34
+ route. Otherwise continue only from the rule's stable zero-or-one result. A typed
35
+ diagnostic stops semantic routing from an ambiguous active Change, but it does not
36
+ stop Status: switch to `recovery` mode and report the diagnostic plus safe Git and
37
+ directory observations without reading any ambiguous `intent.md` as authority. With
38
+ one valid active Change, read `.ultra/tasks.json`, then tasks whose `change_id` matches it and the
20
39
  frontier task's `context_file` and `## Resume Note`. `.ultra/tasks.json` is the sole
21
40
  task-status authority. A Status or Complexity header in a legacy context is a
22
41
  migration diagnostic; the ledger wins. Historical and abandoned tasks never define
23
42
  the frontier.
24
- 2. Read `.ultra/project-brief.md`, `.ultra/north-star.md`, `CONTEXT.md`, relevant
25
- `.ultra/decisions/`, specifications, active, archived, or abandoned Changes, and
26
- evidence. An abandoned Change supplies historical boundary and recovery context;
27
- it never defines the current route.
43
+ 2. After stable authority resolution, read `.ultra/project-brief.md`,
44
+ `.ultra/north-star.md`, `CONTEXT.md`, relevant `.ultra/decisions/`, specifications,
45
+ active, archived, or abandoned Changes, and evidence. In `recovery` mode, read only
46
+ unaffected canonical files and safe directory/Git observations; do not interpret an
47
+ ambiguous active intent. An abandoned Change supplies historical boundary and
48
+ recovery context; it never defines the current route.
28
49
  3. Inspect Git `HEAD`, worktree status, and installed host manifests without repair.
29
50
  4. When the active Change records a `durable work-package` Execution Grant, report it
30
51
  as recorded authorization data — grant id, cited decision, and its recorded
@@ -36,6 +57,8 @@ persists a workflow-position field.
36
57
 
37
58
  ## Definition of done
38
59
 
60
+ - Emit the current Route Card with an exact mode, observable exit, unfinished work, and
61
+ one next route or safe recovery path.
39
62
  - Evaluate the artifact route in order and name the evidence supporting the match.
40
63
  - Keep stale test evidence, dirty worktree state, baseline gaps, and task graph risks
41
64
  visible without converting them into semantic failure.
@@ -153,6 +176,12 @@ and unresolved `FP-*`/`NS-*`/`HC-*` reference. A mismatch is stale evidence, nev
153
176
  mechanical verdict about truth or permission; supersession does not delete prior task,
154
177
  review, Test, or delivery evidence.
155
178
 
179
+ On a fresh session, use the current Change's exact matching contexts and closing Resume
180
+ Note to reconstruct the card. Do not rerun completed Research or infer route from chat
181
+ memory. In `history` mode, distinguish mutable draft edits from superseding accepted
182
+ decision records and keep rejected or abandoned alternatives visible when they explain
183
+ the current boundary.
184
+
156
185
  ## Surface risk and installation health
157
186
 
158
187
  List unmet task dependencies, more than one matching `in_progress` task under the
@@ -173,6 +202,7 @@ Contradictory facts remain visible instead of being resolved by routing heuristi
173
202
  ## References
174
203
 
175
204
  - `../ultra-change/references/change-contract.md` — canonical Active Change authority resolution.
205
+ - `references/route-contract.md` — canonical Route Card, checkpoint, continuation, and recovery contract.
176
206
  - `../ultra-think/SKILL.md` — read only when contradictory evidence creates one real
177
207
  decision rather than a mechanical repair.
178
208
  - `../ultra-think/references/autonomy-boundary.md` — read before recommending a route