@warpgogol/werkstatt-shared 0.14.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -15
- package/README.uk.md +1 -1
- package/package.json +534 -766
- package/src/{share/agent → agent}/api-catalog.ts +14 -1
- package/src/{share/agent → agent}/ard-catalog.ts +6 -1
- package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
- package/src/agent/guidance.ts +52 -0
- package/src/agent/health.ts +68 -0
- package/src/{share/agent → agent}/index.ts +5 -1
- package/src/{share/agent → agent}/manifest.ts +83 -6
- package/src/{share/agent → agent}/openapi.ts +97 -4
- package/src/agent/receipt.ts +123 -0
- package/src/{share/agent → agent}/search.test.ts +3 -0
- package/src/{share/agent → agent}/search.ts +31 -5
- package/src/{share → agent}/tests/api-catalog.test.ts +8 -2
- package/src/{share → agent}/tests/ard-catalog.test.ts +11 -2
- package/src/{share → agent}/tests/capability.test.ts +1 -1
- package/src/{share → agent}/tests/fleet-catalog.test.ts +1 -1
- package/src/{share → agent}/tests/knowledge.test.ts +2 -2
- package/src/{share → agent}/tests/manifest.test.ts +72 -1
- package/src/{share → agent}/tests/mcp-card.test.ts +6 -2
- package/src/{share → agent}/tests/openapi.test.ts +119 -2
- package/src/{share → agent}/tests/proof.test.ts +1 -1
- package/src/{share → attribution}/material-credits.ts +4 -4
- package/src/{share → checks}/check-hints.ts +6 -1
- package/src/checks/index.ts +4 -1
- package/src/checks/lib/astro-site-url.ts +6 -1
- package/src/checks/lib/i18n.ts +14 -0
- package/src/checks/result-helpers.ts +2 -2
- package/src/checks/tests/remediation-auto-populate.test.ts +1 -1
- package/src/{share → client-scripts}/counter-utils.ts +6 -2
- package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
- package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
- package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
- package/src/client-scripts/index.ts +35 -0
- package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
- package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
- package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
- package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
- package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
- package/src/client-scripts/scroll-spy.ts +106 -0
- package/src/client-scripts/tests/orchestrator.test.ts +47 -0
- package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
- package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
- package/src/component/contracts.ts +206 -0
- package/src/component/index.ts +13 -0
- package/src/{share → content}/content-reference.ts +3 -3
- package/src/{share/content → content}/entity-id.ts +6 -3
- package/src/content/index.ts +3 -0
- package/src/{share/content → content}/merge.ts +6 -1
- package/src/content/system-manifest.test.ts +107 -0
- package/src/content/system-manifest.ts +12 -94
- package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
- package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
- package/src/content-discipline/index.ts +19 -0
- package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
- package/src/{share/env.d.ts → env.d.ts} +6 -3
- package/src/fingerprint/canonical-json.ts +731 -0
- package/src/fingerprint/index.ts +14 -0
- package/src/fingerprint/primitives.ts +72 -0
- package/src/{share/i18n → i18n}/localization.ts +6 -2
- package/src/integration/adapters.ts +10 -71
- package/src/integration/dispatch.ts +1 -1
- package/src/integration/funnel.ts +6 -1
- package/src/integration/idempotency.ts +88 -0
- package/src/integration/index.ts +105 -4
- package/src/integration/lagebild-destination-adapter.ts +108 -0
- package/src/integration/lagebild-ingress.ts +7 -12
- package/src/integration/orchestration.ts +11 -10
- package/src/integration/tests/deliver-event.test.ts +1 -1
- package/src/integration/tests/dispatch.test.ts +4 -4
- package/src/integration/tests/hub-runtime.test.ts +22 -14
- package/src/integration/tests/idempotency.test.ts +81 -0
- package/src/integration/vitest.config.ts +1 -0
- package/src/kernel/desired-state.ts +227 -0
- package/src/kernel/diagnostic.ts +289 -0
- package/src/kernel/drift-guard.ts +166 -0
- package/src/kernel/fs-atomic.ts +131 -0
- package/src/kernel/index.ts +22 -0
- package/src/kernel/tests/drift-guard.test.ts +112 -0
- package/src/kernel/tests/fs-atomic.test.ts +150 -0
- package/src/kernel/tests/workpiece-env.test.ts +44 -0
- package/src/kernel/tests/workspace-io.test.ts +187 -0
- package/src/kernel/types.ts +518 -0
- package/src/kernel/workpiece-env.ts +48 -0
- package/src/kernel/workspace-io.ts +248 -0
- package/src/{share → knowledge}/tests/claim.test.ts +1 -1
- package/src/{share → knowledge}/tests/derivation.test.ts +1 -1
- package/src/{share → knowledge}/tests/freshness.test.ts +1 -1
- package/src/{share → knowledge}/tests/ledger.test.ts +1 -1
- package/src/{share → knowledge}/tests/plan.test.ts +1 -1
- package/src/{share → knowledge}/tests/source.test.ts +1 -1
- package/src/legal/index.ts +15 -0
- package/src/{share/middleware → middleware}/access-protection.ts +11 -8
- package/src/{share/middleware → middleware}/language-redirect.ts +3 -0
- package/src/{share → node}/dev-props-validator.ts +6 -1
- package/src/{share → node}/import-scan.ts +23 -3
- package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
- package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
- package/src/{share/semantic → node}/tests/derived-prices-loader.test.ts +14 -1
- package/src/{share/semantic → node}/tests/markdown-twin-provenance.test.ts +1 -1
- package/src/observability/env-resolver.ts +6 -1
- package/src/observability/index.ts +14 -1
- package/src/observability/otlp-converter.ts +6 -1
- package/src/observability/otlp-transport.ts +6 -1
- package/src/observability/pipeline-log.ts +81 -0
- package/src/observability/pusher.ts +6 -1
- package/src/observability/redact.ts +6 -1
- package/src/observability/typed-refs.ts +6 -2
- package/src/observability/vitest.config.ts +1 -0
- package/src/{share → offers}/formula-eval.ts +3 -3
- package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
- package/src/onboarding/index.ts +1 -0
- package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
- package/src/ontology/archetype-registry.ts +6 -1
- package/src/ontology/archetypes/index.json +33 -1
- package/src/ontology/archetypes/index.yaml +27 -1
- package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
- package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
- package/src/ontology/biome-token-projection.ts +6 -1
- package/src/ontology/capabilities/lead.prepare.yaml +44 -0
- package/src/ontology/capabilities/lead.submit.yaml +20 -3
- package/src/ontology/cosmic/index.ts +6 -1
- package/src/ontology/cosmic/moon-catalog.ts +6 -1
- package/src/ontology/cosmic/planet-catalog.ts +6 -1
- package/src/ontology/cosmic/star-catalog.ts +6 -1
- package/src/ontology/enums.ts +6 -1
- package/src/ontology/external-surfaces/index.ts +1 -1
- package/src/ontology/index.ts +6 -2
- package/src/ontology/manifest.ts +7 -4
- package/src/ontology/operations/artifact-store.ts +45 -0
- package/src/ontology/operations/dht.ts +98 -0
- package/src/ontology/operations/handoff.ts +92 -0
- package/src/ontology/operations/index.ts +193 -1
- package/src/ontology/operations/leitstand.ts +99 -0
- package/src/ontology/operations/materialization.ts +90 -0
- package/src/ontology/operations/mission.ts +111 -0
- package/src/ontology/operations/naming-policy.ts +132 -0
- package/src/ontology/operations/notausgang.ts +108 -0
- package/src/ontology/operations/release.ts +121 -0
- package/src/ontology/operations/sternsystem.ts +192 -0
- package/src/ontology/operations/werkstatt.ts +48 -0
- package/src/ontology/schemas/biome.ts +7 -2
- package/src/ontology/schemas/capability.ts +56 -4
- package/src/ontology/schemas/constellation.ts +6 -1
- package/src/ontology/schemas/index.ts +6 -2
- package/src/ontology/schemas/manifest-resolver.ts +6 -1
- package/src/ontology/schemas/page-entry.ts +9 -5
- package/src/ontology/schemas/system/growth.ts +6 -1
- package/src/ontology/schemas/system/manifest.ts +40 -1
- package/src/ontology/schemas/system/page-output.ts +7 -6
- package/src/ontology/schemas/system/text.ts +15 -0
- package/src/ontology/schemas/system.ts +6 -2
- package/src/ontology/shared-section-props/body-fragments.ts +2 -0
- package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
- package/src/ontology/vitest.config.ts +1 -0
- package/src/{share → page}/page.ts +13 -9
- package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
- package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
- package/src/passport/claim-sign.ts +120 -0
- package/src/passport/index.ts +9 -1
- package/src/passport/key-rotate.ts +10 -2
- package/src/passport/schema.ts +6 -1
- package/src/passport/sign.ts +8 -3
- package/src/passport/vitest.config.ts +1 -0
- package/src/pbt/index.test.ts +95 -0
- package/src/pbt/index.ts +251 -0
- package/src/plugin/plugin-contract.ts +2 -2
- package/src/{share → policy}/entitlement.ts +24 -4
- package/src/{share → policy}/feature-policy.ts +8 -3
- package/src/{share → policy}/visibility.ts +7 -2
- package/src/redirects/redirects.ts +117 -0
- package/src/{share → redirects/tests}/redirects.test.ts +1 -1
- package/src/remediation/remediation-catalog.ts +316 -0
- package/src/{share/routes → routes}/template-filter.ts +1 -1
- package/src/{share → runtime}/runtime-context.ts +7 -2
- package/src/{share → runtime}/shared-context.ts +1 -1
- package/src/{share/schemas → schemas}/claims.ts +2 -2
- package/src/{share/schemas → schemas}/effects.ts +6 -1
- package/src/{share/schemas → schemas}/features.ts +1 -1
- package/src/{share/schemas → schemas}/index.ts +3 -3
- package/src/{share/schemas → schemas}/navigation.ts +6 -1
- package/src/{share/schemas → schemas}/page-base.ts +6 -2
- package/src/{share/schemas → schemas}/person.ts +1 -1
- package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
- package/src/{share → sections}/rfc0042-utils.ts +1 -1
- package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
- package/src/{share/semantic → semantic}/business-projection.ts +95 -1
- package/src/semantic/canonical-uri.ts +74 -0
- package/src/{share/semantic → semantic}/extract.ts +100 -1
- package/src/semantic/fact-extraction.test.ts +47 -0
- package/src/semantic/fact-extraction.ts +46 -0
- package/src/semantic/freshness.ts +67 -0
- package/src/{share/semantic → semantic}/ids.ts +6 -1
- package/src/{share/semantic → semantic}/index.ts +9 -2
- package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
- package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
- package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
- package/src/semantic/jsonld/shared.ts +36 -0
- package/src/semantic/jsonld/types.ts +24 -0
- package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
- package/src/semantic/jsonld/website.ts +32 -0
- package/src/{share/semantic → semantic}/jsonld.ts +6 -1
- package/src/{share/semantic → semantic}/llms.ts +51 -5
- package/src/{share/semantic → semantic}/models.ts +26 -38
- package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
- package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
- package/src/{share/semantic → semantic}/page-utils.ts +6 -3
- package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
- package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
- package/src/{share/semantic → semantic}/tests/business-projection.test.ts +179 -0
- package/src/semantic/tests/canonical-uri.test.ts +68 -0
- package/src/{share/semantic → semantic}/tests/extract.test.ts +83 -0
- package/src/semantic/tests/freshness.pbt.test.ts +108 -0
- package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
- package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
- package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
- package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
- package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
- package/src/{share/semantic → semantic}/tests/llms.test.ts +46 -0
- package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
- package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
- package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
- package/src/{share/semantic → semantic}/tests/price-marker-resolver.test.ts +4 -2
- package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
- package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
- package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
- package/src/signing/index.ts +15 -0
- package/src/signing/key.ts +139 -0
- package/src/signing/sign.ts +66 -0
- package/src/signing/types.ts +29 -0
- package/src/{share/slug → slug}/slug-url.ts +4 -1
- package/src/stack/run-tool.ts +106 -0
- package/src/stack/stack-checks.ts +124 -0
- package/src/stack/tests/run-tool.test.ts +138 -0
- package/src/stack/tests/stack-checks.test.ts +141 -0
- package/src/stack/tests/walk-files.test.ts +131 -0
- package/src/stack/walk-files.ts +114 -0
- package/src/surface/blueprint.ts +342 -66
- package/src/surface/decision-composer.ts +6 -1
- package/src/surface/geo.ts +6 -1
- package/src/surface/index.ts +11 -7
- package/src/surface/types.ts +2 -2
- package/src/surface/vitest.config.ts +1 -0
- package/src/tests/signing-core.test.ts +129 -0
- package/src/{share → text}/css-value-normalize.ts +6 -1
- package/src/text/string-utils.ts +24 -0
- package/src/{share → text}/tests/text-normalize.test.ts +5 -0
- package/src/{share → text}/text-normalize.ts +4 -3
- package/src/{share → text}/wrap-inline-numbers.ts +1 -1
- package/src/types/axiom-study.d.ts +36 -0
- package/src/types/hls-js-light.d.ts +21 -0
- package/src/types/qrcode-browser.d.ts +23 -0
- package/src/typography/fix.pbt.test.ts +208 -0
- package/src/typography/fix.ts +148 -0
- package/src/typography/index.ts +54 -0
- package/src/typography/locale-defaults.ts +97 -0
- package/src/typography/rules-tier1.test.ts +459 -0
- package/src/typography/rules-tier1.ts +925 -0
- package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
- package/src/typography/rules-tier2-locale.test.ts +286 -0
- package/src/typography/rules-tier2-locale.ts +399 -0
- package/src/typography/rules-tier2-structure.test.ts +330 -0
- package/src/typography/rules-tier2-structure.ts +378 -0
- package/src/typography/rules-tier3-advisory.test.ts +290 -0
- package/src/typography/rules-tier3-advisory.ts +239 -0
- package/src/typography/text-surface.test.ts +244 -0
- package/src/typography/text-surface.ts +448 -0
- package/src/index.ts +0 -14
- package/src/integration/port-barrel.ts +0 -105
- package/src/share/agent/tests/api-catalog.test.ts +0 -8
- package/src/share/agent/tests/ard-catalog.test.ts +0 -8
- package/src/share/agent/tests/capability.test.ts +0 -14
- package/src/share/agent/tests/fleet-catalog.test.ts +0 -15
- package/src/share/agent/tests/knowledge.test.ts +0 -20
- package/src/share/agent/tests/manifest.test.ts +0 -9
- package/src/share/agent/tests/mcp-card.test.ts +0 -8
- package/src/share/agent/tests/openapi.test.ts +0 -8
- package/src/share/agent/tests/proof.test.ts +0 -15
- package/src/share/content/index.ts +0 -16
- package/src/share/content-discipline/index.ts +0 -14
- package/src/share/index.ts +0 -86
- package/src/share/knowledge/tests/claim.test.ts +0 -11
- package/src/share/knowledge/tests/derivation.test.ts +0 -30
- package/src/share/knowledge/tests/freshness.test.ts +0 -18
- package/src/share/knowledge/tests/ledger.test.ts +0 -35
- package/src/share/knowledge/tests/plan.test.ts +0 -19
- package/src/share/knowledge/tests/source.test.ts +0 -19
- package/src/share/legal/index.ts +0 -1
- package/src/share/redirects.ts +0 -54
- package/src/share/remediation/remediation-catalog.ts +0 -196
- package/src/share/scripts/index.ts +0 -26
- package/src/share/scripts/tests/orchestrator.test.ts +0 -8
- package/src/share/semantic/jsonld/shared.ts +0 -31
- package/src/share/semantic/jsonld/types.ts +0 -19
- package/src/share/semantic/jsonld/website.ts +0 -27
- package/src/share/string-utils.ts +0 -19
- package/src/share/types/axiom-study.d.ts +0 -22
- package/src/share/types/hls-js-light.d.ts +0 -16
- package/src/share/types/qrcode-browser.d.ts +0 -18
- package/src/share/utility-registry.yaml +0 -50
- package/src/share/vitest.config.ts +0 -8
- package/src/surface/blueprint-schema.ts +0 -314
- package/src/surface/blueprint-types.ts +0 -256
- /package/src/{share/agent → agent}/capability.ts +0 -0
- /package/src/{share/agent → agent}/dns-aid.ts +0 -0
- /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
- /package/src/{share/agent → agent}/knowledge.ts +0 -0
- /package/src/{share/agent → agent}/mcp-card.ts +0 -0
- /package/src/{share/agent → agent}/omit-empty.ts +0 -0
- /package/src/{share/agent → agent}/proof.ts +0 -0
- /package/src/{share/agent → agent}/tests/omit-empty.test.ts +0 -0
- /package/src/{share → attribution}/attribution-display.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
- /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/external-link-qr.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/external-links.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-counter.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-mountain-journey.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-parallax.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-reveal.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-stagger.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/inline-number-animation.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/lenis.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/live-photos.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/lordicon.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/scheduler.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
- /package/src/{share/content → content}/resolve-field-path.ts +0 -0
- /package/src/{share/content → content}/substitute-deep.ts +0 -0
- /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
- /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
- /package/src/{share → image-provider}/image-provider.ts +0 -0
- /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
- /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
- /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
- /package/src/{share/knowledge → knowledge}/index.ts +0 -0
- /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
- /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
- /package/src/{share/knowledge → knowledge}/source.ts +0 -0
- /package/src/{share/legal → legal}/translation-policy.ts +0 -0
- /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
- /package/src/{share → node}/fs/index.ts +0 -0
- /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
- /package/src/{share → offers}/offer-capacity.ts +0 -0
- /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
- /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
- /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
- /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
- /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
- /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
- /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
- /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
- /package/src/{share/schemas → schemas}/media.ts +0 -0
- /package/src/{share/schemas → schemas}/participant.ts +0 -0
- /package/src/{share/schemas → schemas}/print.ts +0 -0
- /package/src/{share/schemas → schemas}/section-background.ts +0 -0
- /package/src/{share/schemas → schemas}/section-body.ts +0 -0
- /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
- /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
- /package/src/{share/schemas → schemas}/section-header.ts +0 -0
- /package/src/{share/schemas → schemas}/section-image.ts +0 -0
- /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
- /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
- /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
- /package/src/{share/schemas → schemas}/site-background.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/claim-records.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/claims.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/effects.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/features.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/horizontal-align.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/icon-color.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/live-photo.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/material-credit.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/media.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/navigation.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/page-base.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/participant.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/person.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/print.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-background.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-body.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-cards.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-cta.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-header.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-image.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-motion.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-shell.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-stats.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/site-background.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/standard-list-item.test.ts +0 -0
- /package/src/{share/semantic → semantic}/ai.ts +0 -0
- /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
- /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
- /package/src/{share/semantic → semantic}/build-page.ts +0 -0
- /package/src/{share/semantic → semantic}/feed.ts +0 -0
- /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/article.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/breadcrumb.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/collection-list.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/faq.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/initiative.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/organization.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/person.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/service.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/shared.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/video.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/webpage.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/website.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
- /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
- /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
- /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
- /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
- /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
- /package/src/{share/semantic → semantic}/robots.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/ai.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/block-extraction.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/breadcrumbs.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/build-page.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/feed.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/helpers.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/ids.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/image-sitemap.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/jsonld.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/llms-policy.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/markdown-hygiene.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/markdown-page.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/organization-profile.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/output-projection.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/page-markdown.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/page-utils.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/robots.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/update-stamp.test.ts +0 -0
- /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
- /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
- /package/src/{share/slug → slug}/index.ts +0 -0
- /package/src/{share/slug → slug}/slug-id.ts +0 -0
- /package/src/{share/slug → slug}/strategies.ts +0 -0
- /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
- /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
- /package/src/{share → text}/text-position.ts +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>RFC-0355: Zod schemas for Mission lifecycle and Bordbuch (hash-chain logbook).</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Does not define materialization — that is RFC-0356.</item>
|
|
6
|
+
<item>Does not define release discipline — that is RFC-0357.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-0517: add preflight-skipped kind for preflight gate bypass audit trail.</item>
|
|
11
|
+
<item>RFC-0706: add nachweis-record and nachweis-consent kinds for Nachweisregister trust lifecycle (ADR-0028).</item>
|
|
12
|
+
<item>RFC-0715: add nachweis-signed and nachweis-timestamped kinds for N3 cryptographic verification.</item>
|
|
13
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
14
|
+
|
|
15
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
16
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
17
|
+
|
|
18
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
19
|
+
<history>RFC-0355, RFC-0473, RFC-0479, RFC-0480</history>
|
|
20
|
+
</CHANGE_SUMMARY>
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { z } from "zod";
|
|
24
|
+
|
|
25
|
+
const missionIdRegex = /^[a-z0-9]+(-[a-z0-9]+)*-m\d{6}$/;
|
|
26
|
+
const systemIdRegex = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
27
|
+
const eventIdRegex = /^event-\d{6}$/;
|
|
28
|
+
|
|
29
|
+
export const missionStateSchema = z.enum(["open", "closed", "aborted"]);
|
|
30
|
+
|
|
31
|
+
export const missionManifestSchema = z.object({
|
|
32
|
+
schemaVersion: z.string().min(1),
|
|
33
|
+
missionId: z.string().regex(missionIdRegex),
|
|
34
|
+
systemId: z.string().regex(systemIdRegex),
|
|
35
|
+
state: missionStateSchema,
|
|
36
|
+
brief: z.string().min(1),
|
|
37
|
+
openedAt: z.string().datetime(),
|
|
38
|
+
openedBy: z.string().min(1),
|
|
39
|
+
closedAt: z.string().datetime().nullable(),
|
|
40
|
+
closedBy: z.string().nullable(),
|
|
41
|
+
pinAtOpen: z.string().min(1),
|
|
42
|
+
materializedAt: z.string().datetime().nullable(),
|
|
43
|
+
reconciledAt: z.string().datetime().nullable(),
|
|
44
|
+
migratedAt: z.string().datetime().nullable(),
|
|
45
|
+
releaseId: z.string().nullable(),
|
|
46
|
+
rfcId: z.string().nullable().default(null),
|
|
47
|
+
operationId: z.string().min(1),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// When renaming or removing a value from this enum, add the old value to
|
|
51
|
+
// DEPRECATED_KIND_MIGRATIONS in packages/os/site-kernel-handoff/src/bordbuch/bordbuch-io.ts
|
|
52
|
+
// so that existing bordbuch entries on disk are normalized during readBordbuch.
|
|
53
|
+
export const bordbuchEntryKindSchema = z.enum([
|
|
54
|
+
"mission-open",
|
|
55
|
+
"mission-close",
|
|
56
|
+
"mission-abort",
|
|
57
|
+
"mission-open-rolled-back",
|
|
58
|
+
"release-ready",
|
|
59
|
+
"release-rolled-back",
|
|
60
|
+
"pin-update",
|
|
61
|
+
"deployment",
|
|
62
|
+
"notausgang-export",
|
|
63
|
+
"operator-note",
|
|
64
|
+
"erratum",
|
|
65
|
+
"mirror-sync",
|
|
66
|
+
"pseo",
|
|
67
|
+
"indexnow.submit",
|
|
68
|
+
"mission-migrate",
|
|
69
|
+
"preflight-skipped",
|
|
70
|
+
// RFC-0706 / ADR-0028: Nachweisregister trust lifecycle
|
|
71
|
+
"nachweis-record",
|
|
72
|
+
"nachweis-consent",
|
|
73
|
+
// RFC-0715: N3 cryptographic verification (operator signature + RFC 3161 timestamp)
|
|
74
|
+
"nachweis-signed",
|
|
75
|
+
"nachweis-timestamped",
|
|
76
|
+
// RFC-0888: Sichtpass lifecycle audit trail
|
|
77
|
+
"sichtpass",
|
|
78
|
+
// RFC-0968: Sternsystem handover protocol
|
|
79
|
+
"handover",
|
|
80
|
+
// RFC-1031: Evolution controller candidate lifecycle
|
|
81
|
+
"candidate",
|
|
82
|
+
// RFC-1037: External-effect compensation verification
|
|
83
|
+
"effect",
|
|
84
|
+
// RFC-1035: Isolation controller sandbox lifecycle events
|
|
85
|
+
"isolation",
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
export const bordbuchEntryStatusSchema = z.enum(["done", "failed", "waiting", "escalated"]);
|
|
89
|
+
|
|
90
|
+
export const bordbuchEntrySchema = z.object({
|
|
91
|
+
schemaVersion: z.literal("1.0.0"),
|
|
92
|
+
id: z.string().regex(eventIdRegex),
|
|
93
|
+
systemId: z.string().min(1),
|
|
94
|
+
occurredAt: z.string().datetime(),
|
|
95
|
+
kind: bordbuchEntryKindSchema,
|
|
96
|
+
status: bordbuchEntryStatusSchema,
|
|
97
|
+
missionId: z.string().nullable(),
|
|
98
|
+
releaseId: z.string().nullable(),
|
|
99
|
+
actor: z.string().min(1),
|
|
100
|
+
summary: z.string().min(1),
|
|
101
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
102
|
+
previousHash: z.string().nullable(),
|
|
103
|
+
hash: z.string().min(1),
|
|
104
|
+
erratumOf: z.string().optional(),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
export type MissionState = z.infer<typeof missionStateSchema>;
|
|
108
|
+
export type MissionManifest = z.infer<typeof missionManifestSchema>;
|
|
109
|
+
export type BordbuchEntryKind = z.infer<typeof bordbuchEntryKindSchema>;
|
|
110
|
+
export type BordbuchEntryStatus = z.infer<typeof bordbuchEntryStatusSchema>;
|
|
111
|
+
export type BordbuchEntry = z.infer<typeof bordbuchEntrySchema>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>RFC-0361: Centralized naming policy regexes and policy descriptors for Sternsystem, Mission, Release, and Bordbuch ids. RFC-0902: add KNOWN_TLDS and hasTldSuffix() for TLD-suffix detection.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Does not define filename policies — that is DNA-6 / RFC-0360.</item>
|
|
6
|
+
<item>Does not define content-level naming — that is RFC-0047.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-0361: initial centralized naming policy regexes and descriptors.</item>
|
|
11
|
+
<item>RFC-0902: add KNOWN_TLDS set and hasTldSuffix() function; update examples to TLD-free IDs.</item>
|
|
12
|
+
</CHANGE_SUMMARY>
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export const STERNSYSTEM_ID_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
16
|
+
export const MISSION_ID_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*-m\d{6}$/;
|
|
17
|
+
export const RELEASE_ID_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*-r\d{6}$/;
|
|
18
|
+
export const BORDBUCH_EVENT_ID_REGEX = /^event-\d{6}$/;
|
|
19
|
+
|
|
20
|
+
export const NON_ASCII_REGEX = /[^\x00-\x7F]/;
|
|
21
|
+
|
|
22
|
+
// RFC-0902: Known TLD suffixes that must not appear as the last segment of a Sternsystem ID.
|
|
23
|
+
// Conservative list — add TLDs as needed. Removing a TLD from this set is a code change, not an RFC.
|
|
24
|
+
export const KNOWN_TLDS: ReadonlySet<string> = new Set([
|
|
25
|
+
"com",
|
|
26
|
+
"org",
|
|
27
|
+
"net",
|
|
28
|
+
"de",
|
|
29
|
+
"at",
|
|
30
|
+
"ch",
|
|
31
|
+
"it",
|
|
32
|
+
"fr",
|
|
33
|
+
"es",
|
|
34
|
+
"nl",
|
|
35
|
+
"be",
|
|
36
|
+
"pl",
|
|
37
|
+
"se",
|
|
38
|
+
"no",
|
|
39
|
+
"dk",
|
|
40
|
+
"fi",
|
|
41
|
+
"pt",
|
|
42
|
+
"cz",
|
|
43
|
+
"sk",
|
|
44
|
+
"hu",
|
|
45
|
+
"ro",
|
|
46
|
+
"bg",
|
|
47
|
+
"hr",
|
|
48
|
+
"si",
|
|
49
|
+
"lt",
|
|
50
|
+
"lv",
|
|
51
|
+
"ee",
|
|
52
|
+
"ie",
|
|
53
|
+
"lu",
|
|
54
|
+
"mt",
|
|
55
|
+
"cy",
|
|
56
|
+
"gr",
|
|
57
|
+
"uk",
|
|
58
|
+
"us",
|
|
59
|
+
"ca",
|
|
60
|
+
"au",
|
|
61
|
+
"nz",
|
|
62
|
+
"io",
|
|
63
|
+
"co",
|
|
64
|
+
"ai",
|
|
65
|
+
"dev",
|
|
66
|
+
"app",
|
|
67
|
+
"eu",
|
|
68
|
+
"info",
|
|
69
|
+
"biz",
|
|
70
|
+
"me",
|
|
71
|
+
"tv",
|
|
72
|
+
"gg",
|
|
73
|
+
"to",
|
|
74
|
+
"xyz",
|
|
75
|
+
"site",
|
|
76
|
+
"online",
|
|
77
|
+
"store",
|
|
78
|
+
"shop",
|
|
79
|
+
"blog",
|
|
80
|
+
"cloud",
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
// RFC-0902: Returns true if the last hyphen-separated segment of the id is a known TLD.
|
|
84
|
+
// Single-segment IDs (e.g. "com", "warpgogol") return false — the concern is suffix segments.
|
|
85
|
+
export function hasTldSuffix(id: string): boolean {
|
|
86
|
+
const segments = id.split("-");
|
|
87
|
+
if (segments.length < 2) return false;
|
|
88
|
+
return KNOWN_TLDS.has(segments[segments.length - 1]);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const STERNSYSTEM_ID_POLICY = {
|
|
92
|
+
regex: STERNSYSTEM_ID_REGEX,
|
|
93
|
+
charset: "ASCII lowercase letters (a-z), digits (0-9), hyphens (-)",
|
|
94
|
+
description: "kebab-case, lowercase, latin-only",
|
|
95
|
+
examples: ["warpgogol", "nicaragua-projekt"],
|
|
96
|
+
counterExamples: [
|
|
97
|
+
"Warpgogol-Com",
|
|
98
|
+
"nicaragüa-projekt",
|
|
99
|
+
"warpgogol--com",
|
|
100
|
+
"-warpgogol",
|
|
101
|
+
"warpgogol-",
|
|
102
|
+
],
|
|
103
|
+
tldCounterExamples: ["warpgogol-com", "nicaragua-projekt-org", "example-de"],
|
|
104
|
+
} as const;
|
|
105
|
+
|
|
106
|
+
export const MISSION_ID_POLICY = {
|
|
107
|
+
regex: MISSION_ID_REGEX,
|
|
108
|
+
format: "<system-id>-m<NNNNNN>",
|
|
109
|
+
description: "system id + literal -m + zero-padded six-digit sequence",
|
|
110
|
+
examples: ["warpgogol-m000001", "nicaragua-projekt-m000042"],
|
|
111
|
+
counterExamples: ["warpgogol-com-m1", "warpgogol-com-M000001", "warpgogol-com-m0000001"],
|
|
112
|
+
} as const;
|
|
113
|
+
|
|
114
|
+
export const RELEASE_ID_POLICY = {
|
|
115
|
+
regex: RELEASE_ID_REGEX,
|
|
116
|
+
format: "<system-id>-r<NNNNNN>",
|
|
117
|
+
description: "system id + literal -r + zero-padded six-digit sequence",
|
|
118
|
+
examples: ["warpgogol-r000001", "nicaragua-projekt-r000042"],
|
|
119
|
+
counterExamples: ["warpgogol-com-r1", "warpgogol-com-R000001", "warpgogol-com-r0000001"],
|
|
120
|
+
} as const;
|
|
121
|
+
|
|
122
|
+
export const BORDBUCH_EVENT_ID_POLICY = {
|
|
123
|
+
regex: BORDBUCH_EVENT_ID_REGEX,
|
|
124
|
+
format: "event-<NNNNNN>",
|
|
125
|
+
description: "literal 'event-' + zero-padded six-digit sequence",
|
|
126
|
+
examples: ["event-000001", "event-000042"],
|
|
127
|
+
counterExamples: ["event-1", "event-0000001", "EVENT-000001"],
|
|
128
|
+
} as const;
|
|
129
|
+
|
|
130
|
+
export function isLatinOnly(value: string): boolean {
|
|
131
|
+
return !NON_ASCII_REGEX.test(value);
|
|
132
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>RFC-0359 + RFC-0380: Zod schemas for Notausgang export manifest and integration manifest. RFC-0380 deepens the manifest schema for deep integrity verification by notausgang.validate.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not introduce app-specific runtime composition or deployment behavior into this reusable package source file.</item>
|
|
6
|
+
</non-goals>
|
|
7
|
+
</MODULE_CONTRACT>
|
|
8
|
+
<CHANGE_SUMMARY>
|
|
9
|
+
<item>RFC-0359: initial notausgang and integration manifest schemas.</item>
|
|
10
|
+
<item>RFC-0380: schema validated by notausgang.validate for deep integrity verification (schema shape unchanged, already uses STERNSYSTEM_ID_REGEX and RELEASE_ID_REGEX).</item>
|
|
11
|
+
</CHANGE_SUMMARY>
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
import { STERNSYSTEM_ID_REGEX, RELEASE_ID_REGEX } from "./naming-policy.ts";
|
|
16
|
+
import { starNameSchema } from "@warpgogol/werkstatt-shared/ontology/cosmic";
|
|
17
|
+
|
|
18
|
+
export const integrationSecretLocationSchema = z.object({
|
|
19
|
+
file: z.string(),
|
|
20
|
+
jsonPath: z.string(),
|
|
21
|
+
envVar: z.string().optional(),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const integrationManifestSchema = z.object({
|
|
25
|
+
schemaVersion: z.string().min(1),
|
|
26
|
+
integrations: z.record(z.string(), z.array(integrationSecretLocationSchema)),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const integrationNullingSchema = z.object({
|
|
30
|
+
nulled: z.array(z.string()),
|
|
31
|
+
exceptions: z.array(
|
|
32
|
+
z.object({
|
|
33
|
+
name: z.string(),
|
|
34
|
+
reason: z.string(),
|
|
35
|
+
}),
|
|
36
|
+
),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// RFC-1120: per-artifact record inside an evidence bundle verdict
|
|
40
|
+
export const notausgangEvidenceArtifactSchema = z.object({
|
|
41
|
+
itemKey: z.string().min(1),
|
|
42
|
+
filename: z.string().min(1).optional(),
|
|
43
|
+
sha256: z
|
|
44
|
+
.string()
|
|
45
|
+
.regex(/^[a-f0-9]{64}$/)
|
|
46
|
+
.optional(),
|
|
47
|
+
recordedSha256: z
|
|
48
|
+
.string()
|
|
49
|
+
.regex(/^[a-f0-9]{64}$/)
|
|
50
|
+
.optional(),
|
|
51
|
+
r2Path: z.string().min(1).optional(),
|
|
52
|
+
external: z.boolean().optional(),
|
|
53
|
+
url: z.string().min(1).optional(),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// RFC-1120: per-source verdict — "bundled" | "external-reference" | "excluded:<reason>"
|
|
57
|
+
export const notausgangEvidenceVerdictSchema = z.object({
|
|
58
|
+
verdict: z.string().regex(/^(bundled|external-reference|excluded:.+)$/),
|
|
59
|
+
artifacts: z.array(notausgangEvidenceArtifactSchema).optional(),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// RFC-1120: dynamic-feature disclosure entry
|
|
63
|
+
export const notausgangFeatureNoteSchema = z.object({
|
|
64
|
+
feature: z.string().min(1),
|
|
65
|
+
verdict: z.enum(["static-ok", "frozen-at-export", "needs-backend"]),
|
|
66
|
+
detail: z.string(),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
export const notausgangManifestSchema = z.object({
|
|
70
|
+
schemaVersion: z.string().min(1),
|
|
71
|
+
systemId: z.string().regex(STERNSYSTEM_ID_REGEX),
|
|
72
|
+
cosmicStar: starNameSchema,
|
|
73
|
+
releaseId: z.string().regex(RELEASE_ID_REGEX),
|
|
74
|
+
exportedAt: z.string().datetime(),
|
|
75
|
+
platformVersion: z.string(),
|
|
76
|
+
platformSemanticHash: z.string(),
|
|
77
|
+
semver: z.string(),
|
|
78
|
+
source: z.object({
|
|
79
|
+
releaseManifestHash: z.string(),
|
|
80
|
+
artifactManifestHash: z.string(),
|
|
81
|
+
distArtifactHash: z.string(),
|
|
82
|
+
siteContentHash: z.string(),
|
|
83
|
+
behaviorSnapshotHash: z.string(),
|
|
84
|
+
}),
|
|
85
|
+
integrationNulling: integrationNullingSchema,
|
|
86
|
+
distHash: z.string(),
|
|
87
|
+
siteHash: z.string(),
|
|
88
|
+
bordbuchHash: z.string(),
|
|
89
|
+
// RFC-1120: optional in schema (granular NA-* rules report absence);
|
|
90
|
+
// mandatory in packages produced by notausgang.export.
|
|
91
|
+
evidence: z.record(z.string(), notausgangEvidenceVerdictSchema).optional(),
|
|
92
|
+
features: z.array(notausgangFeatureNoteSchema).optional(),
|
|
93
|
+
verifier: z
|
|
94
|
+
.object({
|
|
95
|
+
script: z.literal("verify.py"),
|
|
96
|
+
runtime: z.literal("python3-stdlib"),
|
|
97
|
+
manifestFile: z.literal("notausgang-manifest.json"),
|
|
98
|
+
})
|
|
99
|
+
.optional(),
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
export type IntegrationSecretLocation = z.infer<typeof integrationSecretLocationSchema>;
|
|
103
|
+
export type IntegrationManifest = z.infer<typeof integrationManifestSchema>;
|
|
104
|
+
export type IntegrationNulling = z.infer<typeof integrationNullingSchema>;
|
|
105
|
+
export type NotausgangEvidenceArtifact = z.infer<typeof notausgangEvidenceArtifactSchema>;
|
|
106
|
+
export type NotausgangEvidenceVerdict = z.infer<typeof notausgangEvidenceVerdictSchema>;
|
|
107
|
+
export type NotausgangFeatureNote = z.infer<typeof notausgangFeatureNoteSchema>;
|
|
108
|
+
export type NotausgangManifest = z.infer<typeof notausgangManifestSchema>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>RFC-0357/RFC-0851: Zod schemas for release manifest (artifact-only prepared|ready), behavior snapshot wrapper, snapshot diff, and legacy release diagnostics.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not introduce app-specific runtime composition or deployment behavior into this reusable package source file.</item>
|
|
6
|
+
<item>Do not reintroduce legacy deployment states (published, dev-deployed, alt-deployed, promoted, main-deployed, rolled-back) into the artifact state schema.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-0357: initial release and behavior snapshot schemas.</item>
|
|
11
|
+
<item>RFC-0608: extend releaseStateSchema with alt-deployed and promoted; add buildIdentitySchema.</item>
|
|
12
|
+
<item>RFC-0627: add dev-deployed state (precedes alt-deployed in the three-channel deployment chain).</item>
|
|
13
|
+
<item>RFC-0628: remove dev-deployed state (workpiece-based dev deploy does not enter the release state machine).</item>
|
|
14
|
+
<item>RFC-0851: replace legacy state enum with artifact-only prepared|ready; make manifest strict; replace publishedAt with readyAt; add legacyReleaseStateSchema and legacyReleaseDiagnosticSchema.</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { STERNSYSTEM_ID_REGEX, MISSION_ID_REGEX, RELEASE_ID_REGEX } from "./naming-policy.ts";
|
|
20
|
+
import { releaseArtifactRefSchema as artifactRefSchema } from "./artifact-store.ts";
|
|
21
|
+
|
|
22
|
+
export const releaseArtifactStateSchema = z.enum(["prepared", "ready"]);
|
|
23
|
+
|
|
24
|
+
export const releaseStateSchema = releaseArtifactStateSchema;
|
|
25
|
+
|
|
26
|
+
export const legacyReleaseStateSchema = z.enum([
|
|
27
|
+
"published",
|
|
28
|
+
"dev-deployed",
|
|
29
|
+
"alt-deployed",
|
|
30
|
+
"promoted",
|
|
31
|
+
"main-deployed",
|
|
32
|
+
"rolled-back",
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
export const legacyReleaseDiagnosticSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
schema: z.literal("werkstatt/legacy-release-diagnostic@1"),
|
|
38
|
+
releaseId: z.string().regex(RELEASE_ID_REGEX),
|
|
39
|
+
legacyState: legacyReleaseStateSchema,
|
|
40
|
+
ruleId: z.literal("CERT-LEGACY-STATE-01"),
|
|
41
|
+
message: z.string().min(1),
|
|
42
|
+
fixHint: z.string().min(1),
|
|
43
|
+
})
|
|
44
|
+
.strict();
|
|
45
|
+
|
|
46
|
+
export const releaseManifestSchema = z
|
|
47
|
+
.object({
|
|
48
|
+
schemaVersion: z.string().min(1),
|
|
49
|
+
releaseId: z.string().regex(RELEASE_ID_REGEX),
|
|
50
|
+
systemId: z.string().regex(STERNSYSTEM_ID_REGEX),
|
|
51
|
+
missionId: z.string().regex(MISSION_ID_REGEX),
|
|
52
|
+
semver: z.string(),
|
|
53
|
+
platformVersion: z.string(),
|
|
54
|
+
createdAt: z.string().datetime(),
|
|
55
|
+
readyAt: z.string().datetime().nullable(),
|
|
56
|
+
state: releaseArtifactStateSchema,
|
|
57
|
+
commitSha: z.string(),
|
|
58
|
+
platformSemanticHash: z.string(),
|
|
59
|
+
siteContentHash: z.string(),
|
|
60
|
+
distTreeHash: z.string(),
|
|
61
|
+
distArtifactHash: z.string().nullable(),
|
|
62
|
+
artifact: artifactRefSchema.nullable(),
|
|
63
|
+
behaviorSnapshotHash: z.string(),
|
|
64
|
+
readableSnapshotHash: z.string(),
|
|
65
|
+
qualityReportHash: z.string().nullable(),
|
|
66
|
+
snapshotDiffVerdict: z.enum(["pass", "fail"]),
|
|
67
|
+
migratorVerdict: z.enum(["pass", "fail"]),
|
|
68
|
+
versionCompareVerdict: z.enum(["in-sync", "catch-up", "refuse-downgrade"]),
|
|
69
|
+
bootSmokeVerdict: z.enum(["pass", "fail"]),
|
|
70
|
+
})
|
|
71
|
+
.strict();
|
|
72
|
+
|
|
73
|
+
export const releaseArtifactRefSchema = z.object({
|
|
74
|
+
store: z.literal("werkstatt-local"),
|
|
75
|
+
algorithm: z.literal("sha256"),
|
|
76
|
+
digest: z.string(),
|
|
77
|
+
uri: z.string(),
|
|
78
|
+
manifestHash: z.string(),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
export const behaviorSnapshotDifferenceSchema = z.object({
|
|
82
|
+
field: z.string(),
|
|
83
|
+
kind: z.enum(["added", "removed", "changed"]),
|
|
84
|
+
detail: z.string(),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
export const behaviorSnapshotDiffSchema = z.object({
|
|
88
|
+
schemaVersion: z.string().min(1),
|
|
89
|
+
baselineHash: z.string(),
|
|
90
|
+
candidateHash: z.string(),
|
|
91
|
+
verdict: z.enum(["pass", "fail"]),
|
|
92
|
+
differences: z.array(behaviorSnapshotDifferenceSchema),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export const buildIdentitySchema = z.object({
|
|
96
|
+
releaseId: z.string().regex(/^(workpiece-)?[a-z0-9]+(-[a-z0-9]+)*(-r\d{6}|-m\d{6})$/),
|
|
97
|
+
systemId: z.string().regex(STERNSYSTEM_ID_REGEX),
|
|
98
|
+
missionId: z.string().regex(MISSION_ID_REGEX),
|
|
99
|
+
semver: z.string(),
|
|
100
|
+
distTreeHash: z.string(),
|
|
101
|
+
behaviorSnapshotHash: z.string(),
|
|
102
|
+
siteContentHash: z.string(),
|
|
103
|
+
platformVersion: z.string(),
|
|
104
|
+
platformSemanticHash: z.string(),
|
|
105
|
+
commitSha: z.string(),
|
|
106
|
+
buildTimestamp: z.string().datetime(),
|
|
107
|
+
targetPlatform: z.string(),
|
|
108
|
+
// --- RFC-0931 signature fields (optional, added during signing phase) ---
|
|
109
|
+
signature: z.string().optional(),
|
|
110
|
+
publicKeyUrl: z.string().optional(),
|
|
111
|
+
signedAt: z.string().datetime().optional(),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export type ReleaseArtifactState = z.infer<typeof releaseArtifactStateSchema>;
|
|
115
|
+
export type ReleaseState = z.infer<typeof releaseStateSchema>;
|
|
116
|
+
export type LegacyReleaseState = z.infer<typeof legacyReleaseStateSchema>;
|
|
117
|
+
export type LegacyReleaseDiagnostic = z.infer<typeof legacyReleaseDiagnosticSchema>;
|
|
118
|
+
export type ReleaseManifest = z.infer<typeof releaseManifestSchema>;
|
|
119
|
+
export type BuildIdentity = z.infer<typeof buildIdentitySchema>;
|
|
120
|
+
export type BehaviorSnapshotDifference = z.infer<typeof behaviorSnapshotDifferenceSchema>;
|
|
121
|
+
export type BehaviorSnapshotDiff = z.infer<typeof behaviorSnapshotDiffSchema>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>
|
|
4
|
+
RFC-0354: Zod schemas for the Sternsystem bundle contract — the durable site unit,
|
|
5
|
+
fleet registry, and version pin. These schemas are the machine-checkable contract
|
|
6
|
+
for all Sternsystem operations.
|
|
7
|
+
RFC-0561: fleetRegistryEntrySchema gains optional owner field (did:web VC subject id).
|
|
8
|
+
RFC-0574: replace repo/mirror with parameterized mirrors[] array.
|
|
9
|
+
RFC-0752: add cloudflareZoneId to fleetRegistryEntrySchema, services[] with subdomains to fleetRegistrySchema.
|
|
10
|
+
RFC-0751: extend serviceEntrySchema with deployment fields (kind, url, publicEndpoints, routes, upstreams, lastDeployed, healthCheckPath).
|
|
11
|
+
RFC-0790: add systemConfigSchema, systemStateSchema, servicesRegistrySchema for convention-based discovery (replaces fleetRegistrySchema).
|
|
12
|
+
</purpose>
|
|
13
|
+
<non-goals>
|
|
14
|
+
<item>Do not perform file IO or git operations — pure shape only.</item>
|
|
15
|
+
<item>Do not define mission or release schemas — those live in subsequent RFCs.</item>
|
|
16
|
+
</non-goals>
|
|
17
|
+
</MODULE_CONTRACT>
|
|
18
|
+
<CHANGE_SUMMARY>
|
|
19
|
+
<item>RFC-0966: add passportRequired to systemStateSchema for passport enforcement gating.</item>
|
|
20
|
+
<item>RFC-0967: add ownershipRequired to systemStateSchema for ownership enforcement gating.</item>
|
|
21
|
+
<item>RFC-1065: add lagebild to systemStateSchema for Lagebild connection metadata.</item>
|
|
22
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
23
|
+
|
|
24
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
25
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
26
|
+
|
|
27
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
28
|
+
<history>RFC-0354, RFC-0479, RFC-0561, RFC-0574, RFC-0751, RFC-0752, RFC-0790, RFC-0806, RFC-0902, RFC-0964</history>
|
|
29
|
+
</CHANGE_SUMMARY>
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { z } from "zod";
|
|
33
|
+
import { starNameSchema } from "@warpgogol/werkstatt-shared/ontology/cosmic";
|
|
34
|
+
import { deploymentStaticConfigSchema, lastPropagatedChannelSchema } from "./leitstand.ts";
|
|
35
|
+
|
|
36
|
+
const semverRe = /^\d+\.\d+\.\d+$/;
|
|
37
|
+
const sha256Re = /^sha256:[0-9a-f]{64}$/;
|
|
38
|
+
const kebabRe = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
39
|
+
const didWebRe = /^did:web:[a-z0-9.-]+#.+$/;
|
|
40
|
+
|
|
41
|
+
export const systemPinSchema = z.object({
|
|
42
|
+
schemaVersion: z.string().min(1),
|
|
43
|
+
systemId: z
|
|
44
|
+
.string()
|
|
45
|
+
.regex(kebabRe, "systemId must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
46
|
+
cosmicStar: starNameSchema,
|
|
47
|
+
pinnedAt: z.string().datetime(),
|
|
48
|
+
platform: z.object({
|
|
49
|
+
version: z.string().regex(semverRe, "platform.version must be x.y.z"),
|
|
50
|
+
commit: z.string().min(7),
|
|
51
|
+
rfcHead: z.string().regex(/^RFC-\d{4}$/, "rfcHead must be RFC-NNNN"),
|
|
52
|
+
platformSemanticHash: z
|
|
53
|
+
.string()
|
|
54
|
+
.regex(sha256Re, "platformSemanticHash must be sha256: prefixed hex"),
|
|
55
|
+
}),
|
|
56
|
+
migratorCursor: z.array(z.string()),
|
|
57
|
+
capabilities: z.array(
|
|
58
|
+
z.object({
|
|
59
|
+
semanticId: z.string().min(1),
|
|
60
|
+
version: z.string().min(1),
|
|
61
|
+
intent: z.array(z.string()),
|
|
62
|
+
}),
|
|
63
|
+
),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export const mirrorStorageTypeSchema = z.enum(["non-bare", "bare", "bundle"]);
|
|
67
|
+
|
|
68
|
+
export type MirrorStorageType = z.infer<typeof mirrorStorageTypeSchema>;
|
|
69
|
+
|
|
70
|
+
export const mirrorEntrySchema = z.object({
|
|
71
|
+
path: z.string().min(1, "mirror path must be non-empty"),
|
|
72
|
+
storageType: mirrorStorageTypeSchema,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
export type MirrorEntry = z.infer<typeof mirrorEntrySchema>;
|
|
76
|
+
|
|
77
|
+
export const serviceSubdomainSchema = z.object({
|
|
78
|
+
domain: z.string().min(1, "subdomain domain must be non-empty"),
|
|
79
|
+
zone: z.string().min(1, "subdomain zone must be non-empty"),
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
export const serviceEntrySchema = z.object({
|
|
83
|
+
id: z
|
|
84
|
+
.string()
|
|
85
|
+
.regex(kebabRe, "service id must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
86
|
+
kind: z.enum(["proxy-worker", "scheduled-worker", "cloudflare-worker"]),
|
|
87
|
+
workerName: z.string().min(1, "workerName must be non-empty"),
|
|
88
|
+
hostedBy: z.enum(["studio"]),
|
|
89
|
+
url: z.string().min(1, "url must be non-empty"),
|
|
90
|
+
workersDevUrl: z.string().min(1, "workersDevUrl must be non-empty").optional(),
|
|
91
|
+
publicEndpoints: z.boolean().default(false),
|
|
92
|
+
routes: z.array(z.string()).optional(),
|
|
93
|
+
upstreams: z.array(z.string()).optional(),
|
|
94
|
+
subdomains: z.array(serviceSubdomainSchema).default([]),
|
|
95
|
+
lastDeployed: z
|
|
96
|
+
.object({
|
|
97
|
+
at: z.string().datetime().nullable(),
|
|
98
|
+
state: z.enum(["succeeded", "failed"]).nullable(),
|
|
99
|
+
operationId: z.string().nullable(),
|
|
100
|
+
})
|
|
101
|
+
.default({ at: null, state: null, operationId: null }),
|
|
102
|
+
lastDevDeployed: z
|
|
103
|
+
.object({
|
|
104
|
+
at: z.string().datetime().nullable(),
|
|
105
|
+
state: z.enum(["succeeded", "failed"]).nullable(),
|
|
106
|
+
operationId: z.string().nullable(),
|
|
107
|
+
})
|
|
108
|
+
.default({ at: null, state: null, operationId: null })
|
|
109
|
+
.describe("RFC-0806: last dev-channel deployment state"),
|
|
110
|
+
healthCheckPath: z.string().optional(),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// RFC-0790: Convention-based discovery schemas (replaces fleet registry)
|
|
114
|
+
|
|
115
|
+
export const systemConfigSchema = z.object({
|
|
116
|
+
schemaVersion: z.string().min(1),
|
|
117
|
+
id: z.string().regex(kebabRe, "id must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
118
|
+
cosmicStar: starNameSchema,
|
|
119
|
+
mirrors: z.array(mirrorEntrySchema).min(1, "mirrors must contain at least 1 entry"),
|
|
120
|
+
pinnedPlatform: z.string().regex(semverRe, "pinnedPlatform must be x.y.z"),
|
|
121
|
+
status: z.enum(["registered", "active", "paused", "archived"]),
|
|
122
|
+
registeredAt: z.string().datetime(),
|
|
123
|
+
deployment: deploymentStaticConfigSchema.optional(),
|
|
124
|
+
cloudflareZoneId: z
|
|
125
|
+
.string()
|
|
126
|
+
.min(1, "cloudflareZoneId must be non-empty")
|
|
127
|
+
.optional()
|
|
128
|
+
.describe("Cloudflare zone ID for DNS and Workers route management (RFC-0752)"),
|
|
129
|
+
owner: z
|
|
130
|
+
.string()
|
|
131
|
+
.regex(didWebRe, "owner must be a did:web identifier (did:web:<domain>#<key-version>)")
|
|
132
|
+
.optional()
|
|
133
|
+
.describe("VC subject id of the site owner (RFC-0558, RFC-0561)"),
|
|
134
|
+
notes: z.string().default(""),
|
|
135
|
+
fleet: z
|
|
136
|
+
.object({
|
|
137
|
+
canary: z.boolean().default(false),
|
|
138
|
+
})
|
|
139
|
+
.optional()
|
|
140
|
+
.describe("RFC-0964: fleet wave orchestration config"),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
export const systemStateSchema = z.object({
|
|
144
|
+
schemaVersion: z.string().min(1),
|
|
145
|
+
systemId: z
|
|
146
|
+
.string()
|
|
147
|
+
.regex(kebabRe, "systemId must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
148
|
+
currentMission: z.string().nullable().default(null),
|
|
149
|
+
lastRelease: z.string().nullable().default(null),
|
|
150
|
+
lastPropagated: z
|
|
151
|
+
.object({
|
|
152
|
+
dev: lastPropagatedChannelSchema.optional(),
|
|
153
|
+
alt: lastPropagatedChannelSchema.optional(),
|
|
154
|
+
main: lastPropagatedChannelSchema.optional(),
|
|
155
|
+
})
|
|
156
|
+
.default({}),
|
|
157
|
+
// RFC-0899: 4-digit PIN for dev/alt subdomain access protection. Null when not set.
|
|
158
|
+
accessPin: z
|
|
159
|
+
.string()
|
|
160
|
+
.regex(/^\d{4}$/, "accessPin must be a 4-digit numeric string")
|
|
161
|
+
.nullable()
|
|
162
|
+
.default(null),
|
|
163
|
+
// RFC-0966: Controls PASSPORT-01 warning vs blocking. false during rollout,
|
|
164
|
+
// set to true by sternsystem.passport.generate after first successful generation.
|
|
165
|
+
passportRequired: z.boolean().default(false),
|
|
166
|
+
// RFC-0967: Controls OWNERSHIP-01 warning vs blocking. false during rollout,
|
|
167
|
+
// set to true per-site when ready for blocking enforcement.
|
|
168
|
+
ownershipRequired: z.boolean().default(false),
|
|
169
|
+
// RFC-1065: Lagebild connection metadata. Undefined when not connected.
|
|
170
|
+
lagebild: z
|
|
171
|
+
.object({
|
|
172
|
+
connected: z.boolean(),
|
|
173
|
+
apiUrl: z.string(),
|
|
174
|
+
tenantId: z.string(),
|
|
175
|
+
sourceSystemId: z.string(),
|
|
176
|
+
connectedAt: z.string(),
|
|
177
|
+
channel: z.string(),
|
|
178
|
+
})
|
|
179
|
+
.optional(),
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
export const servicesRegistrySchema = z.object({
|
|
183
|
+
schemaVersion: z.string().min(1),
|
|
184
|
+
services: z.array(serviceEntrySchema),
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
export type SystemPin = z.infer<typeof systemPinSchema>;
|
|
188
|
+
export type ServiceSubdomain = z.infer<typeof serviceSubdomainSchema>;
|
|
189
|
+
export type ServiceEntry = z.infer<typeof serviceEntrySchema>;
|
|
190
|
+
export type SystemConfig = z.infer<typeof systemConfigSchema>;
|
|
191
|
+
export type SystemState = z.infer<typeof systemStateSchema>;
|
|
192
|
+
export type ServicesRegistry = z.infer<typeof servicesRegistrySchema>;
|