Continues P010 (branch renamed from feat/p010-source-registry-persistence):
closes the three remaining BEFORE_STATE.md gaps (§2 TS/Python split-brain,
§3 missing provenance fields, §4 untested failure modes), all additive to
the production pipeline — the Python QA filter's delivery decision is
unchanged by any of this.
TS/Python bridge (§2):
- New route surface app/api/0pt/quality/* (rules/runs/issues CRUD +
POST /api/0pt/quality/bridge-run) over the shared QualityService
singleton (src/services/quality.ts), fixing the same "no shared
instance" defect the Source Registry had.
- src/quality/quality-bridge.ts auto-provisions a deterministic,
tenant-scoped baseline rule set on first use so the Python engine never
pre-registers rules through the CRUD surface.
- services/api/workers/quality_bridge.py: the Python-side HTTP client.
Feature-flagged off by default (OPT_QUALITY_BRIDGE_ENABLED), fails open
on any error (never raises into run_job, never changes `delivered`).
Advisory only — real per-row gating against the TS engine isn't
implementable yet (ExpectationEngine returns dataset-level pass/fail
counts + samples, not a per-row boolean array); documented, not faked.
- Live-verified end-to-end: `next dev` (AUTH_ENFORCE=false) + the real
Python pipeline hitting the real brreg.no API, round-tripping through
the real bridge route, receiving a real QualityService score.
Provenance (§3): sources/connectors.py's Provenance dataclass gains
retrieved_at, transform, connector_version, producer, quality,
entity_resolution, artifact_ref (all previously absent from the real
dataflow entirely) via a make_provenance() factory used by every connector.
resolve.py stamps entity_resolution on merged records' provenance (never on
unmerged ones). pipeline.py stamps artifact_ref at delivery and quality
once the bridge succeeds.
Failure tests (§4), real fault injection against real code (services/api,
new pytest + respx suite, not vitest mocks):
- dedup-determinism + duplicate-input + out-of-order: resolve.py under
shuffled/interleaved/exhaustive-permutation input, plus an explicit,
verified test of the one case that IS legitimately order-sensitive
(non-transitive similarity in a greedy clusterer) instead of hiding it.
- schema-evolution: respx-mocked upstream responses with added/removed/
alien-shaped fields through the real brreg connector + pipeline.
- restart: connector exceptions mid-job (including one from respx itself)
never crash run_job.
- backfill: the real property that holds given no persistence layer
exists (replay is compute-idempotent) — NOT a fabricated dedup-store
test.
- CDC-interruption and true backfill/delivery-store idempotency:
explicitly documented as not implementable against this codebase
(no CDC pipeline, no delivery store exist anywhere) via skip markers
with reasons, in tests/test_known_gaps.py, rather than silently
dropped or faked.
Testing: 256/256 vitest (249 pre-existing + 7 new bridge route/service
tests) and 28/28 pytest (2 documented skips) green locally. tsc -p
tsconfig.check.json has zero new errors (14 pre-existing errors, all in
the untracked/unaudited src/fleet, src/graph, src/metrics, src/projections
paths this pass does not touch, per BEFORE_STATE.md).
No PR opened, per instructions.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
0pt — your data
Data services on demand for the Nordics + Europe. Compose a data job, pay 50 % to start, watch production live, validate with full provenance, deliver anywhere. Owned by SIAX Technology AB. Honest accuracy is the moat: every field carries source, freshness and confidence; nothing is guessed.
Live: https://0pt.app · Contract: CLAUDE.md + docs/
Architecture (verified against code, not aspirational):
docs/architecture/ARCHITECTURE.md. It documents the real API surface, the real persistence story, and the known security gaps — including several places where this README is optimistic. Read it before trusting any capability claim below. Repo identity + estate classification:siax.repo.json+siax.config.json. Compliance state:docs/compliance/(INVENTORY, RELATIONS, OSS-INVENTORY, GOLDEN-STANDARD-REPORT, BACKLOG, SLUTRAPPORT).
Two planes (see docs/02-architecture.md)
- Edge (Vercel, this app) — marketing, catalog, the order lifecycle, customer portal,
admin portal, and the API route handlers. Defers to the data engine when
ENGINE_URLis set. - Engine (
services/api, runs on a VPS) — FastAPI orchestrator + worker pipeline doing the compliant sourcing (official API → bulk → authorized web → licensed → else level 0). Never on Vercel (long jobs). Bypass/stealth/proxy-rotation/fake-account paths are excluded by design (CLAUDE.md §1).
Routes
| Area | Routes |
|---|---|
| Marketing | / (hero, filosofi, katalog, motorn, visualiseringar, täckning, editorial, bevis, priser, footer) |
| Catalog | /katalog, /katalog/[id] |
| Sourcing map | /kallor |
| Order lifecycle | /bestall → /bestall/forskott → /order/[id] → /order/[id]/validera |
| Customer portal | /portal, /portal/subscriptions, /portal/files, /portal/integrationer, /portal/settings |
| Admin portal | /admin, /admin/sources, /admin/jobs, /admin/customers |
| API | /api/{health,estimates,catalog,sources,orders,orders/[id],subscriptions,admin/metrics,uploads,auth/*,payments/*,webhooks/stripe,connections/db-grant} |
Design system
Mono/editorial, light, radius 0, Inter + JetBrains Mono, single red #e40014, animated grain,
scroll-reveal motion. No photography — imagery is rendered data (DataArtifact). Every fact
shows a provenance square (ProvenanceBadge). Full spec: docs/05-design-system.md.
Run locally
pnpm install
pnpm dev # Next.js on http://localhost:3000
# data engine (separate, optional)
cd services/api && pip install -r requirements.txt && uvicorn orchestrator.main:app --reload
Deploy
- Config target (as of 2026-08-09):
siax.config.jsondeclaresdeploy.target: "coolify", matching every other SIAX Cloud OS repo (n0d, st0re, aud0, ...) — a Dockerfile "for Coolify" (already committed, seeDockerfile) plus.gitea/workflows/cd.yml(renamed fromdeploy.yml2026-08-10) that POSTs a restart to a Coolify app UUID onCOOLIFY_TOKENpush. - Actually live right now: the only running instance of
0pt.appis still on Vercel (project0pt, scope Simon Axelsson's projects) — no Coolify app has been provisioned for this repo yet, sodeploy.yml's app UUID is a placeholder that fails the job on purpose until someone fills it in. Flipping the config declares intent; it does not move traffic. Seedocs/architecture/ARCHITECTURE.md§5/§8 for the full "Vercel or fleet" state and what's still open (Coolify app provisioning + DNS cutover — a separate decision from this config change, since the live Vercel deployment is not being touched). - Engine + DB + embeds → one VPS via
infra/docker-compose.yml(Postgres+pgvector, Redis, api, worker, NocoDB, Metabase, Caddy). - Env inventory:
.env.example. - Auth on
/api/0pt/*is fail-closed: withAUTH_ENFORCEunset the middleware REQUIRES a verified Zitadel Bearer token (401 without one). Only the literalAUTH_ENFORCE=falsedisables it, and that is refused whenNODE_ENV=production(the process throws at startup rather than serving anonymously). Caveat (live-verified 2026-08-10): the deployed instance still answersGET /api/0ptwith 200 anonymously — the middleware appears not to run in production (gap S1, root cause unknown). Do not rely on this being enforced until an anonymous request gets a real 401. - Fonts: self-hosted via
@fontsource-variable/inter+@fontsource-variable/jetbrains-mono(no Google Fonts /next/font/google). - API contract (SSOT):
contracts/openapi.yaml.
Status
Frontend, full order lifecycle, customer + admin portals, edge API, payment/auth/embed infrastructure, the compliant data engine, schema and infra are all in place and building green. Integrations are env-guarded and activate when their keys/DB are provided:
- Database — Vercel → Storage → Postgres (sets
POSTGRES_URL) → durable persistence (schema insql/001_init.sql). - Stripe + Resend keys → payments + email.
- VPS for the engine → set
ENGINE_URL. AUTH_SECRET+DEV_LOGIN_KEY→ login (full OAuth via Auth.js lands with the DB).
© 2026 SIAX Technology AB. Not affiliated with Protosell.