@haus-tech/haus-workflow 5.6.0 → 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.
- package/CHANGELOG.md +8 -0
- package/dist/cli.js +66 -2
- package/library/global/agents/request-assessor.md +52 -51
- package/library/global/agents/request-scorer.md +52 -52
- package/library/global/agents/request-specifier-eskalerad.md +46 -44
- package/library/global/agents/request-specifier.md +43 -40
- package/library/global/skills/request/SKILL.md +1415 -1360
- package/library/global/skills/request/scripts/contract-check.mjs +17 -1
- package/library/global/skills/request/scripts/kontroll.mjs +7 -5
- package/library/global/skills/request/scripts/korning.mjs +16 -3
- package/library/global/skills/request/scripts/lib.mjs +289 -17
- package/library/global/skills/request/scripts/precheck.mjs +105 -40
- package/library/global/skills/request-assess-impact/SKILL.md +144 -140
- package/library/global/skills/request-score/SKILL.md +290 -266
- package/library/global/skills/request-sync/SKILL.md +246 -245
- package/library/global/skills/request-write-spec/SKILL.md +63 -61
- package/library/global/skills/request-write-spec/references/specformat.md +64 -60
- package/package.json +1 -1
|
@@ -1,226 +1,240 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: request-score
|
|
3
|
-
description:
|
|
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
|
-
|
|
9
|
-
`references/poangskala.md`.
|
|
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
|
-
**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
**
|
|
22
|
-
`INPUT_SAKNAS`.
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
44
|
+
`INPUT_SAKNAS` and `ESKALERA` are internal outcomes: `customer_rationale` is left empty,
|
|
45
|
+
they must never reach the customer.
|
|
33
46
|
|
|
34
|
-
|
|
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
|
-
|
|
43
|
-
de ska aldrig nå kund.
|
|
49
|
+
Two situations give `DELA_UPP`:
|
|
44
50
|
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
-
|
|
102
|
-
|
|
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
|
-
**
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
**
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
208
|
+
**Whether something is to be designed that does not exist in the system today.**
|
|
129
209
|
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
134
|
-
**säkert är större än**. Skriv ut vilket och varför.
|
|
214
|
+
## The type
|
|
135
215
|
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
152
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
160
|
-
|
|
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`
|
|
254
|
-
0
|
|
255
|
-
|
|
256
|
-
`bracket.steps`
|
|
257
|
-
|
|
258
|
-
(`storre`
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
`drivers`
|
|
265
|
-
|
|
266
|
-
(`{"kalla": "spec.md | impact.md", "delstrang": "
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
`
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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.
|