# Rättningar och intern validering, 24 september 2026

Den här etappen följer fynden i `MODEL_AUDIT_2026-09-24.md`. Den rättar de prioriterade motexemplen och verifierar implementationen mot analytiska fall. Den är **inte empirisk validering av verklig kollisionsrisk, leverantörs-DAA eller säker kapacitet**.

Motorversioner: `trajectory-reference-0.3.0`, `traffic-reference-0.5.0`, `snapshot-core-2.0.0`. A/n-regeln är oförändrad; dess geometri och rapportering har rättats. Äldre sparade resultat skrivs inte om och jämförelser mellan motorversioner flaggas.

## DAA: återhämtning när skyddsvolymer redan överlappar

Tidigare krävdes noll skyddsöverlappning från manöverstart, även om överlappningen redan pågick. Då avvisades alla kontinuerliga manövrer.

Nu skiljs två fall åt:

- Före överlappning måste kandidaten hålla skyddsvolymerna separerade under prediktionshorisonten.
- Vid pågående överlappning får kandidaten återställa separationen tidigare än den nominella banan. Den får inte skapa fysisk kontakt, en ny NMAC eller en ny skyddsöverlappning efter återhämtningen. Om NMAC redan pågår måste även den upphöra tidigare än nominellt, utan återinträde.

Acceleration, hastighet, stigning, restriktioner och kontinuerlig återgång kontrolleras fortfarande. Exporterade aktiveringar anger `policy` och, vid återhämtning, `protectionRestoredSeconds`. Det senare är absolut scenariotid, inte manöverns varaktighet.

Regression: två drönare 80 m isär, 5 m/s mot varandra, r = 50 m. Den nominella banan leder till kontakt. Den valda återhämtningen undviker NMAC och kontakt, återställer skyddsseparation vid 53/6 s och återgår kontinuerligt. Ett alltför sent fall med 2 m mellan centrum har fortfarande ingen accepterad kandidat.

Detta är en begränsad vertikal referenspolicy. Ett misslyckat kandidatsök betyder inte att alla tänkbara manövrer är omöjliga. Koppling: främst REQ-3.1 och 3.5.

## DCB: aktuella reservationer efter banändringar

Initial planering, omplanering och uppskjutna avgångar använder samma kontroll av lagerkapacitet, korridorkapacitet, riktade korridorinträden, terminaltidsavstånd och skyddsseparation. Ändrade publicerade banor får nya reservationer.

Efter CA eller contingency omprövas berörda luftburna planer i en begränsad genomgång. Därefter prövas väntande avgångar i turordning mot luftburna och redan accepterade planer. En väntande flygning kan skjutas upp eller avvisas. Pågående undanmanövrer avbryts inte tyst; olösta samordningsproblem flaggas. Slutresultatet kontrollerar verkligt utförda banors kapacitets- och tidsavståndsöverträdelser.

Två regressioner:

1. A och B använder parallella rutter i ett lager med kapacitet ett. A försenas av ett fel. B får nu vänta eller avvisas, även om rutterna är för långt ifrån varandra för skyddsöverlappning.
2. A:s CA stiger från det nedre lagret in i det övre. B:s planerade avgång vid 40 s skjuts i testfallet upp till 65 s. Det övre lagrets verkliga beläggning överskrider inte ett.

En separat kontroll upptäcker korridorinträden med 10 s mellanrum när kravet är 12 s, även utan kapacitetsöverträdelse. Kapacitet använder faktisk geometrisk volym; riktningsberoende headway använder inträdesriktningen. Koppling: REQ-2.1, 2.4 och 3.7.

Detta är ingen global optimerare. Redan luftburna konflikter kan vara olösliga inom den begränsade policyn och ska då fortfarande ge fel/överträdelser, inte ett godkänt resultat.

## Sample: faktisk geometri och rätt mått

Positioner samplas nu jämnt över den fria delen av cellens verkliga polygoner. En uppdelning i trapetser hanterar roterade celler, hål, flera polygoner och smala GIS-rester. Delarna väljs proportionellt mot area; positionen inom varje del följer dess varierande bredd. Geofences dras bort från samplingsområdet. Ingen cell byts tyst ut och ingen centrumreservpunkt används. Noll fri area ger ett uttryckligt fel.

Fri blå diskarea är `πR² − area(disk ∩ union(geofences))`. Polygonkanter och cirkelbågar integreras analytiskt med flyttalsaritmetik. Överlappande geofences subtraheras en gång. Röda diskar subtraheras inte. Inspektorns punkter illustrerar geometrin och bestämmer inte längre arean.

Resultat och exporter anger:

| Mått | Definition |
| --- | --- |
| A/n-klassade grupper/snapshot | Klassade gruppobservationer / antal snapshots |
| Klassad andel | Klassade grupper / alla grupper med minst två drönare |
| Par av överlappande röda diskar/snapshot | Oordnade par med centrumavstånd ≤ 2r / antal snapshots |
| Snapshots med klassning | Andel snapshots med minst en klassad grupp |
| Dagliga observationer | Summerade observationer per dag, medelvärde över dagar; beroende av snapshotintervall |

Sample-läget ger inte längre en fysisk NMAC-rate eller ett TLS-besked. Äldre scenariofält med TLS kan läsas men används inte i sample-bedömningen. Trajectory-lägets kontinuerliga NMAC-intervall och kontakter är separata mått och använder faktisk summerad flygtid. Operativt godkända kapacitetsrader heter nu **Operational pass**, inte ett odefinierat Pass.

A/n kan fortfarande dölja en tät undergrupp: två sammanfallande drönare klassas, men en tredje 100 m bort vid r = 50 m kan förstora gruppdisken så att gruppen inte klassas. Formeln ändras inte för att få ett önskat utfall. Parantal och minsta paravstånd visas därför separat. Paröverlappningen är inte heller en fysisk NMAC-definition.

## Reproducerbar kontroll

```sh
npm test
npm run validate:model
npm run package:site
```

`tests/model-validation.test.cjs` innehåller regressionsfallen ovan samt kinematisk kontinuitet, analytiska cirkelsegment, roterade/överlappande polygoner, tunna remsor, hål, areaviktad sampling och A/n:s utspädningsmotexempel. En kadenskontroll halverar tidsintervallet: dagliga observationer fördubblas i kontrollfallet, medan klassade grupper per snapshot förblir ett.

`scripts/validate-model.cjs` sparar indata, seed och resultat i `benchmarks/model-validation.json`:

- 10 000 punkter i en befolkad cell ur Norrköpingsfilen: noll utanför polygonen. Datasetets SHA-256 och feature-index sparas.
- En oberoende rasterintegral med 1 000 × 1 000 celler jämförs med den analytiska överlappningsarean. Skillnaden i kontrollfallet är cirka 7,58 m², eller 0,0241 % av hela diskarean. Det är en jämförelse med en rasterapproximation, inte en generell felgräns för alla polygoner. Exakta cirkelsegment kontrolleras separat i testerna.
- 300 syntetiska korsningsförsök: Pd = 0, 0,5 och 1; latens = 0, 2, 10, 25 och 40 s; 20 seed per kombination. Utan detektion uppstår kontakt i alla kontrollfall. Vid Pd = 1 och latens ≤ 10 s uppstår ingen kontakt. Vid Pd = 0,5 och 25 s uppstår fem kontakter av tjugo; vid 40 s är insatsen för sen i samtliga fall. Detta visar modellens beteende i ett bestämt möte, inte en verklig kollisionssannolikhet.

166 automatiserade Node-tester passerade. Den paketerade webbversionen kontrollerades med sample-flödets 32 kontroller, leveransflödets nio samt det integrerade flödet inklusive 3D-inspektion, batch, kapacitetsstudie och lägesbyte. Inga okontrollerade JavaScript-undantag registrerades i de godkända webbläsarkörningarna.

## Kvar efter denna etapp

- Dn-omfördelningen använder fortfarande cellcentrum och en heuristik för mottagarceller. Delvis blockerade celler och små GIS-rester behöver en uttrycklig, kalibrerad policy för hur mycket sannolikhetsmassa de ska ta emot. Geometriskt korrekt sampling validerar inte den fördelningsmodellen.
- B-fältets definition/årtal/källa, trafikintensitet, lageravstånd, leveranstider, kinematik, NMAC-gränser och sensorparametrar behöver spårbart underlag och bredare känslighetsstudier. Nya standardvärden har inte hittats på i denna etapp.
- Alternativa rutter och uppvärmnings-/mätperioder behövs före påståenden om stationär kapacitet. Nuvarande kapacitet gäller den valda policyn och ett ändligt försök som börjar tomt.
- Positiva kontaktantal behöver fullständigare statistisk målprövning. Områdes-/kategoriurval och förutbestämda stoppregler kvarstår. Den befintliga nollkontaktgränsen är villkorad på en homogen Poissonmodell.
- Extern jämförelse mot relevanta referensmöten eller uppmätta DAA-/trafikdata är inte genomförd.
- RTTA, terräng/höjdreferenser, LFV-import, flera områden, miljö-KPI och en uppmätt storskalig trajectorykörning återstår enligt granskningen.


## Daily mixed-traffic workflow (24 September, engine 0.6.0)

The subsequent daily-study stage separates traffic sources, assigns aircraft/DAA profiles, fixes the observation horizon to a scenario day plus finish period, and separates one-hour replay from aggregate Results. See [DAILY_TRAFFIC.md](DAILY_TRAFFIC.md) for the model contract. Corridor width is now an independent input for daily scenarios: changing protection does not silently change the airspace. Straight background grid links do not introduce artificial stops.

Verification: 178 Node tests passed, including the new Poisson/source-independence checks, daily exposure/concurrency accounting, mixed profiles, noon flights, width/profile independence, and parallel daily CLI/checkpoint resume. Chrome checks passed for the daily workflow and preserved integrated/sample-mode switching, exact replay parity, 3D camera/FoV interactions, geometry import, capacity seeds and mobile layouts. These verify implementation behavior, not real-world model validity or million-hour execution performance.

## Rättningar 13 oktober 2026 (trajectory 0.4.0, traffic 0.7.0, compiler 3.1.0)

- **Nya CA-försök under pågående konflikt.** Tidigare blockerades en episod så länge konflikten bestod. Efter `avoidanceUnavailable`, eller efter en avslutad manöver, gjordes inget nytt försök förrän konflikten försvann. Nu försöker samma master igen med en ny observation (REQ-3.1, 3.5). Regression: en tillfällig spärr ovanför en korsning blockerar första kandidaten, och efter att den hävts undviker det nya försöket den kontakt som 0.3/0.6 registrerade. `avoidanceUnavailable` räknas en gång per möte; misslyckade omförsök (`repeatedAvoidanceUnavailable`) och konflikter som upphört före kommandot (`alertCleared`) redovisas separat. Batcher summerar nu båda.
- **Master/slave-val.** FNV-1a mod 2 motsvarade pariteten av udda teckenkoder i nyckeln. En murmur3-finalizer blandar nu alla bitar. Valet är fortfarande reproducerbart (REQ-3.4).
- **Separata accelerationsgränser.** CA-rampen (halva gränsen) lades tidigare ovanpå horisontell inbromsning/acceleration och gav |a| ≈ 1,118a mot en enda vektorgräns. Ingen undanmanöver kunde därför starta i en sträckas start- eller stoppfas. Nu kontrolleras horisontell och vertikal acceleration var för sig, med en valfri vertikal gräns i drönarprofilen (standard = den horisontella; REQ-2.3). I head-on-referensen vid t = 1 s gav 0.3 ingen kandidat, medan 0.4 startar en 40 m-offset direkt. Kandidater som godtogs tidigare är oförändrade.
- **Efterfrågetak.** Poissonefterfrågan vars förväntade antal plus fem standardavvikelser överskrider 2 000 flygningar per replikat avvisas innan någon körning startar, i stället för att avbryta en batch halvvägs.
- **Sample-läget.** Fria ytor för positionssampling cachades per trafikobjekt och geofence-array. När en geofence lades till eller flyttades på plats i appen användes gamla ytor vid slumpade U-plans. Varje omanpassning ogiltigförklarar nu cachen. Workerns och CLI:ts resultat påverkades inte.

`npm run validate:model` med de nya versionerna ger identiska resultat för polygonsampling, areaintegration och samtliga 300 korsningsförsök (till exempel fortfarande 5 kontakter av 20 vid Pd = 0,5 och 25 s). Endast versionsfälten i `benchmarks/model-validation.json` ändrades. 197 Node-tester passerar.

