@haus-tech/haus-workflow 5.1.0 → 5.3.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 CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.3.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.2.0...v5.3.0) (2026-09-09)
4
+
5
+ ### Features
6
+
7
+ - **request-sync:** Original request title speglar Original request ([#542](https://github.com/WeAreHausTech/haus-workflow/issues/542)) ([cb7afea](https://github.com/WeAreHausTech/haus-workflow/commit/cb7afea56473d493b3f1776a490df778312a1651))
8
+
9
+ ## [5.2.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.1.0...v5.2.0) (2026-09-08)
10
+
11
+ ### Features
12
+
13
+ - **request:** avslutning "var posten står" via archive.mjs nasta-steg, Asana-fältnamnen följer poängaxeln ([#530](https://github.com/WeAreHausTech/haus-workflow/issues/530), [#529](https://github.com/WeAreHausTech/haus-workflow/issues/529)) ([#538](https://github.com/WeAreHausTech/haus-workflow/issues/538)) ([2582d12](https://github.com/WeAreHausTech/haus-workflow/commit/2582d12e0a0921318375cf2c6671fb359196cd18))
14
+ - **request:** formkrav på utfallsvalen, språkgrind på kundtexten, assessorns verktyg och egenbygge som prisavgörande ([#520](https://github.com/WeAreHausTech/haus-workflow/issues/520), [#521](https://github.com/WeAreHausTech/haus-workflow/issues/521), [#523](https://github.com/WeAreHausTech/haus-workflow/issues/523), [#524](https://github.com/WeAreHausTech/haus-workflow/issues/524)) ([#539](https://github.com/WeAreHausTech/haus-workflow/issues/539)) ([160d7b4](https://github.com/WeAreHausTech/haus-workflow/commit/160d7b4a72c2187d3975cd6837d790442d127f6c))
15
+ - **request:** mätkedjan bokför effort som begärd, samtidigheten och pid på en pågående körning ([#525](https://github.com/WeAreHausTech/haus-workflow/issues/525), [#526](https://github.com/WeAreHausTech/haus-workflow/issues/526), [#516](https://github.com/WeAreHausTech/haus-workflow/issues/516)) ([#537](https://github.com/WeAreHausTech/haus-workflow/issues/537)) ([fe8d01d](https://github.com/WeAreHausTech/haus-workflow/commit/fe8d01d70394b4c2caa8a3f471f1b408d48abbb1)), closes [#493](https://github.com/WeAreHausTech/haus-workflow/issues/493)
16
+
17
+ ### Bug Fixes
18
+
19
+ - **request:** kundtextfix täcker coverage_post.yta och en lyckad omdispatch bär sitt brott ([#517](https://github.com/WeAreHausTech/haus-workflow/issues/517), [#522](https://github.com/WeAreHausTech/haus-workflow/issues/522)) ([#536](https://github.com/WeAreHausTech/haus-workflow/issues/536)) ([b13a8f4](https://github.com/WeAreHausTech/haus-workflow/commit/b13a8f4d206a620ce7fa642c4b9b90bed1e22711))
20
+
3
21
  ## [5.1.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.0.1...v5.1.0) (2026-09-03)
4
22
 
5
23
  ### Features
@@ -21,17 +21,25 @@ repot — du läser koden på riktigt. Du frågar aldrig något och skriver inga
21
21
  katalogen finns och ser ut som rätt projekt innan du börjar), `DEPS:`
22
22
  (`installerade` eller `saknas`: vid saknas finns inga paket i arbetskopian,
23
23
  installera aldrig något, och redovisa det du inte kunnat belägga i paketen
24
- under _Ej verifierat_ enligt skillen), `KÄLLOR:` (källmanifestet specifiern
24
+ under _Ej verifierat_ enligt skillen), `SPRÅK:` (`svenska` eller
25
+ `engelska`: kundens språk, som analysens kundvända delar följer enligt
26
+ skillen), `KÄLLOR:` (källmanifestet specifiern
25
27
  fick: grep-träffar och sökvägar från starten, ett underlag att verifiera,
26
28
  aldrig ett facit; läs vidare själv där det pekar och belägg varje påstående
27
29
  i koden som förut).
28
30
  3. Spåra påverkan i koden med Read/Grep/Glob: delad kod, datalagring,
29
31
  integrationspunkter, flöden, gränssnitt, testtäckning. Det du inte kan
30
32
  verifiera skrivs ordagrant som overifierat, enligt skillen.
31
- 4. Bash får ENDAST användas för läsande git-kommandon (`git ls-files`,
32
- `git check-ignore`, `git log`, `git grep`) — spårningsstatus är ofta
33
- analysens tyngsta faktum och ska verifieras, inte antas. Aldrig kommandon
34
- som skriver, installerar eller kör kod.
33
+ 4. Bash får ENDAST användas för läsande git-kommandon: `git ls-files`,
34
+ `git check-ignore`, `git log`, `git grep`, `git status` och
35
+ `git rev-parse` — spårningsstatus är ofta analysens tyngsta faktum och
36
+ ska verifieras, inte antas. Kör dem som enkla, fristående kommandon:
37
+ ett `rtk`-prefix behövs aldrig men tillåts (`rtk git log`), aldrig
38
+ `git -C <katalog>` (kör från repo-roten), och aldrig kedjor med `&&` eller
39
+ `;` till något annat än pipe-målen `head`, `grep`, `wc` och `ls`. Allt
40
+ annat nekas tyst av behörighetslagret i headless-läget, och analysen står
41
+ då utan det faktum den skulle ha verifierat. Aldrig kommandon som
42
+ skriver, installerar eller kör kod.
35
43
  5. Skillens abortgrindar gäller: saknas spec eller repo, avbryt och säg exakt
36
44
  vad som saknas i stället för att gissa.
37
45
 
@@ -18,7 +18,9 @@ genom inringning mot skalans ankare, aldrig genom fri estimering.
18
18
  Läs skalan (`references/poangskala.md`) innan du poängsätter — kan den inte
19
19
  läsas: poängsätt inte, returnera felet i klartext.
20
20
  2. Läs prompten: `REQUEST_ID:`, `MODE: pricing | guard`, `DELPOST:` (split-läge —
21
- avgör om ett takfall är `DELA_UPP` eller `OVER_SKALAN`), samt `SPEC:` och
21
+ avgör om ett takfall är `DELA_UPP` eller `OVER_SKALAN`), `SPRÅK:`
22
+ (`svenska` eller `engelska`: kundens språk, som varje kundtextfält i
23
+ kuvertet skrivs på; kontrollen fäller fel språk), samt `SPEC:` och
22
24
  `PÅVERKANSANALYS:` som ABSOLUTA SÖKVÄGAR (ADR-0099): läs de två filerna
23
25
  via Read, ordagrant och i sin helhet — det är ditt underlag (guard-läge:
24
26
  även `FULLPLAN:` och `TIDIGARE_POANG:` med förra körningens JSON). Mode
@@ -302,7 +302,10 @@ Modellkörningar från `utvärdera` bor i ett eget träd och är aldrig prispost
302
302
  till `experiments` får suffixet `-post`.
303
303
  - `experiment.json` bär `varianter: []` i deklarationsordning och `status` per
304
304
  körning: `"klar"`, `"ofärdig"`, `"stopp"`, `"väntar på dom"`. Literalerna
305
- skrivs exakt så, mellanslag och diakritiska tecken inkluderade. Äldre filer
305
+ skrivs exakt så, mellanslag och diakritiska tecken inkluderade. Startraden
306
+ (`"ofärdig"`, "startad, inte avslutad") bär dessutom startarens `pid`
307
+ medan körningen pågår; slutstatusen ersätter raden och tar bort den
308
+ (#516). Äldre filer
306
309
  med `baselinemodell` och `kandidatmodell` läses utan fel; nya skrivningar
307
310
  använder bara `varianter`. Filen skrivs BARA av `archive.mjs experiment`
308
311
  (se `utvärdera` steg 1), aldrig för hand.
@@ -325,7 +328,10 @@ Modellkörningar från `utvärdera` bor i ett eget träd och är aldrig prispost
325
328
  REPO-ROT, annars `saknas`; utan repo alltid `saknas`).
326
329
  Skriv manifestet till `<katalog>/kallmanifest.md` i varje katalog specen
327
330
  arkiveras i (steg 5), så att `bedöm` kan ge assessorn samma manifest utan
328
- att bygga ett nytt.
331
+ att bygga ett nytt. Manifestets första rad är `SPRÅK: <svenska|engelska>`,
332
+ samma värde som prompten fick: `bedöm` läser språket därifrån till
333
+ assessorns och scorerns `SPRÅK:`-rad och till `kontroll.mjs --sprak`,
334
+ aldrig ur en ny gissning (#521).
329
335
  Manifestet har sist sektionen `## Avgjorda val`: varje val som en människa
330
336
  avgjort efter ett tidigare stopp, en rad var, ordagrant som svaret gavs;
331
337
  `inga` om inga. Specifiern får aldrig flagga ett val som står där.
@@ -408,6 +414,8 @@ ja: …`), kör `archive.mjs stopp <katalog> --utfall TILLBAKA_TILL_SPEC
408
414
  det bara på uttrycklig begäran. När en post läggs på brädan: sätt status
409
415
  `spec_synced`, döp om slug-katalogen till det myntade gid:t, notera sluggen
410
416
  i `former_slug` och uppdatera `request_id` i `state.json`.
417
+ **Avsluta enligt `## Avslutning: var posten står`** (tabellen ur
418
+ `archive.mjs nasta-steg`, brädraden, ISÄR-kontrollen), aldrig utan.
411
419
 
412
420
  ## Uppgift: `bedöm`
413
421
 
@@ -453,7 +461,9 @@ driftvakt.
453
461
  Dispatcha `request-assessor` enligt promptmallen — specens granskarblock
454
462
  skickas med som internt underlag (samma förtroendedomän; flaggorna där är
455
463
  ofta analysens viktigaste ingång). Promptens `KÄLLOR:`-rad bär
456
- `kallmanifest.md` ur katalogen ordagrant, eller `inga` när filen saknas;
464
+ `kallmanifest.md` ur katalogen ordagrant, eller `inga` när filen saknas,
465
+ och `SPRÅK:`-raden bär manifestets `SPRÅK:`-värde (#521: kundtextens
466
+ språk gissas aldrig om, samma rad går till scorern i steg 4);
457
467
  assessorn verifierar manifestet själv och ska aldrig ta det för sant
458
468
  (ADR-0113: assessorn utforskade repot från noll trots att manifestet redan
459
469
  fanns). Arkivera svaret som `impact.md`
@@ -480,10 +490,15 @@ driftvakt.
480
490
  Ingen prislista, inget repo, inga andra posters dokument i prompten.
481
491
  5. **Ankarlösning och kontraktskontroll.** Skriv agentens hela svarstext (JSON
482
492
  plus svansrader) till fil och kör
483
- `node <skillkatalog>/scripts/kontroll.mjs <svar.txt> <spec.md> <impact.md> --expect-id <katalogens id> --ut <svar.json> --fixa-kundtext --state <katalog>/state.json`.
493
+ `node <skillkatalog>/scripts/kontroll.mjs <svar.txt> <spec.md> <impact.md> --expect-id <katalogens id> --ut <svar.json> --fixa-kundtext --state <katalog>/state.json --sprak <svenska|engelska>`.
484
494
  `--state` ger contract-check split-status: `OVER_SKALAN` på något som inte
485
495
  är en split-del fälls, och ett inget-tak-utfall utan steg mot A16 fälls
486
- (#503). Scriptet strippar svansraderna (`MODELL:`, `LÄSTA:`, ev. `AVVIKELSE:`),
496
+ (#503). `--sprak` ger contract-check kundtextens språk, samma värde som
497
+ promptens `SPRÅK:`-rad (ur `experiment.json` i utvärdera, ur `SPRÅK:` i
498
+ `kallmanifest.md` här): kundtext med minst två funktionsord ur fel språk
499
+ fälls som BROTT och går till omdispatch, aldrig till kundtextfixen, som
500
+ byter ord men inte översätter (#521).
501
+ Scriptet strippar svansraderna (`MODELL:`, `LÄSTA:`, ev. `AVVIKELSE:`),
487
502
  reparerar det dispatchern redan vet (`request_id`, enumform,
488
503
  siffersträngar, LÄSTA-radens sökvägsform) och kör check-lasta,
489
504
  `resolve-anchors.mjs` (beläggsankare till ordagranna källblock;
@@ -599,7 +614,9 @@ ref-hash.mjs på request-score/references/poangskala.md>
599
614
  `detaljer <post>` gör det. Skriv-tillbaka till brädan sker via request-sync
600
615
  i huvudkonversationen, bara på uttrycklig begäran — och det är den flytten
601
616
  som tar posten ✅ Spec ok → ⚖️ Poängsättning redo för granskning enligt
602
- syncens regler.
617
+ syncens regler. **Avsluta enligt `## Avslutning: var posten står`**
618
+ (tabellen ur `archive.mjs nasta-steg`, brädraden, ISÄR-kontrollen, och
619
+ stopputfall eller OLIKA som ett val användaren ska ta), aldrig utan.
603
620
 
604
621
  **Stopputfall routas, aldrig tolkas.** Ett stopputfall arkiveras som varvets
605
622
  fil (steg 7), statusen blir `assessed`, aldrig `priced`, och posten routas:
@@ -660,6 +677,9 @@ missta:
660
677
  bekräftelsefråga. Säg tydligt att detta inte syns för någon annan än arkivet.
661
678
  - Verben rör Offer status och kommentarer — aldrig Score, Class eller
662
679
  beskrivningsfält.
680
+ - **Avsluta enligt `## Avslutning: var posten står`** när posten har en
681
+ arkivkatalog: tabellen ur `archive.mjs nasta-steg` plus brädraden, så
682
+ flytten syns tillsammans med vad den öppnar för (`bedöm`, kund, inget).
663
683
 
664
684
  ## Uppgift: `döm`
665
685
 
@@ -724,6 +744,10 @@ körd igen för samma post, vars återupptagbarhetsregel omvärderar en
724
744
  Notisen är råmaterial till nästa instruktionsversion (mekanismen bakom
725
745
  v0.2 till v0.6) och läses aldrig in i någon prompt. `archive.mjs kalibrering <arkivrot>`
726
746
  listar alla.
747
+ 4. **Avsluta enligt `## Avslutning: var posten står`**: tabellen ur
748
+ `archive.mjs nasta-steg` visar om spärren lyfts (raden pekar då vidare på
749
+ sync/godkänn) eller fortfarande väntar (`döm` igen efter en beställd
750
+ omkörning), plus brädraden.
727
751
 
728
752
  **Granskarutslag skrivs som citat, aldrig som prosa.** När granskarens
729
753
  beslut ska in i underlaget, alltså när det ändrar eller preciserar en
@@ -901,12 +925,13 @@ Frågan gäller alltså kostnaden, inte risken att förlora data.
901
925
  node <skillkatalog>/scripts/svep.mjs --repo-rot <abs> --konto <namn> \
902
926
  --modell <modell> [--modell <modell>]... \
903
927
  --exp experiments/<slug> [--exp experiments/<slug>]... \
904
- [--tickets-parallellt 2] [--om | --hoppa-över]
928
+ [--tickets-parallellt 2] [--modeller-parallellt 4] [--om | --hoppa-över]
905
929
  ```
906
930
 
907
931
  Varje varv startas av `svep.mjs` som EN `korning.mjs`-process, och det är
908
- det som ger mätningen gratis. Parallellregeln: två tickets åt gången, alla
909
- modeller för en ticket startar samtidigt, och nästa ticket startar först när en tickets samtliga
932
+ det som ger mätningen gratis. Parallellregeln: två tickets åt gången, högst
933
+ fyra modeller för en ticket i flykt (`--modeller-parallellt`, #526), och
934
+ nästa ticket startar först när en tickets samtliga
910
935
  modeller är klara. Det är säkert därför att körningskatalogerna redan är
911
936
  isolerade (`ny-korning` är atomisk, varje varv har egen katalog, manifest
912
937
  och repo läses bara) och det enda delade tillståndet, `experiment.json`,
@@ -943,7 +968,12 @@ Frågan gäller alltså kostnaden, inte risken att förlora data.
943
968
  `matning.json`: en process kan inte känna sin egen klocktid när arbetet
944
969
  ligger i bakgrundsprocesser, och stegsvarens `duration_ms` räknar inte in väntan på dem.
945
970
  `korning.json` bär summan över stegen, därav den egna filen. En kraschad körning har en klocktid, ofta det intressantaste
946
- talet i tabellen, därför skrivs `matning.json` även vid krasch.
971
+ talet i tabellen, därför skrivs `matning.json` även vid krasch. Lasten
972
+ väggtiden mättes under står i `korning.json`:s steg som
973
+ `samtidiga_processer` (levande agentprocesser på maskinen vid stegets
974
+ start, räknat med `pgrep`, maskinvitt och best effort, `null` när
975
+ räkningen föll); rapporten visar maxvärdet bredvid väggtiden och märker
976
+ en körning utan fältet som mätt under okänd samtidighet (#526).
947
977
  - **Proveniensen stämplas EFTER `korning.json`, aldrig före**, annars
948
978
  saknar stämpeln faktureringsdatan. Kommandot räknar själv `skill_sha256`
949
979
  (över `SKILL.md` plus de fyra agentdefinitionerna) och `underlag_sha256`,
@@ -994,7 +1024,10 @@ Frågan gäller alltså kostnaden, inte risken att förlora data.
994
1024
  den ett modellnamn får varje agentprocess modell-override till den på ALLA
995
1025
  tre agenter; overriden är `--model` på processen, aldrig en promptrad, och
996
1026
  agentdefinitionerna röres aldrig, effort tas ur definitionen
997
- som vanligt. Overriden verifieras per steg mot `modelUsage` i råsvaret
1027
+ som vanligt, utom när `korning.mjs` fått `--effort`: då får varje
1028
+ agentprocess samma `--effort`-override, stegposten och `runs[]` bär den
1029
+ som begärd (`effort_begard`, `add-run --effort`), aldrig som verifierad,
1030
+ eftersom faktureringen inte bär någon effort (#525). Overriden verifieras per steg mot `modelUsage` i råsvaret
998
1031
  (ADR-0099, se modellverifieringen ovan), svansraden arkiveras men avgör
999
1032
  aldrig ensam. `approval` förblir `null`, `state.json`
1000
1033
  får `"experiment": true` ur skelettet `ny-korning` skrev. `REQUEST_ID`
@@ -1059,8 +1092,8 @@ Frågan gäller alltså kostnaden, inte risken att förlora data.
1059
1092
  ### Batch: flera poster
1060
1093
 
1061
1094
  `utvärdera <post1> <post2> … <modell…>` kör varje ticket och modell i en EGEN
1062
- `korning.mjs`-process, parallellt enligt `svep.mjs`: två tickets åt gången, alla
1063
- modeller för en ticket samtidigt, och nästa ticket startar när en ticket är
1095
+ `korning.mjs`-process, parallellt enligt `svep.mjs`: två tickets åt gången, högst
1096
+ fyra modeller för en ticket i flykt, och nästa ticket startar när en ticket är
1064
1097
  helt klar (steg 4). Raden `svep.mjs` kör per varv:
1065
1098
 
1066
1099
  ```
@@ -1111,7 +1144,12 @@ modellverifieringen och status via `archive.mjs experiment`), se steg 4.
1111
1144
  över med en notis. `"ofärdig"` är avbruten data, inget resultat värt att
1112
1145
  skydda: den utlöser aldrig omkörningsfrågan, utan körs om automatiskt som
1113
1146
  en ny `k<N+1>` under samma modell. Den gamla ofärdiga körningen skrivs
1114
- ändå aldrig över, den står kvar som historik över vad som gick fel.
1147
+ ändå aldrig över, den står kvar som historik över vad som gick fel. Ett
1148
+ undantag: en `"ofärdig"`-rad som bär en `pid` vars process lever är ingen
1149
+ avbruten körning utan en som pågår i ett annat svep (två konton mot samma
1150
+ checkout, ADR-0093); den hoppas med notisen att den pågår i en annan
1151
+ process och står som `pågår` i sluttabellen, aldrig som en dubblett
1152
+ (#516). En död pid, eller ingen pid alls, körs om som förut.
1115
1153
  `"väntar på dom"` OMVÄRDERAS i stället för att hoppas över, det är den
1116
1154
  enda platsen som är aktören för den statusen: kör `archive.mjs sparr` på
1117
1155
  körningskatalogen. Exit 0 betyder att domen är fälld: sätt körningens
@@ -1172,6 +1210,56 @@ tvärs poster med olika modelluppsättning, eller uttalar sig om vilket utfall
1172
1210
  som var korrekt. Bedömningen av vad som är ett acceptabelt utfall är
1173
1211
  människans, gjord på erfarenhet av systemet. Rapporten visar spridningen.
1174
1212
 
1213
+ ## Avslutning: var posten står
1214
+
1215
+ Uppgifterna `speca`, `bedöm`, `godkänn`, `underkänn` och `döm` avslutas
1216
+ ALLTID med det här blocket (#530). Ett svar som slutar utan det lämnar
1217
+ användaren att gissa var posten står, vad hon ska göra och vilket kommando
1218
+ som kör vidare, och arkiv och bräda kan då gå isär tyst (`spec_draft`
1219
+ lokalt, tom Offer status på brädan). Blocket består av fyra delar, i ordning:
1220
+
1221
+ 1. **Tabellen ur `node <skillkatalog>/scripts/archive.mjs nasta-steg <katalog>`**
1222
+ klistras in som den är (`| post | står | väntar på | nästa |`, en rad per
1223
+ katalog och del), ALDRIG handskriven, av samma skäl som `bluf`: en
1224
+ handskriven avslutning tappar exakt den rad som skulle ha sagt vad som
1225
+ väntar. Scriptet räknar ut raderna ur `state.json` (status, `stopp`,
1226
+ `respec_varv`, `approval`, olyft OLIKA via spärren, scorerns gällande
1227
+ utfall ur prisfilen) med reglerna ur den här skillens egna grindar;
1228
+ regeltabellen med källhänvisning per rad står ovanför funktionen
1229
+ `nastaStegFor` i scriptet. Ett läge scriptet inte känner skrivs som
1230
+ `okänt läge: <status>`, aldrig som en gissning.
1231
+ 2. **Brädraden.** Har posten ett gid: hämta Offer status via request-sync i
1232
+ huvudkonversationen (aldrig ur minnet) och skriv raden
1233
+ `Bräda: <Offer status>` direkt under tabellen. Saknar posten gid: skriv
1234
+ `Bräda: ingen (posten ligger inte på brädan)`.
1235
+ 3. **ISÄR-kontrollen.** Arkivstatus och Offer status ska motsvara varandra
1236
+ enligt tabellen nedan (värdena är request-sync:s, normaliserade på
1237
+ alfabetiska kärnan som där). Avviker de skrivs en rad
1238
+ `ISÄR: arkiv <x>, bräda <y>` följd av det kommando som stänger gapet.
1239
+
1240
+ | arkivstatus (`state.json`) | förväntad Offer status | stänger gapet |
1241
+ | ---------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------- |
1242
+ | `spec_draft` | tom eller 📥 Inkommet | sync via request-sync (🔍) när specen ska granskas |
1243
+ | `spec_synced` | 🔍 Spec redo för granskning | `godkänn`/`underkänn`, eller sync om brädan står på 📥 |
1244
+ | `spec_synced`/`spec_draft` med `approval` satt | ✅ Spec ok | `bedöm`; står brädan på 🔍 är approval-anteckningen äldre än brädan, läs om grinden |
1245
+ | `assessed`/`priced`, poängen synkad | ⚖️ Poängsättning redo för granskning | sync via request-sync om brädan står kvar på ✅ |
1246
+ | klar (`godkänn` från ⚖️) | 📤 Klar – till kund | inget, kundens `Decision` avgör resten |
1247
+
1248
+ Arkivet är cache och Asana sanningen (Hårda regler): ett ISÄR löses alltid
1249
+ i riktning mot brädan, aldrig genom att skriva om brädan för att matcha
1250
+ arkivet. En experimentvariant (`experiment: true`) har ingen brädrad och
1251
+ ingen ISÄR-kontroll, den når aldrig Asana.
1252
+
1253
+ 4. **Valet, när det finns ett.** Ett stopputfall (`TILLBAKA_TILL_SPEC`,
1254
+ `ESKALERA`, `KONCEPT`, `DIAGNOS`) och en olyft `double_run: olika`
1255
+ presenteras som ett val användaren ska ta, inte bara som routing:
1256
+ "här är ditt val", följt av alternativen (vid TILLBAKA_TILL_SPEC det
1257
+ öppna valet ur `stopp.orsak` eller källfilen; vid OLIKA de två
1258
+ körningarnas belägg sida vid sida, se bedöm steg 6) och kommandot som
1259
+ verkställer svaret (`speca <post>` efter `## Avgjorda val` + `respec`,
1260
+ `döm <post>`, kunddialog). Ett stopp som bara routas läses som "maskinen
1261
+ jobbar vidare", och ingen gör något.
1262
+
1175
1263
  ## Mekaniska script: `scripts/`
1176
1264
 
1177
1265
  Tolv deterministiska script bor i katalogen: de fem kontrollerna nedan,
@@ -1205,7 +1293,7 @@ referensfiler vars regler det speglar och VARNAR när en katalogbump ändrat dem
1205
1293
  FÖRE contract-check. Exit 0 = allt löst (eller inga ankare i filen), 1 =
1206
1294
  minst ett OLÖST/FLERTYDIG ankare (kontraktsbrott, mekanisk omdispatch),
1207
1295
  2 = användningsfel.
1208
- - `scripts/contract-check.mjs <run.json> <spec.md> [impact.md] [--expect-id <id>]`
1296
+ - `scripts/contract-check.mjs <run.json> <spec.md> [impact.md] [--expect-id <id>] [--state <state.json>] [--sprak <svenska|engelska>]`
1209
1297
  — kontraktskontroll av score-JSON EFTER körning: enums,
1210
1298
  konfidensintervall, poängupplösning, inringningens närvaro (även per
1211
1299
  alternativ; under-A1-fallet med floor null och tak A1 är giltigt), belägg/
@@ -1223,7 +1311,10 @@ referensfiler vars regler det speglar och VARNAR när en katalogbump ändrat dem
1223
1311
  mellan between-paret, relation mot poäng; poäng PÅ ett ankare trots
1224
1312
  storre/mindre är VARNING bara vid avrundningskollaps), att `type` är en av
1225
1313
  skalans fem typer, och undantar svartlistade ord som står i specen
1226
- (ADR-0115).
1314
+ (ADR-0115). Med `--sprak` prövas varje kundtextfält mot språket (#521):
1315
+ minst två OLIKA funktionsord ur fel språk, hela ord, skiftlägesokänsligt
1316
+ (listorna i `lib.mjs` `FUNKTIONSORD`), är BROTT `kundtext på fel språk`;
1317
+ diakritiska tecken är ingen signal. Utan flaggan ingen språkkontroll.
1227
1318
  - `scripts/check-lasta.mjs "<LÄSTA-innehåll>" <spec.md> <impact.md>` —
1228
1319
  kontrollerar scorerns läs-scope: LÄSTA-raden ska bära underlagens två
1229
1320
  sökvägar och får därutöver bara bära filer under skillens egen katalog.
@@ -1255,29 +1346,41 @@ referensfiler vars regler det speglar och VARNAR när en katalogbump ändrat dem
1255
1346
  `approval`, `granskarutslag` och `stopp`, rör aldrig `runs[]`) och
1256
1347
  `bluf <katalog>` (markdown-tabellen `| post | poäng | utfall | konfidens | anm |`
1257
1348
  över katalogen och dess `del-N/` rekursivt, bunt-roten som
1258
- `bunt (N delar)`; värdena ur filerna, aldrig ur prosa). `add-run` läser
1349
+ `bunt (N delar)`; värdena ur filerna, aldrig ur prosa) och
1350
+ `nasta-steg <katalog>` (läs-enbart, markdown-tabellen
1351
+ `| post | står | väntar på | nästa |` över katalogen och dess `del-N/`
1352
+ rekursivt: var posten står, vad en människa väntas göra och vilket
1353
+ `/request`-kommando som kör vidare, ur `state.json` och scorerns gällande
1354
+ utfall enligt regeltabellen i scriptet; okänt läge skrivs som
1355
+ `okänt läge: <status>` med exit 0, trasig `state.json` är exit 2, se
1356
+ `## Avslutning: var posten står`). `add-run` läser
1259
1357
  `effort:` ur agentdefinitionen när `--effort` utelämnas och kanoniserar
1260
1358
  `--model`; `set-status priced` vägrar när `stopp` är satt.
1261
- `experiment <experimentkatalog> [--satt nyckel=värde]... [--variant <modell>]... [--korning <modell>/k<N> --status <klar|ofärdig|stopp|väntar på dom> [--orsak <text>]]`
1359
+ `experiment <experimentkatalog> [--satt nyckel=värde]... [--variant <modell>]... [--korning <modell>/k<N> --status <klar|ofärdig|stopp|väntar på dom> [--orsak <text>] [--pid <heltal>]]`
1262
1360
  är den ENDA skrivaren av `experiment.json` (se `utvärdera` steg 1): låst
1263
1361
  läs-modifiera-skriv med atomisk skrivning, katalog och fil skapas om de
1264
1362
  saknas. `--satt` skriver toppnivåfält append-only (samma värde är no-op,
1265
1363
  ett annat värde är exit 2; `eskalerad` tolkas som boolean), `--variant` är
1266
1364
  UNION med bevarad ordning, och `--korning` kräver `--status` ur de fyra
1267
1365
  statusliteralerna, rör ingen annan körning och kräver att katalogen
1268
- `<modell>/k<N>` finns. Exit 0 ok, 2 användnings- eller tillståndsfel.
1269
- - `scripts/svep.mjs --repo-rot <abs> --konto <namn> --modell <m>... --exp experiments/<slug>... [--tickets-parallellt 2] [--om | --hoppa-över]`:
1366
+ `<modell>/k<N>` finns. `--pid` (heltal, bara med `--korning`) skriver
1367
+ startarens pid på raden; en statusskrivning utan `--pid` ersätter raden
1368
+ helt, så pid:n försvinner med slutstatusen (#516). Exit 0 ok, 2
1369
+ användnings- eller tillståndsfel.
1370
+ - `scripts/svep.mjs --repo-rot <abs> --konto <namn> --modell <m>... --exp experiments/<slug>... [--tickets-parallellt 2] [--modeller-parallellt 4] [--om | --hoppa-över]`:
1270
1371
  utvärderas startare (se `utvärdera` steg 4 och Batch). Kör två tickets åt
1271
- gången med alla modeller per ticket samtidigt, nästa ticket när en är helt
1372
+ gången med högst fyra modeller per ticket i flykt, nästa ticket när en är helt
1272
1373
  klar, och gör per varv `ny-korning`, starten av `korning.mjs`,
1273
1374
  `stderr.log`, `matning.json`, `proveniens`,
1274
1375
  modellverifiering mot `modelUsage` och status via `archive.mjs experiment`.
1376
+ Startraden i `experiment.json` bär svepets pid (#516).
1275
1377
  Återupptar ur `experiment.json`: `klar` och `stopp` hoppas utan `--om`,
1276
- `väntar på dom` prövas med `sparr`, `ofärdig` körs om. En `--exp` utan
1378
+ `väntar på dom` prövas med `sparr`, `ofärdig` körs om, utom när raden bär
1379
+ en levande `pid` (pågår i ett annat svep, hoppas som `pågår`, #516). En `--exp` utan
1277
1380
  `onskemal.md`, `kallmanifest.md` eller `experiment.json` med `request_id` märks
1278
1381
  och hoppas över. Exit 0 när ingen körning blev `ofärdig`, 1 annars, 2 vid
1279
1382
  användningsfel.
1280
- - `scripts/korning.mjs --katalog <abs k<N>> --exp <abs experimentkatalog> --repo-rot <abs> --request-id <gid eller slug> --modell <modell|default> [--claude <kommando>] [--delar-parallellt 2]`:
1383
+ - `scripts/korning.mjs --katalog <abs k<N>> --exp <abs experimentkatalog> --repo-rot <abs> --request-id <gid eller slug> --modell <modell|default> [--claude <kommando>] [--delar-parallellt 2] [--effort <low|medium|high|xhigh|max|default>]`:
1281
1384
  utvärderas inre process (se `utvärdera` steg 4), ett script utan
1282
1385
  modellturer. Bygger prompterna ur `onskemal.md`, `kallmanifest.md` och
1283
1386
  `experiment.json`, där `sprak` är OBLIGATORISK: saknas den skrivs en
@@ -1287,9 +1390,14 @@ referensfiler vars regler det speglar och VARNAR när en katalogbump ändrat dem
1287
1390
  compare-scores) plus arkiveringen (`archive.mjs`) är scriptanrop.
1288
1391
  Buntens delar körs två åt gången och scorerns två körningar samtidigt;
1289
1392
  `DELA_UPP` körs inte autonomt i v1 utan ger status `stopp` med orsak.
1290
- `korning.json` är summan över stegen (`korningsmotor`, `steg`,
1291
- `modellverifiering` plus rapportens vanliga nycklar). Exit 0 när körningen
1292
- gick igenom, 1 när minst en del blev ofärdig, 2 vid användningsfel.
1393
+ `--effort` är en override på varje agentprocess, symmetrisk med
1394
+ `--modell`: `default` ger ingen flagga och add-run läser definitionen som
1395
+ förut; allt annat skickas till processen och till `add-run --effort` som
1396
+ begärd, aldrig verifierad (#525). `korning.json` är summan över stegen
1397
+ (`korningsmotor`, `steg` med `effort_begard` och `samtidiga_processer` per
1398
+ steg, `modellverifiering` plus rapportens vanliga nycklar). Exit 0 när
1399
+ körningen gick igenom, 1 när minst en del blev ofärdig, 2 vid
1400
+ användningsfel.
1293
1401
  - `scripts/kontroll.mjs <svar.txt> <spec.md> <impact.md> --expect-id <id> --ut <ren.json> [--fixa-kundtext] [--claude <kommando>] [--fix-modell sonnet] [--fix-fil <rå.json>]`:
1294
1402
  scorerns kontrollkedja i EN process (se `bedöm` steg 5): svansrader,
1295
1403
  JSON-extraktion, deterministiska reparationer, sedan check-lasta,
@@ -1300,7 +1408,12 @@ referensfiler vars regler det speglar och VARNAR när en katalogbump ändrat dem
1300
1408
  belägg, och varje reparation skrivs som en `REPARERAT:`-rad som anroparen
1301
1409
  bokför i runs-radens `note`. `--fixa-kundtext` skriver om ett
1302
1410
  protokollterm-brott i ett rent kundtextfält med en billig modell i stället
1303
- för att kosta en hel scorerkörning, högst en runda. stdout bär `MODELL:`,
1411
+ för att kosta en hel scorerkörning, högst en runda. `--state <state.json>`
1412
+ och `--sprak <svenska|engelska>` går rakt vidare till contract-check
1413
+ (split-status respektive kundtextens språk; `korning.mjs` tar språket ur
1414
+ `experiment.json`, det manuella flödet ur `SPRÅK:` i `kallmanifest.md`).
1415
+ Ett språkbrott är aldrig kundtextfixbart och går till omdispatch (#521).
1416
+ stdout bär `MODELL:`,
1304
1417
  `LÄSTA:`, ev. `AVVIKELSE:`, `REPARERAT:`-rader och sist verdiktet. Exit 0 =
1305
1418
  kedjan håller, 1 = BROTT (omdispatch enligt ADR-0092), 2 = användningsfel.
1306
1419
 
@@ -1351,6 +1464,7 @@ aldrig vidare som om kontrollen passerat.
1351
1464
  ```
1352
1465
  REPO-ROT: <absolut sökväg>
1353
1466
  DEPS: <installerade | saknas>
1467
+ SPRÅK: <svenska | engelska>
1354
1468
  KÄLLOR:
1355
1469
  <kallmanifest.md ordagrant, eller "inga">
1356
1470
 
@@ -1367,6 +1481,7 @@ aldrig vidare som om kontrollen passerat.
1367
1481
  REQUEST_ID: <gid eller slug>
1368
1482
  MODE: <pricing|guard>
1369
1483
  DELPOST: <nej | ja, del N av M>
1484
+ SPRÅK: <svenska | engelska>
1370
1485
 
1371
1486
  SPEC: <absolut sökväg till spec.md>
1372
1487
  PÅVERKANSANALYS: <absolut sökväg till impact.md>
@@ -1375,6 +1490,12 @@ aldrig vidare som om kontrollen passerat.
1375
1490
  (guard-läge lägger till `FULLPLAN:` och `TIDIGARE_POANG:` —
1376
1491
  guard-kommandot kommer i ett senare steg.)
1377
1492
 
1493
+ `SPRÅK:` är kundtextens språk för assessorn och scorern (#521): samma
1494
+ värde som specifiern fick, ur `experiment.json` (`sprak`) i utvärdera och
1495
+ ur `SPRÅK:` i `kallmanifest.md` i det manuella flödet. Analysens
1496
+ kundvända delar och kuvertets kundtextfält skrivs på det språket;
1497
+ `contract-check --sprak` fäller kundtext på fel språk.
1498
+
1378
1499
  - **Svansrader efter huvudinnehållet**, i denna ordning: `MODELL: <modell-id>`
1379
1500
  (alla agenter), `LÄSTA: <kommaseparerade absoluta sökvägar eller "inga">`
1380
1501
  (endast scorern — dess Read är promptbegränsad, raden gör regeln