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.
- package/.ultra-template/changes/abandoned/.gitkeep +0 -0
- package/.ultra-template/contexts/TEMPLATE.md +7 -0
- package/.ultra-template/north-star.md +20 -31
- package/.ultra-template/project-brief.md +28 -0
- package/.ultra-template/specs/product.md +4 -0
- package/.ultra-template/specs/research-distillate.md +8 -0
- package/.ultra-template/test-report.json +1 -0
- package/CHANGELOG.md +131 -1
- package/README.md +61 -29
- package/bin/delegate-worker.cjs +5 -0
- package/bin/delegate.cjs +7 -0
- package/docs/ARCHITECTURE.md +36 -10
- package/docs/ARTIFACT-AUTHORITY.md +42 -13
- package/docs/DECISIONS.md +24 -5
- package/docs/PHILOSOPHY.md +45 -12
- package/docs/PLUGIN-ISOLATION-CONTRACT.md +6 -3
- package/docs/RUNTIME-COMPAT-MATRIX.md +43 -1
- package/docs/SKILL-AUTHORING.md +10 -6
- package/docs/WORKFLOW-LIFECYCLE.md +103 -39
- package/hooks/README.md +12 -5
- package/hooks/_common.py +54 -5
- package/hooks/block_dangerous_commands.py +116 -10
- package/hooks/session_context.py +34 -8
- package/package.json +1 -1
- package/skills/ultra-change/SKILL.md +59 -52
- package/skills/ultra-change/references/change-contract.md +65 -7
- package/skills/ultra-delegate/SKILL.md +21 -3
- package/skills/ultra-delegate/references/delegation-contract.md +10 -2
- package/skills/ultra-deliver/SKILL.md +63 -21
- package/skills/ultra-deliver/references/baseline-reconciliation.md +5 -3
- package/skills/ultra-dev/SKILL.md +33 -14
- package/skills/ultra-grilling/SKILL.md +63 -24
- package/skills/ultra-grilling/references/reframing.md +72 -0
- package/skills/ultra-init/SKILL.md +62 -79
- package/skills/ultra-init/references/brownfield-adoption.md +23 -40
- package/skills/ultra-plan/SKILL.md +48 -24
- package/skills/ultra-research/SKILL.md +91 -62
- package/skills/ultra-research/references/{03-competitive-landscape.md → 03-alternatives.md} +6 -6
- package/skills/ultra-research/references/22-success-metrics.md +8 -4
- package/skills/ultra-research/references/99-synthesis.md +8 -1
- package/skills/ultra-research/references/wayfinding.md +42 -0
- package/skills/ultra-review/SKILL.md +31 -3
- package/skills/ultra-status/SKILL.md +62 -32
- package/skills/ultra-tdd/SKILL.md +5 -2
- package/skills/ultra-test/SKILL.md +31 -12
- package/skills/ultra-test/scripts/worktree_digest.cjs +42 -8
- package/skills/ultra-think/SKILL.md +5 -10
- 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/
|
|
19
|
-
| `.ultra/
|
|
20
|
-
| `.ultra/specs/
|
|
21
|
-
| `.ultra/specs/
|
|
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
|
|
24
|
-
| `.ultra/changes/active/<id>/intent.md` | one bounded requested outcome | `ultra-change`; Planning Posture by `ultra-plan` |
|
|
25
|
-
| `.ultra/tasks.json` | task identity, graph, status, trace, and context path | `ultra-plan` / `ultra-dev` | every user workflow and context Hook |
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
109
|
-
4. read `CONTEXT.md`, relevant decisions, active
|
|
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.
|
|
41
|
-
|
|
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/`.
|
|
56
|
-
|
|
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
|
|
package/docs/PHILOSOPHY.md
CHANGED
|
@@ -43,9 +43,11 @@ one or more.
|
|
|
43
43
|
|
|
44
44
|
### C1 — Goal-Always-Present
|
|
45
45
|
|
|
46
|
-
The agent never stops seeing the
|
|
47
|
-
the
|
|
48
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
73
|
-
|
|
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`, `##
|
|
158
|
-
| `session_context` | active `in_progress` task → its context | `tasks.json[].context_file` | acceptance
|
|
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 |
|
|
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` |
|
|
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
|
|
74
|
-
denial identifies the protected effect and supplies an exact-command SHA-256
|
|
75
|
-
authorization path.
|
|
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.
|
package/docs/SKILL-AUTHORING.md
CHANGED
|
@@ -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
|
|
45
|
-
`context_file` and Resume Note,
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
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
|
-
|
|
11
|
-
|
|
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/
|
|
29
|
-
2.
|
|
30
|
-
3. `
|
|
31
|
-
4. the
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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
|
|
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
|
|
64
|
-
one context file per task
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
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
|
|
114
|
-
|
|
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
|
|
117
|
-
delivery;
|
|
118
|
-
|
|
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).
|