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
File without changes
@@ -32,6 +32,8 @@
32
32
  <!-- The verifiable definition of done. Read by mid_workflow_recall and session_context, and
33
33
  injected into agent context — keep every line testable and keep noise out. -->
34
34
 
35
+ **Change Acceptance IDs**: [`AC-1`, `AC-3`, or `none` for task-local-only work]
36
+
35
37
  - [ ] `exact test command`
36
38
  - [ ] Pass: [scenario 1]
37
39
  - [ ] Pass: [scenario 2]
@@ -51,6 +53,11 @@
51
53
 
52
54
  **Source**: `.ultra/specs/product.md#section-id`
53
55
 
56
+ **Hard Constraints**: [`HC-1`, `HC-3`, or `none` — the north-star constraints this
57
+ task could plausibly violate. Read them before the first edit and again before
58
+ marking complete. Crossing one stops the work and goes to the owner, however good
59
+ the argument.]
60
+
54
61
  **Decisions**: [relevant `.ultra/decisions/<id>.md` entries, or `none`]
55
62
 
56
63
  ## Change Log
@@ -1,46 +1,35 @@
1
1
  # Project North Star
2
2
 
3
- > **Authority**: the owner's literal intent for this project, kept short enough to re-inject every
4
- > session. Every task must trace back here.
3
+ > **Authority**: the accepted steering contract established by `ultra-research` from
4
+ > owner decisions and cited evidence. Every Change and task must serve this contract.
5
5
  >
6
- > **Scope**: only what cannot be derived from `specs/product.md`. Success metrics,
7
- > excluded features, actors and scenarios stay in that file — do not copy them here.
6
+ > **Scope**: this file owns the project direction, the one North Star outcome or metric
7
+ > when one is justified, hard constraints, and explicit exclusions. Product requirements,
8
+ > supporting measurements, actors, and scenarios stay in `specs/product.md`.
8
9
 
9
- ---
10
+ ## Project Direction
10
11
 
11
- ## One-line
12
+ [NEEDS CLARIFICATION]
12
13
 
13
- <!-- ONE sentence, in the owner's own words, describing what they want.
14
- Captured by ultra-init, or from the owner's first request.
15
- Do not paraphrase into product-speak: specs/product.md holds the processed version.
16
- The value of this line is that it is the unprocessed baseline you check the
17
- processed version against. -->
14
+ ## North Star Outcome
18
15
 
19
- _(not yet defined — run `ultra-init`, or the first owner request will populate this)_
16
+ - `NS-01` outcome: [NEEDS CLARIFICATION]
17
+ - Metric or observation contract: [NEEDS CLARIFICATION]
18
+ - Why it represents delivered value: [NEEDS CLARIFICATION]
20
19
 
21
- ---
20
+ A single metric is optional. When one would distort the product, record that decision and
21
+ use an observable outcome plus guardrails instead of inventing numeric precision.
22
22
 
23
23
  ## Hard Constraints
24
24
 
25
- <!-- What must never happen, even when convenient. These are prohibitions, not technical
26
- constraints — architecture.md holds those. Examples:
27
- - Never store plaintext passwords
28
- - Cannot break backwards compatibility with API v1
29
- - Bundle stays under 500 KB
30
- - External API cost stays under $X/month -->
25
+ - `HC-1`: [NEEDS CLARIFICATION]
31
26
 
32
- _(not yet defined)_
27
+ ## Explicit Exclusions
33
28
 
34
- ---
29
+ - [NEEDS CLARIFICATION]
35
30
 
36
- ## Notes for agents
31
+ ## Research Trace
37
32
 
38
- 1. Re-anchor on the One-line — that is the literal owner request. When the spec and this line
39
- disagree, the spec drifted.
40
- 2. Check Hard Constraints before any "improvement". An improvement that violates a constraint is
41
- a regression.
42
- 3. If your current work does not trace back here, **stop and ask**. You may be building the
43
- wrong thing.
44
-
45
- The One-line is injected by `session_context` at SessionStart. `mid_workflow_recall`
46
- re-injects the active task acceptance before relevant tool use. See PHILOSOPHY C1.
33
+ - Project brief: `project-brief.md`
34
+ - Accepted research run: [NEEDS CLARIFICATION]
35
+ - Decision references: [NEEDS CLARIFICATION]
@@ -0,0 +1,28 @@
1
+ # Project Brief
2
+
3
+ > **Authority**: raw owner intake captured by `ultra-init`. It preserves what the owner
4
+ > initially asked for and the broad outline needed to begin research. It is not an
5
+ > evidence-backed product baseline.
6
+ >
7
+ > **Lifecycle**: `ultra-research` reads this seed and promotes accepted conclusions into
8
+ > the North Star, specifications, domain language, or decisions. It does not rewrite the
9
+ > brief to make later conclusions look inevitable.
10
+
11
+ ## One-line
12
+
13
+ [NEEDS CLARIFICATION]
14
+
15
+ ## Initial Outline
16
+
17
+ - What it is: [NEEDS CLARIFICATION]
18
+ - Broadly for whom or what: [NEEDS CLARIFICATION]
19
+ - Intended result: [NEEDS CLARIFICATION]
20
+ - Broad boundary: [NEEDS CLARIFICATION]
21
+
22
+ ## Explicit Inputs
23
+
24
+ - [NEEDS CLARIFICATION]
25
+
26
+ ## Open Questions for Research
27
+
28
+ - [NEEDS CLARIFICATION]
@@ -60,6 +60,10 @@ Scope status must reflect an explicit decision. Do not infer a reduced product p
60
60
 
61
61
  ## 22 Outcomes and Measurements
62
62
 
63
+ The accepted project direction and any single North Star outcome or metric live in
64
+ `.ultra/north-star.md`. Record supporting outcomes, measures, and guardrails here; do
65
+ not force one metric when an observable outcome plus guardrails is the honest contract.
66
+
63
67
  | Outcome or guardrail | Definition | Evidence source | Decision use | Owner |
64
68
  |---|---|---|---|---|
65
69
  | | | | | |
@@ -28,6 +28,14 @@ specifications' prose.
28
28
  |---|---|---|
29
29
  | | | |
30
30
 
31
+ ## Source Revisions
32
+
33
+ | Canonical source | Git blob hash from `git hash-object` | Status |
34
+ |---|---|---|
35
+ | `.ultra/specs/product.md` | | current or stale |
36
+ | `.ultra/specs/architecture.md` | | current or stale |
37
+ | `.ultra/specs/discovery.md` | | current or stale |
38
+
31
39
  ## End-to-End Trace
32
40
 
33
41
  | Problem or constraint | Actor and scenario | Requirement and acceptance | Architecture path | Verification |
@@ -3,6 +3,7 @@
3
3
  "change_id": null,
4
4
  "task_ids": [],
5
5
  "git_commit": null,
6
+ "intent_digest": null,
6
7
  "worktree": {
7
8
  "dirty": null,
8
9
  "diff_digest": null
package/CHANGELOG.md CHANGED
@@ -7,6 +7,125 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.26.2] — 2026-08-04
11
+
12
+ ### Added
13
+
14
+ - Added `.ultra/project-brief.md` as the raw owner-intake artifact and optional
15
+ Research `wayfinding.md` navigation for unclear multi-lens paths, without adding a
16
+ fifteenth Skill or another semantic authority.
17
+ - Expanded Research alternatives beyond direct competitors and made a single North
18
+ Star metric optional when an observable outcome plus guardrails is more honest.
19
+
20
+ ### Changed
21
+
22
+ - Narrowed `ultra-init` to the Project Brief and empty skeleton, made
23
+ `ultra-research` own the first accepted North Star, domain language, and
24
+ specification baseline, and limited `ultra-change` to touched baseline sections.
25
+ - Made the first six Research lenses dependency-aware and kept Grilling, Think, and
26
+ Domain Modeling as caller-bounded reusable methods rather than Research stages or
27
+ owner routes.
28
+ - Routed `ultra-status` from semantic file contents instead of a Research completion
29
+ bit or any single unresolved marker.
30
+ - Gave every Change one stable id across active, archive, and abandoned positions;
31
+ made the task ledger append-only and every current reader active-id scoped.
32
+ - Added explicit `none`, `bounded`, and `required` Research Disposition contracts,
33
+ one-task planning for quick Changes, and two-pass delivery against a fresh semantic
34
+ plus product snapshot.
35
+ - Gave the exact Change Contract explicit Profile rationale and Risk flags fields so
36
+ its required blast-radius decision has one stable representation.
37
+ - Kept ordinary technical seam selection model-owned and made delegation reachable for
38
+ task execution, scoped Research evidence, and aggregate Change review without
39
+ manufacturing task rows.
40
+
41
+ ### Fixed
42
+
43
+ - Made session context prefer the accepted North Star, fall back to the Project Brief
44
+ before Research, retain legacy one-line compatibility, and always append active task
45
+ acceptance when present.
46
+ - Bound Research distillates to the actual `git hash-object` value of all three
47
+ baseline specifications so staleness is mechanically observable.
48
+ - Prevented archived or abandoned unfinished tasks, invalid Change ids, blocked
49
+ dependencies, and ambiguous multiple `in_progress` rows from being injected as the
50
+ current Hook acceptance.
51
+ - Made canonical `change_id` override a conflicting legacy `change_ref`, so migration
52
+ compatibility cannot revive a historical task.
53
+ - Bound Test reports to exact Change id, ordered task ids, intent digest, HEAD, and a
54
+ product-worktree digest that excludes the report and Change-directory metadata while
55
+ binding current intent separately, so product reconciliation requires retest while
56
+ delivery metadata and archive finalization do not self-invalidate.
57
+ - Prevented a separate request from opening a second active Change, and gave abandoned
58
+ intents an exact owner decision, reason, reusable-evidence, and recovery closure read
59
+ by future Change and Status workflows.
60
+ - Kept non-publishing package inspection diagnostic while the explicit Deliver gate
61
+ blocks release-package creation only for an undispositioned changed export with no
62
+ non-test consumer.
63
+ - Made that gate's authorization path use the finding disposition in the current Test
64
+ report and carry the accepted decision into `delivery.md`.
65
+ - Aligned `.npmignore` with the explicit package allowlist and locked all eight
66
+ maintained product documents into the tarball smoke contract.
67
+
68
+ ### Verified
69
+
70
+ - Passed 119 Node tests, 21 Hook tests, 14 Skill Creator validations, five isolated
71
+ host install/Doctor/uninstall lifecycles, a 115-entry package dry-run inspection, and
72
+ an audit with zero vulnerabilities.
73
+
74
+ ## [0.26.1] — 2026-08-03
75
+
76
+ ### Added
77
+
78
+ - Added reframing to `ultra-grilling`, five bounded framing questions, and checkable
79
+ resolved, stalled, and unavailable exits so a literal request can be translated
80
+ into the role and outcome the owner actually means.
81
+ - Added `HC-<n>` hard-constraint identifiers, task-level constraint mapping,
82
+ executable Change verification, and a supported `changes/abandoned/` exit.
83
+ - Added owner-authorized cross-model-family review for major or security-relevant
84
+ Changes, plus optional native fan-out inside independent research and test regions.
85
+
86
+ ### Changed
87
+
88
+ - Made `ultra-dev` converge on each task's mapped Change acceptance IDs, track the
89
+ best-ever passing set, and stop after two no-progress rounds or three repair rounds.
90
+ - Expanded delivery reconciliation to every repository document and kept its wiring
91
+ gate local to an explicitly invoked `ultra-deliver`; ordinary npm lifecycle commands
92
+ never depend on project `.ultra/` evidence.
93
+ - Made `ultra-change` read relevant archive history before opening intent, preferring
94
+ `delivery.md` while supporting legacy archive summaries and verification records.
95
+ - Made all six review lenses the default and required every skipped lens to preserve
96
+ its reason in the aggregate result.
97
+
98
+ ### Fixed
99
+
100
+ - Prevented delegated workers from modifying `.ultra/`, including when `.` grants the
101
+ rest of an isolated checkout.
102
+ - Made dangerous-command authorization reachable by hashing the protected effect
103
+ independently of its retry spelling.
104
+ - Kept additive protected-branch publication on the host's native authority path instead
105
+ of hard-blocking an already owner-authorized release, retained exact-digest guards for
106
+ history rewrites and branch deletion, and stopped treating inert searches as effects.
107
+ - Kept expandable interpreter heredocs inside dangerous-effect inspection while
108
+ continuing to treat quoted commit-message heredocs as data.
109
+ - Required explicit owner authority before `ultra-review` can launch a cross-host
110
+ model-family recheck.
111
+ - Bound `ultra-dev` convergence to the active Change acceptance IDs, with explicit
112
+ stalled and unreachable exits instead of an open-ended repair loop.
113
+ - Made `ultra-change` recover archived intent from legacy archive evidence when the
114
+ preferred delivery record is absent.
115
+ - Kept the `ultra-deliver` wiring gate local to an owner-invoked delivery workflow;
116
+ ordinary package commands remain independent of project `.ultra/` state.
117
+ - Added the missing `changes/abandoned/` template directory and migrated completed WIP
118
+ evidence links to their canonical runtime document.
119
+
120
+ ### Verified
121
+
122
+ - Completed an authenticated Claude-to-Codex continuation on one isolated
123
+ file-first task: Claude banked the failing test and Resume Note without changing
124
+ implementation, and Codex resumed from Git plus `.ultra/`, reached green, and
125
+ closed the ledger and canonical evidence without conversation transfer.
126
+ - Verified the release candidate with 111 Node tests, 10 Hook tests, 14 Skill Creator
127
+ validations, five healthy host Doctor reports, and zero audit vulnerabilities.
128
+
10
129
  ## [0.26.0] — 2026-08-01
11
130
 
12
131
  ### Added
@@ -1167,7 +1286,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1167
1286
  skill manifest, CLI protocol + mapping table; 5 spec validators.
1168
1287
  - **Phase 0 — skeleton**: multi-runtime installer scaffolding.
1169
1288
 
1170
- [Unreleased]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.20.0...HEAD
1289
+ [Unreleased]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.26.1...HEAD
1290
+ [0.26.1]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.26.0...v0.26.1
1291
+ [0.26.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.25.1...v0.26.0
1292
+ [0.25.1]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.25.0...v0.25.1
1293
+ [0.25.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.24.2...v0.25.0
1294
+ [0.24.2]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.24.1...v0.24.2
1295
+ [0.24.1]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.24.0...v0.24.1
1296
+ [0.24.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.23.0...v0.24.0
1297
+ [0.23.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.22.0...v0.23.0
1298
+ [0.22.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.21.1...v0.22.0
1299
+ [0.21.1]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.21.0...v0.21.1
1300
+ [0.21.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.20.0...v0.21.0
1171
1301
  [0.20.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.19.1...v0.20.0
1172
1302
  [0.19.1]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.19.0...v0.19.1
1173
1303
  [0.19.0]: https://github.com/rocky2431/ultra-builder-pro-cli/compare/v0.18.0...v0.19.0
package/README.md CHANGED
@@ -29,14 +29,14 @@ The package installs exactly fourteen Skills in three roles.
29
29
 
30
30
  | Skill | Outcome |
31
31
  |---|---|
32
- | `ultra-init` | Establish the project skeleton and one-line north star |
33
- | `ultra-research` | Verify external claims and refresh specifications |
34
- | `ultra-change` | Reconcile a requested change against current product truth |
32
+ | `ultra-init` | Establish the project skeleton and raw Project Brief |
33
+ | `ultra-research` | Establish an accepted North Star and evidence-backed baseline |
34
+ | `ultra-change` | Reconcile one requested delta against the accepted baseline |
35
35
  | `ultra-plan` | Write tracer-bullet tasks, contexts, dependencies, and seams |
36
36
  | `ultra-dev` | Implement one task through red/green development and six evidence dimensions |
37
37
  | `ultra-test` | Audit whole-system wiring, E2E behavior, performance, and security |
38
38
  | `ultra-deliver` | Reconcile, review, document, and archive a completed Change |
39
- | `ultra-delegate` | Run a bounded instruction through another supported CLI |
39
+ | `ultra-delegate` | Run bounded task work, Research evidence, or aggregate review through another supported CLI |
40
40
 
41
41
  ### Model-invoked disciplines
42
42
 
@@ -60,6 +60,14 @@ review, and a consequential unresolved decision uses think. A host with native b
60
60
  subagents may parallelize review lenses; another host runs the same lens assets
61
61
  sequentially.
62
62
 
63
+ Inside `ultra-research`, the first six references are six semantic lenses, not six
64
+ extra Skills: problem validation, opportunity discovery, market assessment,
65
+ alternatives, product strategy, and assumptions validation. `wayfinding.md` chooses
66
+ the smallest dependency-correct path through those and the later evidence lenses.
67
+ Grilling still owns how to ask one missing question, Think owns one consequential
68
+ trade-off, and Domain Modeling owns vocabulary; Research owns the overall question
69
+ map, evidence convergence, owner checkpoints, and baseline promotion.
70
+
63
71
  ### What happened to the original Agents
64
72
 
65
73
  v0.26 does not install a custom `agents/` projection. The old review workers became the
@@ -72,12 +80,15 @@ host exposes the same custom-agent API.
72
80
 
73
81
  ## Project authority
74
82
 
75
- A new project uses this shape:
83
+ A project after its first accepted Research baseline uses this shape. Immediately after
84
+ Init, `CONTEXT.md` does not exist yet and the North Star/specification files are empty
85
+ skeletons.
76
86
 
77
87
  ```text
78
88
  CONTEXT.md
79
89
  .ultra/
80
90
  ├── .gitignore # ignores only derived Ultra paths
91
+ ├── project-brief.md
81
92
  ├── north-star.md
82
93
  ├── tasks.json
83
94
  ├── test-report.json
@@ -88,15 +99,18 @@ CONTEXT.md
88
99
  │ └── research-distillate.md
89
100
  ├── changes/
90
101
  │ ├── active/<change-id>/{intent.md,delivery.md}
91
- │ └── archive/<change-id>/intent.md
102
+ │ ├── archive/<change-id>/{intent.md,delivery.md}
103
+ │ └── abandoned/<change-id>/intent.md # includes exact Abandonment closure
92
104
  ├── contexts/<task-id>.md
93
105
  ├── decisions/<decision-id>.md
94
106
  ├── evidence/<task-id>/...
95
- └── research/<run-id>/...
107
+ └── research/<run-id>/{brief.md,<step-id>.md}
96
108
  ```
97
109
 
98
- Canonical semantic facts live in those files. Git provides history, comparison,
99
- rollback, and archive moves. The following are derived and can be deleted or rebuilt:
110
+ The optional `brief.md` is derived navigation; the selected step reports are cited
111
+ evidence, and promoted semantic facts live in the other canonical files. Git provides
112
+ history, comparison, rollback, and archive moves. The following additional paths are
113
+ derived and can be deleted or rebuilt:
100
114
 
101
115
  ```text
102
116
  .ultra/.runtime/
@@ -111,13 +125,13 @@ staleness, and recovery rules.
111
125
 
112
126
  | Route | Canonical write | Who consumes it next |
113
127
  |---|---|---|
114
- | `ultra-init` | north star and four specification skeletons; empty task and test ledgers | every later workflow and context Hook |
115
- | `ultra-research` | selected cited reports plus reconciled specifications and distillate | change, plan, and delivery |
116
- | `ultra-change` | one active `intent.md` with exact acceptance, seams, reconciliation, and recovery | plan, dev, test, review, status, delivery |
117
- | `ultra-plan` | `tasks.json`, one context per task, and Planning Posture in the active intent | dev and every resume path |
128
+ | `ultra-init` | raw `project-brief.md`, empty North Star and specification skeletons, and empty task/test ledgers | research, status, and the pre-baseline session Hook fallback |
129
+ | `ultra-research` | accepted North Star, first domain baseline, selected cited reports, reconciled specifications, and distillate | change, plan, and delivery |
130
+ | `ultra-change` | one active `intent.md` with stable `change_id`, Research Disposition, and only the accepted baseline sections touched by that delta; or an exact Abandonment closure before an owner-authorized move | active: research through delivery; abandoned: future Change history and status |
131
+ | `ultra-plan` | append-only `tasks.json` rows for the active `change_id`, one context per task, and Planning Posture in the active intent | dev and every resume path |
118
132
  | `ultra-dev` | source/tests, task evidence, synchronized task/context status, Completion and Resume Note | review, test, status, delivery |
119
- | `ultra-test` | the one current `test-report.json` bound to HEAD and worktree digest | status and delivery |
120
- | `ultra-deliver` | one `delivery.md`, reconciled specs/docs, then the archived Change directory | owner and future Change history |
133
+ | `ultra-test` | the one current `test-report.json` bound to Change id, current task ids, intent digest, HEAD, and product-worktree digest | status and delivery |
134
+ | `ultra-deliver` | first reconciled specs/docs, then after a fresh Test snapshot one `delivery.md` and the archived Change directory | owner and future Change history |
121
135
  | `ultra-status` | none | recommends the smallest explicit route from current files |
122
136
  | `ultra-delegate` | derived runtime receipt plus an isolated worktree diff | primary host inspection and optional integration |
123
137
 
@@ -178,23 +192,37 @@ installation; all five support managed global installation and isolated
178
192
 
179
193
  ## Typical workflow
180
194
 
181
- 1. Select `ultra-init` once. It writes the skeleton, records the owner's one-line goal,
182
- initializes Git when needed, and recommends the next route.
183
- 2. Select `ultra-research` when a product or architecture claim needs evidence.
184
- 3. Select `ultra-change` for the requested outcome and reconcile it against current
185
- specifications before planning.
186
- 4. Select `ultra-plan` to confirm public seams and produce resumable tracer-bullet tasks.
195
+ 1. Select `ultra-init` once. It writes the skeleton, preserves the owner's raw one-line
196
+ request and broad outline in the Project Brief, initializes Git when needed, and
197
+ stops before product research.
198
+ 2. Select `ultra-research` to turn that brief into the first accepted North Star,
199
+ shared vocabulary, and evidence-backed product and architecture baseline. For an
200
+ unclear multi-lens question it first writes a derived Wayfinding brief; for one
201
+ bounded evidence gap it skips that extra file.
202
+ 3. Select `ultra-change` for a requested delta. It reconciles only the baseline sections
203
+ the delta touches before planning; it does not rebuild the project baseline. Its
204
+ Research Disposition either cites sufficient evidence or names the bounded question
205
+ and exit evidence that must return through Research. A micro edit that makes no
206
+ specification sentence false stays outside Ultra; an accepted quick Change still
207
+ receives one Plan task. While that Change remains active, reconcile its same stable
208
+ id; never open a second active Change for a separate request.
209
+ 4. Select `ultra-plan` to record public seams and produce resumable tracer-bullet tasks.
210
+ The model owns ordinary technical seams; the owner decides only a seam that changes
211
+ the public contract or another material trade-off.
187
212
  5. Select `ultra-dev` for one task at a time. Each task leaves a Completion entry,
188
213
  evidence, and a closing Resume Note.
189
- 6. Select `ultra-test` once the ledger is complete. Local green tests do not substitute
190
- for wiring and E2E proof.
191
- 7. Select `ultra-deliver` to run aggregate review, reconcile documentation, and archive
192
- the Change. Commit, push, tag, publication, and deployment remain separately
193
- authorized effects.
214
+ 6. Select `ultra-test` once tasks for the active Change are complete. Historical ledger
215
+ rows do not enter this audit. Local green tests do not substitute for wiring and E2E proof.
216
+ 7. Select `ultra-deliver` to run aggregate review and reconcile documentation. If that
217
+ changes product or semantic files, rerun Test; re-enter Deliver on the fresh snapshot
218
+ to write delivery metadata and archive the stable Change id. Commit, push, tag,
219
+ publication, and deployment remain separately authorized effects.
194
220
 
195
221
  At any point, `ultra-status` can reconstruct the current position. A fresh session or
196
222
  different host resumes by reading `.ultra/tasks.json`, the selected `context_file`, its
197
- `## Resume Note`, `CONTEXT.md`, relevant decisions, the active Change, and Git.
223
+ `## Resume Note`, `CONTEXT.md`, relevant decisions, the active Change, and Git. It first
224
+ filters the append-only ledger to tasks whose `change_id` matches the unique active
225
+ Change; archived and abandoned unfinished rows are history, not the frontier.
198
226
 
199
227
  ## Three independent integration defences
200
228
 
@@ -215,11 +243,11 @@ Five optional hooks accelerate file reading and protect a narrow effect boundary
215
243
 
216
244
  | Hook | Behavior |
217
245
  |---|---|
218
- | `session_context.py` | Inject north star and current acceptance at session start |
246
+ | `session_context.py` | Inject the accepted North Star, or the Project Brief fallback before Research, plus current acceptance |
219
247
  | `mid_workflow_recall.py` | Restate acceptance before relevant source operations |
220
248
  | `compact_context.py` | Save and restore a disposable Git/file snapshot |
221
249
  | `post_edit_guard.py` | Record mechanical evidence observations after edits |
222
- | `block_dangerous_commands.py` | Deny named destructive shell effects until the exact command is authorized |
250
+ | `block_dangerous_commands.py` | Advise on additive protected-branch publication; deny history rewrites and named destructive shell effects until the exact command is authorized |
223
251
 
224
252
  All five exit silently when `.ultra/` is absent. Details are in
225
253
  [Plugin Isolation](docs/PLUGIN-ISOLATION-CONTRACT.md).
@@ -244,6 +272,10 @@ Use `skills/ultra-delegate/scripts/delegate_wait.py` to wait for `result.json` w
244
272
  loading intermediate worker output into the parent context. Delegation grants no new
245
273
  authority; writable roots remain inside the worktree, and its permission file must
246
274
  declare zero external effects without widening the host sandbox.
275
+ The immutable instruction names task execution/continuation, scoped Research evidence,
276
+ or aggregate Change review/verification. The latter two may be read-only and do not
277
+ require a task row, keeping pre-Plan Research and post-task cross-family review
278
+ reachable without inventing ledger work.
247
279
 
248
280
  ## Host support
249
281
 
@@ -7,6 +7,7 @@ const path = require('node:path');
7
7
  const { execFileSync, spawn } = require('node:child_process');
8
8
 
9
9
  const RESULT_SCHEMA = 'ultra-delegation-result-v1';
10
+ const PROTECTED_ROOT = '.ultra';
10
11
  const MODEL_FIELDS = new Set([
11
12
  '$schema', 'status', 'summary', 'changed_files', 'checks', 'evidence',
12
13
  'questions', 'residual_risks',
@@ -148,7 +149,11 @@ function validateModelResult(payload) {
148
149
  return null;
149
150
  }
150
151
 
152
+ // The project's memory has exactly one writer: the primary host. A worker that edits
153
+ // `.ultra` in its own worktree collides in the files every later session reads to
154
+ // resume, so no permission grants it — not even `writable_roots: ["."]`.
151
155
  function authorized(spec, file) {
156
+ if (file === PROTECTED_ROOT || file.startsWith(`${PROTECTED_ROOT}/`)) return false;
152
157
  return spec.writable_roots.some((root) => (
153
158
  root === '.' || file === root || file.startsWith(`${root}/`)
154
159
  ));
package/bin/delegate.cjs CHANGED
@@ -12,6 +12,7 @@ const PERMISSION_SCHEMA = 'ultra-delegation-permission-v1';
12
12
  const RECEIPT_SCHEMA = 'ultra-delegation-receipt-v1';
13
13
  const RESULT_SCHEMA = 'ultra-delegation-result-v1';
14
14
  const PERMISSION_FIELDS = new Set(['$schema', 'writable_roots', 'external_effects']);
15
+ const PROTECTED_ROOT = '.ultra';
15
16
  const RESULT_JSON_SCHEMA = Object.freeze({
16
17
  type: 'object',
17
18
  additionalProperties: false,
@@ -149,6 +150,12 @@ function readPermission(file, worktree) {
149
150
  throw new Error('permission writable_roots must not escape through symlinks');
150
151
  }
151
152
  const normalized = path.relative(worktree, real).split(path.sep).join('/') || '.';
153
+ // `.ultra` is the project's memory and has exactly one writer: the primary host.
154
+ // Rejected here so the delegation never starts, and again against the actual diff
155
+ // in the worker, which also covers the `.` grant.
156
+ if (normalized === PROTECTED_ROOT || normalized.startsWith(`${PROTECTED_ROOT}/`)) {
157
+ throw new Error(`permission writable_roots must not include ${PROTECTED_ROOT}; the primary host is its only writer`);
158
+ }
152
159
  if (!writableRoots.includes(normalized)) {
153
160
  writableRoots.push(normalized);
154
161
  writableRootPaths.push(real);
@@ -38,14 +38,22 @@ The exact allowlists live in `adapters/_shared/runtime-assets.cjs`. Public workf
38
38
  never invoke another public workflow. They may use model-invoked disciplines and then
39
39
  recommend the next owner route.
40
40
 
41
+ Research's seventeen references are workflow-owned semantic lenses. Its optional
42
+ `wayfinding.md` maps a multi-lens question without becoming a new Skill or authority.
43
+ The reusable mechanics remain separate: Grilling owns the interaction loop, Think owns
44
+ one consequential decision, and Domain Modeling owns vocabulary promotion.
45
+
41
46
  ### Authority plane
42
47
 
43
48
  Canonical semantic authority consists of:
44
49
 
45
- - `.ultra/north-star.md` for owner wording and hard constraints;
50
+ - `.ultra/project-brief.md` for raw owner intake and the initial outline;
51
+ - `.ultra/north-star.md` for the accepted direction, outcome or metric decision, hard
52
+ constraints, and exclusions established by Research;
46
53
  - `.ultra/specs/*.md` for product, architecture, discovery, and research distillate;
47
- - `.ultra/changes/{active,archive}/<id>/intent.md` for bounded outcomes;
48
- - `.ultra/tasks.json` plus each task's `context_file`;
54
+ - `.ultra/changes/{active,archive,abandoned}/<id>/intent.md` for bounded outcomes with
55
+ one stable id across directory moves;
56
+ - append-only `.ultra/tasks.json` rows carrying `change_id`, plus each task's `context_file`;
49
57
  - `.ultra/decisions/*.md`, `.ultra/evidence/`, `.ultra/test-report.json`, and research;
50
58
  - repository-root `CONTEXT.md` for ubiquitous language;
51
59
  - Git for revision identity, history, moves, diff, and rollback.
@@ -53,6 +61,12 @@ Canonical semantic authority consists of:
53
61
  Each semantic fact has one canonical representation. A summary can point to authority,
54
62
  but cannot become a second authority merely because it is convenient to read.
55
63
 
64
+ One primary host model writes this authority in a worktree. Native subagents are
65
+ read-only sensors; delegated CLIs write isolated non-`.ultra` roots and return receipts.
66
+ Sequential Changes share the ledger by stable id, while current readers filter by the
67
+ one unique active Change. This keeps concurrency explicit in Git instead of adding a
68
+ semantic lock service or workflow engine.
69
+
56
70
  ### Adaptation plane
57
71
 
58
72
  `adapters/*.js` translates the shared package into native host surfaces:
@@ -87,7 +101,10 @@ the parent model runs the same references sequentially.
87
101
  Five hooks read canonical files and emit bounded context or observations. Their output
88
102
  under `.ultra/.runtime/`, `.ultra/progress/`, or `.ultra/reviews/` is derived and
89
103
  disposable. The dangerous-command hook is the only hard effect guard; it classifies a
90
- small named set of shell effects and provides an exact-command authorization repair.
104
+ small named destructive set and provides an exact-command authorization repair.
105
+ Additive protected-branch publication remains advisory when portable host wiring cannot
106
+ project a trusted owner-approval receipt; history rewrites and branch deletion remain
107
+ guarded.
91
108
 
92
109
  ## Completion and recovery
93
110
 
@@ -97,10 +114,11 @@ end-to-end evidence by themselves.
97
114
 
98
115
  Every user Skill starts by reading:
99
116
 
100
- 1. `.ultra/tasks.json`;
101
- 2. the unfinished task's `context_file` and closing `## Resume Note`;
102
- 3. `CONTEXT.md` and relevant decisions;
103
- 4. the active Change, specifications, evidence, and current Git state.
117
+ 1. zero or one active `change_id`, diagnosing more than one;
118
+ 2. `.ultra/tasks.json` tasks whose `change_id` matches it;
119
+ 3. the matching frontier task's `context_file` and closing `## Resume Note`;
120
+ 4. `CONTEXT.md` and relevant decisions;
121
+ 5. the active Change, specifications, evidence, and current Git state.
104
122
 
105
123
  That same sequence works after compaction, a fresh process, disabled hooks, or a host
106
124
  change. Compact snapshots can accelerate recovery but never outrank the source files.
@@ -109,10 +127,12 @@ change. Compact snapshots can accelerate recovery but never outrank the source f
109
127
 
110
128
  Three independent Skills protect the vertical path:
111
129
 
112
- 1. `ultra-plan` confirms seams and rejects horizontal feature tasks.
130
+ 1. `ultra-plan` records model-selected technical seams, asks the owner only for a
131
+ public-contract or material trade-off, and rejects horizontal feature tasks.
113
132
  2. `ultra-dev` records six separate evidence dimensions, including real persistence,
114
133
  default-on behavior, vertical execution, and spec trace.
115
- 3. `ultra-test` searches exports for real consumers and exercises the primary flow.
134
+ 3. `ultra-test` searches exports for real consumers, exercises the primary flow, and
135
+ binds the result to Change id, task ids, intent, HEAD, and product-worktree digest.
116
136
 
117
137
  These are independent sensors. None rewrites a finding into product truth.
118
138
 
@@ -128,6 +148,12 @@ schema-constrained final response; the Node worker validates `finished`, `blocke
128
148
  writes its own receipt; stdout, stderr, native final output, and the launch receipt
129
149
  remain diagnostic files.
130
150
 
151
+ The instruction binds the active `change_id` and one of three semantic scopes: task
152
+ execution/continuation, scoped Research evidence, or aggregate Change
153
+ review/verification. Only task execution requires a task row. The read-only Research
154
+ and aggregate scopes preserve the same process boundary without inventing work merely
155
+ to make delegation reachable.
156
+
131
157
  Delegation does not grant authority or copy semantic state into another store. The
132
158
  worker reads and writes the same repository files in the specified worktree.
133
159