@warpgogol/werkstatt-shared 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/README.md +31 -13
  2. package/README.uk.md +25 -15
  3. package/package.json +519 -762
  4. package/src/{share/agent → agent}/ard-catalog.ts +6 -1
  5. package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
  6. package/src/{share/agent → agent}/manifest.ts +15 -1
  7. package/src/{share/agent → agent}/search.ts +6 -1
  8. package/src/{share → agent}/tests/api-catalog.test.ts +2 -2
  9. package/src/{share → agent}/tests/ard-catalog.test.ts +2 -2
  10. package/src/{share → agent}/tests/capability.test.ts +1 -1
  11. package/src/{share → agent}/tests/fleet-catalog.test.ts +1 -1
  12. package/src/{share → agent}/tests/knowledge.test.ts +2 -2
  13. package/src/{share → agent}/tests/manifest.test.ts +1 -1
  14. package/src/{share → agent}/tests/mcp-card.test.ts +2 -2
  15. package/src/agent/tests/omit-empty.test.ts +33 -0
  16. package/src/{share → agent}/tests/openapi.test.ts +2 -2
  17. package/src/{share → agent}/tests/proof.test.ts +1 -1
  18. package/src/{share → attribution}/material-credits.ts +4 -4
  19. package/src/{share → checks}/check-hints.ts +6 -1
  20. package/src/checks/index.ts +4 -1
  21. package/src/checks/lib/astro-site-url.ts +6 -1
  22. package/src/checks/lib/i18n.ts +14 -0
  23. package/src/checks/result-helpers.ts +22 -5
  24. package/src/checks/tests/remediation-auto-populate.test.ts +83 -0
  25. package/src/{share → client-scripts}/counter-utils.ts +6 -2
  26. package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
  27. package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
  28. package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
  29. package/src/client-scripts/index.ts +35 -0
  30. package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
  31. package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
  32. package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
  33. package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
  34. package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
  35. package/src/client-scripts/scroll-spy.ts +106 -0
  36. package/src/client-scripts/tests/external-link-qr.test.ts +8 -0
  37. package/src/client-scripts/tests/external-links.test.ts +25 -0
  38. package/src/client-scripts/tests/gsap-counter.test.ts +8 -0
  39. package/src/client-scripts/tests/gsap-mountain-journey.test.ts +8 -0
  40. package/src/client-scripts/tests/gsap-parallax.test.ts +8 -0
  41. package/src/client-scripts/tests/gsap-reveal.test.ts +8 -0
  42. package/src/client-scripts/tests/gsap-stagger.test.ts +8 -0
  43. package/src/client-scripts/tests/inline-number-animation.test.ts +8 -0
  44. package/src/client-scripts/tests/lenis.test.ts +8 -0
  45. package/src/client-scripts/tests/live-photos.test.ts +8 -0
  46. package/src/client-scripts/tests/lordicon.test.ts +8 -0
  47. package/src/client-scripts/tests/orchestrator.test.ts +47 -0
  48. package/src/client-scripts/tests/scheduler.test.ts +23 -0
  49. package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
  50. package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
  51. package/src/component/contracts.ts +206 -0
  52. package/src/component/index.ts +11 -0
  53. package/src/{share → content}/content-reference.ts +3 -3
  54. package/src/{share/content → content}/entity-id.ts +6 -3
  55. package/src/content/index.ts +3 -0
  56. package/src/{share/content → content}/merge.ts +6 -1
  57. package/src/content/system-manifest.test.ts +107 -0
  58. package/src/content/system-manifest.ts +12 -94
  59. package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
  60. package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
  61. package/src/content-discipline/index.ts +19 -0
  62. package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
  63. package/src/{share/env.d.ts → env.d.ts} +6 -3
  64. package/src/fingerprint/canonical-json.ts +731 -0
  65. package/src/fingerprint/index.ts +12 -0
  66. package/src/fingerprint/primitives.ts +72 -0
  67. package/src/{share/i18n → i18n}/localization.ts +6 -2
  68. package/src/integration/adapters.ts +10 -71
  69. package/src/integration/dispatch.ts +1 -1
  70. package/src/integration/funnel.ts +6 -1
  71. package/src/integration/index.ts +101 -4
  72. package/src/integration/lagebild-destination-adapter.ts +108 -0
  73. package/src/integration/lagebild-ingress.ts +7 -12
  74. package/src/integration/orchestration.ts +11 -10
  75. package/src/integration/tests/deliver-event.test.ts +1 -1
  76. package/src/integration/tests/dispatch.test.ts +4 -4
  77. package/src/integration/tests/hub-runtime.test.ts +22 -14
  78. package/src/integration/vitest.config.ts +8 -0
  79. package/src/kernel/desired-state.ts +227 -0
  80. package/src/kernel/diagnostic.ts +289 -0
  81. package/src/kernel/fs-atomic.ts +131 -0
  82. package/src/kernel/index.ts +15 -0
  83. package/src/kernel/tests/fs-atomic.test.ts +150 -0
  84. package/src/kernel/tests/workspace-io.test.ts +187 -0
  85. package/src/kernel/types.ts +459 -0
  86. package/src/kernel/workspace-io.ts +248 -0
  87. package/src/{share → knowledge}/tests/claim.test.ts +1 -1
  88. package/src/{share → knowledge}/tests/derivation.test.ts +1 -1
  89. package/src/{share → knowledge}/tests/freshness.test.ts +1 -1
  90. package/src/{share → knowledge}/tests/ledger.test.ts +1 -1
  91. package/src/{share → knowledge}/tests/plan.test.ts +1 -1
  92. package/src/{share → knowledge}/tests/source.test.ts +1 -1
  93. package/src/legal/index.ts +15 -0
  94. package/src/{share/middleware → middleware}/access-protection.ts +8 -8
  95. package/src/{share → node}/dev-props-validator.ts +6 -1
  96. package/src/{share → node}/import-scan.ts +23 -3
  97. package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
  98. package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
  99. package/src/node/tests/derived-prices-loader.test.ts +59 -0
  100. package/src/node/tests/markdown-twin-provenance.test.ts +152 -0
  101. package/src/observability/env-resolver.ts +6 -1
  102. package/src/observability/index.ts +6 -1
  103. package/src/observability/otlp-converter.ts +6 -1
  104. package/src/observability/otlp-transport.ts +6 -1
  105. package/src/observability/pusher.ts +6 -1
  106. package/src/observability/redact.ts +6 -1
  107. package/src/observability/typed-refs.ts +6 -2
  108. package/src/observability/vitest.config.ts +1 -0
  109. package/src/{share → offers}/formula-eval.ts +3 -3
  110. package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
  111. package/src/onboarding/index.ts +1 -0
  112. package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
  113. package/src/ontology/archetype-registry.ts +6 -1
  114. package/src/ontology/archetypes/index.json +33 -1
  115. package/src/ontology/archetypes/index.yaml +27 -1
  116. package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
  117. package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
  118. package/src/ontology/biome-token-projection.ts +6 -1
  119. package/src/ontology/cosmic/index.ts +6 -1
  120. package/src/ontology/cosmic/moon-catalog.ts +6 -1
  121. package/src/ontology/cosmic/planet-catalog.ts +6 -1
  122. package/src/ontology/cosmic/star-catalog.ts +6 -1
  123. package/src/ontology/enums.ts +6 -1
  124. package/src/ontology/external-surfaces/index.ts +1 -1
  125. package/src/ontology/index.ts +6 -2
  126. package/src/ontology/manifest.ts +26 -4
  127. package/src/ontology/operations/artifact-store.ts +45 -0
  128. package/src/ontology/operations/dht.ts +98 -0
  129. package/src/ontology/operations/handoff.ts +92 -0
  130. package/src/ontology/operations/index.ts +187 -1
  131. package/src/ontology/operations/leitstand.ts +99 -0
  132. package/src/ontology/operations/materialization.ts +90 -0
  133. package/src/ontology/operations/mission.ts +111 -0
  134. package/src/ontology/operations/naming-policy.ts +132 -0
  135. package/src/ontology/operations/notausgang.ts +64 -0
  136. package/src/ontology/operations/release.ts +121 -0
  137. package/src/ontology/operations/sternsystem.ts +192 -0
  138. package/src/ontology/operations/werkstatt.ts +48 -0
  139. package/src/ontology/schemas/biome.ts +7 -2
  140. package/src/ontology/schemas/capability.ts +1 -1
  141. package/src/ontology/schemas/constellation.ts +6 -1
  142. package/src/ontology/schemas/index.ts +6 -2
  143. package/src/ontology/schemas/manifest-resolver.ts +6 -1
  144. package/src/ontology/schemas/page-entry.ts +9 -5
  145. package/src/ontology/schemas/system/growth.ts +6 -1
  146. package/src/ontology/schemas/system/manifest.ts +40 -1
  147. package/src/ontology/schemas/system/page-output.ts +7 -6
  148. package/src/ontology/schemas/system/tests/growth.test.ts +22 -0
  149. package/src/ontology/schemas/system/tests/integrations.test.ts +12 -0
  150. package/src/ontology/schemas/system/tests/manifest.test.ts +22 -0
  151. package/src/ontology/schemas/system/tests/page-output.test.ts +13 -0
  152. package/src/ontology/schemas/system/tests/release.test.ts +22 -0
  153. package/src/ontology/schemas/system/tests/text.test.ts +18 -0
  154. package/src/ontology/schemas/system/tests/verification.test.ts +12 -0
  155. package/src/ontology/schemas/system/text.ts +15 -0
  156. package/src/ontology/schemas/system.ts +6 -2
  157. package/src/ontology/schemas/tests/biome.test.ts +19 -0
  158. package/src/ontology/schemas/tests/capability.test.ts +22 -0
  159. package/src/ontology/schemas/tests/constellation.test.ts +22 -0
  160. package/src/ontology/schemas/tests/dns-records.test.ts +13 -0
  161. package/src/ontology/schemas/tests/manifest-resolver.test.ts +13 -0
  162. package/src/ontology/schemas/tests/page-entry.test.ts +22 -0
  163. package/src/ontology/schemas/tests/section-archetype.test.ts +12 -0
  164. package/src/ontology/schemas/tests/site-family.test.ts +18 -0
  165. package/src/ontology/schemas/tests/system.test.ts +20 -0
  166. package/src/ontology/shared-section-props/body-fragments.ts +2 -0
  167. package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
  168. package/src/ontology/vitest.config.ts +1 -0
  169. package/src/{share → page}/page.ts +13 -9
  170. package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
  171. package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
  172. package/src/passport/index.ts +6 -1
  173. package/src/passport/key-rotate.ts +10 -2
  174. package/src/passport/schema.ts +6 -1
  175. package/src/passport/sign.ts +8 -3
  176. package/src/passport/vitest.config.ts +1 -0
  177. package/src/pbt/index.test.ts +95 -0
  178. package/src/pbt/index.ts +251 -0
  179. package/src/plugin/plugin-contract.ts +1 -1
  180. package/src/{share → policy}/entitlement.ts +24 -4
  181. package/src/{share → policy}/feature-policy.ts +8 -3
  182. package/src/{share → policy}/visibility.ts +7 -2
  183. package/src/redirects/redirects.ts +117 -0
  184. package/src/{share → redirects/tests}/redirects.test.ts +1 -1
  185. package/src/remediation/remediation-catalog.ts +316 -0
  186. package/src/{share/routes → routes}/template-filter.ts +1 -1
  187. package/src/{share → runtime}/runtime-context.ts +7 -2
  188. package/src/{share → runtime}/shared-context.ts +1 -1
  189. package/src/{share/schemas → schemas}/claims.ts +2 -2
  190. package/src/{share/schemas → schemas}/effects.ts +6 -1
  191. package/src/{share/schemas → schemas}/features.ts +1 -1
  192. package/src/{share/schemas → schemas}/index.ts +3 -3
  193. package/src/{share/schemas → schemas}/navigation.ts +6 -1
  194. package/src/{share/schemas → schemas}/page-base.ts +6 -2
  195. package/src/{share/schemas → schemas}/person.ts +1 -1
  196. package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
  197. package/src/schemas/tests/claim-records.test.ts +52 -0
  198. package/src/schemas/tests/claims.test.ts +23 -0
  199. package/src/schemas/tests/effects.test.ts +116 -0
  200. package/src/schemas/tests/features.test.ts +61 -0
  201. package/src/schemas/tests/horizontal-align.test.ts +16 -0
  202. package/src/schemas/tests/icon-color.test.ts +16 -0
  203. package/src/schemas/tests/live-photo.test.ts +40 -0
  204. package/src/schemas/tests/material-credit.test.ts +51 -0
  205. package/src/schemas/tests/media.test.ts +26 -0
  206. package/src/schemas/tests/navigation.test.ts +58 -0
  207. package/src/schemas/tests/page-base.test.ts +19 -0
  208. package/src/schemas/tests/participant.test.ts +26 -0
  209. package/src/schemas/tests/person.test.ts +12 -0
  210. package/src/schemas/tests/print.test.ts +30 -0
  211. package/src/schemas/tests/section-background.test.ts +31 -0
  212. package/src/schemas/tests/section-body.test.ts +16 -0
  213. package/src/schemas/tests/section-cards.test.ts +17 -0
  214. package/src/schemas/tests/section-cta.test.ts +41 -0
  215. package/src/schemas/tests/section-header.test.ts +31 -0
  216. package/src/schemas/tests/section-image.test.ts +24 -0
  217. package/src/schemas/tests/section-motion.test.ts +29 -0
  218. package/src/schemas/tests/section-shell.test.ts +42 -0
  219. package/src/schemas/tests/section-stats.test.ts +17 -0
  220. package/src/schemas/tests/site-background.test.ts +33 -0
  221. package/src/schemas/tests/standard-list-item.test.ts +16 -0
  222. package/src/{share → sections}/rfc0042-utils.ts +1 -1
  223. package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
  224. package/src/{share/semantic → semantic}/business-projection.ts +95 -1
  225. package/src/semantic/canonical-uri.ts +54 -0
  226. package/src/{share/semantic → semantic}/extract.ts +100 -1
  227. package/src/semantic/fact-extraction.test.ts +47 -0
  228. package/src/semantic/fact-extraction.ts +46 -0
  229. package/src/semantic/freshness.ts +67 -0
  230. package/src/{share/semantic → semantic}/ids.ts +6 -1
  231. package/src/{share/semantic → semantic}/index.ts +9 -2
  232. package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
  233. package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
  234. package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
  235. package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
  236. package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
  237. package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
  238. package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
  239. package/src/semantic/jsonld/shared.ts +36 -0
  240. package/src/semantic/jsonld/tests/article.test.ts +89 -0
  241. package/src/semantic/jsonld/tests/breadcrumb.test.ts +62 -0
  242. package/src/semantic/jsonld/tests/collection-list.test.ts +39 -0
  243. package/src/semantic/jsonld/tests/faq.test.ts +60 -0
  244. package/src/semantic/jsonld/tests/initiative.test.ts +56 -0
  245. package/src/semantic/jsonld/tests/organization.test.ts +123 -0
  246. package/src/semantic/jsonld/tests/person.test.ts +89 -0
  247. package/src/semantic/jsonld/tests/service.test.ts +65 -0
  248. package/src/semantic/jsonld/tests/shared.test.ts +41 -0
  249. package/src/semantic/jsonld/tests/video.test.ts +84 -0
  250. package/src/semantic/jsonld/tests/webpage.test.ts +93 -0
  251. package/src/semantic/jsonld/tests/website.test.ts +27 -0
  252. package/src/semantic/jsonld/types.ts +24 -0
  253. package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
  254. package/src/semantic/jsonld/website.ts +32 -0
  255. package/src/{share/semantic → semantic}/jsonld.ts +6 -1
  256. package/src/{share/semantic → semantic}/llms.ts +41 -3
  257. package/src/{share/semantic → semantic}/models.ts +27 -38
  258. package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
  259. package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
  260. package/src/{share/semantic → semantic}/page-utils.ts +6 -3
  261. package/src/semantic/tests/ai.test.ts +55 -0
  262. package/src/semantic/tests/block-extraction.test.ts +34 -0
  263. package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
  264. package/src/semantic/tests/breadcrumbs.test.ts +127 -0
  265. package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
  266. package/src/semantic/tests/build-page.test.ts +122 -0
  267. package/src/semantic/tests/business-projection.test.ts +367 -0
  268. package/src/semantic/tests/canonical-uri.test.ts +56 -0
  269. package/src/semantic/tests/extract.test.ts +209 -0
  270. package/src/semantic/tests/feed.test.ts +113 -0
  271. package/src/semantic/tests/freshness.pbt.test.ts +108 -0
  272. package/src/semantic/tests/helpers.ts +32 -0
  273. package/src/semantic/tests/ids.test.ts +118 -0
  274. package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
  275. package/src/semantic/tests/image-sitemap.test.ts +109 -0
  276. package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
  277. package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
  278. package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
  279. package/src/semantic/tests/jsonld.test.ts +61 -0
  280. package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
  281. package/src/semantic/tests/llms-policy.test.ts +60 -0
  282. package/src/semantic/tests/llms.test.ts +164 -0
  283. package/src/semantic/tests/markdown-hygiene.test.ts +72 -0
  284. package/src/semantic/tests/markdown-page.test.ts +97 -0
  285. package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
  286. package/src/semantic/tests/organization-profile.test.ts +107 -0
  287. package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
  288. package/src/semantic/tests/output-projection.test.ts +77 -0
  289. package/src/semantic/tests/page-markdown.test.ts +98 -0
  290. package/src/semantic/tests/page-utils.test.ts +88 -0
  291. package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
  292. package/src/semantic/tests/price-marker-resolver.test.ts +90 -0
  293. package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
  294. package/src/semantic/tests/robots.test.ts +70 -0
  295. package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
  296. package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
  297. package/src/semantic/tests/update-stamp.test.ts +102 -0
  298. package/src/signing/index.ts +13 -0
  299. package/src/signing/key.ts +139 -0
  300. package/src/signing/sign.ts +66 -0
  301. package/src/signing/types.ts +29 -0
  302. package/src/{share/slug → slug}/slug-url.ts +4 -1
  303. package/src/stack/run-tool.ts +108 -0
  304. package/src/stack/stack-checks.ts +124 -0
  305. package/src/stack/tests/run-tool.test.ts +138 -0
  306. package/src/stack/tests/stack-checks.test.ts +141 -0
  307. package/src/stack/tests/walk-files.test.ts +131 -0
  308. package/src/stack/walk-files.ts +114 -0
  309. package/src/surface/blueprint.ts +342 -66
  310. package/src/surface/decision-composer.ts +6 -1
  311. package/src/surface/geo.ts +6 -1
  312. package/src/surface/index.ts +11 -7
  313. package/src/surface/types.ts +2 -2
  314. package/src/surface/vitest.config.ts +1 -0
  315. package/src/tests/signing-core.test.ts +129 -0
  316. package/src/{share → text}/css-value-normalize.ts +6 -1
  317. package/src/text/string-utils.ts +24 -0
  318. package/src/{share → text}/tests/text-normalize.test.ts +5 -0
  319. package/src/{share → text}/text-normalize.ts +4 -3
  320. package/src/{share → text}/wrap-inline-numbers.ts +1 -1
  321. package/src/types/axiom-study.d.ts +36 -0
  322. package/src/types/hls-js-light.d.ts +21 -0
  323. package/src/types/qrcode-browser.d.ts +23 -0
  324. package/src/typography/fix.pbt.test.ts +208 -0
  325. package/src/typography/fix.ts +148 -0
  326. package/src/typography/index.ts +54 -0
  327. package/src/typography/locale-defaults.ts +97 -0
  328. package/src/typography/rules-tier1.test.ts +459 -0
  329. package/src/typography/rules-tier1.ts +925 -0
  330. package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
  331. package/src/typography/rules-tier2-locale.test.ts +286 -0
  332. package/src/typography/rules-tier2-locale.ts +399 -0
  333. package/src/typography/rules-tier2-structure.test.ts +330 -0
  334. package/src/typography/rules-tier2-structure.ts +378 -0
  335. package/src/typography/rules-tier3-advisory.test.ts +290 -0
  336. package/src/typography/rules-tier3-advisory.ts +239 -0
  337. package/src/typography/text-surface.test.ts +244 -0
  338. package/src/typography/text-surface.ts +448 -0
  339. package/src/index.ts +0 -14
  340. package/src/integration/port-barrel.ts +0 -105
  341. package/src/share/content/index.ts +0 -16
  342. package/src/share/content-discipline/index.ts +0 -14
  343. package/src/share/index.ts +0 -86
  344. package/src/share/legal/index.ts +0 -1
  345. package/src/share/redirects.ts +0 -54
  346. package/src/share/scripts/index.ts +0 -26
  347. package/src/share/semantic/jsonld/shared.ts +0 -31
  348. package/src/share/semantic/jsonld/types.ts +0 -18
  349. package/src/share/semantic/jsonld/website.ts +0 -27
  350. package/src/share/string-utils.ts +0 -19
  351. package/src/share/types/axiom-study.d.ts +0 -22
  352. package/src/share/types/hls-js-light.d.ts +0 -16
  353. package/src/share/types/qrcode-browser.d.ts +0 -18
  354. package/src/share/utility-registry.yaml +0 -36
  355. package/src/share/vitest.config.ts +0 -8
  356. package/src/surface/blueprint-schema.ts +0 -314
  357. package/src/surface/blueprint-types.ts +0 -256
  358. /package/src/{share/agent → agent}/api-catalog.ts +0 -0
  359. /package/src/{share/agent → agent}/capability.ts +0 -0
  360. /package/src/{share/agent → agent}/dns-aid.ts +0 -0
  361. /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
  362. /package/src/{share/agent → agent}/index.ts +0 -0
  363. /package/src/{share/agent → agent}/knowledge.ts +0 -0
  364. /package/src/{share/agent → agent}/mcp-card.ts +0 -0
  365. /package/src/{share/agent → agent}/omit-empty.ts +0 -0
  366. /package/src/{share/agent → agent}/openapi.ts +0 -0
  367. /package/src/{share/agent → agent}/proof.ts +0 -0
  368. /package/src/{share/agent → agent}/search.test.ts +0 -0
  369. /package/src/{share → attribution}/attribution-display.ts +0 -0
  370. /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
  371. /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
  372. /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
  373. /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
  374. /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
  375. /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
  376. /package/src/{share/content → content}/resolve-field-path.ts +0 -0
  377. /package/src/{share/content → content}/substitute-deep.ts +0 -0
  378. /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
  379. /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
  380. /package/src/{share → image-provider}/image-provider.ts +0 -0
  381. /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
  382. /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
  383. /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
  384. /package/src/{share/knowledge → knowledge}/index.ts +0 -0
  385. /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
  386. /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
  387. /package/src/{share/knowledge → knowledge}/source.ts +0 -0
  388. /package/src/{share/legal → legal}/translation-policy.ts +0 -0
  389. /package/src/{share/middleware → middleware}/language-redirect.ts +0 -0
  390. /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
  391. /package/src/{share → node}/fs/index.ts +0 -0
  392. /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
  393. /package/src/{share → offers}/offer-capacity.ts +0 -0
  394. /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
  395. /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
  396. /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
  397. /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
  398. /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
  399. /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
  400. /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
  401. /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
  402. /package/src/{share/schemas → schemas}/media.ts +0 -0
  403. /package/src/{share/schemas → schemas}/participant.ts +0 -0
  404. /package/src/{share/schemas → schemas}/print.ts +0 -0
  405. /package/src/{share/schemas → schemas}/section-background.ts +0 -0
  406. /package/src/{share/schemas → schemas}/section-body.ts +0 -0
  407. /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
  408. /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
  409. /package/src/{share/schemas → schemas}/section-header.ts +0 -0
  410. /package/src/{share/schemas → schemas}/section-image.ts +0 -0
  411. /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
  412. /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
  413. /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
  414. /package/src/{share/schemas → schemas}/site-background.ts +0 -0
  415. /package/src/{share/semantic → semantic}/ai.ts +0 -0
  416. /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
  417. /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
  418. /package/src/{share/semantic → semantic}/build-page.ts +0 -0
  419. /package/src/{share/semantic → semantic}/feed.ts +0 -0
  420. /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
  421. /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
  422. /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
  423. /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
  424. /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
  425. /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
  426. /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
  427. /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
  428. /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
  429. /package/src/{share/semantic → semantic}/robots.ts +0 -0
  430. /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
  431. /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
  432. /package/src/{share/slug → slug}/index.ts +0 -0
  433. /package/src/{share/slug → slug}/slug-id.ts +0 -0
  434. /package/src/{share/slug → slug}/strategies.ts +0 -0
  435. /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
  436. /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
  437. /package/src/{share → text}/text-position.ts +0 -0
@@ -6,7 +6,36 @@
6
6
  <CHANGE_SUMMARY><item>RFC-0950: initial video-player tests.</item></CHANGE_SUMMARY>
7
7
  */
8
8
 
9
- import { test, expect, vi, beforeEach, afterEach } from "vitest";
9
+ import { test, expect, vi, beforeEach, afterEach, type Mock } from "vitest";
10
+
11
+ // ── Mock types ──────────────────────────────────────────────────────────────
12
+
13
+ interface MockVideo {
14
+ dataset: Record<string, string>;
15
+ canPlayType: ReturnType<typeof vi.fn>;
16
+ play: ReturnType<typeof vi.fn>;
17
+ pause: ReturnType<typeof vi.fn>;
18
+ load: ReturnType<typeof vi.fn>;
19
+ insertBefore: ReturnType<typeof vi.fn>;
20
+ firstChild: null;
21
+ }
22
+ interface MockHlsInstance {
23
+ loadSource: ReturnType<typeof vi.fn>;
24
+ attachMedia: ReturnType<typeof vi.fn>;
25
+ destroy: ReturnType<typeof vi.fn>;
26
+ on: Mock<(event: string, cb: () => void) => void>;
27
+ }
28
+ interface MockEntry {
29
+ isIntersecting: boolean;
30
+ target: MockVideo;
31
+ }
32
+ interface MockObserver {
33
+ unobserve: () => void;
34
+ }
35
+ interface MockDocument {
36
+ querySelectorAll: ReturnType<typeof vi.fn>;
37
+ createElement: ReturnType<typeof vi.fn>;
38
+ }
10
39
 
11
40
  // ── Mocks ───────────────────────────────────────────────────────────────────
12
41
 
@@ -15,7 +44,7 @@ vi.mock("plyr", () => ({
15
44
  }));
16
45
 
17
46
  vi.mock("hls.js/light", () => {
18
- const hlsRef = { current: null as any };
47
+ const hlsRef = { current: null as MockHlsInstance | null };
19
48
  const fn = vi.fn(function Hls() {
20
49
  return hlsRef.current;
21
50
  });
@@ -28,8 +57,8 @@ vi.mock("hls.js/light", () => {
28
57
 
29
58
  // ── Helpers ─────────────────────────────────────────────────────────────────
30
59
 
31
- function createMockVideo(attrs: Record<string, string | undefined> = {}): any {
32
- const video: any = {
60
+ function createMockVideo(attrs: Record<string, string | undefined> = {}): MockVideo {
61
+ const video: MockVideo = {
33
62
  dataset: {},
34
63
  canPlayType: vi.fn(() => ""),
35
64
  play: vi.fn(() => Promise.resolve()),
@@ -44,23 +73,15 @@ function createMockVideo(attrs: Record<string, string | undefined> = {}): any {
44
73
  return video;
45
74
  }
46
75
 
47
- let observerCallbacks: ((
48
- entries: { isIntersecting: boolean; target: any }[],
49
- obs: { unobserve: () => void },
50
- ) => void)[] = [];
76
+ let observerCallbacks: ((entries: MockEntry[], obs: MockObserver) => void)[] = [];
51
77
  let observerOptions: { threshold?: number; rootMargin?: string }[] = [];
78
+ let mockDocument: MockDocument;
52
79
 
53
80
  class MockIntersectionObserver {
54
- callback: (
55
- entries: { isIntersecting: boolean; target: any }[],
56
- obs: { unobserve: () => void },
57
- ) => void;
81
+ callback: (entries: MockEntry[], obs: MockObserver) => void;
58
82
  options: { threshold?: number; rootMargin?: string };
59
83
  constructor(
60
- cb: (
61
- entries: { isIntersecting: boolean; target: any }[],
62
- obs: { unobserve: () => void },
63
- ) => void,
84
+ cb: (entries: MockEntry[], obs: MockObserver) => void,
64
85
  opts: { threshold?: number; rootMargin?: string },
65
86
  ) {
66
87
  this.callback = cb;
@@ -79,24 +100,23 @@ beforeEach(() => {
79
100
  vi.clearAllMocks();
80
101
  observerCallbacks = [];
81
102
  observerOptions = [];
82
- (globalThis as any).IntersectionObserver = MockIntersectionObserver;
83
- (globalThis as any).window = globalThis;
84
- (globalThis as any).document = {
103
+ mockDocument = {
85
104
  querySelectorAll: vi.fn(() => []),
86
105
  createElement: vi.fn((tag: string) => ({ tagName: tag.toUpperCase() })),
87
106
  };
107
+ vi.stubGlobal("IntersectionObserver", MockIntersectionObserver);
108
+ vi.stubGlobal("window", globalThis);
109
+ vi.stubGlobal("document", mockDocument);
88
110
  });
89
111
 
90
112
  afterEach(() => {
91
- delete (globalThis as any).IntersectionObserver;
92
- delete (globalThis as any).window;
93
- delete (globalThis as any).document;
113
+ vi.unstubAllGlobals();
94
114
  vi.restoreAllMocks();
95
115
  });
96
116
 
97
- async function triggerUpgrade(video: any): Promise<void> {
98
- const { initVideoPlayers } = await import("../scripts/video-player.ts");
99
- vi.spyOn(globalThis.document as any, "querySelectorAll").mockReturnValue([video]);
117
+ async function triggerUpgrade(video: MockVideo): Promise<void> {
118
+ const { initVideoPlayers } = await import("../video-player.ts");
119
+ mockDocument.querySelectorAll.mockReturnValue([video]);
100
120
  await initVideoPlayers();
101
121
 
102
122
  expect(observerCallbacks.length).toBeGreaterThanOrEqual(1);
@@ -107,12 +127,10 @@ async function triggerUpgrade(video: any): Promise<void> {
107
127
  // ── Tests ───────────────────────────────────────────────────────────────────
108
128
 
109
129
  test("initVideoPlayers: returns early when no [data-video-player] elements", async () => {
110
- const querySelectorAll = vi.spyOn(globalThis.document as any, "querySelectorAll");
111
- querySelectorAll.mockReturnValue([]);
112
- const { initVideoPlayers } = await import("../scripts/video-player.ts");
130
+ mockDocument.querySelectorAll.mockReturnValue([]);
131
+ const { initVideoPlayers } = await import("../video-player.ts");
113
132
  await initVideoPlayers();
114
133
  expect(observerCallbacks.length).toBe(0);
115
- querySelectorAll.mockRestore();
116
134
  });
117
135
 
118
136
  test("upgrade: data-controls='false' configures Plyr with only ['mute']", async () => {
@@ -165,7 +183,9 @@ test("upgrade: data-autoplay='true' with HLS waits for MEDIA_ATTACHED before pla
165
183
  destroy: vi.fn(),
166
184
  on: vi.fn(),
167
185
  };
168
- const Hls = (await import("hls.js/light")).default as any;
186
+ const Hls = (await import("hls.js/light")).default as unknown as {
187
+ _hlsRef: { current: MockHlsInstance | null };
188
+ };
169
189
  Hls._hlsRef.current = hlsInstance;
170
190
 
171
191
  await triggerUpgrade(video);
@@ -173,7 +193,7 @@ test("upgrade: data-autoplay='true' with HLS waits for MEDIA_ATTACHED before pla
173
193
  expect(Hls).toHaveBeenCalled();
174
194
  expect(hlsInstance.attachMedia).toHaveBeenCalledWith(video);
175
195
 
176
- const attachedCall = hlsInstance.on.mock.calls.find((c: any[]) => c[0] === "hls.MEDIA_ATTACHED");
196
+ const attachedCall = hlsInstance.on.mock.calls.find((c) => c[0] === "hls.MEDIA_ATTACHED");
177
197
  expect(attachedCall, "Hls must register a MEDIA_ATTACHED listener before play()").toBeDefined();
178
198
  attachedCall![1]();
179
199
 
@@ -0,0 +1,206 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>component contracts — component identity and declaration contract type definitions.</purpose>
4
+ <non-goals>
5
+ <item>Do not implement components — this module defines the contract.</item>
6
+ </non-goals>
7
+ </MODULE_CONTRACT>
8
+ <CHANGE_SUMMARY>
9
+ <item>RFC-1097: sweep — werkstatt-engine clean
10
+
11
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
12
+ </CHANGE_SUMMARY>
13
+ */
14
+
15
+ import type { Sha256Digest } from "../fingerprint/primitives.ts";
16
+
17
+ export type ComponentId = `${string}/${string}`;
18
+ export type CapabilityId = `${string}/${string}`;
19
+
20
+ export type EffectClass =
21
+ "revertible" | "transactional" | "compensatable" | "irreversible-emission";
22
+
23
+ export type IsolationTier = 0 | 1 | 2 | 3;
24
+
25
+ export type GrantScope = "read" | "append" | "deploy" | "certify" | "administer";
26
+
27
+ export type ResourceKind = "cpu" | "memory" | "disk" | "network" | "timer" | "subprocess";
28
+
29
+ export type LifecycleScope = "process" | "request" | "session" | "scheduled";
30
+
31
+ export type ComponentScope =
32
+ "per-command" | "per-mission" | "per-session" | "per-workshop" | "per-fleet";
33
+
34
+ export interface ScopeContext {
35
+ readonly scope: ComponentScope;
36
+ readonly missionId?: string;
37
+ readonly sessionId?: string;
38
+ readonly fleetId?: string;
39
+ readonly invocationId?: string;
40
+ }
41
+
42
+ export interface ScopedRegistry {
43
+ readonly context: ScopeContext;
44
+ register(manifest: ComponentDeclaration): void;
45
+ resolve(capabilityId: CapabilityId): ComponentDeclaration | null;
46
+ dispose(): void;
47
+ list(): ReadonlyArray<ComponentDeclaration>;
48
+ getScope(): ComponentScope;
49
+ }
50
+
51
+ export interface ScopeManager {
52
+ getRegistry(context: ScopeContext): ScopedRegistry;
53
+ disposeRegistry(context: ScopeContext): void;
54
+ resolveAcrossScopes(
55
+ capabilityId: CapabilityId,
56
+ context: ScopeContext,
57
+ ): ComponentDeclaration | null;
58
+ inspect(): ReadonlyArray<{
59
+ context: ScopeContext;
60
+ componentCount: number;
61
+ componentIds: ComponentId[];
62
+ }>;
63
+ adopt(componentId: ComponentId, targetContext: ScopeContext): void;
64
+ getScope(componentId: ComponentId): ComponentScope | null;
65
+ }
66
+
67
+ export const SCOPE_ERROR_CODES = {
68
+ SCOPE_01: "SCOPE-01",
69
+ SCOPE_02: "SCOPE-02",
70
+ SCOPE_03: "SCOPE-03",
71
+ SCOPE_04: "SCOPE-04",
72
+ SCOPE_05: "SCOPE-05",
73
+ } as const;
74
+
75
+ export interface CapabilityProvideV1 {
76
+ capability: CapabilityId;
77
+ version: string;
78
+ schemaHash: string;
79
+ }
80
+
81
+ export interface CapabilityRequireV1 {
82
+ capability: CapabilityId;
83
+ compatibility: string;
84
+ schemaHash: string | null;
85
+ optional: boolean;
86
+ }
87
+
88
+ export interface GrantRequestV1 {
89
+ scope: GrantScope;
90
+ resource: string;
91
+ attenuated: boolean;
92
+ }
93
+
94
+ export interface EffectDeclarationV1 {
95
+ effectClass: EffectClass;
96
+ description: string;
97
+ recoveryCommand: string | null;
98
+ commitMetadata: string | null;
99
+ }
100
+
101
+ /** RFC-1037: Probe type for compensation verification. */
102
+ export type CompensationProbeType =
103
+ "dns-resolved" | "http-status" | "cdn-cleared" | "mirror-synced" | "custom";
104
+
105
+ /** RFC-1037: A single verification probe that checks equivalence after compensation. */
106
+ export interface CompensationProbe {
107
+ readonly type: CompensationProbeType;
108
+ readonly target: string;
109
+ readonly expected: string;
110
+ readonly timeoutMs: number;
111
+ readonly customVerifyCommand?: string;
112
+ }
113
+
114
+ /** RFC-1037: The compensating action with verification probes. */
115
+ export interface CompensationAction {
116
+ readonly compensatingOperation: string;
117
+ readonly verificationProbes: readonly CompensationProbe[];
118
+ readonly verificationTimeoutMs: number;
119
+ readonly failureMode: "blocking" | "non-blocking";
120
+ }
121
+
122
+ /** RFC-1037: Result of a single probe execution. */
123
+ export interface ProbeResult {
124
+ readonly probe: CompensationProbe;
125
+ readonly passed: boolean;
126
+ readonly actualValue?: string;
127
+ readonly latencyMs: number;
128
+ }
129
+
130
+ /** RFC-1037: Result of compensation verification. */
131
+ export interface CompensationResult {
132
+ readonly operationHash: Sha256Digest;
133
+ readonly compensationHash: Sha256Digest;
134
+ readonly verified: boolean;
135
+ readonly probeResults: readonly ProbeResult[];
136
+ readonly verifiedAt: string;
137
+ readonly failureReason?: string;
138
+ }
139
+
140
+ /** RFC-1037: Extension of EffectDeclarationV1 with compensation verification contracts. */
141
+ export interface EffectDeclarationExt extends EffectDeclarationV1 {
142
+ readonly compensation?: CompensationAction;
143
+ readonly commitBoundary?: string;
144
+ }
145
+
146
+ export interface IsolationRequirementV1 {
147
+ tier: IsolationTier;
148
+ adapterId: string | null;
149
+ }
150
+
151
+ export interface ResourceBoundV1 {
152
+ kind: ResourceKind;
153
+ limit: string;
154
+ owner: ComponentId;
155
+ lifecycle: LifecycleScope;
156
+ }
157
+
158
+ export interface ComponentDeclaration {
159
+ schema: "werkstatt/component-declaration@1";
160
+ /** Stable component ID — survives reconfiguration without losing identity. */
161
+ componentId: ComponentId;
162
+ version: string;
163
+ artifactHash: Sha256Digest;
164
+ scope: ComponentScope;
165
+ provides: CapabilityProvideV1[];
166
+ requires: CapabilityRequireV1[];
167
+ requestedGrants: GrantRequestV1[];
168
+ effects: EffectDeclarationV1[];
169
+ isolation: IsolationRequirementV1;
170
+ resources: ResourceBoundV1[];
171
+ /** Configuration overrides for this component instance. */
172
+ config?: Record<string, unknown>;
173
+ /** Priority — higher priority components override lower for the same capability. */
174
+ priority: number;
175
+ /** Whether this component is desired to be active. */
176
+ active: boolean;
177
+ }
178
+
179
+ export interface ResolvedComponentIdentityV1 {
180
+ componentId: ComponentId;
181
+ version: string;
182
+ artifactHash: string;
183
+ }
184
+
185
+ export interface ResolvedComponentSetV1 {
186
+ schema: "werkstatt/resolved-component-set@1";
187
+ profileId: string;
188
+ components: ResolvedComponentIdentityV1[];
189
+ dependencyGraphHash: string;
190
+ grantSetHash: string;
191
+ effectPolicyHash: string;
192
+ isolationPolicyHash: string;
193
+ setHash: string;
194
+ }
195
+
196
+ export interface ComponentContractViolation {
197
+ rule: string;
198
+ path: string;
199
+ message: string;
200
+ }
201
+
202
+ export interface ComponentContractResult<T> {
203
+ status: "pass" | "fail";
204
+ data: T | null;
205
+ violations: ComponentContractViolation[];
206
+ }
@@ -0,0 +1,11 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Barrel export for @warpgogol/werkstatt-shared/component sub-path. Re-exports component contract types (ComponentId, CapabilityId, EffectClass, IsolationTier, ComponentDeclaration) sunk from @warpgogol/werkstatt-engine per RFC-1104.</purpose>
4
+ <non-goals>Does not re-export engine component-runtime modules (identity, schemas, runtime registry).</non-goals>
5
+ </MODULE_CONTRACT>
6
+ <CHANGE_SUMMARY>
7
+ <item>RFC-1104: initial barrel — component contracts sunk from werkstatt-engine.</item>
8
+ </CHANGE_SUMMARY>
9
+ */
10
+
11
+ export * from "./contracts.ts";
@@ -23,9 +23,9 @@ and resolves braceless collection.file.field references without astro:content (R
23
23
 
24
24
  import { readFileSync } from "node:fs";
25
25
  import { parse } from "yaml";
26
- import { substituteRefsDeep } from "./content/substitute-deep.ts";
27
- import { resolveFieldPath } from "./content/resolve-field-path.ts";
28
- import { scanFormulas, resolveFormula } from "./formula-eval.ts";
26
+ import { substituteRefsDeep } from "./substitute-deep.ts";
27
+ import { resolveFieldPath } from "./resolve-field-path.ts";
28
+ import { scanFormulas, resolveFormula } from "../offers/formula-eval.ts";
29
29
 
30
30
  export interface ContentRefIndex {
31
31
  version: 1;
@@ -10,9 +10,12 @@ language codes from them. Shared across all apps in apps/*; no app-specific impo
10
10
  </non-goals>
11
11
  </MODULE_CONTRACT>
12
12
  <CHANGE_SUMMARY>
13
- <item>Merged createDispatcherResolver from dispatch.ts (micro-module consolidation).</item>
14
- <item>Tightened createDispatcherResolver typing: replaced any with generic T parameter.</item>
15
- <item>Fixed JSDoc: removed references to non-existent callers (components-dispatcher, layouts-dispatcher, pages-dispatcher).</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — werkstatt-engine clean
17
+
18
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
16
19
  </CHANGE_SUMMARY>
17
20
  */
18
21
 
@@ -13,6 +13,9 @@ markdown frontmatter utilities and system manifest loading (RFC-0868).</purpose>
13
13
 
14
14
  export { parseMarkdownFrontmatter, stringifyMarkdownFrontmatter } from "./markdown-frontmatter.ts";
15
15
  export type { ParsedFrontmatter } from "./markdown-frontmatter.ts";
16
+ export * from "./entity-id.ts";
17
+ export * from "./merge.ts";
18
+ export * from "./resolve-field-path.ts";
16
19
  export {
17
20
  loadSystemManifest,
18
21
  loadSystemManifestSync,
@@ -7,7 +7,12 @@
7
7
  </MODULE_CONTRACT>
8
8
  <CHANGE_SUMMARY>
9
9
  <item>RFC-0133: backfilled MODULE_MAP and CHANGE_SUMMARY markers for compass.validate compliance.</item>
10
- <item>Deepening: unified deepMergeEntryData and mergeComponentContent into one configurable deepMerge; old names kept as thin wrappers.</item>
10
+ <item>RFC-1097: step 6 — compass.migrate codemod run
11
+
12
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
13
+ <item>RFC-1097: sweep — werkstatt-engine clean
14
+
15
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
11
16
  </CHANGE_SUMMARY>
12
17
  */
13
18
 
@@ -0,0 +1,107 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Tests for loadSystemManifest / loadSystemManifestSync — RFC-1106: loaders execute systemManifestSchema.parse() at load time, so a valid manifest returns the schema-inferred type with defaults materialized and an invalid manifest throws ZodError.</purpose>
4
+ </MODULE_CONTRACT>
5
+ <CHANGE_SUMMARY>
6
+ <item>RFC-1106: created — pins the parse-at-load contract (AC-7).</item>
7
+ <item>RFC-1106: step 3 — sole SystemManifest definition, loaders parse()
8
+
9
+ Delete the hand-written SystemManifest interface; content/system-manifest.ts re-exports the schema-inferred type. Both loaders switch from 'as unknown as' to systemManifestSchema.parse() — the schema now executes at load. system.manifest.validate catches ZodError and maps issues into structured diagnostics; the post-load safeParse was dead code. Zero consumer breaks: all growth/release/tagline readers were already optional-safe. New adjacent test pins parse-at-load (AC-7).</item>
10
+ </CHANGE_SUMMARY>
11
+ */
12
+
13
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
14
+ import { mkdtemp, writeFile, rm } from "node:fs/promises";
15
+ import { tmpdir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { ZodError } from "zod";
18
+ import { loadSystemManifest, loadSystemManifestSync } from "./system-manifest.ts";
19
+
20
+ const VALID_SYSTEM_MD = `---
21
+ app: test-app
22
+ version: 1.0.0
23
+ identity:
24
+ systemStar: sirius
25
+ biome: urban
26
+ ---
27
+
28
+ # Test system
29
+ `;
30
+
31
+ const INVALID_SYSTEM_MD = `---
32
+ app: INVALID APP
33
+ version: not-semver
34
+ identity:
35
+ systemStar: sirius
36
+ ---
37
+
38
+ # Invalid system
39
+ `;
40
+
41
+ describe("loadSystemManifest", () => {
42
+ let contentDir: string;
43
+
44
+ beforeEach(async () => {
45
+ contentDir = await mkdtemp(join(tmpdir(), "system-manifest-"));
46
+ });
47
+
48
+ afterEach(async () => {
49
+ await rm(contentDir, { recursive: true, force: true });
50
+ });
51
+
52
+ it("parses a valid manifest and materializes schema defaults", async () => {
53
+ await writeFile(join(contentDir, "system.md"), VALID_SYSTEM_MD);
54
+
55
+ const result = await loadSystemManifest(contentDir);
56
+
57
+ expect(result.manifest.app).toBe("test-app");
58
+ expect(result.manifest.identity.systemStar).toBe("sirius");
59
+ // .default([]) materialized by parse — absent in source, present in output
60
+ expect(result.manifest.pages).toEqual([]);
61
+ expect(result.manifest.constellations).toEqual([]);
62
+ expect(result.manifest.clientEditable).toEqual([]);
63
+ expect(result.manifest.retiredRoutes).toEqual([]);
64
+ // optional fields stay absent
65
+ expect(result.manifest.growth).toBeUndefined();
66
+ expect(result.manifest.release).toBeUndefined();
67
+ expect(result.manifest.identity.tagline).toBeUndefined();
68
+ expect(result.source).toBe("system.md");
69
+ });
70
+
71
+ it("throws ZodError on an invalid manifest", async () => {
72
+ await writeFile(join(contentDir, "system.md"), INVALID_SYSTEM_MD);
73
+
74
+ await expect(loadSystemManifest(contentDir)).rejects.toBeInstanceOf(ZodError);
75
+ });
76
+
77
+ it("throws when system.md does not exist", async () => {
78
+ await expect(loadSystemManifest(contentDir)).rejects.toThrow();
79
+ });
80
+ });
81
+
82
+ describe("loadSystemManifestSync", () => {
83
+ let contentDir: string;
84
+
85
+ beforeEach(async () => {
86
+ contentDir = await mkdtemp(join(tmpdir(), "system-manifest-sync-"));
87
+ });
88
+
89
+ afterEach(async () => {
90
+ await rm(contentDir, { recursive: true, force: true });
91
+ });
92
+
93
+ it("parses a valid manifest synchronously", async () => {
94
+ await writeFile(join(contentDir, "system.md"), VALID_SYSTEM_MD);
95
+
96
+ const result = loadSystemManifestSync(contentDir);
97
+
98
+ expect(result.manifest.app).toBe("test-app");
99
+ expect(result.manifest.pages).toEqual([]);
100
+ });
101
+
102
+ it("throws ZodError on an invalid manifest", async () => {
103
+ await writeFile(join(contentDir, "system.md"), INVALID_SYSTEM_MD);
104
+
105
+ expect(() => loadSystemManifestSync(contentDir)).toThrow(ZodError);
106
+ });
107
+ });
@@ -10,6 +10,9 @@ Stack-agnostic utility used by both engine and site plugin (RFC-0868).</purpose>
10
10
  <CHANGE_SUMMARY>
11
11
  <item>RFC-0868: extracted from werkstatt-site/src/content/system-manifest.ts.</item>
12
12
  <item>RFC-0911: add seo?.anchorText?.extraStopPhrases for anchor-text stop-list extension.</item>
13
+ <item>RFC-1106: step 3 — sole SystemManifest definition, loaders parse()
14
+
15
+ Delete the hand-written SystemManifest interface; content/system-manifest.ts re-exports the schema-inferred type. Both loaders switch from 'as unknown as' to systemManifestSchema.parse() — the schema now executes at load. system.manifest.validate catches ZodError and maps issues into structured diagnostics; the post-load safeParse was dead code. Zero consumer breaks: all growth/release/tagline readers were already optional-safe. New adjacent test pins parse-at-load (AC-7).</item>
13
16
  </CHANGE_SUMMARY>
14
17
  */
15
18
 
@@ -17,99 +20,14 @@ import { readFile, access } from "node:fs/promises";
17
20
  import { readFileSync, accessSync } from "node:fs";
18
21
  import { join } from "node:path";
19
22
  import { parseMarkdownFrontmatter } from "./markdown-frontmatter.ts";
23
+ import { systemManifestSchema } from "../ontology/schemas/system/manifest.ts";
24
+ import type { SystemManifest } from "../ontology/schemas/system/manifest.ts";
20
25
 
21
- export interface SystemManifest {
22
- app: string;
23
- version: string;
24
- identity: {
25
- systemStar: string;
26
- biome: string;
27
- tagline: string;
28
- domain?: string;
29
- /** RFC-0087: Per-app default CTA pageId for shared header and final-cta. */
30
- ctaTarget?: string;
31
- /** RFC-0096: Operator details consumed by legal.scaffold to fill Impressum / Datenschutz stubs. */
32
- legal?: {
33
- responsibleName?: string;
34
- address?: string;
35
- email?: string;
36
- };
37
- };
38
- i18n?: {
39
- default: string;
40
- supported: Record<string, unknown>;
41
- };
42
- constellations: string[];
43
- clientEditable: string[];
44
- sharedContext?: {
45
- requiredPageIds: string[];
46
- };
47
- pages: Array<{
48
- pageId: string;
49
- routes?: Record<string, string>;
50
- route?: string;
51
- /** RFC-0097: explicit locale opt-in; the page exists only in these locales. */
52
- locales?: string[];
53
- cosmicStar: string;
54
- planets: Array<{
55
- cosmicPlanet: string;
56
- pin: string;
57
- }>;
58
- }>;
59
- growth: {
60
- vendor: {
61
- adapter: string;
62
- options: Record<string, unknown>;
63
- };
64
- funnels: unknown[];
65
- experiments: unknown[];
66
- };
67
- release: {
68
- passport: {
69
- enabled: boolean;
70
- indexable: boolean;
71
- keyVersion: string;
72
- heartbeatUrl: string;
73
- };
74
- };
75
- /**
76
- * RFC-0211 Content Knowledge Lifecycle policy. Mirrors the `knowledge` block in
77
- * the ontology systemManifestSchema; declared here so the CKL kernel commands
78
- * (content.freshness.validate RFC-0213, content.plan.build RFC-0216) read it
79
- * with real types instead of structural casts.
80
- */
81
- knowledge?: {
82
- freshness?: {
83
- soonWindowDays?: number;
84
- critical?: Array<{ match: string; criticality: "advisory" | "important" | "blocking" }>;
85
- };
86
- derivation?: {
87
- critical?: Array<{ match: string; criticality: "advisory" | "important" | "blocking" }>;
88
- };
89
- plan?: {
90
- leadTimeDays?: number;
91
- defaultOwner?: string;
92
- criticalityMap?: Array<{ match: string; criticality: "advisory" | "important" | "blocking" }>;
93
- };
94
- };
95
- /** RFC-0487: Business model declaration. Closed enum — currently only "b2b-only". */
96
- businessModel?: "b2b-only";
97
- /** RFC-0487/RFC-0509: Retired page routes — 410 Gone tombstones or 301 redirects. */
98
- retiredRoutes?: Array<{ slug: string; status: 410 } | { slug: string; status: 301; to: string }>;
99
- /** UI-level rendering toggles for split-list column order. */
100
- ui?: {
101
- responsibilityBlock?: {
102
- swapOrder?: boolean;
103
- };
104
- };
105
- /** RFC-0911: SEO validator configuration extension point. */
106
- seo?: {
107
- anchorText?: {
108
- /** Added to the built-in de/uk stop-list. */
109
- extraStopPhrases?: Record<string, string[]>;
110
- };
111
- };
112
- }
26
+ // RFC-1106: systemManifestSchema is the sole SystemManifest definition.
27
+ // The inferred output type materializes .default()s (pages, constellations,
28
+ // clientEditable, retiredRoutes, planets stay non-optional) and keeps
29
+ // growth/release/tagline optional — the old interface lied about those.
30
+ export type { SystemManifest };
113
31
 
114
32
  export interface SystemManifestLoadResult {
115
33
  manifest: SystemManifest;
@@ -132,7 +50,7 @@ export async function loadSystemManifest(
132
50
  const parsed = parseMarkdownFrontmatter(content);
133
51
 
134
52
  return {
135
- manifest: parsed.data as unknown as SystemManifest,
53
+ manifest: systemManifestSchema.parse(parsed.data),
136
54
  source: "system.md",
137
55
  filePath: systemMdPath,
138
56
  };
@@ -151,7 +69,7 @@ export function loadSystemManifestSync(contentDirectory: string): SystemManifest
151
69
  const parsed = parseMarkdownFrontmatter(content);
152
70
 
153
71
  return {
154
- manifest: parsed.data as unknown as SystemManifest,
72
+ manifest: systemManifestSchema.parse(parsed.data),
155
73
  source: "system.md",
156
74
  filePath: systemMdPath,
157
75
  };
@@ -1,5 +1,5 @@
1
1
  import { test, expect } from "vitest";
2
- import { resolveFieldPath } from "../content/resolve-field-path.ts";
2
+ import { resolveFieldPath } from "../resolve-field-path.ts";
3
3
 
4
4
  test("resolveFieldPath resolves shallow field", () => {
5
5
  const result = resolveFieldPath({ companyName: "Warpgogol" }, ["companyName"]);