ultra-builder-pro-cli 0.26.0 → 0.26.2

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 (48) hide show
  1. package/.ultra-template/changes/abandoned/.gitkeep +0 -0
  2. package/.ultra-template/contexts/TEMPLATE.md +7 -0
  3. package/.ultra-template/north-star.md +20 -31
  4. package/.ultra-template/project-brief.md +28 -0
  5. package/.ultra-template/specs/product.md +4 -0
  6. package/.ultra-template/specs/research-distillate.md +8 -0
  7. package/.ultra-template/test-report.json +1 -0
  8. package/CHANGELOG.md +131 -1
  9. package/README.md +61 -29
  10. package/bin/delegate-worker.cjs +5 -0
  11. package/bin/delegate.cjs +7 -0
  12. package/docs/ARCHITECTURE.md +36 -10
  13. package/docs/ARTIFACT-AUTHORITY.md +42 -13
  14. package/docs/DECISIONS.md +24 -5
  15. package/docs/PHILOSOPHY.md +45 -12
  16. package/docs/PLUGIN-ISOLATION-CONTRACT.md +6 -3
  17. package/docs/RUNTIME-COMPAT-MATRIX.md +43 -1
  18. package/docs/SKILL-AUTHORING.md +10 -6
  19. package/docs/WORKFLOW-LIFECYCLE.md +103 -39
  20. package/hooks/README.md +12 -5
  21. package/hooks/_common.py +54 -5
  22. package/hooks/block_dangerous_commands.py +116 -10
  23. package/hooks/session_context.py +34 -8
  24. package/package.json +1 -1
  25. package/skills/ultra-change/SKILL.md +59 -52
  26. package/skills/ultra-change/references/change-contract.md +65 -7
  27. package/skills/ultra-delegate/SKILL.md +21 -3
  28. package/skills/ultra-delegate/references/delegation-contract.md +10 -2
  29. package/skills/ultra-deliver/SKILL.md +63 -21
  30. package/skills/ultra-deliver/references/baseline-reconciliation.md +5 -3
  31. package/skills/ultra-dev/SKILL.md +33 -14
  32. package/skills/ultra-grilling/SKILL.md +63 -24
  33. package/skills/ultra-grilling/references/reframing.md +72 -0
  34. package/skills/ultra-init/SKILL.md +62 -79
  35. package/skills/ultra-init/references/brownfield-adoption.md +23 -40
  36. package/skills/ultra-plan/SKILL.md +48 -24
  37. package/skills/ultra-research/SKILL.md +91 -62
  38. package/skills/ultra-research/references/{03-competitive-landscape.md → 03-alternatives.md} +6 -6
  39. package/skills/ultra-research/references/22-success-metrics.md +8 -4
  40. package/skills/ultra-research/references/99-synthesis.md +8 -1
  41. package/skills/ultra-research/references/wayfinding.md +42 -0
  42. package/skills/ultra-review/SKILL.md +31 -3
  43. package/skills/ultra-status/SKILL.md +62 -32
  44. package/skills/ultra-tdd/SKILL.md +5 -2
  45. package/skills/ultra-test/SKILL.md +31 -12
  46. package/skills/ultra-test/scripts/worktree_digest.cjs +42 -8
  47. package/skills/ultra-think/SKILL.md +5 -10
  48. package/skills/ultra-think/references/interaction-boundary.md +2 -1
@@ -10,29 +10,39 @@ them, how staleness is detected, and how recovery works in Ultra Builder Pro v0.
10
10
  3. The model may interpret, decompose, investigate, and edit inside the authorized frame.
11
11
  4. Generated observations are disposable and never silently promoted.
12
12
  5. Git supplies revision identity, history, archive moves, comparison, and rollback.
13
+ 6. A Change keeps one stable `change_id`; directory position records lifecycle, not identity.
13
14
 
14
15
  ## Canonical artifacts
15
16
 
16
17
  | Artifact | Canonical content | Primary writer | Required readers | Staleness or conflict signal |
17
18
  |---|---|---|---|---|
18
- | `.ultra/north-star.md` | Owner's one-line goal and hard constraints | `ultra-init`, owner | every workflow; session Hook | owner correction or explicit replacement |
19
- | `.ultra/specs/product.md` | Product behavior and acceptance | research/change/delivery reconciliation | change, plan, dev, test, review, delivery | source/evidence conflict or unresolved marker |
20
- | `.ultra/specs/architecture.md` | Boundaries, authority, consumers, failure and recovery | research/change/delivery reconciliation | change, plan, dev, test, review, delivery | live-path evidence conflicts with text |
21
- | `.ultra/specs/discovery.md` | observations, unknowns, drift, and evidence queue | init/research | research, change, status | evidence resolves or overturns an entry |
19
+ | `.ultra/project-brief.md` | Raw owner intake, broad outline, explicit inputs, and open Research questions | `ultra-init`, owner correction | research, status; session Hook before an accepted baseline exists | owner correction or a recovered legacy one-line; never rewritten as researched truth |
20
+ | `.ultra/north-star.md` | Accepted project direction, outcome or metric decision, hard constraints, and exclusions | `ultra-research` after owner acceptance; owner correction | every workflow; session Hook | accepted correction, superseding decision, or evidence conflict |
21
+ | `.ultra/specs/product.md` | Product behavior and acceptance | research establishes; change/delivery reconcile touched sections | change, plan, dev, test, review, delivery | source/evidence conflict or unresolved marker |
22
+ | `.ultra/specs/architecture.md` | Boundaries, authority, consumers, failure and recovery | research establishes; change/delivery reconcile touched sections | change, plan, dev, test, review, delivery | live-path evidence conflicts with text |
23
+ | `.ultra/specs/discovery.md` | observations, unknowns, drift, and evidence queue | research; change for its scoped delta | research, change, status | evidence resolves or overturns an entry |
22
24
  | `.ultra/specs/research-distillate.md` | bounded synthesis of specification state | `ultra-research` | change, plan, delivery | stored source blob hash differs from Git blob hash |
23
- | `CONTEXT.md` | ubiquitous language and relationships | `ultra-domain-modeling` | every workflow and test naming | source/product use reveals ambiguity |
24
- | `.ultra/changes/active/<id>/intent.md` | one bounded requested outcome | `ultra-change`; Planning Posture by `ultra-plan` | plan, dev, test, review, status, delivery | acceptance or scope changes |
25
- | `.ultra/tasks.json` | task identity, graph, status, trace, and context path | `ultra-plan` / `ultra-dev` | every user workflow and context Hook | ledger and context status disagree |
25
+ | `CONTEXT.md` | ubiquitous language and relationships | `ultra-domain-modeling`, first called by research and later by any qualifying workflow | every workflow and test naming | source/product use reveals ambiguity |
26
+ | `.ultra/changes/{active,archive,abandoned}/<id>/intent.md` | one bounded requested outcome, reconciliation, Research Disposition, stable identity, and exact Abandonment closure when abandoned | `ultra-change`; Planning Posture by `ultra-plan` | active: research through delivery; all states: status and future Change history | more than one active Change, duplicate id across positions, missing Abandonment closure, or acceptance/scope change |
27
+ | `.ultra/tasks.json` | append-only task ledger: globally unique identity, stable `change_id`, same-Change graph, status, trace, and context path | `ultra-plan` / `ultra-dev` | every user workflow and context Hook | dependency crosses Change, or ledger/context status disagrees |
26
28
  | task `context_file` | acceptance, seams, implementation, evidence pointers, Completion, Resume Note | plan/dev | dev, test, review, status, delivery, resume | differs from ledger or current implementation |
27
29
  | `.ultra/decisions/<id>.md` | durable consequential owner decision | `ultra-think` after acceptance | every workflow in scope | superseded by a newer decision file |
28
30
  | `.ultra/evidence/<task-id>/...` | command output and bounded task evidence | `ultra-dev` | review, test, delivery | evidence revision differs from affected code |
29
- | `.ultra/test-report.json` | whole-system audit at one Git commit and worktree digest | `ultra-test` | status and delivery | `git_commit` or worktree digest differs from current checkout |
31
+ | `.ultra/test-report.json` | whole-system audit, findings, and owner disposition for one Change/task/intent/product snapshot | `ultra-test`; `ultra-deliver` may add owner disposition without changing findings or `passed` | status and delivery | `change_id`, `task_ids`, `intent_digest`, `git_commit`, or worktree digest differs |
30
32
  | `.ultra/changes/active/<id>/delivery.md` | outcome, docs, verification, review, debt, risk, recovery, effects | `ultra-deliver` | owner and archived Change history | active evidence or accepted scope changes |
31
- | `.ultra/research/<run-id>/...` | cited investigation reports | `ultra-research` | specs, change, plan, delivery | newer sources or later superseding run |
33
+ | `.ultra/research/<run-id>/<step-id>.md` | cited investigation report for one selected lens | `ultra-research` | specs, change, plan, delivery | newer sources or later superseding run |
32
34
 
33
35
  The repository files may use prose, tables, or JSON as appropriate. The format is not
34
36
  authority by itself; the canonical path and accepted writer contract are.
35
37
 
38
+ The append-only task ledger preserves sequential Change history. Current readers select
39
+ only rows whose `change_id` matches the one unique active Change. Moving its directory
40
+ to archive or abandoned never rewrites task identity, and an unfinished historical row
41
+ never becomes current merely because of its status. Before an abandoned move,
42
+ `ultra-change` appends `## Abandonment` with the owner decision, reason, reusable
43
+ evidence, and recovery or successor. Future Change reconciliation and Status consume
44
+ that record as history, not as accepted current intent.
45
+
36
46
  Every completed task has exactly one `.ultra/evidence/<task-id>/evidence.json` with
37
47
  schema `ultra-task-evidence-v1`. It records `task_id`, forty-character `git_head`, exact
38
48
  commands (`command`, `exit_code`, `evidence_ref`), all six evidence dimensions,
@@ -51,10 +61,24 @@ Pure file state uses three mechanisms:
51
61
  A state field records a mechanically checkable fact. Route selection remains a model
52
62
  judgment. Do not add a workflow-position field merely to decide which Skill should run.
53
63
 
64
+ At most one Change is active in one worktree. Zero active Changes is valid before a new
65
+ request and after delivery; completed current tasks may remain active while awaiting
66
+ Test or Deliver. More than one active directory is a conflict for owner/model repair,
67
+ not a reason for code to select the first entry.
68
+
54
69
  Task completion uses a dual write: `.ultra/tasks.json` and the task context header must
55
70
  agree. The writer reads both back. A mismatch is a visible recovery diagnostic; neither
56
71
  side silently wins.
57
72
 
73
+ ## Single-writer boundary
74
+
75
+ One primary host model writes canonical `.ultra` files in a worktree. Native review
76
+ workers are read-only sensors, and delegated CLIs write only declared non-`.ultra`
77
+ roots in isolated registered worktrees; their findings return to the primary writer.
78
+ Parallel implementation uses separate worktrees and explicit Git integration. Ultra
79
+ does not add a lock service or semantic state machine to make concurrent canonical
80
+ writes appear safe.
81
+
58
82
  ## Decisions and reductions
59
83
 
60
84
  Write a durable decision only when it is difficult to reverse, surprising without
@@ -80,7 +104,10 @@ and provenance support the claim. The evidence is retained or cited; it is not c
80
104
  into a second semantic ledger.
81
105
 
82
106
  A test result is current only for the code and environment it exercised. A report must
83
- carry the exact command, exit code, and Git commit. Missing or stale evidence remains
107
+ carry the exact command, exit code, stable Change id, exact current task ids, intent
108
+ SHA-256, Git commit, and product-worktree digest. Delivery metadata and moving the same
109
+ Change between active and archive do not alter the product digest; changing intent
110
+ bytes does alter `intent_digest`. Missing or stale evidence remains
84
111
  `not_run`, `unknown`, or `stale`; it is never inferred as passing.
85
112
 
86
113
  ## Derived artifacts
@@ -89,6 +116,7 @@ These paths are intentionally non-authoritative:
89
116
 
90
117
  | Path | Purpose | Recovery |
91
118
  |---|---|---|
119
+ | `.ultra/research/<run-id>/brief.md` | optional Wayfinding question map for a multi-lens Research run | rebuild from Project Brief, accepted authority, evidence needs, and owner checkpoints |
92
120
  | `.ultra/.runtime/compact-snapshot.md` | compaction acceleration | rebuild from files and Git |
93
121
  | `.ultra/.runtime/delegations/` | delegated process receipts and logs | inspect result or rerun with new id |
94
122
  | `.ultra/.runtime/worktrees/` | delegated checkout locations | inspect Git worktrees and remove safely |
@@ -104,9 +132,10 @@ those paths cannot delete accepted product intent, task contracts, or decisions.
104
132
  After interruption or host change:
105
133
 
106
134
  1. identify the repository root and current `HEAD`;
107
- 2. read `.ultra/tasks.json`;
108
- 3. read the unfinished task's full context and closing Resume Note;
109
- 4. read `CONTEXT.md`, relevant decisions, active Change, specifications, and evidence;
135
+ 2. resolve zero or one active `change_id`, then read `.ultra/tasks.json`;
136
+ 3. select only matching tasks and read the frontier task's full context and closing Resume Note;
137
+ 4. read the Project Brief, accepted North Star, `CONTEXT.md`, relevant decisions, active
138
+ Change, specifications, and evidence;
110
139
  5. inspect the working tree and compare it with Completion and evidence claims;
111
140
  6. repair any ledger/context mismatch explicitly before relying on status;
112
141
  7. continue through the next observable acceptance boundary.
package/docs/DECISIONS.md CHANGED
@@ -21,6 +21,16 @@ two canonical callers or it is inlined.
21
21
  This keeps reusable reasoning in one place without turning it into another user-facing
22
22
  route or custom-agent registry.
23
23
 
24
+ ## Intake, baseline, and delta
25
+
26
+ Init preserves raw owner intake in the Project Brief; Research establishes the accepted North Star, domain language, and specification baseline; Change reconciles only the sections touched by one requested delta.
27
+
28
+ The optional Research Wayfinding brief is derived navigation, not a fifteenth Skill or
29
+ semantic authority. The first six Research references remain dependency-aware semantic
30
+ lenses. Grilling controls how caller-named questions are asked, Think stress-tests one
31
+ consequential decision, and Domain Modeling promotes settled vocabulary. This prevents
32
+ Init from consuming Research while keeping reusable methods in one canonical place.
33
+
24
34
  ## Rule-side assets travel with Skills
25
35
 
26
36
  `.ultra/` contains project data only. Reusable executable examples live under
@@ -37,8 +47,14 @@ Directory position and explicit fields record mechanically checkable facts. The
37
47
  model reads those facts and chooses the next route. There is no persisted “current
38
48
  workflow stage” whose value can override the actual files.
39
49
 
40
- Task status is written to both the ledger and context, then read back. Change archive
41
- is a `git mv`. Test-report freshness compares `git_commit` with `HEAD`.
50
+ Task status is written to both the ledger and context, then read back. Tasks retain a
51
+ stable `change_id` in an append-only ledger; current readers select only rows matching
52
+ the one active Change. Archive or abandonment is a `git mv`. Test-report freshness
53
+ compares Change id, current task ids, intent digest, `git_commit`, and product-worktree
54
+ digest with the current checkout. Deliver reconciles first and finalizes only while
55
+ that complete snapshot remains current. A separate request cannot create a second
56
+ active Change; it waits, exits the current Change, or is explicitly reconciled into the
57
+ same id.
42
58
 
43
59
  ## Three independent integration defences
44
60
 
@@ -52,15 +68,18 @@ No single sensor is promoted into a semantic completion gate.
52
68
 
53
69
  The hook surface is session context, mid-workflow acceptance recall, compact snapshot,
54
70
  post-edit evidence observation, and dangerous-command protection. Every hook is silent
55
- without `.ultra/`. Only a narrow named destructive effect can be denied, and its repair
56
- is authorization scoped to the exact command digest.
71
+ without `.ultra/`. Additive protected-branch publication is advisory because the
72
+ portable hook cannot receive every host's trusted owner-approval receipt. History
73
+ rewrites, branch deletion, and the narrower named destructive effects can be denied;
74
+ their repair is authorization scoped to the exact command digest.
57
75
 
58
76
  ## Delegation is a process boundary
59
77
 
60
78
  `ubp delegate run` starts a supported CLI with an immutable instruction, explicit
61
79
  permission JSON, and named worktree. Files are the cross-host state. The parent reads a
62
80
  stable terminal result instead of worker chatter. Delegation adds no semantic store and
63
- no authority.
81
+ no authority. The instruction selects task execution, scoped Research evidence, or
82
+ aggregate Change review/verification; only task execution requires a task row.
64
83
 
65
84
  ## Installation isolation
66
85
 
@@ -43,9 +43,11 @@ one or more.
43
43
 
44
44
  ### C1 — Goal-Always-Present
45
45
 
46
- The agent never stops seeing the north-star. Every hook trigger that costs context budget injects:
47
- the project one-liner plus the current task's acceptance criteria. The cost of repetition is
48
- always less than the cost of drift.
46
+ The agent never stops seeing the current steering contract. Before Research accepts a
47
+ baseline, the session Hook injects the raw Project Brief fallback. After Research, it
48
+ injects the accepted North Star: Project Direction, any settled North Star Outcome, and
49
+ Hard Constraints. Current task acceptance is appended in both cases. The cost of
50
+ repetition is always less than the cost of drift.
49
51
 
50
52
  > **Test**: pick a random in-progress task, ask the agent "what's the acceptance criteria?" — if
51
53
  > it cannot answer in one sentence, this commandment is broken.
@@ -61,16 +63,20 @@ agents to find loopholes (rename `mock` to `stub`, etc.). The cheaper path must
61
63
 
62
64
  ### C3 — Sensors not Blockers
63
65
 
64
- Hooks emit signal; agents and users decide. Block only the **truly irreversible**:
66
+ Hooks emit signal; agents and users decide. Block only the **truly irreversible or
67
+ privileged destructive** effects for which the hook has an exact repair:
65
68
 
66
- - `git push` to protected branches
67
69
  - Funds transfer / on-chain transactions
68
- - DB migrations / `DROP` / `TRUNCATE`
70
+ - Protected-branch history rewrite or deletion
71
+ - `DROP` / `TRUNCATE`
69
72
  - Hardcoded secret commit
70
73
  - Arbitrary code execution driven by user input
71
74
 
72
- Everything else is advisory on stderr — the work stands, the signal is delivered, the agent
73
- proceeds.
75
+ Additive protected-branch publication and database migrations are advisory: the former
76
+ remains recoverable through Git and the portable hook cannot receive every host's
77
+ trusted approval receipt; the latter is not mechanically classifiable as reversible or
78
+ irreversible. The work stands, the signal is delivered, and the agent proceeds inside
79
+ the owner's authorized frame.
74
80
 
75
81
  > **Why this is absolute**: hard final gates and hard pre-commit gates each produced the same
76
82
  > over-correction loop in v7 — the agent weakened tests to escape the gate and drifted from the
@@ -102,6 +108,27 @@ boundary surfaces to the user.
102
108
  feature flags, in-memory replacing real persistence, scope reduction, external or irreversible
103
109
  effects
104
110
 
111
+ **Which decisions reach the owner.** Inside/Crossing above sorts actions. Read from the owner's
112
+ side, the same boundary sorts decisions into three:
113
+
114
+ | Type | Definition | Handling |
115
+ |---|---|---|
116
+ | taste | no objectively correct answer; only the owner's preference settles it | always ask |
117
+ | crossing | objectively decidable, but the consequence is irreversible | always ask |
118
+ | everything else | has an objective answer, or is cheap to reverse | decide and proceed; asking is the error |
119
+
120
+ How much lands in the third row is a function of how sharp the north star is. With constraints
121
+ that can veto a concrete decision, most execution-time questions are answered by reading them.
122
+ With vague ones, "does this cross a boundary?" cannot be decided at all, so every question
123
+ degrades into taste and reaches the owner. **Interrupt frequency measures the north star, not
124
+ the work.** Frequent interruptions mean going back to sharpen constraints, not asking faster.
125
+
126
+ **Boundaries grow; they do not change.** Adding a hard constraint or a non-goal mid-flight is
127
+ routine and needs no permission — the frame got sharper and no prior promise broke. Editing or
128
+ deleting one is a REDUCTION under the test below. This is what makes iteration five cheaper than
129
+ iteration one: the frame accumulates, and the share of decisions the model settles alone rises
130
+ with it.
131
+
105
132
  **Operational test for spec changes.** When implementation and spec disagree, classify the change
106
133
  before touching the spec. Do not classify by intent — classify by asking one question that can be
107
134
  checked against the file:
@@ -119,6 +146,12 @@ not convert a REDUCTION into a CORRECTION; the rationale goes into the question
119
146
  This is the mechanism by which specs shrink silently, so it is the one place the model must not
120
147
  be allowed to self-certify.
121
148
 
149
+ **Not to be confused with Planning Posture.** A Change's `## Planning Posture` uses
150
+ EXPAND / SELECTIVE / HOLD / REDUCE to say how much work to plan right now. That is a scope
151
+ decision about the future and is freely reversible. The classification above is about the past:
152
+ whether a promise already made still holds. `REDUCE` the plan is routine; a `REDUCTION` of
153
+ commitments stops the work and goes to the owner.
154
+
122
155
  > **Test**: any boundary-crossing action must trigger an owner question, an active task
123
156
  > `## Change Log` entry, or an accepted `.ultra/decisions/<id>.md`.
124
157
 
@@ -154,15 +187,15 @@ Skill instruction. Do not touch it casually.
154
187
 
155
188
  | Consumer | Reads | Source of truth | Failure mode if drifted |
156
189
  |---|---|---|---|
157
- | `session_context` | headings `## One-line`, `## Hard Constraints` | `.ultra-template/north-star.md` | SessionStart shows no goal; C1 dies |
158
- | `session_context` | active `in_progress` task → its context | `tasks.json[].context_file` | acceptance criteria never surfaced |
190
+ | `session_context` | North Star headings `## Project Direction`, `## North Star Outcome`, `## Hard Constraints`; Project Brief `## One-line`, or legacy North Star `## One-line` | `.ultra-template/north-star.md`, `.ultra-template/project-brief.md`, and the Hook's legacy-read branch | SessionStart shows no accepted North Star or Project Brief fallback; C1 dies |
191
+ | `session_context` | unique active `change_id` → one matching `in_progress` task, else first dependency-ready `pending` task → its context | active Change directory plus `tasks.json[].change_id`, dependencies, status, and `context_file` | abandoned or blocked acceptance is injected, or current acceptance never surfaces |
159
192
  | `mid_workflow_recall` | heading `## Acceptance Criteria` | `.ultra-template/contexts/TEMPLATE.md` | hook injects nothing; C1 dies silently |
160
193
  | `ultra-tdd` | path `references/templates/*` | `skills/ultra-tdd/references/templates/` | guidance points at a missing runnable alternative; C2 dies |
161
- | `post_edit_guard` | writes `.ultra/progress/<task-id>.json` | `tasks.json[].id`, created on demand | mechanical observations disappear; C4 weakens |
194
+ | `post_edit_guard` | writes `.ultra/progress/<task-id>.json` for the active Change's current task | active Change directory plus `tasks.json[].change_id` and `id`, created on demand | historical work receives current observations; C4 weakens |
162
195
  | `ultra-dev` and `post_edit_guard` | 6 keys: `tests_written`, `tests_passed`, `persistence_real`, `feature_flags_audit`, `vertical_slice`, `spec_trace` | the six-dimension table in `skills/ultra-dev/SKILL.md` | sensor and workflow report different evidence |
163
196
  | planning and status | marker `[NEEDS CLARIFICATION]` | `.ultra-template/specs/*.md` | unresolved product truth is hidden |
164
197
  | `ultra-plan` / `ultra-dev` / hooks | `trace_to` form `.ultra/specs/file.md#anchor` | `tasks.json[].trace_to` + GFM heading slugify | traces appear resolved when their heading is absent |
165
- | `ultra-deliver` / `ultra-status` | field `git_commit` | `.ultra/test-report.json` | stale test results pass as current |
198
+ | `ultra-deliver` / `ultra-status` | fields `change_id`, `task_ids`, `intent_digest`, `git_commit`, and `worktree.diff_digest` | `.ultra/test-report.json` plus `worktree_digest.cjs` | stale Change, intent, task set, or product results pass as current |
166
199
  | `compact_context` | `.ultra/.runtime/compact-snapshot.md` | derived from canonical files and Git | compact recovery loses acceleration, not authority |
167
200
  | every hook | existence of `.ultra/` | the project directory | Ultra taxes projects that never opted in (see `docs/PLUGIN-ISOLATION-CONTRACT.md`) |
168
201
  | `ultra-init` | the project data skeleton | `.ultra-template/` and the exact file list in its Skill | later Skills read missing authority paths; C1 dies |
@@ -70,9 +70,12 @@ Every hook resolves the current project and checks for `.ultra/` before reading,
70
70
  writing, injecting context, or denying an effect. Without `.ultra/`, it emits no stdout,
71
71
  exits zero, and leaves the project untouched.
72
72
 
73
- The only hook denial is a named dangerous shell effect in an active Ultra project. The
74
- denial identifies the protected effect and supplies an exact-command SHA-256
75
- authorization path. All other hook failures are fail-open diagnostics.
73
+ The only hook denial is a named destructive shell effect in an active Ultra project.
74
+ The denial identifies the protected effect and supplies an exact-command SHA-256
75
+ authorization path. Additive protected-branch publication is an advisory observation
76
+ because a portable hook cannot consume every host's trusted owner-approval receipt;
77
+ history rewrites and branch deletion remain guarded. All other hook failures are
78
+ fail-open diagnostics.
76
79
 
77
80
  ## Project data boundary
78
81
 
@@ -60,7 +60,7 @@ host feature OpenCode does not expose.
60
60
  | mid-workflow recall | yes | handles `apply_patch` | native bridge | normalized | executed |
61
61
  | compact context | pre/start | pre/post | native compact event | pre/post | pre-compact |
62
62
  | post-edit observation | Write/Edit | Write/Edit/`apply_patch` | write/edit/patch | Write/Edit | Write/Edit/patch |
63
- | dangerous command guard | Bash | Bash | bash | Bash | Bash deny mapping |
63
+ | dangerous command guard | Bash advisory/deny | Bash advisory/deny | bash advisory/deny | Bash advisory/deny | Bash allow/deny mapping |
64
64
 
65
65
  All hooks share the same `.ultra/` idle guard. Wire adapters normalize payload and
66
66
  output fields only; they do not change semantic policy. Codex installation health and
@@ -99,3 +99,45 @@ inherits the same isolated `HOME` and `CODEX_HOME`. Grok native registration is
99
99
  only in explicit isolated test mode. Lifecycle tests also require the isolated config
100
100
  and fake HOME to contain zero children after uninstall, while separate ownership tests
101
101
  prove that pre-existing empty Codex and Kimi registries survive.
102
+
103
+ ## Authenticated cross-host continuation evidence
104
+
105
+ On 2026-08-03, one deliberately narrow task was run in an isolated Git repository to
106
+ test the product's central recovery claim with real authenticated models. This was a
107
+ continuation drill, not a full project workflow or a delegation receipt test.
108
+
109
+ Both hosts used globally installed artifacts from the same clean source candidate:
110
+
111
+ - source commit: `c473a248bde2afce77591f2ba382246d420b5c72`;
112
+ - worktree digest: `e83bdcbe2905cf02cb06cb0219127f6ce0400484331a6e9fc95622bbe24b44bd`;
113
+ - Doctor: Claude healthy with 83 assets and zero issues; Codex healthy with 99 assets
114
+ and zero issues, with optional hooks still `user_review_required`.
115
+
116
+ The seed repository had one passing smoke test, one pending task, one mapped Change
117
+ acceptance ID, and seed HEAD `cf27d62aeeae353e0650413de6d9a118b89a0406`.
118
+
119
+ | Phase | Execution boundary | Observed result |
120
+ |---|---|---|
121
+ | Claude | One print-mode call, `acceptEdits`, no persistent session, empty MCP config, explicit file and local-test tools, USD 1.00 cap | Exit 0 at USD 0.741367 with zero web requests. It changed only the task ledger/context, added `test/slug.test.cjs`, and allowed the hook to write disposable progress. `src/slug.cjs` and completion evidence remained untouched. The task test exited 1 with actual `hello,-world!` versus expected `hello-world`; both task surfaces read `in_progress`, and the Resume Note named the exact next action. |
122
+ | Codex | One ephemeral `workspace-write` call with sandbox network disabled and no conversation from Claude | Exit 0. It found and read the installed `ultra-dev` Skill, recovered the single task from Git and `.ultra/`, reproduced the same red, changed only the intended implementation, then passed the task test 1/1 and `npm test` 2/2. It wrote the three-command canonical evidence record and logs, completed both task status surfaces, and filled Completion and the final Resume Note. |
123
+ | Independent check | Local commands after both model calls | `node --test test/slug.test.cjs` passed 1/1, `npm test` passed 2/2, `git diff --check` passed, and a structural check confirmed one completed task, six evidence dimensions, three existing command-log references, and matching ledger/context state. |
124
+
125
+ The Codex process emitted non-blocking diagnostics for an older local model-cache
126
+ schema and an unauthenticated user-config MCP startup. No MCP result was consumed and
127
+ no external effect occurred; all task actions used local file and shell tools. This
128
+ means the drill proves file-backed Claude-to-Codex continuation even while Codex hooks
129
+ remain untrusted, but it does not claim that arbitrary user configuration starts
130
+ without unrelated host diagnostics.
131
+
132
+ The result establishes one real end-to-end example of cross-host resume without a
133
+ shared conversation, database, MCP authority, daemon, or generated prompt projection.
134
+ It does not establish output quality for every model, host, repository, or task shape.
135
+ Task-level `ultra-review` and commits were intentionally excluded from the drill so the
136
+ two host calls tested only the handoff boundary.
137
+
138
+ Two older `.ultra` evidence snapshots originally named the completed WIP by its former
139
+ path. The current-path artifact contract requires every reference to resolve in the
140
+ checkout, so those two references now point here while their 2026-08-01 status and
141
+ limitations remain explicitly historical. The original WIP is still recoverable from
142
+ their pinned source commit `3f99189bc68697262cd90444685ac2d4857139c4` with
143
+ `git show`; the live `docs/wip/` directory contains no unfinished document.
@@ -41,14 +41,15 @@ Every Skill has one outcome-led title and these semantic sections:
41
41
  ## References
42
42
  ```
43
43
 
44
- User workflows begin by reading `.ultra/tasks.json`, the unfinished task's
45
- `context_file` and Resume Note, `CONTEXT.md`, and relevant decisions. They name the
46
- files they write and read them back. Completion criteria must be observable without a
47
- semantic validator.
44
+ User workflows first resolve at most one active `change_id`, then read only matching
45
+ rows from `.ultra/tasks.json`, the frontier task's `context_file` and Resume Note,
46
+ `CONTEXT.md`, and relevant decisions. Historical or abandoned rows never become current
47
+ from status alone. They name the files they write and read them back. Completion
48
+ criteria must be observable without a semantic validator.
48
49
 
49
50
  Use positive leading words consistently: tracer bullet, seam, deep module, red,
50
- frontier, and fog of war. Explain a branch by its checkable result, not the model's
51
- reason for choosing it.
51
+ frontier, and research boundary. Explain a branch by its checkable result, not the
52
+ model's reason for choosing it.
52
53
 
53
54
  ## Progressive disclosure
54
55
 
@@ -56,6 +57,9 @@ Keep resident `SKILL.md` short enough to load on every invocation. Move focused
56
57
  into `references/` and deterministic validation or waiting into `scripts/`.
57
58
 
58
59
  - Load one research step or review lens at a time.
60
+ - Keep Research's semantic lenses and optional Wayfinding map inside
61
+ `ultra-research/references/`; they are stages of that public workflow, not reusable
62
+ model-invoked Skills.
59
63
  - Keep one canonical copy of grilling, TDD, review, domain language, and autonomy rules.
60
64
  - Cross-reference another model-invoked Skill by relative path.
61
65
  - Do not hide the primary workflow in a script.
@@ -6,9 +6,9 @@ criteria; repository files record facts; the host model chooses the route.
6
6
  ## Capability flow
7
7
 
8
8
  ```text
9
- ultra-init
10
- ├─ unresolved external claims ─► ultra-research
11
- └─ bounded requested outcome ──► ultra-change
9
+ ultra-init ──raw Project Brief──► ultra-research ──accepted baseline──► ultra-change
10
+ ▲ │
11
+ └──── scoped consequential evidence gap ────┘
12
12
 
13
13
  ultra-change ─► ultra-plan ─► ultra-dev (per task) ─► ultra-test ─► ultra-deliver
14
14
  ▲ │ │
@@ -19,51 +19,78 @@ ultra-delegate orthogonal bounded execution on another CLI
19
19
  ```
20
20
 
21
21
  Arrows are recommendations, not automatic invocation. The owner explicitly selects
22
- each public workflow.
22
+ each public workflow. Delivery archives one stable `change_id`; the next request opens
23
+ a new active id while prior task rows remain in the append-only ledger.
23
24
 
24
25
  ## Common entry contract
25
26
 
26
27
  Every user-invoked Skill reads, in order:
27
28
 
28
- 1. `.ultra/tasks.json`;
29
- 2. the unfinished task's `context_file` and closing `## Resume Note`;
30
- 3. `CONTEXT.md` and relevant `.ultra/decisions/`;
31
- 4. the active Change, specifications, evidence, and Git state relevant to its scope.
29
+ 1. zero or one `.ultra/changes/active/<change_id>/intent.md`; more than one is a conflict;
30
+ 2. `.ultra/tasks.json`, selecting only tasks whose `change_id` matches that active id;
31
+ 3. the matching frontier task's `context_file` and closing `## Resume Note`;
32
+ 4. `.ultra/project-brief.md`, the accepted `.ultra/north-star.md`, `CONTEXT.md`, and
33
+ relevant `.ultra/decisions/`, where those artifacts already exist;
34
+ 5. the active Change, specifications, evidence, maintained documentation, and Git state
35
+ relevant to its scope.
32
36
 
33
37
  Missing files produce a precise recovery or initialization recommendation. They do not
34
38
  cause the Skill to invent a state transition.
35
39
 
36
40
  ## Initialization
37
41
 
38
- `ultra-init` distinguishes owner authorization from claims requiring evidence. It
39
- creates the file skeleton, preserves unknowns as `[NEEDS CLARIFICATION]`, initializes
40
- Git when absent, and records only repository-observable brownfield facts. It does not
41
- perform research or launch another workflow.
42
+ Init writes the raw Project Brief and stable empty skeleton. `ultra-init` preserves the
43
+ owner's one-line request, broad outline, explicit inputs, and open questions without
44
+ turning them into validated product truth. It initializes Git when absent and may
45
+ preserve repository-observable brownfield facts as Research inputs. It does not define
46
+ success, establish the North Star, create `CONTEXT.md`, populate specifications, or
47
+ launch another workflow.
42
48
 
43
49
  ## Research
44
50
 
45
- `ultra-research` maps unresolved claims to the smallest useful subset of seventeen
46
- focused references. Reports are written immediately. Three material checkpoints can
47
- change later scope; the owner resolves those checkpoints. The final distillate records
48
- Git blob hashes of the specifications it summarizes.
51
+ Research turns the brief into an accepted North Star and evidence-backed baseline.
52
+ `ultra-research` uses Wayfinding only when a multi-lens path is unclear, then maps the
53
+ question to the smallest useful subset of seventeen focused references. The first six
54
+ are semantic lenses with real dependencies: `00` precedes `01`; conditional `02` and
55
+ `03` may fan out after the boundary is known; `04` consumes their relevant conclusions
56
+ and is the first owner checkpoint; `05` extracts assumptions from `00` through `04`.
57
+ Grilling controls how missing owner inputs are asked, Think tests one consequential
58
+ decision, and Domain Modeling writes settled vocabulary; none owns the Research route.
59
+ The final synthesis promotes accepted conclusions into the North Star, `CONTEXT.md`,
60
+ three specifications, and a source-hash-bound distillate.
49
61
 
50
62
  ## Change reconciliation
51
63
 
52
- `ultra-change` first compares requested behavior with product truth and current code.
53
- It classifies changes by the resulting commitments:
64
+ Change updates only the touched baseline rather than rebuilding it. `ultra-change`
65
+ first compares requested behavior with accepted product truth and current code. It
66
+ classifies changes by the resulting commitments:
54
67
 
55
68
  - expansion and correction may proceed inside accepted intent;
56
69
  - a reduction waits for explicit owner authority.
57
70
 
58
71
  The output is one active Change intent with observable outcome, acceptance, seams,
59
- non-goals, and trace anchors.
72
+ non-goals, trace anchors, and an explicit Research Disposition. `none` cites sufficient
73
+ existing evidence; `bounded` or `required` names the exact question, lenses, and exit
74
+ evidence. Unsatisfied exit evidence routes to Research, then back through Change
75
+ reconciliation before planning when the accepted contract needs an update.
76
+
77
+ A micro edit that makes no specification sentence false stays outside the Ultra
78
+ lifecycle and uses ordinary repository TDD/verification. Once an active Change exists,
79
+ even a `quick` profile receives one minimal Plan task so evidence and delivery remain
80
+ bound to its id. A separate request cannot open a second active Change: finish or
81
+ deliver the current one, abandon it with owner authority, or explicitly reconcile the
82
+ new request into the same stable id.
60
83
 
61
84
  ## Planning
62
85
 
63
- `ultra-plan` confirms the scope posture and public seams, then writes a task graph and
64
- one context file per task. Feature tasks are tracer bullets. A contract task precedes
65
- cross-process or cross-top-level-boundary implementations; integration checkpoints
66
- appear after several slices. Cycles and broken trace paths are repaired before handoff.
86
+ `ultra-plan` confirms a material scope posture and records public seams, then appends a
87
+ current-Change task graph and one context file per task without deleting historical
88
+ rows. The model chooses ordinary technical seams; the owner is asked only when a seam
89
+ changes a public contract, accepted risk, or another material trade-off. Every task
90
+ stores the stable `change_id`; dependencies stay inside that Change and ids remain
91
+ globally unique. Feature tasks are tracer bullets. A contract task precedes cross-process
92
+ or cross-top-level-boundary implementations; integration checkpoints appear after
93
+ several slices. Cycles and broken trace paths are repaired before handoff.
67
94
 
68
95
  ## Task development
69
96
 
@@ -78,15 +105,26 @@ duplication or coupling visible.
78
105
 
79
106
  ## Whole-system audit
80
107
 
81
- `ultra-test` runs once after the ledger is complete. It checks anti-patterns, coverage,
108
+ `ultra-test` runs once after tasks for the active Change are complete. It checks anti-patterns, coverage,
82
109
  wiring, E2E behavior, performance, and security. It names the exact Git commit and
83
- never turns an orphan, failed command, stub, or omission into permission to alter scope.
110
+ binds the report to `change_id`, exact current task ids, intent SHA-256, and the
111
+ product-worktree digest. `passed: true` implies complete current tasks and no required
112
+ area left `not_run`; task completion does not force a pass, and dispositioned gaps stay
113
+ visible. It never turns an orphan,
114
+ failed command, stub, or omission into permission to alter scope.
84
115
 
85
116
  ## Delivery
86
117
 
87
- `ultra-deliver` reconciles actual outcome, specifications, documentation, current test
88
- report, aggregate review, build, version impact, omissions, and rollback. It archives
89
- the Change with `git mv` after local reconciliation.
118
+ `ultra-deliver` uses two observable passes. The first reconciles actual outcome,
119
+ specifications, documentation, aggregate review, omissions, and rollback; if semantic
120
+ or product files change, it stops and recommends a fresh Test. The second begins only
121
+ when report Change/task/intent/HEAD/product identities match, applies the changed-export
122
+ gate, runs build and non-publishing package inspection, records version impact, writes
123
+ delivery metadata, and archives the same stable id with `git mv`. Delivery metadata and
124
+ the directory move do not invalidate their own product snapshot. Producing a release
125
+ package remains blocked while a changed export has neither a non-test consumer nor an
126
+ owner disposition. That disposition is recorded against the finding in the current
127
+ test report without changing the finding or `passed`, then carried into `delivery.md`.
90
128
 
91
129
  Commit, push, tag, publication, release, and deployment are independent external
92
130
  effects. Readiness grants none automatically.
@@ -95,27 +133,44 @@ effects. Readiness grants none automatically.
95
133
 
96
134
  `ultra-status` infers the smallest next route from observable files:
97
135
 
98
- - no healthy skeleton → init;
99
- - unresolved evidence-bearing claim → research;
136
+ - no healthy skeleton or usable raw brief → init;
137
+ - raw brief without an accepted baseline, or a consequential evidence gap → research;
100
138
  - requested outcome without active Change → change;
101
- - active Change without executable ledger → plan;
102
- - pending or in-progress task → dev;
103
- - completed ledger without current report → test;
104
- - current report and unarchived Change → deliver.
139
+ - draft or blocking active intent → change;
140
+ - unsatisfied Research Disposition → research;
141
+ - active Change without matching executable tasks → plan;
142
+ - matching pending or in-progress task → dev;
143
+ - completed current-Change tasks without a matching fresh report → test;
144
+ - false report → route by finding and owner disposition, not by the boolean alone;
145
+ - fresh, dispositioned report and unarchived Change → deliver.
105
146
 
106
147
  It also checks installation provenance, stale reports, old in-progress work, and
107
148
  unresolved markers. It does not mutate artifacts.
108
149
 
150
+ ## Delegation
151
+
152
+ `ultra-delegate` is orthogonal to the lifecycle and requires explicit owner authority.
153
+ Its immutable instruction selects task execution/continuation, scoped Research evidence,
154
+ or aggregate Change review/verification. Task execution reads one matching task context;
155
+ the latter two may be read-only and do not require a task, so both pre-Plan evidence and
156
+ post-task review remain reachable. Every scope still binds the one active `change_id`, a
157
+ clean isolated worktree, strict permission/result schemas, and primary-host inspection.
158
+ The worker cannot write canonical `.ultra` files or perform external effects.
159
+
109
160
  ## Artifact closure
110
161
 
111
162
  Every durable output has a later reader:
112
163
 
113
- - init's north star and specification skeletons are read by all later workflows;
114
- - research reports are traced into specifications, Change reconciliation, planning,
164
+ - init's Project Brief is consumed by Research, Status, and the pre-baseline session
165
+ Hook fallback; its empty skeleton supplies stable paths rather than product claims;
166
+ - Research's accepted North Star and domain/specification baseline are read by every
167
+ later workflow, while selected reports trace into Change reconciliation, planning,
115
168
  and delivery;
116
- - Change intent is consumed through planning, development, audit, review, status, and
117
- delivery;
118
- - task ledger and contexts are the common resume input, while task evidence feeds
169
+ - active Change intent and its touched specification deltas are consumed through
170
+ planning, development, audit, review, status, and delivery; an abandoned intent has
171
+ an exact `## Abandonment` closure consumed by future Change reconciliation and Status;
172
+ - the append-only task ledger and contexts are the common resume input after filtering
173
+ by active `change_id`, while task evidence feeds
119
174
  review, whole-system audit, and delivery;
120
175
  - the current test report is consumed by status and delivery;
121
176
  - delivery moves with the Change into archive and remains historical evidence.
@@ -126,9 +181,18 @@ an unowned drift log, Change plan, technical-debt report, or second delivery sum
126
181
 
127
182
  ## Interruption and cross-host continuation
128
183
 
184
+ There is one primary writer for canonical `.ultra` files. Review workers are read-only;
185
+ delegated source edits use isolated worktrees and return results for explicit
186
+ integration. Parallel canonical writes are unsupported because silently merging intent,
187
+ task, evidence, or report authority would lose meaning.
188
+
129
189
  Before stopping, the active task context records current facts, exact verification,
130
190
  open questions, Completion, and a closing Resume Note. The next session or host repeats
131
191
  the common entry contract and compares the working tree with those claims.
132
192
 
133
193
  This path remains valid when hooks and `ubp` are disabled. A compact snapshot may be
134
194
  used as a hint, then checked against canonical files and Git.
195
+
196
+ An authenticated Claude-to-Codex continuation using this path passed on 2026-08-03;
197
+ the exact scope, provenance, results, and limitations are recorded in the
198
+ [runtime compatibility matrix](RUNTIME-COMPAT-MATRIX.md#authenticated-cross-host-continuation-evidence).