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,7 +10,16 @@ semantic synthesis and remains the only writer of `.ultra/tasks.json`.
|
|
|
10
10
|
|
|
11
11
|
## Before you start
|
|
12
12
|
|
|
13
|
-
1.
|
|
13
|
+
1. Resolve exactly one active `change_id`, then select one scope and name it in
|
|
14
|
+
`instruction.md`:
|
|
15
|
+
- **task execution or continuation** — select one matching task and read its full
|
|
16
|
+
`context_file` and `## Resume Note`;
|
|
17
|
+
- **scoped Research evidence** — read the active intent's Research Disposition,
|
|
18
|
+
named question, sources, and required exit evidence;
|
|
19
|
+
- **aggregate Change review or verification** — read the exact matching task ids,
|
|
20
|
+
relevant contexts, current report or review summary, and Change diff.
|
|
21
|
+
Research and aggregate read-only scopes do not require a task. An archived or
|
|
22
|
+
abandoned task cannot be delegated as current work.
|
|
14
23
|
2. Read `CONTEXT.md`, relevant `.ultra/decisions/`, acceptance and current evidence.
|
|
15
24
|
3. Define one bounded instruction, permission set, clean Git worktree and result.
|
|
16
25
|
4. Read `references/delegation-contract.md` before writing either JSON artifact.
|
|
@@ -21,19 +30,28 @@ semantic synthesis and remains the only writer of `.ultra/tasks.json`.
|
|
|
21
30
|
spec digests remain unchanged.
|
|
22
31
|
- The worker terminates as `finished`, `blocked` or `failed` in a schema-valid
|
|
23
32
|
`result.json`; declared paths equal the actual Git diff and stay in writable roots.
|
|
33
|
+
- No `writable_roots` entry is `.ultra/` or sits under it, and the actual diff touches
|
|
34
|
+
nothing there.
|
|
24
35
|
- Timeout and cancellation reach a terminal failed result and release `run.lock`.
|
|
25
|
-
- The primary host verifies the result against the
|
|
36
|
+
- The primary host verifies the result against the selected scope's task acceptance,
|
|
37
|
+
Research exit evidence, or aggregate review/verification question.
|
|
26
38
|
|
|
27
39
|
## Prepare and run
|
|
28
40
|
|
|
29
41
|
Write under `.ultra/.runtime/delegations/<id>/`:
|
|
30
42
|
|
|
31
|
-
- `instruction.md`:
|
|
43
|
+
- `instruction.md`: scope type, stable `change_id`, optional task id, bounded goal,
|
|
44
|
+
sources, acceptance or exit evidence, and forbidden effects;
|
|
32
45
|
- `permission.json`: the exact file-local boundary in the contract reference;
|
|
33
46
|
- `result.json`: launcher-published terminal artifact only.
|
|
34
47
|
|
|
35
48
|
`writable_roots` is an array of existing worktree-relative directories. An empty array
|
|
36
49
|
selects native read-only mode; one or more roots selects bounded write mode.
|
|
50
|
+
**Neither `.ultra/` nor any path under it may appear in it.** The worktree carries a
|
|
51
|
+
checkout of `.ultra` because Git tracks it, but the project's memory has exactly one
|
|
52
|
+
writer. Two workers appending to `tasks.json`, `progress/` or `evidence/` in separate
|
|
53
|
+
worktrees collide in the very files every later session reads to resume. Worker findings
|
|
54
|
+
and state changes travel back in `result.json` and are applied by the primary host.
|
|
37
55
|
`external_effects` must be empty in this portable launcher: commit, push, publish,
|
|
38
56
|
deployment and other effects stay with the primary host. There is no `readable_roots`
|
|
39
57
|
claim because the five host sandboxes do not share one mechanically enforceable read
|
|
@@ -12,8 +12,16 @@
|
|
|
12
12
|
|
|
13
13
|
Fields are exact. Roots are normalized worktree-relative directories that already
|
|
14
14
|
exist. An empty array selects native read-only mode; `.` deliberately grants the whole
|
|
15
|
-
isolated checkout
|
|
16
|
-
and non-empty external effects are
|
|
15
|
+
isolated checkout except `.ultra/`. Absolute paths, symlink escapes, unknown fields,
|
|
16
|
+
`readable_roots`, `.ultra` or any path beneath it, and non-empty external effects are
|
|
17
|
+
rejected.
|
|
18
|
+
|
|
19
|
+
`.ultra/` is never writable by a worker under any root, `.` included. The project's
|
|
20
|
+
memory has exactly one writer — the primary host — because two worktrees appending to
|
|
21
|
+
`tasks.json`, `progress/` or `evidence/` collide in precisely the files a later session
|
|
22
|
+
reads to resume. Enforced twice: the launcher rejects a `.ultra` root before the
|
|
23
|
+
delegation starts, and the worker fails an actual diff that touches it with
|
|
24
|
+
`unauthorized_write`.
|
|
17
25
|
|
|
18
26
|
## Model final response
|
|
19
27
|
|
|
@@ -1,51 +1,93 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ultra-deliver
|
|
3
|
-
description: Reconcile one
|
|
3
|
+
description: Reconcile one Change whose matching tasks are complete, run aggregate review and refactoring, refresh release documentation, and archive the local workflow record. Use when the owner wants a delivery handoff or separately authorized release effects for the active Change.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Turn current evidence into a recoverable delivery handoff
|
|
7
7
|
|
|
8
|
-
Delivery closes the local Change
|
|
9
|
-
separate effects; local readiness grants none of them automatically.
|
|
8
|
+
Delivery closes the local Change; readiness grants no commit, push, tag, publish, or deploy authority.
|
|
10
9
|
|
|
11
10
|
## Before you start
|
|
12
11
|
|
|
13
|
-
1. Read `.ultra/tasks.json
|
|
14
|
-
closing
|
|
12
|
+
1. Resolve exactly one active `change_id`. Read `.ultra/tasks.json`; every matching task
|
|
13
|
+
must be complete. Read each `context_file`'s Completion and closing Resume Note.
|
|
15
14
|
2. Read `CONTEXT.md`, relevant `.ultra/decisions/`, active Change intent and evidence.
|
|
16
|
-
3. Read `.ultra/test-report.json
|
|
17
|
-
|
|
15
|
+
3. Read `.ultra/test-report.json`, then run the Test Skill's `worktree_digest.cjs` with
|
|
16
|
+
project root and `--change-id`. Require report `task_ids` for the current Change plus
|
|
17
|
+
matching `change_id`, `git_commit`, worktree digest, and intent digest; otherwise stop.
|
|
18
18
|
|
|
19
19
|
## Definition of done
|
|
20
20
|
|
|
21
|
-
-
|
|
21
|
+
- Outcome, specs, tests, aggregate review, and every document match the actual diff.
|
|
22
|
+
- Every changed export has a non-test consumer or a recorded owner disposition.
|
|
22
23
|
- Every omitted stage is explicitly recorded with its evidence-based rationale.
|
|
23
24
|
- Build and release checks have exact commands and real results.
|
|
24
25
|
- The Change is archived with `git mv`, and rollback remains a normal Git operation.
|
|
25
26
|
|
|
26
27
|
## Review and refactor
|
|
27
28
|
|
|
28
|
-
Follow `../ultra-review/SKILL.md` across the aggregate Change
|
|
29
|
-
|
|
30
|
-
deep-module boundaries. Rerun every check affected by a refactor and refresh the report
|
|
31
|
-
against the resulting HEAD.
|
|
29
|
+
Follow `../ultra-review/SKILL.md` across the aggregate Change; refactor only observed
|
|
30
|
+
duplication, coupling, or boundary defects. Rerun affected checks and refresh the report.
|
|
32
31
|
|
|
33
32
|
## Reconcile the handoff
|
|
34
33
|
|
|
35
34
|
1. Compare accepted intent and task traces with delivered behavior.
|
|
36
35
|
2. Apply justified specification corrections; route any REDUCTION to the owner.
|
|
37
|
-
3.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
3. List documentation, compare every file with the full Change diff, and repair stale
|
|
37
|
+
behavior, examples, flags, or fields. Record bounded debt only in active
|
|
38
|
+
`delivery.md` under `## Technical Debt`.
|
|
39
|
+
4. Defer build, non-publishing package inspection, version selection, and the canonical
|
|
40
|
+
`delivery.md` until the fresh-snapshot finalization pass below. Reconciliation that
|
|
41
|
+
changed files must return through Test first.
|
|
42
|
+
|
|
43
|
+
Entry reconciliation prevents inherited drift; this exit reconciliation prevents the
|
|
44
|
+
Change from leaving new document drift.
|
|
45
|
+
|
|
46
|
+
## Reconcile, then finalize on a fresh snapshot
|
|
47
|
+
|
|
48
|
+
Delivery has two observable passes, not a hidden state machine:
|
|
49
|
+
|
|
50
|
+
1. Reconcile and review. If this pass changes source, tests, task/context/evidence,
|
|
51
|
+
specifications, maintained documentation, or `intent.md`, stop after writing the
|
|
52
|
+
reconciled files. The existing report is stale; recommend `ultra-test` and make no
|
|
53
|
+
delivery or release claim.
|
|
54
|
+
2. After an unchanged pass or fresh Test, recheck Change/task/HEAD/product/intent
|
|
55
|
+
identities. Apply the gate, run build and non-publishing package inspection, determine
|
|
56
|
+
version impact, and use `references/baseline-reconciliation.md` for canonical
|
|
57
|
+
`delivery.md`. Archive the Change. Excluded delivery metadata and the directory move
|
|
58
|
+
cannot self-invalidate the product digest; intent stays independently bound.
|
|
59
|
+
|
|
60
|
+
Do not draft a success narrative around stale evidence. A current `passed: false`
|
|
61
|
+
report may still reach finalization only after every finding has an explicit owner
|
|
62
|
+
disposition and the one hard gate below is clear; `passed` is evidence summary, not a
|
|
63
|
+
second mechanical release gate.
|
|
64
|
+
|
|
65
|
+
## The one delivery gate
|
|
66
|
+
|
|
67
|
+
This gate applies only after the owner explicitly invokes `ultra-deliver`; it does not
|
|
68
|
+
attach itself to ordinary repository packaging outside this workflow.
|
|
69
|
+
|
|
70
|
+
Everything else in this workflow reports and hands over. This is the exception, and it
|
|
71
|
+
is deliberately narrow:
|
|
72
|
+
|
|
73
|
+
**Do not produce a release package while an export this Change added or changed has no
|
|
74
|
+
non-test consumer and no recorded owner disposition.**
|
|
75
|
+
|
|
76
|
+
| | |
|
|
77
|
+
|---|---|
|
|
78
|
+
| Invariant | Every changed export is either reachable from a non-test caller or explicitly declared internal |
|
|
79
|
+
| Fact source | The Wiring Verification finding and its owner disposition in `.ultra/test-report.json`, bound to the current Change id, task ids, intent, HEAD, and product-worktree digest — the audit already found these; this is not a fresh opinion |
|
|
80
|
+
| Blocked effect | Release-package creation and the separately authorized release effects after it. A non-publishing package inspection is diagnostic; local commit and archival are untouched |
|
|
81
|
+
| Repair | Wire the export to its caller, or record the owner's disposition on the finding in `.ultra/test-report.json`, then carry it into `delivery.md`. Either one clears the gate |
|
|
82
|
+
|
|
83
|
+
"Written but never connected" can leave tests and review green while the feature is
|
|
84
|
+
absent. Keep this gate at finalization, after the audit can distinguish unfinished work.
|
|
43
85
|
|
|
44
86
|
## Archive locally
|
|
45
87
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
88
|
+
After the fresh check, `git mv` active `<id>` to archive. The id stays stable in task
|
|
89
|
+
rows; never store a movable intent path or create a second delivery summary. Archived
|
|
90
|
+
delivery, test report, evidence, and Git history are the handoff.
|
|
49
91
|
|
|
50
92
|
For separately authorized effects, perform and verify each independently. Ask for
|
|
51
93
|
authority at the point of effect: commit, then push, then tag, package publication and
|
|
@@ -34,6 +34,8 @@ the Change is active and moves with the directory when archived.
|
|
|
34
34
|
|
|
35
35
|
Every semantic update cites a repository-relative `path#anchor`. A reduction requires
|
|
36
36
|
the owner decision before the affected specification changes. Exact command evidence
|
|
37
|
-
must match the
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
must match the stable Change id, exact current task ids, intent digest, HEAD, and
|
|
38
|
+
product-worktree digest identified by `.ultra/test-report.json`; stale results stay
|
|
39
|
+
visible and never become a pass. Reconcile before finalizing. If reconciliation changes
|
|
40
|
+
semantic or product files, obtain a fresh Test snapshot before writing final delivery
|
|
41
|
+
metadata or archiving. Do not create a second JSON or Markdown delivery summary.
|
|
@@ -5,13 +5,13 @@ description: Carry one planned task from a written implementation plan through r
|
|
|
5
5
|
|
|
6
6
|
# Take one task from plan to recorded evidence
|
|
7
7
|
|
|
8
|
-
The model owns
|
|
9
|
-
contract, the evidence, and everything needed to resume.
|
|
8
|
+
The model owns code reasoning and edits; repository files own the resumable contract.
|
|
10
9
|
|
|
11
10
|
## Before you start
|
|
12
11
|
|
|
13
|
-
1.
|
|
14
|
-
|
|
12
|
+
1. Resolve exactly one active `change_id`; more than one is a repository conflict. Read
|
|
13
|
+
`.ultra/tasks.json`, choose one matching `in_progress` or dependency-ready task, then read
|
|
14
|
+
its full `context_file`, especially `## Resume Note`.
|
|
15
15
|
2. Read `CONTEXT.md` for vocabulary, and the `.ultra/decisions/` entries the task
|
|
16
16
|
context names.
|
|
17
17
|
3. Read `.ultra/north-star.md` and the task's acceptance criteria. If you cannot
|
|
@@ -22,10 +22,9 @@ read `references/debugging.md` and establish the earliest incorrect state before
|
|
|
22
22
|
|
|
23
23
|
## Definition of done
|
|
24
24
|
|
|
25
|
-
- All six evidence dimensions
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
and then read back — a one-sided write breaks resume on another host.
|
|
25
|
+
- All six evidence dimensions answer the checkable rules below.
|
|
26
|
+
- `tasks.json` and context status agree after write/read-back.
|
|
27
|
+
- The task still names the active `change_id`; historical unfinished work stays out.
|
|
29
28
|
- The context file carries a Completion entry and a rewritten Resume Note.
|
|
30
29
|
- A task-level review has run and its blocking findings are resolved.
|
|
31
30
|
|
|
@@ -42,16 +41,38 @@ Follow `../ultra-tdd/SKILL.md`, writing tests only on the seams the plan already
|
|
|
42
41
|
confirmed, one slice at a time. Do no refactoring here — `ultra-review` owns it,
|
|
43
42
|
because what is worth restructuring only becomes visible after several slices.
|
|
44
43
|
|
|
44
|
+
## Converge on the task-scoped acceptance set
|
|
45
|
+
|
|
46
|
+
Development ends when the task's acceptance commands pass, not when the code looks
|
|
47
|
+
finished. Resolve the context's **Change Acceptance IDs** against the active `intent.md`
|
|
48
|
+
for `<change_id>`
|
|
49
|
+
and use each named row's executable `Verification`. Commands under the context's
|
|
50
|
+
Acceptance Criteria may add task-local checks; they do not replace the Change mapping.
|
|
51
|
+
|
|
52
|
+
Run one baseline before repairing anything. Track the best-ever passing set of mapped
|
|
53
|
+
IDs and task-local commands, the total repair rounds, and consecutive rounds that add
|
|
54
|
+
nothing to that set. The loop has three explicit exits:
|
|
55
|
+
|
|
56
|
+
| Exit | Condition | Action |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| Converged | Every mapped Change verification and task-local command exits zero | Close out below |
|
|
59
|
+
| Stalled | Two consecutive repair rounds add no new item to the best-ever passing set, or three repair rounds finish without convergence | Stop; report the remaining criteria and what each repair tried |
|
|
60
|
+
| Unreachable | A command did not start because its executable, fixture, service or declared environment prerequisite is unavailable | Stop that criterion; report the missing prerequisite and its repair path |
|
|
61
|
+
|
|
62
|
+
A nonzero exit normally means a failing criterion, not an unreachable one; inspect its
|
|
63
|
+
output. A regression never shrinks the best-ever set, and the total round limit stops
|
|
64
|
+
oscillation where different criteria alternate between pass and fail.
|
|
65
|
+
|
|
45
66
|
## Answer the six evidence dimensions
|
|
46
67
|
|
|
47
68
|
Each has a rule you can check against the work rather than assert:
|
|
48
69
|
|
|
49
70
|
| Dimension | Answered when |
|
|
50
71
|
|---|---|
|
|
51
|
-
| `tests_written` | This diff changes a test file |
|
|
72
|
+
| `tests_written` | This diff adds or changes at least one assertion — touching a test file is not enough |
|
|
52
73
|
| `tests_passed` | The last test run exited zero and covered the files this diff touched |
|
|
53
74
|
| `persistence_real` | On any path that stores data, the test uses real storage or a container |
|
|
54
|
-
| `feature_flags_audit` | No flag this
|
|
75
|
+
| `feature_flags_audit` | No flag on this change's execution path defaults to off, including flags this task did not add but now depends on |
|
|
55
76
|
| `vertical_slice` | One test's execution path runs from the entry point through to persistence |
|
|
56
77
|
| `spec_trace` | The anchor the task's `trace_to` names exists in the specification |
|
|
57
78
|
|
|
@@ -92,9 +113,7 @@ as it stands and says so in the Resume Note instead of tidying it away.
|
|
|
92
113
|
|
|
93
114
|
## References
|
|
94
115
|
|
|
95
|
-
- `../ultra-tdd/SKILL.md` — read before the first test, for the seam and
|
|
96
|
-
|
|
97
|
-
- `../ultra-think/references/autonomy-boundary.md` — read the moment the
|
|
98
|
-
specification and the implementation disagree.
|
|
116
|
+
- `../ultra-tdd/SKILL.md` — read before the first test, for the seam and mock boundary.
|
|
117
|
+
- `../ultra-think/references/autonomy-boundary.md` — read when spec and code disagree.
|
|
99
118
|
- `../ultra-review/SKILL.md` — read when implementation evidence is ready for review.
|
|
100
119
|
- `references/debugging.md` — read for a reproduced failure before selecting a repair.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ultra-grilling
|
|
3
|
-
description:
|
|
3
|
+
description: Turn caller-named missing owner decisions into confirmed answers, one question per turn and each carrying a recommendation. Use when Init needs a raw brief field, Research needs an owner decision, or Change and Plan need an explicit boundary or acceptance criterion.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Turn a vague ask into a decision list the owner has explicitly confirmed
|
|
@@ -12,8 +12,8 @@ finished work proves otherwise. It serves Goal 1, Intent Fidelity.
|
|
|
12
12
|
## Before you start
|
|
13
13
|
|
|
14
14
|
1. Reread what the owner said in the current request, verbatim.
|
|
15
|
-
2. Read `.ultra/north-star.md
|
|
16
|
-
|
|
15
|
+
2. Read `.ultra/project-brief.md`, `.ultra/north-star.md`, and `CONTEXT.md` where they
|
|
16
|
+
exist. Raw intake is reusable input; accepted wording must not be re-asked.
|
|
17
17
|
3. Look up every fact you can reach on your own: repository files, Git history,
|
|
18
18
|
installed dependencies, tool output.
|
|
19
19
|
|
|
@@ -22,18 +22,37 @@ have answered by reading the repository spends the one input only they can give.
|
|
|
22
22
|
|
|
23
23
|
## Definition of done
|
|
24
24
|
|
|
25
|
-
- Every
|
|
26
|
-
reason recorded.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
- Every field the caller named as required is either answered in the owner's own
|
|
26
|
+
words or explicitly deferred with the reason recorded. "Every branch of the
|
|
27
|
+
tree" is not something you can check against a file; the caller's field list is.
|
|
28
|
+
- The reframe below was put to the owner and either confirmed or corrected. It is
|
|
29
|
+
never skipped because the original wording sounded clear.
|
|
30
|
+
- Each answer carries the owner's confirmation, rather than something that
|
|
31
|
+
sounded like agreement.
|
|
32
|
+
- The caller owns the final artifact and receives a decision list it can write: one
|
|
33
|
+
line per decision, each with the options rejected and why.
|
|
31
34
|
|
|
32
|
-
## Extract
|
|
35
|
+
## Extract, reframe, then ask
|
|
33
36
|
|
|
34
|
-
Restate what the owner already told you and ask them to confirm the
|
|
35
|
-
Ask only about what is genuinely missing. Re-asking something they
|
|
36
|
-
teaches them that answering does not stick.
|
|
37
|
+
**Extract.** Restate what the owner already told you and ask them to confirm the
|
|
38
|
+
restatement. Ask only about what is genuinely missing. Re-asking something they
|
|
39
|
+
answered teaches them that answering does not stick.
|
|
40
|
+
|
|
41
|
+
**Reframe.** The owner describes a *form* when they want a *role*. Say what you
|
|
42
|
+
believe they actually want, name the gap against their wording, and end on a
|
|
43
|
+
question:
|
|
44
|
+
|
|
45
|
+
> You said a daily briefing app. What you described is a personal chief of staff
|
|
46
|
+
> — the briefing is one of its outputs, not the thing itself. Have I got that
|
|
47
|
+
> right?
|
|
48
|
+
|
|
49
|
+
This is what separates the loop from a questionnaire. A form accepted at face
|
|
50
|
+
value yields a specification that is internally consistent and builds the wrong
|
|
51
|
+
product. Offer the reframe, never assert it, and treat a correction as the better
|
|
52
|
+
outcome — "no, it really is just the briefing" is a constraint you did not have a
|
|
53
|
+
minute ago. Read `references/reframing.md` for when it applies and how it fails.
|
|
54
|
+
|
|
55
|
+
**Then ask** only what the confirmed reframe leaves open; the caller sets the semantic depth, so Init stops at the raw outline and leaves baseline questions to Research.
|
|
37
56
|
|
|
38
57
|
## One question per turn
|
|
39
58
|
|
|
@@ -44,14 +63,27 @@ the load-bearing one skipped.
|
|
|
44
63
|
Every question carries your recommended answer and what would change it. A
|
|
45
64
|
question without a recommendation hands your own work back to the owner.
|
|
46
65
|
|
|
47
|
-
Order questions so that answering one unlocks the next
|
|
48
|
-
|
|
66
|
+
Order questions so that answering one unlocks the next. Ask the framing questions
|
|
67
|
+
before the detail questions — a detail settled inside the wrong frame has to be
|
|
68
|
+
asked again.
|
|
69
|
+
|
|
70
|
+
**Framing questions** come first — at most five, from the table in
|
|
71
|
+
`references/reframing.md`. They refuse the owner's framing on purpose, which is
|
|
72
|
+
how they surface what the request left out. Stop early once the frame stops
|
|
73
|
+
moving.
|
|
74
|
+
|
|
75
|
+
**Detail questions** fill in the confirmed frame:
|
|
49
76
|
|
|
50
77
|
- What happens when this goes wrong, and how would we find out?
|
|
51
78
|
- Which of these options is cheaper to reverse?
|
|
52
79
|
- What are we deliberately not doing?
|
|
53
80
|
- What does done look like, concretely enough to check?
|
|
54
81
|
|
|
82
|
+
An answer counts once it is specific enough to **rule something out**. "It should
|
|
83
|
+
be fast" rules nothing out; "the list renders before they finish typing" does.
|
|
84
|
+
When an answer rules nothing out, ask what would have to be true for the owner to
|
|
85
|
+
*reject* a candidate solution.
|
|
86
|
+
|
|
55
87
|
Skip what you can derive, what does not change the work, and what they already
|
|
56
88
|
settled.
|
|
57
89
|
|
|
@@ -61,19 +93,26 @@ This whole skill is owner-facing, so the boundary is narrow: hold the loop open
|
|
|
61
93
|
until each decision is confirmed explicitly, and start no implementation on an
|
|
62
94
|
inferred consensus.
|
|
63
95
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
96
|
+
## How the loop ends
|
|
97
|
+
|
|
98
|
+
Every ending hands back the same result: decisions written one per line, each with
|
|
99
|
+
the options rejected and the reason they lost. The caller alone chooses the canonical
|
|
100
|
+
destination; Grilling never promotes an answer into project authority by itself.
|
|
68
101
|
|
|
69
|
-
|
|
102
|
+
- **Resolved** — every required field answered or explicitly deferred.
|
|
103
|
+
- **Stalled** — two consecutive turns add no newly confirmed decision. Hand back
|
|
104
|
+
the open fields and what each one blocks.
|
|
105
|
+
- **Unavailable** — the host cannot ask, or the owner stopped answering. Hand back
|
|
106
|
+
the last confirmed state, every unanswered field named.
|
|
70
107
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
108
|
+
A loop with no exit traps the owner as much as you: re-asking what they cannot
|
|
109
|
+
currently answer costs more than deferring it. Deferral is a recorded outcome,
|
|
110
|
+
not a failure. Where the host has no structured question surface, ask one plain
|
|
111
|
+
question per turn instead.
|
|
75
112
|
|
|
76
113
|
## References
|
|
77
114
|
|
|
115
|
+
- `references/reframing.md` — read before the first question: when to reframe,
|
|
116
|
+
how it fails, the five framing questions, and what counts as an answer.
|
|
78
117
|
- `../ultra-think/references/autonomy-boundary.md` — read when an answer removes
|
|
79
118
|
something the specification already promised, or otherwise crosses C5.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Reframing: recovering the role from the form
|
|
2
|
+
|
|
3
|
+
An owner fluent in their own domain still describes a **form** when what they
|
|
4
|
+
want is a **role**. They are not being vague; they are naming the nearest thing
|
|
5
|
+
they can picture. Taken at face value, that name produces a specification that is
|
|
6
|
+
internally consistent and builds the wrong product.
|
|
7
|
+
|
|
8
|
+
## When to reframe
|
|
9
|
+
|
|
10
|
+
Most first asks qualify. Any one of these is enough:
|
|
11
|
+
|
|
12
|
+
- the request names an artifact — an app, a dashboard, a bot, a script — rather
|
|
13
|
+
than an outcome;
|
|
14
|
+
- the request names a solution whose problem has not been stated;
|
|
15
|
+
- the request would be satisfied by something far smaller, or is impossible as
|
|
16
|
+
worded;
|
|
17
|
+
- two readings of the request would lead to materially different builds;
|
|
18
|
+
- the request describes what a competitor has, rather than what the owner needs.
|
|
19
|
+
|
|
20
|
+
## How to put it
|
|
21
|
+
|
|
22
|
+
State what you believe they want, name the gap against the words they used, and
|
|
23
|
+
end on a question:
|
|
24
|
+
|
|
25
|
+
> You said a daily briefing app. What you described is a personal chief of staff
|
|
26
|
+
> — the briefing is one of its outputs, not the thing itself. Have I got that
|
|
27
|
+
> right?
|
|
28
|
+
|
|
29
|
+
Rules that keep this honest:
|
|
30
|
+
|
|
31
|
+
- **One reframe at a time.** Two competing reinterpretations in one turn is a
|
|
32
|
+
quiz, and the owner will pick the one that sounds more flattering.
|
|
33
|
+
- **Offer it, never assert it.** A reframe is a hypothesis about their intent,
|
|
34
|
+
and they are the only authority on it.
|
|
35
|
+
- **A correction is the better outcome.** "No, it really is just the briefing" is
|
|
36
|
+
a constraint you did not have a minute ago. Record it as a decision.
|
|
37
|
+
- **Never reframe toward what is easier to build.** If your reinterpretation
|
|
38
|
+
happens to shrink the work, say that out loud and let the owner weigh it.
|
|
39
|
+
- **Stop after two rejected reframes.** A third is no longer listening. Take the
|
|
40
|
+
owner's framing as given and move to the framing questions below.
|
|
41
|
+
|
|
42
|
+
## Framing questions
|
|
43
|
+
|
|
44
|
+
These refuse the owner's framing on purpose, which is how they surface what the
|
|
45
|
+
request left out. Ask at most five, and stop early once the frame stops moving.
|
|
46
|
+
|
|
47
|
+
| Question | What it recovers |
|
|
48
|
+
|---|---|
|
|
49
|
+
| What do you do today, without this? | The real job, with the proposed form stripped off |
|
|
50
|
+
| What would make you say this was a waste of effort? | Success via its negative — people picture failure far more concretely than they picture success |
|
|
51
|
+
| What must never happen, even if it would work better? | The hard constraints they were never going to volunteer |
|
|
52
|
+
| If it could only do one thing and you would still use it, which? | Core against periphery, before scope has a chance to spread |
|
|
53
|
+
| Whose situation gets worse when this exists? | Stakeholders, and the constraints attached to them |
|
|
54
|
+
|
|
55
|
+
Two of these are worth their place for a specific reason. Asking for success
|
|
56
|
+
directly gets an aspiration; asking what would make it a waste gets a threshold.
|
|
57
|
+
Asking who is made worse off surfaces the constraints an owner never thinks to
|
|
58
|
+
state, because to them they are simply how the world is.
|
|
59
|
+
|
|
60
|
+
## What counts as an answer
|
|
61
|
+
|
|
62
|
+
An answer counts once it is specific enough to **rule something out**.
|
|
63
|
+
|
|
64
|
+
| Not yet an answer | An answer |
|
|
65
|
+
|---|---|
|
|
66
|
+
| "It should be fast" | "The list renders before they finish typing" |
|
|
67
|
+
| "It should be secure" | "A support agent must never see a full card number" |
|
|
68
|
+
| "Keep costs reasonable" | "Under fifty dollars a month in API spend" |
|
|
69
|
+
|
|
70
|
+
When an answer rules nothing out, do not re-ask the same question louder. Ask
|
|
71
|
+
what would have to be true for the owner to **reject** a candidate solution — the
|
|
72
|
+
rejection criterion is the constraint, stated from the other side.
|