Hoppa till innehållet
DrippDropp

Källrapport: EXP-0020

Tillbaka till forskningsposten

Oförändrad rapportkopia. Rapportens resultat gäller försöket, inte appens allmänna träffsäkerhet.

Källa: research/experiments/EXP-0020/POOLED-REPORT.md
SHA-256: b04df3dc84982abc9a31106ed0a1407ceb300b0e331ead3783f6a32960d98732

# EXP-0020 — paus 30 mot paus 60 på nya fönster

**Slutlig poolrapport 2026-10-14: fyra av fyra fönster.** f1 vinter 23–27 feb
2026, f2 vår 24–28 maj 2026, f3 sommar 3–7 jul 2026, f4 höst 1–5 nov 2025
(slutdatum exklusiva), valda av `select_windows.py` på en screening **före**
något utfall (PREREGISTRERING.md, "Valda fönster"). Åtta svep från `c8e1b6a`
(CI 38041844759 grön för exakt den revisionen); **8/8 bit-identiska, båda
armarna mätta i varje fönster**; mätt modulsumma `c45a91fba1686987` i alla
åtta, projektmodulerna byte-identiska med taggen `exp-0020-rig`. Datatillgång
1,000 (f1–f3), 0,994 (f4). Oberoende analys av Codex
(`research/independent/codex-2026-10-14/exp0020/`), låst 06:42 UTC före
effektläsning, skriven utan att läsa `analyse.py`: samma heltal.

Preregistrerad analys: `analyse.py`, committad `c56b0ec` före svepen; utdata
`analysis_raw.json`. Rättad period (nedan): `analysis_corrected.json` — samma
skript, inskränkta indata. Larmspåret läste inget utfall förrän Codex dom om
sommarfönstrets läsning förelåg (skriptets läsning, 07-03..07-07 står) och
Mats beställt analysen 2026-10-14.

## Avgörandet

Primärmått **P5**: andel kantrena regnstarter med ett varningsbeslut 5–30 min
före starten, räknat från `decision_at`. Δ = P5(paus 30) − P5(paus 60), parad
över samma starter; klustrad bootstrap på (lat, lon) × fönster, B = 2 000,
frö 20201010, 95 % percentil-KI.

| | preregistrerad körning (rå) | rättad period |
|---|---|---|
| kantrena starter | 3 076 | **3 048** |
| P5 paus 60 → paus 30 | 35,47 → 45,12 % | **35,79 → 45,54 %** |
| Δ | +9,66 pe | **+9,74 pe** |
| 95 % KI | [5,03; 14,21] | **[5,12; 14,27]** |
| fyrfält båda / bara 30 / bara 60 / ingen | 1 091 / 297 / 0 / 1 688 | 1 091 / 297 / **0** / 1 660 |
| kluster | 180 | 180 |

**Dom enligt § 4:** KI:s undre gräns > 0 **och** ≥ 2,0 → *stöd för positiv
effekt* och *stöd för minst 2,0 pe effekt*. Båda nivåerna håller i båda
beräkningarna; rättelsen ändrar inte domen. Codex egen bootstrap (NumPy PCG64,
annan klusterordning) ger [5,28; 14,23] på rättad period — samma dom.

Rubrikstalet är den rättade periodens — rättelsen tar bara bort starter som
enligt specen ligger utanför perioden och rör ingen täljare — och den
preregistrerade körningens tal står bredvid i varje tabell. Den som vill läsa
strikt läser +9,66 pe, [5,03; 14,21]: samma dom.

Det är **297 fler starter med ett beslut minst fem minuter före**, av 3 048,
och **inga** starter där paus 60 hade ett sådant beslut men paus 30 saknade
det.

## Per fönster (obligatorisk enligt § 4), rättad period

| fönster | starter | P5 60 → 30 | Δ | bara 30 / bara 60 |
|---|---|---|---|---|
| f1 vinter 23–27 feb | 771 | 24,38 → 36,71 % | +12,32 pe | 95 / 0 |
| f2 vår 24–28 maj | 547 | 42,05 → 56,12 % | +14,08 pe | 77 / 0 |
| f3 sommar 3–7 jul | 990 | 38,38 → 46,77 % | +8,38 pe | 83 / 0 |
| f4 höst 1–5 nov | 740 | 39,59 → 45,27 % | +5,68 pe | 42 / 0 |

Samma riktning i fyra av fyra. Rå körning: 793 / 547 / 991 / 745 starter,
+11,98 / +14,08 / +8,38 / +5,64 pe.

## Sekundära mått

| tröskel | 60 → 30 | Δ | 95 % KI | båda / bara 30 / bara 60 / ingen |
|---|---|---|---|---|
| P10 | 28,97 → 37,66 % | +8,69 pe | [5,08; 12,02] | 882 / 266 / 1 / 1 899 |
| P15 | 23,52 → 25,56 % | +2,03 pe | [−1,15; 5,32] | 659 / 120 / 58 / 2 211 |

P_miss (ingen varning alls i [s − 30, s]): 59,74 → 50,59 % på rättad period
(rå körning 60,11 → 51,04 %).

**P15: otillräckligt underlag** — intervallet täcker noll — och **58 starter
förlorar sin femtonminutersförvarning** med paus 30 (de varnas, men senare).
"Inga förlorade starter" gäller P5, inte all framförhållning. Per fönster
är P15 negativ i f1 (−1,69 pe, 128 mot 141 av 771) och positiv i f2–f4.

**Tyst/vaken** (sekundär tabell enligt § 3; `analyse.py` saknade den — räknad
ur `onsets_N.json` 2026-10-14 på rättad period, bokfört som lucka i
PREREGISTRERING.md § 9):

| | starter | P5 60 → 30 | Δ | bara 30 / bara 60 |
|---|---|---|---|---|
| tyst tid | 941 | 0,74 → 1,06 % | +0,32 pe | 3 / 0 |
| vaken | 2 107 | 51,45 → 65,40 % | +13,95 pe | 294 / 0 |

Nämnaren i huvudmåttet innehåller tyst tid med avsikt (§ 3). Av 297
nettostarter ligger 294 i vaken tid; i tyst tid kan en paus nästan inte
hjälpa (3 av 941 — beslut som faller strax före tysttidens början).

## HYP-0012:s förutsägelser, var för sig

1. **Δ ≥ +2,0 pe poolat: håller** (+9,74; undre gräns 5,12).
2. **Δ > 0 i de två blötaste och |Δ| < 1 pe i det torraste: faller.** Blötast
   enligt screeningen är f3 (basfrekvens 6,05) och f4 (4,25): +8,38 och +5,68,
   positiva. Torrast är f2 (2,07): **+14,08 pe**, inte nära noll — störst av
   alla. Förklaringen "pausen kostar bara där den blockerar" (§ 8.4) stöds
   inte. Huvudeffekten står; mekanismbilden ska inte upprepas.
   *Operationalisering:* `analyse.py` rankar "blötast" på antal kantrena
   starter (f3, f1) och "torrast" på minst (f2); screeningens basfrekvens ger
   f3, f4 respektive f2. Alla fyra Δ > 0 och f2 är torrast i båda läsningarna,
   så P2 faller oavsett. Begreppet definieras i nästa preregistrering.
3. **Extra falsklarm per nettostart vid ≥ 5 min ≤ 2,0: håller**, 249/297 =
   0,84.
4. **`events_lost(paus 30)` = 0 i varje fönster: håller som observation** vid
   P5 (0 / 0 / 0 / 0) och i riggens fångstmått. Ingen garanti; vid P10 förloras
   1 start, vid P15 58.

## Kostnaderna (§ 3), på samma material

| mått | paus 60 | paus 30 | skillnad |
|---|---|---|---|
| varningar | 2 853 | 4 395 | **+1 542 (+54 %)** |
| verifierade falsklarm (`alerts − hits`; alla varningar verifierbara här) | 651 | 900 | **+249** |
| precision | 0,7718 | 0,7952 | +2,3 pe |
| falsklarm per nettostart vid P5 (§ 6:s storhet) | | | **0,84** |
| p95 varningar per enhetsdygn, ur dygnsvektorn (2 400 *schemalagda* dygn; § 3 sade "fullständiga" — fullständighet per dygn går inte att visa ur spannets 0,994) | 5 | 8 | |
| max per enhetsdygn | 11 | 19 | |
| andel enhetsdygn med ≥ 4 varningar | 14,5 % | 21,0 % | rå, med femte nolldygnet: 11,6 / 16,8 % |
| notis inom 60 min efter föregående på samma enhet (beslutstid) | 0,0 % | 59,9 % | 0 per konstruktion för paus 60 |
| R-hinken — verifierade upprepningar om *samma* regn | — | — | **saknas**: riggen exporterar den bara för paus 0; raden ovan får inte ersätta den |

Per fönster, varningar / falsklarm 60 → 30: f1 590/125 → 927/178; f2 489/139
→ 713/156; f3 1 019/184 → 1 579/275; f4 755/203 → 1 176/291. Precisionen
stiger i alla fyra.

Att precisionen stiger betyder att de tillkomna varningarna *som grupp, netto*
träffar oftare än genomsnittet: 1 293 fler träffar på 1 542 fler varningar.
Det är **inte** en "precision bland tillkomna" — mängderna är inte nästlade
(whitepapret § 1.3, § 7 nr 14).

## Rättelsen: facitsvansen räknades som försöksperiod

Codex fann vid granskningen att `alert_replay.py` läser radar till
`end + 40 min` för att verifiera de sista varningarna (F09-rättelsen), men att
`event_list` (rad 588) och `scoring_days` (rad 765) bara filtrerar `>= start`.
Därför ingick **28 starter vid eller efter exklusivt `end`** (f1 22, f2 0,
f3 1, f4 5) i nämnaren — alla 28 utan ledtid i någon arm. Beslut tas senast vid
bildtid `F == end` (`deciding = F <= end`, rad 371; beslutstid `end + 5 min`),
så en svansstart kan bara fångas av ett beslut till och med dess. Att ingen
av de 28 fångades är strukturellt, inte tur: fönstren slutar 00:00 UTC, alla
28 ligger i tyst tid, och regeln skickar aldrig i tyst tid (`rain_alert.py`
rad 331–333). Och varje punkt fick ett **femte
dygn med noll varningar** i bördevektorn (750 celler i stället för 600). Verifierat
oberoende i filerna och i koden av larmspåret 2026-10-14.

Rättelsen är mekanisk: starter med `slot < end` behålls; cell 5 per punkt tas
bort efter kontroll att alla 600 är noll. Totala varningar och träffar
påverkas inte. Den gjordes **efter** första analysen och är därför ett bokfört
avsteg (PREREGISTRERING.md § 9, avsteg 5); båda tabellerna står kvar och domen
är densamma. Felet ligger i mätt kod sedan F09 och gäller EXP-0016–0019 lika;
där saknas starttidsexporten som behövs för exakt rättelse, så de rapporterna
står orättade med not (whitepapret § 7, nr 13). Deras domar bedöms stå: nämnaren är
gemensam för alla armar, här fångade ingen arm någon svansstart, och ett extra
nolldygn sänker bara bördemåtten — exakt kontroll kräver starttider de inte
exporterar.

## Vad som INTE följer

- P5 är ett beslut 5–30 min före en radardefinierad start i en frusen panel —
  inte leverans, inte läst notis, inte undviket regn, inte ett korrekt
  0–15-minuterslöfte. Det är steg 4:s frågor.
- Fyra fönster är fyra fönster. 180 kluster hanterar upprepade koordinatrader,
  inte beroenden mellan platser i samma vädersystem.
- +54 % notiser och +249 falsklarm är verkliga kostnader i den enhet användaren
  känner; avstängningstakten är omätt (§ 3.4).
- Om 30 är rätt längd avgörs inte av två armar.
- **Ingen produktionsändring följer av den här rapporten.** Beslutet är
  produktägarens, med talen ovan på bordet.

## Vad som följer

- Paus 30 går vidare som kandidat till steg 4, användarprovet (Codex äger;
  skydd mot oväntat regn som huvudfråga, avstängning och irritation som
  kostnader).
- Före nästa vädersvep: rätta periodgränserna i `alert_replay.py` med
  regressionstest och exportera start- och varnings-ID:n med
  verifieringsstatus — ny mätt revision, ny tagg. Gamla råresultat rörs inte.