From b3003f8a6566ef1c4479d9565b716ae3a37b36bd Mon Sep 17 00:00:00 2001 From: Simon Axelsson Date: Mon, 9 Nov 2026 23:58:28 +0100 Subject: [PATCH] docs(production): standardiserad produktionsberedskap och gap-analys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lägger docs/production-readiness.md och siax/production-gaps.json enligt SIAX Master Definition of Done. Underlag: git-, kod- och live-evidens 2026-11-09. Nivån är evidensbaserad, inte ett leveransgodkännande. --- docs/production-readiness.md | 90 +++++++++++++++++++++++++++++ siax/production-gaps.json | 109 +++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 docs/production-readiness.md create mode 100644 siax/production-gaps.json diff --git a/docs/production-readiness.md b/docs/production-readiness.md new file mode 100644 index 00000000..0553edf9 --- /dev/null +++ b/docs/production-readiness.md @@ -0,0 +1,90 @@ +# accounted — produktionsberedskap + +> Standardiserad gap-analys enligt SIAX Master Definition of Done. +> Dokumentet är evidens, inte ett leveransgodkännande. Endast `PRODUCTION_READY` får kallas klart. + +## Identitet + +- Repo: `https://git.siax.io/admin/accounted.git` +- Manifest: `siax.repo.v3.json` — `accounted`, operationalState `building` +- Default branch: `main` +- Bedömd nivå: **INTEGRATION_TESTED** (manifestets DoD-anspråk: nej) +- UI: ja — app, public +- CI-arbetsflöden: 2 + +## Git- och arbetsyteläge + +- Aktuell branch: `main` — ahead 0 / behind 0 +- Ocommittade filer: 0 · otrackade: 0 +- Worktrees: 1 +- Lokala grenar: 1 · remote: 5 + +## Livebevis (observerat 2026-11-09T23:48:50) + +Ingen produktionsdomän är deklarerad i manifestet. Det är ett gap för en produkt som ska driftas. + +## Kod- och UI-signaler + +- Trackade filer: 6117 +- Testfiler: 1960 · E2E: 0 · Playwright: False · Cypress: False +- API-kontrakt: saknas +- Migrationer: 836 · Health-referenser: 106 +- `@siax/ui`/tokens: False · a11y-verktyg: False · design-conformance: False +- UI-tillståndsfiler: app/(auth)/loading.tsx, app/(dashboard)/articles/[id]/loading.tsx, app/(dashboard)/articles/loading.tsx, app/(dashboard)/bookkeeping/[id]/loading.tsx, app/(dashboard)/bookkeeping/loading.tsx, app/(dashboard)/customers/[id]/loading.tsx, app/(dashboard)/customers/loading.tsx, app/(dashboard)/deadlines/loading.tsx, app/(dashboard)/e/[sector]/[slug]/loading.tsx, app/(dashboard)/error.tsx +- TODO/FIXME: 20 +- Exempel: + - `DECISIONS.md:473:[2026-07-26] Three plus-minus DUPLICATE_AMOUNT_TOLERANCE_PCT bands were built in one currency and applied, in SQL, to a column denominated in another: findDuplicat` + - `app/api/import/articles/__tests__/execute.test.ts:222: rows: [row({ article_number: 'A-1', currency: 'XXX' })],` + - `app/api/import/articles/__tests__/execute.test.ts:228: expect(body.data.warnings.some((w) => w.includes('XXX'))).toBe(true)` + - `app/api/v1/companies/[companyId]/invoices/bulk-create/route.ts:153: * TODO: extract POST /invoices's create logic into a shared lib function` + - `components/settings/CompanyDangerZone.tsx:41: * TODO(bankid): once users have a linked BankID identity, wrap the` + +## Gap mot PRODUCTION_READY + +- `BUILDING_NOT_RELEASED` +- `NO_BACKUP_POLICY` +- `NO_PROVEN_RESTORE` +- `NO_STATUS_DOC` + +## Prioriterad backlogg + +| Prio | Åtgärd | Konkret nästa steg | +|---|---|---| +| P1 | API-kontrakt | Publicera versionerat OpenAPI-kontrakt i repots kontraktskatalog och drift-checka det. | +| P1 | Backup | Definiera frekvens, retention, mål och kryptering i `siax.backup`. | +| P1 | E2E i webbläsare | Lägg Playwright-flöde för inloggning och kärnflöde mot riktig miljö. | +| P1 | Restore-bevis | Genomför en verklig återställning och registrera resultat i `siax.restore-evidence`. | +| P1 | Tillgänglighetsgrind | Aktivera eslint-plugin-jsx-a11y/axe och en blockerande WCAG 2.2-kontroll. | +| P2 | Arkitektur | Beskriv produktgräns, canonical owner, beroenden och dataflöde i `docs/architecture.md`. | +| P2 | DES1GN-beroende | Använd `@siax/ui` + `@siax/tokens` i stället för lokala kopior av primitiver. | +| P2 | Designkonformitet | Kör `siax-doctor design --repo . --fail-on=block` och checka in `siax/design-conformance.json`. | +| P2 | Runbook | Dokumentera deploy, rollback, backup/restore och incidentflöde i `docs/runbook/`. | +| P2 | Statusdokument | Lägg `docs/STATUS.md` med nivå, bevis, kända gap och nästa steg. | +| P2 | Teknisk skuld | Prioritera bland 20 TODO/FIXME-markeringar; stäng eller gör dem spårbara som issues. | + +## Checklista före PRODUCTION_READY + +- [ ] Canonical owner och produktgräns dokumenterad +- [ ] Versionerat API-/eventkontrakt med drift-check +- [ ] Tenant-isolering verifierad med negativt test +- [ ] Observability: metrics, loggar, spårning och larm +- [ ] Backup och verkligt återställningstest +- [ ] Live-E2E med verklig konsument, inte mock +- [ ] Deployad commit-SHA och build-ID utlästa ur runtime +- [ ] UI/UX granskad mot DES1GN och WCAG 2.2 där UI finns + +## Verifieringskommandon + +```bash +mise run check && mise run verify && mise run build +siax-doctor design --repo . --fail-on=block +curl -fsS https:///health && curl -fsS https:///ready +``` + +## Standardreferenser + +- `siax-standard/standard/MASTER-DEFINITION-OF-DONE.md` +- `siax-standard/standard/SIAX-REPO-OPERATIONS-CONTRACT.md` +- `siax-standard/standard/registry/REUSE_FIRST_POLICY.md` + +_Genererad 2026-11-09T23:41:39 från git, manifest, kodsignaler och live-prober. Omgenereras av `scripts/estate-production-audit.py`._ diff --git a/siax/production-gaps.json b/siax/production-gaps.json new file mode 100644 index 00000000..f06f4332 --- /dev/null +++ b/siax/production-gaps.json @@ -0,0 +1,109 @@ +{ + "name": "accounted", + "slug": "accounted", + "origin_url": "https://git.siax.io/admin/accounted.git", + "manifest_file": "siax.repo.v3.json", + "manifest_operational_state": "building", + "assessed_level": "INTEGRATION_TESTED", + "observed_live": null, + "gaps": [ + "BUILDING_NOT_RELEASED", + "NO_BACKUP_POLICY", + "NO_PROVEN_RESTORE", + "NO_STATUS_DOC" + ], + "ui": true, + "ui_dirs": [ + "app", + "public" + ], + "prod_domains": [], + "live": [], + "deep": { + "tracked_files": 6117, + "test_files": 1960, + "e2e_files": 0, + "has_playwright": false, + "has_cypress": false, + "api_contracts": [], + "migrations": 836, + "health_refs": 106, + "uses_siax_ui": false, + "has_a11y_tooling": false, + "has_design_conformance": false, + "ui_state_files": [ + "app/(auth)/loading.tsx", + "app/(dashboard)/articles/[id]/loading.tsx", + "app/(dashboard)/articles/loading.tsx", + "app/(dashboard)/bookkeeping/[id]/loading.tsx", + "app/(dashboard)/bookkeeping/loading.tsx", + "app/(dashboard)/customers/[id]/loading.tsx", + "app/(dashboard)/customers/loading.tsx", + "app/(dashboard)/deadlines/loading.tsx", + "app/(dashboard)/e/[sector]/[slug]/loading.tsx", + "app/(dashboard)/error.tsx" + ], + "todo_count": 20, + "has_runbook_docs": false, + "has_architecture_docs": false, + "has_status_docs": false + }, + "backlog": [ + { + "priority": "P1", + "task": "API-kontrakt", + "next_step": "Publicera versionerat OpenAPI-kontrakt i repots kontraktskatalog och drift-checka det." + }, + { + "priority": "P1", + "task": "Backup", + "next_step": "Definiera frekvens, retention, mål och kryptering i `siax.backup`." + }, + { + "priority": "P1", + "task": "E2E i webbläsare", + "next_step": "Lägg Playwright-flöde för inloggning och kärnflöde mot riktig miljö." + }, + { + "priority": "P1", + "task": "Restore-bevis", + "next_step": "Genomför en verklig återställning och registrera resultat i `siax.restore-evidence`." + }, + { + "priority": "P1", + "task": "Tillgänglighetsgrind", + "next_step": "Aktivera eslint-plugin-jsx-a11y/axe och en blockerande WCAG 2.2-kontroll." + }, + { + "priority": "P2", + "task": "Arkitektur", + "next_step": "Beskriv produktgräns, canonical owner, beroenden och dataflöde i `docs/architecture.md`." + }, + { + "priority": "P2", + "task": "DES1GN-beroende", + "next_step": "Använd `@siax/ui` + `@siax/tokens` i stället för lokala kopior av primitiver." + }, + { + "priority": "P2", + "task": "Designkonformitet", + "next_step": "Kör `siax-doctor design --repo . --fail-on=block` och checka in `siax/design-conformance.json`." + }, + { + "priority": "P2", + "task": "Runbook", + "next_step": "Dokumentera deploy, rollback, backup/restore och incidentflöde i `docs/runbook/`." + }, + { + "priority": "P2", + "task": "Statusdokument", + "next_step": "Lägg `docs/STATUS.md` med nivå, bevis, kända gap och nästa steg." + }, + { + "priority": "P2", + "task": "Teknisk skuld", + "next_step": "Prioritera bland 20 TODO/FIXME-markeringar; stäng eller gör dem spårbara som issues." + } + ], + "standard": "SIAX Master Definition of Done" +} \ No newline at end of file