@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 +8 -8
- package/sage-analyst.md +38 -36
- package/sage-reading-analyst.md +38 -36
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shardworks/astrolabe-apparatus",
|
|
3
|
-
"version": "0.1.
|
|
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/
|
|
24
|
-
"@shardworks/
|
|
25
|
-
"@shardworks/
|
|
26
|
-
"@shardworks/spider-apparatus": "0.1.
|
|
27
|
-
"@shardworks/fabricator-apparatus": "0.1.
|
|
28
|
-
"@shardworks/loom-apparatus": "0.1.
|
|
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.
|
|
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. **
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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.
|
|
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.**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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` —
|
|
125
|
-
- `
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
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
|
-
|
|
151
|
+
Order decisions by scope item.
|
|
134
152
|
|
|
135
|
-
|
|
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
|
|
package/sage-reading-analyst.md
CHANGED
|
@@ -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)
|
|
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. **
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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.
|
|
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.**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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` —
|
|
160
|
-
- `
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|