docs(production): standardiserad produktionsberedskap och gap-analys #24
@@ -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://<prod-host>/health && curl -fsS https://<prod-host>/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`._
|
||||
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user