From 7b1814fef4f50ac9f8071fd848a5778abe9fc2d0 Mon Sep 17 00:00:00 2001 From: Simon Axelsson Date: Tue, 11 Aug 2026 14:36:03 +0200 Subject: [PATCH] feat(compliance): scaffold Golden Standard artifacts (CI-14, DX-02, DX-03) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applies siax-standard/packages/scaffold (feat/scaffold-generator) to close three BLOCK-level gaps found by the doctor: - .gitea/CODEOWNERS (CI-14) — was completely missing - compose.dev.yaml (DX-02) — was completely missing, left as `services: {}` since the scaffold cannot know this repo's real local dependencies - .devcontainer/devcontainer.json (DX-03) — was completely missing siax.repo.json, the four docs/runbook/*.md files, .gitea/workflows/security.yml, prompts/000-INDEX.md and contracts/openapi.yaml already existed with content and were left untouched (AR-1: the generator never overwrites existing content). docs/compliance/SCAFFOLD-TODO.md was generated and then manually corrected before this commit — the generator emits some fixed TODO/warning lines regardless of actual repo state, and three of them were false for 0pt: - claimed appId is null needing an appIdJustification field removed; the EXISTING siax.repo.json already has appId: "0PT" set, no such field exists - claimed domains: 0 ("none found"); the EXISTING siax.repo.json already lists 2 domains (0pt.app, api.0pt.app) as strings — the new schema wants objects, so they fail validation and get silently dropped to 0, which reads as "no domains configured" when in fact 0pt.app is a real domain - asked to fill in both consumes[] and consumedBy[] "from scratch"; consumes[] is already fully populated in the existing file (CL0UD, ST0RE, N0D, AUD0, INF0) — only consumedBy[] is actually missing Doctor measuredScore: 74 -> 85 (CI-14, DX-02, DX-03 flip FAIL -> PASS). REPO-04 stays FAIL: siax.repo.json still needs a human to add the missing required fields and convert domains to the new object shape (AR-1 will not touch a file that already has content) — tracked in SCAFFOLD-TODO.md. Co-Authored-By: Claude Sonnet 5 --- .devcontainer/devcontainer.json | 5 +++ .gitea/CODEOWNERS | 11 ++++++ compose.dev.yaml | 10 ++++++ docs/compliance/SCAFFOLD-TODO.md | 59 ++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .gitea/CODEOWNERS create mode 100644 compose.dev.yaml create mode 100644 docs/compliance/SCAFFOLD-TODO.md diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..cde4ee6 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,5 @@ +{ + "name": "0pt", + "image": "mcr.microsoft.com/devcontainers/javascript-node:22", + "postCreateCommand": "pnpm install --frozen-lockfile" +} diff --git a/.gitea/CODEOWNERS b/.gitea/CODEOWNERS new file mode 100644 index 0000000..5e5c794 --- /dev/null +++ b/.gitea/CODEOWNERS @@ -0,0 +1,11 @@ +# CI-14 — CODEOWNERS bor i .gitea/, aldrig i .github/ (SEC-25). +# Granskning krävs särskilt för kontrakt, deploy och migrationer. + +* @sax3l +/contracts/ @sax3l +/deploy/ @sax3l +/.gitea/ @sax3l +/siax.repo.json @sax3l +/siax.config.json @sax3l +# TODO: lägg till migrationskatalogen när den finns, t.ex. +# /packages/db/migrations/ @sax3l diff --git a/compose.dev.yaml b/compose.dev.yaml new file mode 100644 index 0000000..80706b8 --- /dev/null +++ b/compose.dev.yaml @@ -0,0 +1,10 @@ +# DX-02 — lokala beroenden för 0PT. +# +# TODO: deklarera repots FAKTISKA lokala beroenden (databas, cache, objektlager, +# meddelandebuss …) så att DX-01 håller: ett kommando ska resa allt lokalt, utan +# åtkomst till produktion. +# +# Tomt värde nedan betyder "repot har inga lokala beroenden". Scaffolden kan +# inte veta om det är sant — den lämnar det tomt i stället för att hitta på +# tjänster som ingen kör. +services: {} diff --git a/docs/compliance/SCAFFOLD-TODO.md b/docs/compliance/SCAFFOLD-TODO.md new file mode 100644 index 0000000..08d85ae --- /dev/null +++ b/docs/compliance/SCAFFOLD-TODO.md @@ -0,0 +1,59 @@ +# SCAFFOLD-TODO — vad som är härlett och vad som måste verifieras + +**Genererad:** 2026-08-11 av `siax-scaffold` (siax-standard, +`packages/scaffold`) mot Golden Standard v2.0. + +Den här filen finns för att en mall inte får låtsas veta saker. Varje rad nedan +är antingen **härledd ur repot** (källan står i kolumn 3) eller ett +**konservativt defaultvärde** som en människa måste bekräfta. Radera raden när +den är verifierad — filen ska till slut kunna tas bort helt. + +## Härledda värden i `siax.repo.json` + +| Fält | Värde | Härlett ur | +|---|---|---| +| `repo` | `0PT` | `git remote.origin.url` (VERSALER per REPO-08) | +| `codeowners` | `["@sax3l"]` | default (organisationens ägare) | +| `category` | `platform` | befintlig `siax.repo.json` | +| `subcategory` | `data-os` | befintlig `siax.repo.json` | +| `operationalState` | `degraded` | driftsartefakter finns (Dockerfile + siax.config.json) — EJ VERIFIERAT driftläge | +| `domains` | `0 st` | **RÄTTAT MANUELLT:** inte "inga funna" — den BEFINTLIGA `siax.repo.json` listar redan 2 domäner (`0pt.app`, `api.0pt.app`), men som STRÄNGAR. Det nya schemat kräver objekt, så `inherit()` kastar dem (ogiltig typ) och räknar 0 giltiga. Uppgiften är att konvertera de 2 befintliga domänerna till objektformat — inte att hitta på domäner från noll. | +| `children` | `4 st` | faktiska kataloger under apps/, packages/, services/ | +| `packageName` | `@siax/0pt` | befintlig `siax.repo.json` | + +## Måste verifieras av människa + +- [ ] Bekräfta `codeowners` — scaffolden defaultade till `@sax3l` (CI-14). +- [ ] Rätta `operationalState` mot verkligheten (`docker ps` på noden, GOV-06). Scaffolden satte `degraded` eftersom driftsartefakter finns men driftläget inte går att mäta från filsystemet — det är det konservativa valet som HÅLLER REPO-06/CD-01/API-01 aktiva i doctorn i stället för att tysta dem. **OBS (manuellt tillagt):** `siax.repo.json` listar redan `domains: ["0pt.app", "api.0pt.app"]` och `deploy.target: "coolify"`, vilket tyder på ett repo som ÄR eller HAR VARIT driftsatt — bekräfta det faktiska läget mot noden i stället för att anta något åt endera hållet. +- [ ] Beskriv varje post i `children[]` — sökvägarna är härledda ur filträdet, syftet är inte (ARK-11). +- [ ] Konvertera de 2 befintliga domänerna (`0pt.app`, `api.0pt.app`) i `siax.repo.json` från strängar till objekt enligt det nya schemat — de finns redan, de bara har fel typ (REPO-04). Se raden `domains` ovan. +- [ ] **RÄTTAT MANUELLT — gäller INTE detta repo:** den ursprungliga raden här löd "Fastställ `appId` mot CL0UD APP_REGISTRY och ta bort `appIdJustification` (REPO-05)". Det är en av scaffoldens FASTA todos som skrivs oavsett läge. Den BEFINTLIGA `siax.repo.json` har redan `appId: "0PT"` satt (inte `null`), och det finns inget `appIdJustification`-fält att ta bort — det fältet hade bara uppstått om scaffolden skrivit en NY deskriptor, vilket AR-1 förhindrade här eftersom filen redan fanns. Kvarstående uppgift: bekräfta att `0PT` faktiskt är registrerat i CL0UD APP_REGISTRY. +- [ ] Fyll i `consumedBy[]` i `siax.repo.json` från FAS 2-beroendekartan — det fältet SAKNAS helt idag. (`consumes[]` är däremot redan ifyllt i den befintliga filen: `CL0UD, ST0RE, N0D, AUD0, INF0` — ursprungsraden här bad felaktigt om att fylla i båda som om ingetdera fanns.) +- [ ] Fyll i `node` (server5–server11) i `siax.repo.json`, eller lämna `null` om repot inte driftsätts. +- [ ] Kör återställningen skarpt och skriv in datumet i `docs/runbook/backup-restore.md` (DOC-07 — den enda av de tio kontrollerna scaffolden inte kan stänga). +- [ ] Rätta den BEFINTLIGA `siax.repo.json` — den validerar inte mot schemat (REPO-03/04) och scaffolden skriver inte över den (AR-1): (roten): obligatoriskt fält saknas: repo; (roten): obligatoriskt fält saknas: lifecycle; (roten): obligatoriskt fält saknas: gitHost; (roten): obligatoriskt fält saknas: consumedBy; (roten): obligatoriskt fält saknas: children; (roten): obligatoriskt fält saknas: operationalState; (roten): okänt fält "name" (additionalProperties: false); /domains/0: typen är string, förväntad object; /domains/1: typen är string, förväntad object; (roten): okänt fält "deploy" (additionalProperties: false); /designSystem: typen är null, förväntad string + +## Kontroller som scaffolden AVSIKTLIGT lämnar röda + +- **DOC-07** — `docs/runbook/backup-restore.md` saknar datum för bevisad + restore. Scaffolden skriver aldrig in ett datum: kontrollen letar efter ett + datum, och ett genererat sådant skulle göra den grön utan att någon + återställning ägt rum. Kör återställningen, skriv in datumet. +- **REPO-05** — **RÄTTAT MANUELLT, gäller INTE detta repo:** mallraden + påstod "`appId` är `null` med motivering", men den BEFINTLIGA + `siax.repo.json` har redan `appId: "0PT"` satt och inget + `appIdJustification`-fält att ta bort. Det påståendet beskrev scaffoldens + egen, aldrig skrivna, hypotetiska deskriptor (som hade defaultat till + `null` om appId saknats) — inte vad som faktiskt ligger på disk. Se + motsvarande punkt under "Måste verifieras av människa" ovan. +- **API-02/03/04** — ett genererat kontraktsskelett beskriver ingen route. + **OBS:** detta repo har redan `contracts/openapi.yaml` på plats (API-01 + PASS) — inget kontraktsskelett genererades här (action: `ok`, inte + `create`); den här raden är generisk mallinformation om vad scaffolden + gör NÄR den genererar ett skelett, inte ett påstående om att den gjorde + det i detta repo. + +--- + +_Genererad av `siax-scaffold` (siax-standard). Varje `TODO:` i filen måste +fyllas i av en människa. Samlad lista: `docs/compliance/SCAFFOLD-TODO.md`._ -- 2.54.0