@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.
Files changed (403) hide show
  1. package/package.json +352 -0
  2. package/src/checks/index.ts +24 -0
  3. package/src/checks/lib/astro-site-url.ts +30 -0
  4. package/src/checks/lib/i18n.ts +30 -0
  5. package/src/checks/result-helpers.ts +102 -0
  6. package/src/checks/suppressions-config.ts +195 -0
  7. package/src/index.ts +14 -0
  8. package/src/integration/README.md +38 -0
  9. package/src/integration/adapters.ts +143 -0
  10. package/src/integration/crm-buffer.ts +491 -0
  11. package/src/integration/dispatch.ts +106 -0
  12. package/src/integration/funnel.ts +379 -0
  13. package/src/integration/index.ts +56 -0
  14. package/src/integration/lifecycle.ts +155 -0
  15. package/src/integration/orchestration.ts +439 -0
  16. package/src/integration/port-barrel.ts +124 -0
  17. package/src/integration/port.ts +143 -0
  18. package/src/integration/qstash.ts +134 -0
  19. package/src/integration/sharding.ts +133 -0
  20. package/src/integration/tests/deliver-event.test.ts +52 -0
  21. package/src/integration/tests/dispatch.test.ts +88 -0
  22. package/src/integration/tests/funnel-bridge.test.ts +46 -0
  23. package/src/integration/tests/hub-runtime.test.ts +128 -0
  24. package/src/integration/tests/lifecycle.test.ts +69 -0
  25. package/src/integration/tests/qstash.test.ts +83 -0
  26. package/src/integration/tests/sharding.test.ts +64 -0
  27. package/src/integration/vitest.config.ts +8 -0
  28. package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
  29. package/src/integration-adapter-supabase-crm/client.ts +605 -0
  30. package/src/integration-adapter-supabase-crm/index.ts +28 -0
  31. package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
  32. package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
  33. package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
  34. package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
  35. package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
  36. package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
  37. package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
  38. package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
  39. package/src/integration-adapter-supabase-crm/worker.ts +223 -0
  40. package/src/observability/conventions.ts +93 -0
  41. package/src/observability/env-resolver.ts +57 -0
  42. package/src/observability/index.ts +57 -0
  43. package/src/observability/metric-registry.ts +184 -0
  44. package/src/observability/otlp-converter.ts +125 -0
  45. package/src/observability/otlp-json.ts +135 -0
  46. package/src/observability/otlp-transport.ts +68 -0
  47. package/src/observability/pusher.ts +142 -0
  48. package/src/observability/redact.ts +27 -0
  49. package/src/observability/tests/conventions.test.ts +100 -0
  50. package/src/observability/tests/metric-registry.test.ts +117 -0
  51. package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
  52. package/src/observability/tests/otlp-converter.test.ts +157 -0
  53. package/src/observability/tests/otlp-json.test.ts +120 -0
  54. package/src/observability/tests/pusher.test.ts +75 -0
  55. package/src/observability/tests/redact.pbt.test.ts +71 -0
  56. package/src/observability/tests/redact.test.ts +37 -0
  57. package/src/observability/typed-refs.ts +137 -0
  58. package/src/observability/vitest.config.ts +8 -0
  59. package/src/ontology/analytics/matomo-binding.yaml +172 -0
  60. package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
  61. package/src/ontology/analytics/messkanon.yaml +151 -0
  62. package/src/ontology/archetype-registry.ts +61 -0
  63. package/src/ontology/archetypes/components/brand-label.yaml +19 -0
  64. package/src/ontology/archetypes/components/copyright.yaml +19 -0
  65. package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
  66. package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
  67. package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
  68. package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
  69. package/src/ontology/archetypes/components/layout.yaml +19 -0
  70. package/src/ontology/archetypes/components/live-photo.yaml +20 -0
  71. package/src/ontology/archetypes/components/material-credit.yaml +20 -0
  72. package/src/ontology/archetypes/components/media.yaml +21 -0
  73. package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
  74. package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
  75. package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
  76. package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
  77. package/src/ontology/archetypes/components/not-found.yaml +22 -0
  78. package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
  79. package/src/ontology/archetypes/components/passport-header.yaml +19 -0
  80. package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
  81. package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
  82. package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
  83. package/src/ontology/archetypes/components/person-profile.yaml +20 -0
  84. package/src/ontology/archetypes/components/pulsar.yaml +20 -0
  85. package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
  86. package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
  87. package/src/ontology/archetypes/components/social-meta.yaml +20 -0
  88. package/src/ontology/archetypes/components/structured-data.yaml +19 -0
  89. package/src/ontology/archetypes/index.json +1003 -0
  90. package/src/ontology/archetypes/index.yaml +821 -0
  91. package/src/ontology/archetypes/sections/approach.yaml +23 -0
  92. package/src/ontology/archetypes/sections/article-list.yaml +30 -0
  93. package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
  94. package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
  95. package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
  96. package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
  97. package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
  98. package/src/ontology/archetypes/sections/credits.yaml +29 -0
  99. package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
  100. package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
  101. package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
  102. package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
  103. package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
  104. package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
  105. package/src/ontology/archetypes/sections/hero.yaml +50 -0
  106. package/src/ontology/archetypes/sections/impact.yaml +23 -0
  107. package/src/ontology/archetypes/sections/markdown.yaml +43 -0
  108. package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
  109. package/src/ontology/archetypes/sections/navigation.yaml +20 -0
  110. package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
  111. package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
  112. package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
  113. package/src/ontology/archetypes/sections/people.yaml +48 -0
  114. package/src/ontology/archetypes/sections/price-card.yaml +50 -0
  115. package/src/ontology/archetypes/sections/problem.yaml +23 -0
  116. package/src/ontology/archetypes/sections/send-message.yaml +63 -0
  117. package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
  118. package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
  119. package/src/ontology/archetypes/sections/transparency.yaml +32 -0
  120. package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
  121. package/src/ontology/archetypes/sections/video-section.yaml +27 -0
  122. package/src/ontology/archetypes/sections/women.yaml +29 -0
  123. package/src/ontology/biome-token-projection.ts +229 -0
  124. package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
  125. package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
  126. package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
  127. package/src/ontology/blueprints/offer.yaml +39 -0
  128. package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
  129. package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
  130. package/src/ontology/blueprints/ratgeber.yaml +62 -0
  131. package/src/ontology/blueprints/website-local.yaml +309 -0
  132. package/src/ontology/blueprints/website-service.yaml +84 -0
  133. package/src/ontology/capabilities/lead.submit.yaml +44 -0
  134. package/src/ontology/cosmic/index.ts +48 -0
  135. package/src/ontology/cosmic/moon-catalog.ts +173 -0
  136. package/src/ontology/cosmic/planet-catalog.ts +82 -0
  137. package/src/ontology/cosmic/star-catalog.ts +337 -0
  138. package/src/ontology/enums.ts +159 -0
  139. package/src/ontology/external-surfaces/index.ts +158 -0
  140. package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
  141. package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
  142. package/src/ontology/external-surfaces/url-schema.yaml +95 -0
  143. package/src/ontology/growth/events/contact-email-click.yaml +21 -0
  144. package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
  145. package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
  146. package/src/ontology/growth/events/contact-route-click.yaml +21 -0
  147. package/src/ontology/growth/events/contact-submit.yaml +28 -0
  148. package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
  149. package/src/ontology/growth/events/cta-click.yaml +30 -0
  150. package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
  151. package/src/ontology/growth/events/donation-form-start.yaml +21 -0
  152. package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
  153. package/src/ontology/growth/events/donation-intent.yaml +29 -0
  154. package/src/ontology/growth/events/form-error.yaml +27 -0
  155. package/src/ontology/growth/events/form-start.yaml +21 -0
  156. package/src/ontology/growth/events/form-submit.yaml +21 -0
  157. package/src/ontology/growth/events/outbound-click.yaml +25 -0
  158. package/src/ontology/growth/events/page-view.yaml +24 -0
  159. package/src/ontology/growth/events/passport-view.yaml +28 -0
  160. package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
  161. package/src/ontology/index.ts +165 -0
  162. package/src/ontology/manifest.ts +344 -0
  163. package/src/ontology/operations/index.ts +1 -0
  164. package/src/ontology/schemas/biome.ts +303 -0
  165. package/src/ontology/schemas/capability.ts +104 -0
  166. package/src/ontology/schemas/constellation.ts +114 -0
  167. package/src/ontology/schemas/dns-records.ts +53 -0
  168. package/src/ontology/schemas/index.ts +95 -0
  169. package/src/ontology/schemas/manifest-resolver.ts +123 -0
  170. package/src/ontology/schemas/page-entry.ts +213 -0
  171. package/src/ontology/schemas/section-archetype.ts +109 -0
  172. package/src/ontology/schemas/site-family.ts +98 -0
  173. package/src/ontology/schemas/system/growth.ts +80 -0
  174. package/src/ontology/schemas/system/integrations.ts +143 -0
  175. package/src/ontology/schemas/system/manifest.ts +492 -0
  176. package/src/ontology/schemas/system/page-output.ts +99 -0
  177. package/src/ontology/schemas/system/release.ts +58 -0
  178. package/src/ontology/schemas/system/text.ts +58 -0
  179. package/src/ontology/schemas/system.ts +53 -0
  180. package/src/ontology/shared-section-props/body-fragments.ts +182 -0
  181. package/src/ontology/shared-section-props/catalog.ts +195 -0
  182. package/src/ontology/shared-section-props/common.ts +178 -0
  183. package/src/ontology/shared-section-props/index.ts +34 -0
  184. package/src/ontology/shared-section-props/visual-header.ts +163 -0
  185. package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
  186. package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
  187. package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
  188. package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
  189. package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
  190. package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
  191. package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
  192. package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
  193. package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
  194. package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
  195. package/src/ontology/tests/enums.test.ts +203 -0
  196. package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
  197. package/src/ontology/vitest.config.ts +8 -0
  198. package/src/passport/dht-sign.test.ts +99 -0
  199. package/src/passport/dht-sign.ts +73 -0
  200. package/src/passport/identity-sign.test.ts +134 -0
  201. package/src/passport/identity-sign.ts +85 -0
  202. package/src/passport/index.ts +53 -0
  203. package/src/passport/key-rotate.ts +133 -0
  204. package/src/passport/schema.ts +198 -0
  205. package/src/passport/sign.ts +225 -0
  206. package/src/passport/tests/schema.pbt.test.ts +93 -0
  207. package/src/passport/tests/schema.test.ts +222 -0
  208. package/src/passport/vitest.config.ts +8 -0
  209. package/src/share/agent/api-catalog.ts +77 -0
  210. package/src/share/agent/capability.ts +68 -0
  211. package/src/share/agent/dns-aid.test.ts +74 -0
  212. package/src/share/agent/dns-aid.ts +53 -0
  213. package/src/share/agent/fleet-catalog.ts +149 -0
  214. package/src/share/agent/index.ts +29 -0
  215. package/src/share/agent/knowledge.ts +96 -0
  216. package/src/share/agent/manifest.ts +126 -0
  217. package/src/share/agent/mcp-card.ts +63 -0
  218. package/src/share/agent/omit-empty.ts +77 -0
  219. package/src/share/agent/openapi.ts +157 -0
  220. package/src/share/agent/proof.ts +61 -0
  221. package/src/share/attribution-display.ts +86 -0
  222. package/src/share/check-hints.ts +38 -0
  223. package/src/share/content/entity-id.ts +65 -0
  224. package/src/share/content/index.ts +16 -0
  225. package/src/share/content/merge.ts +86 -0
  226. package/src/share/content/resolve-field-path.ts +39 -0
  227. package/src/share/content/substitute-deep.ts +47 -0
  228. package/src/share/content-discipline/index.ts +14 -0
  229. package/src/share/content-discipline/parsers.ts +66 -0
  230. package/src/share/content-discipline/types.ts +118 -0
  231. package/src/share/content-reference.ts +333 -0
  232. package/src/share/counter-utils.ts +75 -0
  233. package/src/share/css-value-normalize.ts +48 -0
  234. package/src/share/dev-props-validator.ts +131 -0
  235. package/src/share/entitlement.ts +172 -0
  236. package/src/share/env.d.ts +73 -0
  237. package/src/share/feature-policy.ts +367 -0
  238. package/src/share/formula-eval.ts +364 -0
  239. package/src/share/fs/index.ts +96 -0
  240. package/src/share/i18n/localization.ts +57 -0
  241. package/src/share/image-provider.ts +314 -0
  242. package/src/share/index.ts +86 -0
  243. package/src/share/knowledge/claim.ts +129 -0
  244. package/src/share/knowledge/derivation.ts +55 -0
  245. package/src/share/knowledge/freshness.ts +127 -0
  246. package/src/share/knowledge/index.ts +23 -0
  247. package/src/share/knowledge/ledger.ts +222 -0
  248. package/src/share/knowledge/plan.ts +122 -0
  249. package/src/share/knowledge/source.ts +170 -0
  250. package/src/share/legal/translation-policy.ts +133 -0
  251. package/src/share/material-credits.ts +181 -0
  252. package/src/share/middleware/language-redirect.ts +49 -0
  253. package/src/share/offer-capacity.ts +149 -0
  254. package/src/share/onboarding-yaml/index.ts +162 -0
  255. package/src/share/page.ts +351 -0
  256. package/src/share/redirects.test.ts +62 -0
  257. package/src/share/redirects.ts +54 -0
  258. package/src/share/rfc0042-utils.ts +95 -0
  259. package/src/share/runtime-context.ts +70 -0
  260. package/src/share/schemas/claim-records.ts +69 -0
  261. package/src/share/schemas/claims.ts +150 -0
  262. package/src/share/schemas/effects.ts +212 -0
  263. package/src/share/schemas/features.ts +147 -0
  264. package/src/share/schemas/horizontal-align.ts +22 -0
  265. package/src/share/schemas/icon-color.ts +27 -0
  266. package/src/share/schemas/index.ts +43 -0
  267. package/src/share/schemas/live-photo.ts +53 -0
  268. package/src/share/schemas/material-credit.ts +292 -0
  269. package/src/share/schemas/media.ts +220 -0
  270. package/src/share/schemas/navigation.ts +74 -0
  271. package/src/share/schemas/page-base.ts +33 -0
  272. package/src/share/schemas/participant.ts +247 -0
  273. package/src/share/schemas/person.ts +24 -0
  274. package/src/share/schemas/print.ts +93 -0
  275. package/src/share/schemas/section-background.ts +106 -0
  276. package/src/share/schemas/section-body.ts +138 -0
  277. package/src/share/schemas/section-cards.ts +37 -0
  278. package/src/share/schemas/section-cta.ts +74 -0
  279. package/src/share/schemas/section-header.ts +77 -0
  280. package/src/share/schemas/section-image.ts +77 -0
  281. package/src/share/schemas/section-motion.ts +52 -0
  282. package/src/share/schemas/section-shell.ts +63 -0
  283. package/src/share/schemas/section-stats.ts +37 -0
  284. package/src/share/schemas/site-background.ts +78 -0
  285. package/src/share/schemas/standard-list-item.ts +38 -0
  286. package/src/share/scripts/external-links.ts +45 -0
  287. package/src/share/scripts/gsap-counter.ts +168 -0
  288. package/src/share/scripts/gsap-mountain-journey.ts +236 -0
  289. package/src/share/scripts/gsap-parallax.ts +50 -0
  290. package/src/share/scripts/gsap-reveal.ts +65 -0
  291. package/src/share/scripts/gsap-stagger.ts +54 -0
  292. package/src/share/scripts/index.ts +25 -0
  293. package/src/share/scripts/inline-number-animation.ts +120 -0
  294. package/src/share/scripts/lenis.ts +109 -0
  295. package/src/share/scripts/live-photos.ts +250 -0
  296. package/src/share/scripts/lordicon.ts +94 -0
  297. package/src/share/scripts/orchestrator.ts +138 -0
  298. package/src/share/scripts/scheduler.ts +53 -0
  299. package/src/share/scripts/video-player.ts +116 -0
  300. package/src/share/semantic/ai.ts +140 -0
  301. package/src/share/semantic/block-extraction.ts +52 -0
  302. package/src/share/semantic/block-extractors/index.ts +502 -0
  303. package/src/share/semantic/breadcrumbs.ts +120 -0
  304. package/src/share/semantic/build-page.ts +309 -0
  305. package/src/share/semantic/business-projection.ts +278 -0
  306. package/src/share/semantic/derived-prices-loader.ts +36 -0
  307. package/src/share/semantic/extract.ts +118 -0
  308. package/src/share/semantic/feed.ts +124 -0
  309. package/src/share/semantic/ids.ts +76 -0
  310. package/src/share/semantic/image-sitemap.ts +153 -0
  311. package/src/share/semantic/index.ts +36 -0
  312. package/src/share/semantic/jsonld/article.ts +47 -0
  313. package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
  314. package/src/share/semantic/jsonld/collection-list.ts +30 -0
  315. package/src/share/semantic/jsonld/context.ts +46 -0
  316. package/src/share/semantic/jsonld/faq.ts +49 -0
  317. package/src/share/semantic/jsonld/initiative.ts +53 -0
  318. package/src/share/semantic/jsonld/organization.ts +101 -0
  319. package/src/share/semantic/jsonld/person.ts +71 -0
  320. package/src/share/semantic/jsonld/service.ts +80 -0
  321. package/src/share/semantic/jsonld/shared.ts +31 -0
  322. package/src/share/semantic/jsonld/types.ts +18 -0
  323. package/src/share/semantic/jsonld/webpage.ts +98 -0
  324. package/src/share/semantic/jsonld/website.ts +27 -0
  325. package/src/share/semantic/jsonld.ts +75 -0
  326. package/src/share/semantic/llms-policy.ts +74 -0
  327. package/src/share/semantic/llms.ts +394 -0
  328. package/src/share/semantic/markdown-hygiene.ts +68 -0
  329. package/src/share/semantic/markdown-twin-provenance.ts +242 -0
  330. package/src/share/semantic/models.ts +402 -0
  331. package/src/share/semantic/organization-profile.ts +160 -0
  332. package/src/share/semantic/output-projection.ts +131 -0
  333. package/src/share/semantic/page-builders/markdown-page.ts +84 -0
  334. package/src/share/semantic/page-markdown.ts +234 -0
  335. package/src/share/semantic/page-utils.ts +125 -0
  336. package/src/share/semantic/price-marker-resolver.ts +92 -0
  337. package/src/share/semantic/robots.ts +127 -0
  338. package/src/share/semantic/update-stamp.ts +136 -0
  339. package/src/share/shared-context.ts +177 -0
  340. package/src/share/string-utils.ts +19 -0
  341. package/src/share/tests/api-catalog.test.ts +97 -0
  342. package/src/share/tests/breadcrumbs.test.ts +126 -0
  343. package/src/share/tests/build-page-price-markers.test.ts +160 -0
  344. package/src/share/tests/capability.test.ts +107 -0
  345. package/src/share/tests/claim.test.ts +90 -0
  346. package/src/share/tests/content-ref-index.test.ts +328 -0
  347. package/src/share/tests/create-dev-props-validator.test.ts +38 -0
  348. package/src/share/tests/derivation.test.ts +39 -0
  349. package/src/share/tests/dev-props-validator.test.ts +88 -0
  350. package/src/share/tests/fleet-catalog.test.ts +134 -0
  351. package/src/share/tests/formula-eval.test.ts +619 -0
  352. package/src/share/tests/freshness.test.ts +60 -0
  353. package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
  354. package/src/share/tests/image-sitemap.test.ts +101 -0
  355. package/src/share/tests/jsonld-service.test.ts +282 -0
  356. package/src/share/tests/knowledge.test.ts +86 -0
  357. package/src/share/tests/ledger.test.ts +125 -0
  358. package/src/share/tests/llms-0789.test.ts +63 -0
  359. package/src/share/tests/manifest.test.ts +100 -0
  360. package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
  361. package/src/share/tests/mcp-card.test.ts +57 -0
  362. package/src/share/tests/onboarding-yaml.test.ts +111 -0
  363. package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
  364. package/src/share/tests/openapi.test.ts +116 -0
  365. package/src/share/tests/organization-jsonld.test.ts +74 -0
  366. package/src/share/tests/output-projection.test.ts +61 -0
  367. package/src/share/tests/plan.test.ts +97 -0
  368. package/src/share/tests/price-marker-resolver.test.ts +141 -0
  369. package/src/share/tests/proof.test.ts +72 -0
  370. package/src/share/tests/resolve-field-path.test.ts +52 -0
  371. package/src/share/tests/source.test.ts +81 -0
  372. package/src/share/tests/substitute-deep.test.ts +65 -0
  373. package/src/share/tests/text-normalize.pbt.test.ts +143 -0
  374. package/src/share/tests/text-normalize.test.ts +285 -0
  375. package/src/share/tests/twin-path.test.ts +43 -0
  376. package/src/share/text-normalize.ts +548 -0
  377. package/src/share/text-position.ts +19 -0
  378. package/src/share/types/hls-js-light.d.ts +16 -0
  379. package/src/share/visibility.ts +167 -0
  380. package/src/share/vitest.config.ts +8 -0
  381. package/src/share/wrap-inline-numbers.ts +139 -0
  382. package/src/surface/blueprint-schema.ts +314 -0
  383. package/src/surface/blueprint-types.ts +256 -0
  384. package/src/surface/blueprint.ts +300 -0
  385. package/src/surface/breaker.ts +57 -0
  386. package/src/surface/decision-composer.ts +156 -0
  387. package/src/surface/eligibility.ts +372 -0
  388. package/src/surface/evidence-records.ts +97 -0
  389. package/src/surface/fleet.ts +60 -0
  390. package/src/surface/geo.ts +170 -0
  391. package/src/surface/governance.ts +146 -0
  392. package/src/surface/index.ts +216 -0
  393. package/src/surface/io/index.ts +18 -0
  394. package/src/surface/io/surface-module-context-io.ts +60 -0
  395. package/src/surface/io/visibility-outcomes-io.ts +46 -0
  396. package/src/surface/module-context.ts +120 -0
  397. package/src/surface/substance.ts +161 -0
  398. package/src/surface/tests/eligibility.pbt.test.ts +137 -0
  399. package/src/surface/tests/eligibility.test.ts +302 -0
  400. package/src/surface/types.ts +289 -0
  401. package/src/surface/visibility.ts +57 -0
  402. package/src/surface/vitest.config.ts +8 -0
  403. 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,6 @@
1
+ urlEntry:
2
+ required: [loc]
3
+ optional: [lastmod, changefreq, priority, alternates]
4
+ alternates:
5
+ required: [hreflang, href]
6
+ optional: []
@@ -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