@warpgogol/werkstatt-shared 0.14.1 → 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 (438) hide show
  1. package/README.md +23 -15
  2. package/README.uk.md +1 -1
  3. package/package.json +517 -766
  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/{share → agent}/tests/openapi.test.ts +2 -2
  16. package/src/{share → agent}/tests/proof.test.ts +1 -1
  17. package/src/{share → attribution}/material-credits.ts +4 -4
  18. package/src/{share → checks}/check-hints.ts +6 -1
  19. package/src/checks/index.ts +4 -1
  20. package/src/checks/lib/astro-site-url.ts +6 -1
  21. package/src/checks/lib/i18n.ts +14 -0
  22. package/src/checks/result-helpers.ts +2 -2
  23. package/src/checks/tests/remediation-auto-populate.test.ts +1 -1
  24. package/src/{share → client-scripts}/counter-utils.ts +6 -2
  25. package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
  26. package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
  27. package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
  28. package/src/client-scripts/index.ts +35 -0
  29. package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
  30. package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
  31. package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
  32. package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
  33. package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
  34. package/src/client-scripts/scroll-spy.ts +106 -0
  35. package/src/client-scripts/tests/orchestrator.test.ts +47 -0
  36. package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
  37. package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
  38. package/src/component/contracts.ts +206 -0
  39. package/src/component/index.ts +11 -0
  40. package/src/{share → content}/content-reference.ts +3 -3
  41. package/src/{share/content → content}/entity-id.ts +6 -3
  42. package/src/content/index.ts +3 -0
  43. package/src/{share/content → content}/merge.ts +6 -1
  44. package/src/content/system-manifest.test.ts +107 -0
  45. package/src/content/system-manifest.ts +12 -94
  46. package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
  47. package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
  48. package/src/content-discipline/index.ts +19 -0
  49. package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
  50. package/src/{share/env.d.ts → env.d.ts} +6 -3
  51. package/src/fingerprint/canonical-json.ts +731 -0
  52. package/src/fingerprint/index.ts +12 -0
  53. package/src/fingerprint/primitives.ts +72 -0
  54. package/src/{share/i18n → i18n}/localization.ts +6 -2
  55. package/src/integration/adapters.ts +10 -71
  56. package/src/integration/dispatch.ts +1 -1
  57. package/src/integration/funnel.ts +6 -1
  58. package/src/integration/index.ts +101 -4
  59. package/src/integration/lagebild-destination-adapter.ts +108 -0
  60. package/src/integration/lagebild-ingress.ts +7 -12
  61. package/src/integration/orchestration.ts +11 -10
  62. package/src/integration/tests/deliver-event.test.ts +1 -1
  63. package/src/integration/tests/dispatch.test.ts +4 -4
  64. package/src/integration/tests/hub-runtime.test.ts +22 -14
  65. package/src/integration/vitest.config.ts +1 -0
  66. package/src/kernel/desired-state.ts +227 -0
  67. package/src/kernel/diagnostic.ts +289 -0
  68. package/src/kernel/fs-atomic.ts +131 -0
  69. package/src/kernel/index.ts +15 -0
  70. package/src/kernel/tests/fs-atomic.test.ts +150 -0
  71. package/src/kernel/tests/workspace-io.test.ts +187 -0
  72. package/src/kernel/types.ts +459 -0
  73. package/src/kernel/workspace-io.ts +248 -0
  74. package/src/{share → knowledge}/tests/claim.test.ts +1 -1
  75. package/src/{share → knowledge}/tests/derivation.test.ts +1 -1
  76. package/src/{share → knowledge}/tests/freshness.test.ts +1 -1
  77. package/src/{share → knowledge}/tests/ledger.test.ts +1 -1
  78. package/src/{share → knowledge}/tests/plan.test.ts +1 -1
  79. package/src/{share → knowledge}/tests/source.test.ts +1 -1
  80. package/src/legal/index.ts +15 -0
  81. package/src/{share/middleware → middleware}/access-protection.ts +8 -8
  82. package/src/{share → node}/dev-props-validator.ts +6 -1
  83. package/src/{share → node}/import-scan.ts +23 -3
  84. package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
  85. package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
  86. package/src/{share/semantic → node}/tests/derived-prices-loader.test.ts +14 -1
  87. package/src/{share/semantic → node}/tests/markdown-twin-provenance.test.ts +1 -1
  88. package/src/observability/env-resolver.ts +6 -1
  89. package/src/observability/index.ts +6 -1
  90. package/src/observability/otlp-converter.ts +6 -1
  91. package/src/observability/otlp-transport.ts +6 -1
  92. package/src/observability/pusher.ts +6 -1
  93. package/src/observability/redact.ts +6 -1
  94. package/src/observability/typed-refs.ts +6 -2
  95. package/src/observability/vitest.config.ts +1 -0
  96. package/src/{share → offers}/formula-eval.ts +3 -3
  97. package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
  98. package/src/onboarding/index.ts +1 -0
  99. package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
  100. package/src/ontology/archetype-registry.ts +6 -1
  101. package/src/ontology/archetypes/index.json +33 -1
  102. package/src/ontology/archetypes/index.yaml +27 -1
  103. package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
  104. package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
  105. package/src/ontology/biome-token-projection.ts +6 -1
  106. package/src/ontology/cosmic/index.ts +6 -1
  107. package/src/ontology/cosmic/moon-catalog.ts +6 -1
  108. package/src/ontology/cosmic/planet-catalog.ts +6 -1
  109. package/src/ontology/cosmic/star-catalog.ts +6 -1
  110. package/src/ontology/enums.ts +6 -1
  111. package/src/ontology/external-surfaces/index.ts +1 -1
  112. package/src/ontology/index.ts +6 -2
  113. package/src/ontology/manifest.ts +7 -4
  114. package/src/ontology/operations/artifact-store.ts +45 -0
  115. package/src/ontology/operations/dht.ts +98 -0
  116. package/src/ontology/operations/handoff.ts +92 -0
  117. package/src/ontology/operations/index.ts +187 -1
  118. package/src/ontology/operations/leitstand.ts +99 -0
  119. package/src/ontology/operations/materialization.ts +90 -0
  120. package/src/ontology/operations/mission.ts +111 -0
  121. package/src/ontology/operations/naming-policy.ts +132 -0
  122. package/src/ontology/operations/notausgang.ts +64 -0
  123. package/src/ontology/operations/release.ts +121 -0
  124. package/src/ontology/operations/sternsystem.ts +192 -0
  125. package/src/ontology/operations/werkstatt.ts +48 -0
  126. package/src/ontology/schemas/biome.ts +7 -2
  127. package/src/ontology/schemas/capability.ts +1 -1
  128. package/src/ontology/schemas/constellation.ts +6 -1
  129. package/src/ontology/schemas/index.ts +6 -2
  130. package/src/ontology/schemas/manifest-resolver.ts +6 -1
  131. package/src/ontology/schemas/page-entry.ts +9 -5
  132. package/src/ontology/schemas/system/growth.ts +6 -1
  133. package/src/ontology/schemas/system/manifest.ts +40 -1
  134. package/src/ontology/schemas/system/page-output.ts +7 -6
  135. package/src/ontology/schemas/system/text.ts +15 -0
  136. package/src/ontology/schemas/system.ts +6 -2
  137. package/src/ontology/shared-section-props/body-fragments.ts +2 -0
  138. package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
  139. package/src/ontology/vitest.config.ts +1 -0
  140. package/src/{share → page}/page.ts +13 -9
  141. package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
  142. package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
  143. package/src/passport/index.ts +6 -1
  144. package/src/passport/key-rotate.ts +10 -2
  145. package/src/passport/schema.ts +6 -1
  146. package/src/passport/sign.ts +8 -3
  147. package/src/passport/vitest.config.ts +1 -0
  148. package/src/pbt/index.test.ts +95 -0
  149. package/src/pbt/index.ts +251 -0
  150. package/src/plugin/plugin-contract.ts +1 -1
  151. package/src/{share → policy}/entitlement.ts +24 -4
  152. package/src/{share → policy}/feature-policy.ts +8 -3
  153. package/src/{share → policy}/visibility.ts +7 -2
  154. package/src/redirects/redirects.ts +117 -0
  155. package/src/{share → redirects/tests}/redirects.test.ts +1 -1
  156. package/src/remediation/remediation-catalog.ts +316 -0
  157. package/src/{share/routes → routes}/template-filter.ts +1 -1
  158. package/src/{share → runtime}/runtime-context.ts +7 -2
  159. package/src/{share → runtime}/shared-context.ts +1 -1
  160. package/src/{share/schemas → schemas}/claims.ts +2 -2
  161. package/src/{share/schemas → schemas}/effects.ts +6 -1
  162. package/src/{share/schemas → schemas}/features.ts +1 -1
  163. package/src/{share/schemas → schemas}/index.ts +3 -3
  164. package/src/{share/schemas → schemas}/navigation.ts +6 -1
  165. package/src/{share/schemas → schemas}/page-base.ts +6 -2
  166. package/src/{share/schemas → schemas}/person.ts +1 -1
  167. package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
  168. package/src/{share → sections}/rfc0042-utils.ts +1 -1
  169. package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
  170. package/src/{share/semantic → semantic}/business-projection.ts +95 -1
  171. package/src/semantic/canonical-uri.ts +54 -0
  172. package/src/{share/semantic → semantic}/extract.ts +100 -1
  173. package/src/semantic/fact-extraction.test.ts +47 -0
  174. package/src/semantic/fact-extraction.ts +46 -0
  175. package/src/semantic/freshness.ts +67 -0
  176. package/src/{share/semantic → semantic}/ids.ts +6 -1
  177. package/src/{share/semantic → semantic}/index.ts +9 -2
  178. package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
  179. package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
  180. package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
  181. package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
  182. package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
  183. package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
  184. package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
  185. package/src/semantic/jsonld/shared.ts +36 -0
  186. package/src/semantic/jsonld/types.ts +24 -0
  187. package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
  188. package/src/semantic/jsonld/website.ts +32 -0
  189. package/src/{share/semantic → semantic}/jsonld.ts +6 -1
  190. package/src/{share/semantic → semantic}/llms.ts +41 -3
  191. package/src/{share/semantic → semantic}/models.ts +26 -38
  192. package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
  193. package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
  194. package/src/{share/semantic → semantic}/page-utils.ts +6 -3
  195. package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
  196. package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
  197. package/src/{share/semantic → semantic}/tests/business-projection.test.ts +179 -0
  198. package/src/semantic/tests/canonical-uri.test.ts +56 -0
  199. package/src/{share/semantic → semantic}/tests/extract.test.ts +83 -0
  200. package/src/semantic/tests/freshness.pbt.test.ts +108 -0
  201. package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
  202. package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
  203. package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
  204. package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
  205. package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
  206. package/src/{share/semantic → semantic}/tests/llms.test.ts +46 -0
  207. package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
  208. package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
  209. package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
  210. package/src/{share/semantic → semantic}/tests/price-marker-resolver.test.ts +4 -2
  211. package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
  212. package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
  213. package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
  214. package/src/signing/index.ts +13 -0
  215. package/src/signing/key.ts +139 -0
  216. package/src/signing/sign.ts +66 -0
  217. package/src/signing/types.ts +29 -0
  218. package/src/{share/slug → slug}/slug-url.ts +4 -1
  219. package/src/stack/run-tool.ts +108 -0
  220. package/src/stack/stack-checks.ts +124 -0
  221. package/src/stack/tests/run-tool.test.ts +138 -0
  222. package/src/stack/tests/stack-checks.test.ts +141 -0
  223. package/src/stack/tests/walk-files.test.ts +131 -0
  224. package/src/stack/walk-files.ts +114 -0
  225. package/src/surface/blueprint.ts +342 -66
  226. package/src/surface/decision-composer.ts +6 -1
  227. package/src/surface/geo.ts +6 -1
  228. package/src/surface/index.ts +11 -7
  229. package/src/surface/types.ts +2 -2
  230. package/src/surface/vitest.config.ts +1 -0
  231. package/src/tests/signing-core.test.ts +129 -0
  232. package/src/{share → text}/css-value-normalize.ts +6 -1
  233. package/src/text/string-utils.ts +24 -0
  234. package/src/{share → text}/tests/text-normalize.test.ts +5 -0
  235. package/src/{share → text}/text-normalize.ts +4 -3
  236. package/src/{share → text}/wrap-inline-numbers.ts +1 -1
  237. package/src/types/axiom-study.d.ts +36 -0
  238. package/src/types/hls-js-light.d.ts +21 -0
  239. package/src/types/qrcode-browser.d.ts +23 -0
  240. package/src/typography/fix.pbt.test.ts +208 -0
  241. package/src/typography/fix.ts +148 -0
  242. package/src/typography/index.ts +54 -0
  243. package/src/typography/locale-defaults.ts +97 -0
  244. package/src/typography/rules-tier1.test.ts +459 -0
  245. package/src/typography/rules-tier1.ts +925 -0
  246. package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
  247. package/src/typography/rules-tier2-locale.test.ts +286 -0
  248. package/src/typography/rules-tier2-locale.ts +399 -0
  249. package/src/typography/rules-tier2-structure.test.ts +330 -0
  250. package/src/typography/rules-tier2-structure.ts +378 -0
  251. package/src/typography/rules-tier3-advisory.test.ts +290 -0
  252. package/src/typography/rules-tier3-advisory.ts +239 -0
  253. package/src/typography/text-surface.test.ts +244 -0
  254. package/src/typography/text-surface.ts +448 -0
  255. package/src/index.ts +0 -14
  256. package/src/integration/port-barrel.ts +0 -105
  257. package/src/share/agent/tests/api-catalog.test.ts +0 -8
  258. package/src/share/agent/tests/ard-catalog.test.ts +0 -8
  259. package/src/share/agent/tests/capability.test.ts +0 -14
  260. package/src/share/agent/tests/fleet-catalog.test.ts +0 -15
  261. package/src/share/agent/tests/knowledge.test.ts +0 -20
  262. package/src/share/agent/tests/manifest.test.ts +0 -9
  263. package/src/share/agent/tests/mcp-card.test.ts +0 -8
  264. package/src/share/agent/tests/openapi.test.ts +0 -8
  265. package/src/share/agent/tests/proof.test.ts +0 -15
  266. package/src/share/content/index.ts +0 -16
  267. package/src/share/content-discipline/index.ts +0 -14
  268. package/src/share/index.ts +0 -86
  269. package/src/share/knowledge/tests/claim.test.ts +0 -11
  270. package/src/share/knowledge/tests/derivation.test.ts +0 -30
  271. package/src/share/knowledge/tests/freshness.test.ts +0 -18
  272. package/src/share/knowledge/tests/ledger.test.ts +0 -35
  273. package/src/share/knowledge/tests/plan.test.ts +0 -19
  274. package/src/share/knowledge/tests/source.test.ts +0 -19
  275. package/src/share/legal/index.ts +0 -1
  276. package/src/share/redirects.ts +0 -54
  277. package/src/share/remediation/remediation-catalog.ts +0 -196
  278. package/src/share/scripts/index.ts +0 -26
  279. package/src/share/scripts/tests/orchestrator.test.ts +0 -8
  280. package/src/share/semantic/jsonld/shared.ts +0 -31
  281. package/src/share/semantic/jsonld/types.ts +0 -19
  282. package/src/share/semantic/jsonld/website.ts +0 -27
  283. package/src/share/string-utils.ts +0 -19
  284. package/src/share/types/axiom-study.d.ts +0 -22
  285. package/src/share/types/hls-js-light.d.ts +0 -16
  286. package/src/share/types/qrcode-browser.d.ts +0 -18
  287. package/src/share/utility-registry.yaml +0 -50
  288. package/src/share/vitest.config.ts +0 -8
  289. package/src/surface/blueprint-schema.ts +0 -314
  290. package/src/surface/blueprint-types.ts +0 -256
  291. /package/src/{share/agent → agent}/api-catalog.ts +0 -0
  292. /package/src/{share/agent → agent}/capability.ts +0 -0
  293. /package/src/{share/agent → agent}/dns-aid.ts +0 -0
  294. /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
  295. /package/src/{share/agent → agent}/index.ts +0 -0
  296. /package/src/{share/agent → agent}/knowledge.ts +0 -0
  297. /package/src/{share/agent → agent}/mcp-card.ts +0 -0
  298. /package/src/{share/agent → agent}/omit-empty.ts +0 -0
  299. /package/src/{share/agent → agent}/openapi.ts +0 -0
  300. /package/src/{share/agent → agent}/proof.ts +0 -0
  301. /package/src/{share/agent → agent}/search.test.ts +0 -0
  302. /package/src/{share/agent → agent}/tests/omit-empty.test.ts +0 -0
  303. /package/src/{share → attribution}/attribution-display.ts +0 -0
  304. /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
  305. /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
  306. /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
  307. /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
  308. /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
  309. /package/src/{share/scripts → client-scripts}/tests/external-link-qr.test.ts +0 -0
  310. /package/src/{share/scripts → client-scripts}/tests/external-links.test.ts +0 -0
  311. /package/src/{share/scripts → client-scripts}/tests/gsap-counter.test.ts +0 -0
  312. /package/src/{share/scripts → client-scripts}/tests/gsap-mountain-journey.test.ts +0 -0
  313. /package/src/{share/scripts → client-scripts}/tests/gsap-parallax.test.ts +0 -0
  314. /package/src/{share/scripts → client-scripts}/tests/gsap-reveal.test.ts +0 -0
  315. /package/src/{share/scripts → client-scripts}/tests/gsap-stagger.test.ts +0 -0
  316. /package/src/{share/scripts → client-scripts}/tests/inline-number-animation.test.ts +0 -0
  317. /package/src/{share/scripts → client-scripts}/tests/lenis.test.ts +0 -0
  318. /package/src/{share/scripts → client-scripts}/tests/live-photos.test.ts +0 -0
  319. /package/src/{share/scripts → client-scripts}/tests/lordicon.test.ts +0 -0
  320. /package/src/{share/scripts → client-scripts}/tests/scheduler.test.ts +0 -0
  321. /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
  322. /package/src/{share/content → content}/resolve-field-path.ts +0 -0
  323. /package/src/{share/content → content}/substitute-deep.ts +0 -0
  324. /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
  325. /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
  326. /package/src/{share → image-provider}/image-provider.ts +0 -0
  327. /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
  328. /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
  329. /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
  330. /package/src/{share/knowledge → knowledge}/index.ts +0 -0
  331. /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
  332. /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
  333. /package/src/{share/knowledge → knowledge}/source.ts +0 -0
  334. /package/src/{share/legal → legal}/translation-policy.ts +0 -0
  335. /package/src/{share/middleware → middleware}/language-redirect.ts +0 -0
  336. /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
  337. /package/src/{share → node}/fs/index.ts +0 -0
  338. /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
  339. /package/src/{share → offers}/offer-capacity.ts +0 -0
  340. /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
  341. /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
  342. /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
  343. /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
  344. /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
  345. /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
  346. /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
  347. /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
  348. /package/src/{share/schemas → schemas}/media.ts +0 -0
  349. /package/src/{share/schemas → schemas}/participant.ts +0 -0
  350. /package/src/{share/schemas → schemas}/print.ts +0 -0
  351. /package/src/{share/schemas → schemas}/section-background.ts +0 -0
  352. /package/src/{share/schemas → schemas}/section-body.ts +0 -0
  353. /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
  354. /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
  355. /package/src/{share/schemas → schemas}/section-header.ts +0 -0
  356. /package/src/{share/schemas → schemas}/section-image.ts +0 -0
  357. /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
  358. /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
  359. /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
  360. /package/src/{share/schemas → schemas}/site-background.ts +0 -0
  361. /package/src/{share/schemas → schemas}/tests/claim-records.test.ts +0 -0
  362. /package/src/{share/schemas → schemas}/tests/claims.test.ts +0 -0
  363. /package/src/{share/schemas → schemas}/tests/effects.test.ts +0 -0
  364. /package/src/{share/schemas → schemas}/tests/features.test.ts +0 -0
  365. /package/src/{share/schemas → schemas}/tests/horizontal-align.test.ts +0 -0
  366. /package/src/{share/schemas → schemas}/tests/icon-color.test.ts +0 -0
  367. /package/src/{share/schemas → schemas}/tests/live-photo.test.ts +0 -0
  368. /package/src/{share/schemas → schemas}/tests/material-credit.test.ts +0 -0
  369. /package/src/{share/schemas → schemas}/tests/media.test.ts +0 -0
  370. /package/src/{share/schemas → schemas}/tests/navigation.test.ts +0 -0
  371. /package/src/{share/schemas → schemas}/tests/page-base.test.ts +0 -0
  372. /package/src/{share/schemas → schemas}/tests/participant.test.ts +0 -0
  373. /package/src/{share/schemas → schemas}/tests/person.test.ts +0 -0
  374. /package/src/{share/schemas → schemas}/tests/print.test.ts +0 -0
  375. /package/src/{share/schemas → schemas}/tests/section-background.test.ts +0 -0
  376. /package/src/{share/schemas → schemas}/tests/section-body.test.ts +0 -0
  377. /package/src/{share/schemas → schemas}/tests/section-cards.test.ts +0 -0
  378. /package/src/{share/schemas → schemas}/tests/section-cta.test.ts +0 -0
  379. /package/src/{share/schemas → schemas}/tests/section-header.test.ts +0 -0
  380. /package/src/{share/schemas → schemas}/tests/section-image.test.ts +0 -0
  381. /package/src/{share/schemas → schemas}/tests/section-motion.test.ts +0 -0
  382. /package/src/{share/schemas → schemas}/tests/section-shell.test.ts +0 -0
  383. /package/src/{share/schemas → schemas}/tests/section-stats.test.ts +0 -0
  384. /package/src/{share/schemas → schemas}/tests/site-background.test.ts +0 -0
  385. /package/src/{share/schemas → schemas}/tests/standard-list-item.test.ts +0 -0
  386. /package/src/{share/semantic → semantic}/ai.ts +0 -0
  387. /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
  388. /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
  389. /package/src/{share/semantic → semantic}/build-page.ts +0 -0
  390. /package/src/{share/semantic → semantic}/feed.ts +0 -0
  391. /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
  392. /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
  393. /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
  394. /package/src/{share/semantic → semantic}/jsonld/tests/article.test.ts +0 -0
  395. /package/src/{share/semantic → semantic}/jsonld/tests/breadcrumb.test.ts +0 -0
  396. /package/src/{share/semantic → semantic}/jsonld/tests/collection-list.test.ts +0 -0
  397. /package/src/{share/semantic → semantic}/jsonld/tests/faq.test.ts +0 -0
  398. /package/src/{share/semantic → semantic}/jsonld/tests/initiative.test.ts +0 -0
  399. /package/src/{share/semantic → semantic}/jsonld/tests/organization.test.ts +0 -0
  400. /package/src/{share/semantic → semantic}/jsonld/tests/person.test.ts +0 -0
  401. /package/src/{share/semantic → semantic}/jsonld/tests/service.test.ts +0 -0
  402. /package/src/{share/semantic → semantic}/jsonld/tests/shared.test.ts +0 -0
  403. /package/src/{share/semantic → semantic}/jsonld/tests/video.test.ts +0 -0
  404. /package/src/{share/semantic → semantic}/jsonld/tests/webpage.test.ts +0 -0
  405. /package/src/{share/semantic → semantic}/jsonld/tests/website.test.ts +0 -0
  406. /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
  407. /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
  408. /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
  409. /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
  410. /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
  411. /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
  412. /package/src/{share/semantic → semantic}/robots.ts +0 -0
  413. /package/src/{share/semantic → semantic}/tests/ai.test.ts +0 -0
  414. /package/src/{share/semantic → semantic}/tests/block-extraction.test.ts +0 -0
  415. /package/src/{share/semantic → semantic}/tests/breadcrumbs.test.ts +0 -0
  416. /package/src/{share/semantic → semantic}/tests/build-page.test.ts +0 -0
  417. /package/src/{share/semantic → semantic}/tests/feed.test.ts +0 -0
  418. /package/src/{share/semantic → semantic}/tests/helpers.ts +0 -0
  419. /package/src/{share/semantic → semantic}/tests/ids.test.ts +0 -0
  420. /package/src/{share/semantic → semantic}/tests/image-sitemap.test.ts +0 -0
  421. /package/src/{share/semantic → semantic}/tests/jsonld.test.ts +0 -0
  422. /package/src/{share/semantic → semantic}/tests/llms-policy.test.ts +0 -0
  423. /package/src/{share/semantic → semantic}/tests/markdown-hygiene.test.ts +0 -0
  424. /package/src/{share/semantic → semantic}/tests/markdown-page.test.ts +0 -0
  425. /package/src/{share/semantic → semantic}/tests/organization-profile.test.ts +0 -0
  426. /package/src/{share/semantic → semantic}/tests/output-projection.test.ts +0 -0
  427. /package/src/{share/semantic → semantic}/tests/page-markdown.test.ts +0 -0
  428. /package/src/{share/semantic → semantic}/tests/page-utils.test.ts +0 -0
  429. /package/src/{share/semantic → semantic}/tests/robots.test.ts +0 -0
  430. /package/src/{share/semantic → semantic}/tests/update-stamp.test.ts +0 -0
  431. /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
  432. /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
  433. /package/src/{share/slug → slug}/index.ts +0 -0
  434. /package/src/{share/slug → slug}/slug-id.ts +0 -0
  435. /package/src/{share/slug → slug}/strategies.ts +0 -0
  436. /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
  437. /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
  438. /package/src/{share → text}/text-position.ts +0 -0
@@ -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"]);
@@ -1,5 +1,5 @@
1
1
  import { test, expect } from "vitest";
2
- import { substituteRefsDeep } from "../content/substitute-deep.ts";
2
+ import { substituteRefsDeep } from "../substitute-deep.ts";
3
3
 
4
4
  // RFC-0138 fixture: a tiny disk-free stand-in for the RFC-0045 resolver. It models the
5
5
  // canonical business offer file so we can assert a {business.offer.price.*} reference written
@@ -0,0 +1,19 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Maintains packages/share/src/content-discipline/index.ts as an authored share authored module so agents can evolve it without rediscovering local boundaries.</purpose>
4
+ <non-goals>
5
+ <item>Do not define validation logic here.</item>
6
+ </non-goals>
7
+ </MODULE_CONTRACT>
8
+ <CHANGE_SUMMARY>
9
+ <item>RFC-1097: step 6 — compass.migrate codemod run
10
+
11
+ 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>
12
+ <item>RFC-1097: sweep — werkstatt-engine clean
13
+
14
+ 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>
15
+ </CHANGE_SUMMARY>
16
+ */
17
+
18
+ export * from "./types.ts";
19
+ export * from "./parsers.ts";
@@ -8,11 +8,11 @@
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
10
  <item>RFC-0073: Add shared parsers and normalization helpers for content-discipline validators.</item>
11
- <item>RFC-0082: Delegate YAML reading to @warpgogol/werkstatt-shared/share/onboarding-yaml so single-doc and two-doc RFC-0076-headed files both parse correctly.</item>
11
+ <item>RFC-0082: Delegate YAML reading to @warpgogol/werkstatt-shared/onboarding so single-doc and two-doc RFC-0076-headed files both parse correctly.</item>
12
12
  </CHANGE_SUMMARY>
13
13
  */
14
14
 
15
- import { parseOnboardingArtifactPayload } from "../onboarding-yaml/index.ts";
15
+ import { parseOnboardingArtifactPayload } from "../onboarding/yaml.ts";
16
16
  import {
17
17
  contentAtomsFileSchema,
18
18
  coverageLedgerEntrySchema,
@@ -7,7 +7,12 @@
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
- <item>Tidied by compass.changesummary.tidy; see git history for prior entries.</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
 
@@ -37,8 +42,6 @@ declare module "astro:env/server" {
37
42
  export const INTEGRATION_WHATSAPP_TOKEN: string | undefined;
38
43
  export const INTEGRATION_WHATSAPP_PHONE_ID: string | undefined;
39
44
  export const INTEGRATION_WHATSAPP_TO: string | undefined;
40
- export const INTEGRATION_PIPEDRIVE_API_TOKEN: string | undefined;
41
- export const INTEGRATION_PIPEDRIVE_DOMAIN: string | undefined;
42
45
  // RFC-0176 inbound hub (chat-widget inbound handler).
43
46
  export const INTEGRATION_INBOUND_SECRET: string | undefined;
44
47
  // RFC-0181 EU-resident delivery — Upstash QStash + Redis (eu-central-1).