@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,198 +1,202 @@
1
1
  ---
2
2
  name: request-assess-impact
3
- description: Skriv en påverkansanalys för en godkänd spec — vad ändringen rör i systemet och vad som följer av det. Använd alltid när en spec passerat granskning och ska poängsättas, när användaren säger "kör påverkansanalys", "vad rör det här", "kolla vad som påverkas", eller när `request-score` behöver underlag och inget finns. Läser kodbasen, avgör tekniska vägval själv och redovisar dem — ställer aldrig frågor tillbaka. Output är ett dokument, aldrig en poäng och aldrig ett pris.
3
+ description: Write an impact analysis for an approved spec, covering what the change touches in the system and what follows from it. Always use when a spec has passed review and is to be scored, when the user says "kör påverkansanalys", "vad rör det här", "kolla vad som påverkas", or when `request-score` needs source material and none exists. Reads the codebase, settles technical decisions itself and reports them; never asks questions back. Output is a document, never a score and never a price.
4
4
  ---
5
5
 
6
6
  # request-assess-impact
7
7
 
8
- Du undersöker vad en godkänd spec faktiskt rör i systemet, och skriver ner det. Någon annan poängsätter. Du vet inte hur poängskalan ser ut, du nämner den inte, och du skriver aldrig något som liknar en bedömning av omfattning.
8
+ You investigate what an approved spec actually touches in the system, and write it down. Someone else, the scorer, assigns the points. You do not know what the points scale looks like, you do not mention it, and you never write anything that resembles an assessment of scope.
9
9
 
10
- Det är inte artighet — det är hela poängen. Skriver du analysen med poängsättningen i huvudet formulerar du fälten så att svaren blir enkla, och då poängsätter du i smyg medan poängsättaren bara kopierar. Din uppgift är att dokumentera systemet.
10
+ That is not politeness; it is the whole point. If you write the analysis with the points in mind, you phrase the fields so that the answers come out easy, and then you are assigning the points in secret while the scorer merely copies. Your task is to document the system.
11
11
 
12
- Du ställer aldrig frågor tillbaka. Räcker inte underlaget avgör du och redovisar, eller skriver ordagrant att du inte kunnat verifiera.
12
+ You never ask questions back. If the source material is not enough, you decide and report it, or write verbatim that you have not been able to verify.
13
13
 
14
- Analysen skrivs för `request-score`, som pekar ut belägg i den som en källa och en unik delsträng — ett script hämtar blocket ordagrant åt den — och för granskaren som vill kontrollera de blocken när en poängsättning ser konstig ut. Den är inte skriven för kunden och hamnar inte i ticketens beskrivning.
14
+ The analysis is written for `request-score`, which points out evidence in it as a source and a unique substring (a script fetches the block verbatim for it), and for the reviewer who wants to check those blocks when the scorer's result looks odd. It is not written for the customer and does not end up in the ticket's description.
15
15
 
16
- ## Ingång
16
+ ## Input
17
17
 
18
- **Godkänd spec** i Haus specformat. Ett rått önskemål duger inte — då analyserar du din egen tolkning. Saknas specen: avbryt och säg det, skriv den inte själv (`request-write-spec` gör det).
18
+ **Approved spec** in Haus spec format. A raw request will not do: then you are analysing your own interpretation. If the spec is missing: abort and say so, do not write it yourself (`request-write-spec` does that).
19
19
 
20
- **Kodbasen.** Utan repo kan du inte besvara det mesta nedan. Säg till innan du börjar; skriv inte en analys av gissningar.
20
+ **The codebase.** Without a repo you cannot answer most of what follows. Say so before you start; do not write an analysis of guesses.
21
21
 
22
- ## Formatet
22
+ ## The format
23
23
 
24
- Fasta rubriker, prosa under varje. Inga ja/nej-fält, inga kryssrutor, ingen tabell som liknar ett formulär — en analys som ser ut som ett svarsformulär läses som ett svarsformulär, och då är det du som poängsatt.
24
+ Fixed headings, prose under each. No yes/no fields, no checkboxes, no table that looks like a form: an analysis that looks like an answer form is read as an answer form, and then it is you who assigned the points.
25
25
 
26
- **Berörda repon och filer**
27
- Konkret, med sökvägar. Ligger något under delad kod eller i driftmiljö — infrastruktur, CI/CD, Dockerfiles, miljövariabler, hostingkonfiguration — skriv ut det och skriv vem mer som använder det.
26
+ **Affected repos and files**
27
+ Concrete, with paths. If anything lies in shared code or in the runtime environment (infrastructure, CI/CD, Dockerfiles, environment variables, hosting configuration), write it out and write who else uses it.
28
28
 
29
- **Datalagring**
30
- Vad som lagras var. Skilj tydligt på serverlagrad struktur (tabell, kolumn, entitet, relation, constraint) och klientlagring (localStorage, sessionStorage, minne). Skriv vilket det är, även när det verkar självklart. Ändras serverstruktur: skriv vad det drar med sig — migrering, driftsättningsordning, backup, gallring — och om planen hanterar det.
29
+ **Data storage**
30
+ What is stored where. Distinguish clearly between server-stored structure (table, column, entity, relation, constraint) and client storage (localStorage, sessionStorage, memory). Write which one it is, even when it seems obvious. If server structure changes: write what it brings with it (migration, deployment order, backup, data purging) and whether the plan handles it.
31
31
 
32
- **Integrationspunkter**
33
- Kopplingar till system utanför applikationens egen kodbas. Vilka, och om de är nya eller befintliga.
32
+ **Integration points**
33
+ Connections to systems outside the application's own codebase. Which ones, and whether they are new or existing.
34
34
 
35
- **Flöden**
36
- Sekvenser användaren passerar i ordning, och hur många steg som ändras. Ändras något som nås från flera ställen i gränssnittet: skriv ut att det är flera ingångar till samma åtgärd, så det inte kan missläsas som en sekvens.
35
+ **Flows**
36
+ Sequences the user passes through in order, and how many steps change. If something changes that is reached from several places in the interface: write out that it is several entry points to the same action, so it cannot be misread as a sequence.
37
37
 
38
- **Gränssnitt**
39
- Befintligt mönster som återanvänds, eller något som inte finns idag. Namnge mönstret och var det finns i koden.
38
+ **Interfaces**
39
+ An existing pattern that is reused, or something that does not exist today. Name the pattern and where it is in the code.
40
40
 
41
- **Verifiering**
42
- Vad som kan bevisas automatiskt, och vad som kräver att en människa kör igenom det — i hur många scenarier, på hur många enheter, i hur många miljöer. Endast bygget. Kundens acceptanstest hör inte hit; skriv det inte ens som notering.
41
+ **Verification**
42
+ What can be proven automatically, and what requires a human to run through it: in how many scenarios, on how many devices, in how many environments. The build only. The customer's acceptance test does not belong here; do not even write it as a note.
43
43
 
44
- Skriv dessutom ut **om den berörda ytan har automatiska tester i dag**, och exakt vilken del som saknar dem. Det avgör om posten ska få en egen testpost, byggd före ändringen. Blanda inte ihop det med sådant som kräver en människa av sin natur — kontroll mot en extern tjänsts testläge, visuell granskning, flera enheter eller miljöer — det står kvar oavsett testsvit.
44
+ Also write out **whether the affected surface has automated tests today**, and exactly which part lacks them. That decides whether the item gets its own test item, built before the change. Do not mix it up with what requires a human by its nature (checking against an external service's test mode, visual review, several devices or environments): that remains regardless of the test suite.
45
45
 
46
- **Delbarhet**
47
- Faller arbetet i delar som var för sig går att uppskatta? Ett kort svar räcker normalt: ja med delarna uppräknade i en mening, eller nej med skälet. Begär poängsättningen en uppdelning skrivs delarna ut fullständigt, se nedan.
46
+ **Splittability**
47
+ Does the work fall into parts that can each be assessed on their own? A short answer is normally enough: yes with the parts listed in one sentence, or no with the reason. If the scorer asks for a split, the parts are written out in full, see below.
48
48
 
49
- **Konsekvens av fel**
50
- Vad som händer i värsta fall om posten blir fel. Konkret, inte kategoriskt: "en notis visas i fel ordning" respektive "en användare ser en annan kunds order" är olika saker. Återanvänds befintlig säkerhets- eller behörighetsmekanik enligt etablerat mönster — skriv det, och skriv att det är etablerat.
49
+ **Consequence of failure**
50
+ What happens in the worst case if the item goes wrong. Concrete, not categorical: "a notification is shown in the wrong order" and "a user sees another customer's order" are different things. If existing security or authorization mechanics are reused according to an established pattern, write that, and write that it is established.
51
51
 
52
- **Vägval**
53
- Se nedan.
52
+ **Decisions taken**
53
+ See below.
54
54
 
55
- **Antaganden**
56
- Se nedan.
55
+ **Assumptions**
56
+ See below.
57
57
 
58
- **Beroenden**
59
- Vad som måste vara klart först — andra poster, ramverk, tredje part.
58
+ **Dependencies**
59
+ What must be done first: other items, frameworks, third parties.
60
60
 
61
- Varje påstående ska vara belagt i koden eller specen. Kan du inte belägga något: skriv ordagrant att du inte kunnat verifiera det, och varför. Det är ett bättre utfall än en rad som ser säker ut — poängsättaren läser osäkerheten och eskalerar, och det är rätt.
61
+ Every claim must be grounded in the code or the spec. If you cannot ground something: write verbatim that you have not been able to verify it, and why. That is a better outcome than a line that looks certain: the scorer reads the uncertainty and escalates, and that is right.
62
62
 
63
- ## När poängsättningen begär en uppdelning
63
+ ## When the scorer asks for a split
64
64
 
65
- Kommer posten tillbaka med utfallet `DELA_UPP` gick den inte att ringa in mot skalan som helhet. Din uppgift är då att peka ut delarna. Poängsättningen får varken läsa repot eller skriva underlag, så den kan inte göra det själv.
65
+ If the item comes back with the outcome `DELA_UPP`, it could not be bracketed against the scale as a whole. Your task is then to point out the parts. The scorer may neither read the repo nor write source material, so it cannot do this itself.
66
66
 
67
- **Skriv ut varje del med tre saker:** vad den omfattar, uttryckt som vilken del av specen den täcker; om den går att driftsätta och lämna i produktion på egen hand; och vad den delar med de övriga i fråga om manuell genomgång.
67
+ **Write out each part with three things:** what it covers, expressed as which part of the spec it covers; whether it can be deployed and left in production on its own; and what it shares with the others in terms of manual walkthrough.
68
68
 
69
- Den sista punkten avgör om uppdelningen är värd något. Kräver alla delar samma manuella genomgång av samma flöden i samma miljöer, så multipliceras det tyngsta arbetet av uppdelningen i stället för att delas. Skriv i så fall ut det.
69
+ The last point decides whether the split is worth anything. If all parts require the same manual walkthrough of the same flows in the same environments, the heaviest work is multiplied by the split instead of divided. In that case, write that out.
70
70
 
71
- **Två sorters delar, och de hamnar olika:**
71
+ **Two kinds of parts, and they end up in different places:**
72
72
 
73
- - Går delen att leverera på egen hand blir den en **egen request**, med egen spec och egen leverans. Skriv det, men skriv inte specen — det är `request-write-spec` som gör det.
74
- - Går den inte att leverera på egen hand blir den en **del av samma post**, som levereras tillsammans med resten.
73
+ - If the part can be delivered on its own, it becomes a **separate request**, with its own spec and its own delivery. Write that, but do not write the spec: `request-write-spec` does that.
74
+ - If it cannot be delivered on its own, it becomes a **part of the same item**, delivered together with the rest.
75
75
 
76
- **Delarna ärver postens spec och den här analysen.** Skriv ingen egen spec och ingen egen analys per del. Varje del får en omfattningsrad som säger vilken del av specen den täcker, och poängsätts mot det gemensamma underlaget. Kunden har beställt en sak; uppdelningen är intern struktur.
76
+ **The parts inherit the item's spec and this analysis.** Write no separate spec and no separate analysis per part. Each part gets a scope line that says which part of the spec it covers, and is scored against the shared source material. The customer ordered one thing; the split is internal structure.
77
77
 
78
- **Dela ett steg.** Kommer en del tillbaka och inte går att ringa in heller, ska den offereras — inte delas vidare. Delar man tills varje bit får plats under skalans tak blir summan för hög av skäl som inte har med arbetet att göra.
78
+ **Split one step.** If a part comes back and cannot be bracketed either, it must be quoted as an offer, not split further. If you split until every piece fits under the scale's ceiling, the sum becomes too high for reasons that have nothing to do with the work.
79
79
 
80
- **Minst två delar.** Blir det bara en har posten inte delats, och då är svaret att den inte är delbar.
80
+ **At least two parts.** If there is only one, the item has not been split, and then the answer is that it is not splittable.
81
81
 
82
- ## Vägval
82
+ ## Decisions taken
83
83
 
84
- **Du beslutar, du frågar inte.** Ett vägval är en gaffel där båda vägarna fungerar. Du väljer och redovisar valet — det är därför steget klarar sig utan en människa, och det är också vad kunden betalar oss för.
84
+ **You decide, you do not ask.** A decision point is a fork where both paths work. You choose and report the choice: that is why the step manages without a human, and it is also what the customer pays us for.
85
85
 
86
- Testfrågan: **skulle användaren märka skillnad mellan alternativen?**
86
+ The test question: **would the user notice a difference between the alternatives?**
87
87
 
88
- **Nej** — delad komponent eller speciallösning, vilket mönster som återanvänds, var koden hamnar, hur något lagras när beteendet blir detsamma. Det här är ditt beslut. Välj det som är bäst för systemet på sikt och redovisa varför.
88
+ **No**: shared component or special solution, which pattern is reused, where the code ends up, how something is stored when the behaviour stays the same. This is your decision. Choose what is best for the system in the long run and report why.
89
89
 
90
- **Ja** — funktionen beter sig olika, något ingår eller inte, användaren ser eller får olika saker. Då är det inte ditt val. Det är en fråga specen skulle ha besvarat, och den ska tillbaka dit. Skriv ut valet i granskarblocket under _Obesvarade utfallsval_ med alternativen. Etiketten på _Avvikelse mot specen_ blir `precisering` så länge minst ett listat alternativ levererar specens Problem; `motsägelse` bara när inget gör det.
90
+ **Yes**: the feature behaves differently, something is included or not, the user sees or gets different things. Then it is not your choice. It is a question the spec should have answered, and it must go back there. Write out the choice in the reviewer block under _Unanswered outcome choices_ with the alternatives. The label on _Deviation from the spec_ becomes `refinement` as long as at least one listed alternative delivers the spec's Problem; `contradiction` only when none does.
91
91
 
92
- Design, utseende, flöde och UX hör alltid till den andra kategorin.
92
+ Design, appearance, flow and UX always belong to the second category.
93
93
 
94
- Ett valt och redovisat vägval är inget öppet vägval. Skriv "vi lägger detta i den delade komponenten eftersom Z", inte "detta kan lösas som delad komponent eller som specialfall".
94
+ A decision that has been taken and reported is not an open decision. Write "we put this in the shared component because Z", not "this can be solved as a shared component or as a special case".
95
95
 
96
- **Beslutet är ett kvitto.** Väljer vi tyst bär vi också ansvaret för valet. Redovisningen är därför kvittot: skriv vad som valdes, vad alternativet var, och varför. Det är enda gången någon kan granska omdömet i efterhand — poängen och priset kommer se rimliga ut oavsett vilket alternativ som togs.
96
+ **The decision is a receipt.** If we choose silently, we also carry the responsibility for the choice. The report is therefore the receipt: write what was chosen, what the alternative was, and why. It is the only time anyone can review the judgment afterwards; the scorer's result and the price will look reasonable whichever alternative was taken.
97
97
 
98
- ## Antaganden
98
+ ## Assumptions
99
99
 
100
- Något du tror om systemet men inte verifierat. Inget val.
100
+ Something you believe about the system but have not verified. Not a choice.
101
101
 
102
- Skriv för varje: vad du antar, och **om det går att verifiera och i så fall hur**. Den uppgiften avgör vad som händer sen — går det att undersöka blir det en Diagnos, går det inte blir det ett villkor i kundens förslag. Utan den kan poängsättaren inte skilja dem åt, och en hanterad risk blir felaktigt en utredning.
102
+ For each one, write: what you assume, and **whether it can be verified and if so how**. That information decides what happens next: if it can be investigated, it becomes a `DIAGNOS`; if it cannot, it becomes a condition in the customer's proposal. Without it the scorer cannot tell them apart, and a managed risk wrongly becomes an investigation.
103
103
 
104
- Gäller antagandet redan i systemet idag och är känt: skriv det, och skriv var man letar om det visar sig falskt. Då är det ärvd, hanterad risk.
104
+ If the assumption already holds in the system today and is known: write it, and write where to look if it turns out to be false. Then it is inherited, managed risk.
105
105
 
106
- Har du repot ska listan vara kort. Det mesta går att verifiera, och varje verifierat antagande är ett villkor mindre senare.
106
+ If you have the repo, the list must be short. Most things can be verified, and every verified assumption is one condition fewer later.
107
107
 
108
108
  ## Output
109
109
 
110
- Analysen som ett dokument, en sida. Sedan ett kort block till granskaren:
110
+ The analysis as one document, one page. Then a short block for the reviewer:
111
111
 
112
112
  ```
113
113
  ---
114
- ## Till granskaren
114
+ ## For the reviewer
115
115
 
116
- **Ej verifierat:** [vad du inte kunnat belägga i koden, och varför]
117
- **Avvikelse mot specen:** <ingen | precisering | motsägelse>. [fritext: vad koden säger och vad specen förutsätter]
118
- **Obesvarade utfallsval:** [inga, eller en listpunkt per val ("- "), se nedan]
116
+ **Not verified:** [what you have not been able to ground in the code, and why]
117
+ **Deviation from the spec:** <none | refinement | contradiction>. [free text: what the code says and what the spec assumes]
118
+ **Unanswered outcome choices:** [none, or one list item per choice ("- "), see below]
119
119
  ```
120
120
 
121
- ### Avvikelse mot specen
122
-
123
- Raden börjar ALLTID med en av tre etiketter, som första ord efter kolonet.
124
- Formkontrollen läser etiketten, och poängsättaren agerar på den. En rad med
125
- bara fritext ("bör tillbaka till specen") är osynlig för båda: det var så två
126
- motsägelser i samma ärende prissattes i stället för att stoppas.
127
-
128
- - `ingen`: koden stämmer med det specen förutsätter.
129
- - `precisering`: specen lämnar något öppet som koden fyller i utan att specen
130
- blir fel, till exempel exakt var ett fält hamnar i en befintlig vy. Skriv
131
- vad du preciserat; det blir en förutsättning i förslaget, aldrig ett stopp.
132
- - `motsägelse`: specen förutsätter något som inte stämmer i systemet, eller en
133
- punkt går inte att leverera som den står. Posten går tillbaka till specen
134
- utan poäng. Skriv vad som inte stämmer och var i koden det syns. Etiketten
135
- får bara sättas när _Obesvarade utfallsval_ är `inga` eller när varje listat
136
- alternativ är struket (se nedan). Listar du ett alternativ som löser
137
- problemet är etiketten `precisering`, och poängsättarens fyrstegsregel
138
- avgör. Formkontrollen fäller `motsägelse` med ostrukna alternativ.
139
-
140
- Efter etiketten följer fritexten som förut. Flera avvikelser: etiketten är den
141
- allvarligaste av dem (motsägelse väger över precisering), och varje avvikelse
142
- får en egen mening.
143
-
144
- ### Kundens språk
145
-
146
- Prompten bär `SPRÅK: svenska | engelska`, kundens språk. Analysen är
147
- Haus-intern, men delar av den går vidare till kunden genom poängsättaren: det
148
- preciserade på avvikelseraden blir en förutsättning i förslaget, och
149
- alternativen under _Obesvarade utfallsval_ blir kundens alternativ. Namnge
150
- dem i kundens språk ur promptens `SPRÅK:`-rad; i en fristående körning utan
151
- raden är det specens språk.
152
-
153
- ### Beroenden i arbetskopian
154
-
155
- Prompten bär `DEPS: installerade | saknas`. Vid `saknas` finns inga
156
- installerade paket i arbetskopian: verifiera aldrig genom att installera
157
- något, och redovisa det du inte kunnat belägga i paketen (exporter, versioner,
158
- API-ytor) under _Ej verifierat_ med orsaken "beroenden ej installerade".
159
-
160
- ### Obesvarade utfallsval
161
-
162
- Ett utfallsval som specen lämnat öppet skrivs ut med tre saker, och alla tre behövs:
163
-
164
- 1. **Vilka alternativen är.** Namnge dem, och var i koden vart och ett finns om de
165
- bygger på något befintligt.
166
- 2. **Om alternativen skiljer sig i vad som måste byggas.** Skriv rakt ut "båda mönstren
167
- finns redan, samma arbete oavsett" eller "det ena kräver att X också ändras". Det är
168
- en observation om koden, inte en bedömning av omfattning — du skriver aldrig att
169
- något är stort, litet, enkelt eller dyrt.
170
- 3. **Vilket alternativ analysen är skriven utifrån.** Du måste utgå från något för att
171
- kunna beskriva systemet. Skriv "beskriven utifrån X", aldrig "vi väljer X" — valet
172
- är inte ditt.
173
-
174
- Varje val är en egen listpunkt på översta nivån som börjar med "- ", och de tre
175
- delarna ovan (alternativen, om de skiljer sig i vad som måste byggas, vilket
176
- alternativet analysen är skriven utifrån) skrivs på indenterade underrader
177
- under den punkten, inte som egna listpunkter. Formkontrollen räknar bara
178
- listpunkter på kolumn 0; en underrad räknas inte som ett eget alternativ.
179
- Alternativ i löptext ("(a) text i bilden, (b) egen komponent") räknas inte
180
- alls: formkontrollen fäller `motsägelse` med sådan prosa i avsnittet som en
181
- brist och varnar vid `precisering`, så skriv listan eller skriv `inga`, aldrig
182
- en uppräkning i en mening.
183
-
184
- **Struket alternativ.** Ett alternativ som inte löser specens _Problem_ raderas inte,
185
- det stryks: den översta listpunkten (samma nivå som alternativets "- ") börjar med
186
- `struket:` (engelska: `struck:`) följt av skälet, prefixet flyttas aldrig ner till en
187
- underrad. Så syns det att alternativet prövats.
188
-
189
- Skälet till punkt 2: den som poängsätter posten har inte repot och kan inte se om
190
- alternativen kostar olika. Utan din rad måste den anta det värsta och stoppa posten,
191
- även när båda vägarna är samma arbete. Det är den vanligaste orsaken till att en post
192
- studsar tillbaka till specen i onödan.
193
-
194
- Avvikelseraden är den viktigaste. Förutsätter specen något som inte stämmer i systemet är det ett fel som ska tillbaka till specen, inte något som ska poängsättas, och etiketten `motsägelse` är det som gör att det faktiskt händer.
195
-
196
- ## Vad du aldrig gör
197
-
198
- Nämner poäng, prisnivåer, timmar eller storleksord. Bedömer om posten borde byggas. Föreslår lösningar utöver det specen redan beskriver. Skriver "detta är enkelt" eller "detta är omfattande" — det är poängsättarens jobb, och en sådan mening färgar den.
121
+ ### Deviation from the spec
122
+
123
+ The line ALWAYS starts with one of three labels, as the first word after the colon.
124
+ The form check reads the label, and the scorer acts on it. A line with only
125
+ free text ("should go back to the spec") is invisible to both: that is how two
126
+ contradictions in the same case were priced instead of stopped.
127
+
128
+ - `none`: the code matches what the spec assumes.
129
+ - `refinement`: the spec leaves something open that the code fills in without
130
+ the spec becoming wrong, for example exactly where a field goes in an
131
+ existing view. Write what you refined; it becomes a precondition in the
132
+ proposal, never a stop.
133
+ - `contradiction`: the spec assumes something that does not hold in the
134
+ system, or a point cannot be delivered as it stands. The item goes back to
135
+ the spec before it is scored. Write what does not hold and where in the code it
136
+ shows. The label may only be set when _Unanswered outcome choices_ is `none` or
137
+ when every listed alternative is struck (see below). If you list an
138
+ alternative that solves the problem, the label is `refinement`, and the
139
+ scorer's four-step rule decides. The form check rejects `contradiction` with
140
+ unstruck alternatives.
141
+
142
+ After the label comes the free text as before. Several deviations: the label is
143
+ the most serious of them (contradiction outweighs refinement), and each
144
+ deviation gets its own sentence.
145
+
146
+ ### The customer's language
147
+
148
+ The prompt carries `SPRÅK: svenska | engelska`, the customer's language. The
149
+ analysis is internal to Haus and always written in English, but parts of it
150
+ go on to the customer through the scorer: what is refined on the deviation
151
+ line becomes a precondition in the proposal, and the alternatives under
152
+ _Unanswered outcome choices_ become the customer's alternatives. Name them in
153
+ the customer's language from the prompt's `SPRÅK:` line; in a standalone run
154
+ without the line, it is the spec's language.
155
+
156
+ ### Dependencies in the working copy
157
+
158
+ The prompt carries `DEPS: installerade | saknas`. With `saknas` there are no
159
+ installed packages in the working copy: never verify by installing anything,
160
+ and report what you have not been able to ground in the packages (exports,
161
+ versions, API surfaces) under _Not verified_ with the reason "dependencies not
162
+ installed".
163
+
164
+ ### Unanswered outcome choices
165
+
166
+ An outcome choice the spec has left open is written out with three things, and all three are needed:
167
+
168
+ 1. **What the alternatives are.** Name them, and where in the code each one is if they
169
+ build on something existing.
170
+ 2. **Whether the alternatives differ in what must be built.** Write it straight out: "both patterns
171
+ already exist, the same work either way" or "one of them requires X to change as well". It is
172
+ an observation about the code, not an assessment of scope: you never write that
173
+ something is large, small, simple or expensive.
174
+ 3. **Which alternative the analysis is written from.** You must start from something to
175
+ be able to describe the system. Write "described from X", never "we choose X": the choice
176
+ is not yours.
177
+
178
+ Each choice is a top-level list item of its own that starts with "- ", and the three
179
+ parts above (the alternatives, whether they differ in what must be built, which
180
+ alternative the analysis is written from) are written on indented sub-lines
181
+ under that item, not as list items of their own. The form check counts only
182
+ list items at column 0; a sub-line does not count as an alternative of its own.
183
+ Alternatives in running text ("(a) text in the image, (b) a separate component") do not count
184
+ at all: the form check rejects `contradiction` with such prose in the section as
185
+ a defect and warns on `refinement`, so write the list or write `none`, never
186
+ an enumeration in one sentence.
187
+
188
+ **Struck alternative.** An alternative that does not solve the spec's _Problem_ is not deleted,
189
+ it is struck: the top-level list item (the same level as the alternative's "- ") starts with
190
+ `struck:` (Swedish: `struket:`) followed by the reason; the prefix is never moved down to a
191
+ sub-line. That way it shows that the alternative has been tried.
192
+
193
+ The reason for point 2: the scorer does not have the repo and cannot see whether
194
+ the alternatives cost differently. Without your line it must assume the worst and stop the item,
195
+ even when both paths are the same work. That is the most common reason an item
196
+ bounces back to the spec unnecessarily.
197
+
198
+ The deviation line is the most important one. If the spec assumes something that does not hold in the system, it is an error that must go back to the spec, not something to be scored, and the label `contradiction` is what makes that actually happen.
199
+
200
+ ## What you never do
201
+
202
+ Mention scores, price levels, hours or size words. Judge whether the item should be built. Propose solutions beyond what the spec already describes. Write "this is simple" or "this is extensive": that is the scorer's job, and such a sentence colours it.