# OPENCLAW-PROMPT: Bygg & deploya matplattformen

> Kopiera ALLT nedanför linjen och klistra in som uppdrag till OpenClaw-agenten.
> Zip-arkivet med källkoden ska finnas på servern (eller ge agenten nedladdningsvägen).

---

## UPPDRAG

Du ska bygga och driftsätta en komplett applikationsplattform (API + worker +
adminpanel, PostgreSQL + Redis) från ett källkodsarkiv. Arbetet är förberett så
att ETT skript gör hela jobbet med inbyggda verifieringsgrindar. Din uppgift är
att köra det disciplinerat, verifiera varje grind och rapportera exakt utfall.

## HÅRDA REGLER (bryt aldrig mot dessa)

1. **Skriv aldrig ut hemligheter** (innehåll i `.env`, tokens, lösenord) i din
   rapport, i loggar du citerar eller i kommandohistorik du visar. Referera dem
   som `<REDACTED>`.
2. **Ändra ingen kod.** Om något failar: samla felet, följ felsökningslistan
   nedan, och rapportera. Du får ändra `.env`-VÄRDEN enligt instruktion, aldrig
   källkod. Rör ALDRIG `brand.config.json`.
3. **Kör aldrig destruktiva kommandon** (`DROP DATABASE`, `rm -rf` utanför
   temp, `git push`, `git reset`). Skriptet hanterar allt som behövs.
4. **Avbryt och rapportera** i stället för att improvisera om en grind är röd
   efter felsökningslistan. En halvfärdig deploy lämnas ALDRIG igång: kör då
   `pkill -f "apps/api/dist" ; pkill -f "apps/worker/dist"` och rapportera.
5. **Produktion**: kör ALDRIG produktionsläge utan att människan uttryckligen
   bekräftat att `.env` innehåller riktiga produktionsvärden.

## FÖRUTSÄTTNINGAR (kontrollera först, installera vid behov)

```bash
node --version            # >= 22 (installera: https://nodejs.org eller nvm)
corepack enable && corepack prepare pnpm@10 --activate
pnpm --version            # >= 10
docker --version          # VALFRITT – behövs INTE om Postgres 16 + Redis 7 redan kör
```

**Docker är valfritt.** Skriptet använder Docker enbart som reservstart av
Postgres/Redis i staging. Kör tjänsterna redan nativt (t.ex. WSL med
`sudo service postgresql start` och `sudo service redis-server start`, systemd,
eller en molndatabas) passerar Grind 0 och 2 utan Docker – installera inget och
skapa inga shims. Grind 2 avgör på faktisk nåbarhet.

## STEG 1 – Packa upp och gå in i repot

```bash
unzip -q plattform-*.zip -d ~/app-platform && cd ~/app-platform
ls brand.config.json infrastructure/deployment/first-deploy.sh || echo "FEL: fel arkiv"
```

## VAD ZIPEN INNEHÅLLER (komplett – inget mer behövs utom dina nycklar)

All källkod (API, worker, adminpanel, mobilapp, 13 paket), databas-migrationer
och seed (101 ingredienser, 22 recept, 12 språk), deploy-skriptet med grindar,
AI-utvärderingssviten, alla runbooks (`docs/21-lanseringsplan.md`,
`docs/25-testguide.md`, `docs/namnbyte.md`). Det ENDA som inte ligger i zipen
är hemligheter/nycklar – de fylls i nedan (avsiktligt: hemligheter checkas
aldrig in).

## PÅ RIKTIGT FRÅN START (rekommenderat – inga mockar)

Plattformen har tre externa integrationer. Ange människans värden som
miljövariabler vid FÖRSTA körningen så skrivs de in i `.env` och allt kör
äkta från start – ingen mockdata:

| Integration | Variabler                                                                               | Var värdena kommer ifrån                                                                                                               |
| ----------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| AAMOS (AI)  | `AAMOS_API_URL`, `AAMOS_API_KEY`                                                        | Er egen AAMOS-plattform                                                                                                                |
| E-post      | `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `MAIL_FROM`                         | Valfri SMTP-leverantör (SES/Postmark/Resend/Brevo/egen server) – transporten är leverantörsoberoende och verifierad med riktig rundtur |
| Fillagring  | `S3_BUCKET`, `S3_REGION`, ev. `S3_ENDPOINT` + `S3_ACCESS_KEY_ID`/`S3_SECRET_ACCESS_KEY` | AWS S3 eller S3-kompatibel (MinIO/R2/Hetzner). Tomma nycklar = IAM-roll. Verifierad med äkta presign→PUT→GET-rundtur                   |

Exempel (allt äkta, en rad):

```bash
AAMOS_API_URL=https://aamos.er-doman.se AAMOS_API_KEY=<REDACTED> \
SMTP_HOST=smtp.er-leverantor.se SMTP_USER=<REDACTED> SMTP_PASS=<REDACTED> MAIL_FROM=noreply@er-doman.se \
S3_BUCKET=er-staging-bucket S3_REGION=eu-north-1 \
DEPLOY_MODE=staging REQUIRE_REAL=1 ./infrastructure/deployment/first-deploy.sh
```

`REQUIRE_REAL=1` gör äktheten till en GRIND: deployen UNDERKÄNNS med exakt
lista över vad som saknas om någon integration fortfarande kör mock.
Skriptets slututskrift visar alltid INTEGRATIONSSTATUS (RIKTIG/mock per rad) –
citera den i rapporten. Utelämnas värdena faller staging tillbaka till mock
(fungerar, men människan har bett om äkta drift – fråga hellre efter värdena).

## STEG 2 – Kör första-deployen (STAGING är default och säkert)

```bash
DEPLOY_MODE=staging ./infrastructure/deployment/first-deploy.sh
```

Skriptet är idempotent (säkert att köra om) och går igenom 8 grindar:

| Grind | Vad                                                                          | Förväntat i utskrift   |
| ----- | ---------------------------------------------------------------------------- | ---------------------- |
| 0     | node/pnpm (docker valfritt – noteras bara)                                   | `GRIND 0 OK`           |
| 1     | .env (skapas med genererade hemligheter i staging)                           | `GRIND 1 OK`           |
| 2     | Postgres + Redis nåbara (Docker endast som reservstart i staging)            | `GRIND 2 OK`           |
| 3     | Varumärkesvakt + typecheck + 100+ tester + build                             | `GRIND 3 OK`           |
| 4     | Databasmigrationer (+ seed i staging: 101 ingredienser, 22 recept, 12 språk) | `GRIND 4 OK`           |
| 5     | AI-utvärderingssvit: 6 fall, 30 kontroller                                   | `GRIND 5 OK … GODKÄND` |
| 6     | API + worker startar; `/healthz` och `/readyz` svarar                        | `GRIND 6 OK`           |
| 7     | Funktionsrök: registrera konto → logga in → läsa recept                      | `GRIND 7 OK`           |

Slutraden ska vara: `ALLA GRINDAR GRÖNA – staging är uppe.`

## STEG 3 – Egen verifiering (lita aldrig blint på skriptet)

```bash
curl -fsS http://127.0.0.1:4000/healthz     # {"ok":true,...}
curl -fsS http://127.0.0.1:4000/readyz      # {"ok":true,...}
tail -5 logs/api.log                        # inga rader med "level":50
tail -5 logs/worker.log                     # innehåller "Worker igång"
```

Adminpanelen (valfritt att exponera): statiska filer i `apps/admin/dist/` –
servera t.ex. `cd apps/admin/dist && python3 -m http.server 5173`.

## STEG 4 – Rapportera

Rapportera EXAKT detta format:

```
DEPLOY-RAPPORT
Läge:            staging|production
Alla grindar:    GRÖNA / RÖD på grind N
healthz:         <svar>
readyz:          <svar>
Tester:          <antal ur skriptets utskrift>
Eval-svit:       GODKÄND/UNDERKÄND
Integrationer:   AAMOS=RIKTIG/mock, E-post=RIKTIG/log, Fillagring=RIKTIG/mock
Avvikelser:      <inga | lista>
Kvarstående:     <t.ex. "reverse proxy + TLS ej konfigurerat">
```

## FELSÖKNINGSLISTA (i ordning, max ett försök per punkt)

1. **Grind 2 röd, ingen databas svarar**: starta tjänsterna – nativt
   (`sudo service postgresql start; sudo service redis-server start` på WSL,
   eller systemd-motsvarigheter) ELLER starta Docker-daemonen
   (`sudo systemctl start docker`). Kör om skriptet. Bygg aldrig shims.
2. **Grind 2 röd, port 5432 upptagen**: en annan Postgres kör redan – sätt
   `DATABASE_URL` i `.env` till den, kör om.
3. **Grind 3 röd**: kör `pnpm typecheck` och `pnpm test` separat, citera de
   FÖRSTA 20 felraderna i rapporten. ÄNDRA INTE KOD – rapportera. (Testerna är
   tidszonsoberoende – verifierade under Stockholm/Auckland/Los Angeles – så
   sätt ALDRIG TZ som workaround.)
4. **Grind 6 röd**: citera `tail -30 logs/api.log`. Vanligast: fel
   `DATABASE_URL`/`REDIS_URL` i `.env` – rätta värdet, kör om skriptet.
5. **Port 4000 upptagen**: `pkill -f "apps/api/dist"` och kör om skriptet.
6. Allt annat: avbryt enligt hård regel 4.

## PRODUKTION (körs ENDAST efter explicit mänskligt godkännande)

Skillnader mot staging – människan ska ha gjort detta FÖRE ditt körande:

1. `.env` ifylld med riktiga värden (databas/RDS, riktiga hemligheter,
   `AAMOS_MODE=http` + URL/nyckel, ev. `EMAIL_MODE=smtp`). Skriptet vägrar
   dev-värden och vägrar starta databaser i produktion.
2. Databasen skapad via `infrastructure/deployment/create-database.sql` (som master).

Sedan:

```bash
DEPLOY_MODE=production ./infrastructure/deployment/first-deploy.sh
```

Skriptet tar automatiskt backup före migrationer och seedar ALDRIG i produktion.
Efteråt: peka reverse proxy med TLS mot `127.0.0.1:4000` och kör STEG 3 igen
utifrån (`curl https://<api-domän>/healthz`).

**Rollback** om produktionen är trasig efter deploy: stoppa processerna
(`pkill -f "apps/api/dist"; pkill -f "apps/worker/dist"`), återställ databasen
från senaste dumpen i `backups/` med
`pg_restore --clean --dbname="<DATABASE_URL>" backups/<senaste>.dump`,
starta föregående kända version. Rapportera att rollback skett.

## VAD SOM MEDVETET INTE INGÅR (rapportera som "Kvarstående", försök inte lösa)

- Reverse proxy/TLS-konfiguration (miljöspecifik)
- Mobilappens butiksbyggen (kräver EAS + butikskonton)
- E-postleverantör i produktion (EMAIL_MODE=smtp implementeras vid leverantörsval)
- Namnbyte (styrs av `brand.config.json` – rörs aldrig av dig)
