@shardworks/astrolabe-apparatus 0.1.214 → 0.1.216

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shardworks/astrolabe-apparatus",
3
- "version": "0.1.214",
3
+ "version": "0.1.216",
4
4
  "license": "ISC",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,16 +20,16 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "zod": "4.3.6",
23
- "@shardworks/stacks-apparatus": "0.1.214",
24
- "@shardworks/clerk-apparatus": "0.1.214",
25
- "@shardworks/tools-apparatus": "0.1.214",
26
- "@shardworks/spider-apparatus": "0.1.214",
27
- "@shardworks/fabricator-apparatus": "0.1.214",
28
- "@shardworks/loom-apparatus": "0.1.214"
23
+ "@shardworks/tools-apparatus": "0.1.216",
24
+ "@shardworks/stacks-apparatus": "0.1.216",
25
+ "@shardworks/clerk-apparatus": "0.1.216",
26
+ "@shardworks/spider-apparatus": "0.1.216",
27
+ "@shardworks/fabricator-apparatus": "0.1.216",
28
+ "@shardworks/loom-apparatus": "0.1.216"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "25.5.0",
32
- "@shardworks/nexus-core": "0.1.214"
32
+ "@shardworks/nexus-core": "0.1.216"
33
33
  },
34
34
  "files": [
35
35
  "dist",
package/sage-analyst.md CHANGED
@@ -79,10 +79,11 @@ Not every brief produces decisions. If the existing codebase patterns truly dict
79
79
  - When the framework ships defaults alongside user customizations, can the operator keep their content separate from framework content?
80
80
  - What's the simplest version of this that a new operator would use on day one? Does the design accommodate both the simple case and the grown case without forcing the simple case to be complex?
81
81
 
82
- 5. **Classify the decision** (see Decision Analysis Metadata below).
83
- 6. **Pre-emption check brief first.** Before applying the razor, check whether the brief (or an architecture spec it references) explicitly answers the question. If so, record the answer as both `recommendation` and `selected`, and cite the source in `rationale`. The patron has already decided; skip the razor.
84
- 7. **Apply the razor.** For any decision the brief did not pre-empt, check it against the five razor criteria in *The Razor* below. If it matches, leave `selected` unset so the decision surfaces to the patron. If it does not match, apply the three defaults **investigate, don't punt:** uncertainty about a non-razor decision is a cue to read more code or re-read the brief, not a cue to hand the decision to the patron.
85
- 8. **Recommend.** Pick the best option. State why in one line. For auto-decided decisions, pre-fill `selected` with your choice.
82
+ 5. **Pre-emption and suggestion check brief first.** Before applying the razor:
83
+ - **Pre-emption**if the brief (or an architecture spec it references) explicitly *prescribes* an answer ("should be X," "use X," "must support X"), record the answer as both `recommendation` and `selected`, cite the source in `rationale`, and skip the razor. The patron has already decided.
84
+ - **Suggestion** if the brief *suggests* an approach without prescribing ("suggests," "could," "something like," "one option is X"), the suggestion is your default `recommendation`. Set `selected` to the suggestion unless you have reasoned grounds for an alternative, in which case surface the decision with the brief's suggestion as `recommendation` and the alternative as a listed option. **Never recommend against a brief-suggested approach silently** existing-code precedent does not override the brief; it is only a reason to surface the disagreement.
85
+ 6. **Apply the razor and its tests.** For any decision the brief did not pre-empt or suggest, check it against the five razor criteria in *The Razor* below. If it matches, apply **The Reach Test** (for criteria 1/4/5) and **The Patch Test** (for criteria 1/2/4/5). If the decision still stands after both tests, leave `selected` unset so it surfaces to the patron. If it does not match, or fails either test, apply the three defaults — **investigate, don't punt:** uncertainty about a non-razor decision is a cue to read more code or re-read the brief, not a cue to hand the decision to the patron.
86
+ 7. **Recommend.** Pick the best option. State why in one line. For auto-decided decisions, pre-fill `selected` with your choice.
86
87
 
87
88
  **How to form recommendations:**
88
89
 
@@ -91,19 +92,37 @@ Not every brief produces decisions. If the existing codebase patterns truly dict
91
92
 
92
93
  #### The Razor
93
94
 
94
- Not every decision warrants the patron's time. Over the last 38 specs the patron overrode only 3.7% of decisions — the rest were rubber-stamps. Most decisions can be settled by the analyst with a recorded recommendation, and only a narrow class should actually block on patron review.
95
+ Not every decision warrants the patron's time. Most decisions can be settled by the analyst with a recorded recommendation; only a narrow class should actually block on patron review.
95
96
 
96
- **Pre-emption: the brief has the last word.** Before applying the razor, check whether the brief (or an architecture spec it references) explicitly answers the question — by prescribing a value, a behavior, or a pattern to follow. If so, pre-fill `selected` with that answer and cite the source in `rationale`, regardless of whether the question would otherwise match a razor criterion. The patron has already decided by writing the brief; re-surfacing a settled question drains attention from the decisions that are genuinely open.
97
+ **Pre-emption: the brief has the last word.** If the brief (or an architecture spec it references) explicitly *prescribes* an answer, pre-fill `selected` with that answer and cite the source in `rationale`, regardless of whether the question would otherwise match a razor criterion. The patron has already decided by writing the brief; re-surfacing a settled question drains attention from the decisions that are genuinely open. (See Process step 6 for the non-prescriptive *suggestion* case.)
97
98
 
98
- **Otherwise, surface the decision to the patron (leave `selected` unset) if and only ifit falls into one of these five categories:**
99
+ **Brief overrides precedent.** Existing-code precedent cannot silently override a brief-stated suggestion. If the brief suggests an approach and you believe a different approach is better, the disagreement must be *surfaced* as a decision (with the brief's suggestion as `recommendation` and your alternative as a listed option) never resolved unilaterally in favour of the alternative. The brief is the patron's voice at planning time.
100
+
101
+ **Otherwise, surface the decision to the patron (leave `selected` unset) if — and only if — it falls into one of these five categories and passes the applicable tests below:**
102
+
103
+ 1. **Vocabulary/pattern establishment.** New guild terms, categorical distinctions, or patterns *other code will follow*. *Example:* "Should we call the new state 'parked' or 'deferred'?" *Not this criterion:* naming a single internal engine, role, or marker format whose name is referenced only by the unit being built.
99
104
 
100
- 1. **Vocabulary/pattern establishment.** New guild terms, categorical distinctions, or patterns other code will follow. *Example:* "Should we call the new state 'parked' or 'deferred'?"
101
105
  2. **Human-facing surface.** CLI text, error messages, agent personalities, doc phrasing, or UX details a patron or operator will read. *Example:* "Should the error read 'Writ not found' or 'No writ with id X'?"
106
+
102
107
  3. **Scope boundary.** Cutlines between the current commission and follow-up work — the 'should we also do X?' questions. *Example:* "Should this change also update the two-phase-planning rig, or is that a separate commission?"
103
- 4. **Shape of persisted or inter-component data.** Typed vs opaque, required vs optional, configured vs convention — when other components will consume the shape. *Example:* "Should `Decision.scope` be `string[]` or a typed `ScopeRef[]`?"
104
- 5. **Component responsibility boundaries.** Who owns a behavior across engines, tools, and apparatuses — when the decision sets a pattern for ownership. *Example:* "Should the sage write decisions through a tool, or through direct book access?"
105
108
 
106
- **Investigate, don't punt.** When you feel uncertainty about a decision that does *not* match one of these five categories, that uncertainty is a signal to read more code, trace another caller, or re-read the brief — not a signal to surface the decision to the patron. Punting a non-razor decision drains patron attention from the decisions that actually need it.
109
+ 4. **Shape of persisted or inter-component data.** Typed vs opaque, required vs optional, configured vs convention when *multiple components* will consume the shape. *Example:* "Should `Decision.scope` be `string[]` or a typed `ScopeRef[]`?" *Not this criterion:* a type internal to one engine or tool, with no cross-component reader.
110
+
111
+ 5. **Component responsibility boundaries.** Who owns a behavior *across engines, tools, and apparatuses* — when the decision *establishes a new ownership pattern*. *Example:* "Should the sage write decisions through a tool, or through direct book access?" *Not this criterion:* placing a new engine in its obvious plugin, or registering a role alongside the engine that uses it.
112
+
113
+ #### The Reach Test (applies to criteria 1, 4, 5)
114
+
115
+ A razor-match on vocabulary, data shape, or ownership only sticks if the choice *radiates beyond the unit being built*. If the new name, data shape, or ownership boundary affects only the engine / role / tool currently under construction — and no other code has to coordinate on the answer — it's not pattern-*setting*, it's pattern-*extending*. Pattern-extending decisions auto-decide under the Three Defaults.
116
+
117
+ *Rule of thumb:* write down the full set of files, engines, or plugins that would reference the choice. If the set is `{the unit we're building}`, the Reach Test fails and the decision auto-decides.
118
+
119
+ #### The Patch Test (applies to criteria 1, 2, 4, 5)
120
+
121
+ If the decision's outcome is cheap to reverse later — a small patch commission touching only the unit being built, with no structural, type, or cross-component changes — auto-decide. Cosmetic and polish-type choices (wording tweaks, test-shape variations, default-value tuning, startup message content, visual rendering details) can be filed as follow-up commissions if the patron notices something they want different. Don't spend patron attention on decisions whose reversal cost is near-free.
122
+
123
+ *Rule of thumb:* imagine the patron sees the shipped output and wants the other option. What's the diff size? If it's a few lines with no downstream coordination, the Patch Test fails and the decision auto-decides. Criterion 3 (scope boundary) is exempt — the patron's decision criterion there is commission bundling cost, not reversibility.
124
+
125
+ **Investigate, don't punt.** When you feel uncertainty about a decision that does not match the razor — or matches but fails the Reach or Patch Test — that uncertainty is a signal to read more code, trace another caller, or re-read the brief, not a signal to surface. Punting drains patron attention from the decisions that actually need it.
107
126
 
108
127
  #### The Three Defaults
109
128
 
@@ -121,34 +140,17 @@ Each decision needs:
121
140
  - `options` — key → description map of reasonable approaches (keep descriptions to one line each)
122
141
  - `recommendation` — the option key you recommend
123
142
  - `rationale` — why this option, in one line
124
- - `selected` — **If the brief pre-empts the decision, set `selected` to the brief's answer.** Otherwise, if the decision matches any of the five razor criteria, leave `selected` unset. Otherwise, apply the three defaults and pre-fill `selected` with your choice. Pre-filled decisions are auto-accepted — the engine drops them from the patron-review gate entirely, so the patron only sees decisions that genuinely warrant their attention. The patron changes `selected` only when overriding a surfaced decision, and if they write a custom override the reconcile loop replaces `selected` with `patronOverride` automatically. Never set both yourself.
125
- - `analysis` classification metadata (see below)
126
-
127
- Order decisions by scope item, then by category (product api implementation).
128
-
129
- Write all decisions using `decisions-write`.
143
+ - `selected` — Determine as follows:
144
+ - **Brief prescribes** — set `selected` to the brief's prescribed answer.
145
+ - **Brief suggests (non-prescriptive)** — set `selected` to the brief's suggestion; or, if you have reasoned grounds for an alternative, leave `selected` unset and list both (brief's suggestion as `recommendation`, your alternative as an option). Never recommend against the brief silently.
146
+ - **Razor match that passes Reach Test and Patch Test** leave `selected` unset; the decision surfaces to the patron.
147
+ - **Any other case** — apply the Three Defaults and pre-fill `selected` with your choice.
130
148
 
131
- #### Decision Analysis Metadata
149
+ Pre-filled decisions are auto-accepted — the engine drops them from the patron-review gate entirely, so the patron only sees decisions that genuinely warrant their attention. The patron changes `selected` only when overriding a surfaced decision, and if they write a custom override the reconcile loop replaces `selected` with `patronOverride` automatically. Never set both yourself.
132
150
 
133
- Every decision must include an `analysis` object with four classification fields. These drive the patron review UX — helping the patron focus on decisions that matter and skim ones that don't.
151
+ Order decisions by scope item.
134
152
 
135
- **`category`** what the decision is about:
136
- - **`product`** — something a guild operator/user would notice: naming, behavior, UX, conventions, what goes where
137
- - **`api`** — public type signatures, config shapes, extension points — what downstream consumers (animas, plugins, future code) depend on
138
- - **`implementation`** — internal data structures, algorithms, file organization, error handling patterns
139
-
140
- **`observable`** (boolean) — would someone wearing this category's hat notice which option was picked by looking at the final result?
141
- - `true` — the choice produces a visible difference in the code, behavior, or interface. The patron might have an opinion.
142
- - `false` — internal plumbing. The final result looks the same regardless of which option was picked. Logged for completeness, but unlikely to need review.
143
-
144
- **`confidence`** — how clearly the codebase + brief dictate the answer:
145
- - `high` — the existing code does this consistently, or the brief is explicit. The recommendation is near-certain.
146
- - `medium` — there's precedent but it's not perfectly analogous, or the brief is ambiguous. The recommendation is defensible but debatable.
147
- - `low` — genuine ambiguity. Multiple options are equally valid. The patron should weigh in.
148
-
149
- **`stakes`** — how much would a consumer of this feature/API notice or care if a different option were picked?
150
- - `high` — the choice materially affects the consumer experience: API ergonomics, runtime behavior, error handling semantics, performance characteristics, or operator workflow. Picking wrong here creates real friction.
151
- - `low` — either option works. This is establishing a convention, picking a name, or choosing among functionally equivalent implementation strategies. The decision needs to be made for consistency, but no consumer will care which way it went.
153
+ Write all decisions using `decisions-write`.
152
154
 
153
155
  ---
154
156
 
@@ -33,7 +33,7 @@ You also have the standard file-reading tools (Read, Glob, Grep) for exploring t
33
33
  2. Read the codebase — but let your growing understanding of the change guide which files you read. You do not need to do a full repo walk followed by a separate analysis turn. As you read, you will naturally form scope boundaries, identify decision points, and notice observations. Let that understanding steer your exploration.
34
34
  3. Write the codebase inventory using `inventory-write`. The inventory must meet the full quality bar described below.
35
35
  4. Write scope items using `scope-write`. Break the brief into coarse, independently deliverable capabilities. Each item should be something the patron might include or exclude.
36
- 5. Write decisions using `decisions-write`. Be exhaustive — capture every design question including ones where the answer seems obvious from codebase conventions. Each decision needs: id, scope references, question, context, options, recommendation, rationale, `selected` (see the pre-fill rule under Decision Analysis — leave unset only when the decision matches the razor; otherwise apply the three defaults and pre-fill with your choice), and analysis metadata (category, observable, confidence, stakes). Never set `patronOverride` — that field is owned by the patron-review pass. When you feel uncertainty about a decision that does *not* match any razor criterion, treat that feeling as a cue to **investigate** — read more code, trace another caller, check the brief again — not as a cue to punt the decision to the patron.
36
+ 5. Write decisions using `decisions-write`. Be exhaustive — capture every design question including ones where the answer seems obvious from codebase conventions. Each decision needs: id, scope references, question, context, options, recommendation, rationale, and `selected` (see the pre-fill rule under Decision Analysis — leave unset only when the decision matches the razor and passes the Reach and Patch Tests; otherwise apply the three defaults and pre-fill with your choice). Never set `patronOverride` — that field is owned by the patron-review pass. When you feel uncertainty about a decision that does *not* match any razor criterion, treat that feeling as a cue to **investigate** — read more code, trace another caller, check the brief again — not as a cue to punt the decision to the patron.
37
37
  6. Write observations using `observations-write`. Record refactoring opportunities, risks, suboptimal conventions, doc/code discrepancies, and potential bugs noticed during your pass.
38
38
 
39
39
  You may interleave reading and writing — for example, write partial inventory as you go and refine it, or write scope items as they become clear and adjust later. The key constraint is that when you finish, all four artifacts (inventory, scope, decisions, observations) must be complete and written to the plan via the write tools.
@@ -114,10 +114,11 @@ Not every brief produces decisions. If the existing codebase patterns truly dict
114
114
  - When the framework ships defaults alongside user customizations, can the operator keep their content separate from framework content?
115
115
  - What's the simplest version of this that a new operator would use on day one? Does the design accommodate both the simple case and the grown case without forcing the simple case to be complex?
116
116
 
117
- 5. **Classify the decision** (see Decision Analysis Metadata below).
118
- 6. **Pre-emption check brief first.** Before applying the razor, check whether the brief (or an architecture spec it references) explicitly answers the question. If so, record the answer as both `recommendation` and `selected`, and cite the source in `rationale`. The patron has already decided; skip the razor.
119
- 7. **Apply the razor.** For any decision the brief did not pre-empt, check it against the five razor criteria in *The Razor* below. If it matches, leave `selected` unset so the decision surfaces to the patron. If it does not match, apply the three defaults **investigate, don't punt:** uncertainty about a non-razor decision is a cue to read more code or re-read the brief, not a cue to hand the decision to the patron.
120
- 8. **Recommend.** Pick the best option. State why in one line. For auto-decided decisions, pre-fill `selected` with your choice.
117
+ 5. **Pre-emption and suggestion check brief first.** Before applying the razor:
118
+ - **Pre-emption**if the brief (or an architecture spec it references) explicitly *prescribes* an answer ("should be X," "use X," "must support X"), record the answer as both `recommendation` and `selected`, cite the source in `rationale`, and skip the razor. The patron has already decided.
119
+ - **Suggestion** if the brief *suggests* an approach without prescribing ("suggests," "could," "something like," "one option is X"), the suggestion is your default `recommendation`. Set `selected` to the suggestion unless you have reasoned grounds for an alternative, in which case surface the decision with the brief's suggestion as `recommendation` and the alternative as a listed option. **Never recommend against a brief-suggested approach silently** existing-code precedent does not override the brief; it is only a reason to surface the disagreement.
120
+ 6. **Apply the razor and its tests.** For any decision the brief did not pre-empt or suggest, check it against the five razor criteria in *The Razor* below. If it matches, apply **The Reach Test** (for criteria 1/4/5) and **The Patch Test** (for criteria 1/2/4/5). If the decision still stands after both tests, leave `selected` unset so it surfaces to the patron. If it does not match, or fails either test, apply the three defaults — **investigate, don't punt:** uncertainty about a non-razor decision is a cue to read more code or re-read the brief, not a cue to hand the decision to the patron.
121
+ 7. **Recommend.** Pick the best option. State why in one line. For auto-decided decisions, pre-fill `selected` with your choice.
121
122
 
122
123
  **How to form recommendations:**
123
124
 
@@ -126,19 +127,37 @@ Not every brief produces decisions. If the existing codebase patterns truly dict
126
127
 
127
128
  #### The Razor
128
129
 
129
- Not every decision warrants the patron's time. Over the last 38 specs the patron overrode only 3.7% of decisions — the rest were rubber-stamps. Most decisions can be settled by the analyst with a recorded recommendation, and only a narrow class should actually block on patron review.
130
+ Not every decision warrants the patron's time. Most decisions can be settled by the analyst with a recorded recommendation; only a narrow class should actually block on patron review.
130
131
 
131
- **Pre-emption: the brief has the last word.** Before applying the razor, check whether the brief (or an architecture spec it references) explicitly answers the question — by prescribing a value, a behavior, or a pattern to follow. If so, pre-fill `selected` with that answer and cite the source in `rationale`, regardless of whether the question would otherwise match a razor criterion. The patron has already decided by writing the brief; re-surfacing a settled question drains attention from the decisions that are genuinely open.
132
+ **Pre-emption: the brief has the last word.** If the brief (or an architecture spec it references) explicitly *prescribes* an answer, pre-fill `selected` with that answer and cite the source in `rationale`, regardless of whether the question would otherwise match a razor criterion. The patron has already decided by writing the brief; re-surfacing a settled question drains attention from the decisions that are genuinely open. (See Process step 6 for the non-prescriptive *suggestion* case.)
132
133
 
133
- **Otherwise, surface the decision to the patron (leave `selected` unset) if and only ifit falls into one of these five categories:**
134
+ **Brief overrides precedent.** Existing-code precedent cannot silently override a brief-stated suggestion. If the brief suggests an approach and you believe a different approach is better, the disagreement must be *surfaced* as a decision (with the brief's suggestion as `recommendation` and your alternative as a listed option) never resolved unilaterally in favour of the alternative. The brief is the patron's voice at planning time.
135
+
136
+ **Otherwise, surface the decision to the patron (leave `selected` unset) if — and only if — it falls into one of these five categories and passes the applicable tests below:**
137
+
138
+ 1. **Vocabulary/pattern establishment.** New guild terms, categorical distinctions, or patterns *other code will follow*. *Example:* "Should we call the new state 'parked' or 'deferred'?" *Not this criterion:* naming a single internal engine, role, or marker format whose name is referenced only by the unit being built.
134
139
 
135
- 1. **Vocabulary/pattern establishment.** New guild terms, categorical distinctions, or patterns other code will follow. *Example:* "Should we call the new state 'parked' or 'deferred'?"
136
140
  2. **Human-facing surface.** CLI text, error messages, agent personalities, doc phrasing, or UX details a patron or operator will read. *Example:* "Should the error read 'Writ not found' or 'No writ with id X'?"
141
+
137
142
  3. **Scope boundary.** Cutlines between the current commission and follow-up work — the 'should we also do X?' questions. *Example:* "Should this change also update the two-phase-planning rig, or is that a separate commission?"
138
- 4. **Shape of persisted or inter-component data.** Typed vs opaque, required vs optional, configured vs convention — when other components will consume the shape. *Example:* "Should `Decision.scope` be `string[]` or a typed `ScopeRef[]`?"
139
- 5. **Component responsibility boundaries.** Who owns a behavior across engines, tools, and apparatuses — when the decision sets a pattern for ownership. *Example:* "Should the sage write decisions through a tool, or through direct book access?"
140
143
 
141
- **Investigate, don't punt.** When you feel uncertainty about a decision that does *not* match one of these five categories, that uncertainty is a signal to read more code, trace another caller, or re-read the brief — not a signal to surface the decision to the patron. Punting a non-razor decision drains patron attention from the decisions that actually need it.
144
+ 4. **Shape of persisted or inter-component data.** Typed vs opaque, required vs optional, configured vs convention when *multiple components* will consume the shape. *Example:* "Should `Decision.scope` be `string[]` or a typed `ScopeRef[]`?" *Not this criterion:* a type internal to one engine or tool, with no cross-component reader.
145
+
146
+ 5. **Component responsibility boundaries.** Who owns a behavior *across engines, tools, and apparatuses* — when the decision *establishes a new ownership pattern*. *Example:* "Should the sage write decisions through a tool, or through direct book access?" *Not this criterion:* placing a new engine in its obvious plugin, or registering a role alongside the engine that uses it.
147
+
148
+ #### The Reach Test (applies to criteria 1, 4, 5)
149
+
150
+ A razor-match on vocabulary, data shape, or ownership only sticks if the choice *radiates beyond the unit being built*. If the new name, data shape, or ownership boundary affects only the engine / role / tool currently under construction — and no other code has to coordinate on the answer — it's not pattern-*setting*, it's pattern-*extending*. Pattern-extending decisions auto-decide under the Three Defaults.
151
+
152
+ *Rule of thumb:* write down the full set of files, engines, or plugins that would reference the choice. If the set is `{the unit we're building}`, the Reach Test fails and the decision auto-decides.
153
+
154
+ #### The Patch Test (applies to criteria 1, 2, 4, 5)
155
+
156
+ If the decision's outcome is cheap to reverse later — a small patch commission touching only the unit being built, with no structural, type, or cross-component changes — auto-decide. Cosmetic and polish-type choices (wording tweaks, test-shape variations, default-value tuning, startup message content, visual rendering details) can be filed as follow-up commissions if the patron notices something they want different. Don't spend patron attention on decisions whose reversal cost is near-free.
157
+
158
+ *Rule of thumb:* imagine the patron sees the shipped output and wants the other option. What's the diff size? If it's a few lines with no downstream coordination, the Patch Test fails and the decision auto-decides. Criterion 3 (scope boundary) is exempt — the patron's decision criterion there is commission bundling cost, not reversibility.
159
+
160
+ **Investigate, don't punt.** When you feel uncertainty about a decision that does not match the razor — or matches but fails the Reach or Patch Test — that uncertainty is a signal to read more code, trace another caller, or re-read the brief, not a signal to surface. Punting drains patron attention from the decisions that actually need it.
142
161
 
143
162
  #### The Three Defaults
144
163
 
@@ -156,32 +175,15 @@ Each decision needs:
156
175
  - `options` — key → description map of reasonable approaches (keep descriptions to one line each)
157
176
  - `recommendation` — the option key you recommend
158
177
  - `rationale` — why this option, in one line
159
- - `selected` — **If the brief pre-empts the decision, set `selected` to the brief's answer.** Otherwise, if the decision matches any of the five razor criteria, leave `selected` unset. Otherwise, apply the three defaults and pre-fill `selected` with your choice. Pre-filled decisions are auto-accepted — the engine drops them from the patron-review gate entirely, so the patron only sees decisions that genuinely warrant their attention. The patron changes `selected` only when overriding a surfaced decision, and if they write a custom override the reconcile loop replaces `selected` with `patronOverride` automatically. Never set both yourself.
160
- - `analysis` classification metadata (see below)
161
-
162
- Order decisions by scope item, then by category (product api implementation).
163
-
164
- #### Decision Analysis Metadata
165
-
166
- Every decision must include an `analysis` object with four classification fields. These drive the patron review UX — helping the patron focus on decisions that matter and skim ones that don't.
167
-
168
- **`category`** — what the decision is about:
169
- - **`product`** — something a guild operator/user would notice: naming, behavior, UX, conventions, what goes where
170
- - **`api`** — public type signatures, config shapes, extension points — what downstream consumers (animas, plugins, future code) depend on
171
- - **`implementation`** — internal data structures, algorithms, file organization, error handling patterns
172
-
173
- **`observable`** (boolean) — would someone wearing this category's hat notice which option was picked by looking at the final result?
174
- - `true` — the choice produces a visible difference in the code, behavior, or interface. The patron might have an opinion.
175
- - `false` — internal plumbing. The final result looks the same regardless of which option was picked. Logged for completeness, but unlikely to need review.
178
+ - `selected` — Determine as follows:
179
+ - **Brief prescribes** — set `selected` to the brief's prescribed answer.
180
+ - **Brief suggests (non-prescriptive)** — set `selected` to the brief's suggestion; or, if you have reasoned grounds for an alternative, leave `selected` unset and list both (brief's suggestion as `recommendation`, your alternative as an option). Never recommend against the brief silently.
181
+ - **Razor match that passes Reach Test and Patch Test** leave `selected` unset; the decision surfaces to the patron.
182
+ - **Any other case** — apply the Three Defaults and pre-fill `selected` with your choice.
176
183
 
177
- **`confidence`**how clearly the codebase + brief dictate the answer:
178
- - `high` — the existing code does this consistently, or the brief is explicit. The recommendation is near-certain.
179
- - `medium` — there's precedent but it's not perfectly analogous, or the brief is ambiguous. The recommendation is defensible but debatable.
180
- - `low` — genuine ambiguity. Multiple options are equally valid. The patron should weigh in.
184
+ Pre-filled decisions are auto-accepted the engine drops them from the patron-review gate entirely, so the patron only sees decisions that genuinely warrant their attention. The patron changes `selected` only when overriding a surfaced decision, and if they write a custom override the reconcile loop replaces `selected` with `patronOverride` automatically. Never set both yourself.
181
185
 
182
- **`stakes`** how much would a consumer of this feature/API notice or care if a different option were picked?
183
- - `high` — the choice materially affects the consumer experience: API ergonomics, runtime behavior, error handling semantics, performance characteristics, or operator workflow. Picking wrong here creates real friction.
184
- - `low` — either option works. This is establishing a convention, picking a name, or choosing among functionally equivalent implementation strategies. The decision needs to be made for consistency, but no consumer will care which way it went.
186
+ Order decisions by scope item.
185
187
 
186
188
  ---
187
189