@warpgogol/werkstatt-shared 0.2.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/package.json +352 -0
- package/src/checks/index.ts +24 -0
- package/src/checks/lib/astro-site-url.ts +30 -0
- package/src/checks/lib/i18n.ts +30 -0
- package/src/checks/result-helpers.ts +102 -0
- package/src/checks/suppressions-config.ts +195 -0
- package/src/index.ts +14 -0
- package/src/integration/README.md +38 -0
- package/src/integration/adapters.ts +143 -0
- package/src/integration/crm-buffer.ts +491 -0
- package/src/integration/dispatch.ts +106 -0
- package/src/integration/funnel.ts +379 -0
- package/src/integration/index.ts +56 -0
- package/src/integration/lifecycle.ts +155 -0
- package/src/integration/orchestration.ts +439 -0
- package/src/integration/port-barrel.ts +124 -0
- package/src/integration/port.ts +143 -0
- package/src/integration/qstash.ts +134 -0
- package/src/integration/sharding.ts +133 -0
- package/src/integration/tests/deliver-event.test.ts +52 -0
- package/src/integration/tests/dispatch.test.ts +88 -0
- package/src/integration/tests/funnel-bridge.test.ts +46 -0
- package/src/integration/tests/hub-runtime.test.ts +128 -0
- package/src/integration/tests/lifecycle.test.ts +69 -0
- package/src/integration/tests/qstash.test.ts +83 -0
- package/src/integration/tests/sharding.test.ts +64 -0
- package/src/integration/vitest.config.ts +8 -0
- package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
- package/src/integration-adapter-supabase-crm/client.ts +605 -0
- package/src/integration-adapter-supabase-crm/index.ts +28 -0
- package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
- package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
- package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
- package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
- package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
- package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
- package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
- package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
- package/src/integration-adapter-supabase-crm/worker.ts +223 -0
- package/src/observability/conventions.ts +93 -0
- package/src/observability/env-resolver.ts +57 -0
- package/src/observability/index.ts +57 -0
- package/src/observability/metric-registry.ts +184 -0
- package/src/observability/otlp-converter.ts +125 -0
- package/src/observability/otlp-json.ts +135 -0
- package/src/observability/otlp-transport.ts +68 -0
- package/src/observability/pusher.ts +142 -0
- package/src/observability/redact.ts +27 -0
- package/src/observability/tests/conventions.test.ts +100 -0
- package/src/observability/tests/metric-registry.test.ts +117 -0
- package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
- package/src/observability/tests/otlp-converter.test.ts +157 -0
- package/src/observability/tests/otlp-json.test.ts +120 -0
- package/src/observability/tests/pusher.test.ts +75 -0
- package/src/observability/tests/redact.pbt.test.ts +71 -0
- package/src/observability/tests/redact.test.ts +37 -0
- package/src/observability/typed-refs.ts +137 -0
- package/src/observability/vitest.config.ts +8 -0
- package/src/ontology/analytics/matomo-binding.yaml +172 -0
- package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
- package/src/ontology/analytics/messkanon.yaml +151 -0
- package/src/ontology/archetype-registry.ts +61 -0
- package/src/ontology/archetypes/components/brand-label.yaml +19 -0
- package/src/ontology/archetypes/components/copyright.yaml +19 -0
- package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
- package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
- package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
- package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
- package/src/ontology/archetypes/components/layout.yaml +19 -0
- package/src/ontology/archetypes/components/live-photo.yaml +20 -0
- package/src/ontology/archetypes/components/material-credit.yaml +20 -0
- package/src/ontology/archetypes/components/media.yaml +21 -0
- package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
- package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
- package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
- package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
- package/src/ontology/archetypes/components/not-found.yaml +22 -0
- package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
- package/src/ontology/archetypes/components/passport-header.yaml +19 -0
- package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
- package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
- package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
- package/src/ontology/archetypes/components/person-profile.yaml +20 -0
- package/src/ontology/archetypes/components/pulsar.yaml +20 -0
- package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
- package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
- package/src/ontology/archetypes/components/social-meta.yaml +20 -0
- package/src/ontology/archetypes/components/structured-data.yaml +19 -0
- package/src/ontology/archetypes/index.json +1003 -0
- package/src/ontology/archetypes/index.yaml +821 -0
- package/src/ontology/archetypes/sections/approach.yaml +23 -0
- package/src/ontology/archetypes/sections/article-list.yaml +30 -0
- package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
- package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
- package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
- package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
- package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
- package/src/ontology/archetypes/sections/credits.yaml +29 -0
- package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
- package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
- package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
- package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
- package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
- package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
- package/src/ontology/archetypes/sections/hero.yaml +50 -0
- package/src/ontology/archetypes/sections/impact.yaml +23 -0
- package/src/ontology/archetypes/sections/markdown.yaml +43 -0
- package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
- package/src/ontology/archetypes/sections/navigation.yaml +20 -0
- package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
- package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
- package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
- package/src/ontology/archetypes/sections/people.yaml +48 -0
- package/src/ontology/archetypes/sections/price-card.yaml +50 -0
- package/src/ontology/archetypes/sections/problem.yaml +23 -0
- package/src/ontology/archetypes/sections/send-message.yaml +63 -0
- package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
- package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
- package/src/ontology/archetypes/sections/transparency.yaml +32 -0
- package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
- package/src/ontology/archetypes/sections/video-section.yaml +27 -0
- package/src/ontology/archetypes/sections/women.yaml +29 -0
- package/src/ontology/biome-token-projection.ts +229 -0
- package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
- package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
- package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
- package/src/ontology/blueprints/offer.yaml +39 -0
- package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
- package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
- package/src/ontology/blueprints/ratgeber.yaml +62 -0
- package/src/ontology/blueprints/website-local.yaml +309 -0
- package/src/ontology/blueprints/website-service.yaml +84 -0
- package/src/ontology/capabilities/lead.submit.yaml +44 -0
- package/src/ontology/cosmic/index.ts +48 -0
- package/src/ontology/cosmic/moon-catalog.ts +173 -0
- package/src/ontology/cosmic/planet-catalog.ts +82 -0
- package/src/ontology/cosmic/star-catalog.ts +337 -0
- package/src/ontology/enums.ts +159 -0
- package/src/ontology/external-surfaces/index.ts +158 -0
- package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
- package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
- package/src/ontology/external-surfaces/url-schema.yaml +95 -0
- package/src/ontology/growth/events/contact-email-click.yaml +21 -0
- package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
- package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
- package/src/ontology/growth/events/contact-route-click.yaml +21 -0
- package/src/ontology/growth/events/contact-submit.yaml +28 -0
- package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
- package/src/ontology/growth/events/cta-click.yaml +30 -0
- package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
- package/src/ontology/growth/events/donation-form-start.yaml +21 -0
- package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
- package/src/ontology/growth/events/donation-intent.yaml +29 -0
- package/src/ontology/growth/events/form-error.yaml +27 -0
- package/src/ontology/growth/events/form-start.yaml +21 -0
- package/src/ontology/growth/events/form-submit.yaml +21 -0
- package/src/ontology/growth/events/outbound-click.yaml +25 -0
- package/src/ontology/growth/events/page-view.yaml +24 -0
- package/src/ontology/growth/events/passport-view.yaml +28 -0
- package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
- package/src/ontology/index.ts +165 -0
- package/src/ontology/manifest.ts +344 -0
- package/src/ontology/operations/index.ts +1 -0
- package/src/ontology/schemas/biome.ts +303 -0
- package/src/ontology/schemas/capability.ts +104 -0
- package/src/ontology/schemas/constellation.ts +114 -0
- package/src/ontology/schemas/dns-records.ts +53 -0
- package/src/ontology/schemas/index.ts +95 -0
- package/src/ontology/schemas/manifest-resolver.ts +123 -0
- package/src/ontology/schemas/page-entry.ts +213 -0
- package/src/ontology/schemas/section-archetype.ts +109 -0
- package/src/ontology/schemas/site-family.ts +98 -0
- package/src/ontology/schemas/system/growth.ts +80 -0
- package/src/ontology/schemas/system/integrations.ts +143 -0
- package/src/ontology/schemas/system/manifest.ts +492 -0
- package/src/ontology/schemas/system/page-output.ts +99 -0
- package/src/ontology/schemas/system/release.ts +58 -0
- package/src/ontology/schemas/system/text.ts +58 -0
- package/src/ontology/schemas/system.ts +53 -0
- package/src/ontology/shared-section-props/body-fragments.ts +182 -0
- package/src/ontology/shared-section-props/catalog.ts +195 -0
- package/src/ontology/shared-section-props/common.ts +178 -0
- package/src/ontology/shared-section-props/index.ts +34 -0
- package/src/ontology/shared-section-props/visual-header.ts +163 -0
- package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
- package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
- package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
- package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
- package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
- package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
- package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
- package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
- package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
- package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
- package/src/ontology/tests/enums.test.ts +203 -0
- package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
- package/src/ontology/vitest.config.ts +8 -0
- package/src/passport/dht-sign.test.ts +99 -0
- package/src/passport/dht-sign.ts +73 -0
- package/src/passport/identity-sign.test.ts +134 -0
- package/src/passport/identity-sign.ts +85 -0
- package/src/passport/index.ts +53 -0
- package/src/passport/key-rotate.ts +133 -0
- package/src/passport/schema.ts +198 -0
- package/src/passport/sign.ts +225 -0
- package/src/passport/tests/schema.pbt.test.ts +93 -0
- package/src/passport/tests/schema.test.ts +222 -0
- package/src/passport/vitest.config.ts +8 -0
- package/src/share/agent/api-catalog.ts +77 -0
- package/src/share/agent/capability.ts +68 -0
- package/src/share/agent/dns-aid.test.ts +74 -0
- package/src/share/agent/dns-aid.ts +53 -0
- package/src/share/agent/fleet-catalog.ts +149 -0
- package/src/share/agent/index.ts +29 -0
- package/src/share/agent/knowledge.ts +96 -0
- package/src/share/agent/manifest.ts +126 -0
- package/src/share/agent/mcp-card.ts +63 -0
- package/src/share/agent/omit-empty.ts +77 -0
- package/src/share/agent/openapi.ts +157 -0
- package/src/share/agent/proof.ts +61 -0
- package/src/share/attribution-display.ts +86 -0
- package/src/share/check-hints.ts +38 -0
- package/src/share/content/entity-id.ts +65 -0
- package/src/share/content/index.ts +16 -0
- package/src/share/content/merge.ts +86 -0
- package/src/share/content/resolve-field-path.ts +39 -0
- package/src/share/content/substitute-deep.ts +47 -0
- package/src/share/content-discipline/index.ts +14 -0
- package/src/share/content-discipline/parsers.ts +66 -0
- package/src/share/content-discipline/types.ts +118 -0
- package/src/share/content-reference.ts +333 -0
- package/src/share/counter-utils.ts +75 -0
- package/src/share/css-value-normalize.ts +48 -0
- package/src/share/dev-props-validator.ts +131 -0
- package/src/share/entitlement.ts +172 -0
- package/src/share/env.d.ts +73 -0
- package/src/share/feature-policy.ts +367 -0
- package/src/share/formula-eval.ts +364 -0
- package/src/share/fs/index.ts +96 -0
- package/src/share/i18n/localization.ts +57 -0
- package/src/share/image-provider.ts +314 -0
- package/src/share/index.ts +86 -0
- package/src/share/knowledge/claim.ts +129 -0
- package/src/share/knowledge/derivation.ts +55 -0
- package/src/share/knowledge/freshness.ts +127 -0
- package/src/share/knowledge/index.ts +23 -0
- package/src/share/knowledge/ledger.ts +222 -0
- package/src/share/knowledge/plan.ts +122 -0
- package/src/share/knowledge/source.ts +170 -0
- package/src/share/legal/translation-policy.ts +133 -0
- package/src/share/material-credits.ts +181 -0
- package/src/share/middleware/language-redirect.ts +49 -0
- package/src/share/offer-capacity.ts +149 -0
- package/src/share/onboarding-yaml/index.ts +162 -0
- package/src/share/page.ts +351 -0
- package/src/share/redirects.test.ts +62 -0
- package/src/share/redirects.ts +54 -0
- package/src/share/rfc0042-utils.ts +95 -0
- package/src/share/runtime-context.ts +70 -0
- package/src/share/schemas/claim-records.ts +69 -0
- package/src/share/schemas/claims.ts +150 -0
- package/src/share/schemas/effects.ts +212 -0
- package/src/share/schemas/features.ts +147 -0
- package/src/share/schemas/horizontal-align.ts +22 -0
- package/src/share/schemas/icon-color.ts +27 -0
- package/src/share/schemas/index.ts +43 -0
- package/src/share/schemas/live-photo.ts +53 -0
- package/src/share/schemas/material-credit.ts +292 -0
- package/src/share/schemas/media.ts +220 -0
- package/src/share/schemas/navigation.ts +74 -0
- package/src/share/schemas/page-base.ts +33 -0
- package/src/share/schemas/participant.ts +247 -0
- package/src/share/schemas/person.ts +24 -0
- package/src/share/schemas/print.ts +93 -0
- package/src/share/schemas/section-background.ts +106 -0
- package/src/share/schemas/section-body.ts +138 -0
- package/src/share/schemas/section-cards.ts +37 -0
- package/src/share/schemas/section-cta.ts +74 -0
- package/src/share/schemas/section-header.ts +77 -0
- package/src/share/schemas/section-image.ts +77 -0
- package/src/share/schemas/section-motion.ts +52 -0
- package/src/share/schemas/section-shell.ts +63 -0
- package/src/share/schemas/section-stats.ts +37 -0
- package/src/share/schemas/site-background.ts +78 -0
- package/src/share/schemas/standard-list-item.ts +38 -0
- package/src/share/scripts/external-links.ts +45 -0
- package/src/share/scripts/gsap-counter.ts +168 -0
- package/src/share/scripts/gsap-mountain-journey.ts +236 -0
- package/src/share/scripts/gsap-parallax.ts +50 -0
- package/src/share/scripts/gsap-reveal.ts +65 -0
- package/src/share/scripts/gsap-stagger.ts +54 -0
- package/src/share/scripts/index.ts +25 -0
- package/src/share/scripts/inline-number-animation.ts +120 -0
- package/src/share/scripts/lenis.ts +109 -0
- package/src/share/scripts/live-photos.ts +250 -0
- package/src/share/scripts/lordicon.ts +94 -0
- package/src/share/scripts/orchestrator.ts +138 -0
- package/src/share/scripts/scheduler.ts +53 -0
- package/src/share/scripts/video-player.ts +116 -0
- package/src/share/semantic/ai.ts +140 -0
- package/src/share/semantic/block-extraction.ts +52 -0
- package/src/share/semantic/block-extractors/index.ts +502 -0
- package/src/share/semantic/breadcrumbs.ts +120 -0
- package/src/share/semantic/build-page.ts +309 -0
- package/src/share/semantic/business-projection.ts +278 -0
- package/src/share/semantic/derived-prices-loader.ts +36 -0
- package/src/share/semantic/extract.ts +118 -0
- package/src/share/semantic/feed.ts +124 -0
- package/src/share/semantic/ids.ts +76 -0
- package/src/share/semantic/image-sitemap.ts +153 -0
- package/src/share/semantic/index.ts +36 -0
- package/src/share/semantic/jsonld/article.ts +47 -0
- package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
- package/src/share/semantic/jsonld/collection-list.ts +30 -0
- package/src/share/semantic/jsonld/context.ts +46 -0
- package/src/share/semantic/jsonld/faq.ts +49 -0
- package/src/share/semantic/jsonld/initiative.ts +53 -0
- package/src/share/semantic/jsonld/organization.ts +101 -0
- package/src/share/semantic/jsonld/person.ts +71 -0
- package/src/share/semantic/jsonld/service.ts +80 -0
- package/src/share/semantic/jsonld/shared.ts +31 -0
- package/src/share/semantic/jsonld/types.ts +18 -0
- package/src/share/semantic/jsonld/webpage.ts +98 -0
- package/src/share/semantic/jsonld/website.ts +27 -0
- package/src/share/semantic/jsonld.ts +75 -0
- package/src/share/semantic/llms-policy.ts +74 -0
- package/src/share/semantic/llms.ts +394 -0
- package/src/share/semantic/markdown-hygiene.ts +68 -0
- package/src/share/semantic/markdown-twin-provenance.ts +242 -0
- package/src/share/semantic/models.ts +402 -0
- package/src/share/semantic/organization-profile.ts +160 -0
- package/src/share/semantic/output-projection.ts +131 -0
- package/src/share/semantic/page-builders/markdown-page.ts +84 -0
- package/src/share/semantic/page-markdown.ts +234 -0
- package/src/share/semantic/page-utils.ts +125 -0
- package/src/share/semantic/price-marker-resolver.ts +92 -0
- package/src/share/semantic/robots.ts +127 -0
- package/src/share/semantic/update-stamp.ts +136 -0
- package/src/share/shared-context.ts +177 -0
- package/src/share/string-utils.ts +19 -0
- package/src/share/tests/api-catalog.test.ts +97 -0
- package/src/share/tests/breadcrumbs.test.ts +126 -0
- package/src/share/tests/build-page-price-markers.test.ts +160 -0
- package/src/share/tests/capability.test.ts +107 -0
- package/src/share/tests/claim.test.ts +90 -0
- package/src/share/tests/content-ref-index.test.ts +328 -0
- package/src/share/tests/create-dev-props-validator.test.ts +38 -0
- package/src/share/tests/derivation.test.ts +39 -0
- package/src/share/tests/dev-props-validator.test.ts +88 -0
- package/src/share/tests/fleet-catalog.test.ts +134 -0
- package/src/share/tests/formula-eval.test.ts +619 -0
- package/src/share/tests/freshness.test.ts +60 -0
- package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
- package/src/share/tests/image-sitemap.test.ts +101 -0
- package/src/share/tests/jsonld-service.test.ts +282 -0
- package/src/share/tests/knowledge.test.ts +86 -0
- package/src/share/tests/ledger.test.ts +125 -0
- package/src/share/tests/llms-0789.test.ts +63 -0
- package/src/share/tests/manifest.test.ts +100 -0
- package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
- package/src/share/tests/mcp-card.test.ts +57 -0
- package/src/share/tests/onboarding-yaml.test.ts +111 -0
- package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
- package/src/share/tests/openapi.test.ts +116 -0
- package/src/share/tests/organization-jsonld.test.ts +74 -0
- package/src/share/tests/output-projection.test.ts +61 -0
- package/src/share/tests/plan.test.ts +97 -0
- package/src/share/tests/price-marker-resolver.test.ts +141 -0
- package/src/share/tests/proof.test.ts +72 -0
- package/src/share/tests/resolve-field-path.test.ts +52 -0
- package/src/share/tests/source.test.ts +81 -0
- package/src/share/tests/substitute-deep.test.ts +65 -0
- package/src/share/tests/text-normalize.pbt.test.ts +143 -0
- package/src/share/tests/text-normalize.test.ts +285 -0
- package/src/share/tests/twin-path.test.ts +43 -0
- package/src/share/text-normalize.ts +548 -0
- package/src/share/text-position.ts +19 -0
- package/src/share/types/hls-js-light.d.ts +16 -0
- package/src/share/visibility.ts +167 -0
- package/src/share/vitest.config.ts +8 -0
- package/src/share/wrap-inline-numbers.ts +139 -0
- package/src/surface/blueprint-schema.ts +314 -0
- package/src/surface/blueprint-types.ts +256 -0
- package/src/surface/blueprint.ts +300 -0
- package/src/surface/breaker.ts +57 -0
- package/src/surface/decision-composer.ts +156 -0
- package/src/surface/eligibility.ts +372 -0
- package/src/surface/evidence-records.ts +97 -0
- package/src/surface/fleet.ts +60 -0
- package/src/surface/geo.ts +170 -0
- package/src/surface/governance.ts +146 -0
- package/src/surface/index.ts +216 -0
- package/src/surface/io/index.ts +18 -0
- package/src/surface/io/surface-module-context-io.ts +60 -0
- package/src/surface/io/visibility-outcomes-io.ts +46 -0
- package/src/surface/module-context.ts +120 -0
- package/src/surface/substance.ts +161 -0
- package/src/surface/tests/eligibility.pbt.test.ts +137 -0
- package/src/surface/tests/eligibility.test.ts +302 -0
- package/src/surface/types.ts +289 -0
- package/src/surface/visibility.ts +57 -0
- package/src/surface/vitest.config.ts +8 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>
|
|
4
|
+
Closed-enum vocabulary for the Uni UI Ontology (RFC-0023, RFC-0024, DNA-17, DNA-19).
|
|
5
|
+
Exports four enums — SemanticRole, ComponentRole, Industry, Layer — as both Zod
|
|
6
|
+
enums (for runtime validation) and TypeScript types (for static typing).
|
|
7
|
+
</purpose>
|
|
8
|
+
<non-goals>
|
|
9
|
+
<item>Do not export business-shaped schemas or loader logic — those live in
|
|
10
|
+
@warpgogol/werkstatt-site/pbp (RFC-0024, RFC-0471).</item>
|
|
11
|
+
<item>Do not add new enum values without a superseding RFC (DNA-19).</item>
|
|
12
|
+
<item>Intent is intentionally NOT a closed enum; it lives in manifest.ts as
|
|
13
|
+
z.string() with a known-good list comment.</item>
|
|
14
|
+
</non-goals>
|
|
15
|
+
</MODULE_CONTRACT>
|
|
16
|
+
<CHANGE_SUMMARY>
|
|
17
|
+
<item>Initial creation as part of Wave 1 (RFC-0023 rollout).</item>
|
|
18
|
+
</CHANGE_SUMMARY>
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Layer
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Technical layer in the page hierarchy (DNA-17, DNA-8).
|
|
29
|
+
* Matches the physical folder layout: pages/ | sections/ | components/
|
|
30
|
+
*
|
|
31
|
+
* CLOSED — adding a value requires a superseding RFC (DNA-19).
|
|
32
|
+
*/
|
|
33
|
+
export const LayerValues = ["page", "section", "component"] as const;
|
|
34
|
+
export const layerSchema = z.enum(LayerValues);
|
|
35
|
+
export type Layer = z.infer<typeof layerSchema>;
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// SemanticRole (RFC-0084 — open, archetype-derived)
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The semantic role of a *section* (layer = "section").
|
|
43
|
+
*
|
|
44
|
+
* RFC-0084 retired the closed `SemanticRoleValues` enum that lived here. The
|
|
45
|
+
* authoritative source of valid section roles is now the section archetype
|
|
46
|
+
* catalog under `packages/werkstatt-site/src/domain/ontology/archetypes/sections/*.yaml`. Each
|
|
47
|
+
* archetype's `semanticRole` field contributes one valid value.
|
|
48
|
+
*
|
|
49
|
+
* - `sectionManifestSchema.role` is `z.string().min(1)` (open vocabulary).
|
|
50
|
+
* - `archetype.registry.build` writes the derived `sectionRoles[]` set to
|
|
51
|
+
* `packages/werkstatt-site/src/domain/ontology/archetypes/index.yaml`.
|
|
52
|
+
* - `archetype.registry.validate` cross-checks every section manifest's
|
|
53
|
+
* `role` against that set with a closest-match hint on miss.
|
|
54
|
+
*
|
|
55
|
+
* Use `SemanticRole` (typed as `string`) where the intent is "any section
|
|
56
|
+
* semantic role"; reach for the runtime catalog when a specific value list
|
|
57
|
+
* is needed. The static union has no point because the catalog grows.
|
|
58
|
+
*/
|
|
59
|
+
export type SemanticRole = string;
|
|
60
|
+
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// ComponentRole
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The role of a pure UI *component* (layer = "component").
|
|
67
|
+
* These are structural/chrome components that are not sections.
|
|
68
|
+
*
|
|
69
|
+
* CLOSED — adding a value requires a superseding RFC (DNA-19).
|
|
70
|
+
* RFC-0101..RFC-0106 expanded this enum with the canonical section framework
|
|
71
|
+
* primitives.
|
|
72
|
+
*
|
|
73
|
+
* Value | Meaning
|
|
74
|
+
* --------------- | -------------------------------------------------------------------
|
|
75
|
+
* header | Page-level header wrapper
|
|
76
|
+
* layout-shell | Page <head> and <body> skeleton wrapper
|
|
77
|
+
* breadcrumbs | Breadcrumb trail component
|
|
78
|
+
* footer | Page-level footer wrapper
|
|
79
|
+
* brand-label | Logo / brand wordmark display
|
|
80
|
+
* copyright | Copyright notice line
|
|
81
|
+
* lang-switcher | Language selector control
|
|
82
|
+
* footer-promo | Promotional block inside footer
|
|
83
|
+
* person-profile | Individual person card / author bio
|
|
84
|
+
* section-shell | [RFC-0101] Canonical section wrapper (background, effects, density, tone, motion)
|
|
85
|
+
* section-header | [RFC-0102] Number + tone-segmented heading + optional subheading
|
|
86
|
+
* section-body | [RFC-0103] Canonical body content (list/split-list/stats/cards/paragraphs/comparison/rich)
|
|
87
|
+
* section-cta | [RFC-0104] Single CTA / CTA group primitive
|
|
88
|
+
* section-image | [RFC-0104] Authored image primitive with fade masks
|
|
89
|
+
* site-background | [RFC-0105] Full-viewport background shell-layer component
|
|
90
|
+
* currency-selector | [RFC-0743] Currency selector dropdown for multi-currency sites
|
|
91
|
+
* price-display | [RFC-0743] Currency-aware price display with pre-rendered variants
|
|
92
|
+
* scroll-to-top | [RFC-0768] Floating scroll-to-top button with Lenis smooth scrolling
|
|
93
|
+
*/
|
|
94
|
+
export const ComponentRoleValues = [
|
|
95
|
+
"header",
|
|
96
|
+
"layout-shell",
|
|
97
|
+
"breadcrumbs",
|
|
98
|
+
"footer",
|
|
99
|
+
"brand-label",
|
|
100
|
+
"copyright",
|
|
101
|
+
"lang-switcher",
|
|
102
|
+
"footer-promo",
|
|
103
|
+
"person-profile",
|
|
104
|
+
"section-shell",
|
|
105
|
+
"section-header",
|
|
106
|
+
"section-body",
|
|
107
|
+
"section-cta",
|
|
108
|
+
"section-image",
|
|
109
|
+
"site-background",
|
|
110
|
+
"currency-selector",
|
|
111
|
+
"price-display",
|
|
112
|
+
"scroll-to-top",
|
|
113
|
+
] as const;
|
|
114
|
+
|
|
115
|
+
export const componentRoleSchema = z.enum(ComponentRoleValues);
|
|
116
|
+
export type ComponentRole = z.infer<typeof componentRoleSchema>;
|
|
117
|
+
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Industry
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Target industry verticals for the Warpgogol German market (RFC-0023).
|
|
124
|
+
*
|
|
125
|
+
* CLOSED — adding a value requires a superseding RFC (DNA-19).
|
|
126
|
+
*
|
|
127
|
+
* English identifier | German display label
|
|
128
|
+
* --------------------------- | ------------------------------------
|
|
129
|
+
* trades-and-construction | Handwerk & Bau
|
|
130
|
+
* local-services | Lokale Dienstleistungen
|
|
131
|
+
* consulting-and-coaching | Beratende Berufe
|
|
132
|
+
* legal-services | Recht & Kanzleien
|
|
133
|
+
* non-profit | Non-Profit & Vereine
|
|
134
|
+
* creative-studios | Kreative Branchen & Studios
|
|
135
|
+
*/
|
|
136
|
+
export const IndustryValues = [
|
|
137
|
+
"trades-and-construction",
|
|
138
|
+
"local-services",
|
|
139
|
+
"consulting-and-coaching",
|
|
140
|
+
"legal-services",
|
|
141
|
+
"non-profit",
|
|
142
|
+
"creative-studios",
|
|
143
|
+
] as const;
|
|
144
|
+
|
|
145
|
+
export const industrySchema = z.enum(IndustryValues);
|
|
146
|
+
export type Industry = z.infer<typeof industrySchema>;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* German display labels for Industry values, keyed by the English identifier.
|
|
150
|
+
* Use in UI dropdowns and documentation — not for content-layer comparisons.
|
|
151
|
+
*/
|
|
152
|
+
export const IndustryLabels: Record<Industry, string> = {
|
|
153
|
+
"trades-and-construction": "Handwerk & Bau",
|
|
154
|
+
"local-services": "Lokale Dienstleistungen",
|
|
155
|
+
"consulting-and-coaching": "Beratende Berufe",
|
|
156
|
+
"legal-services": "Recht & Kanzleien",
|
|
157
|
+
"non-profit": "Non-Profit & Vereine",
|
|
158
|
+
"creative-studios": "Kreative Branchen & Studios",
|
|
159
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>
|
|
4
|
+
RFC-0480: Declarative Layer C external-surface contracts — URL schema,
|
|
5
|
+
JSON-LD types, and sitemap shape. Consumed by `surface.contract.validate`
|
|
6
|
+
in @warpgogol/site-kernel-handoff and by contract tests in @warpgogol/werkstatt-shared/share.
|
|
7
|
+
</purpose>
|
|
8
|
+
<non-goals>
|
|
9
|
+
<item>Do not generate C-surfaces here — this module only declares the contract.</item>
|
|
10
|
+
<item>Do not import from @warpgogol/site-kernel-handoff or any app package.</item>
|
|
11
|
+
</non-goals>
|
|
12
|
+
</MODULE_CONTRACT>
|
|
13
|
+
<CHANGE_SUMMARY>
|
|
14
|
+
<item>RFC-0480: initial external-surfaces contracts (url-schema, jsonld-types, sitemap-shape).</item>
|
|
15
|
+
<item>RFC-0498: add surfacePolicy to jsonldTypesContract — per-depth required/prohibited JSON-LD types for surface pages.</item>
|
|
16
|
+
<item>RFC-0499: add mediaLeakagePolicy to jsonldTypesContract — prohibited strings, matching strategies, required labels for surface pages.</item>
|
|
17
|
+
</CHANGE_SUMMARY>
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
import { z } from "zod";
|
|
24
|
+
import { parse as parseYaml } from "yaml";
|
|
25
|
+
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Schema definitions
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
const routeParamSchema = z.object({
|
|
31
|
+
optional: z.boolean().optional(),
|
|
32
|
+
enum: z.array(z.string()).optional(),
|
|
33
|
+
type: z.string().optional(),
|
|
34
|
+
from: z.string().optional(),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const routePatternSchema = z.object({
|
|
38
|
+
pattern: z.string(),
|
|
39
|
+
params: z.record(z.string(), routeParamSchema).optional(),
|
|
40
|
+
generated: z.boolean(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const localePrefixSchema = z.object({
|
|
44
|
+
strategy: z.string(),
|
|
45
|
+
default: z.string(),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const urlSchemaContract = z.object({
|
|
49
|
+
routePatterns: z.array(routePatternSchema),
|
|
50
|
+
localePrefix: localePrefixSchema,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const jsonldTypeSchema = z.object({
|
|
54
|
+
"@type": z.string(),
|
|
55
|
+
required: z.array(z.string()),
|
|
56
|
+
optional: z.array(z.string()),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const surfacePolicyEntrySchema = z.object({
|
|
60
|
+
surface: z.string(),
|
|
61
|
+
depth: z.number(),
|
|
62
|
+
requiredTypes: z.array(z.string()),
|
|
63
|
+
prohibitedTypes: z.array(z.string()),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const mediaLeakageProhibitedStringSchema = z.object({
|
|
67
|
+
pattern: z.string(),
|
|
68
|
+
matchingStrategy: z.enum(["exact", "whole-word", "context-aware"]),
|
|
69
|
+
contextSelector: z.string().optional(),
|
|
70
|
+
reason: z.string(),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const mediaLeakageRequiredLabelSchema = z.object({
|
|
74
|
+
label: z.string(),
|
|
75
|
+
lang: z.string(),
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const mediaLeakagePolicySchema = z.object({
|
|
79
|
+
prohibitedStrings: z.array(mediaLeakageProhibitedStringSchema),
|
|
80
|
+
requiredLabels: z.array(mediaLeakageRequiredLabelSchema),
|
|
81
|
+
requiredLinkPattern: z.string(),
|
|
82
|
+
aiImageAttribute: z.string(),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const jsonldTypesContract = z.object({
|
|
86
|
+
types: z.array(jsonldTypeSchema),
|
|
87
|
+
surfacePolicy: z.array(surfacePolicyEntrySchema).optional(),
|
|
88
|
+
mediaLeakagePolicy: mediaLeakagePolicySchema.optional(),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const sitemapAlternatesSchema = z.object({
|
|
92
|
+
required: z.array(z.string()),
|
|
93
|
+
optional: z.array(z.string()),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const sitemapShapeContract = z.object({
|
|
97
|
+
urlEntry: z.object({
|
|
98
|
+
required: z.array(z.string()),
|
|
99
|
+
optional: z.array(z.string()),
|
|
100
|
+
}),
|
|
101
|
+
alternates: sitemapAlternatesSchema,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Contract loading
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
|
|
108
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
109
|
+
|
|
110
|
+
function loadYaml<T>(filename: string): T {
|
|
111
|
+
const filePath = path.join(__dirname, filename);
|
|
112
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
113
|
+
return parseYaml(raw) as T;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export type UrlSchemaContract = z.infer<typeof urlSchemaContract>;
|
|
117
|
+
export type JsonldTypesContract = z.infer<typeof jsonldTypesContract>;
|
|
118
|
+
export type SitemapShapeContract = z.infer<typeof sitemapShapeContract>;
|
|
119
|
+
export type JsonldSurfacePolicyEntry = z.infer<typeof surfacePolicyEntrySchema>;
|
|
120
|
+
export type MediaLeakageProhibitedString = z.infer<typeof mediaLeakageProhibitedStringSchema>;
|
|
121
|
+
export type MediaLeakageRequiredLabel = z.infer<typeof mediaLeakageRequiredLabelSchema>;
|
|
122
|
+
export type MediaLeakagePolicy = z.infer<typeof mediaLeakagePolicySchema>;
|
|
123
|
+
|
|
124
|
+
/** Parsed and validated URL schema contract. */
|
|
125
|
+
export const urlSchema: UrlSchemaContract = urlSchemaContract.parse(loadYaml("url-schema.yaml"));
|
|
126
|
+
|
|
127
|
+
/** Parsed and validated JSON-LD types contract. */
|
|
128
|
+
export const jsonldTypes: JsonldTypesContract = jsonldTypesContract.parse(
|
|
129
|
+
loadYaml("jsonld-types.yaml"),
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
/** Parsed and validated sitemap shape contract. */
|
|
133
|
+
export const sitemapShape: SitemapShapeContract = sitemapShapeContract.parse(
|
|
134
|
+
loadYaml("sitemap-shape.yaml"),
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Re-exports for consumers
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
|
|
141
|
+
export {
|
|
142
|
+
urlSchemaContract,
|
|
143
|
+
jsonldTypesContract,
|
|
144
|
+
sitemapShapeContract,
|
|
145
|
+
routePatternSchema,
|
|
146
|
+
jsonldTypeSchema,
|
|
147
|
+
surfacePolicyEntrySchema,
|
|
148
|
+
mediaLeakageProhibitedStringSchema,
|
|
149
|
+
mediaLeakageRequiredLabelSchema,
|
|
150
|
+
mediaLeakagePolicySchema,
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/** All declarative C-contract files in this directory. */
|
|
154
|
+
export const EXTERNAL_SURFACE_CONTRACT_FILES = [
|
|
155
|
+
"url-schema.yaml",
|
|
156
|
+
"jsonld-types.yaml",
|
|
157
|
+
"sitemap-shape.yaml",
|
|
158
|
+
] as const;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
types:
|
|
2
|
+
- "@type": LocalBusiness
|
|
3
|
+
required: [name, address, url]
|
|
4
|
+
optional: [telephone, openingHours, geo, image]
|
|
5
|
+
- "@type": Service
|
|
6
|
+
required: [name, provider]
|
|
7
|
+
optional: [serviceType, description, audience]
|
|
8
|
+
- "@type": BreadcrumbList
|
|
9
|
+
required: [itemListElement]
|
|
10
|
+
optional: []
|
|
11
|
+
- "@type": FAQPage
|
|
12
|
+
required: [mainEntity]
|
|
13
|
+
optional: []
|
|
14
|
+
- "@type": CollectionPage
|
|
15
|
+
required: [name, url]
|
|
16
|
+
optional: [hasPart, about, breadcrumb]
|
|
17
|
+
- "@type": Article
|
|
18
|
+
required: [headline, datePublished, author]
|
|
19
|
+
optional: [dateModified, image, articleBody, about, publisher, description, mainEntityOfPage]
|
|
20
|
+
# RFC-0512: Team profile page JSON-LD types
|
|
21
|
+
- "@type": Person
|
|
22
|
+
required: [name, url]
|
|
23
|
+
optional: [jobTitle, description, image, address, knowsAbout, sameAs, affiliation]
|
|
24
|
+
- "@type": SoftwareApplication
|
|
25
|
+
required: [name, applicationCategory, url]
|
|
26
|
+
optional: [description, operatingSystem, provider, offers]
|
|
27
|
+
# RFC-0530: Organization type for entity disambiguation (sameAs projection).
|
|
28
|
+
- "@type": Organization
|
|
29
|
+
required: [name, url]
|
|
30
|
+
optional:
|
|
31
|
+
[
|
|
32
|
+
legalName,
|
|
33
|
+
description,
|
|
34
|
+
foundingDate,
|
|
35
|
+
email,
|
|
36
|
+
address,
|
|
37
|
+
sameAs,
|
|
38
|
+
logo,
|
|
39
|
+
image,
|
|
40
|
+
contactPoint,
|
|
41
|
+
identifier,
|
|
42
|
+
founder,
|
|
43
|
+
member,
|
|
44
|
+
areaServed,
|
|
45
|
+
employee,
|
|
46
|
+
makesOffer,
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
# RFC-0498: Per-depth JSON-LD type policy for surface pages.
|
|
50
|
+
# Maps surface + depth to required and prohibited JSON-LD types.
|
|
51
|
+
surfacePolicy:
|
|
52
|
+
- surface: website-local
|
|
53
|
+
depth: 0
|
|
54
|
+
requiredTypes: [WebPage]
|
|
55
|
+
prohibitedTypes: [LocalBusiness, Service, Offer, BookAction]
|
|
56
|
+
- surface: website-local
|
|
57
|
+
depth: 1
|
|
58
|
+
requiredTypes: [WebPage, BreadcrumbList, Service]
|
|
59
|
+
prohibitedTypes: [LocalBusiness, Electrician, HairSalon, Offer, BookAction, PriceSpecification]
|
|
60
|
+
- surface: website-service
|
|
61
|
+
depth: 1
|
|
62
|
+
requiredTypes: [WebPage, BreadcrumbList, Service]
|
|
63
|
+
prohibitedTypes: [LocalBusiness, Electrician, HairSalon, Offer, BookAction, PriceSpecification]
|
|
64
|
+
- surface: website-local
|
|
65
|
+
depth: 2
|
|
66
|
+
requiredTypes: [WebPage, BreadcrumbList]
|
|
67
|
+
prohibitedTypes: [Service, LocalBusiness, Offer, BookAction]
|
|
68
|
+
- surface: website-local
|
|
69
|
+
depth: 3
|
|
70
|
+
requiredTypes: [WebPage, BreadcrumbList]
|
|
71
|
+
prohibitedTypes: [Service, LocalBusiness, Offer, BookAction]
|
|
72
|
+
- surface: website-local
|
|
73
|
+
depth: 4
|
|
74
|
+
requiredTypes: [WebPage, BreadcrumbList]
|
|
75
|
+
prohibitedTypes: [Service, LocalBusiness, Offer, BookAction]
|
|
76
|
+
- surface: website-local
|
|
77
|
+
depth: 5
|
|
78
|
+
requiredTypes: [WebPage, BreadcrumbList, Service]
|
|
79
|
+
prohibitedTypes: [LocalBusiness, Electrician, HairSalon, Offer, BookAction, PriceSpecification]
|
|
80
|
+
# RFC-0500: ratgeber editorial knowledge hub
|
|
81
|
+
- surface: ratgeber
|
|
82
|
+
depth: 0
|
|
83
|
+
requiredTypes: [CollectionPage, BreadcrumbList]
|
|
84
|
+
prohibitedTypes: [LocalBusiness, Service, Offer, BookAction, Article]
|
|
85
|
+
- surface: ratgeber
|
|
86
|
+
depth: 1
|
|
87
|
+
requiredTypes: [Article, BreadcrumbList]
|
|
88
|
+
prohibitedTypes: [LocalBusiness, Service, Offer, BookAction, CollectionPage, FAQPage]
|
|
89
|
+
# RFC-0512: Team hub and profile page surface policies
|
|
90
|
+
- surface: team-hub
|
|
91
|
+
depth: 0
|
|
92
|
+
requiredTypes: [CollectionPage, BreadcrumbList]
|
|
93
|
+
prohibitedTypes: [LocalBusiness, Service, Offer, BookAction, Article]
|
|
94
|
+
- surface: team-profile-human
|
|
95
|
+
depth: 0
|
|
96
|
+
requiredTypes: [ProfilePage, Person, BreadcrumbList]
|
|
97
|
+
prohibitedTypes: [LocalBusiness, Service, Offer, BookAction, SoftwareApplication]
|
|
98
|
+
- surface: team-profile-ai-agent
|
|
99
|
+
depth: 0
|
|
100
|
+
requiredTypes: [ProfilePage, SoftwareApplication, BreadcrumbList]
|
|
101
|
+
prohibitedTypes: [LocalBusiness, Service, Offer, BookAction, Person]
|
|
102
|
+
|
|
103
|
+
# RFC-0499: Media metadata leakage prevention policy for surface pages.
|
|
104
|
+
# Declares prohibited strings, matching strategies, and required labels.
|
|
105
|
+
# Enforced by surface.media-leakage.validate and surface.contract.validate.
|
|
106
|
+
mediaLeakagePolicy:
|
|
107
|
+
prohibitedStrings:
|
|
108
|
+
- pattern: "Gemini"
|
|
109
|
+
matchingStrategy: context-aware
|
|
110
|
+
contextSelector: "[data-credit-context], figcaption, details, dl"
|
|
111
|
+
reason: "AI model name is internal metadata, not visitor-facing"
|
|
112
|
+
- pattern: "AIPlatform"
|
|
113
|
+
matchingStrategy: whole-word
|
|
114
|
+
reason: "Internal enum value (CreditPartyKind)"
|
|
115
|
+
- pattern: "Organization"
|
|
116
|
+
matchingStrategy: context-aware
|
|
117
|
+
contextSelector: "[data-credit-context], figcaption, details, dl"
|
|
118
|
+
reason: "Internal enum value (CreditPartyKind) — only as media author label"
|
|
119
|
+
- pattern: "commissioned-warpgogol-material"
|
|
120
|
+
matchingStrategy: whole-word
|
|
121
|
+
reason: "Internal enum value (MaterialSourceType)"
|
|
122
|
+
- pattern: "linked-public-source"
|
|
123
|
+
matchingStrategy: whole-word
|
|
124
|
+
reason: "Internal enum value"
|
|
125
|
+
- pattern: "Copyright © 2026 Warpgogol"
|
|
126
|
+
matchingStrategy: exact
|
|
127
|
+
contextSelector: ":not(footer):not([data-footer])"
|
|
128
|
+
reason: "Repetitive copyright boilerplate — per-material usage status is on /bildnachweise/"
|
|
129
|
+
requiredLabels:
|
|
130
|
+
- label: "Konzeptillustration"
|
|
131
|
+
lang: de
|
|
132
|
+
- label: "Концептуальна ілюстрація"
|
|
133
|
+
lang: uk
|
|
134
|
+
requiredLinkPattern: "/bildnachweise/#"
|
|
135
|
+
aiImageAttribute: "data-ai-generated"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
routePatterns:
|
|
2
|
+
- pattern: "/:locale?/:slug"
|
|
3
|
+
params:
|
|
4
|
+
locale:
|
|
5
|
+
optional: true
|
|
6
|
+
enum: [de, en]
|
|
7
|
+
slug:
|
|
8
|
+
type: string
|
|
9
|
+
generated: false
|
|
10
|
+
- pattern: "/:locale?/:industry/:city"
|
|
11
|
+
params:
|
|
12
|
+
locale:
|
|
13
|
+
optional: true
|
|
14
|
+
enum: [de, en]
|
|
15
|
+
industry:
|
|
16
|
+
type: string
|
|
17
|
+
from: ontology.Industry
|
|
18
|
+
city:
|
|
19
|
+
type: string
|
|
20
|
+
generated: true
|
|
21
|
+
- pattern: "/:locale?/:industry/:city/:demand"
|
|
22
|
+
params:
|
|
23
|
+
locale:
|
|
24
|
+
optional: true
|
|
25
|
+
enum: [de, en]
|
|
26
|
+
industry:
|
|
27
|
+
type: string
|
|
28
|
+
from: ontology.Industry
|
|
29
|
+
city:
|
|
30
|
+
type: string
|
|
31
|
+
demand:
|
|
32
|
+
type: string
|
|
33
|
+
generated: true
|
|
34
|
+
- pattern: "/:locale?/:industry/:service"
|
|
35
|
+
params:
|
|
36
|
+
locale:
|
|
37
|
+
optional: true
|
|
38
|
+
enum: [de, en]
|
|
39
|
+
industry:
|
|
40
|
+
type: string
|
|
41
|
+
from: ontology.Industry
|
|
42
|
+
service:
|
|
43
|
+
type: string
|
|
44
|
+
generated: true
|
|
45
|
+
- pattern: "/:locale?/ratgeber/redaktion"
|
|
46
|
+
params:
|
|
47
|
+
locale:
|
|
48
|
+
optional: true
|
|
49
|
+
enum: [de, en]
|
|
50
|
+
generated: false
|
|
51
|
+
- pattern: "/:locale?/team"
|
|
52
|
+
params:
|
|
53
|
+
locale:
|
|
54
|
+
optional: true
|
|
55
|
+
enum: [de, en]
|
|
56
|
+
generated: false
|
|
57
|
+
- pattern: "/:locale?/komanda"
|
|
58
|
+
params:
|
|
59
|
+
locale:
|
|
60
|
+
optional: true
|
|
61
|
+
enum: [uk]
|
|
62
|
+
generated: false
|
|
63
|
+
- pattern: "/:locale?/team/ki-agenten/:agentSlug"
|
|
64
|
+
params:
|
|
65
|
+
locale:
|
|
66
|
+
optional: true
|
|
67
|
+
enum: [de, en]
|
|
68
|
+
agentSlug:
|
|
69
|
+
type: string
|
|
70
|
+
generated: true
|
|
71
|
+
- pattern: "/:locale?/komanda/ki-agenty/:agentSlug"
|
|
72
|
+
params:
|
|
73
|
+
locale:
|
|
74
|
+
optional: true
|
|
75
|
+
enum: [uk]
|
|
76
|
+
agentSlug:
|
|
77
|
+
type: string
|
|
78
|
+
generated: true
|
|
79
|
+
# RFC-0512: Team JSON endpoints (machine-readable profiles)
|
|
80
|
+
- pattern: "/team/profiles.json"
|
|
81
|
+
params: {}
|
|
82
|
+
generated: true
|
|
83
|
+
- pattern: "/team/:slug/profile.json"
|
|
84
|
+
params:
|
|
85
|
+
slug:
|
|
86
|
+
type: string
|
|
87
|
+
generated: true
|
|
88
|
+
- pattern: "/team/ki-agenten/:agentSlug/profile.json"
|
|
89
|
+
params:
|
|
90
|
+
agentSlug:
|
|
91
|
+
type: string
|
|
92
|
+
generated: true
|
|
93
|
+
localePrefix:
|
|
94
|
+
strategy: optional-prefix
|
|
95
|
+
default: de
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Event: contact.email_click
|
|
2
|
+
# RFC-0305 / Messkanon
|
|
3
|
+
|
|
4
|
+
id: contact.email_click
|
|
5
|
+
label: Contact Email Click
|
|
6
|
+
description: >
|
|
7
|
+
A visitor clicked an email contact affordance. Payload must identify only the
|
|
8
|
+
placement, not the email address or visitor.
|
|
9
|
+
|
|
10
|
+
category: contact
|
|
11
|
+
autoEmit: false
|
|
12
|
+
|
|
13
|
+
payload:
|
|
14
|
+
locale:
|
|
15
|
+
type: string
|
|
16
|
+
description: Active locale
|
|
17
|
+
required: true
|
|
18
|
+
placement:
|
|
19
|
+
type: string
|
|
20
|
+
description: Stable machine-readable UI placement
|
|
21
|
+
required: true
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Event: contact.form_submit
|
|
2
|
+
# RFC-0305 / Messkanon
|
|
3
|
+
|
|
4
|
+
id: contact.form_submit
|
|
5
|
+
label: Contact Form Submit
|
|
6
|
+
description: >
|
|
7
|
+
A visitor submitted a contact form successfully. Payload identifies only the
|
|
8
|
+
stable form id and coarse placement; it must not contain submitted values.
|
|
9
|
+
|
|
10
|
+
category: contact
|
|
11
|
+
autoEmit: false
|
|
12
|
+
|
|
13
|
+
payload:
|
|
14
|
+
locale:
|
|
15
|
+
type: string
|
|
16
|
+
description: Active locale
|
|
17
|
+
required: true
|
|
18
|
+
formId:
|
|
19
|
+
type: string
|
|
20
|
+
description: Stable machine-readable form id
|
|
21
|
+
required: true
|
|
22
|
+
placement:
|
|
23
|
+
type: string
|
|
24
|
+
description: Stable machine-readable UI placement
|
|
25
|
+
required: false
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Event: contact.phone_click
|
|
2
|
+
# RFC-0305 / Messkanon
|
|
3
|
+
|
|
4
|
+
id: contact.phone_click
|
|
5
|
+
label: Contact Phone Click
|
|
6
|
+
description: >
|
|
7
|
+
A visitor clicked a telephone contact affordance. Payload must identify only
|
|
8
|
+
the placement, not the phone number or visitor.
|
|
9
|
+
|
|
10
|
+
category: contact
|
|
11
|
+
autoEmit: false
|
|
12
|
+
|
|
13
|
+
payload:
|
|
14
|
+
locale:
|
|
15
|
+
type: string
|
|
16
|
+
description: Active locale
|
|
17
|
+
required: true
|
|
18
|
+
placement:
|
|
19
|
+
type: string
|
|
20
|
+
description: "Stable machine-readable UI placement, such as header or footer"
|
|
21
|
+
required: true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Event: contact.route_click
|
|
2
|
+
# RFC-0305 / Messkanon
|
|
3
|
+
|
|
4
|
+
id: contact.route_click
|
|
5
|
+
label: Contact Route Click
|
|
6
|
+
description: >
|
|
7
|
+
A visitor clicked a route or directions affordance. Payload must identify only
|
|
8
|
+
the placement, not the visitor location or route details.
|
|
9
|
+
|
|
10
|
+
category: contact
|
|
11
|
+
autoEmit: false
|
|
12
|
+
|
|
13
|
+
payload:
|
|
14
|
+
locale:
|
|
15
|
+
type: string
|
|
16
|
+
description: Active locale
|
|
17
|
+
required: true
|
|
18
|
+
placement:
|
|
19
|
+
type: string
|
|
20
|
+
description: Stable machine-readable UI placement
|
|
21
|
+
required: true
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Event: contact-submit
|
|
2
|
+
# DNA-27 / RFC-0027
|
|
3
|
+
|
|
4
|
+
id: contact-submit
|
|
5
|
+
label: Contact Form Submit
|
|
6
|
+
description: >
|
|
7
|
+
A visitor submitted the contact form. Bottom-of-funnel event for the contact
|
|
8
|
+
funnel. Emit only on successful client-side submission, not on server-side error.
|
|
9
|
+
Must not include PII in any payload field.
|
|
10
|
+
|
|
11
|
+
category: engagement
|
|
12
|
+
autoEmit: false
|
|
13
|
+
|
|
14
|
+
payload:
|
|
15
|
+
locale:
|
|
16
|
+
type: string
|
|
17
|
+
description: Active locale
|
|
18
|
+
required: true
|
|
19
|
+
formId:
|
|
20
|
+
type: string
|
|
21
|
+
description: Stable id of the contact form
|
|
22
|
+
required: true
|
|
23
|
+
subject:
|
|
24
|
+
type: string
|
|
25
|
+
description: >
|
|
26
|
+
Categorised subject (e.g. 'general', 'partnership', 'press').
|
|
27
|
+
Must be a machine-readable category, not free-text entered by the visitor.
|
|
28
|
+
required: false
|