@haus-tech/haus-workflow 5.6.1 → 5.7.0

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.
@@ -1,226 +1,240 @@
1
1
  ---
2
2
  name: request-score
3
- description: Sätter poäng på en spec plus påverkansanalys genom att jämföra uppdraget mot en skala av sjutton referensuppdrag. Använd alltid när användaren vill "sätt poäng", "poängsätt", "kör poängen", "vad landar det här på", "var på skalan ligger det", eller när en spec har en påverkansanalys och ska prissättas. Används även som grind på en fullständig implementationsplan före första kodraden — "kör guarden", "stämmer poängen fortfarande". Använd den även när poängsättning bara antyds, t.ex. när någon klistrar in en spec med underlag och frågar hur stort det är. Output är JSON med poäng och belägg, aldrig ett pris.
3
+ description: Scores a spec plus impact analysis by comparing the assignment against a scale of seventeen reference assignments. Always use when the user wants "sätt poäng", "poängsätt", "kör poängen", "vad landar det här på", "var på skalan ligger det", or when a spec has an impact analysis and is to be priced. Also used as a gate on a complete implementation plan before the first line of code: "kör guarden", "stämmer poängen fortfarande". Use it even when scoring is only implied, e.g. when someone pastes a spec with source material and asks how big it is. Output is JSON with a score and evidence, never a price.
4
4
  ---
5
5
 
6
6
  # request-score
7
7
 
8
- Du sätter poäng på en post genom att jämföra den mot referensuppdragen i
9
- `references/poangskala.md`. Läs skalan innan du poängsätter första posten i en session.
8
+ You score an item by comparing it against the reference assignments in
9
+ `references/poangskala.md`. Read the scale before you score the first item in a session.
10
10
 
11
- **Går filen inte att läsa: poängsätt inte.** Säg att `references/poangskala.md` saknas
12
- och att skillen inte kan köras utan den. Sätt aldrig en poäng på minnet av hur skalan
13
- brukar se ut. Skalan ändras när nya referensuppdrag läggs till, och en poäng satt på
14
- en gammal skala ser likadan ut som en satt på rätt skala.
11
+ **If the file cannot be read: do not score.** Say that `references/poangskala.md` is missing
12
+ and that the skill cannot run without it. Never set a score from memory of what the scale
13
+ usually looks like. The scale changes when new reference assignments are added, and a score
14
+ set on an old scale looks the same as one set on the right scale.
15
15
 
16
- **Du sätter aldrig pris.** Poäng blir pris genom en fast processavgift plus poängen
17
- gånger en konverteringsfaktor, och det räknas någon annanstans. Ligger prislistan i
18
- sammanhanget: använd den inte och säg till. Vet du vad poängen kostar drar du mot den
19
- poäng som känns rimlig att ta betalt för, och då mäter du inte längre uppdraget.
16
+ **You never set a price.** Points become a price through a fixed process fee plus the points
17
+ times a conversion factor, and that is calculated somewhere else. If the price list is in
18
+ the context: do not use it and say so. If you know what the points cost, you pull towards the
19
+ score that feels reasonable to charge for, and then you are no longer measuring the
20
+ assignment.
20
21
 
21
- **Du skriver aldrig underlaget.** Saknas spec eller påverkansanalys, avbryt med
22
- `INPUT_SAKNAS`. Skriv inte en påverkansanalys själv — då jämför du din egen text mot
23
- skalan, och belägget blir teater. `request-assess-impact` gör det, helst i en egen
24
- körning.
22
+ **You never write the source material.** If the spec or the impact analysis is missing, abort
23
+ with `INPUT_SAKNAS`. Do not write an impact analysis yourself: then you are comparing your own
24
+ text against the scale, and the evidence becomes theatre. `request-assess-impact` does that,
25
+ preferably in a separate run.
26
+
27
+ **Do not give yourself the repo in this run.** If you have it, you start verifying things
28
+ beside the source material, and then you are no longer scoring what you were given. If
29
+ something is missing in the source material, the answer is low confidence, not an
30
+ investigation of your own.
25
31
 
26
- **Ge inte dig själv repot i den här körningen.** Har du det börjar du verifiera saker
27
- vid sidan av underlaget, och då poängsätter du inte längre det du fått. Saknas något i
28
- underlaget är svaret låg konfidens, inte en egen efterforskning.
32
+ ## The stop questions first
29
33
 
30
- ## Stoppfrågorna först
34
+ A score is set only on an item that can be built. Five outcomes stop the scoring:
35
+
36
+ | Outcome | When | What must happen |
37
+ | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
38
+ | `KONCEPT` | The form is unknown: a design question, an undecided choice of approach, several solution paths without a decision | A separate item that delivers a proposal and a score on the build |
39
+ | `DIAGNOS` | The cause is unknown and can be investigated. Applies above all to faults where no one knows why something is broken | A time-boxed investigation that delivers an answer and a scored fix |
40
+ | `TILLBAKA_TILL_SPEC` | The impact analysis states `contradiction` under _Deviation from the spec_ (the spec presupposes something that does not hold), or no alternative solves the problem (step 2 below) | The spec is completed, then a new run |
41
+ | `DELA_UPP` | The item cannot be bracketed on its own: see below | A new analysis round that points out the parts, then one run per part |
42
+ | `ESKALERA` | The judgement requires a human: a price-bearing decision that must not rest on a guess, and that is neither a split question (`DELA_UPP`) nor a hole in the source material (`INPUT_SAKNAS`) | The item is shown to a human; write in `notes` which question and why |
31
43
 
32
- Poäng sätts bara på en post som går att bygga. Fem utfall stoppar poängsättningen:
44
+ `INPUT_SAKNAS` and `ESKALERA` are internal outcomes: `customer_rationale` is left empty,
45
+ they must never reach the customer.
33
46
 
34
- | Utfall | När | Vad som ska hända |
35
- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
36
- | `KONCEPT` | Formen är okänd — designfråga, oavgjort vägval, flera lösningsvägar utan beslut | Egen post som levererar ett förslag och en poäng på bygget |
37
- | `DIAGNOS` | Orsaken är okänd och går att undersöka. Gäller framför allt fel där ingen vet varför något är trasigt | Tidsboxad undersökning som levererar besked och en poängsatt åtgärd |
38
- | `TILLBAKA_TILL_SPEC` | Påverkansanalysen anger `motsägelse` under _Avvikelse mot specen_ (specen förutsätter något som inte stämmer), eller inget alternativ löser problemet (steg 2 nedan) | Specen kompletteras, sedan ny körning |
39
- | `DELA_UPP` | Posten går inte att ringa in på egen hand — se nedan | Ny analysrunda som pekar ut delarna, sedan en körning per del |
40
- | `ESKALERA` | Bedömningen kräver en människa: ett prisbärande avgörande som inte får vila på en gissning, och som varken är en delningsfråga (`DELA_UPP`) eller ett hål i underlaget (`INPUT_SAKNAS`) | Posten visas för en människa; skriv i `notes` vilken fråga och varför |
47
+ ### When the item cannot be bracketed
41
48
 
42
- `INPUT_SAKNAS` och `ESKALERA` är interna utfall: `customer_rationale` lämnas tom,
43
- de ska aldrig nå kund.
49
+ Two situations give `DELA_UPP`:
44
50
 
45
- ### När posten inte går att ringa in
51
+ - You find no ceiling, that is, no reference assignment that the item is certainly smaller
52
+ than.
53
+ - Floor and ceiling are far apart and no reference assignment lies between them, that is, the
54
+ situation that would otherwise only have given `confidence: lag`.
46
55
 
47
- Två lägen ger `DELA_UPP`:
56
+ Write in `notes` which of the situations it was, and which parts of the impact analysis
57
+ point to the item containing several separate pieces of work. **Do not point out the parts
58
+ yourself.** You may neither read the repo nor write the source material, and deciding what
59
+ can be delivered on its own requires both. `request-assess-impact` does the split; you only
60
+ say that it is needed.
48
61
 
49
- - Du hittar inget tak, alltså inget referensuppdrag som posten säkert är mindre än.
50
- - Golv och tak ligger långt isär och inget referensuppdrag finns emellan, alltså det
51
- läge som annars bara hade gett `confidence: lag`.
62
+ The split is done one step. If a part comes back and cannot be bracketed either, it becomes
63
+ `OVER_SKALAN` and is quoted as an offer: it is not split further.
64
+
65
+ **An item that already has scored parts is never scored as a whole.** The parent carries
66
+ the sum of its parts, not a figure of its own.
67
+
68
+ ### Contradiction first
52
69
 
53
- Skriv i `notes` vilket av lägena det var, och vilka delar av påverkansanalysen som
54
- pekar mot att posten rymmer flera skilda arbeten. **Peka inte ut delarna själv.** Du
55
- får varken läsa repot eller skriva underlaget, och att avgöra vad som går att leverera
56
- för sig kräver båda. `request-assess-impact` gör uppdelningen; du säger bara att den
57
- behövs.
70
+ The impact analysis's reviewer block (`## For the reviewer`) starts the line _Deviation from
71
+ the spec_ with a label: `none`, `refinement` or `contradiction`. Read it before anything
72
+ else. An archived analysis carries the Swedish forms of the same block (`## Till granskaren`,
73
+ _Avvikelse mot specen_, `ingen`, `precisering`, `motsägelse`); they mean the same thing.
74
+
75
+ `contradiction` means that the spec presupposes something that does not hold in the system,
76
+ or that a point cannot be delivered as it stands. The label is set only
77
+ when the analysis lists no unstruck alternative (ADR-0117); the form check
78
+ has already rejected an analysis that carries `contradiction` together with alternatives, so
79
+ you never meet that case. Then the outcome is
80
+ `TILLBAKA_TILL_SPEC`, without exception and before the four-step rule below: a score on
81
+ a spec that contradicts the code prices something that cannot be built. Write in
82
+ `customer_rationale`, in the customer's language, what needs to be decided. The contract
83
+ check rejects every other outcome when the analysis carries `contradiction`, and
84
+ the orchestrator normally does not dispatch you at all in that situation.
58
85
 
59
- Delningen görs ett steg. Kommer en del tillbaka och inte går att ringa in heller, blir
60
- den `OVER_SKALAN` och offereras — den delas inte vidare.
86
+ `refinement` is not a deviation to stop on: the analysis has filled in something
87
+ the spec left open without the spec becoming wrong. What was refined goes into
88
+ `assumptions_stated` as a precondition. `none` requires nothing.
89
+
90
+ ### Unanswered outcome choices
91
+
92
+ The impact analysis's reviewer block lists under _Unanswered outcome choices_ (archived:
93
+ _Obesvarade utfallsval_) the choices the spec left open, each with the alternatives, whether
94
+ they differ in what must be built, and which alternative the analysis is written from.
95
+
96
+ An item is almost never stopped for such a choice. Go through them in four steps.
97
+
98
+ **Step 1: strike what does not solve the problem.** Read the spec's heading _Problem_. An
99
+ alternative that does not solve that problem is not an alternative, it is an insufficient
100
+ solution, and it must be neither chosen nor presented. Pricing it would be selling
101
+ something that does not do what the customer asked for.
102
+
103
+ The test is the spec's own words, not your view of what the customer ought to want. Does
104
+ the alternative solve the problem as it is described? Partly is not enough.
105
+
106
+ **Step 2: if nothing remains, stop.** Then the spec contradicts itself: the problem cannot
107
+ be solved within what it describes. Set `outcome` to `TILLBAKA_TILL_SPEC` and
108
+ write in `customer_rationale` what needs to be decided, in the customer's language.
109
+
110
+ **Step 3: does the choice change the amount of work?** The analysis's line on whether the
111
+ alternatives differ in what must be built is the answer. If they do not, the choice is a
112
+ **precondition**: choose the most reasonable one, write it into `assumptions_stated` with what
113
+ was chosen and why, and keep scoring. The customer approves the precondition together with
114
+ the spec and the price.
61
115
 
62
- **En post som redan har poängsatta delar poängsätts aldrig som helhet.** Föräldern bär
63
- summan av sina delar, inte en egen siffra.
116
+ Typical examples of a precondition: which of two existing ways of showing that something is
117
+ loading is used, which of two equivalent wordings a text gets, where in an existing view a
118
+ field is placed.
119
+
120
+ **Step 4: several alternatives that all solve the problem.** Score **the simplest one** as
121
+ the item's score. Score each other alternative separately, with its own bracketing, and put
122
+ them in `alternatives`. They go to the customer as alternative solutions with their own
123
+ prices.
124
+
125
+ If the analysis's line on the amount of work is missing (it may have been written before
126
+ that rule), decide yourself from what the analysis describes, and write in `notes` that the
127
+ line was missing.
64
128
 
65
- ### Motsägelse först
129
+ Every alternative is bracketed exactly like the main alternative. An alternative with a
130
+ score but without bracketing is as invalid as an item without.
66
131
 
67
- Påverkansanalysens granskarblock börjar raden _Avvikelse mot specen_ med en
68
- etikett: `ingen`, `precisering` eller `motsägelse`. Läs den innan något annat.
132
+ An assumption that cannot be investigated is not a stop. It becomes a condition on the item,
133
+ worded in the customer's language like "bygger på att X; faller X tidigt avbryts posten utan
134
+ debitering" (in English: "relies on X; if X fails early, the item is cancelled without
135
+ charge"). Uncertainty is resolved with knowledge or conditions, never with a higher score to
136
+ be on the safe side.
137
+
138
+ ## The method: bracket, never estimate freely
69
139
 
70
- `motsägelse` betyder att specen förutsätter något som inte stämmer i systemet,
71
- eller att en punkt inte går att leverera som den står. Etiketten är satt bara
72
- när analysen inte listar något ostruket alternativ (ADR-0117); formkontrollen
73
- har redan fällt en analys som bär `motsägelse` tillsammans med alternativ, så
74
- du möter aldrig det fallet. Då är utfallet
75
- `TILLBAKA_TILL_SPEC`, utan undantag och före fyrstegsregeln nedan: en poäng på
76
- en spec som motsäger koden prissätter något som inte går att bygga. Skriv i
77
- `customer_rationale`, i kundens språk, vad som behöver avgöras. Kontrakts-
78
- kontrollen fäller varje annat utfall när analysen bär `motsägelse`, och
79
- orkestratorn dispatchar dig normalt inte alls i det läget.
140
+ A figure that comes straight out of an overall judgement cannot be reviewed and differs
141
+ between two runs. Bracket instead, in four steps. All four are reported in the outcome.
80
142
 
81
- `precisering` är ingen avvikelse att stoppa på: analysen har fyllt i något
82
- specen lämnade öppet utan att specen blev fel. Det preciserade går in i
83
- `assumptions_stated` som en förutsättning. `ingen` kräver inget.
143
+ **Step 1: find a floor.** Read the scale and find a reference assignment that the item is
144
+ **certainly larger than**. Write out which one and why.
84
145
 
85
- ### Obesvarade utfallsval
146
+ **Step 2: find a ceiling.** Find a reference assignment that the item is **certainly smaller
147
+ than**. Write out which one and why.
86
148
 
87
- Påverkansanalysens granskarblock listar under _Obesvarade utfallsval_ de val specen
88
- lämnat öppna, var och en med alternativen, om de skiljer sig i vad som måste byggas,
89
- och vilket alternativ analysen är skriven utifrån.
149
+ If you get no floor: the item is smaller than A1 and gets A1's score. The lower end of the
150
+ scale is dominated by the fixed process fee anyway.
151
+
152
+ If you get no ceiling: the item is larger than the scale's highest reference assignment. You
153
+ must have compared against the scale's topmost anchor (A16) and reported it in
154
+ `bracket.steps` before you say so; a "no ceiling" without that comparison is rejected by the
155
+ contract check. Then set `DELA_UPP` and no score, so that the item is first tried in parts.
156
+ If the item is already a split part (`split.part` in the source material, an earlier
157
+ `DELA_UPP`), you set `OVER_SKALAN` instead: the source material at that level is too thin to
158
+ compare against, and the item is quoted as a separate offer. A bundle part (`bundle.part`,
159
+ several specs from the same request) is not a split part; on a bundle part without a ceiling
160
+ the outcome is `DELA_UPP`.
90
161
 
91
- En post stoppas nästan aldrig för ett sådant val. Gå igenom dem i fyra steg.
162
+ **Step 3: narrow down.** Go through the reference assignments between floor and ceiling. For
163
+ each one: is the item larger or smaller, and on what grounds? Continue until you have two
164
+ adjacent reference assignments that the item lies between.
92
165
 
93
- **Steg 1 — stryk det som inte löser problemet.** Läs specens rubrik _Problem_. Ett
94
- alternativ som inte löser det problemet är inget alternativ, det är en otillräcklig
95
- lösning, och det ska varken väljas eller presenteras. Att prissätta det vore att sälja
96
- något som inte gör det kunden bett om.
166
+ **Step 4: place.** Set the score between the two. If the item lies closer to one of them, say
167
+ which and why. If it lands at the same level as a reference assignment, give it that
168
+ anchor's score outright.
97
169
 
98
- Testet är specens egna ord, inte din uppfattning om vad kunden borde vilja. Löser
99
- alternativet problemet som det är beskrivet? Delvis räcker inte.
170
+ **Round to the scale's resolution.** Below 3 points to the nearest 0.25, that is 0.25,
171
+ 0.5, 0.75, 1, 1.25 and so on. From 3 points and up to the nearest whole point. A
172
+ figure finer than that pretends to a precision that does not exist: two independent
173
+ assessors land in different classes in one case out of five. The rounding is mechanical and
174
+ happens after the placement, never by you choosing a rounder number while you compare.
175
+
176
+ ## What you compare on
100
177
 
101
- **Steg 2 — återstår ingenting, stoppa.** Då motsäger specen sig själv: problemet går
102
- inte att lösa inom det den beskriver. Sätt `outcome` till `TILLBAKA_TILL_SPEC` och
103
- skriv i `customer_rationale` vad som behöver avgöras, i kundens språk.
178
+ Compare on what the change **brings with it**, not on how much code is written. What
179
+ distinguishes the reference assignments, in descending order of how much they weigh:
104
180
 
105
- **Steg 3 — ändrar valet arbetsmängden?** Analysens rad om huruvida alternativen skiljer
106
- sig i vad som måste byggas är svaret. Gör de inte det är valet en **förutsättning**:
107
- välj det rimligaste, skriv in det i `assumptions_stated` med vad som valts och varför,
108
- och poängsätt vidare. Kunden godkänner förutsättningen tillsammans med spec och pris.
181
+ **Whether a human must verify by hand, and in how many cases.** That is the clearest
182
+ difference throughout the scale. An assignment covered by automated tests lies low.
183
+ One that requires going through several scenarios, on several devices or in several
184
+ environments lies high.
109
185
 
110
- Typexempel på förutsättning: vilket av två befintliga sätt att visa att något laddar som
111
- används, vilken av två likvärdiga formuleringar en text får, var i en befintlig vy ett
112
- fält placeras.
186
+ **Always assume that automated tests exist**, even when the impact analysis says that the
187
+ repo lacks a test suite. Count only the manual work that remains once a working test suite
188
+ has done its job: what requires a human by its nature, that is, a check against an external
189
+ service's test mode, visual review, or going through several devices or several
190
+ environments. If the test suite is missing, that is not a discount: the coverage is built as a
191
+ separate item before the change and is scored separately. Then fill `coverage_post` with `yta`
192
+ (the surface that lacks coverage, in the customer's language) and `omfattning` (one sentence
193
+ on what the coverage item builds). The field is what makes it possible to create the item; a
194
+ note in `notes` is not enough. Leave the field out entirely when the assumption is not made.
113
195
 
114
- **Steg 4 — flera alternativ som alla löser problemet.** Poängsätt **det enklaste** som
115
- postens poäng. Poängsätt varje övrigt alternativ för sig, med egen inringning, och lägg
116
- dem i `alternatives`. De går till kund som alternativa lösningar med egna priser.
196
+ **What happens if it goes wrong.** Incorrect payment, incorrect access to someone else's
197
+ data, lost data or broken existing functionality weighs heavily. Wrong text or a wrong sort
198
+ order weighs lightly.
117
199
 
118
- Saknas analysens rad om arbetsmängd — den kan vara skriven före den regeln — avgör
119
- själv utifrån vad analysen beskriver, och skriv i `notes` att raden saknades.
200
+ **Whether the change touches code that several customers use.** Then migration per
201
+ installation is added, and a risk that reaches beyond the one who ordered it. See A9 and
202
+ A10.
120
203
 
121
- Varje alternativ ringas in precis som huvudalternativet. Ett alternativ med en poäng
122
- men utan inringning är lika ogiltigt som en post utan.
204
+ **Whether an external system is touched**, and whether the connection is new or existing.
123
205
 
124
- Ett antagande som inte går att undersöka är inget stopp. Det blir ett villkor på posten:
125
- "bygger på att X; faller X tidigt avbryts posten utan debitering". Osäkerhet löses med
126
- kunskap eller villkor, aldrig med högre poäng för säkerhets skull.
206
+ **Whether a sequence the user passes through in order changes**, and how many steps.
127
207
 
128
- ## Metoden: ringa in, aldrig skatta fritt
208
+ **Whether something is to be designed that does not exist in the system today.**
129
209
 
130
- En siffra som kommer direkt ur en helhetsbedömning går inte att granska och blir olika
131
- mellan två körningar. Ringa in i stället, i fyra steg. Alla fyra redovisas i utfallet.
210
+ The number of files and the number of lines are **not** grounds for comparison. See the note
211
+ at the end of the scale: two reference assignments with the same score differ by an order of
212
+ magnitude in file count.
132
213
 
133
- **Steg 1 — hitta ett golv.** Läs skalan och hitta ett referensuppdrag som posten
134
- **säkert är större än**. Skriv ut vilket och varför.
214
+ ## The type
135
215
 
136
- **Steg 2 — hitta ett tak.** Hitta ett referensuppdrag som posten **säkert är mindre
137
- än**. Skriv ut vilket och varför.
216
+ Use the type to find comparable reference assignments faster, nothing else. An assignment of
217
+ a type the scale lacks is scored against the nearest ones in size, not against some invented
218
+ adjustment. Write out which type you judged the item to be: it is logged so that it can be
219
+ measured afterwards whether some type systematically lands wrong.
138
220
 
139
- Får du inget golv: posten är mindre än A1 och får A1:s poäng. Skalans nedre ände är
140
- ändå dominerad av den fasta processavgiften.
221
+ `type` is one of the five values of the scale's overview table (`## Översikt`), verbatim:
222
+ `Kundvänd funktion`, `Underhåll`, `Teknisk uppsättning`, `Integration`, `Internt verktyg`. If
223
+ the item lacks an obvious type, choose the nearest one and write the reasoning under `notes`,
224
+ never in the value itself.
141
225
 
142
- Får du inget tak: posten är större än skalans högsta referensuppdrag. Du måste ha
143
- jämfört mot skalans översta ankare (A16) och redovisat det i `bracket.steps` innan du
144
- säger det; ett "inget tak" utan den jämförelsen fälls av kontraktskontrollen. Sätt då
145
- `DELA_UPP` och ingen poäng, så att posten först prövas i delar. Är posten redan en
146
- split-del (`split.part` i underlaget, en tidigare `DELA_UPP`) sätter du i stället
147
- `OVER_SKALAN`: underlaget för den nivån är för tunt att jämföra mot, och posten
148
- offereras separat. En buntdel (`bundle.part`, flera specar ur samma önskemål) är inte
149
- en split-del; på en buntdel utan tak är utfallet `DELA_UPP`.
226
+ ## Gate mode
150
227
 
151
- **Steg 3 — snäva in.** Gå igenom referensuppdragen mellan golv och tak. För varje: är
152
- posten större eller mindre, och på vilken grund? Fortsätt tills du har två
153
- angränsande referensuppdrag som posten ligger mellan.
228
+ If the skill runs on a complete implementation plan after the customer's approval, set
229
+ `mode` to `guard`. Same scale, same method.
154
230
 
155
- **Steg 4 — placera.** Sätt poängen mellan de två. Ligger posten närmare det ena, säg
156
- vilket och varför. Landar den på samma nivå som ett referensuppdrag, ge den det
157
- ankarets poäng rakt av.
231
+ Only new structural information from the full plan may move the score, never a reassessment
232
+ of the same facts. Report which comparison step changed and the quote from the full plan
233
+ that caused it, verbatim in the plan's own language. The gate is symmetric: a lower score is
234
+ reported just as clearly as a higher one.
158
235
 
159
- **Avrunda till skalans upplösning.** Under 3 poäng till närmaste 0,25, alltså 0,25,
160
- 0,5, 0,75, 1, 1,25 och så vidare. Från 3 poäng och uppåt till närmaste hela poäng. En
161
- finare siffra än så låtsas om en noggrannhet som inte finns: två oberoende bedömare
162
- hamnar i olika klass i en femtedel av fallen. Avrundningen är mekanisk och sker efter
163
- placeringen, aldrig genom att du väljer ett rundare tal medan du jämför.
164
-
165
- ## Vad du jämför på
166
-
167
- Jämför på vad ändringen **drar med sig**, inte på hur mycket kod som skrivs. Det som
168
- skiljer referensuppdragen åt, i fallande ordning efter hur mycket de väger:
169
-
170
- **Om en människa måste verifiera för hand, och i hur många fall.** Det är den tydligaste
171
- skillnaden genom hela skalan. Ett uppdrag som täcks av automatiska tester ligger lågt.
172
- Ett som kräver genomgång i flera scenarier, på flera enheter eller i flera miljöer
173
- ligger högt.
174
-
175
- **Förutsätt alltid att automatiska tester finns**, även när påverkansanalysen säger att
176
- repot saknar testsvit. Räkna bara det manuella arbete som återstår när en fungerande
177
- testsvit gjort sitt: det som kräver en människa av sin natur, alltså kontroll mot en
178
- extern tjänsts testläge, visuell granskning, eller genomgång på flera enheter eller i
179
- flera miljöer. Saknas testsviten är det inte en rabatt: täckningen byggs som en egen
180
- post före ändringen och poängsätts för sig. Fyll då `coverage_post` med `yta` (den
181
- yta som saknar täckning, i kundens språk) och `omfattning` (en mening om vad
182
- täckningsposten bygger). Fältet är det som gör att posten kan skapas, en not i
183
- `notes` räcker inte. Utelämna fältet helt när antagandet inte görs.
184
-
185
- **Vad som händer om det blir fel.** Felaktig betalning, felaktig åtkomst till någon
186
- annans uppgifter, förlorad data eller bruten befintlig funktion väger tungt. Fel text
187
- eller fel sorteringsordning väger lätt.
188
-
189
- **Om ändringen rör kod som flera kunder använder.** Då tillkommer migrering per
190
- installation och en risk som når utanför beställaren. Se A9 och A10.
191
-
192
- **Om ett externt system berörs**, och om kopplingen är ny eller befintlig.
193
-
194
- **Om en sekvens som användaren passerar i ordning ändras**, och hur många steg.
195
-
196
- **Om något ska formges som inte finns i systemet i dag.**
197
-
198
- Antal filer och antal rader är **inte** jämförelsegrunder. Se noten sist i skalan: två
199
- referensuppdrag med samma poäng skiljer sig med en tiopotens i filantal.
200
-
201
- ## Typen
202
-
203
- Använd typen för att hitta jämförbara referensuppdrag snabbare, ingenting annat. Ett
204
- uppdrag av en typ som saknas i skalan poängsätts mot de närmaste i storlek, inte mot
205
- någon påhittad justering. Skriv ut vilken typ du bedömt posten som — den loggas för att
206
- kunna mäta i efterhand om någon typ hamnar systematiskt fel.
207
-
208
- `type` är ett av översiktstabellens fem värden, ordagrant: Kundvänd funktion, Underhåll,
209
- Teknisk uppsättning, Integration, Internt verktyg. Saknar posten en självklar typ, välj
210
- den närmaste och skriv resonemanget under `notes`, aldrig i själva värdet.
211
-
212
- ## Grindläget
213
-
214
- Körs skillen på en fullständig implementationsplan efter kundens godkännande, sätt
215
- `mode` till `guard`. Samma skala, samma metod.
216
-
217
- Endast ny strukturell information ur fullplanen får flytta poängen, aldrig en
218
- omvärdering av samma fakta. Rapportera vilket jämförelsesteg som ändrades och citatet ur
219
- fullplanen som orsakade det. Grinden är symmetrisk — en lägre poäng rapporteras lika
220
- tydligt som en högre.
221
-
222
- Bygger fullplanen ett annat vägval än det som såldes är det en händelse att rapportera
223
- även när poängen blir densamma.
236
+ If the full plan builds a different choice of approach than the one that was sold, that is an
237
+ event to report even when the score stays the same.
224
238
 
225
239
  ## Output
226
240
 
@@ -250,91 +264,101 @@ Bygger fullplanen ett annat vägval än det som såldes är det en händelse att
250
264
  }
251
265
  ```
252
266
 
253
- `score` sätts bara när `outcome` är `POANG`, och alltid på skalans upplösning: steg om
254
- 0,25 under 3 poäng, hela poäng från 3 och uppåt.
255
-
256
- `bracket.steps` är jämförelserna från steg 3, en per referensuppdrag du vägde mot. Varje
257
- steg är ett objekt med exakt tre nycklar: `anchor` (ankarets id, `A12`), `relation`
258
- (`storre` om posten är större än ankaret, `mindre` om den är mindre, `lika` om den är
259
- jämbördig; ASCII, samma stil som `hog/medel/lag`) och `grund` (på vilken grund, en eller
260
- två meningar). Inga andra nycklar, ingen poäng i steget: ankarets poäng står i skalan.
261
- Det är det som gör poängen granskbar, och det är stegen driftvakten jämför mellan två
262
- körningar. En poäng utan inringning är inte ett giltigt utfall.
263
-
264
- `drivers` är de två eller tre faktorer som mest avgjorde placeringen. Varje driver är
265
- ett objekt: `pastaende` (faktorn med dina ord, utan citattecken) och `ankare`
266
- (`{"kalla": "spec.md | impact.md", "delstrang": "unik delsträng ur källblocket"}`).
267
- Ett block är ett stycke, en listpunkt, en rubrik eller en fetstilsetikett på egen
268
- rad. Delsträngen ska ligga inom ETT block och vara unik i källan — en träff i två
269
- block är ett hårt kontraktsbrott. Ett script löser ankaret till källblocket
270
- ordagrant i fältet `citat`. Du citerar aldrig själv: du pekar, koden citerar.
271
-
272
- `assumptions_stated` är de utfallsval specen lämnat öppna som **inte** ändrar
273
- arbetsmängden: vad du valt, och varför. De går med förslaget till kund som
274
- förutsättningar och godkänns tillsammans med specen och priset.
275
-
276
- `alternatives` är de övriga vägar som också löser problemet, en post var med `label`
277
- (vad alternativet innebär, i kundens språk), `score`, `bracket` och `adds` (vad som
278
- tillkommer jämfört med det valda). Alternativ som inte löser specens problem hör inte
279
- hit och ska utelämnas helt. Är listan tom fanns bara en väg som löser problemet.
280
-
281
- `notes` är iakttagelser som inte hör till poängen men som någon bör känna till, till
282
- exempel att ett repo saknar testsvit.
283
-
284
- `coverage_post` är valfritt: bara när repot saknar den täckning skalan förutsätter
285
- (se "Vad du jämför på"). `yta` är den yta som saknar täckning, i kundens språk;
286
- `omfattning` är en mening om vad täckningsposten bygger. Utelämna fältet helt när
287
- antagandet inte görs.
288
-
289
- **Ett antagande som analysen flaggat som overifierat ska alltid ut.** Går det att
290
- undersöka hör det till `notes` med hur det undersöks. Går det inte att undersöka blir
291
- det ett villkor i `conditions`, formulerat som "bygger på att X; faller X tidigt
292
- avbryts posten utan debitering". Ett overifierat antagande som varken syns i det ena
293
- eller det andra försvinner tyst, och då bär Haus en risk ingen beslutat om.
294
-
295
- `confidence` sätts till `lag` när posten inte liknar något referensuppdrag, när golv och
296
- tak ligger långt isär och inget referensuppdrag finns emellan, eller när
297
- påverkansanalysen anger att något inte kunnat verifieras och det påverkar placeringen.
298
- Låg konfidens är ett giltigt utfall och ska inte döljas genom att välja en poäng som
299
- ser rimlig ut.
300
-
301
- ### Motiveringen till kund
302
-
303
- `customer_rationale` skrivs i kundens språk och beskriver arbetet som ska göras, inte
304
- hur skalan räknade. Nämn aldrig poäng, referensuppdrag, ankare eller skalan. Kunden ska
305
- kunna invända mot omfattningen, inte mot modellen.
306
-
307
- **Kundens språk** är, överallt i den här skillen, det promptens `SPRÅK:`-rad anger
308
- (`svenska` eller `engelska`); i en fristående körning utan raden är det specens språk.
309
- Det gäller `customer_rationale`, `conditions`, `assumptions_stated`, `alternatives`
310
- (`label` och `adds`) och `coverage_post.yta`. Kontrollen fäller kundtext på fel språk,
311
- och en sådan post dispatchas om i sin helhet.
312
-
313
- Finns alternativ: beskriv dem sist, som egna vägar med var sitt pris. En mening var
314
- räcker — vad kunden får i stället, och vad som tillkommer. Priset räknas ur poängen
315
- någon annanstans; skriv aldrig ut poängen.
316
-
317
- Den ska vara förenlig med specens _Ingår inte_. Motiverar du poängen med arbete som
318
- specen uttryckligen undantar har du poängsatt fel post.
319
-
320
- ## Efter körning
321
-
322
- Granskaren läser inringningen, inte slutpoängen. En rimlig poäng med fel jämförelser är
323
- en felkalibrering som råkade landa rätt, och den kommer tillbaka i en post där den inte
324
- gör det.
325
-
326
- Korrigeringar går till skalan, alltså till referensuppdragen eller till den här
327
- instruktionen, och till kalibreringsloggen. Aldrig till priset på den enskilda posten.
328
-
329
- Visar det sig återkommande att poster av ett visst slag är svåra att placera, är det ett
330
- tecken på att skalan har ett hål och behöver ett referensuppdrag till. Rapportera det.
331
-
332
- ## Acceptanstestet — granskarens sak, inte din
333
-
334
- Skillen verifieras genom att köras mot poster med känt utfall. Det underlaget ligger med
335
- flit **inte** i den här mappen — en körning som kan läsa facit kan inte längre testas. Du
336
- ska varken leta efter det eller rapportera det som saknat.
337
-
338
- För granskaren gäller två mått: att två oberoende körningar av samma post ger samma
339
- poäng, och att inringningen håller vid granskning. Det första är det som avgör om
340
- kunderna får samma pris för samma arbete.
267
+ `score` is set only when `outcome` is `POANG`, and always at the scale's resolution: steps of
268
+ 0.25 below 3 points, whole points from 3 and up.
269
+
270
+ `bracket.steps` are the comparisons from step 3, one per reference assignment you weighed
271
+ against. Each step is an object with exactly three keys: `anchor` (the anchor's id, `A12`),
272
+ `relation` (`storre` if the item is larger than the anchor, `mindre` if it is smaller, `lika`
273
+ if it is on a par; ASCII, the same style as `hog/medel/lag`) and `grund` (on what grounds,
274
+ one or two sentences). No other keys, no score in the step: the anchor's score is in the
275
+ scale. That is what makes the score reviewable, and those are the steps the drift guard
276
+ compares between two runs. A score without bracketing is not a valid outcome.
277
+
278
+ `drivers` are the two or three factors that most decided the placement. Each driver is
279
+ an object: `pastaende` (the factor in your own words, without quotation marks) and `ankare`
280
+ (`{"kalla": "spec.md | impact.md", "delstrang": "unique substring from the source block"}`).
281
+ A block is a paragraph, a list item, a heading or a bold label on its own
282
+ line. The substring must lie within ONE block and be unique in the source: a hit in two
283
+ blocks is a hard contract breach. The substring is copied verbatim from the source, in the
284
+ source's language (the spec follows the customer's language; the analysis is in English, or
285
+ in Swedish in an archived run), and never translated. A script resolves the anchor to the
286
+ source block verbatim in the field `citat`. You never quote yourself: you point, the code
287
+ quotes.
288
+
289
+ `assumptions_stated` are the outcome choices the spec left open that do **not** change the
290
+ amount of work: what you chose, and why. They go with the proposal to the customer as
291
+ preconditions and are approved together with the spec and the price.
292
+
293
+ `alternatives` are the other paths that also solve the problem, one entry each with `label`
294
+ (what the alternative means, in the customer's language), `score`, `bracket` and `adds` (what
295
+ is added compared with the chosen one). Alternatives that do not solve the spec's problem do
296
+ not belong here and must be left out entirely. If the list is empty, there was only one path
297
+ that solves the problem.
298
+
299
+ `notes` are observations that do not belong to the score but that someone ought to know
300
+ about, for example that a repo lacks a test suite.
301
+
302
+ `coverage_post` is optional: only when the repo lacks the coverage the scale presupposes
303
+ (see "What you compare on"). `yta` is the surface that lacks coverage, in the customer's
304
+ language; `omfattning` is one sentence on what the coverage item builds. Leave the field out
305
+ entirely when the assumption is not made.
306
+
307
+ **An assumption that the analysis flagged as unverified must always come out.** If it can be
308
+ investigated, it belongs in `notes` with how it is investigated. If it cannot be
309
+ investigated, it becomes a condition in `conditions`, worded in the customer's language like
310
+ "bygger på att X; faller X tidigt avbryts posten utan debitering". An unverified assumption
311
+ that shows up in neither the one nor the other disappears silently, and then Haus carries a
312
+ risk nobody decided on.
313
+
314
+ `confidence` is set to `lag` when the item does not resemble any reference assignment, when
315
+ floor and ceiling are far apart and no reference assignment lies between them, or when the
316
+ impact analysis states that something could not be verified and it affects the placement.
317
+ Low confidence is a valid outcome and must not be hidden by choosing a score that looks
318
+ reasonable.
319
+
320
+ ### The rationale to the customer
321
+
322
+ `customer_rationale` is written in the customer's language and describes the work to be
323
+ done, not how the scale counted. Never mention points or scores, reference assignments,
324
+ anchors or the scale, in either language (in Swedish: `poäng`, `referensuppdrag`, `ankare`,
325
+ `skalan`). The customer must be able to object to the scope, not to the model.
326
+
327
+ **The customer's language** is, everywhere in this skill, what the prompt's `SPRÅK:` line
328
+ gives (`svenska` or `engelska`); in a standalone run without the line, it is the spec's
329
+ language. It applies to `customer_rationale`, `conditions`, `assumptions_stated`,
330
+ `alternatives` (`label` and `adds`) and `coverage_post.yta`. Every other free-text field in
331
+ the envelope is internal and always written in English (`pastaende` in `drivers`, `why` and
332
+ `grund` in `bracket`, `notes`, `coverage_post.omfattning`, `guard_diff`); enum values and JSON
333
+ field names stay verbatim, and only a verbatim substring or quote keeps its source's language. The check rejects customer text in the wrong language, and
334
+ such an item is dispatched again in its entirety.
335
+
336
+ If there are alternatives: describe them last, as separate paths each with its own price.
337
+ One sentence each is enough: what the customer gets instead, and what is added. The price is
338
+ calculated from the score somewhere else; never write out the score.
339
+
340
+ The rationale must be consistent with the spec's _Not included_ (_Ingår inte_ in a Swedish
341
+ spec). If you justify the score with work that the spec explicitly excludes, you have scored
342
+ the wrong item.
343
+
344
+ ## After a run
345
+
346
+ The reviewer reads the bracketing, not the final score. A reasonable score with the wrong
347
+ comparisons is a miscalibration that happened to land right, and it comes back in an item
348
+ where it does not.
349
+
350
+ Corrections go to the scale, that is, to the reference assignments or to this instruction,
351
+ and to the calibration log. Never to the price of the individual item.
352
+
353
+ If it turns out repeatedly that items of a certain kind are hard to place, that is a sign
354
+ that the scale has a hole and needs one more reference assignment. Report it.
355
+
356
+ ## The acceptance test: the reviewer's business, not yours
357
+
358
+ The skill is verified by running it against items with a known outcome. That material is
359
+ deliberately **not** in this folder: a run that can read the answer key can no longer be
360
+ tested. You must neither look for it nor report it as missing.
361
+
362
+ For the reviewer, two measures apply: that two independent runs of the same item give the
363
+ same score, and that the bracketing holds up under review. The first is what decides whether
364
+ customers get the same price for the same work.