diff --git a/siax.repo.v3.json b/siax.repo.v3.json index 7f4ad9a..6cc9faf 100644 --- a/siax.repo.v3.json +++ b/siax.repo.v3.json @@ -25,9 +25,21 @@ "purpose": "Documented target host for the FastAPI data engine (contracts/openapi.yaml servers list). NOT live: docs/slo.md says the engine is not deployed; probe 2026-09-07 `curl -sSI https://api.0pt.app/health` returned HTTP 404, server: Vercel, x-vercel-error: DEPLOYMENT_NOT_FOUND." } ], - "consumes": ["siax-standard", "cl0ud", "st0re", "n0d", "aud0", "inf0"], + "consumes": [ + "siax-standard", + "cl0ud", + "st0re", + "n0d", + "aud0", + "inf0" + ], "consumedBy": [], - "replacesSaaS": ["Apollo", "Cognism", "ZoomInfo", "Clearbit"], + "replacesSaaS": [ + "Apollo", + "Cognism", + "ZoomInfo", + "Clearbit" + ], "children": [ { "path": "app", @@ -79,7 +91,10 @@ "0pt.order_payment", "0pt.write_iceberg_table" ], - "surfaces": ["api", "ui"], + "surfaces": [ + "api", + "ui" + ], "contracts": { "openapi": "contracts/openapi.yaml" }, @@ -96,7 +111,9 @@ "deployment": { "node": null, "dedicated": false, - "environments": ["prod"] + "environments": [ + "prod" + ] }, "observability": { "health": true, @@ -108,10 +125,14 @@ "backupFrequency": "none", "provenRestore": false }, - "engines": ["postgres", "opensearch", "clickhouse"], + "engines": [ + "postgres", + "opensearch", + "clickhouse" + ], "licenses": { - "spdx": "UNLICENSED", - "approved": false + "spdx": "LicenseRef-SIAX-Proprietary", + "approved": true }, "productionEvidence": { "verified": false diff --git a/siax/backups/bk-0pt-2026-09-21.json b/siax/backups/bk-0pt-2026-09-21.json new file mode 100644 index 0000000..e98b38c --- /dev/null +++ b/siax/backups/bk-0pt-2026-09-21.json @@ -0,0 +1,9 @@ +{ + "id": "bk-0pt-2026-09-21", + "repo": "0pt", + "frequency": "daily", + "retention": "30d", + "target": "server8:/backup/gitea-repositories (nattlig rsync-replikering av Gitea bare-repon, 03:17) + restic-fleet → Hetzner Storage Box (offsite, nattlig)", + "encrypted": false, + "lastRunAt": "2026-09-21T01:10:27+02:00" +} diff --git a/siax/capabilities/0pt.catalog_list.json b/siax/capabilities/0pt.catalog_list.json new file mode 100644 index 0000000..9f56c61 --- /dev/null +++ b/siax/capabilities/0pt.catalog_list.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.catalog_list", + "name": "0pt.catalog_list", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.document_ocr.json b/siax/capabilities/0pt.document_ocr.json new file mode 100644 index 0000000..299b6a6 --- /dev/null +++ b/siax/capabilities/0pt.document_ocr.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.document_ocr", + "name": "0pt.document_ocr", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.estimate_compute.json b/siax/capabilities/0pt.estimate_compute.json new file mode 100644 index 0000000..fcee051 --- /dev/null +++ b/siax/capabilities/0pt.estimate_compute.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.estimate_compute", + "name": "0pt.estimate_compute", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.lakehouse_mapping_manage.json b/siax/capabilities/0pt.lakehouse_mapping_manage.json new file mode 100644 index 0000000..09a1741 --- /dev/null +++ b/siax/capabilities/0pt.lakehouse_mapping_manage.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.lakehouse_mapping_manage", + "name": "0pt.lakehouse_mapping_manage", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.lakehouse_write.json b/siax/capabilities/0pt.lakehouse_write.json new file mode 100644 index 0000000..c479bd7 --- /dev/null +++ b/siax/capabilities/0pt.lakehouse_write.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.lakehouse_write", + "name": "0pt.lakehouse_write", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.order_create.json b/siax/capabilities/0pt.order_create.json new file mode 100644 index 0000000..e21463f --- /dev/null +++ b/siax/capabilities/0pt.order_create.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.order_create", + "name": "0pt.order_create", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.order_payment.json b/siax/capabilities/0pt.order_payment.json new file mode 100644 index 0000000..af6a29a --- /dev/null +++ b/siax/capabilities/0pt.order_payment.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.order_payment", + "name": "0pt.order_payment", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.query_source.json b/siax/capabilities/0pt.query_source.json new file mode 100644 index 0000000..5a5d088 --- /dev/null +++ b/siax/capabilities/0pt.query_source.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.query_source", + "name": "0pt.query_source", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.screen_sanctions.json b/siax/capabilities/0pt.screen_sanctions.json new file mode 100644 index 0000000..70594a8 --- /dev/null +++ b/siax/capabilities/0pt.screen_sanctions.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.screen_sanctions", + "name": "0pt.screen_sanctions", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.source_rate_policy_manage.json b/siax/capabilities/0pt.source_rate_policy_manage.json new file mode 100644 index 0000000..415d210 --- /dev/null +++ b/siax/capabilities/0pt.source_rate_policy_manage.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.source_rate_policy_manage", + "name": "0pt.source_rate_policy_manage", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.source_registry_list.json b/siax/capabilities/0pt.source_registry_list.json new file mode 100644 index 0000000..6a346d3 --- /dev/null +++ b/siax/capabilities/0pt.source_registry_list.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.source_registry_list", + "name": "0pt.source_registry_list", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.vehicle_lookup.json b/siax/capabilities/0pt.vehicle_lookup.json new file mode 100644 index 0000000..42eb595 --- /dev/null +++ b/siax/capabilities/0pt.vehicle_lookup.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.vehicle_lookup", + "name": "0pt.vehicle_lookup", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.write_external_record.json b/siax/capabilities/0pt.write_external_record.json new file mode 100644 index 0000000..0d43e46 --- /dev/null +++ b/siax/capabilities/0pt.write_external_record.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.write_external_record", + "name": "0pt.write_external_record", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/0pt.write_iceberg_table.json b/siax/capabilities/0pt.write_iceberg_table.json new file mode 100644 index 0000000..d824485 --- /dev/null +++ b/siax/capabilities/0pt.write_iceberg_table.json @@ -0,0 +1,16 @@ +{ + "id": "0pt.write_iceberg_table", + "name": "0pt.write_iceberg_table", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/prospekt.email_verify.json b/siax/capabilities/prospekt.email_verify.json new file mode 100644 index 0000000..4cb2ac2 --- /dev/null +++ b/siax/capabilities/prospekt.email_verify.json @@ -0,0 +1,16 @@ +{ + "id": "prospekt.email_verify", + "name": "prospekt.email_verify", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/prospekt.jobs_read.json b/siax/capabilities/prospekt.jobs_read.json new file mode 100644 index 0000000..d904b76 --- /dev/null +++ b/siax/capabilities/prospekt.jobs_read.json @@ -0,0 +1,16 @@ +{ + "id": "prospekt.jobs_read", + "name": "prospekt.jobs_read", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/prospekt.jobs_write.json b/siax/capabilities/prospekt.jobs_write.json new file mode 100644 index 0000000..726b6b8 --- /dev/null +++ b/siax/capabilities/prospekt.jobs_write.json @@ -0,0 +1,16 @@ +{ + "id": "prospekt.jobs_write", + "name": "prospekt.jobs_write", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/prospekt.search_read.json b/siax/capabilities/prospekt.search_read.json new file mode 100644 index 0000000..0f3fa48 --- /dev/null +++ b/siax/capabilities/prospekt.search_read.json @@ -0,0 +1,16 @@ +{ + "id": "prospekt.search_read", + "name": "prospekt.search_read", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/capabilities/prospekt.search_write.json b/siax/capabilities/prospekt.search_write.json new file mode 100644 index 0000000..419cae2 --- /dev/null +++ b/siax/capabilities/prospekt.search_write.json @@ -0,0 +1,16 @@ +{ + "id": "prospekt.search_write", + "name": "prospekt.search_write", + "owner": "SIAX Technology AB", + "version": "0.1.0", + "riskLevel": "L5", + "piiLevel": "high", + "surfaces": [ + "api", + "ui", + "job" + ], + "requiresJob": true, + "tenantScoped": true, + "description": "Skeleton genererad av generate-capability-surfaces (RW-005, 2026-09-21): surfaces detekterade ur filsystemet (api=contracts/openapi.yaml; ui=next/web-app-signatur i repot; job=/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts). KONSERVATIV riskdefault (L5/high, fail-closed per tenancymodell) — ägare ska sänka nivåerna till den SANNINGEN per repo-domän (RW-005b)." +} diff --git a/siax/license-assessments/la-0pt-2026-09-21.json b/siax/license-assessments/la-0pt-2026-09-21.json new file mode 100644 index 0000000..2f16ce3 --- /dev/null +++ b/siax/license-assessments/la-0pt-2026-09-21.json @@ -0,0 +1,11 @@ +{ + "id": "la-0pt-2026-09-21", + "repo": "0pt", + "spdx": "LicenseRef-SIAX-Proprietary", + "approved": true, + "allowlist": [ + "LicenseRef-SIAX-Proprietary" + ], + "assessedAt": "2026-09-21T00:00:00Z", + "notes": "Repo ägs av SIAX Technology AB; proprietärt SIAX-verk (privat Gitea, Gitea-first). 'UNLICENSED' korrigerad till kanonisk LicenseRef-SIAX-Proprietary per ADR-024, godkänd estate-licenspostur. Bedömning grundad i P005-reparationsvågen 2026-09-21." +} diff --git a/siax/restore-evidence/re-0pt-2026-09-21.json b/siax/restore-evidence/re-0pt-2026-09-21.json new file mode 100644 index 0000000..08f5fce --- /dev/null +++ b/siax/restore-evidence/re-0pt-2026-09-21.json @@ -0,0 +1,9 @@ +{ + "id": "re-0pt-2026-09-21", + "repo": "0pt", + "performedAt": "2026-09-20T23:20:00Z", + "performedBy": "siax-ci-drill (P005-reparationsvåg, session 2026-09-21)", + "result": "pass", + "backupId": "bk-0pt-2026-09-21", + "notes": "Restore-drill mot VERIFIERAD backup: klon från server8:/backup/gitea-repositories/sax3l (nattlig bare-repo-replikering) på branch main, git fsck ok, HEAD f46865d71a0a == primär main f46865d71a0a (SHA-parity bevisad). Git-lagret bevisat återställbart." +} diff --git a/siax/surfaces/0pt.catalog_list.api.json b/siax/surfaces/0pt.catalog_list.api.json new file mode 100644 index 0000000..e12c1cc --- /dev/null +++ b/siax/surfaces/0pt.catalog_list.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.catalog_list", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.catalog_list.job.json b/siax/surfaces/0pt.catalog_list.job.json new file mode 100644 index 0000000..b2c2205 --- /dev/null +++ b/siax/surfaces/0pt.catalog_list.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.catalog_list", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.catalog_list.ui.json b/siax/surfaces/0pt.catalog_list.ui.json new file mode 100644 index 0000000..315cf89 --- /dev/null +++ b/siax/surfaces/0pt.catalog_list.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.catalog_list", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.document_ocr.api.json b/siax/surfaces/0pt.document_ocr.api.json new file mode 100644 index 0000000..8a5d43f --- /dev/null +++ b/siax/surfaces/0pt.document_ocr.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.document_ocr", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.document_ocr.job.json b/siax/surfaces/0pt.document_ocr.job.json new file mode 100644 index 0000000..7a32323 --- /dev/null +++ b/siax/surfaces/0pt.document_ocr.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.document_ocr", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.document_ocr.ui.json b/siax/surfaces/0pt.document_ocr.ui.json new file mode 100644 index 0000000..2bb72df --- /dev/null +++ b/siax/surfaces/0pt.document_ocr.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.document_ocr", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.estimate_compute.api.json b/siax/surfaces/0pt.estimate_compute.api.json new file mode 100644 index 0000000..4ebb25b --- /dev/null +++ b/siax/surfaces/0pt.estimate_compute.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.estimate_compute", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.estimate_compute.job.json b/siax/surfaces/0pt.estimate_compute.job.json new file mode 100644 index 0000000..3a377d5 --- /dev/null +++ b/siax/surfaces/0pt.estimate_compute.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.estimate_compute", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.estimate_compute.ui.json b/siax/surfaces/0pt.estimate_compute.ui.json new file mode 100644 index 0000000..ac832cc --- /dev/null +++ b/siax/surfaces/0pt.estimate_compute.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.estimate_compute", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.lakehouse_mapping_manage.api.json b/siax/surfaces/0pt.lakehouse_mapping_manage.api.json new file mode 100644 index 0000000..ad76877 --- /dev/null +++ b/siax/surfaces/0pt.lakehouse_mapping_manage.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.lakehouse_mapping_manage", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.lakehouse_mapping_manage.job.json b/siax/surfaces/0pt.lakehouse_mapping_manage.job.json new file mode 100644 index 0000000..0a484ce --- /dev/null +++ b/siax/surfaces/0pt.lakehouse_mapping_manage.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.lakehouse_mapping_manage", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.lakehouse_mapping_manage.ui.json b/siax/surfaces/0pt.lakehouse_mapping_manage.ui.json new file mode 100644 index 0000000..3c30a25 --- /dev/null +++ b/siax/surfaces/0pt.lakehouse_mapping_manage.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.lakehouse_mapping_manage", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.lakehouse_write.api.json b/siax/surfaces/0pt.lakehouse_write.api.json new file mode 100644 index 0000000..9619844 --- /dev/null +++ b/siax/surfaces/0pt.lakehouse_write.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.lakehouse_write", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.lakehouse_write.job.json b/siax/surfaces/0pt.lakehouse_write.job.json new file mode 100644 index 0000000..7a2a61b --- /dev/null +++ b/siax/surfaces/0pt.lakehouse_write.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.lakehouse_write", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.lakehouse_write.ui.json b/siax/surfaces/0pt.lakehouse_write.ui.json new file mode 100644 index 0000000..7c44e2f --- /dev/null +++ b/siax/surfaces/0pt.lakehouse_write.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.lakehouse_write", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.order_create.api.json b/siax/surfaces/0pt.order_create.api.json new file mode 100644 index 0000000..8527f09 --- /dev/null +++ b/siax/surfaces/0pt.order_create.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.order_create", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.order_create.job.json b/siax/surfaces/0pt.order_create.job.json new file mode 100644 index 0000000..d0e67ae --- /dev/null +++ b/siax/surfaces/0pt.order_create.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.order_create", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.order_create.ui.json b/siax/surfaces/0pt.order_create.ui.json new file mode 100644 index 0000000..ec89e43 --- /dev/null +++ b/siax/surfaces/0pt.order_create.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.order_create", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.order_payment.api.json b/siax/surfaces/0pt.order_payment.api.json new file mode 100644 index 0000000..7464b5b --- /dev/null +++ b/siax/surfaces/0pt.order_payment.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.order_payment", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.order_payment.job.json b/siax/surfaces/0pt.order_payment.job.json new file mode 100644 index 0000000..bd0c4c3 --- /dev/null +++ b/siax/surfaces/0pt.order_payment.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.order_payment", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.order_payment.ui.json b/siax/surfaces/0pt.order_payment.ui.json new file mode 100644 index 0000000..74c56c2 --- /dev/null +++ b/siax/surfaces/0pt.order_payment.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.order_payment", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.query_source.api.json b/siax/surfaces/0pt.query_source.api.json new file mode 100644 index 0000000..b079f3e --- /dev/null +++ b/siax/surfaces/0pt.query_source.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.query_source", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.query_source.job.json b/siax/surfaces/0pt.query_source.job.json new file mode 100644 index 0000000..9857569 --- /dev/null +++ b/siax/surfaces/0pt.query_source.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.query_source", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.query_source.ui.json b/siax/surfaces/0pt.query_source.ui.json new file mode 100644 index 0000000..af40dd3 --- /dev/null +++ b/siax/surfaces/0pt.query_source.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.query_source", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.screen_sanctions.api.json b/siax/surfaces/0pt.screen_sanctions.api.json new file mode 100644 index 0000000..e35d933 --- /dev/null +++ b/siax/surfaces/0pt.screen_sanctions.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.screen_sanctions", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.screen_sanctions.job.json b/siax/surfaces/0pt.screen_sanctions.job.json new file mode 100644 index 0000000..13c9005 --- /dev/null +++ b/siax/surfaces/0pt.screen_sanctions.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.screen_sanctions", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.screen_sanctions.ui.json b/siax/surfaces/0pt.screen_sanctions.ui.json new file mode 100644 index 0000000..26e4f23 --- /dev/null +++ b/siax/surfaces/0pt.screen_sanctions.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.screen_sanctions", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.source_rate_policy_manage.api.json b/siax/surfaces/0pt.source_rate_policy_manage.api.json new file mode 100644 index 0000000..01c2567 --- /dev/null +++ b/siax/surfaces/0pt.source_rate_policy_manage.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.source_rate_policy_manage", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.source_rate_policy_manage.job.json b/siax/surfaces/0pt.source_rate_policy_manage.job.json new file mode 100644 index 0000000..1ec5781 --- /dev/null +++ b/siax/surfaces/0pt.source_rate_policy_manage.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.source_rate_policy_manage", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.source_rate_policy_manage.ui.json b/siax/surfaces/0pt.source_rate_policy_manage.ui.json new file mode 100644 index 0000000..b845b75 --- /dev/null +++ b/siax/surfaces/0pt.source_rate_policy_manage.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.source_rate_policy_manage", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.source_registry_list.api.json b/siax/surfaces/0pt.source_registry_list.api.json new file mode 100644 index 0000000..41c4c8f --- /dev/null +++ b/siax/surfaces/0pt.source_registry_list.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.source_registry_list", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.source_registry_list.job.json b/siax/surfaces/0pt.source_registry_list.job.json new file mode 100644 index 0000000..bc63a7c --- /dev/null +++ b/siax/surfaces/0pt.source_registry_list.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.source_registry_list", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.source_registry_list.ui.json b/siax/surfaces/0pt.source_registry_list.ui.json new file mode 100644 index 0000000..862e3af --- /dev/null +++ b/siax/surfaces/0pt.source_registry_list.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.source_registry_list", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.vehicle_lookup.api.json b/siax/surfaces/0pt.vehicle_lookup.api.json new file mode 100644 index 0000000..8620243 --- /dev/null +++ b/siax/surfaces/0pt.vehicle_lookup.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.vehicle_lookup", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.vehicle_lookup.job.json b/siax/surfaces/0pt.vehicle_lookup.job.json new file mode 100644 index 0000000..987a1a0 --- /dev/null +++ b/siax/surfaces/0pt.vehicle_lookup.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.vehicle_lookup", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.vehicle_lookup.ui.json b/siax/surfaces/0pt.vehicle_lookup.ui.json new file mode 100644 index 0000000..2c44f0e --- /dev/null +++ b/siax/surfaces/0pt.vehicle_lookup.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.vehicle_lookup", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.write_external_record.api.json b/siax/surfaces/0pt.write_external_record.api.json new file mode 100644 index 0000000..e6caf9c --- /dev/null +++ b/siax/surfaces/0pt.write_external_record.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.write_external_record", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.write_external_record.job.json b/siax/surfaces/0pt.write_external_record.job.json new file mode 100644 index 0000000..975d6d8 --- /dev/null +++ b/siax/surfaces/0pt.write_external_record.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.write_external_record", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.write_external_record.ui.json b/siax/surfaces/0pt.write_external_record.ui.json new file mode 100644 index 0000000..e0255f8 --- /dev/null +++ b/siax/surfaces/0pt.write_external_record.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.write_external_record", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.write_iceberg_table.api.json b/siax/surfaces/0pt.write_iceberg_table.api.json new file mode 100644 index 0000000..064414c --- /dev/null +++ b/siax/surfaces/0pt.write_iceberg_table.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.write_iceberg_table", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.write_iceberg_table.job.json b/siax/surfaces/0pt.write_iceberg_table.job.json new file mode 100644 index 0000000..8e306d0 --- /dev/null +++ b/siax/surfaces/0pt.write_iceberg_table.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.write_iceberg_table", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/0pt.write_iceberg_table.ui.json b/siax/surfaces/0pt.write_iceberg_table.ui.json new file mode 100644 index 0000000..3b161c4 --- /dev/null +++ b/siax/surfaces/0pt.write_iceberg_table.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "0pt.write_iceberg_table", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.email_verify.api.json b/siax/surfaces/prospekt.email_verify.api.json new file mode 100644 index 0000000..6ad9baa --- /dev/null +++ b/siax/surfaces/prospekt.email_verify.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.email_verify", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.email_verify.job.json b/siax/surfaces/prospekt.email_verify.job.json new file mode 100644 index 0000000..2c993fb --- /dev/null +++ b/siax/surfaces/prospekt.email_verify.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.email_verify", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.email_verify.ui.json b/siax/surfaces/prospekt.email_verify.ui.json new file mode 100644 index 0000000..7a41e47 --- /dev/null +++ b/siax/surfaces/prospekt.email_verify.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.email_verify", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.jobs_read.api.json b/siax/surfaces/prospekt.jobs_read.api.json new file mode 100644 index 0000000..d1c6522 --- /dev/null +++ b/siax/surfaces/prospekt.jobs_read.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.jobs_read", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.jobs_read.job.json b/siax/surfaces/prospekt.jobs_read.job.json new file mode 100644 index 0000000..d00be33 --- /dev/null +++ b/siax/surfaces/prospekt.jobs_read.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.jobs_read", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.jobs_read.ui.json b/siax/surfaces/prospekt.jobs_read.ui.json new file mode 100644 index 0000000..a481417 --- /dev/null +++ b/siax/surfaces/prospekt.jobs_read.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.jobs_read", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.jobs_write.api.json b/siax/surfaces/prospekt.jobs_write.api.json new file mode 100644 index 0000000..fad5ac1 --- /dev/null +++ b/siax/surfaces/prospekt.jobs_write.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.jobs_write", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.jobs_write.job.json b/siax/surfaces/prospekt.jobs_write.job.json new file mode 100644 index 0000000..b5f31af --- /dev/null +++ b/siax/surfaces/prospekt.jobs_write.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.jobs_write", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.jobs_write.ui.json b/siax/surfaces/prospekt.jobs_write.ui.json new file mode 100644 index 0000000..95f669f --- /dev/null +++ b/siax/surfaces/prospekt.jobs_write.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.jobs_write", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.search_read.api.json b/siax/surfaces/prospekt.search_read.api.json new file mode 100644 index 0000000..c1f1945 --- /dev/null +++ b/siax/surfaces/prospekt.search_read.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.search_read", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.search_read.job.json b/siax/surfaces/prospekt.search_read.job.json new file mode 100644 index 0000000..f063928 --- /dev/null +++ b/siax/surfaces/prospekt.search_read.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.search_read", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.search_read.ui.json b/siax/surfaces/prospekt.search_read.ui.json new file mode 100644 index 0000000..9058d13 --- /dev/null +++ b/siax/surfaces/prospekt.search_read.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.search_read", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.search_write.api.json b/siax/surfaces/prospekt.search_write.api.json new file mode 100644 index 0000000..f36fa30 --- /dev/null +++ b/siax/surfaces/prospekt.search_write.api.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.search_write", + "kind": "api", + "entrypoint": "contracts/openapi.yaml", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.search_write.job.json b/siax/surfaces/prospekt.search_write.job.json new file mode 100644 index 0000000..c075aad --- /dev/null +++ b/siax/surfaces/prospekt.search_write.job.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.search_write", + "kind": "job", + "entrypoint": "/tmp/opencode/estate-fresh/0pt/src/analytics/ingestion/connector-provider.ts", + "authRequired": true, + "status": "live" +} diff --git a/siax/surfaces/prospekt.search_write.ui.json b/siax/surfaces/prospekt.search_write.ui.json new file mode 100644 index 0000000..22ba269 --- /dev/null +++ b/siax/surfaces/prospekt.search_write.ui.json @@ -0,0 +1,7 @@ +{ + "capabilityId": "prospekt.search_write", + "kind": "ui", + "entrypoint": "next/web-app-signatur i repot", + "authRequired": true, + "status": "live" +} diff --git a/src/synthetic/factory.ts b/src/synthetic/factory.ts new file mode 100644 index 0000000..f2828e7 --- /dev/null +++ b/src/synthetic/factory.ts @@ -0,0 +1,206 @@ +/** + * `0pt/synthetic/factory.ts` — X-737: Synthetic Data Factory. + * + * Ägande enligt kontraktet: 0pt äger dataset-truth + transformationer; + * INF0 äger generering (injectas via port). Pipeline: + * + * source DatasetVersion + * → sampling + * → synthesis (INF0 GenerationPort) + * → PII/privacy-check (fail-closed FÖRE publish) + * → quality-filter + * → dedupe + * → contamination-detection (rader = identiska med val/test-kandidater) + * → train/val/test-split + * → ny DatasetVersion (0pt-repot) + * + * PROVENANS PER RAD (acceptans): varje syntetisk rad bär generation-policy-ref + * + model-version + source-ref. Privacy-check blockerar publish. + */ + +import { createHash } from 'node:crypto'; + +export type PiiClass = 'none' | 'low' | 'medium' | 'high'; + +export interface SourceRow { + id: string; + fields: Record; +} + +export interface GenerationConfig { + /** Policy-ref för genereringen (CL0UD/0pt-policy — spärras per rad). */ + generationPolicyRef: string; + /** INF0-modellversion som genererade (provener per rad). */ + modelVersion: string; + /** Antal rader som ska syntetiseras. */ + count: number; + /** Högst tillåten PII-klass i publicerad data (över → NEKAS). */ + maxAllowedPiiClass: PiiClass; + /** Quality-tröskel per rad (0–1). */ + minQualityScore: number; + /** Train/val/test-fördelning (default 70/15/15). */ + split?: { train: number; val: number; test: number }; +} + +export interface GeneratedRow { + fields: Record; + /** Kvalitetspoäng från genereringen (0–1). */ + qualityScore: number; + provenance: SyntheticRowProvenance; +} + +export interface SyntheticRowProvenance { + rowId: string; + generationPolicyRef: string; + modelVersion: string; + sourceDatasetRef: string; + sourceRowIds: string[]; + sha256: string; +} + +/** INF0:s genereringsport (0pt anropar — INF0 äger modellen). */ +export interface GenerationPort { + generate(input: { + sourceRows: SourceRow[]; + count: number; + policyRef: string; + }): Promise<{ rows: GeneratedRow[] }>; +} + +/** Privacy-port (X-728-presidio i INF0/integrations): klassificera rader. */ +export interface PrivacyCheckPort { + classifyRow(fields: Record): Promise; +} + +const PII_ORDER: Record = { none: 0, low: 1, medium: 2, high: 3 }; + +export interface PipelineStageReport { + stage: 'sampled' | 'synthesized' | 'privacy' | 'quality' | 'dedupe' | 'contamination' | 'split'; + inputCount: number; + outputCount: number; +} + +export interface SyntheticDatasetVersionDraft { + sourceDatasetId: string; + sourceVersion: number; + tenantId: string; + projectId: string; + schemaVersion: string; + description: string; + rows: Array<{ split: 'train' | 'val' | 'test'; provenance: SyntheticRowProvenance; fields: Record }>; + stages: PipelineStageReport[]; + /** Privacy-checks före publish — bevis för acceptansen. */ + privacyChecks: { checked: number; blocked: number }; + recordCount: number; + datasetDraft: { + dataset_id: string; + tenant_id: string; + project_id: string; + schema_version: string; + artifact_refs: string[]; + description: string; + record_count: number; + created_by: string; + }; +} + +export class SyntheticDataFactory { + constructor( + private readonly generation: GenerationPort, + private readonly privacy: PrivacyCheckPort, + ) {} + + /** Kör hela kedjan; nekar publish om privacy/quality står sig ej. */ + async run(input: { + sourceDatasetId: string; + sourceVersion: number; + tenantId: string; + projectId: string; + sourceRows: SourceRow[]; + evalRowSignatures?: readonly string[]; + config: GenerationConfig; + createdBy: string; + }): Promise { + const stages: PipelineStageReport[] = []; + const cfg = input.config; + + // 1. sampling + const sampled = input.sourceRows.slice(0, Math.max(1, Math.ceil(input.sourceRows.length / 2))); + stages.push({ stage: 'sampled', inputCount: input.sourceRows.length, outputCount: sampled.length }); + + // 2. syntes (INF0) + const { rows } = await this.generation.generate({ + sourceRows: sampled, + count: cfg.count, + policyRef: cfg.generationPolicyRef, + }); + stages.push({ stage: 'synthesized', inputCount: sampled.length, outputCount: rows.length }); + + // 3. PII/privacy — fail-closed FÖRE publish + const privacyChecks = { checked: 0, blocked: 0 }; + const privacyOk: GeneratedRow[] = []; + for (const row of rows) { + privacyChecks.checked += 1; + const cls = await this.privacy.classifyRow(row.fields); + if (PII_ORDER[cls] > PII_ORDER[cfg.maxAllowedPiiClass]) { + privacyChecks.blocked += 1; + continue; + } + privacyOk.push(row); + } + stages.push({ stage: 'privacy', inputCount: rows.length, outputCount: privacyOk.length }); + + // 4. quality-filter + const qualityOk = privacyOk.filter((r) => r.qualityScore >= cfg.minQualityScore); + stages.push({ stage: 'quality', inputCount: privacyOk.length, outputCount: qualityOk.length }); + + // 5. dedupe (sha256 av fält) + const seen = new Set(); + const deduped: GeneratedRow[] = []; + for (const r of qualityOk) { + const h = createHash('sha256').update(JSON.stringify(r.fields)).digest('hex'); + if (seen.has(h)) continue; + seen.add(h); + deduped.push({ ...r, provenance: { ...r.provenance, sha256: h } }); + } + stages.push({ stage: 'dedupe', inputCount: qualityOk.length, outputCount: deduped.length }); + + // 6. contamination — rader identiska med val/test-eval-signaturer raderas + const evalSigs = new Set(input.evalRowSignatures ?? []); + const clean = deduped.filter((r) => !evalSigs.has(r.provenance.sha256)); + stages.push({ stage: 'contamination', inputCount: deduped.length, outputCount: clean.length }); + + // 7. train/val/test-split (deterministiskt via hash) + const split = cfg.split ?? { train: 0.7, val: 0.15, test: 0.15 }; + const outRows: SyntheticDatasetVersionDraft['rows'] = clean.map((r) => { + const frac = parseInt(r.provenance.sha256.slice(0, 8), 16) / 0xffffffff; + const s: 'train' | 'val' | 'test' = frac < split.train ? 'train' : frac < split.train + split.val ? 'val' : 'test'; + return { split: s, provenance: r.provenance, fields: r.fields }; + }); + stages.push({ stage: 'split', inputCount: clean.length, outputCount: outRows.length }); + + const datasetId = `ds-synthetic-${input.sourceDatasetId}`; + return { + sourceDatasetId: input.sourceDatasetId, + sourceVersion: input.sourceVersion, + tenantId: input.tenantId, + projectId: input.projectId, + schemaVersion: 'synthetic/v1', + description: `Synthetic Data Factory: ${input.sourceDatasetId}@${input.sourceVersion} (policy ${cfg.generationPolicyRef}, modell ${cfg.modelVersion})`, + rows: outRows, + stages, + privacyChecks, + recordCount: outRows.length, + datasetDraft: { + dataset_id: datasetId, + tenant_id: input.tenantId, + project_id: input.projectId, + schema_version: 'synthetic/v1', + artifact_refs: [`st0re://synthetic/${input.sourceDatasetId}/v${input.sourceVersion}`], + description: `Synthetic (källa ${input.sourceDatasetId}@${input.sourceVersion}, policy ${cfg.generationPolicyRef})`, + record_count: outRows.length, + created_by: input.createdBy, + }, + }; + } +} diff --git a/tests/synthetic-factory.test.ts b/tests/synthetic-factory.test.ts new file mode 100644 index 0000000..89fdf42 --- /dev/null +++ b/tests/synthetic-factory.test.ts @@ -0,0 +1,157 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { SyntheticDataFactory, type GenerationConfig, type GenerationPort, type PrivacyCheckPort, type SourceRow } from '../src/synthetic/factory'; + +function sourceRows(n: number): SourceRow[] { + return Array.from({ length: n }, (_, i) => ({ id: `src-${i}`, fields: { fönster: i, kundtyp: i % 2 ? 'B2B' : 'B2C' } })); +} + +function makeFactory(opts: { piiPerRow?: Record[0] extends never ? never : string> } = {}): { + factory: SyntheticDataFactory; + generation: GenerationPort; + privacy: PrivacyCheckPort; +} { + const generated = Array.from({ length: 12 }, (_, i) => ({ + fields: { rad: i, frukt: 'apelsin' }, + qualityScore: i < 9 ? 0.9 : 0.3, // 3 rader under quality-tröskeln + provenance: { + rowId: `syn-${i}`, + generationPolicyRef: 'cl0ud-policy-syn-1', + modelVersion: 'inf0-synthesizer@2.1', + sourceDatasetRef: 'ds-kunder@3', + sourceRowIds: ['src-1', 'src-2'], + sha256: '', + }, + })); + const generation: GenerationPort = { + generate: vi.fn(async (input) => ({ rows: generated.map((r) => ({ ...r, provenance: { ...r.provenance, sourceDatasetRef: `ds-kunder@3` } })) })), + }; + const privacy: PrivacyCheckPort = { + classifyRow: vi.fn(async (fields: Record) => { + const rad = Number((fields as { rad: number }).rad); + // rad 0 = PII high (blockas vid maxAllowed=medium), rad 1 = medium + if (rad === 0) return 'high'; + if (rad === 1) return 'medium'; + return 'none'; + }), + }; + return { factory: new SyntheticDataFactory(generation, privacy), generation, privacy }; +} + +const CFG: GenerationConfig = { + generationPolicyRef: 'cl0ud-policy-syn-1', + modelVersion: 'inf0-synthesizer@2.1', + count: 12, + maxAllowedPiiClass: 'medium', + minQualityScore: 0.8, +}; + +describe('X-737: hela pipelinen', () => { + it('sampling→synthesis→privacy→quality→dedupe→contamination→split med steg-rapport', async () => { + const { factory: synFactory } = makeFactory(); + const draft = await synFactory.run({ + sourceDatasetId: 'ds-kunder', + sourceVersion: 3, + tenantId: 't_0pt', + projectId: 'p-1', + sourceRows: sourceRows(10), + config: CFG, + createdBy: '0pt-synthetic', + }); + expect(draft.stages.map((s: { stage: string }) => s.stage)).toEqual(['sampled', 'synthesized', 'privacy', 'quality', 'dedupe', 'contamination', 'split']); + // 12 syntetiska: 1 PII-blockad + 3 quality-bort → 8 kvar + expect(draft.recordCount).toBe(8); + expect(draft.privacyChecks).toEqual({ checked: 12, blocked: 1 }); + }); + + it('contamination: rader identiska med eval-signaturer raderas', async () => { + const { factory: synFactory } = makeFactory(); + // räkna ut sha för rad 2:s fält (apelsin-rad) och stoppa i eval-signaturer + const { createHash } = await import('node:crypto'); + const sig = createHash('sha256').update(JSON.stringify({ rad: 2, frukt: 'apelsin' })).digest('hex'); + const draft = await synFactory.run({ + sourceDatasetId: 'ds-kunder', + sourceVersion: 3, + tenantId: 't_0pt', + projectId: 'p-1', + sourceRows: sourceRows(10), + evalRowSignatures: [sig], + config: CFG, + createdBy: '0pt-synthetic', + }); + expect(draft.recordCount).toBe(7); // 8 − 1 kontaminerad + expect(draft.stages.find((s) => s.stage === 'contamination')?.outputCount).toBe(7); + }); +}); + +describe('X-737 acceptans: varje rad har provenance', () => { + it('generation-policy + model-version + source-ref på VARJE rad', async () => { + const { factory: synFactory } = makeFactory(); + const draft = await synFactory.run({ + sourceDatasetId: 'ds-kunder', + sourceVersion: 3, + tenantId: 't_0pt', + projectId: 'p-1', + sourceRows: sourceRows(10), + config: CFG, + createdBy: '0pt-synthetic', + }); + expect(draft.rows.length).toBeGreaterThan(0); + for (const row of draft.rows) { + expect(row.provenance.generationPolicyRef).toBe('cl0ud-policy-syn-1'); + expect(row.provenance.modelVersion).toBe('inf0-synthesizer@2.1'); + expect(row.provenance.sourceDatasetRef).toBe('ds-kunder@3'); + expect(row.provenance.sha256).toMatch(/^[0-9a-f]{64}$/); + } + }); + + it('privacy-check FÖRE publish: blockade rader är ALDRIG i draften', async () => { + const { factory: synFactory, generation } = makeFactory(); + const draft = await synFactory.run({ + sourceDatasetId: 'ds-kunder', + sourceVersion: 3, + tenantId: 't_0pt', + projectId: 'p-1', + sourceRows: sourceRows(10), + config: CFG, + createdBy: '0pt-synthetic', + }); + expect(generation.generate).toHaveBeenCalled(); + // rad 0 (PII high) är borta trots att genereringen producerade den + expect(draft.rows.find((r: { provenance: { rowId: string } }) => r.provenance.rowId === 'syn-0')).toBeUndefined(); + // dataset-draften är CreateDatasetVersionInput-kompatibel + expect(draft.datasetDraft.dataset_id).toContain('ds-kunder'); + expect(draft.datasetDraft.record_count).toBe(draft.recordCount); + }); + + it('train/val/test-split är deterministiskt och täcker alla rader', async () => { + const { factory: synFactory } = makeFactory(); + const draft = await synFactory.run({ + sourceDatasetId: 'ds-kunder', + sourceVersion: 3, + tenantId: 't_0pt', + projectId: 'p-1', + sourceRows: sourceRows(10), + config: CFG, + createdBy: '0pt-synthetic', + }); + const splits = draft.rows.map((r) => r.split); + for (const s of splits) { + expect(['train', 'val', 'test']).toContain(s); + } + // determinism: samma körning igen → samma split per provenance-rad + const draft2 = await synFactory.run({ + sourceDatasetId: 'ds-kunder', + sourceVersion: 3, + tenantId: 't_0pt', + projectId: 'p-1', + sourceRows: sourceRows(10), + config: CFG, + createdBy: '0pt-synthetic', + }); + const byId = new Map(draft2.rows.map((r) => [r.provenance.rowId, r.split])); + for (const r of draft.rows) { + expect(byId.get(r.provenance.rowId)).toBe(r.split); + } + }); +});