# nysky — endringslogg for agenter

Nye manifest-felter og atferdsendringer i kontrakten. Sjekk denne når du
OPPDATERER en app, så du ikke bygger på utdaterte antakelser.

Gjeldende kontraktversjon står i `X-Nysky-Contract`-headeren på alle API-svar
og i CLI-ens `--json`-konvolutt. Nyeste øverst.

**Beskriver du hvordan plattformen virker NÅ, er stedet
[https://nysky.no/agent.md](https://nysky.no/agent.md)** — denne loggen forteller bare hva som
har ENDRET seg.

---

## Kontrakt 0.2.39 — nullstilt 12. august 2026

Alt før denne datoen var utviklingsfasen: plattformen ble bygget, og
endringsloggen sporet arbeidet med den. Fra 12. august 2026 har nysky reelle
kunder, og loggen sporer noe annet — endringer som kan påvirke apper som
allerede kjører.

Historikken før nullstillingen er ikke borte; den ligger i repoets git-historie.
Den er bare ikke lenger noe du trenger å lese for å bygge riktig.

**Gjeldende kontrakt er 0.2.47.** Alt agent.md beskriver, gjelder — uavhengig av
hva som står her.

---

## 0.2.47 — 18. august 2026

**Norske domener (.no) kan nå bestilles fra plattformen.** nysky er
Norid-forhandler; hele flyten går i Norge. Ny flate under `/v1/domene`:

```
GET  /v1/domene/sjekk?navn=minbedrift.no   # navneregler + pris (read-scope ok)
POST /v1/domene/bestill                    # KUN mennesket (konto-sesjon)
GET  /v1/domene/bestilling/{id}            # status: bestilt/behandles/registrert/feilet
GET  /v1/domene/mine?tenant=t-…            # kontoens bestillinger
```

- **Agenter kan sjekke og følge med, men aldri bestille.** Bestilling binder
  penger og en juridisk egenerklæring (Norids Vedlegg G) — den gjøres av et
  menneske i konto-sesjonen. Foreslå gjerne navn; send mennesket til konto-siden.
- `sjekk` svarer `ok` på NAVNEREGLENE (tegnsett, lengde, blokkliste) og
  oppgir årspris — den lover ALDRI at navnet er ledig; registeret er fasit.
- Bestillingen krever: gyldig org.nr (slås opp i Enhetsregisteret — enheten må
  ha registreringsberettiget org.form og ikke være under sletting), minst to
  navnetjenere som allerede svarer autoritativt for navnet, aksept av
  egenerklæringen, og dekning på kontoen. Avslås navnet av registeret,
  refunderes beløpet automatisk.
- Æøå og samiske tegn støttes (IDN → xn-- håndteres av plattformen).

---

## 0.2.46 — 18. august 2026

**Herdingsrunde — det meste er usynlig for deg, men to ting endrer agent-flyten:**

- **API-tokenet krever nå en `agentSecret`.** Bestillingssvaret
  (`POST /v1/onboard`) inneholder et nytt felt `agentSecret` ved siden av
  `orderId`. Send det med når du henter tokenet:
  `POST /v1/onboard/{orderId}/token` med header
  `X-Nysky-Onboard-Secret: <agentSecret>` (eller body `{"agentSecret":"…"}`).
  **Del ALDRI agentSecret med mennesket** — kun aktiverUrl. Grunnen: aktiverUrl
  deles bredt (chat, e-post), og skulle ikke også være nøkkelen til API-et.
- **`tilbud` valideres nå:** 1–20 tegn, bokstaver/tall/mellomrom/`. _ -`.
  Bruk et nivånavn (`gratis`/`telt`/`hytte`/`hus`). Etiketten er fortsatt
  bare kosmetikk — planen bestemmes av veien mennesket velger, aldri av `tilbud`.
- **`nysky plan` viser nå `haandhevet`:** om appen gates, kjører i delt pool
  eller egen pod, og hva den koster per måned — så en gratis/telt-app ikke
  stille havner bak innlogging uten at forhåndsvisningen sier fra.
- Betalende Vipps-kunder får nå riktig kreditt-tier (før kunne de havne i
  gratis-gaten). Ingen handling for deg.

---

## 0.2.45 — 17. august 2026

**Kvitteringer kan nå listes og lastes ned.** Nye lese-endepunkter på
konto-flaten (bearer med read-scope er nok):

```
GET /v1/konto/kvitteringer?tenant=<t-…>          # liste: id, dato, belopOre, beskrivelse
GET /v1/konto/kvittering/pdf?tenant=<t-…>&id=…   # PDF-nedlasting (application/pdf)
```

Oppslaget er tenant-scopet (en annens kvitterings-id gir 404). Mennesker
finner det samme under «Kvitteringer» på auth.nysky.app/konto — med
nedlastingsknapp per kvittering.

---

## 0.2.44 — 17. august 2026

**Kontonavn i stedet for tenant-koder — og rabatt vises ærlig.**

- `nysky login` og `nysky konto` snakker nå kontoNAVN («Personlig»,
  «nysky admin») i stedet for t-koder; `--konto` godtar navnet når det er
  entydig (t-koden virker som før). Kontoer du har fått tilgang til av andre
  merkes «tilgang fra <navn>».
- `GET /v1/onboard`-flyten er uendret — men `GET /v1/konto/oversikt` bærer
  nå `rabattProsent` (per konto) og `reellSatsOre` (per app) NÅR kontoen
  har rabatt. Har svaret disse feltene, presentér prisen som
  «sats × rabatt % = reell pris»; mangler de, vis kun `satsOre`. Ikke regn
  ut rabatt selv.
- Nedlagte kontoer forsvinner fra innlogging og kontooversikt — møter du en
  tenant-id som ikke lenger listes, er kontoen lagt ned (historikken består).

---

## 0.2.43 — 17. august 2026

**CLI-en krever nå eksplisitt kontovalg når maskinen har flere kontoer.**
Med flere kontoer i `nysky login`-credentials valgte CLI-en før stille den
FØRSTE — en agent deployet en kundeapp rett på eierens plattformkonto uten å
merke det (og advarselen var undertrykket i `--json`). Nå feiler `plan`,
`deploy`, `secret`, `app`, `allow`, `wake`, `ci`, `team`, `datastore` og
`git` hardt med `konto-ambiguous` til du velger:

```
node nysky.mjs deploy --konto t-abc123     # eller:
export NYSKY_KONTO=t-abc123                # gjelder alle kall i økten
```

Feilmeldingen lister kontoene. Én konto i credentials = uendret oppførsel.
**For deg som agent:** møter du denne feilen, IKKE gjett — spør mennesket
hvilken konto appen skal ligge på, og send valget eksplisitt. Ukjent konto i
`--konto` gir nå `konto-ukjent` i stedet for stille 401. Hent ny CLI fra
nysky.no/cli hvis din er eldre enn denne loggen.

**I samme slengen: `nysky login` plukker nå opp NYE medlemskap.** Før ble et
nytt `team add`-medlemskap kun aktivert ved brukerens aller FØRSTE innlogging
— hadde nysky ID-en alt bundne kontoer, ble nye medlemskap stående ubundet for
alltid. Nå bindes ubundne medlemskap (verifisert e-postmatch) ved hver
innlogging. Mangler en konto i `nysky login`-listen: logg inn på nytt.

---

## 0.2.42 — 17. august 2026

**Vipps-betaling i aktiveringssteget — og en gratis-vei uten kode.**
Aktiveringssiden (aktiverUrl) har nå tre veier, og mennesket velger selv:

- **Gratis (1 app):** ingen betaling, ingen invitasjonskode. Kontoen får
  gratis-nivået — én app i delt kjøring bak nysky ID-innlogging.
- **Betal med Vipps:** mennesket velger startkreditt (100/300/1000 kr) og
  godkjenner i Vipps. Kontoen får kreditt-tieren, og kreditten står inne når
  betalingen er bekreftet.
- **Invitasjonskode:** som før (beta/kampanje).

For deg som agent er flyten UENDRET i formen, med ett nytt statustrinn:
`GET /v1/onboard/{orderId}` kan nå svare `"status": "venter-betaling"` mens
mennesket er i Vipps — fortsett å polle; den blir `paid` når betalingen er
godkjent, eller `pending` igjen om den avbrytes/utløper. Du skal fortsatt
ALDRI be om betalingsinformasjon i samtalen — alt skjer på aktiveringssiden.
Nytt endepunkt `POST /v1/onboard/{orderId}/betal` brukes av aktiveringssiden,
ikke av deg.

---

## 0.2.41 — 15. august 2026

**Hemmelighetsluka: innsending virket ikke for apper på en annen konto enn
skaperens — fikset.** En luke laget av en admin-/plattformsesjon for en app
eid av en annen konto ga alltid 410 når mennesket limte inn verdien (luken
var bundet til feil tenant). Nå bindes luken til APPENS eier ved opprettelse.
Så du dette som «Lenken er ikke lenger gyldig» rett etter «Lagre»: lag en ny
luke — den virker nå.

**Lukas feiltilstander er skilt fra hverandre.** Før ga ukjent, brukt og
utløpt lenke samme svar (410 «brukt eller utløpt»). Nå: ukjent/avkortet lenke
= 404 `secret-drop-unknown` · allerede brukt = 410 `secret-drop-used` ·
tidsutløpt = 410 `secret-drop-expired` med utløpstidspunktet i `detail`.
Poller du statusruta er ingenting endret. Nettlesere får en lesbar feilside
med `requestId` synlig; API-kallere får problem+json som før.

**Luka varer nå 30 minutter** (før 15) — å hente en nøkkel hos en tredjepart
på mobil tok oftere enn ikke mer enn 15.

**Sikkerhetsdiffen i `deploy_via_git` rapporterer ikke lenger en falsk
«rute fjernet»** for apper uten `[[routes]]`. Plattformen materialiserer den
implisitte flate adressen (`<app>.nysky.app`) i kjørende spec; diffen
sammenlignet den mot manifestteksten og viste adressen som fjernet enda ingen
hadde rørt den. Nå sammenlignes effektiv-mot-effektiv, og implisitte adresser
merkes «(implisitt)» når de vises. Så du en slik linje før: den var falsk —
ekte rute-endringer (egne domener) flagges som før.

---

## 0.2.40 — 13. august 2026

**[auth] gate_stier: åpen forside og innlogget admin i SAMME app.**

Fram til nå dekket `mode = "gate"` hele appen, uten unntak — også `/health`.
Mønsteret «offentlig innhold + beskyttet admin» var derfor ikke byggbart med
plattform-auth, selv om startmalen `skjema` beskrev det som om det var.
**Malen var feil, ikke plattformen** — og den er nå rettet.

Nytt felt, kun for `mode = "gate"`:

```toml
[auth]
mode = "gate"
allow = ["deg@firma.no"]
gate_stier = ["/admin"]   # kun /admin krever innlogging; resten er åpent
```

- **Utelatt felt = uendret oppførsel.** Hele appen gates, som før. Ingen
  eksisterende app endrer seg.
- Hvert element er et **prefiks**, matchet **case-insensitivt**: `/admin`
  dekker `/admin`, `/admin/brukere` og `/ADMIN`.
- `"/"` godtas ikke — det ville gatet alt, som er det samme som å utelate
  feltet.
- **Offentlige stier når appen UTEN** `X-Nysky-Auth-User`/`-Sub`. Appen må
  tåle anonyme forespørsler der, og må aldri utlede tilgang fra stien alene:
  gaten avgjør hvem som slipper inn, appen avgjør hva de får se.
- `/oauth2/*` er fortsatt reservert av plattformen.

Gjelder både dedikerte apper og apper i delt pool, og både `<app>.nysky.app` og
bedriftens sti-adresse.

**Rettelse i samme slengen:** bundler-imaget som bygger GitOps-apper lå fire
kontraktversjoner bak, og avviste derfor `nivaa` som «ukjent felt». Feltet har
vært gyldig siden 0.2.36. Bygger du og får «must NOT have additional
properties» på et felt agent.md beskriver, er det oss — meld fra.
