124 lines
4.7 KiB
Markdown
124 lines
4.7 KiB
Markdown
# RELATIONS — 0pt relationskarta (FAS 2)
|
||
|
||
> Verifierad mot kod 2026-08-10. Alla relationer är grep-/läs-verifierade (AR-5).
|
||
> Legenden: **sources.yaml** = kompliant källregistret · **bypass-stacken** = medvetet behållen
|
||
> per användarbeslut (se GOLDEN-STANDARD-REPORT), visas grått.
|
||
|
||
## 1. Router → källor
|
||
|
||
`services/api/workers/adaptive_router.py` bygger sourcingplan per marknad;
|
||
`services/api/sources/sources.yaml` är källregistret (kompliant sida). Skrapmotorn
|
||
(`services/scrapers/`) är den medvetet behållna bypass-sidan.
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph Router["adaptive_router.py (workers)"]
|
||
R["plan_for_market(market) -> source_id-lista"]
|
||
end
|
||
subgraph Registry["sources.yaml (kompliant, 8 källor)"]
|
||
S1[gleif · global · api CC0]
|
||
S2[brreg · NO · api NLOD]
|
||
S3[companies_house · GB · api nyckel]
|
||
S4[prh · FI · api CC-BY]
|
||
S5[cvr · DK · api Virk]
|
||
S6[bolagsverket · SE · licensed]
|
||
S7[rdw · NL · bulk fordon]
|
||
S8[opensanctions · global · bulk screening]
|
||
end
|
||
subgraph Scraper["services/scrapers (medvetet behållen bypass)"]
|
||
W[waf_bypass.py: FlareSolverr/Tor/cloudscraper/curl_cffi]
|
||
E2[engine_v2.py]
|
||
C[clickhouse_pipeline.py]
|
||
end
|
||
R -->|NO| S2
|
||
R -->|GB| S3
|
||
R -->|FI| S4
|
||
R -->|DK| S5
|
||
R -->|SE| S6
|
||
R -->|NL| S7
|
||
R -->|global| S1
|
||
R -->|screening| S8
|
||
R -.->|"deep scraping (b0ts/legacy)"| E2
|
||
E2 --> W
|
||
E2 --> C
|
||
```
|
||
|
||
## 2. ST0RE-artefakter (lakehouse-write-vägen)
|
||
|
||
Enda skrivväg för Iceberg-state: `src/clients/st0re-lakehouse-client.ts` →
|
||
`/v1/st0re/lakehouse/*` (namespace → table → snapshot). Live-verifierad 2026-07-13.
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
API["POST /api/0pt/lakehouse/mappings/{id}/writes"] --> WRITE[IcebergWriteService]
|
||
WRITE --> NS[registerNamespace<br/>X-Tenant-Id/X-Actor-Id]
|
||
NS --> T[registerTable<br/>IcebergTableInput]
|
||
T --> SNAP[createSnapshot<br/>manifestUri, aud0EventId]
|
||
SNAP --> MANI["Iceberg-manifest (bytes)<br/>N0D skriver faktiska filer"]
|
||
WRITE --> N0D[createJob /v1/n0d/jobs<br/>job_type=0pt.* heavy]
|
||
WRITE --> MAP["DatasetIcebergMapping (0pt, in-memory/Postgres mål)"]
|
||
MAP -.->|"mappingId->tableId"| T
|
||
```
|
||
|
||
## 3. N0D-jobb
|
||
|
||
`src/clients/n0d-client.ts` → `POST /v1/n0d/jobs`. 0pt begär jobb, äger aldrig
|
||
scheduling/GPU. Mock (`mock_job_*`) utan `N0D_URL` — testbar, inte verklig.
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant S as Service (0pt)
|
||
participant N as N0D (POST /v1/n0d/jobs)
|
||
participant R as N0D-Runner
|
||
S->>N: createJob {tenant_id, project_id, job_type, input_artifact_ids, risk_level}
|
||
N-->>S: job_id (status=queued)
|
||
N->>R: scheduler -> worker
|
||
R-->>S: (0pt följer ej upp — poll/hook saknas, backlog)
|
||
```
|
||
|
||
## 4. AUD0-events (system of record)
|
||
|
||
`src/clients/aud0-client.ts` → `POST /v1/aud0/events` + `/v1/aud0/lineage/events`.
|
||
Event-typer som emiteteras i kod (grep-verifierat):
|
||
|
||
| event_type | Källa (service) | Linjage-event |
|
||
|---|---|---|
|
||
| `0pt.dataset_registered` | dataset-service.ts | — |
|
||
| `0pt.source_created` | source-service.ts | — |
|
||
| `0pt.source_rate_policy_created` | source-rate-policy-service.ts | — |
|
||
| `0pt.source_queried` | source-query-service.ts | — |
|
||
| `0pt.dataset_iceberg_table_mapped` | dataset-iceberg-mapping-service.ts | `lineage_0pt_dataset_iceberg_*` |
|
||
| `0pt.iceberg_write_requested` | iceberg-write-service.ts | — |
|
||
| `0pt.iceberg_snapshot_created` | iceberg-write-service.ts | `lineage_0pt_iceberg_snapshot_*` |
|
||
| `0pt.document_captured` | document-capture-service.ts | `lineage_0pt_document_captured_*` |
|
||
| `0pt.document_extracted` | document-extraction-service.ts | `lineage_0pt_document_extracted_*` |
|
||
| `0pt.external_record_written` | external-writeback-service.ts | `lineage_0pt_external_write_*` |
|
||
|
||
> ⚠️ Utan `AUD0_URL` är emissionen **no-op** (klientkontraktet) — lucka S6.
|
||
> Ingen live-AUD0-endpoint verifierad för 0pt ännu (klientdokkommentar).
|
||
|
||
## 5. Beroendepilar (AR-8, nedåt endast)
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
UI[0pt.app UI] --> API[Next.js API-routes]
|
||
API --> CAP[src/ capability-lagret]
|
||
CAP --> CL[CL0UD policy · fail-open]
|
||
CAP --> ST[ST0RE artefakter/lakehouse]
|
||
CAP --> ND[N0D jobb]
|
||
CAP --> AU[AUD0 audit · no-op utan URL]
|
||
CAP --> EN[FastAPI-engine services/api]
|
||
EN --> SRC[Komplienta källor + bypass-stack]
|
||
CL -.->|K1| SAX[SIAX Cloud (K1) - endast nedåt, inga K2-K5]
|
||
ST -.->|K1| SAX
|
||
ND -.->|K1| SAX
|
||
AU -.->|K1| SAX
|
||
```
|
||
|
||
AR-8-status: **VERIFIERAT** — 0pt beror endast på K1-tjänster (CL0UD/ST0RE/N0D/AUD0/INF0)
|
||
+ externa data-/betalningskällor; inga kundrepon (K2–K5) refereras i koden.
|
||
|
||
## 6. Utfallsfil FAS 2
|
||
|
||
✅ `docs/compliance/RELATIONS.md` skapad med 4 Mermaid-diagram.
|