ultra-builder-pro-cli 0.26.0 → 0.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.ultra-template/changes/abandoned/.gitkeep +0 -0
  2. package/.ultra-template/contexts/TEMPLATE.md +7 -0
  3. package/.ultra-template/north-star.md +20 -31
  4. package/.ultra-template/project-brief.md +28 -0
  5. package/.ultra-template/specs/product.md +4 -0
  6. package/.ultra-template/specs/research-distillate.md +8 -0
  7. package/.ultra-template/test-report.json +1 -0
  8. package/CHANGELOG.md +131 -1
  9. package/README.md +61 -29
  10. package/bin/delegate-worker.cjs +5 -0
  11. package/bin/delegate.cjs +7 -0
  12. package/docs/ARCHITECTURE.md +36 -10
  13. package/docs/ARTIFACT-AUTHORITY.md +42 -13
  14. package/docs/DECISIONS.md +24 -5
  15. package/docs/PHILOSOPHY.md +45 -12
  16. package/docs/PLUGIN-ISOLATION-CONTRACT.md +6 -3
  17. package/docs/RUNTIME-COMPAT-MATRIX.md +43 -1
  18. package/docs/SKILL-AUTHORING.md +10 -6
  19. package/docs/WORKFLOW-LIFECYCLE.md +103 -39
  20. package/hooks/README.md +12 -5
  21. package/hooks/_common.py +54 -5
  22. package/hooks/block_dangerous_commands.py +116 -10
  23. package/hooks/session_context.py +34 -8
  24. package/package.json +1 -1
  25. package/skills/ultra-change/SKILL.md +59 -52
  26. package/skills/ultra-change/references/change-contract.md +65 -7
  27. package/skills/ultra-delegate/SKILL.md +21 -3
  28. package/skills/ultra-delegate/references/delegation-contract.md +10 -2
  29. package/skills/ultra-deliver/SKILL.md +63 -21
  30. package/skills/ultra-deliver/references/baseline-reconciliation.md +5 -3
  31. package/skills/ultra-dev/SKILL.md +33 -14
  32. package/skills/ultra-grilling/SKILL.md +63 -24
  33. package/skills/ultra-grilling/references/reframing.md +72 -0
  34. package/skills/ultra-init/SKILL.md +62 -79
  35. package/skills/ultra-init/references/brownfield-adoption.md +23 -40
  36. package/skills/ultra-plan/SKILL.md +48 -24
  37. package/skills/ultra-research/SKILL.md +91 -62
  38. package/skills/ultra-research/references/{03-competitive-landscape.md → 03-alternatives.md} +6 -6
  39. package/skills/ultra-research/references/22-success-metrics.md +8 -4
  40. package/skills/ultra-research/references/99-synthesis.md +8 -1
  41. package/skills/ultra-research/references/wayfinding.md +42 -0
  42. package/skills/ultra-review/SKILL.md +31 -3
  43. package/skills/ultra-status/SKILL.md +62 -32
  44. package/skills/ultra-tdd/SKILL.md +5 -2
  45. package/skills/ultra-test/SKILL.md +31 -12
  46. package/skills/ultra-test/scripts/worktree_digest.cjs +42 -8
  47. package/skills/ultra-think/SKILL.md +5 -10
  48. package/skills/ultra-think/references/interaction-boundary.md +2 -1
@@ -10,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. Read `.ultra/tasks.json`, the delegated task's `context_file` and `## Resume Note`.
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 delegated workflow's acceptance.
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`: bounded goal, sources, acceptance and forbidden effects;
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. Absolute paths, symlink escapes, unknown fields, `readable_roots`,
16
- and non-empty external effects are rejected.
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 completed Change, run aggregate review and refactoring, refresh release documentation, and archive the local workflow record. Use when the task ledger is complete and the owner wants a delivery handoff or separately authorized release effects.
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. Commit, push, tag, publication and deployment remain
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` and each completed task's `context_file`, Completion and
14
- closing `## Resume Note`.
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` and current `HEAD`. If `git_commit` differs from HEAD,
17
- label the report stale and obtain current evidence before a release recommendation.
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
- - Actual outcome, specifications, docs, tests and aggregate review have been reconciled.
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. This is where useful
29
- refactoring occurs: several completed slices now reveal real duplication, coupling and
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. Update CHANGELOG and README when public behavior changed. Record bounded debt only
38
- in the active Change `delivery.md` under `## Technical Debt`.
39
- 4. Run the repository's build and packaging checks.
40
- 5. Determine the version impact from the public contract and project convention.
41
- 6. Follow `references/baseline-reconciliation.md` and write the one canonical active
42
- Change `delivery.md` with exact checks, residual risks, omissions and rollback.
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
- Move `.ultra/changes/active/<id>` to `.ultra/changes/archive/<id>` with `git mv` only
47
- after local reconciliation. Do not create a second standalone delivery report: archived
48
- `delivery.md`, test report, evidence and Git history are the handoff.
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 checkout identified by `.ultra/test-report.json`; stale results stay
38
- visible and never become a pass. Do not create a second JSON or Markdown delivery
39
- summary.
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 the code reasoning and the edits. The repository owns the task
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. Read `.ultra/tasks.json` and pick the task; read its `context_file` end to
14
- end, above all the closing `## Resume Note` — that line says where to pick up.
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 are answered for this task, each against the
26
- checkable rule below rather than an impression.
27
- - `tasks.json` and the context file's header state the same status, each written
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 task added defaults to off |
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 the mock
96
- boundary.
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: Interrogate an owner request until every branch of its decision tree is resolved, one question per turn, each carrying a recommended answer. Use when another skill needs the owner's intent specific enough to build from — a new project's north star, a Change boundary, or an ask whose acceptance criteria are still implicit.
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` and `CONTEXT.md` where they exist. Established
16
- wording and vocabulary are decisions that were already made.
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 branch reachable from the original ask is resolved, or deferred with the
26
- reason recorded.
27
- - Each resolved branch carries the owner's confirmation in their own words,
28
- rather than something that sounded like agreement.
29
- - The calling skill holds a decision list it can write to a file: one line per
30
- decision, each with the options rejected and why.
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 first, then ask
35
+ ## Extract, reframe, then ask
33
36
 
34
- Restate what the owner already told you and ask them to confirm the restatement.
35
- Ask only about what is genuinely missing. Re-asking something they answered
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, and prefer the ones whose
48
- answer changes what gets built:
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
- Where the host cannot present a structured question, ask one plain question per
65
- turn instead. Where it cannot ask at all, stop at the last confirmed decision,
66
- record what remains open, and hand that back to the caller — neither guessing an
67
- answer nor blocking the owner's next move.
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
- ## Hand back a list
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
- Once the tree is walked, write the decisions out one per line, each with the
72
- rejected options and the reason they lost. That list is the record. The caller
73
- chooses where it lands: `north-star.md`, `discovery.md`, a Change intent, or a
74
- decision file.
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.