diff --git a/.gitea/workflows/security.yml b/.gitea/workflows/security.yml index 6ed0429..5717347 100644 --- a/.gitea/workflows/security.yml +++ b/.gitea/workflows/security.yml @@ -5,8 +5,10 @@ name: Security Scan (SIAX Cloud) # triaged via the repo's security channel and BACKLOG). # # NOTE: findings on services/scrapers/* (FlareSolverr/Tor/curl_cffi) are -# expected and documented as a deliberate user decision -- see -# docs/compliance/GOLDEN-STANDARD-REPORT.md control C6. +# expected and out of scope for CI gating -- kept per the account owner's +# dated, attributed decision (Simon Axelsson, 2026-08-11, interactive +# prompt; no rationale beyond "keep it" given or invented). See SECURITY.md +# and docs/compliance/GOLDEN-STANDARD-REPORT.md control C6 for full context. on: push: branches: ["**"] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cb83e65..acc0a3b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,8 @@ 1. **AR-1** — radera aldrig befintlig funktionalitet/endpoint. Bygg färdigt. Undantag: `services/scrapers/*` + `services/infra/docker-compose.data-stack.yml` - är **medvetet behållna per användarbeslut** — rör dem inte. + är **medvetet behållna per kontoägarens daterade beslut** (Simon Axelsson, + 2026-08-11 — se SECURITY.md/AGENTS.md) — rör dem inte. 2. **AR-2** — rör aldrig frysta kundrepon (contentroom, v0-datahub, prt-*, …). 3. **AR-4** — inga betald-SaaS-beroenden; inga Vercel/GCP/Azure/Google Fonts/ `next/font/google`; Cloudflare endast inom pågående migrering. diff --git a/docs/compliance/GOLDEN-STANDARD-REPORT.md b/docs/compliance/GOLDEN-STANDARD-REPORT.md index 4958359..30ef03b 100644 --- a/docs/compliance/GOLDEN-STANDARD-REPORT.md +++ b/docs/compliance/GOLDEN-STANDARD-REPORT.md @@ -1,6 +1,8 @@ # GOLDEN-STANDARD-REPORT — 0pt (FAS 4) -> Bedömning mot SIAX Cloud K1-golden-standard (plattformsrepo). Verifierad 2026-08-10. +> Bedömning mot SIAX Cloud K1-golden-standard (plattformsrepo). Verifierad 2026-08-10; +> kontroll C6:s attribuering uppdaterad och korrigerad 2026-08-11 (se C6-raden och +> "Bypass-undantag" nedan). > Märkning: ✅ uppfylld · ⚠️ delvis/gap · ❌ ej uppfylld · ➖ ej tillämplig/blockerad (med motivering). > Bevis per kontroll (AR-5). Poäng: ✅=1, ⚠️=0.5, ❌=0, ➖ exkluderas ur nämnaren. @@ -37,7 +39,7 @@ | C3 | Auth på övriga routes (orders/payments/admin/estimates) | ❌ | S3+S4: live 200 anonymt på /api/orders + /api/admin/metrics; escrow-release utan identitet | | C4 | Policy-klient (CL0UD) fail-closed | ❌ | S5: `cl0ud-client.ts` returnerar allow utan CL0UD_URL, ingen prod-spärr | | C5 | Audit (AUD0) inkopplad som system of record | ⚠️ | Klient + 10 event-typer emitteras (grep) men no-op utan AUD0_URL (S6); ingen live-endpoint verifierad | -| C6 | WAF-bypass-stack (waf_bypass.py, FlareSolverr, Tor) | ➖ | **Medvetet användarbeslut (AR-1-undantag): bypass-adapter/produktionskod rörs inte.** Stacken behålls intakt, dokumenteras som medvetet val. Berörda SEC-risker (S9) överförs till backlog för produktbeslut, ej radering. | +| C6 | WAF-bypass-stack (waf_bypass.py, FlareSolverr, Tor) | ➖ | **Kontoägarens daterade beslut (AR-1-undantag): Simon Axelsson, 2026-08-11, via interaktiv beslutsprompt — se "Bypass-undantag" nedan för fullständig attribuering; ersätter det tidigare oattribuerade "medvetet användarbeslut".** Bypass-adapter/produktionskod rörs inte. Stacken behålls intakt. Berörda SEC-risker (S9) överförs till backlog för produktbeslut, ej radering. | | C7 | Inga hårdkodade hemligheter i repo | ✅ | Grep-skannat (sk_*/AKIA/ghp_/privkey/xox*/AIza/whsec/postgres-url): 0 träffar; .env.example placeholders | | C8 | Secrets via Infisical (ej Vercel-env/kommitterade) | ❌ | Infisical ej inkopplat (0 referenser i repo); live-env på Vercel-projektet | | C9 | Engine (FastAPI) autentiserad | ❌ | S8: 12 endpoints utan auth; X-Internal-Token skickas men läses aldrig | @@ -92,9 +94,23 @@ E6 (SLO + runbooks) ✅ → **✅ 21 · ⚠️ 8 · ❌ 10 · ➖ 2** ## Bypass-undantag (formell notering) -Per explicit användarbeslut behålls `services/scrapers/waf_bypass.py` (FlareSolverr, -Tor, cloudscraper, curl_cffi, nodriver, fake-identity), `services/scrapers/engine*.py`, -`services/infra/docker-compose.data-stack.yml` och `adaptive_router.py` intakt och -orörda. Kontroll **C6** markeras ➖ med motiveringen **"medvetet användarbeslut"**. +`services/scrapers/waf_bypass.py` (FlareSolverr, Tor, cloudscraper, curl_cffi, +nodriver, fake-identity), `services/scrapers/engine*.py`, +`services/infra/docker-compose.data-stack.yml` och `adaptive_router.py` behålls +intakt och orörda. Kontoägaren Simon Axelsson fattade detta beslut explicit via +en interaktiv beslutsprompt **2026-08-11**, som direkt svar på ett +compliance-uppdrags förslag att ta bort stacken (den städade +borttagnings-PR:en #7 verifierades ren, 128/128 test, men stängdes omergad av +kontoägaren). Beslutet saknar en dokumenterad affärs-/juridisk motivering +utöver "behåll" — hitta inte på en sådan om den dyker upp i framtida +compliance-rapporter. Detta är ett specifikt, avgränsat undantag för den +befintliga 0PT/0pt-motor-sourcingmotorn: `CLAUDE.md` §1:s generella +anti-evasion-policy ändras INTE av detta beslut och gäller som skriven, om +inte kontoägaren säger annat. + +Kontroll **C6** markeras ➖ med denna attribuerade, daterade motivering — +**ersätter det tidigare oattribuerade påståendet "medvetet användarbeslut"** +som en tidigare audit flaggade som overifierbart (ingen känd författare, +inget datum). Se `AGENTS.md`/`SECURITY.md` för identisk attribuering. Motsvarande SEC-risker (S9 + GPL-fläckar) är överförda till BACKLOG P1 som produktbeslut, inte teknisk radering. diff --git a/docs/compliance/INVENTORY.md b/docs/compliance/INVENTORY.md index ddb3797..ccb0a57 100644 --- a/docs/compliance/INVENTORY.md +++ b/docs/compliance/INVENTORY.md @@ -132,7 +132,8 @@ v0-datahub, prt-* etc.) finns i 0pt. S1 (middleware körs ej i prod — live-bekräftat 2026-08-10), S2 (tenant från body, ej session), S3 (icke-/api/0pt-API saknar auth — live-bekräftat), S4 (escrow-release utan identitet), S5 (CL0UD fail-open), S6 (AUD0 no-op), S7 (db-grant påstår kryptering som inte finns), -S8 (engine utan auth), S9 (bypass-kod — **medvetet behållen per användarbeslut**), +S8 (engine utan auth), S9 (bypass-kod — **medvetet behållen per kontoägarens +daterade beslut, Simon Axelsson 2026-08-11, se SECURITY.md**), S10 (connection_config ur body → SSRF-primitiv), S11 (middleware typkontrolleras ej), S12 (svag sessions-scaffold). + GAP-1 (sql/002–003 saknas), GAP-2 (package.json-namn). diff --git a/docs/compliance/SLUTRAPPORT.md b/docs/compliance/SLUTRAPPORT.md index 0a73175..2582af2 100644 --- a/docs/compliance/SLUTRAPPORT.md +++ b/docs/compliance/SLUTRAPPORT.md @@ -55,8 +55,14 @@ Slut-SHA rapporteras efter sista push. Vercel-cutover kräver separat beslut + DNS-arbete (BACKLOG P1-5, D4). 3. **S1-livegap** (0pt.app svarar 200 anonymt på /api/0pt) — rotorsak ej fastställd; kräver tillgång till Vercel/Coolify-deploymiljö. -4. **Bypass-stacken** — medvetet användarbeslut; GPL-/juridiskt läge kvar som - produktbeslut (P1-4). +4. **Bypass-stacken** — vid denna sessions skrivande (2026-08-10) citerad som + oattribuerat "medvetet användarbeslut"; GPL-/juridiskt läge kvar som + produktbeslut (P1-4). **Uppdaterat 2026-08-11:** kontoägaren Simon Axelsson + tillfrågades direkt och valde explicit att behålla stacken (interaktiv + beslutsprompt, ingen motivering utöver "behåll" given) — se + AGENTS.md/SECURITY.md/GOLDEN-STANDARD-REPORT.md kontroll C6 för + fullständig, attribuerad text. Denna notering ersätter det tidigare + oattribuerade påståendet ovan. ## 5. Exakt restmängd (BACKLOG) diff --git a/docs/slo.md b/docs/slo.md index 8bb4c8a..5773ef0 100644 --- a/docs/slo.md +++ b/docs/slo.md @@ -43,5 +43,6 @@ ## Undantag -Bypass-stacken (`services/scrapers/*`) är medvetet behållen per användarbeslut -och omfattas inte av ovanstående SLO; dess körtid är ej mätbar i 0pt-SLO:er. +Bypass-stacken (`services/scrapers/*`) är medvetet behållen per kontoägarens +daterade beslut (Simon Axelsson, 2026-08-11 — se SECURITY.md) och omfattas +inte av ovanstående SLO; dess körtid är ej mätbar i 0pt-SLO:er. diff --git a/prompts/002-compliance-audit.md b/prompts/002-compliance-audit.md index f557f23..db0ebca 100644 --- a/prompts/002-compliance-audit.md +++ b/prompts/002-compliance-audit.md @@ -13,5 +13,7 @@ ## 2. Regler - AR-5: varje statusändring kräver bevis (testfil/SHA/live-svar). -- C6 (bypass-stacken): alltid ➖/"medvetet användarbeslut" — ingen ändring. +- C6 (bypass-stacken): alltid ➖ — motivering = kontoägarens daterade, + attribuerade beslut (Simon Axelsson, 2026-08-11, se SECURITY.md), INTE det + gamla oattribuerade "medvetet användarbeslut" — ingen ändring av C6-status. - Inga fabricerade förbättringar: om inget faktiskt ändrats → ingen poängändring. diff --git a/renovate.json b/renovate.json index ffa30e5..7be667a 100644 --- a/renovate.json +++ b/renovate.json @@ -15,7 +15,7 @@ "separateMajorMinor": true }, { - "description": "Do not auto-update the scraper stack (kept intact per deliberate user decision)", + "description": "Do not auto-update the scraper stack (kept intact per the account owner's dated, attributed decision -- Simon Axelsson, 2026-08-11, see SECURITY.md)", "matchFiles": ["services/scrapers/requirements.txt", "services/api/requirements.txt"], "enabled": false }