diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e6b65ef --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,4 @@ +{ + "name": "0pt", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu" +} diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..4915ce3 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# Miljövariabler för 0pt +# Genererad 2026-11-10 ur källkodens läsningar (endast NAMN — inga värden). +# Fyll i lokalt i .env (som är git-ignorerad). Riktiga hemligheter ligger i +# Infisical och injiceras vid körning; kopiera aldrig in dem här. + +# Inga miljövariabler detekterades i källkoden vid genereringen. +# Om repot inför konfiguration via miljö, lägg till namnen här. 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/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..986a10b --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,22 @@ +name: CI +# Genererad av siax-scaffold (CI-01) för stack: none. +# Grinden körs på push och pull request. Anpassa stegen när repot får egna +# test-/lintkommandon — scaffolden kör bara det som faktiskt finns. +on: + push: { branches: [main] } + pull_request: {} +permissions: { contents: read } +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Kontrollera att repot är konsekvent + run: | + test -f README.md + echo "Ingen körtid upptäckt — ingen build/test-stege genererad." diff --git a/.gitea/workflows/security.yml b/.gitea/workflows/security.yml new file mode 100644 index 0000000..846f5ae --- /dev/null +++ b/.gitea/workflows/security.yml @@ -0,0 +1,53 @@ +name: security +# CI-10 — gitleaks, Semgrep, OSV-Scanner, Trivy. Körs på PR, på push mot main +# och nattligt. Scannrarna körs som containrar för att inte kräva att runnern +# har verktygen installerade (samma mönster som siax-standards egen security.yml). +# +# FÄLLA (verifierad i siax-standards egen CI-utredning): ett stegnamn som +# innehåller ": " (kolon + mellanslag) får Giteas YAML-parser att TYST kasta +# bort hela workflowen — den dispatcheras aldrig och syns inte som fel. +# Håll därför alla `name:`-rader på steg i ren ASCII utan kolon-mellanslag. +# +# TODO (CI-10, ej wired av scaffolden): licenskontroll kräver ett policybeslut +# om vilka licenser som är tillåtna — lägg till steget när listan finns. +on: + push: { branches: [main] } + pull_request: {} + schedule: + - cron: "17 2 * * *" +permissions: { contents: read } +concurrency: + group: security-${{ github.ref }} + cancel-in-progress: true + +jobs: + scan: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: { fetch-depth: 0 } + + # gitleaks over worktree and history (REPO-15, SEC-01) + - name: gitleaks secret scan + run: | + docker run --rm -v "$PWD:/repo" -w /repo \ + zricethezav/gitleaks:latest detect --source /repo --no-banner --exit-code 1 + + # Trivy filsystem, blockerar på HIGH och CRITICAL (SUP-*) + - name: Trivy filesystem scan + run: | + docker run --rm -v "$PWD:/repo" -w /repo \ + aquasec/trivy:latest fs --scanners vuln,secret,misconfig \ + --severity HIGH,CRITICAL --exit-code 1 --no-progress /repo + + # Kända sårbarheter i lockfilen + - name: OSV Scanner + run: | + docker run --rm -v "$PWD:/repo" -w /repo \ + ghcr.io/google/osv-scanner:latest scan source --recursive /repo + + # Statisk kodanalys, felallvarlighet bryter bygget + - name: Semgrep code scan + run: | + docker run --rm -v "$PWD:/src" -w /src \ + semgrep/semgrep:latest semgrep scan --config=p/ci --error --quiet diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..d86112c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,38 @@ +# AGENTS.md — 0PT + +**Vad repot gör:** TODO: en mening om repots syfte. Ska stämma ordagrant med +`README.md` och `docs/architecture/ARCHITECTURE.md` §1 (DOC-19). + +**Starta/testa:** + +```bash +TODO: kommandot som startar repot lokalt (DX-01) +TODO: kommandot som kör testsviten (TEST-01) +TODO: byggkommandot +``` + +**Kodkonventioner:** TODO: språk, ramverk, formatterare, namngivning. Håll +kontroll-ID:n (REPO-01 …) exakta som i +`siax-standard/standard/SIAX-F0KUSREPO-PROMPT-v2.0.md`. + +**Ändras ALDRIG:** + +- `contracts/` — kontraktet är källan till sanning (API-01). Kod genereras + från kontraktet, aldrig tvärtom. +- Migrationer som redan körts i drift (DATA-*) — lägg till en ny i stället. +- TODO: repospecifika frysta ytor (publika endpoints, filformat, nycklar …). + +**Ägare:** SIAX Technology AB (@sax3l). +**Kontrakt:** `contracts/openapi.yaml` (API-01). TODO: bekräfta att kontraktet +beskriver hela HTTP-ytan (API-02) — scaffolden kan inte veta det. + +**Självdiagnos (AGENT-04):** + +```bash +node /packages/doctor/src/doctor.mjs --repo . --fail-on=block +``` + +--- + +_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`._ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ae695fd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,86 @@ +# Ändringslogg — 0pt + +Alla väsentliga ändringar dokumenteras här. Filen är genererad ur repots +git-historik av `siax-scaffold` (DOC-11) och ska uppdateras när historiken +ändras; den ska aldrig handredigeras med påståenden som inte finns i git. + +Formatet följer [Keep a Changelog](https://keepachangelog.com/sv/1.1.0/). + +## [Unreleased] + +Nästa version. Nya poster läggs överst när de mergas. + +## 2026-11-10 + +- fix(security): smala gitleaks-fingerprints för verifierade falska positiver (`39fc5e3`) +- docs(production): standardiserad produktionsberedskap och gap-analys (`a418933`) +- docs(status): spegla STATUS.md i docs/ för produktionsaudit (`fb072d4`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-925f5ca2fd (`dccdfed`) +- chore: adopt SIAX Golden Standard docs and configuration (`2ea4062`) +- ci: re-trigger efter serveromstart (statusuppdatering avbröts) (`54ff8a3`) +- chore(doctor): exempt generated artifacts and mirror prose from REPO-01 (`1e79d0c`) +- docs(policy): SIAX Agent Execution Policy i AGENTS.md + CLAUDE.md (`72d5876`) + +## 2026-11-09 + +- docs(production): standardiserad produktionsberedskap och gap-analys (`66a7e25`) +- chore(manifest): registrera saknade surface-poster (surfaces-fasen) (`416d00f`) +- feat(capabilities): registrera capability-ägare med verifierat kontrakt (#529) (`d3b1964`) +- feat(capabilities): bind operationId for API-surface capability records (`20d66ea`) +- feat(auth): dual-accept CL0UD workload identity on the machine routes (`d40360a`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-62517aca49 (`c6a5102`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-38ae3ddf0b (`4020217`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-b1ae910d64 (`8e7c228`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-419c2d3f18 (`fab0a53`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-ebfa17028d (`32cd714`) + +## 2026-11-08 + +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-6b57f7cb9d (`966a36f`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-72d6d1e8d1 (`5795b35`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-5010a6853b (`a0eba85`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-f5600a25b9 (`5a56cc9`) +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-9aef3cd97f (`fdba72b`) + +## 2026-11-07 + +- fix(signing): cosign-pubkey + SBOM + deployment/env-poster för prod-imagen prod-a0e701efc8 (`be6b92f`) +- test(lint): typa idempotency-store i stället för any (blockerar quality-gaten) (`6bbbcf7`) +- docs(identity): 0pt workload identity — målbild, integrationsdesign och blockerare (`8741169`) +- docs(runbook): legacy-instansaudit server5 (0pt + L0RE) och disposition (`b7627a3`) +- fix(canonical): serialisera timestamptz som RFC3339 (ISO-8601) (`afd0b4e`) +- fix(sql): 023 grants for canonical tables to app-role 0pt_app (`4dbabd1`) +- fix(sql): 022 canonical facts blir idempotent (DROP POLICY IF EXISTS) (`0213459`) +- fix(auth): en (1) tenant per intern serviceprincipal — multi-tenant nekas (`1a581fd`) +- ci: add blocking component conformance gate (`831781f`) +- fix(auth): bind internal-service tenant authority to server config (`b97ad0b`) +- feat(capability): descriptor-completion wave 1 (0pt) — verified openapi operationIds (`019cc23`) +- fix(auth): internal-token requests får verifierad tenant (P0 tenant-isolering) (`849e7ae`) + +## 2026-11-06 + +- ci(sonar): self-hosted SonarQube lives at sonar.siax.dev, not .io (`98039d3`) +- fix(portal): reuse canonic @siax/ui FileDropzone instead of a local ad-hoc one (`4f92cdd`) +- fix(@siax/access): restore relationships.ts that disappeared when the package split into two files (`a424cf1`) +- feat(@siax/access): universal idempotency contract (`f77a4fe`) +- feat(idempotency): operation-scope binding for upload identity (`6ca6e8e`) +- chore(ui): document domain/legacy UI exceptions (`415396f`) + +## 2026-11-05 + +- feat(0pt): canonical-fact machine route + renumber migration to 022 (#484) (`c46ebbf`) +- feat(0pt): canonical structured observations — entities, facts, relations (#480) (`03cdb78`) + +## 2026-11-04 + +- evidence(prod): bind source-bundle artifactId to real deployed image digest (`1163048`) +- evidence(prod): bind source-bundle artifactId to real deployed image digest (`c7966eb`) +- evidence(prod): bind source-bundle artifactId to real deployed image digest (`d5aea59`) +- evidence(prod): bind source-bundle artifactId to real deployed image digest (`ce6be94`) +- evidence(prod): real artifact-digest, running-digest and deploy-log for 13e156ec7e6b (`4c20e54`) +- chore(runtime-evidence): sbom — estate-kampanj issue #76 (app 0pt) (`b29e484`) +- chore(design): add design-conformance manifest (`76e3c0d`) + +--- + +Genererad: 2026-11-10. Underlag: `git log --no-merges` (senaste 50 commits). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d4a9427 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +SIAX Proprietary License +Copyright (c) 2026 SIAX Technology AB. All rights reserved. + +SPDX-License-Identifier: LicenseRef-SIAX-Proprietary + +This software and its source code are proprietary and confidential. + +1. No license, express or implied, is granted except by a separate written + agreement signed by SIAX Technology AB. +2. Copying, modifying, distributing, sublicensing or deploying this software + outside SIAX Technology AB's own systems requires such an agreement. +3. Third-party components included in or fetched by this repository remain + under their own licenses; see the dependency lockfile and NOTICE files. +4. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + +Questions about licensing: legal@siax.io diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..b59392c --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,52 @@ +# Säkerhetspolicy — 0pt + +## Rapportera en sårbarhet + +Mejla **security@siax.io** med repo, version/commit, reproduktion och påverkan. +Skicka inte en publik issue för säkerhetsproblem. Vi bekräftar mottagande och +återkommer med bedömning; koordinera offentliggörande med oss. + +## Omfattning + +Detta repo (`0pt`) ingår i SIAX-plattformen. Policyn omfattar källkod, +CI-kedjor, containers och de hemligheter som används vid bygge och drift. + +## Hemligheter + +- Inga hemligheter i git — varken i kod, `.env`, fixturer eller historik. +- Hemligheter lagras i Infisical (`vault.siax.io`) och injiceras vid körning + (`siax-secrets run --env -- `). Värden skrivs aldrig ut i + loggar eller dokumentation. +- `.env.example` innehåller namn och beskrivningar, aldrig värden. +- `gitleaks` körs i CI (REPO-15). Ett fynd är ett stopp, inte en varning. + +## Beroenden och kedjan + +- Låsta versioner och lockfil i varje repo (SUP-01). Renovate hanterar + uppdateringar (SUP-05); säkerhetsuppdateringar prioriteras. +- CI-actioner pinnas till commit-SHA när så krävs av standarden (SUP-06). +- Containrar byggs från egna baser med minimal yta; ingen `tsx`/`ts-node` + i produktion (CD-03). + +## Åtkomst och identitet + +- Tjänst-till-tjänst sker med workload-identitet och tenant-scope, inte med + delade statiska nycklar (se `siax.repo.json` → `identity`). +- Minsta behörighet gäller; ingen app får bredare åtkomst än sin deklarerade + kapacitet. + +## Personuppgifter + +- Klassificering och PII-krav deklareras i `siax.repo.json` → `discovery`. +- Personuppgifter får inte loggas, cachelagras eller kopieras till miljöer som + inte är godkända för ändamålet. + +## Incidenter + +Följ `docs/runbook/incident.md`. Bevara evidens, begränsa spridning, återställ +och skriv en efteranalys. Kontakta ansvarig owner enligt `.gitea/CODEOWNERS`. + +--- + +Denna policy är genererad 2026-11-10 och gäller tills en mänskligt granskad +version ersätter den. Den påstår ingen genomförd granskning eller certifiering. 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/architecture/ARCHITECTURE.md b/docs/architecture/ARCHITECTURE.md new file mode 100644 index 0000000..c1a3817 --- /dev/null +++ b/docs/architecture/ARCHITECTURE.md @@ -0,0 +1,66 @@ +# Arkitektur — 0PT + +> **Status:** automatisk första version, genererad av `siax-scaffold` ur repots +> faktiska filer. Den beskriver vad som finns, inte vad som är bestämt. Läs +> igenom, rätta och fyll i avsnitten som är markerade TODO innan dokumentet +> betraktas som en arkitekturbeskrivning (ARK-serien). + +Senast verifierad mot kod: 2026-11-10 + +## 1. Översikt + +| Fält | Värde | +| --- | --- | +| Repo | `0pt` | +| Körtid | okänd | +| Ramverk | okänd | +| Paketnamn | — | +| Domäner i `siax.config.json` | inga | + + +## 2. Komponenter + +Toppnivåkataloger som innehåller kod eller konfiguration (härledda ur filträdet): + +| Katalog | Roll | +| --- | --- | +| `services//` | TODO: beskriv katalogens roll (services/) | +| `docs//` | TODO: beskriv katalogens roll (docs/) | + +Undermoduler som är deklarerade i `children[]`: + +| Sökväg | Syfte | +| --- | --- | +| — | Inga undermoduler (apps/, packages/, services/) finns. | + +## 3. Startpunkter + +| Fil | Typ | +| --- | --- | +| — | Ingen startpunkt hittades i `package.json`, `pyproject.toml` eller `Dockerfile`. | + +## 4. Språk och filfördelning + +| Ändelse | Omfattning | +| --- | --- | +| .ts | 1 filer | + +## 5. Dataflöde + +TODO: beskriv hur data rör sig genom repot: inkommande anrop/jobb → lagring → utdata, och vilka externa system som anropas. Scaffolden kan inte härleda detta ur filerna. + +## 6. Gränser och beroenden + +TODO: lista vilka SIAX-komponenter repot äger respektive konsumerar (REUSE FIRST), samt vilka kontrakt som är stabila utåt. Se `siax.repo.json` → `consumes`/`consumedBy`. + +## 7. Drift och miljöer + +Ingen `siax.config.json` finns — repot är inte deklarerat som driftsatt. Om det driftsätts ska `siax.config.json` skapas först (REPO-06). + +TODO: verifiera mot faktisk nod och `docker ps` (GOV-06). Ett dokument får inte påstå drift som inte är mätt. + +## 8. Källhänvisning + +- Genererad: 2026-11-10 av `siax-scaffold` (scaffold 2026-11-10). +- Underlag: filträdet, `package.json`/`pyproject.toml`, `Dockerfile`, `siax.repo.json`. +- Ändringslogg: se `CHANGELOG.md` och git-historiken. diff --git a/docs/compliance/SCAFFOLD-TODO.md b/docs/compliance/SCAFFOLD-TODO.md new file mode 100644 index 0000000..93a0960 --- /dev/null +++ b/docs/compliance/SCAFFOLD-TODO.md @@ -0,0 +1,45 @@ +# SCAFFOLD-TODO — vad som är härlett och vad som måste verifieras + +**Genererad:** 2026-11-10 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` | DEFAULT — ej härledbart | +| `subcategory` | `TODO: fyll i underkategori (t.ex. compute-os, saas-ersättare)` | TODO-markör | +| `operationalState` | `planned` | inga driftsartefakter (varken Dockerfile eller siax.config.json) | +| `domains` | `0 st` | inga funna | +| `children` | `1 st` | faktiska kataloger under apps/, packages/, services/ | + +## Måste verifieras av människa + +- [ ] Bekräfta `codeowners` — scaffolden defaultade till `@sax3l` (CI-14). +- [ ] Verifiera `category` i `siax.repo.json` mot den kanoniska taxonomin och CL0UD APP_REGISTRY (GOV-01/REPO-05). Scaffolden defaultade till `platform` — den kan inte veta. +- [ ] Fyll i `subcategory` i `siax.repo.json` (REPO-04). +- [ ] Bekräfta `operationalState` — scaffolden satte `planned` eftersom repot saknar driftsartefakter (GOV-06). +- [ ] Beskriv varje post i `children[]` — sökvägarna är härledda ur filträdet, syftet är inte (ARK-11). +- [ ] Välj rätt devcontainer-bild — scaffolden kunde inte avgöra körtiden och valde en generisk Ubuntu-bas (DX-03). +- [ ] Fastställ `appId` mot CL0UD APP_REGISTRY och ta bort `appIdJustification` (REPO-05). +- [ ] Fyll i consumes[] och consumedBy[] från FAS 2-beroendekartan — de får aldrig gissas. +- [ ] 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). + +## Kontroller som scaffolden AVSIKTLIGT lämnar röda + +- **REPO-05** — `appId` är `null` med motivering. Ett påhittat appId skulle se konformt ut och peka på ingenting i CL0UD APP_REGISTRY. +- **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. + + +--- + +_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`._ diff --git a/docs/runbook/backup-restore.md b/docs/runbook/backup-restore.md new file mode 100644 index 0000000..9ea3aef --- /dev/null +++ b/docs/runbook/backup-restore.md @@ -0,0 +1,36 @@ +# Backup & restore + +## Vad som säkerhetskopieras + +TODO: lista varje tillstånd repot äger — databas, volymer, objektlager, +hemligheter. Sådant som inte står här är inte säkerhetskopierat. + +| Tillstånd | Var | Frekvens | Retention | +|---|---|---|---| +| TODO | TODO | TODO | TODO | + +## Återställning — steg + +1. TODO: exakt kommando för att hämta senaste dumpen. +2. TODO: exakt kommando för att läsa in den. +3. TODO: hur du verifierar att data faktiskt är tillbaka (räkna rader, anropa + en endpoint) — inte bara att kommandot gav exit 0. + +## Senast bevisad restore + +**EJ BEVISAD.** + +TODO: kör återställningen skarpt mot en tom miljö och skriv in datumet här på +formen ÅÅÅÅ-MM-DD tillsammans med vem som körde den och vad som verifierades. + +> Detta fält är avsiktligt tomt. `siax-scaffold` skriver ALDRIG in ett datum +> här: DOC-07 letar efter ett datum, och ett genererat datum skulle göra +> kontrollen grön utan att någon återställning ägt rum. Kontrollen ska förbli +> röd tills påståendet är sant. + +**RTO/RPO:** TODO: mät, gissa inte. + +--- + +_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`._ diff --git a/docs/runbook/deploy.md b/docs/runbook/deploy.md new file mode 100644 index 0000000..3a62d5e --- /dev/null +++ b/docs/runbook/deploy.md @@ -0,0 +1,26 @@ +# Deploy + +TODO: `siax.config.json` saknas (REPO-06) — fyll i framework, build, +start, port, healthcheck och per-miljö-domän, och spegla dem här. + +## Steg + +1. TODO: hur en ändring når drift (börvärde i estatet: merge till `main` → + `.gitea/workflows/cd.yml` → Coolify-webhook på den nod repot bor på). + Skriv det som FAKTISKT sker — inte det som borde ske (DOC-19). +2. TODO: hur du verifierar att den nya versionen kör (healthcheck-URL, exakt + `curl`-kommando och förväntat svar). +3. TODO: rollback — exakt kommando/knapp och hur lång tid det tar (CD-*). + +## Förutsättningar + +- Hemligheter hämtas från Infisical, aldrig ur repot (AR-6, SEC-01). +- TODO: vilka env-nycklar som måste finnas innan deploy. + +**Runbooken ska vara körbar av någon som inte byggt systemet (DOC-06).** +Så länge något `TODO` står kvar är den inte det. + +--- + +_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`._ diff --git a/docs/runbook/incident.md b/docs/runbook/incident.md new file mode 100644 index 0000000..5cb2a0c --- /dev/null +++ b/docs/runbook/incident.md @@ -0,0 +1,35 @@ +# Incident + +## 1. Bekräfta + +TODO: exakt kommando/URL som visar om tjänsten lever (healthcheck, `docker ps` +på noden, dashboard). Ett incidentsvar börjar alltid med en mätning. + +## 2. Klassa + +| Läge | Innebörd | Åtgärd | +|---|---|---| +| Nere | ingen trafik betjänas | eskalera direkt, se `oncall.md` | +| Degraderad | fel/latens över SLO | TODO: tröskelvärden ur `docs/slo.md` (OBS-10) | +| Kosmetiskt | ingen kundpåverkan | ärende, inte incident | + +## 3. Vanliga orsaker (fylls på efter varje incident) + +- TODO: känd felkälla 1 — symptom, kommando som bekräftar, åtgärd. +- TODO: känd felkälla 2. + +## 4. Återställ + +1. TODO: rollback enligt `deploy.md`. +2. TODO: om data är påverkad — följ `backup-restore.md` (och notera att + återställningen då faktiskt är bevisad, DOC-07). + +## 5. Efterarbete + +Postmortem i `docs/incidents/` — orsak, tidslinje, vad som saknades i +mätningen, vilken kontroll som skulle ha fångat det. Aldrig skuld på person. + +--- + +_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`._ diff --git a/docs/runbook/oncall.md b/docs/runbook/oncall.md new file mode 100644 index 0000000..bcfac90 --- /dev/null +++ b/docs/runbook/oncall.md @@ -0,0 +1,21 @@ +# Oncall + +**Jour:** TODO: vem som svarar, på vilken kanal, inom vilken tid. Står här +"ingen jour" ska det vara ett medvetet beslut — inte en glömska. + +**Eskalering:** TODO: namn + kontaktväg. Sista instans i estatet: Simon +(goat@siax.io). + +**Innan du väcker någon:** + +1. Kör bekräftelsesteget i `incident.md` §1. +2. Kolla om det finns en känd orsak i `incident.md` §3. +3. TODO: länk till dashboard/larm (OBS-06/OBS-08). + +**Larmvägar:** TODO: vilka larm som faktiskt är kopplade. Ett larm som ingen +tar emot är inget larm. + +--- + +_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`._ diff --git a/prompts/000-INDEX.md b/prompts/000-INDEX.md new file mode 100644 index 0000000..626e79b --- /dev/null +++ b/prompts/000-INDEX.md @@ -0,0 +1,25 @@ +# Prompt-index — 0PT + +| # | Prompt | Status | Beroende | +|---|---|---|---| +| — | _inga numrerade prompts ännu_ | — | — | + +## Öppet, ännu inte brutet till numrerade prompts + +Punkterna nedan hittades av `siax-scaffold` när mallarna lades in. Var och en +ska bli en egen `NNN-.md` enligt mallen i DEL 5.5 av standarden, med +maskinellt verifierbara acceptanskriterier och kontroll-ID (AGENT-03). + +- Bekräfta `codeowners` — scaffolden defaultade till `@sax3l` (CI-14). +- Verifiera `category` i `siax.repo.json` mot den kanoniska taxonomin och CL0UD APP_REGISTRY (GOV-01/REPO-05). Scaffolden defaultade till `platform` — den kan inte veta. +- Fyll i `subcategory` i `siax.repo.json` (REPO-04). +- Bekräfta `operationalState` — scaffolden satte `planned` eftersom repot saknar driftsartefakter (GOV-06). +- Beskriv varje post i `children[]` — sökvägarna är härledda ur filträdet, syftet är inte (ARK-11). +- Välj rätt devcontainer-bild — scaffolden kunde inte avgöra körtiden och valde en generisk Ubuntu-bas (DX-03). + +Fullständig lista med härledda värden som måste verifieras: `docs/compliance/SCAFFOLD-TODO.md`. + +--- + +_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`._ diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..e86ec99 --- /dev/null +++ b/renovate.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended", + ":dependencyDashboard", + ":semanticCommits" + ], + "timezone": "Europe/Stockholm", + "schedule": [ + "after 04:00 and before 07:00" + ], + "labels": [ + "dependencies" + ], + "prConcurrentLimit": 5, + "rangeStrategy": "replace", + "packageRules": [ + { + "matchUpdateTypes": [ + "patch", + "minor" + ], + "groupName": "mindre uppdateringar", + "groupSlug": "minor" + }, + { + "matchUpdateTypes": [ + "major" + ], + "labels": [ + "dependencies", + "major" + ], + "dependencyDashboardApproval": true + }, + { + "matchDepTypes": [ + "devDependencies" + ], + "groupName": "utvecklingsberoenden", + "groupSlug": "dev" + } + ], + "vulnerabilityAlerts": { + "labels": [ + "security" + ], + "schedule": [ + "at any time" + ] + }, + "lockFileMaintenance": { + "enabled": true, + "schedule": [ + "before 06:00 on monday" + ] + } +} diff --git a/siax.repo.json b/siax.repo.json new file mode 100644 index 0000000..ab1e732 --- /dev/null +++ b/siax.repo.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.siax.io/sax3l/siax-standard/raw/branch/main/schema/siax.repo.v3.schema.json", + "standardVersion": "3.0", + "repo": "0PT", + "category": "platform", + "subcategory": "TODO: fyll i underkategori (t.ex. compute-os, saas-ersättare)", + "appId": null, + "appIdJustification": "TODO: appId ej fastställt. Genererat av siax-scaffold, som inte kan slå upp CL0UD APP_REGISTRY. Ett påhittat appId hade sett konformt ut och pekat på ingenting (REPO-05).", + "capabilityPrefix": "0pt", + "owner": "SIAX Technology AB", + "lifecycle": "active", + "operationalState": "planned", + "gitHost": "git.siax.io", + "node": null, + "domains": [], + "consumes": [], + "consumedBy": [], + "children": [ + { + "path": "services/api", + "purpose": "TODO: beskriv modulens syfte", + "lifecycle": "active" + } + ], + "replacesSaaS": [], + "tier": "product", + "canonical": true, + "parentRepo": null, + "capabilities": [], + "surfaces": [ + "api" + ], + "identity": { + "workloadIdentity": false, + "tenantScoped": true + }, + "persistence": { + "stateful": false, + "database": "none", + "storage": "none" + }, + "deployment": { + "node": null, + "dedicated": false + }, + "observability": { + "health": false, + "ready": false, + "metrics": false + }, + "reliability": { + "backupFrequency": "none", + "provenRestore": false + }, + "engines": [], + "licenses": { + "spdx": "LicenseRef-SIAX-Proprietary", + "approved": false + }, + "productionEvidence": { + "verified": false + }, + "discovery": { + "enabled": true, + "profile": "FULL_DISCOVERY", + "changeCapture": { + "strategy": "transactional_outbox", + "fallback": "cdc" + }, + "classification": { + "default": "internal", + "failClosed": true + }, + "pii": { + "detectionRequired": false, + "detectorRef": "TODO: sätt om repot rör persondata" + }, + "lineage": { + "required": true + }, + "deletion": { + "propagationRequired": true + }, + "retention": { + "policyRef": "TODO: retention-policy (t.ex. operational_30d, permanent)" + }, + "projections": [], + "exclusions": [] + }, + "decision": { + "policies": [], + "consumes": [ + "decision.choice", + "decision.score", + "decision.boolean" + ], + "deterministicOnly": false + }, + "runtime": { + "language": "node-esm", + "packageManager": "pnpm" + }, + "contracts": {} +}