@warpgogol/werkstatt-shared 0.14.0 → 0.15.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 +31 -13
- package/README.uk.md +25 -15
- package/package.json +519 -762
- package/src/{share/agent → agent}/ard-catalog.ts +6 -1
- package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
- package/src/{share/agent → agent}/manifest.ts +15 -1
- package/src/{share/agent → agent}/search.ts +6 -1
- package/src/{share → agent}/tests/api-catalog.test.ts +2 -2
- package/src/{share → agent}/tests/ard-catalog.test.ts +2 -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 +1 -1
- package/src/{share → agent}/tests/mcp-card.test.ts +2 -2
- package/src/agent/tests/omit-empty.test.ts +33 -0
- package/src/{share → agent}/tests/openapi.test.ts +2 -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 +22 -5
- package/src/checks/tests/remediation-auto-populate.test.ts +83 -0
- 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/external-link-qr.test.ts +8 -0
- package/src/client-scripts/tests/external-links.test.ts +25 -0
- package/src/client-scripts/tests/gsap-counter.test.ts +8 -0
- package/src/client-scripts/tests/gsap-mountain-journey.test.ts +8 -0
- package/src/client-scripts/tests/gsap-parallax.test.ts +8 -0
- package/src/client-scripts/tests/gsap-reveal.test.ts +8 -0
- package/src/client-scripts/tests/gsap-stagger.test.ts +8 -0
- package/src/client-scripts/tests/inline-number-animation.test.ts +8 -0
- package/src/client-scripts/tests/lenis.test.ts +8 -0
- package/src/client-scripts/tests/live-photos.test.ts +8 -0
- package/src/client-scripts/tests/lordicon.test.ts +8 -0
- package/src/client-scripts/tests/orchestrator.test.ts +47 -0
- package/src/client-scripts/tests/scheduler.test.ts +23 -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 +11 -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 +12 -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/index.ts +101 -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/vitest.config.ts +8 -0
- package/src/kernel/desired-state.ts +227 -0
- package/src/kernel/diagnostic.ts +289 -0
- package/src/kernel/fs-atomic.ts +131 -0
- package/src/kernel/index.ts +15 -0
- package/src/kernel/tests/fs-atomic.test.ts +150 -0
- package/src/kernel/tests/workspace-io.test.ts +187 -0
- package/src/kernel/types.ts +459 -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 +8 -8
- 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/node/tests/derived-prices-loader.test.ts +59 -0
- package/src/node/tests/markdown-twin-provenance.test.ts +152 -0
- package/src/observability/env-resolver.ts +6 -1
- package/src/observability/index.ts +6 -1
- package/src/observability/otlp-converter.ts +6 -1
- package/src/observability/otlp-transport.ts +6 -1
- 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/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 +26 -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 +187 -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 +64 -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 +1 -1
- 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/tests/growth.test.ts +22 -0
- package/src/ontology/schemas/system/tests/integrations.test.ts +12 -0
- package/src/ontology/schemas/system/tests/manifest.test.ts +22 -0
- package/src/ontology/schemas/system/tests/page-output.test.ts +13 -0
- package/src/ontology/schemas/system/tests/release.test.ts +22 -0
- package/src/ontology/schemas/system/tests/text.test.ts +18 -0
- package/src/ontology/schemas/system/tests/verification.test.ts +12 -0
- package/src/ontology/schemas/system/text.ts +15 -0
- package/src/ontology/schemas/system.ts +6 -2
- package/src/ontology/schemas/tests/biome.test.ts +19 -0
- package/src/ontology/schemas/tests/capability.test.ts +22 -0
- package/src/ontology/schemas/tests/constellation.test.ts +22 -0
- package/src/ontology/schemas/tests/dns-records.test.ts +13 -0
- package/src/ontology/schemas/tests/manifest-resolver.test.ts +13 -0
- package/src/ontology/schemas/tests/page-entry.test.ts +22 -0
- package/src/ontology/schemas/tests/section-archetype.test.ts +12 -0
- package/src/ontology/schemas/tests/site-family.test.ts +18 -0
- package/src/ontology/schemas/tests/system.test.ts +20 -0
- 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/index.ts +6 -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 +1 -1
- 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/schemas/tests/claim-records.test.ts +52 -0
- package/src/schemas/tests/claims.test.ts +23 -0
- package/src/schemas/tests/effects.test.ts +116 -0
- package/src/schemas/tests/features.test.ts +61 -0
- package/src/schemas/tests/horizontal-align.test.ts +16 -0
- package/src/schemas/tests/icon-color.test.ts +16 -0
- package/src/schemas/tests/live-photo.test.ts +40 -0
- package/src/schemas/tests/material-credit.test.ts +51 -0
- package/src/schemas/tests/media.test.ts +26 -0
- package/src/schemas/tests/navigation.test.ts +58 -0
- package/src/schemas/tests/page-base.test.ts +19 -0
- package/src/schemas/tests/participant.test.ts +26 -0
- package/src/schemas/tests/person.test.ts +12 -0
- package/src/schemas/tests/print.test.ts +30 -0
- package/src/schemas/tests/section-background.test.ts +31 -0
- package/src/schemas/tests/section-body.test.ts +16 -0
- package/src/schemas/tests/section-cards.test.ts +17 -0
- package/src/schemas/tests/section-cta.test.ts +41 -0
- package/src/schemas/tests/section-header.test.ts +31 -0
- package/src/schemas/tests/section-image.test.ts +24 -0
- package/src/schemas/tests/section-motion.test.ts +29 -0
- package/src/schemas/tests/section-shell.test.ts +42 -0
- package/src/schemas/tests/section-stats.test.ts +17 -0
- package/src/schemas/tests/site-background.test.ts +33 -0
- package/src/schemas/tests/standard-list-item.test.ts +16 -0
- 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 +54 -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/tests/article.test.ts +89 -0
- package/src/semantic/jsonld/tests/breadcrumb.test.ts +62 -0
- package/src/semantic/jsonld/tests/collection-list.test.ts +39 -0
- package/src/semantic/jsonld/tests/faq.test.ts +60 -0
- package/src/semantic/jsonld/tests/initiative.test.ts +56 -0
- package/src/semantic/jsonld/tests/organization.test.ts +123 -0
- package/src/semantic/jsonld/tests/person.test.ts +89 -0
- package/src/semantic/jsonld/tests/service.test.ts +65 -0
- package/src/semantic/jsonld/tests/shared.test.ts +41 -0
- package/src/semantic/jsonld/tests/video.test.ts +84 -0
- package/src/semantic/jsonld/tests/webpage.test.ts +93 -0
- package/src/semantic/jsonld/tests/website.test.ts +27 -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 +41 -3
- package/src/{share/semantic → semantic}/models.ts +27 -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/semantic/tests/ai.test.ts +55 -0
- package/src/semantic/tests/block-extraction.test.ts +34 -0
- package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
- package/src/semantic/tests/breadcrumbs.test.ts +127 -0
- package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
- package/src/semantic/tests/build-page.test.ts +122 -0
- package/src/semantic/tests/business-projection.test.ts +367 -0
- package/src/semantic/tests/canonical-uri.test.ts +56 -0
- package/src/semantic/tests/extract.test.ts +209 -0
- package/src/semantic/tests/feed.test.ts +113 -0
- package/src/semantic/tests/freshness.pbt.test.ts +108 -0
- package/src/semantic/tests/helpers.ts +32 -0
- package/src/semantic/tests/ids.test.ts +118 -0
- package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
- package/src/semantic/tests/image-sitemap.test.ts +109 -0
- 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/semantic/tests/jsonld.test.ts +61 -0
- package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
- package/src/semantic/tests/llms-policy.test.ts +60 -0
- package/src/semantic/tests/llms.test.ts +164 -0
- package/src/semantic/tests/markdown-hygiene.test.ts +72 -0
- package/src/semantic/tests/markdown-page.test.ts +97 -0
- package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
- package/src/semantic/tests/organization-profile.test.ts +107 -0
- package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
- package/src/semantic/tests/output-projection.test.ts +77 -0
- package/src/semantic/tests/page-markdown.test.ts +98 -0
- package/src/semantic/tests/page-utils.test.ts +88 -0
- package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
- package/src/semantic/tests/price-marker-resolver.test.ts +90 -0
- package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
- package/src/semantic/tests/robots.test.ts +70 -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/semantic/tests/update-stamp.test.ts +102 -0
- package/src/signing/index.ts +13 -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 +108 -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/content/index.ts +0 -16
- package/src/share/content-discipline/index.ts +0 -14
- package/src/share/index.ts +0 -86
- package/src/share/legal/index.ts +0 -1
- package/src/share/redirects.ts +0 -54
- package/src/share/scripts/index.ts +0 -26
- package/src/share/semantic/jsonld/shared.ts +0 -31
- package/src/share/semantic/jsonld/types.ts +0 -18
- 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 -36
- 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}/api-catalog.ts +0 -0
- /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}/index.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}/openapi.ts +0 -0
- /package/src/{share/agent → agent}/proof.ts +0 -0
- /package/src/{share/agent → agent}/search.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}/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}/language-redirect.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/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/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}/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
package/src/surface/blueprint.ts
CHANGED
|
@@ -12,11 +12,14 @@
|
|
|
12
12
|
</non-goals>
|
|
13
13
|
</MODULE_CONTRACT>
|
|
14
14
|
<CHANGE_SUMMARY>
|
|
15
|
-
<item>RFC-0192: Blueprint type + entry assembly (no block baking yet).</item>
|
|
16
15
|
<item>RFC-0199: resolveSlug/routesFor/assembleEntries/generateEntries take a LocalizedUniverse so URL segments localize per language while identity stays on the neutral tuple.</item>
|
|
17
16
|
<item>RFC-0496: add BlueprintServiceConfig + ServicePublicationGate for website-service depth-1 service dossier configuration; add BlueprintLinkingParent for cross-surface parent linking.</item>
|
|
18
17
|
<item>RFC-0497: add BlueprintIntersectionConfig + IntersectionGate + IntersectionSimilarity for website-local depth-5 intersection gate configuration.</item>
|
|
19
18
|
<item>RFC-0500: add BlueprintHubConfig for depth-0 editorial knowledge hub configuration; add BlueprintStatusGate for record status filtering.</item>
|
|
19
|
+
<item>RFC-1106: step 5 — merge blueprint triplet
|
|
20
|
+
|
|
21
|
+
surface/blueprint.ts now holds the blueprintSchema (sole declaration), all ~30 contract type names derived via z.infer, parseBlueprint, and the pure helpers. Deleted satellites blueprint-types.ts + blueprint-schema.ts, their package.json export entries, and the zero-consumer site shims (domain/surface/blueprint{,-types,-schema}.ts + 2 load-verification tests). All barrel consumers unchanged.</item>
|
|
22
|
+
<history>RFC-0192</history>
|
|
20
23
|
</CHANGE_SUMMARY>
|
|
21
24
|
*/
|
|
22
25
|
|
|
@@ -38,71 +41,344 @@ import type {
|
|
|
38
41
|
VirtualRouteEntry,
|
|
39
42
|
} from "./types.ts";
|
|
40
43
|
|
|
41
|
-
import
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
44
|
+
import { z } from "zod";
|
|
45
|
+
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Blueprint schema — RFC-1106: the sole declaration of the Blueprint contract.
|
|
48
|
+
// All Blueprint types below derive from blueprintSchema via z.infer; the former
|
|
49
|
+
// blueprint-types.ts / blueprint-schema.ts satellites are merged here.
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
const localizedString = z.record(z.string(), z.string());
|
|
53
|
+
|
|
54
|
+
const intRecord = z.record(z.string(), z.number().int());
|
|
55
|
+
|
|
56
|
+
// RFC-0490: pillar-hub configuration for depth-0 hub pages.
|
|
57
|
+
const pillarCtaSchema = z.object({
|
|
58
|
+
label: localizedString,
|
|
59
|
+
target: z.string().min(1),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const pillarHeroSchema = z.object({
|
|
63
|
+
eyebrow: localizedString,
|
|
64
|
+
heading: localizedString,
|
|
65
|
+
lead: localizedString,
|
|
66
|
+
primaryCta: pillarCtaSchema,
|
|
67
|
+
secondaryCta: pillarCtaSchema,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const pillarAdaptationDimensionSchema = z.object({
|
|
71
|
+
heading: localizedString,
|
|
72
|
+
body: localizedString,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const pillarAdaptationSchema = z.object({
|
|
76
|
+
heading: localizedString,
|
|
77
|
+
dimensions: z.array(pillarAdaptationDimensionSchema).min(1),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const pillarProductPriceSchema = z.object({
|
|
81
|
+
heading: localizedString,
|
|
82
|
+
body: localizedString,
|
|
83
|
+
priceRef: z.string().min(1).optional(),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const pillarFinalCtaSchema = z.object({
|
|
87
|
+
heading: localizedString,
|
|
88
|
+
body: localizedString,
|
|
89
|
+
primaryCta: pillarCtaSchema,
|
|
90
|
+
secondaryCta: pillarCtaSchema,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const pillarSchema = z.object({
|
|
94
|
+
hero: pillarHeroSchema,
|
|
95
|
+
adaptation: pillarAdaptationSchema,
|
|
96
|
+
productPrice: pillarProductPriceSchema,
|
|
97
|
+
finalCta: pillarFinalCtaSchema,
|
|
98
|
+
catalogHeading: localizedString.optional(),
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// RFC-0492: dossier configuration for depth-1 industry pages.
|
|
102
|
+
const industryPublicationGateSchema = z.object({
|
|
103
|
+
minServiceCategories: z.number().int().min(0),
|
|
104
|
+
minCustomerJourneys: z.number().int().min(0),
|
|
105
|
+
minTrustSignals: z.number().int().min(0),
|
|
106
|
+
minArchitectureEntries: z.number().int().min(0),
|
|
107
|
+
minModuleMappings: z.number().int().min(0),
|
|
108
|
+
minUniqueFaq: z.number().int().min(0),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const dossierSchema = z.object({
|
|
112
|
+
gate: industryPublicationGateSchema,
|
|
113
|
+
claimRestrictions: z.array(z.string().min(1)),
|
|
114
|
+
doorwayMaxFlaggedShare: z.number().min(0).max(1),
|
|
115
|
+
duplicateMaxSimilarity: z.number().min(0).max(1),
|
|
116
|
+
mode: z.enum(["warn", "fail"]),
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// RFC-0496: service configuration for depth-1 service dossier pages.
|
|
120
|
+
const servicePublicationGateSchema = z.object({
|
|
121
|
+
minServiceVariants: z.number().int().min(0),
|
|
122
|
+
minCustomerQuestions: z.number().int().min(0),
|
|
123
|
+
minPriceModels: z.number().int().min(0),
|
|
124
|
+
minFaq: z.number().int().min(0),
|
|
125
|
+
minPageStructure: z.number().int().min(0),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const serviceSchema = z.object({
|
|
129
|
+
gate: servicePublicationGateSchema,
|
|
130
|
+
claimRestrictions: z.array(z.string().min(1)),
|
|
131
|
+
mode: z.enum(["warn", "fail"]),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const intersectionGateSchema = z.object({
|
|
135
|
+
minLocalServiceQuestions: z.number().int().min(0),
|
|
136
|
+
minScenarios: z.number().int().min(0),
|
|
137
|
+
minLocalEvidence: z.number().int().min(0),
|
|
138
|
+
minUniqueContentBlocks: z.number().int().min(0),
|
|
139
|
+
minUniqueFaq: z.number().int().min(0),
|
|
140
|
+
minSources: z.number().int().min(0),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const intersectionSimilaritySchema = z.object({
|
|
144
|
+
similarityToIndustryPage: z.number().min(0).max(1),
|
|
145
|
+
similarityToCityPage: z.number().min(0).max(1),
|
|
146
|
+
similarityToServicePage: z.number().min(0).max(1),
|
|
147
|
+
similarityToOtherIntersections: z.number().min(0).max(1),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
const intersectionSchema = z.object({
|
|
151
|
+
gate: intersectionGateSchema,
|
|
152
|
+
similarity: intersectionSimilaritySchema,
|
|
153
|
+
substanceIndependenceThreshold: z.number().min(0).max(1),
|
|
154
|
+
mode: z.enum(["warn", "fail"]),
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// RFC-0500: hub configuration for depth-0 editorial knowledge hubs (ratgeber).
|
|
158
|
+
const hubSchema = z.object({
|
|
159
|
+
cardFields: z.array(z.string().min(1)).min(1),
|
|
160
|
+
reservedSlugs: z.array(z.string().min(1)),
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// RFC-0500: status gate — only records with allowed statuses are emitted as surface entries.
|
|
164
|
+
const statusGateSchema = z.object({
|
|
165
|
+
allowedStatuses: z.array(z.string().min(1)),
|
|
166
|
+
excludedStatuses: z.array(z.string().min(1)),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// RFC-0496: cross-surface parent linking.
|
|
170
|
+
const linkingParentSchema = z.object({
|
|
171
|
+
surface: z.string().min(1),
|
|
172
|
+
depth: z.number().int().min(0),
|
|
173
|
+
joinField: z.string().min(1),
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// RFC-0325: static article metadata for a level with no per-record binding (depth-0 hubs).
|
|
177
|
+
const blueprintLevelArticleSchema = z.object({
|
|
178
|
+
publishedAt: z.string().min(1),
|
|
179
|
+
updatedAt: z.string().min(1).optional(),
|
|
180
|
+
author: z.string().min(1).optional(),
|
|
181
|
+
tags: z.array(z.string().min(1)).optional(),
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const evidencePolicySchema = z.object({
|
|
185
|
+
approvedNarrative: z.enum(["required", "optional"]).optional(),
|
|
186
|
+
requiredRecordFields: z.array(z.string().min(1)).optional(),
|
|
187
|
+
preferredEvidenceSources: z.array(z.string().min(1)).optional(),
|
|
188
|
+
minTupleSpecificFacts: z.number().int().min(0).optional(),
|
|
189
|
+
minWerkEvidence: z.number().int().min(0).optional(),
|
|
190
|
+
existenceSource: z.enum(["records", "works"]).optional(),
|
|
191
|
+
freshness: z.enum(["valid-and-current", "valid"]).optional(),
|
|
192
|
+
duplicate: z
|
|
193
|
+
.object({
|
|
194
|
+
method: z.enum(["shingle", "simhash"]).optional(),
|
|
195
|
+
maxSimilarityWithinCluster: z.number().min(0).max(1).optional(),
|
|
196
|
+
})
|
|
197
|
+
.optional(),
|
|
198
|
+
leadImage: z.enum(["required", "warning", "optional"]).optional(),
|
|
199
|
+
mode: z.enum(["error", "warning"]).optional(),
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const demandPolicySchema = z.object({
|
|
203
|
+
minVolume: z.number().min(0).optional(),
|
|
204
|
+
allowIntents: z
|
|
205
|
+
.array(z.enum(["informational", "commercial", "transactional", "navigational"]))
|
|
206
|
+
.optional(),
|
|
207
|
+
missing: z.enum(["noindex", "do-not-emit"]).optional(),
|
|
208
|
+
staleAfterDays: z.number().int().min(0).optional(),
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
const depthRolePolicySchema = z.object({
|
|
212
|
+
indexability: z.enum(["index", "navigation-noindex", "evidence-gated"]),
|
|
213
|
+
canonicalTarget: z.union([z.literal("tradeHub"), z.number().int().min(0)]).optional(),
|
|
214
|
+
follow: z.boolean().optional(),
|
|
215
|
+
includeInSitemap: z.boolean().optional(),
|
|
216
|
+
geo: z.enum(["full", "twin-only", "off"]).optional(),
|
|
217
|
+
localEvidence: z
|
|
218
|
+
.object({
|
|
219
|
+
minVerifiedFacts: z.number().int().min(0).optional(),
|
|
220
|
+
minCitySpecificQa: z.number().int().min(0).optional(),
|
|
221
|
+
minUniqueTokenShare: z.number().min(0).max(1).optional(),
|
|
222
|
+
maxBodySimilarityWithinBranch: z.number().min(0).max(1).optional(),
|
|
223
|
+
})
|
|
224
|
+
.optional(),
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
export const blueprintSchema = z.object({
|
|
228
|
+
id: z.string().min(1),
|
|
229
|
+
entitlement: z.string().min(1),
|
|
230
|
+
dataset: z.object({ collection: z.string().min(1), status: z.string().optional() }),
|
|
231
|
+
axes: z
|
|
232
|
+
.array(
|
|
233
|
+
z.object({
|
|
234
|
+
id: z.string().min(1),
|
|
235
|
+
universe: z.union([
|
|
236
|
+
z.object({ collection: z.string().min(1), field: z.string().min(1) }),
|
|
237
|
+
z.object({ provider: z.string().min(1) }),
|
|
238
|
+
]),
|
|
239
|
+
match: z.object({ recordField: z.string().min(1) }),
|
|
240
|
+
}),
|
|
241
|
+
)
|
|
242
|
+
.min(1),
|
|
243
|
+
levels: z
|
|
244
|
+
.array(
|
|
245
|
+
z.object({
|
|
246
|
+
depth: z.number().int().min(0),
|
|
247
|
+
slug: localizedString,
|
|
248
|
+
redirectToPageId: z.string().min(1).optional(),
|
|
249
|
+
constellation: z.string().min(1),
|
|
250
|
+
geo: z.enum(["full", "twin-only", "off"]).optional(),
|
|
251
|
+
titleTemplate: localizedString.optional(),
|
|
252
|
+
descriptionTemplate: localizedString.optional(),
|
|
253
|
+
intro: localizedString.optional(),
|
|
254
|
+
semanticType: z.string().min(1).optional(),
|
|
255
|
+
article: blueprintLevelArticleSchema.optional(),
|
|
256
|
+
pillar: pillarSchema.optional(),
|
|
257
|
+
dossier: dossierSchema.optional(),
|
|
258
|
+
service: serviceSchema.optional(),
|
|
259
|
+
intersection: intersectionSchema.optional(),
|
|
260
|
+
hub: hubSchema.optional(),
|
|
261
|
+
}),
|
|
262
|
+
)
|
|
263
|
+
.min(1),
|
|
264
|
+
policy: z.object({
|
|
265
|
+
minRecordsPerDepth: intRecord,
|
|
266
|
+
noindexBelowPerDepth: intRecord.optional(),
|
|
267
|
+
redirectPolicy: z.enum(["nearest-ancestor", "root"]).optional(),
|
|
268
|
+
trailingSlash: z.boolean().optional(),
|
|
269
|
+
maxStubDepth: z.number().int().optional(),
|
|
270
|
+
substanceMin: z.number().min(0).max(100).optional(),
|
|
271
|
+
substanceMinPerDepth: intRecord.optional(),
|
|
272
|
+
evidencePerDepth: z.record(z.string(), evidencePolicySchema).optional(),
|
|
273
|
+
demandPerDepth: z.record(z.string(), demandPolicySchema).optional(),
|
|
274
|
+
depthRoles: z.record(z.string(), depthRolePolicySchema).optional(),
|
|
275
|
+
sitemapBudget: z.number().int().min(0).optional(),
|
|
276
|
+
maxThinShare: z.number().min(0).max(1).optional(),
|
|
277
|
+
regionalGateDepths: z.array(z.number().int().min(0)).optional(),
|
|
278
|
+
bake: z.enum(["inline", "lazy"]).optional(),
|
|
279
|
+
statusGate: statusGateSchema.optional(),
|
|
280
|
+
}),
|
|
281
|
+
linking: z
|
|
282
|
+
.object({
|
|
283
|
+
children: z.object({ limit: z.number().int() }).optional(),
|
|
284
|
+
siblings: z.object({ limit: z.number().int() }).optional(),
|
|
285
|
+
teasers: z
|
|
286
|
+
.object({
|
|
287
|
+
relevance: z.array(z.object({ sharedAxis: z.string(), weight: z.number() })).optional(),
|
|
288
|
+
})
|
|
289
|
+
.optional(),
|
|
290
|
+
parent: linkingParentSchema.optional(),
|
|
291
|
+
})
|
|
292
|
+
.optional(),
|
|
293
|
+
rotation: z.object({ variantsByTupleHash: z.boolean() }).optional(),
|
|
294
|
+
projection: z
|
|
295
|
+
.object({
|
|
296
|
+
title: localizedString.optional(),
|
|
297
|
+
description: z.union([localizedString, z.object({ ref: z.string() })]).optional(),
|
|
298
|
+
})
|
|
299
|
+
.optional(),
|
|
300
|
+
freshness: z
|
|
301
|
+
.object({
|
|
302
|
+
slaDaysPerDepth: intRecord,
|
|
303
|
+
field: z.string().min(1),
|
|
304
|
+
mode: z.enum(["any", "all", "median"]).optional(),
|
|
305
|
+
})
|
|
306
|
+
.optional(),
|
|
307
|
+
enrichedFields: z
|
|
308
|
+
.array(
|
|
309
|
+
z.object({
|
|
310
|
+
field: z.string().min(1),
|
|
311
|
+
promptId: z.string().min(1),
|
|
312
|
+
scopeDepth: z.number().int(),
|
|
313
|
+
maxTokens: z.number().int(),
|
|
314
|
+
// RFC-0207: output shape + generation granularity (both default to the original behavior).
|
|
315
|
+
kind: z.enum(["field", "narrative"]).optional(),
|
|
316
|
+
scope: z.enum(["tuple", "record"]).optional(),
|
|
317
|
+
axis: z.string().min(1).optional(),
|
|
318
|
+
}),
|
|
319
|
+
)
|
|
320
|
+
.optional(),
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// ---------------------------------------------------------------------------
|
|
324
|
+
// Derived contract types — every name the deleted blueprint-types.ts exported,
|
|
325
|
+
// now inferred from the schema above.
|
|
326
|
+
// ---------------------------------------------------------------------------
|
|
327
|
+
|
|
328
|
+
/** A localized string map: lang → value. */
|
|
329
|
+
export type LocalizedString = z.infer<typeof localizedString>;
|
|
330
|
+
|
|
331
|
+
export type Blueprint = z.infer<typeof blueprintSchema>;
|
|
332
|
+
export type BlueprintAxis = Blueprint["axes"][number];
|
|
333
|
+
export type BlueprintLevel = Blueprint["levels"][number];
|
|
334
|
+
export type BlueprintPolicy = Blueprint["policy"];
|
|
335
|
+
export type BlueprintLinking = NonNullable<Blueprint["linking"]>;
|
|
336
|
+
export type BlueprintProjection = NonNullable<Blueprint["projection"]>;
|
|
337
|
+
export type EnrichedFieldSpec = NonNullable<Blueprint["enrichedFields"]>[number];
|
|
338
|
+
|
|
339
|
+
export type GeoDepth = NonNullable<BlueprintLevel["geo"]>;
|
|
340
|
+
export type BlueprintLevelArticle = NonNullable<BlueprintLevel["article"]>;
|
|
341
|
+
export type BlueprintPillar = NonNullable<BlueprintLevel["pillar"]>;
|
|
342
|
+
export type BlueprintPillarHero = BlueprintPillar["hero"];
|
|
343
|
+
export type BlueprintPillarAdaptation = BlueprintPillar["adaptation"];
|
|
344
|
+
export type BlueprintPillarAdaptationDimension = BlueprintPillarAdaptation["dimensions"][number];
|
|
345
|
+
export type BlueprintPillarProductPrice = BlueprintPillar["productPrice"];
|
|
346
|
+
export type BlueprintPillarFinalCta = BlueprintPillar["finalCta"];
|
|
347
|
+
export type BlueprintDossier = NonNullable<BlueprintLevel["dossier"]>;
|
|
348
|
+
export type IndustryPublicationGate = BlueprintDossier["gate"];
|
|
349
|
+
export type BlueprintServiceConfig = NonNullable<BlueprintLevel["service"]>;
|
|
350
|
+
export type ServicePublicationGate = BlueprintServiceConfig["gate"];
|
|
351
|
+
export type BlueprintIntersectionConfig = NonNullable<BlueprintLevel["intersection"]>;
|
|
352
|
+
export type IntersectionGate = BlueprintIntersectionConfig["gate"];
|
|
353
|
+
export type IntersectionSimilarity = BlueprintIntersectionConfig["similarity"];
|
|
354
|
+
export type BlueprintHubConfig = NonNullable<BlueprintLevel["hub"]>;
|
|
355
|
+
|
|
356
|
+
export type BlueprintStatusGate = NonNullable<BlueprintPolicy["statusGate"]>;
|
|
357
|
+
export type BlueprintLinkingParent = NonNullable<BlueprintLinking["parent"]>;
|
|
358
|
+
export type BlueprintEvidenceDepthPolicy = NonNullable<BlueprintPolicy["evidencePerDepth"]>[string];
|
|
359
|
+
export type BlueprintDemandDepthPolicy = NonNullable<BlueprintPolicy["demandPerDepth"]>[string];
|
|
360
|
+
export type BlueprintDepthRolePolicy = NonNullable<BlueprintPolicy["depthRoles"]>[string];
|
|
361
|
+
export type BlueprintDuplicatePolicy = NonNullable<BlueprintEvidenceDepthPolicy["duplicate"]>;
|
|
362
|
+
|
|
363
|
+
export interface ParseBlueprintResult {
|
|
364
|
+
ok: boolean;
|
|
365
|
+
blueprint?: Blueprint;
|
|
366
|
+
errors: string[];
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/** Validate an unknown value (parsed YAML) into a typed Blueprint. */
|
|
370
|
+
export function parseBlueprint(value: unknown): ParseBlueprintResult {
|
|
371
|
+
const result = blueprintSchema.safeParse(value);
|
|
372
|
+
if (result.success) {
|
|
373
|
+
return { ok: true, blueprint: result.data, errors: [] };
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
ok: false,
|
|
377
|
+
errors: result.error.issues.map(
|
|
378
|
+
(issue) => `${issue.path.join(".") || "(root)"}: ${issue.message}`,
|
|
379
|
+
),
|
|
380
|
+
};
|
|
381
|
+
}
|
|
106
382
|
|
|
107
383
|
const DEFAULT_SEGMENT_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
108
384
|
|
|
@@ -13,7 +13,12 @@
|
|
|
13
13
|
</non-goals>
|
|
14
14
|
</MODULE_CONTRACT>
|
|
15
15
|
<CHANGE_SUMMARY>
|
|
16
|
-
<item>
|
|
16
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
17
|
+
|
|
18
|
+
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>
|
|
19
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
20
|
+
|
|
21
|
+
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>
|
|
17
22
|
</CHANGE_SUMMARY>
|
|
18
23
|
*/
|
|
19
24
|
|
package/src/surface/geo.ts
CHANGED
|
@@ -12,7 +12,12 @@
|
|
|
12
12
|
</MODULE_CONTRACT>
|
|
13
13
|
<CHANGE_SUMMARY>
|
|
14
14
|
<item>RFC-0195: initial GEO projection.</item>
|
|
15
|
-
<item>
|
|
15
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
16
|
+
|
|
17
|
+
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>
|
|
18
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
19
|
+
|
|
20
|
+
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>
|
|
16
21
|
</CHANGE_SUMMARY>
|
|
17
22
|
*/
|
|
18
23
|
|
package/src/surface/index.ts
CHANGED
|
@@ -6,14 +6,18 @@
|
|
|
6
6
|
</non-goals>
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
|
-
<item>RFC-0192: initial barrel.</item>
|
|
10
|
-
<item>RFC-0271: export SurfaceModuleContext schema, type, and ownership helpers.</item>
|
|
11
|
-
<item>RFC-0276: export Bordbuch event/status schemas and types.</item>
|
|
12
|
-
<item>RFC-0280/RFC-0281: export DemandSignal and WerkRecord schemas.</item>
|
|
13
|
-
<item>RFC-0278/RFC-0279/RFC-0285: export governance schemas and types.</item>
|
|
14
|
-
<item>RFC-0282/RFC-0283: export visibility and breaker schemas.</item>
|
|
15
9
|
<item>RFC-0284: export fleet Leitstand schemas and types.</item>
|
|
16
10
|
<item>RFC-0264 cleanup: root barrel delegates governance exports to the governance subpath.</item>
|
|
11
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
12
|
+
|
|
13
|
+
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>
|
|
14
|
+
<item>RFC-1097: sweep — tail packages clean
|
|
15
|
+
|
|
16
|
+
Sweep batch 3: rewrote ~95 purposes across werkstatt-knowledge, werkstatt-shared, godot-game, phaser-game, lifecycle-core, projektarchiv-*, portal-*, billing-*, typescript (CONTRACT-02/PURPOSE-02). Real KEY_DECISIONS on 5 godot utils, non-goals on 5 CONTRACT-03 files, headers on 4 headerless files, CS-07 history literal fix on 2 files. Policy: vitest.config.ts + test-fixtures testPatterns, worker-configuration.d.ts excludedPath. All non-site/engine packages now 0 diagnostics.</item>
|
|
17
|
+
<item>RFC-1106: step 5 — merge blueprint triplet
|
|
18
|
+
|
|
19
|
+
surface/blueprint.ts now holds the blueprintSchema (sole declaration), all ~30 contract type names derived via z.infer, parseBlueprint, and the pure helpers. Deleted satellites blueprint-types.ts + blueprint-schema.ts, their package.json export entries, and the zero-consumer site shims (domain/surface/blueprint{,-types,-schema}.ts + 2 load-verification tests). All barrel consumers unchanged.</item>
|
|
20
|
+
<history>RFC-0192, RFC-0271, RFC-0276, RFC-0278, RFC-0280, RFC-0282</history>
|
|
17
21
|
</CHANGE_SUMMARY>
|
|
18
22
|
*/
|
|
19
23
|
|
|
@@ -87,7 +91,7 @@ export {
|
|
|
87
91
|
type LocalizedString,
|
|
88
92
|
} from "./blueprint.ts";
|
|
89
93
|
|
|
90
|
-
export { blueprintSchema, parseBlueprint, type ParseBlueprintResult } from "./blueprint
|
|
94
|
+
export { blueprintSchema, parseBlueprint, type ParseBlueprintResult } from "./blueprint.ts";
|
|
91
95
|
|
|
92
96
|
// Governance and operational schema bags (RFC-0271..0285) — explicit re-exports.
|
|
93
97
|
export type {
|
package/src/surface/types.ts
CHANGED
|
@@ -46,7 +46,7 @@ export interface SurfaceRecordImage {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
* RFC-0192: a block in a baked page. Structurally compatible with `@warpgogol/werkstatt-shared/
|
|
49
|
+
* RFC-0192: a block in a baked page. Structurally compatible with `@warpgogol/werkstatt-shared/page` `BlockEntry`, but
|
|
50
50
|
* declared here so `@warpgogol/werkstatt-shared/surface` stays the lower-level package with no dependency on share
|
|
51
51
|
* (avoids a workspace cycle — share consumes surface's route types).
|
|
52
52
|
*/
|
|
@@ -60,7 +60,7 @@ export interface SurfaceBlock {
|
|
|
60
60
|
layer?: "shell" | "section";
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
/** RFC-0192: a baked block-declarative page. Structurally compatible with `@warpgogol/werkstatt-shared/
|
|
63
|
+
/** RFC-0192: a baked block-declarative page. Structurally compatible with `@warpgogol/werkstatt-shared/page` `PageEntry`. */
|
|
64
64
|
export interface PageEntry {
|
|
65
65
|
kind: "page";
|
|
66
66
|
cosmicStar: string;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>RFC-0921: Unit tests for the shared signing core — sign/verify round-trip, key generation, canonicalization.</purpose>
|
|
4
|
+
</MODULE_CONTRACT>
|
|
5
|
+
<CHANGE_SUMMARY>
|
|
6
|
+
<item>RFC-0921: initial signing core unit tests.</item>
|
|
7
|
+
</CHANGE_SUMMARY>
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect } from "vitest";
|
|
11
|
+
import {
|
|
12
|
+
generateKeyPair,
|
|
13
|
+
toHex,
|
|
14
|
+
fromHex,
|
|
15
|
+
toPem,
|
|
16
|
+
fromPem,
|
|
17
|
+
canonicalBytes,
|
|
18
|
+
signBytes,
|
|
19
|
+
verifyBytes,
|
|
20
|
+
sign,
|
|
21
|
+
verify,
|
|
22
|
+
} from "../signing/index.ts";
|
|
23
|
+
|
|
24
|
+
describe("signing core — key generation", () => {
|
|
25
|
+
it("generates a valid Ed25519 keypair (32-byte private + 32-byte public)", async () => {
|
|
26
|
+
const keyPair = await generateKeyPair();
|
|
27
|
+
expect(keyPair.privateKey).toBeInstanceOf(Uint8Array);
|
|
28
|
+
expect(keyPair.publicKey).toBeInstanceOf(Uint8Array);
|
|
29
|
+
expect(keyPair.privateKey.length).toBe(32);
|
|
30
|
+
expect(keyPair.publicKey.length).toBe(32);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("generates unique keypairs on each call", async () => {
|
|
34
|
+
const a = await generateKeyPair();
|
|
35
|
+
const b = await generateKeyPair();
|
|
36
|
+
expect(toHex(a.privateKey)).not.toBe(toHex(b.privateKey));
|
|
37
|
+
expect(toHex(a.publicKey)).not.toBe(toHex(b.publicKey));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe("signing core — encoding helpers", () => {
|
|
42
|
+
it("toHex / fromHex round-trip", () => {
|
|
43
|
+
const bytes = new Uint8Array([0, 1, 2, 255, 128, 64]);
|
|
44
|
+
const hex = toHex(bytes);
|
|
45
|
+
expect(hex).toBe("000102ff8040");
|
|
46
|
+
expect(fromHex(hex)).toEqual(bytes);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("toPem / fromPem round-trip for private key", () => {
|
|
50
|
+
const bytes = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
|
51
|
+
const pem = toPem(bytes, "private");
|
|
52
|
+
expect(pem).toContain("-----BEGIN" + " PRIVATE KEY-----");
|
|
53
|
+
expect(pem).toContain("-----END" + " PRIVATE KEY-----");
|
|
54
|
+
expect(fromPem(pem)).toEqual(bytes);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("toPem / fromPem round-trip for public key", () => {
|
|
58
|
+
const bytes = new Uint8Array([10, 20, 30, 40, 50, 60, 70, 80]);
|
|
59
|
+
const pem = toPem(bytes, "public");
|
|
60
|
+
expect(pem).toContain("-----BEGIN" + " PUBLIC KEY-----");
|
|
61
|
+
expect(pem).toContain("-----END" + " PUBLIC KEY-----");
|
|
62
|
+
expect(fromPem(pem)).toEqual(bytes);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe("signing core — sign/verify", () => {
|
|
67
|
+
it("sign and verify round-trip with payload", async () => {
|
|
68
|
+
const keyPair = await generateKeyPair();
|
|
69
|
+
const payload = { buildId: "test-123", signedAt: "2026-08-22T00:00:00Z", outputsDigest: "abc" };
|
|
70
|
+
const signature = await sign(keyPair.privateKey, payload);
|
|
71
|
+
expect(signature).toBeInstanceOf(Uint8Array);
|
|
72
|
+
expect(signature.length).toBe(64);
|
|
73
|
+
|
|
74
|
+
const valid = await verify(keyPair.publicKey, payload, signature);
|
|
75
|
+
expect(valid).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("verification fails with tampered payload", async () => {
|
|
79
|
+
const keyPair = await generateKeyPair();
|
|
80
|
+
const payload = { buildId: "test-123", signedAt: "2026-08-22" };
|
|
81
|
+
const signature = await sign(keyPair.privateKey, payload);
|
|
82
|
+
|
|
83
|
+
const tampered = { buildId: "tampered", signedAt: "2026-08-22" };
|
|
84
|
+
const valid = await verify(keyPair.publicKey, tampered, signature);
|
|
85
|
+
expect(valid).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("verification fails with wrong public key", async () => {
|
|
89
|
+
const keyPairA = await generateKeyPair();
|
|
90
|
+
const keyPairB = await generateKeyPair();
|
|
91
|
+
const payload = { test: "data" };
|
|
92
|
+
const signature = await sign(keyPairA.privateKey, payload);
|
|
93
|
+
|
|
94
|
+
const valid = await verify(keyPairB.publicKey, payload, signature);
|
|
95
|
+
expect(valid).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("signBytes / verifyBytes round-trip with raw message", async () => {
|
|
99
|
+
const keyPair = await generateKeyPair();
|
|
100
|
+
const message = new TextEncoder().encode("hello world");
|
|
101
|
+
const signature = await signBytes(keyPair.privateKey, message);
|
|
102
|
+
expect(signature.length).toBe(64);
|
|
103
|
+
|
|
104
|
+
const valid = await verifyBytes(keyPair.publicKey, message, signature);
|
|
105
|
+
expect(valid).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("verifyBytes returns false on invalid signature (not throw)", async () => {
|
|
109
|
+
const keyPair = await generateKeyPair();
|
|
110
|
+
const message = new TextEncoder().encode("test");
|
|
111
|
+
const badSignature = new Uint8Array(64);
|
|
112
|
+
const valid = await verifyBytes(keyPair.publicKey, message, badSignature);
|
|
113
|
+
expect(valid).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe("signing core — canonicalBytes", () => {
|
|
118
|
+
it("produces deterministic bytes regardless of key order", () => {
|
|
119
|
+
const a = canonicalBytes({ b: 2, a: 1, c: 3 });
|
|
120
|
+
const b = canonicalBytes({ a: 1, c: 3, b: 2 });
|
|
121
|
+
expect(a).toEqual(b);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("produces different bytes for different payloads", () => {
|
|
125
|
+
const a = canonicalBytes({ a: 1 });
|
|
126
|
+
const b = canonicalBytes({ a: 2 });
|
|
127
|
+
expect(a).not.toEqual(b);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
@@ -13,7 +13,12 @@ disagree on equality.
|
|
|
13
13
|
</non-goals>
|
|
14
14
|
</MODULE_CONTRACT>
|
|
15
15
|
<CHANGE_SUMMARY>
|
|
16
|
-
<item>
|
|
16
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
17
|
+
|
|
18
|
+
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>
|
|
19
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
20
|
+
|
|
21
|
+
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>
|
|
17
22
|
</CHANGE_SUMMARY>
|
|
18
23
|
*/
|
|
19
24
|
|