@sourcey/catalog-verifier 1.0.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 (402) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/LICENSE +21 -0
  3. package/README.md +64 -0
  4. package/SBOM.cdx.json +177 -0
  5. package/SECURITY.md +8 -0
  6. package/SOURCEY-CLOSURE.json +1559 -0
  7. package/SOURCEY-DISTRIBUTION.json +24 -0
  8. package/SOURCEY-LICENSE-POLICY.json +5 -0
  9. package/SOURCEY-TOOLCHAIN.json +8 -0
  10. package/SUPPORT.md +5 -0
  11. package/THIRD_PARTY_NOTICES.json +69 -0
  12. package/dist/contracts/agent-readiness/src/declaration-acquisition.d.ts +548 -0
  13. package/dist/contracts/agent-readiness/src/declaration-acquisition.d.ts.map +1 -0
  14. package/dist/contracts/agent-readiness/src/declaration-acquisition.js +159 -0
  15. package/dist/contracts/agent-readiness/src/declaration-acquisition.js.map +1 -0
  16. package/dist/contracts/agent-readiness/src/declaration-reference.d.ts +48 -0
  17. package/dist/contracts/agent-readiness/src/declaration-reference.d.ts.map +1 -0
  18. package/dist/contracts/agent-readiness/src/declaration-reference.js +42 -0
  19. package/dist/contracts/agent-readiness/src/declaration-reference.js.map +1 -0
  20. package/dist/contracts/agent-readiness/src/declaration.d.ts +1357 -0
  21. package/dist/contracts/agent-readiness/src/declaration.d.ts.map +1 -0
  22. package/dist/contracts/agent-readiness/src/declaration.js +659 -0
  23. package/dist/contracts/agent-readiness/src/declaration.js.map +1 -0
  24. package/dist/contracts/agent-readiness/src/evidence.d.ts +146 -0
  25. package/dist/contracts/agent-readiness/src/evidence.d.ts.map +1 -0
  26. package/dist/contracts/agent-readiness/src/evidence.js +154 -0
  27. package/dist/contracts/agent-readiness/src/evidence.js.map +1 -0
  28. package/dist/contracts/agent-readiness/src/index.d.ts +6487 -0
  29. package/dist/contracts/agent-readiness/src/index.d.ts.map +1 -0
  30. package/dist/contracts/agent-readiness/src/index.js +1487 -0
  31. package/dist/contracts/agent-readiness/src/index.js.map +1 -0
  32. package/dist/contracts/agent-readiness/src/interaction.d.ts +26 -0
  33. package/dist/contracts/agent-readiness/src/interaction.d.ts.map +1 -0
  34. package/dist/contracts/agent-readiness/src/interaction.js +24 -0
  35. package/dist/contracts/agent-readiness/src/interaction.js.map +1 -0
  36. package/dist/contracts/agent-readiness/src/method-pack.d.ts +391 -0
  37. package/dist/contracts/agent-readiness/src/method-pack.d.ts.map +1 -0
  38. package/dist/contracts/agent-readiness/src/method-pack.js +181 -0
  39. package/dist/contracts/agent-readiness/src/method-pack.js.map +1 -0
  40. package/dist/contracts/agent-readiness/src/shared.d.ts +119 -0
  41. package/dist/contracts/agent-readiness/src/shared.d.ts.map +1 -0
  42. package/dist/contracts/agent-readiness/src/shared.js +144 -0
  43. package/dist/contracts/agent-readiness/src/shared.js.map +1 -0
  44. package/dist/contracts/api/src/index.d.ts +48463 -0
  45. package/dist/contracts/api/src/index.d.ts.map +1 -0
  46. package/dist/contracts/api/src/index.js +1150 -0
  47. package/dist/contracts/api/src/index.js.map +1 -0
  48. package/dist/contracts/artifact/src/index.d.ts +1467 -0
  49. package/dist/contracts/artifact/src/index.d.ts.map +1 -0
  50. package/dist/contracts/artifact/src/index.js +325 -0
  51. package/dist/contracts/artifact/src/index.js.map +1 -0
  52. package/dist/contracts/assets/src/index.d.ts +1397 -0
  53. package/dist/contracts/assets/src/index.d.ts.map +1 -0
  54. package/dist/contracts/assets/src/index.js +560 -0
  55. package/dist/contracts/assets/src/index.js.map +1 -0
  56. package/dist/contracts/authoring/src/index.d.ts +1084 -0
  57. package/dist/contracts/authoring/src/index.d.ts.map +1 -0
  58. package/dist/contracts/authoring/src/index.js +211 -0
  59. package/dist/contracts/authoring/src/index.js.map +1 -0
  60. package/dist/contracts/authority/src/index.d.ts +135 -0
  61. package/dist/contracts/authority/src/index.d.ts.map +1 -0
  62. package/dist/contracts/authority/src/index.js +130 -0
  63. package/dist/contracts/authority/src/index.js.map +1 -0
  64. package/dist/contracts/billing/src/index.d.ts +587 -0
  65. package/dist/contracts/billing/src/index.d.ts.map +1 -0
  66. package/dist/contracts/billing/src/index.js +322 -0
  67. package/dist/contracts/billing/src/index.js.map +1 -0
  68. package/dist/contracts/catalog-verifier/src/index.d.ts +390 -0
  69. package/dist/contracts/catalog-verifier/src/index.d.ts.map +1 -0
  70. package/dist/contracts/catalog-verifier/src/index.js +222 -0
  71. package/dist/contracts/catalog-verifier/src/index.js.map +1 -0
  72. package/dist/contracts/commercial-work/src/index.d.ts +835 -0
  73. package/dist/contracts/commercial-work/src/index.d.ts.map +1 -0
  74. package/dist/contracts/commercial-work/src/index.js +510 -0
  75. package/dist/contracts/commercial-work/src/index.js.map +1 -0
  76. package/dist/contracts/events/src/index.d.ts +700 -0
  77. package/dist/contracts/events/src/index.d.ts.map +1 -0
  78. package/dist/contracts/events/src/index.js +553 -0
  79. package/dist/contracts/events/src/index.js.map +1 -0
  80. package/dist/contracts/evidence/src/index.d.ts +487 -0
  81. package/dist/contracts/evidence/src/index.d.ts.map +1 -0
  82. package/dist/contracts/evidence/src/index.js +342 -0
  83. package/dist/contracts/evidence/src/index.js.map +1 -0
  84. package/dist/contracts/feed/src/index.d.ts +159 -0
  85. package/dist/contracts/feed/src/index.d.ts.map +1 -0
  86. package/dist/contracts/feed/src/index.js +79 -0
  87. package/dist/contracts/feed/src/index.js.map +1 -0
  88. package/dist/contracts/funded-work/src/index.d.ts +64 -0
  89. package/dist/contracts/funded-work/src/index.d.ts.map +1 -0
  90. package/dist/contracts/funded-work/src/index.js +67 -0
  91. package/dist/contracts/funded-work/src/index.js.map +1 -0
  92. package/dist/contracts/observations/src/index.d.ts +134 -0
  93. package/dist/contracts/observations/src/index.d.ts.map +1 -0
  94. package/dist/contracts/observations/src/index.js +112 -0
  95. package/dist/contracts/observations/src/index.js.map +1 -0
  96. package/dist/contracts/policies/src/index.d.ts +151 -0
  97. package/dist/contracts/policies/src/index.d.ts.map +1 -0
  98. package/dist/contracts/policies/src/index.js +121 -0
  99. package/dist/contracts/policies/src/index.js.map +1 -0
  100. package/dist/contracts/publication/src/index.d.ts +4066 -0
  101. package/dist/contracts/publication/src/index.d.ts.map +1 -0
  102. package/dist/contracts/publication/src/index.js +535 -0
  103. package/dist/contracts/publication/src/index.js.map +1 -0
  104. package/dist/contracts/release/src/index.d.ts +2032 -0
  105. package/dist/contracts/release/src/index.d.ts.map +1 -0
  106. package/dist/contracts/release/src/index.js +252 -0
  107. package/dist/contracts/release/src/index.js.map +1 -0
  108. package/dist/contracts/revisions/src/index.d.ts +1405 -0
  109. package/dist/contracts/revisions/src/index.d.ts.map +1 -0
  110. package/dist/contracts/revisions/src/index.js +493 -0
  111. package/dist/contracts/revisions/src/index.js.map +1 -0
  112. package/dist/contracts/routes/src/index.d.ts +103 -0
  113. package/dist/contracts/routes/src/index.d.ts.map +1 -0
  114. package/dist/contracts/routes/src/index.js +163 -0
  115. package/dist/contracts/routes/src/index.js.map +1 -0
  116. package/dist/contracts/routes/src/public-route-allocations.generated.d.ts +2 -0
  117. package/dist/contracts/routes/src/public-route-allocations.generated.d.ts.map +1 -0
  118. package/dist/contracts/routes/src/public-route-allocations.generated.js +56 -0
  119. package/dist/contracts/routes/src/public-route-allocations.generated.js.map +1 -0
  120. package/dist/contracts/standards/src/index.d.ts +1482 -0
  121. package/dist/contracts/standards/src/index.d.ts.map +1 -0
  122. package/dist/contracts/standards/src/index.js +626 -0
  123. package/dist/contracts/standards/src/index.js.map +1 -0
  124. package/dist/contracts/taxonomy/src/index.d.ts +7 -0
  125. package/dist/contracts/taxonomy/src/index.d.ts.map +1 -0
  126. package/dist/contracts/taxonomy/src/index.js +25 -0
  127. package/dist/contracts/taxonomy/src/index.js.map +1 -0
  128. package/dist/modules/agent-readiness-policy/src/current-policy-metrics.d.ts +20 -0
  129. package/dist/modules/agent-readiness-policy/src/current-policy-metrics.d.ts.map +1 -0
  130. package/dist/modules/agent-readiness-policy/src/current-policy-metrics.js +604 -0
  131. package/dist/modules/agent-readiness-policy/src/current-policy-metrics.js.map +1 -0
  132. package/dist/modules/agent-readiness-policy/src/current-policy.d.ts +249 -0
  133. package/dist/modules/agent-readiness-policy/src/current-policy.d.ts.map +1 -0
  134. package/dist/modules/agent-readiness-policy/src/current-policy.js +470 -0
  135. package/dist/modules/agent-readiness-policy/src/current-policy.js.map +1 -0
  136. package/dist/modules/agent-readiness-policy/src/grading.d.ts +39 -0
  137. package/dist/modules/agent-readiness-policy/src/grading.d.ts.map +1 -0
  138. package/dist/modules/agent-readiness-policy/src/grading.js +40 -0
  139. package/dist/modules/agent-readiness-policy/src/grading.js.map +1 -0
  140. package/dist/modules/agent-readiness-policy/src/impact.d.ts +103 -0
  141. package/dist/modules/agent-readiness-policy/src/impact.d.ts.map +1 -0
  142. package/dist/modules/agent-readiness-policy/src/impact.js +249 -0
  143. package/dist/modules/agent-readiness-policy/src/impact.js.map +1 -0
  144. package/dist/modules/agent-readiness-policy/src/index.d.ts +811 -0
  145. package/dist/modules/agent-readiness-policy/src/index.d.ts.map +1 -0
  146. package/dist/modules/agent-readiness-policy/src/index.js +499 -0
  147. package/dist/modules/agent-readiness-policy/src/index.js.map +1 -0
  148. package/dist/modules/agent-readiness-policy/src/offer-relations.d.ts +12 -0
  149. package/dist/modules/agent-readiness-policy/src/offer-relations.d.ts.map +1 -0
  150. package/dist/modules/agent-readiness-policy/src/offer-relations.js +65 -0
  151. package/dist/modules/agent-readiness-policy/src/offer-relations.js.map +1 -0
  152. package/dist/modules/agent-readiness-policy/src/policy-validation.d.ts +4 -0
  153. package/dist/modules/agent-readiness-policy/src/policy-validation.d.ts.map +1 -0
  154. package/dist/modules/agent-readiness-policy/src/policy-validation.js +59 -0
  155. package/dist/modules/agent-readiness-policy/src/policy-validation.js.map +1 -0
  156. package/dist/modules/agent-readiness-policy/src/projection-lineage.d.ts +3 -0
  157. package/dist/modules/agent-readiness-policy/src/projection-lineage.d.ts.map +1 -0
  158. package/dist/modules/agent-readiness-policy/src/projection-lineage.js +12 -0
  159. package/dist/modules/agent-readiness-policy/src/projection-lineage.js.map +1 -0
  160. package/dist/modules/agent-readiness-policy/src/revision.d.ts +4 -0
  161. package/dist/modules/agent-readiness-policy/src/revision.d.ts.map +1 -0
  162. package/dist/modules/agent-readiness-policy/src/revision.js +46 -0
  163. package/dist/modules/agent-readiness-policy/src/revision.js.map +1 -0
  164. package/dist/modules/agent-readiness-policy/src/standard-mapping.d.ts +7 -0
  165. package/dist/modules/agent-readiness-policy/src/standard-mapping.d.ts.map +1 -0
  166. package/dist/modules/agent-readiness-policy/src/standard-mapping.js +13 -0
  167. package/dist/modules/agent-readiness-policy/src/standard-mapping.js.map +1 -0
  168. package/dist/modules/agent-readiness-policy/src/surface-selection.d.ts +36 -0
  169. package/dist/modules/agent-readiness-policy/src/surface-selection.d.ts.map +1 -0
  170. package/dist/modules/agent-readiness-policy/src/surface-selection.js +214 -0
  171. package/dist/modules/agent-readiness-policy/src/surface-selection.js.map +1 -0
  172. package/dist/modules/agent-readiness-repository/src/admission.d.ts +35 -0
  173. package/dist/modules/agent-readiness-repository/src/admission.d.ts.map +1 -0
  174. package/dist/modules/agent-readiness-repository/src/admission.js +56 -0
  175. package/dist/modules/agent-readiness-repository/src/admission.js.map +1 -0
  176. package/dist/modules/agent-readiness-repository/src/change.d.ts +62 -0
  177. package/dist/modules/agent-readiness-repository/src/change.d.ts.map +1 -0
  178. package/dist/modules/agent-readiness-repository/src/change.js +218 -0
  179. package/dist/modules/agent-readiness-repository/src/change.js.map +1 -0
  180. package/dist/modules/agent-readiness-repository/src/declaration-blob.d.ts +29 -0
  181. package/dist/modules/agent-readiness-repository/src/declaration-blob.d.ts.map +1 -0
  182. package/dist/modules/agent-readiness-repository/src/declaration-blob.js +126 -0
  183. package/dist/modules/agent-readiness-repository/src/declaration-blob.js.map +1 -0
  184. package/dist/modules/agent-readiness-repository/src/index.d.ts +102 -0
  185. package/dist/modules/agent-readiness-repository/src/index.d.ts.map +1 -0
  186. package/dist/modules/agent-readiness-repository/src/index.js +208 -0
  187. package/dist/modules/agent-readiness-repository/src/index.js.map +1 -0
  188. package/dist/modules/artifact/src/agent-readiness-closure.d.ts +24 -0
  189. package/dist/modules/artifact/src/agent-readiness-closure.d.ts.map +1 -0
  190. package/dist/modules/artifact/src/agent-readiness-closure.js +98 -0
  191. package/dist/modules/artifact/src/agent-readiness-closure.js.map +1 -0
  192. package/dist/modules/artifact/src/asset-closure.d.ts +12 -0
  193. package/dist/modules/artifact/src/asset-closure.d.ts.map +1 -0
  194. package/dist/modules/artifact/src/asset-closure.js +40 -0
  195. package/dist/modules/artifact/src/asset-closure.js.map +1 -0
  196. package/dist/modules/artifact/src/authoring-closure.d.ts +4 -0
  197. package/dist/modules/artifact/src/authoring-closure.d.ts.map +1 -0
  198. package/dist/modules/artifact/src/authoring-closure.js +19 -0
  199. package/dist/modules/artifact/src/authoring-closure.js.map +1 -0
  200. package/dist/modules/artifact/src/index.d.ts +46 -0
  201. package/dist/modules/artifact/src/index.d.ts.map +1 -0
  202. package/dist/modules/artifact/src/index.js +563 -0
  203. package/dist/modules/artifact/src/index.js.map +1 -0
  204. package/dist/modules/artifact/src/trust-history.d.ts +3 -0
  205. package/dist/modules/artifact/src/trust-history.d.ts.map +1 -0
  206. package/dist/modules/artifact/src/trust-history.js +134 -0
  207. package/dist/modules/artifact/src/trust-history.js.map +1 -0
  208. package/dist/modules/assets/src/authority-bundle.d.ts +36 -0
  209. package/dist/modules/assets/src/authority-bundle.d.ts.map +1 -0
  210. package/dist/modules/assets/src/authority-bundle.js +206 -0
  211. package/dist/modules/assets/src/authority-bundle.js.map +1 -0
  212. package/dist/modules/assets/src/delta.d.ts +18 -0
  213. package/dist/modules/assets/src/delta.d.ts.map +1 -0
  214. package/dist/modules/assets/src/delta.js +183 -0
  215. package/dist/modules/assets/src/delta.js.map +1 -0
  216. package/dist/modules/assets/src/disposition.d.ts +3 -0
  217. package/dist/modules/assets/src/disposition.d.ts.map +1 -0
  218. package/dist/modules/assets/src/disposition.js +30 -0
  219. package/dist/modules/assets/src/disposition.js.map +1 -0
  220. package/dist/modules/assets/src/index.d.ts +25 -0
  221. package/dist/modules/assets/src/index.d.ts.map +1 -0
  222. package/dist/modules/assets/src/index.js +234 -0
  223. package/dist/modules/assets/src/index.js.map +1 -0
  224. package/dist/modules/assets/src/ingestion.d.ts +69 -0
  225. package/dist/modules/assets/src/ingestion.d.ts.map +1 -0
  226. package/dist/modules/assets/src/ingestion.js +169 -0
  227. package/dist/modules/assets/src/ingestion.js.map +1 -0
  228. package/dist/modules/authority/src/index.d.ts +47 -0
  229. package/dist/modules/authority/src/index.d.ts.map +1 -0
  230. package/dist/modules/authority/src/index.js +349 -0
  231. package/dist/modules/authority/src/index.js.map +1 -0
  232. package/dist/modules/authority-state/src/index.d.ts +43 -0
  233. package/dist/modules/authority-state/src/index.d.ts.map +1 -0
  234. package/dist/modules/authority-state/src/index.js +194 -0
  235. package/dist/modules/authority-state/src/index.js.map +1 -0
  236. package/dist/modules/catalog-admission/src/admission-conflicts.d.ts +424 -0
  237. package/dist/modules/catalog-admission/src/admission-conflicts.d.ts.map +1 -0
  238. package/dist/modules/catalog-admission/src/admission-conflicts.js +369 -0
  239. package/dist/modules/catalog-admission/src/admission-conflicts.js.map +1 -0
  240. package/dist/modules/catalog-admission/src/index.d.ts +248 -0
  241. package/dist/modules/catalog-admission/src/index.d.ts.map +1 -0
  242. package/dist/modules/catalog-admission/src/index.js +601 -0
  243. package/dist/modules/catalog-admission/src/index.js.map +1 -0
  244. package/dist/modules/catalog-admission/src/machine-admission.d.ts +1273 -0
  245. package/dist/modules/catalog-admission/src/machine-admission.d.ts.map +1 -0
  246. package/dist/modules/catalog-admission/src/machine-admission.js +529 -0
  247. package/dist/modules/catalog-admission/src/machine-admission.js.map +1 -0
  248. package/dist/modules/catalog-admission/src/publication-assets.d.ts +5 -0
  249. package/dist/modules/catalog-admission/src/publication-assets.d.ts.map +1 -0
  250. package/dist/modules/catalog-admission/src/publication-assets.js +26 -0
  251. package/dist/modules/catalog-admission/src/publication-assets.js.map +1 -0
  252. package/dist/modules/catalog-admission/src/publication-dependencies.d.ts +96 -0
  253. package/dist/modules/catalog-admission/src/publication-dependencies.d.ts.map +1 -0
  254. package/dist/modules/catalog-admission/src/publication-dependencies.js +177 -0
  255. package/dist/modules/catalog-admission/src/publication-dependencies.js.map +1 -0
  256. package/dist/modules/catalog-admission/src/publication-entities.d.ts +9 -0
  257. package/dist/modules/catalog-admission/src/publication-entities.d.ts.map +1 -0
  258. package/dist/modules/catalog-admission/src/publication-entities.js +48 -0
  259. package/dist/modules/catalog-admission/src/publication-entities.js.map +1 -0
  260. package/dist/modules/catalog-admission/src/publication-recomposition.d.ts +42 -0
  261. package/dist/modules/catalog-admission/src/publication-recomposition.d.ts.map +1 -0
  262. package/dist/modules/catalog-admission/src/publication-recomposition.js +163 -0
  263. package/dist/modules/catalog-admission/src/publication-recomposition.js.map +1 -0
  264. package/dist/modules/catalog-admission/src/publication.d.ts +92 -0
  265. package/dist/modules/catalog-admission/src/publication.d.ts.map +1 -0
  266. package/dist/modules/catalog-admission/src/publication.js +605 -0
  267. package/dist/modules/catalog-admission/src/publication.js.map +1 -0
  268. package/dist/modules/catalog-admission/src/submission.d.ts +47 -0
  269. package/dist/modules/catalog-admission/src/submission.d.ts.map +1 -0
  270. package/dist/modules/catalog-admission/src/submission.js +289 -0
  271. package/dist/modules/catalog-admission/src/submission.js.map +1 -0
  272. package/dist/modules/catalog-authoring-validation/src/index.d.ts +46 -0
  273. package/dist/modules/catalog-authoring-validation/src/index.d.ts.map +1 -0
  274. package/dist/modules/catalog-authoring-validation/src/index.js +98 -0
  275. package/dist/modules/catalog-authoring-validation/src/index.js.map +1 -0
  276. package/dist/modules/catalog-model/src/index.d.ts +26 -0
  277. package/dist/modules/catalog-model/src/index.d.ts.map +1 -0
  278. package/dist/modules/catalog-model/src/index.js +80 -0
  279. package/dist/modules/catalog-model/src/index.js.map +1 -0
  280. package/dist/modules/cli/src/index.d.ts +10 -0
  281. package/dist/modules/cli/src/index.d.ts.map +1 -0
  282. package/dist/modules/cli/src/index.js +31 -0
  283. package/dist/modules/cli/src/index.js.map +1 -0
  284. package/dist/modules/compiler/src/index.d.ts +23 -0
  285. package/dist/modules/compiler/src/index.d.ts.map +1 -0
  286. package/dist/modules/compiler/src/index.js +75 -0
  287. package/dist/modules/compiler/src/index.js.map +1 -0
  288. package/dist/modules/evidence-operations/src/dependency-versions.d.ts +2 -0
  289. package/dist/modules/evidence-operations/src/dependency-versions.d.ts.map +1 -0
  290. package/dist/modules/evidence-operations/src/dependency-versions.js +17 -0
  291. package/dist/modules/evidence-operations/src/dependency-versions.js.map +1 -0
  292. package/dist/modules/evidence-operations/src/evidence-normalization.d.ts +111 -0
  293. package/dist/modules/evidence-operations/src/evidence-normalization.d.ts.map +1 -0
  294. package/dist/modules/evidence-operations/src/evidence-normalization.js +309 -0
  295. package/dist/modules/evidence-operations/src/evidence-normalization.js.map +1 -0
  296. package/dist/modules/evidence-operations/src/proof-graph.d.ts +22 -0
  297. package/dist/modules/evidence-operations/src/proof-graph.d.ts.map +1 -0
  298. package/dist/modules/evidence-operations/src/proof-graph.js +188 -0
  299. package/dist/modules/evidence-operations/src/proof-graph.js.map +1 -0
  300. package/dist/modules/evidence-operations/src/source-authority.d.ts +31 -0
  301. package/dist/modules/evidence-operations/src/source-authority.d.ts.map +1 -0
  302. package/dist/modules/evidence-operations/src/source-authority.js +60 -0
  303. package/dist/modules/evidence-operations/src/source-authority.js.map +1 -0
  304. package/dist/modules/evidence-operations/src/submission-verifier.d.ts +318 -0
  305. package/dist/modules/evidence-operations/src/submission-verifier.d.ts.map +1 -0
  306. package/dist/modules/evidence-operations/src/submission-verifier.js +392 -0
  307. package/dist/modules/evidence-operations/src/submission-verifier.js.map +1 -0
  308. package/dist/modules/evidence-operations/src/url-canonicalization.d.ts +3 -0
  309. package/dist/modules/evidence-operations/src/url-canonicalization.d.ts.map +1 -0
  310. package/dist/modules/evidence-operations/src/url-canonicalization.js +7 -0
  311. package/dist/modules/evidence-operations/src/url-canonicalization.js.map +1 -0
  312. package/dist/modules/primitives/src/index.d.ts +40 -0
  313. package/dist/modules/primitives/src/index.d.ts.map +1 -0
  314. package/dist/modules/primitives/src/index.js +154 -0
  315. package/dist/modules/primitives/src/index.js.map +1 -0
  316. package/dist/modules/provenance/src/evidence-bindings.d.ts +10 -0
  317. package/dist/modules/provenance/src/evidence-bindings.d.ts.map +1 -0
  318. package/dist/modules/provenance/src/evidence-bindings.js +49 -0
  319. package/dist/modules/provenance/src/evidence-bindings.js.map +1 -0
  320. package/dist/modules/provenance/src/evidence-coverage.d.ts +35 -0
  321. package/dist/modules/provenance/src/evidence-coverage.d.ts.map +1 -0
  322. package/dist/modules/provenance/src/evidence-coverage.js +131 -0
  323. package/dist/modules/provenance/src/evidence-coverage.js.map +1 -0
  324. package/dist/modules/provenance/src/index.d.ts +68 -0
  325. package/dist/modules/provenance/src/index.d.ts.map +1 -0
  326. package/dist/modules/provenance/src/index.js +536 -0
  327. package/dist/modules/provenance/src/index.js.map +1 -0
  328. package/dist/modules/provenance/src/material-claims.d.ts +381 -0
  329. package/dist/modules/provenance/src/material-claims.d.ts.map +1 -0
  330. package/dist/modules/provenance/src/material-claims.js +375 -0
  331. package/dist/modules/provenance/src/material-claims.js.map +1 -0
  332. package/dist/modules/provenance/src/prospective-evidence.d.ts +6 -0
  333. package/dist/modules/provenance/src/prospective-evidence.d.ts.map +1 -0
  334. package/dist/modules/provenance/src/prospective-evidence.js +61 -0
  335. package/dist/modules/provenance/src/prospective-evidence.js.map +1 -0
  336. package/dist/modules/release/src/asset-delta-verifier.d.ts +12 -0
  337. package/dist/modules/release/src/asset-delta-verifier.d.ts.map +1 -0
  338. package/dist/modules/release/src/asset-delta-verifier.js +82 -0
  339. package/dist/modules/release/src/asset-delta-verifier.js.map +1 -0
  340. package/dist/modules/release/src/changes.d.ts +23 -0
  341. package/dist/modules/release/src/changes.d.ts.map +1 -0
  342. package/dist/modules/release/src/changes.js +389 -0
  343. package/dist/modules/release/src/changes.js.map +1 -0
  344. package/dist/modules/release/src/identity.d.ts +17 -0
  345. package/dist/modules/release/src/identity.d.ts.map +1 -0
  346. package/dist/modules/release/src/identity.js +433 -0
  347. package/dist/modules/release/src/identity.js.map +1 -0
  348. package/dist/modules/release/src/inputs.d.ts +89 -0
  349. package/dist/modules/release/src/inputs.d.ts.map +1 -0
  350. package/dist/modules/release/src/inputs.js +514 -0
  351. package/dist/modules/release/src/inputs.js.map +1 -0
  352. package/dist/modules/release/src/publication-inputs.d.ts +9 -0
  353. package/dist/modules/release/src/publication-inputs.d.ts.map +1 -0
  354. package/dist/modules/release/src/publication-inputs.js +67 -0
  355. package/dist/modules/release/src/publication-inputs.js.map +1 -0
  356. package/dist/modules/release/src/release-directory-files.d.ts +7 -0
  357. package/dist/modules/release/src/release-directory-files.d.ts.map +1 -0
  358. package/dist/modules/release/src/release-directory-files.js +49 -0
  359. package/dist/modules/release/src/release-directory-files.js.map +1 -0
  360. package/dist/modules/release/src/release-revision-parser.d.ts +5 -0
  361. package/dist/modules/release/src/release-revision-parser.d.ts.map +1 -0
  362. package/dist/modules/release/src/release-revision-parser.js +19 -0
  363. package/dist/modules/release/src/release-revision-parser.js.map +1 -0
  364. package/dist/modules/release/src/transition.d.ts +36 -0
  365. package/dist/modules/release/src/transition.d.ts.map +1 -0
  366. package/dist/modules/release/src/transition.js +263 -0
  367. package/dist/modules/release/src/transition.js.map +1 -0
  368. package/dist/modules/release/src/verification-policies.d.ts +278 -0
  369. package/dist/modules/release/src/verification-policies.d.ts.map +1 -0
  370. package/dist/modules/release/src/verification-policies.js +38 -0
  371. package/dist/modules/release/src/verification-policies.js.map +1 -0
  372. package/dist/modules/release/src/verification-transitions.d.ts +14 -0
  373. package/dist/modules/release/src/verification-transitions.d.ts.map +1 -0
  374. package/dist/modules/release/src/verification-transitions.js +26 -0
  375. package/dist/modules/release/src/verification-transitions.js.map +1 -0
  376. package/dist/modules/release/src/verifier.d.ts +41 -0
  377. package/dist/modules/release/src/verifier.d.ts.map +1 -0
  378. package/dist/modules/release/src/verifier.js +577 -0
  379. package/dist/modules/release/src/verifier.js.map +1 -0
  380. package/dist/modules/standard-adapter-runtime/src/index.d.ts +16 -0
  381. package/dist/modules/standard-adapter-runtime/src/index.d.ts.map +1 -0
  382. package/dist/modules/standard-adapter-runtime/src/index.js +43 -0
  383. package/dist/modules/standard-adapter-runtime/src/index.js.map +1 -0
  384. package/dist/modules/standard-evidence/src/index.d.ts +33 -0
  385. package/dist/modules/standard-evidence/src/index.d.ts.map +1 -0
  386. package/dist/modules/standard-evidence/src/index.js +149 -0
  387. package/dist/modules/standard-evidence/src/index.js.map +1 -0
  388. package/dist/packages/catalog-verifier/src/application.d.ts +89 -0
  389. package/dist/packages/catalog-verifier/src/application.d.ts.map +1 -0
  390. package/dist/packages/catalog-verifier/src/application.js +363 -0
  391. package/dist/packages/catalog-verifier/src/application.js.map +1 -0
  392. package/dist/packages/catalog-verifier/src/index.d.ts +7 -0
  393. package/dist/packages/catalog-verifier/src/index.d.ts.map +1 -0
  394. package/dist/packages/catalog-verifier/src/index.js +7 -0
  395. package/dist/packages/catalog-verifier/src/index.js.map +1 -0
  396. package/dist/packages/catalog-verifier/src/program.d.ts +4 -0
  397. package/dist/packages/catalog-verifier/src/program.d.ts.map +1 -0
  398. package/dist/packages/catalog-verifier/src/program.js +203 -0
  399. package/dist/packages/catalog-verifier/src/program.js.map +1 -0
  400. package/package.json +63 -0
  401. package/sourcey-catalog-verify.js +7 -0
  402. package/taxonomy.json +29 -0
@@ -0,0 +1,1487 @@
1
+ import { z } from "zod";
2
+ import { SLUG_PATTERN } from "../../../modules/primitives/src/index.js";
3
+ import { provenanceSchema } from "../../artifact/src/index.js";
4
+ import { entityRevisionSchema, lifecycleStatusSchema, offerRevisionSchema, } from "../../revisions/src/index.js";
5
+ import { standardRequirementReferenceSchema } from "../../standards/src/index.js";
6
+ import { agentReadinessAssessmentTargetSchema, agentReadinessDeclarationRevisionSchema, agentReadinessDeclaredInterfaceSchema, agentReadinessEndpointRoleSchema, agentReadinessEndpointSchema, agentReadinessInterfaceFunctionSchema, agentReadinessInterfaceModalitySchema, agentReadinessOfferRelationPurposeSchema, agentReadinessParticipantSchema, agentReadinessResourceSchema, agentReadinessSurfaceExclusionSchema, agentReadinessSurfaceRelationKindSchema, agentReadinessSurfaceRelationSchema, } from "./declaration.js";
7
+ import { agentReadinessDeclarationStateSchema } from "./declaration-reference.js";
8
+ import { agentReadinessCorroborationAlternativeSchema, agentReadinessDeterminationBasisSchema, } from "./evidence.js";
9
+ import { agentReadinessAssessmentMethodPackSchema } from "./method-pack.js";
10
+ import { agentReadinessAssessmentMethodSchema, agentReadinessCatalogBindingSchema, agentReadinessDigestSchema, agentReadinessEntityIdSchema, agentReadinessEvaluationRoleSchema, agentReadinessFreshnessSchema, agentReadinessGradeSchema, agentReadinessIdentifierSchema, agentReadinessInstantSchema, agentReadinessOfferIdSchema, agentReadinessProfileIdSchema, agentReadinessPublicStateSchema, agentReadinessResourceRoleSchema, agentReadinessScopeSchema, agentReadinessSignalCodeSchema, agentReadinessSignalValueSchema, agentReadinessStageOutcomeSchema, agentReadinessStageSchema, agentReadinessSurfaceReferenceSchema, sameAgentReadinessScopeIdentity, } from "./shared.js";
11
+ export * from "./declaration.js";
12
+ export * from "./declaration-acquisition.js";
13
+ export * from "./declaration-reference.js";
14
+ export * from "./evidence.js";
15
+ export * from "./interaction.js";
16
+ export * from "./method-pack.js";
17
+ export * from "./shared.js";
18
+ const unresolvedPublicClaimPatterns = [
19
+ /\bundefined\b/iu,
20
+ /\[object Object\]/u,
21
+ /\bNaN\b/u,
22
+ /\{\{[^}]*\}\}/u,
23
+ /\$\{[^}]*\}/u,
24
+ /<%[^%]*%>/u,
25
+ /\uFFFD/u,
26
+ /\b(?:amount|cost|currency|date|duration|fee|limit|number|percentage|period|price|quantity|rate|time|total|value)\s+(?:at|by|for|from|is|of|to|with)\s*[.,;:!?](?:\s|$)/iu,
27
+ ];
28
+ /**
29
+ * Finds deterministic evidence of unresolved runtime or interpolation residue
30
+ * in text that would otherwise become a public factual claim.
31
+ */
32
+ export function agentReadinessPublicClaimResidue(value) {
33
+ const text = value.trim();
34
+ return unresolvedPublicClaimPatterns.some((pattern) => pattern.test(text))
35
+ ? "Public Agent Readiness claims cannot contain unresolved rendered content."
36
+ : null;
37
+ }
38
+ export const agentReadinessPublicClaimTextSchema = z
39
+ .string()
40
+ .trim()
41
+ .min(1)
42
+ .max(500)
43
+ .superRefine((value, context) => {
44
+ const issue = agentReadinessPublicClaimResidue(value);
45
+ if (issue)
46
+ context.addIssue({ code: "custom", message: issue });
47
+ });
48
+ export const agentReadinessSignalInputSchema = z
49
+ .object({
50
+ stage: agentReadinessStageSchema,
51
+ signal_code: agentReadinessSignalCodeSchema,
52
+ selector_group_id: agentReadinessIdentifierSchema,
53
+ value: agentReadinessSignalValueSchema,
54
+ observed_at: agentReadinessInstantSchema,
55
+ tested_surfaces: z.array(agentReadinessSurfaceReferenceSchema).min(1),
56
+ assessment_method: agentReadinessAssessmentMethodSchema,
57
+ determination_bases: z.array(agentReadinessDeterminationBasisSchema),
58
+ note: agentReadinessPublicClaimTextSchema.optional(),
59
+ })
60
+ .strict()
61
+ .superRefine((value, context) => {
62
+ assertUniqueSurfaceReferences(value.tested_surfaces, context, ["tested_surfaces"]);
63
+ if ((value.value === "unknown") !== (value.determination_bases.length === 0)) {
64
+ context.addIssue({
65
+ code: "custom",
66
+ path: ["determination_bases"],
67
+ message: "Every factual signal requires a determination basis; unknown signals cannot claim one.",
68
+ });
69
+ }
70
+ if (new Set(value.determination_bases.map((basis) => JSON.stringify(basis))).size !==
71
+ value.determination_bases.length) {
72
+ context.addIssue({
73
+ code: "custom",
74
+ path: ["determination_bases"],
75
+ message: "A signal cannot repeat a determination basis.",
76
+ });
77
+ }
78
+ for (const [index, basis] of value.determination_bases.entries()) {
79
+ if (basis.kind === "bounded_absence" &&
80
+ basis.covered_surfaces.some((covered) => !value.tested_surfaces.some((tested) => sameSurface(covered, tested)))) {
81
+ context.addIssue({
82
+ code: "custom",
83
+ path: ["determination_bases", index, "covered_surfaces"],
84
+ message: "Bounded absence must cover tested surfaces from the same signal.",
85
+ });
86
+ }
87
+ }
88
+ });
89
+ export const agentReadinessEvidenceBindingSchema = z
90
+ .object({
91
+ stage: agentReadinessStageSchema,
92
+ signal_code: agentReadinessSignalCodeSchema,
93
+ evidence_event_ids: z.array(agentReadinessDigestSchema).min(1),
94
+ observation_ids: z.array(agentReadinessDigestSchema).min(1),
95
+ })
96
+ .strict();
97
+ const agentReadinessRevisionFields = {
98
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
99
+ entity_id: agentReadinessEntityIdSchema,
100
+ scope: agentReadinessScopeSchema,
101
+ catalog_binding: agentReadinessCatalogBindingSchema,
102
+ declaration_revision_digest: agentReadinessDigestSchema,
103
+ declaration: agentReadinessDeclarationStateSchema,
104
+ lifecycle: lifecycleStatusSchema,
105
+ effective_from: agentReadinessInstantSchema,
106
+ effective_until: agentReadinessInstantSchema.optional(),
107
+ signals: z.array(agentReadinessSignalInputSchema).min(1),
108
+ };
109
+ function validateAgentReadinessProfile(value, context) {
110
+ const keys = value.signals.map((signal) => `${signal.stage}:${signal.signal_code}`);
111
+ if (new Set(keys).size !== keys.length) {
112
+ context.addIssue({
113
+ code: "custom",
114
+ path: ["signals"],
115
+ message: "An agent readiness profile cannot repeat a stage signal.",
116
+ });
117
+ }
118
+ if (value.effective_until &&
119
+ Date.parse(value.effective_until) <= Date.parse(value.effective_from)) {
120
+ context.addIssue({
121
+ code: "custom",
122
+ path: ["effective_until"],
123
+ message: "Agent readiness profile effective interval is empty.",
124
+ });
125
+ }
126
+ }
127
+ export const agentReadinessProfileInputSchema = z
128
+ .object({
129
+ input_contract: z.literal("sourcey.agent-readiness-input/v1alpha1"),
130
+ ...agentReadinessRevisionFields,
131
+ evidence_bindings: z.array(agentReadinessEvidenceBindingSchema).min(1),
132
+ })
133
+ .strict()
134
+ .superRefine((value, context) => {
135
+ validateAgentReadinessProfile(value, context);
136
+ const signalKeys = new Set(value.signals.map((signal) => `${signal.stage}:${signal.signal_code}`));
137
+ const bindingKeys = value.evidence_bindings.map((binding) => `${binding.stage}:${binding.signal_code}`);
138
+ if (new Set(bindingKeys).size !== bindingKeys.length ||
139
+ bindingKeys.some((key) => !signalKeys.has(key)) ||
140
+ bindingKeys.length !== signalKeys.size) {
141
+ context.addIssue({
142
+ code: "custom",
143
+ path: ["evidence_bindings"],
144
+ message: "Every agent readiness signal requires exactly one separate evidence binding.",
145
+ });
146
+ }
147
+ });
148
+ export const agentReadinessOfferRelationInputSchema = z
149
+ .object({
150
+ relation_input_contract: z.literal("sourcey.agent-readiness-offer-relation-input/v1alpha1"),
151
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
152
+ offer_id: agentReadinessOfferIdSchema,
153
+ purpose: agentReadinessOfferRelationPurposeSchema,
154
+ applicable_stages: z.array(agentReadinessStageSchema).min(1),
155
+ effective_from: agentReadinessInstantSchema,
156
+ effective_until: agentReadinessInstantSchema.optional(),
157
+ declaration_revision_digest: agentReadinessDigestSchema,
158
+ offer_relation_proposal_id: agentReadinessIdentifierSchema,
159
+ admitted_offer_revision_digest: agentReadinessDigestSchema,
160
+ })
161
+ .strict()
162
+ .superRefine((value, context) => {
163
+ if (new Set(value.applicable_stages).size !== value.applicable_stages.length) {
164
+ context.addIssue({
165
+ code: "custom",
166
+ path: ["applicable_stages"],
167
+ message: "Offer relation input stages must be unique.",
168
+ });
169
+ }
170
+ validateOfferRelationInterval(value, context);
171
+ });
172
+ export const agentReadinessProfileReleaseInputSchema = z
173
+ .object({
174
+ release_input_contract: z.literal("sourcey.agent-readiness-release-input/v1alpha1"),
175
+ profile_input: agentReadinessProfileInputSchema,
176
+ declaration_revision: agentReadinessDeclarationRevisionSchema,
177
+ offer_relation_inputs: z.array(agentReadinessOfferRelationInputSchema),
178
+ })
179
+ .strict()
180
+ .superRefine((value, context) => {
181
+ if (value.profile_input.entity_id !== value.declaration_revision.entity_id ||
182
+ value.profile_input.declaration_revision_digest !==
183
+ value.declaration_revision.revision_digest ||
184
+ !sameAgentReadinessScopeIdentity(value.profile_input.scope, value.declaration_revision.declaration.scope)) {
185
+ context.addIssue({
186
+ code: "custom",
187
+ path: ["declaration_revision"],
188
+ message: "A profile release input must bind its exact Entity declaration revision.",
189
+ });
190
+ }
191
+ for (const [index, relation] of value.offer_relation_inputs.entries()) {
192
+ if (relation.agent_readiness_profile_id !== value.profile_input.agent_readiness_profile_id ||
193
+ relation.declaration_revision_digest !== value.declaration_revision.revision_digest) {
194
+ context.addIssue({
195
+ code: "custom",
196
+ path: ["offer_relation_inputs", index],
197
+ message: "An Offer relation input must bind its exact profile and declaration revision.",
198
+ });
199
+ }
200
+ }
201
+ const relationIdentities = value.offer_relation_inputs.map((relation) => `${relation.offer_id}:${relation.purpose}`);
202
+ if (new Set(relationIdentities).size !== relationIdentities.length) {
203
+ context.addIssue({
204
+ code: "custom",
205
+ path: ["offer_relation_inputs"],
206
+ message: "A profile release input cannot repeat an Offer and purpose relation.",
207
+ });
208
+ }
209
+ });
210
+ export const agentReadinessFactualInputSchema = z
211
+ .object({
212
+ factual_input_contract: z.literal("sourcey.agent-readiness-factual-input/v1alpha1"),
213
+ ...agentReadinessRevisionFields,
214
+ })
215
+ .strict()
216
+ .superRefine(validateAgentReadinessProfile);
217
+ export const agentReadinessRevisionCoreSchema = z
218
+ .object({
219
+ revision_contract: z.literal("sourcey.agent-readiness-revision/v1alpha1"),
220
+ ...agentReadinessRevisionFields,
221
+ })
222
+ .strict()
223
+ .superRefine(validateAgentReadinessProfile);
224
+ export const agentReadinessRevisionSchema = agentReadinessRevisionCoreSchema
225
+ .safeExtend({ revision_digest: agentReadinessDigestSchema })
226
+ .strict();
227
+ /**
228
+ * Stable head identity for closure and ownership checks. Historical Agent
229
+ * Readiness revision bodies remain opaque and are never reparsed through the
230
+ * current factual contract.
231
+ */
232
+ export const agentReadinessRevisionHeadSchema = z.object({
233
+ revision_contract: z.literal("sourcey.agent-readiness-revision/v1alpha1"),
234
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
235
+ entity_id: agentReadinessEntityIdSchema,
236
+ revision_digest: agentReadinessDigestSchema,
237
+ });
238
+ const publicFindingSchema = z
239
+ .object({
240
+ condition: z.string().min(1).max(160),
241
+ finding: z.string().min(1).max(280),
242
+ })
243
+ .strict();
244
+ const publicFindingByValueSchema = z
245
+ .object({
246
+ yes: publicFindingSchema,
247
+ no: publicFindingSchema,
248
+ partial: publicFindingSchema,
249
+ unknown: publicFindingSchema,
250
+ not_applicable: publicFindingSchema,
251
+ })
252
+ .strict();
253
+ const standardEvidenceSupportSchema = z
254
+ .object({
255
+ result: z.enum(["satisfied", "not_satisfied"]),
256
+ values: z.array(agentReadinessSignalValueSchema.exclude(["unknown"])).min(1),
257
+ })
258
+ .strict()
259
+ .superRefine((value, context) => {
260
+ if (new Set(value.values).size !== value.values.length) {
261
+ context.addIssue({
262
+ code: "custom",
263
+ path: ["values"],
264
+ message: "Standard evidence support values must be unique.",
265
+ });
266
+ }
267
+ });
268
+ const agentReadinessSurfaceSelectorSchema = z.discriminatedUnion("kind", [
269
+ z
270
+ .object({
271
+ kind: z.literal("resource_role"),
272
+ roles: z.array(agentReadinessResourceRoleSchema).min(1),
273
+ })
274
+ .strict(),
275
+ z
276
+ .object({
277
+ kind: z.literal("endpoint_role"),
278
+ roles: z.array(agentReadinessEndpointRoleSchema).min(1),
279
+ })
280
+ .strict(),
281
+ z
282
+ .object({
283
+ kind: z.literal("interface_signature"),
284
+ modalities: z.array(agentReadinessInterfaceModalitySchema).min(1),
285
+ functions: z.array(agentReadinessInterfaceFunctionSchema).min(1),
286
+ })
287
+ .strict(),
288
+ z
289
+ .object({
290
+ kind: z.literal("assessment_target_membership"),
291
+ membership: z.enum(["direct", "reachable"]),
292
+ })
293
+ .strict(),
294
+ z
295
+ .object({
296
+ kind: z.literal("target_relation"),
297
+ relation_kind: agentReadinessSurfaceRelationKindSchema,
298
+ direction: z.enum(["from_target", "to_target"]),
299
+ })
300
+ .strict(),
301
+ z
302
+ .object({
303
+ kind: z.literal("standard_requirement"),
304
+ requirement: standardRequirementReferenceSchema,
305
+ })
306
+ .strict(),
307
+ ]);
308
+ const agentReadinessSurfaceSelectorAlternativeSchema = z
309
+ .object({
310
+ alternative_id: agentReadinessIdentifierSchema,
311
+ selectors: z.array(agentReadinessSurfaceSelectorSchema).min(1),
312
+ })
313
+ .strict()
314
+ .superRefine((value, context) => {
315
+ if (new Set(value.selectors.map((selector) => JSON.stringify(selector))).size !==
316
+ value.selectors.length) {
317
+ context.addIssue({
318
+ code: "custom",
319
+ path: ["selectors"],
320
+ message: "A surface selector alternative cannot repeat a predicate.",
321
+ });
322
+ }
323
+ });
324
+ export const agentReadinessSurfaceSelectorGroupSchema = z
325
+ .object({
326
+ selector_group_id: agentReadinessIdentifierSchema,
327
+ coverage: z.enum(["at_least_one", "all_matches"]),
328
+ alternatives: z.array(agentReadinessSurfaceSelectorAlternativeSchema).min(1),
329
+ })
330
+ .strict()
331
+ .superRefine((value, context) => {
332
+ const ids = value.alternatives.map((alternative) => alternative.alternative_id);
333
+ if (new Set(ids).size !== ids.length) {
334
+ context.addIssue({
335
+ code: "custom",
336
+ path: ["alternatives"],
337
+ message: "Surface selector alternative IDs must be unique within a group.",
338
+ });
339
+ }
340
+ });
341
+ const agentReadinessValueEvidenceRuleSchema = z
342
+ .object({
343
+ value: agentReadinessSignalValueSchema.exclude(["unknown"]),
344
+ alternatives: z.array(agentReadinessCorroborationAlternativeSchema).min(1),
345
+ })
346
+ .strict()
347
+ .superRefine((value, context) => {
348
+ const ids = value.alternatives.map((alternative) => alternative.alternative_id);
349
+ if (new Set(ids).size !== ids.length) {
350
+ context.addIssue({
351
+ code: "custom",
352
+ path: ["alternatives"],
353
+ message: "Corroboration alternative IDs must be unique for one signal value.",
354
+ });
355
+ }
356
+ });
357
+ export const agentReadinessStandardEvidenceMappingSchema = z
358
+ .object({
359
+ requirement: standardRequirementReferenceSchema,
360
+ support: z.array(standardEvidenceSupportSchema).min(1).max(2),
361
+ })
362
+ .strict()
363
+ .superRefine((value, context) => {
364
+ if (value.requirement.relation !== "tests") {
365
+ context.addIssue({
366
+ code: "custom",
367
+ path: ["requirement", "relation"],
368
+ message: "Standard evidence mappings must test an exact requirement.",
369
+ });
370
+ }
371
+ if (new Set(value.support.map((mapping) => mapping.result)).size !== value.support.length) {
372
+ context.addIssue({
373
+ code: "custom",
374
+ path: ["support"],
375
+ message: "A standard result may appear only once per requirement mapping.",
376
+ });
377
+ }
378
+ });
379
+ export const agentReadinessPolicySignalRuleSchema = z
380
+ .object({
381
+ stage: agentReadinessStageSchema,
382
+ signal_code: agentReadinessSignalCodeSchema,
383
+ evaluation_role: agentReadinessEvaluationRoleSchema,
384
+ required: z.boolean(),
385
+ pass_values: z.array(agentReadinessSignalValueSchema).min(1),
386
+ constrained_values: z.array(agentReadinessSignalValueSchema),
387
+ fail_values: z.array(agentReadinessSignalValueSchema),
388
+ allow_not_applicable: z.boolean(),
389
+ allowed_method_digests: z.array(agentReadinessDigestSchema).min(1),
390
+ selector_groups: z.array(agentReadinessSurfaceSelectorGroupSchema).min(1),
391
+ evidence_terms: z
392
+ .array(z.string().regex(/^[a-z0-9][a-z0-9 .+/_:-]*[a-z0-9+]$/u))
393
+ .min(1)
394
+ .optional(),
395
+ value_evidence: z.array(agentReadinessValueEvidenceRuleSchema).min(1),
396
+ priority: z.number().int().nonnegative(),
397
+ blocker: z
398
+ .object({
399
+ code: z.string().min(1).max(160),
400
+ explanation: z.string().min(1).max(500),
401
+ })
402
+ .strict()
403
+ .optional(),
404
+ remediation: z
405
+ .object({
406
+ code: z.string().min(1).max(160),
407
+ instruction: z.string().min(1).max(500),
408
+ })
409
+ .strict()
410
+ .optional(),
411
+ public_findings: publicFindingByValueSchema,
412
+ external_references: z.array(standardRequirementReferenceSchema),
413
+ standard_evidence: z.array(agentReadinessStandardEvidenceMappingSchema),
414
+ })
415
+ .strict()
416
+ .superRefine((value, context) => {
417
+ if (value.evidence_terms &&
418
+ new Set(value.evidence_terms).size !== value.evidence_terms.length) {
419
+ context.addIssue({
420
+ code: "custom",
421
+ path: ["evidence_terms"],
422
+ message: "Evidence retrieval terms must be unique within a signal rule.",
423
+ });
424
+ }
425
+ const assignments = [...value.pass_values, ...value.constrained_values, ...value.fail_values];
426
+ if (new Set(assignments).size !== assignments.length) {
427
+ context.addIssue({
428
+ code: "custom",
429
+ message: "An agent readiness signal value can map to only one outcome.",
430
+ });
431
+ }
432
+ if (assignments.includes("not_applicable") !== value.allow_not_applicable) {
433
+ context.addIssue({
434
+ code: "custom",
435
+ path: ["allow_not_applicable"],
436
+ message: "not_applicable must be explicitly allowed and mapped.",
437
+ });
438
+ }
439
+ if (assignments.includes("unknown")) {
440
+ context.addIssue({
441
+ code: "custom",
442
+ message: "unknown is an unevaluated result and cannot be mapped to an outcome.",
443
+ });
444
+ }
445
+ const expected = value.allow_not_applicable
446
+ ? ["yes", "no", "partial", "not_applicable"]
447
+ : ["yes", "no", "partial"];
448
+ if (expected.some((candidate) => !assignments.includes(candidate)) ||
449
+ assignments.some((candidate) => !expected.includes(candidate))) {
450
+ context.addIssue({
451
+ code: "custom",
452
+ message: "Each assessable signal value must map to exactly one policy outcome.",
453
+ });
454
+ }
455
+ if (new Set(value.allowed_method_digests).size !== value.allowed_method_digests.length) {
456
+ context.addIssue({
457
+ code: "custom",
458
+ path: ["allowed_method_digests"],
459
+ message: "Allowed Agent Readiness method digests must be unique.",
460
+ });
461
+ }
462
+ const selectorGroupIds = value.selector_groups.map((group) => group.selector_group_id);
463
+ if (new Set(selectorGroupIds).size !== selectorGroupIds.length) {
464
+ context.addIssue({
465
+ code: "custom",
466
+ path: ["selector_groups"],
467
+ message: "Signal selector group IDs must be unique.",
468
+ });
469
+ }
470
+ const evidenceValues = value.value_evidence.map((evidence) => evidence.value);
471
+ if (new Set(evidenceValues).size !== evidenceValues.length ||
472
+ evidenceValues.length !== assignments.length ||
473
+ assignments.some((assignment) => assignment === "unknown" || !evidenceValues.includes(assignment))) {
474
+ context.addIssue({
475
+ code: "custom",
476
+ path: ["value_evidence"],
477
+ message: "Every assessable signal value requires exactly one evidence rule.",
478
+ });
479
+ }
480
+ const mappingKeys = value.standard_evidence.map(({ requirement }) => standardRequirementKey(requirement));
481
+ if (new Set(mappingKeys).size !== mappingKeys.length) {
482
+ context.addIssue({
483
+ code: "custom",
484
+ path: ["standard_evidence"],
485
+ message: "A signal rule cannot repeat an external standard requirement mapping.",
486
+ });
487
+ }
488
+ const testedReferenceKeys = value.external_references
489
+ .filter((reference) => reference.relation === "tests")
490
+ .map(standardRequirementKey);
491
+ if (testedReferenceKeys.length !== mappingKeys.length ||
492
+ testedReferenceKeys.some((key) => !mappingKeys.includes(key))) {
493
+ context.addIssue({
494
+ code: "custom",
495
+ path: ["standard_evidence"],
496
+ message: "Every tests reference must have exactly one policy-owned standard evidence mapping.",
497
+ });
498
+ }
499
+ const assessableValues = new Set(assignments);
500
+ if (value.standard_evidence.some((mapping) => mapping.support.some((support) => support.values.some((candidate) => !assessableValues.has(candidate))))) {
501
+ context.addIssue({
502
+ code: "custom",
503
+ path: ["standard_evidence"],
504
+ message: "Standard evidence can support only values assessed by the same signal rule.",
505
+ });
506
+ }
507
+ if (value.evaluation_role === "informational") {
508
+ if (value.required || value.blocker !== undefined || value.remediation !== undefined) {
509
+ context.addIssue({
510
+ code: "custom",
511
+ message: "Informational signals must be optional and cannot own blockers or remediation.",
512
+ });
513
+ }
514
+ }
515
+ if (value.evaluation_role === "barrier" && value.required) {
516
+ context.addIssue({
517
+ code: "custom",
518
+ path: ["required"],
519
+ message: "Barrier signals are assessed but cannot be required for core coverage.",
520
+ });
521
+ }
522
+ if (value.fail_values.length > 0 &&
523
+ value.evaluation_role !== "informational" &&
524
+ !value.blocker) {
525
+ context.addIssue({
526
+ code: "custom",
527
+ path: ["blocker"],
528
+ message: "A failing readiness signal requires a blocker explanation.",
529
+ });
530
+ }
531
+ if ((value.constrained_values.length > 0 || value.fail_values.length > 0) &&
532
+ value.evaluation_role !== "informational" &&
533
+ !value.remediation) {
534
+ context.addIssue({
535
+ code: "custom",
536
+ path: ["remediation"],
537
+ message: "A constrained or failing readiness signal requires remediation.",
538
+ });
539
+ }
540
+ });
541
+ function standardRequirementKey(value) {
542
+ return `${value.namespace}\u0000${value.version}\u0000${value.requirement_id}`;
543
+ }
544
+ const stageOutcomePrecedenceSchema = z
545
+ .array(agentReadinessStageOutcomeSchema)
546
+ .length(agentReadinessStageOutcomeSchema.options.length)
547
+ .superRefine((value, context) => {
548
+ if (new Set(value).size !== agentReadinessStageOutcomeSchema.options.length ||
549
+ agentReadinessStageOutcomeSchema.options.some((outcome) => !value.includes(outcome))) {
550
+ context.addIssue({
551
+ code: "custom",
552
+ message: "Agent readiness outcome precedence must contain every outcome exactly once.",
553
+ });
554
+ }
555
+ });
556
+ const publicStateDescriptorSchema = z
557
+ .object({
558
+ state: agentReadinessPublicStateSchema,
559
+ label: z.string().min(1).max(40),
560
+ })
561
+ .strict();
562
+ const agentReadinessGradingSchema = z
563
+ .object({
564
+ strategy: z.literal("stage-state-cardinality"),
565
+ grade_by_limited_stage_count: z
566
+ .object({
567
+ "0": z.literal("A+"),
568
+ "1": z.literal("A"),
569
+ "2": z.literal("B+"),
570
+ "3": z.literal("B"),
571
+ "4": z.literal("C+"),
572
+ "5": z.literal("C"),
573
+ })
574
+ .strict(),
575
+ failure_grade_by_stage: z
576
+ .object({
577
+ evaluate: z.literal("D"),
578
+ sign_up: z.literal("D"),
579
+ pay: z.literal("D"),
580
+ provision: z.literal("F"),
581
+ operate: z.literal("F"),
582
+ })
583
+ .strict(),
584
+ unverified_barrier_grade_cap: z.literal("B+").optional(),
585
+ not_applicable_signals: z.literal("excluded"),
586
+ unrated_when: z
587
+ .object({
588
+ coverage: z.literal("not-complete"),
589
+ freshness: z.literal("not-fresh"),
590
+ })
591
+ .strict(),
592
+ })
593
+ .strict();
594
+ export const agentReadinessAssessmentBasisSchema = z
595
+ .object({
596
+ principal: z.literal("authorized_human_or_organization"),
597
+ initial_state: z
598
+ .object({
599
+ product_specific_account: z.literal(false),
600
+ product_credentials: z.literal(false),
601
+ paid_subscription: z.literal(false),
602
+ provisioned_resource: z.literal(false),
603
+ external_identity: z.literal("only_when_declared_by_exact_funnel"),
604
+ })
605
+ .strict(),
606
+ permitted_human_boundaries: z.array(z.enum([
607
+ "account_ownership_confirmation",
608
+ "delegated_identity_consent",
609
+ "regulated_approval",
610
+ "final_payment_or_irreversible_commitment",
611
+ ])),
612
+ required_handoff_properties: z.array(z.enum(["exact_disclosure", "resumable_handoff", "deterministic_continuation"])),
613
+ forbidden_substitutions: z.array(z.enum([
614
+ "captcha_solving",
615
+ "human_password_or_session_sharing",
616
+ "concealed_agent_identity",
617
+ "invented_eligibility",
618
+ "unbound_out_of_band_code",
619
+ "vendor_policy_bypass",
620
+ "unapproved_consequential_action",
621
+ ])),
622
+ success: z
623
+ .object({
624
+ target_coverage: z.literal("every_declared_target"),
625
+ interface_coverage: z.literal("at_least_one_declared_alternative"),
626
+ authority: z.literal("scoped"),
627
+ failure_semantics: z.literal("documented"),
628
+ recovery: z.literal("supported"),
629
+ })
630
+ .strict(),
631
+ observed_assessment: z
632
+ .object({
633
+ allowed_sources: z.array(z.enum([
634
+ "public_documentation",
635
+ "public_metadata",
636
+ "public_endpoints",
637
+ "non_mutating_interaction",
638
+ "operator_attested_public_observation",
639
+ ])),
640
+ consequential_claims: z.literal("certification_required"),
641
+ })
642
+ .strict(),
643
+ })
644
+ .strict()
645
+ .superRefine((value, context) => {
646
+ for (const key of [
647
+ "permitted_human_boundaries",
648
+ "required_handoff_properties",
649
+ "forbidden_substitutions",
650
+ ]) {
651
+ if (new Set(value[key]).size !== value[key].length) {
652
+ context.addIssue({
653
+ code: "custom",
654
+ path: [key],
655
+ message: `Assessment basis ${key} must be unique.`,
656
+ });
657
+ }
658
+ }
659
+ if (new Set(value.observed_assessment.allowed_sources).size !==
660
+ value.observed_assessment.allowed_sources.length) {
661
+ context.addIssue({
662
+ code: "custom",
663
+ path: ["observed_assessment", "allowed_sources"],
664
+ message: "Assessment basis allowed sources must be unique.",
665
+ });
666
+ }
667
+ });
668
+ export const agentReadinessPolicyCoreSchema = z
669
+ .object({
670
+ policy_contract: z.literal("sourcey.agent-readiness-policy/v1alpha1"),
671
+ policy_version: z.string().min(1),
672
+ assessment_basis: agentReadinessAssessmentBasisSchema,
673
+ assessment_methods: z.array(agentReadinessAssessmentMethodPackSchema).min(1),
674
+ signal_rules: z.array(agentReadinessPolicySignalRuleSchema).min(1),
675
+ aggregation: z
676
+ .object({
677
+ stage: z.literal("worst-signal"),
678
+ overall: z.literal("worst-stage"),
679
+ outcome_precedence: stageOutcomePrecedenceSchema,
680
+ blocker_precedence: z.literal("outcome-then-rule-priority"),
681
+ tie_breaker: z.literal("signal-code"),
682
+ })
683
+ .strict(),
684
+ coverage: z
685
+ .object({
686
+ unknown_signals: z.literal("uncovered"),
687
+ contradicted_signals: z.literal("uncovered"),
688
+ })
689
+ .strict(),
690
+ freshness: z
691
+ .object({
692
+ source: z.literal("observation-freshness-policy"),
693
+ aggregation: z.enum(["worst-required-signal", "worst-evaluated-signal", "worst-signal"]),
694
+ })
695
+ .strict(),
696
+ public_states: z
697
+ .object({
698
+ pass: publicStateDescriptorSchema,
699
+ constrained: publicStateDescriptorSchema,
700
+ fail: publicStateDescriptorSchema,
701
+ unknown: publicStateDescriptorSchema,
702
+ not_applicable: publicStateDescriptorSchema,
703
+ })
704
+ .strict(),
705
+ grading: agentReadinessGradingSchema,
706
+ grade_derivation: z
707
+ .object({
708
+ label: z.string().min(1).max(80),
709
+ explanation: z.string().min(1).max(500),
710
+ coverage_rule: z.string().min(1).max(280),
711
+ outcome_rule: z.string().min(1).max(280),
712
+ })
713
+ .strict(),
714
+ })
715
+ .strict()
716
+ .superRefine((value, context) => {
717
+ const keys = value.signal_rules.map((rule) => `${rule.stage}:${rule.signal_code}`);
718
+ if (new Set(keys).size !== keys.length) {
719
+ context.addIssue({
720
+ code: "custom",
721
+ path: ["signal_rules"],
722
+ message: "An agent readiness policy cannot repeat a stage signal rule.",
723
+ });
724
+ }
725
+ const priorities = value.signal_rules.map((rule) => `${rule.stage}:${rule.priority}`);
726
+ if (new Set(priorities).size !== priorities.length) {
727
+ context.addIssue({
728
+ code: "custom",
729
+ path: ["signal_rules"],
730
+ message: "Agent readiness rule priorities must be unique within each stage.",
731
+ });
732
+ }
733
+ const methodDigests = new Set(value.assessment_methods.map((method) => method.method_digest));
734
+ if (methodDigests.size !== value.assessment_methods.length) {
735
+ context.addIssue({
736
+ code: "custom",
737
+ path: ["assessment_methods"],
738
+ message: "Agent readiness policy method digests must be unique.",
739
+ });
740
+ }
741
+ for (const [index, rule] of value.signal_rules.entries()) {
742
+ for (const methodDigest of rule.allowed_method_digests) {
743
+ if (!methodDigests.has(methodDigest)) {
744
+ context.addIssue({
745
+ code: "custom",
746
+ path: ["signal_rules", index, "allowed_method_digests"],
747
+ message: `Agent readiness signal rule references unresolved method ${methodDigest}.`,
748
+ });
749
+ }
750
+ }
751
+ if (rule.evaluation_role === "graded" && !rule.required) {
752
+ context.addIssue({
753
+ code: "custom",
754
+ path: ["signal_rules", index, "required"],
755
+ message: "Every graded Agent Readiness signal is required for coverage.",
756
+ });
757
+ }
758
+ if (rule.evaluation_role === "informational" && rule.required) {
759
+ context.addIssue({
760
+ code: "custom",
761
+ path: ["signal_rules", index, "required"],
762
+ message: "Informational Agent Readiness signals cannot be required for coverage.",
763
+ });
764
+ }
765
+ if (rule.evaluation_role === "barrier" && rule.required) {
766
+ context.addIssue({
767
+ code: "custom",
768
+ path: ["signal_rules", index, "required"],
769
+ message: "Barrier Agent Readiness signals cannot be required for core coverage.",
770
+ });
771
+ }
772
+ const standardSelectorKeys = rule.selector_groups.flatMap((group) => group.alternatives.flatMap((alternative) => alternative.selectors
773
+ .filter((selector) => selector.kind === "standard_requirement")
774
+ .map((selector) => standardRequirementKey(selector.requirement))));
775
+ if (standardSelectorKeys.some((key) => !rule.standard_evidence.some(({ requirement }) => standardRequirementKey(requirement) === key))) {
776
+ context.addIssue({
777
+ code: "custom",
778
+ path: ["signal_rules", index, "selector_groups"],
779
+ message: "Standard requirement selectors must bind exact policy evidence mappings.",
780
+ });
781
+ }
782
+ }
783
+ for (const stage of agentReadinessStageSchema.options) {
784
+ if (!value.signal_rules.some((rule) => rule.stage === stage && rule.evaluation_role === "graded" && rule.required)) {
785
+ context.addIssue({
786
+ code: "custom",
787
+ path: ["signal_rules"],
788
+ message: `Agent readiness policy has no required graded rules for ${stage}.`,
789
+ });
790
+ }
791
+ }
792
+ const expectedStates = {
793
+ pass: "ready",
794
+ constrained: "limited",
795
+ fail: "blocked",
796
+ unknown: "unknown",
797
+ not_applicable: "not_applicable",
798
+ };
799
+ for (const [outcome, state] of Object.entries(expectedStates)) {
800
+ if (value.public_states[outcome].state !== state) {
801
+ context.addIssue({
802
+ code: "custom",
803
+ path: ["public_states", outcome, "state"],
804
+ message: `Outcome ${outcome} must project to public state ${state}.`,
805
+ });
806
+ }
807
+ }
808
+ });
809
+ export const agentReadinessPolicySchema = agentReadinessPolicyCoreSchema
810
+ .safeExtend({ policy_digest: agentReadinessDigestSchema })
811
+ .strict();
812
+ const projectedBlockerSchema = z
813
+ .object({
814
+ signal_code: agentReadinessSignalCodeSchema,
815
+ code: z.string().min(1).max(160),
816
+ explanation: z.string().min(1).max(500),
817
+ })
818
+ .strict();
819
+ const projectedRemediationSchema = z
820
+ .object({
821
+ signal_code: agentReadinessSignalCodeSchema,
822
+ code: z.string().min(1).max(160),
823
+ instruction: z.string().min(1).max(500),
824
+ })
825
+ .strict();
826
+ const projectedFindingSchema = z
827
+ .object({
828
+ signal_code: agentReadinessSignalCodeSchema,
829
+ condition: z.string().min(1).max(160),
830
+ finding: z.string().min(1).max(280),
831
+ context: agentReadinessPublicClaimTextSchema.optional(),
832
+ })
833
+ .strict();
834
+ export const agentReadinessProjectedSignalSchema = z
835
+ .object({
836
+ signal_code: agentReadinessSignalCodeSchema,
837
+ evaluation_role: agentReadinessEvaluationRoleSchema,
838
+ required: z.boolean(),
839
+ value: agentReadinessSignalValueSchema,
840
+ value_label: z.string().min(1).max(40),
841
+ outcome: agentReadinessStageOutcomeSchema,
842
+ public_state: agentReadinessPublicStateSchema,
843
+ condition: z.string().min(1).max(160),
844
+ finding: z.string().min(1).max(280),
845
+ evidence_status: z.enum(["supported", "contradicted", "mixed", "missing"]),
846
+ freshness: agentReadinessFreshnessSchema,
847
+ observed_at: agentReadinessInstantSchema.optional(),
848
+ tested_surfaces: z.array(agentReadinessSurfaceReferenceSchema),
849
+ assessment_method: agentReadinessAssessmentMethodSchema.optional(),
850
+ determination_bases: z.array(agentReadinessDeterminationBasisSchema),
851
+ note: agentReadinessPublicClaimTextSchema.optional(),
852
+ blocker: projectedBlockerSchema.optional(),
853
+ remediation: projectedRemediationSchema.optional(),
854
+ })
855
+ .strict();
856
+ export const agentReadinessStageProjectionSchema = z
857
+ .object({
858
+ stage: agentReadinessStageSchema,
859
+ stage_label: z.string().min(1).max(40),
860
+ outcome: agentReadinessStageOutcomeSchema,
861
+ public_state: agentReadinessPublicStateSchema,
862
+ state_label: z.string().min(1).max(40),
863
+ primary_finding: projectedFindingSchema,
864
+ secondary_context: z.array(projectedFindingSchema),
865
+ signals: z.array(agentReadinessProjectedSignalSchema),
866
+ blockers: z.array(projectedBlockerSchema),
867
+ remediations: z.array(projectedRemediationSchema),
868
+ })
869
+ .strict();
870
+ export const agentReadinessPublicationVisibilitySchema = z.enum([
871
+ "discoverable",
872
+ "resolvable_only",
873
+ "private",
874
+ ]);
875
+ export const agentReadinessProjectionCoreSchema = z
876
+ .object({
877
+ projection_contract: z.literal("sourcey.agent-readiness-projection/v1alpha1"),
878
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
879
+ entity_id: agentReadinessEntityIdSchema,
880
+ scope: agentReadinessScopeSchema,
881
+ catalog_binding: agentReadinessCatalogBindingSchema,
882
+ declaration_revision_digest: agentReadinessDigestSchema,
883
+ declaration: agentReadinessDeclarationStateSchema,
884
+ surface_catalog: z
885
+ .object({
886
+ assessment_targets: z.array(agentReadinessAssessmentTargetSchema),
887
+ participants: z.array(agentReadinessParticipantSchema),
888
+ resources: z.array(agentReadinessResourceSchema),
889
+ endpoints: z.array(agentReadinessEndpointSchema),
890
+ interfaces: z.array(agentReadinessDeclaredInterfaceSchema),
891
+ relations: z.array(agentReadinessSurfaceRelationSchema),
892
+ surface_exclusions: z.array(agentReadinessSurfaceExclusionSchema),
893
+ })
894
+ .strict(),
895
+ lifecycle: lifecycleStatusSchema,
896
+ effective_from: agentReadinessInstantSchema,
897
+ effective_until: agentReadinessInstantSchema.optional(),
898
+ revision_digest: agentReadinessDigestSchema,
899
+ policy_digest: agentReadinessDigestSchema,
900
+ policy_version: z.string().min(1),
901
+ policy_as_of: agentReadinessInstantSchema,
902
+ assessment_basis: agentReadinessAssessmentBasisSchema,
903
+ overall_outcome: agentReadinessStageOutcomeSchema,
904
+ public_state: agentReadinessPublicStateSchema,
905
+ state_label: z.string().min(1).max(40),
906
+ grade: agentReadinessGradeSchema,
907
+ grade_derivation: z
908
+ .object({
909
+ label: z.string().min(1).max(80),
910
+ explanation: z.string().min(1).max(500),
911
+ coverage_rule: z.string().min(1).max(280),
912
+ outcome_rule: z.string().min(1).max(280),
913
+ })
914
+ .strict(),
915
+ publication: z
916
+ .object({
917
+ visibility: agentReadinessPublicationVisibilitySchema,
918
+ reasons: z.array(z.enum([
919
+ "lifecycle_not_active",
920
+ "coverage_incomplete",
921
+ "required_evidence_not_supported",
922
+ "freshness_not_fresh",
923
+ "unrated",
924
+ "no_useful_finding",
925
+ "open_dispute",
926
+ ])),
927
+ })
928
+ .strict(),
929
+ primary_finding: z
930
+ .object({
931
+ stage: agentReadinessStageSchema,
932
+ stage_label: z.string().min(1).max(40),
933
+ public_state: z.enum(["limited", "blocked"]),
934
+ finding: projectedFindingSchema,
935
+ blocker: projectedBlockerSchema.optional(),
936
+ })
937
+ .strict()
938
+ .optional(),
939
+ first_blocked_stage: z
940
+ .object({
941
+ stage: agentReadinessStageSchema,
942
+ stage_label: z.string().min(1).max(40),
943
+ finding: projectedFindingSchema,
944
+ blocker: projectedBlockerSchema.optional(),
945
+ })
946
+ .strict()
947
+ .optional(),
948
+ limitations: z.array(z
949
+ .object({
950
+ stage: agentReadinessStageSchema,
951
+ stage_label: z.string().min(1).max(40),
952
+ finding: projectedFindingSchema,
953
+ remediation: projectedRemediationSchema.optional(),
954
+ })
955
+ .strict()),
956
+ stages: z.array(agentReadinessStageProjectionSchema).length(5),
957
+ coverage: z
958
+ .object({
959
+ status: z.enum(["complete", "incomplete"]),
960
+ required_signals: z.number().int().nonnegative(),
961
+ covered_signals: z.number().int().nonnegative(),
962
+ ratio: z.number().min(0).max(1),
963
+ barrier_signals: z.number().int().nonnegative(),
964
+ verified_barrier_signals: z.number().int().nonnegative(),
965
+ barrier_ratio: z.number().min(0).max(1),
966
+ })
967
+ .strict(),
968
+ last_tested_at: agentReadinessInstantSchema,
969
+ freshness: agentReadinessFreshnessSchema,
970
+ provenance: provenanceSchema,
971
+ canonical_url: z.url(),
972
+ })
973
+ .strict();
974
+ export const agentReadinessProjectionSchema = agentReadinessProjectionCoreSchema
975
+ .safeExtend({ projection_digest: agentReadinessDigestSchema })
976
+ .strict();
977
+ export const agentReadinessStageSummarySchema = agentReadinessStageProjectionSchema
978
+ .pick({
979
+ stage: true,
980
+ stage_label: true,
981
+ outcome: true,
982
+ public_state: true,
983
+ state_label: true,
984
+ primary_finding: true,
985
+ })
986
+ .strict();
987
+ export const agentReadinessProvenanceSummarySchema = provenanceSchema
988
+ .pick({
989
+ tier: true,
990
+ freshness: true,
991
+ dispute: true,
992
+ })
993
+ .strict();
994
+ export const agentReadinessProfileSummarySchema = agentReadinessProjectionSchema
995
+ .pick({
996
+ agent_readiness_profile_id: true,
997
+ entity_id: true,
998
+ scope: true,
999
+ declaration_revision_digest: true,
1000
+ lifecycle: true,
1001
+ effective_from: true,
1002
+ revision_digest: true,
1003
+ policy_digest: true,
1004
+ policy_version: true,
1005
+ policy_as_of: true,
1006
+ overall_outcome: true,
1007
+ public_state: true,
1008
+ state_label: true,
1009
+ grade: true,
1010
+ grade_derivation: true,
1011
+ publication: true,
1012
+ primary_finding: true,
1013
+ coverage: true,
1014
+ last_tested_at: true,
1015
+ freshness: true,
1016
+ canonical_url: true,
1017
+ projection_digest: true,
1018
+ })
1019
+ .safeExtend({
1020
+ stages: z.array(agentReadinessStageSummarySchema).length(5),
1021
+ provenance: agentReadinessProvenanceSummarySchema,
1022
+ })
1023
+ .strict();
1024
+ /** The one compact public-list projection of a complete released profile. */
1025
+ export function summarizeAgentReadinessProfile(profile) {
1026
+ return agentReadinessProfileSummarySchema.parse({
1027
+ agent_readiness_profile_id: profile.agent_readiness_profile_id,
1028
+ entity_id: profile.entity_id,
1029
+ scope: profile.scope,
1030
+ declaration_revision_digest: profile.declaration_revision_digest,
1031
+ lifecycle: profile.lifecycle,
1032
+ effective_from: profile.effective_from,
1033
+ revision_digest: profile.revision_digest,
1034
+ policy_digest: profile.policy_digest,
1035
+ policy_version: profile.policy_version,
1036
+ policy_as_of: profile.policy_as_of,
1037
+ overall_outcome: profile.overall_outcome,
1038
+ public_state: profile.public_state,
1039
+ state_label: profile.state_label,
1040
+ grade: profile.grade,
1041
+ grade_derivation: profile.grade_derivation,
1042
+ publication: profile.publication,
1043
+ primary_finding: profile.primary_finding,
1044
+ stages: profile.stages.map((stage) => ({
1045
+ stage: stage.stage,
1046
+ stage_label: stage.stage_label,
1047
+ outcome: stage.outcome,
1048
+ public_state: stage.public_state,
1049
+ state_label: stage.state_label,
1050
+ primary_finding: stage.primary_finding,
1051
+ })),
1052
+ coverage: profile.coverage,
1053
+ last_tested_at: profile.last_tested_at,
1054
+ freshness: profile.freshness,
1055
+ provenance: {
1056
+ tier: profile.provenance.tier,
1057
+ freshness: profile.provenance.freshness,
1058
+ dispute: profile.provenance.dispute,
1059
+ },
1060
+ canonical_url: profile.canonical_url,
1061
+ projection_digest: profile.projection_digest,
1062
+ });
1063
+ }
1064
+ /**
1065
+ * Stable identity and lineage fields for an immutable projection already admitted by a
1066
+ * previous release. Unknown fields are retained so its exact historical bytes remain
1067
+ * digest-verifiable; callers must not use this contract for current semantic reads.
1068
+ */
1069
+ export const agentReadinessProjectionLineageSchema = z
1070
+ .object({
1071
+ projection_contract: z.literal("sourcey.agent-readiness-projection/v1alpha1"),
1072
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
1073
+ entity_id: agentReadinessEntityIdSchema,
1074
+ scope: agentReadinessScopeSchema,
1075
+ lifecycle: lifecycleStatusSchema,
1076
+ revision_digest: agentReadinessDigestSchema,
1077
+ policy_digest: agentReadinessDigestSchema,
1078
+ policy_as_of: agentReadinessInstantSchema,
1079
+ publication: z.object({ visibility: agentReadinessPublicationVisibilitySchema }).passthrough(),
1080
+ provenance: z.object({ freshness_policy_digest: agentReadinessDigestSchema }).passthrough(),
1081
+ canonical_url: z.url(),
1082
+ projection_digest: agentReadinessDigestSchema,
1083
+ })
1084
+ .passthrough();
1085
+ const agentReadinessOfferRelationRevisionFields = {
1086
+ relation_id: agentReadinessIdentifierSchema,
1087
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
1088
+ offer_id: agentReadinessOfferIdSchema,
1089
+ purpose: agentReadinessOfferRelationPurposeSchema,
1090
+ applicable_stages: z.array(agentReadinessStageSchema).min(1),
1091
+ effective_from: agentReadinessInstantSchema,
1092
+ effective_until: agentReadinessInstantSchema.optional(),
1093
+ declaration_revision_digest: agentReadinessDigestSchema,
1094
+ offer_relation_proposal_id: agentReadinessIdentifierSchema,
1095
+ admitted_offer_revision_digest: agentReadinessDigestSchema,
1096
+ };
1097
+ const agentReadinessOfferRelationRevisionFieldsSchema = z
1098
+ .object({
1099
+ relation_contract: z.literal("sourcey.agent-readiness-offer-relation/v1alpha1"),
1100
+ ...agentReadinessOfferRelationRevisionFields,
1101
+ })
1102
+ .strict();
1103
+ export const agentReadinessOfferRelationRevisionCoreSchema = agentReadinessOfferRelationRevisionFieldsSchema.superRefine(validateOfferRelationRevision);
1104
+ export const agentReadinessOfferRelationRevisionSchema = agentReadinessOfferRelationRevisionCoreSchema
1105
+ .safeExtend({ relation_revision_digest: agentReadinessDigestSchema })
1106
+ .strict();
1107
+ export const agentReadinessOfferRelationTransitionSchema = z
1108
+ .object({
1109
+ previous: agentReadinessOfferRelationRevisionSchema.nullable(),
1110
+ current: agentReadinessOfferRelationRevisionSchema.nullable(),
1111
+ })
1112
+ .strict()
1113
+ .superRefine((value, context) => {
1114
+ if (!value.previous && !value.current) {
1115
+ context.addIssue({
1116
+ code: "custom",
1117
+ message: "An Offer relation transition cannot be empty.",
1118
+ });
1119
+ return;
1120
+ }
1121
+ if (value.previous &&
1122
+ value.current &&
1123
+ !sameAgentReadinessOfferRelationIdentity(value.previous, value.current)) {
1124
+ context.addIssue({
1125
+ code: "custom",
1126
+ path: ["current"],
1127
+ message: "An Offer relation revision cannot change profile, Offer, or purpose identity.",
1128
+ });
1129
+ }
1130
+ });
1131
+ export const agentReadinessOfferRelationDeltaObjectSchema = z
1132
+ .object({
1133
+ object_contract: z.literal("sourcey.agent-readiness-offer-relation-delta-object/v1alpha1"),
1134
+ relation_id: agentReadinessIdentifierSchema,
1135
+ relation_input: agentReadinessOfferRelationInputSchema.nullable(),
1136
+ relation: agentReadinessOfferRelationRevisionSchema.nullable(),
1137
+ prior_relation: agentReadinessOfferRelationRevisionSchema.nullable(),
1138
+ catalog_context: z
1139
+ .object({
1140
+ entity_id: agentReadinessEntityIdSchema,
1141
+ profile_revision_digest: agentReadinessDigestSchema,
1142
+ declaration_revision: agentReadinessDeclarationRevisionSchema,
1143
+ offer_revision: offerRevisionSchema.nullable(),
1144
+ })
1145
+ .strict(),
1146
+ })
1147
+ .strict()
1148
+ .superRefine((value, context) => {
1149
+ const transition = agentReadinessOfferRelationTransitionSchema.safeParse({
1150
+ previous: value.prior_relation,
1151
+ current: value.relation,
1152
+ });
1153
+ if (!transition.success) {
1154
+ context.addIssue({
1155
+ code: "custom",
1156
+ message: "Offer relation delta must contain one identity-stable transition.",
1157
+ });
1158
+ return;
1159
+ }
1160
+ for (const [field, relation] of [
1161
+ ["relation", value.relation],
1162
+ ["prior_relation", value.prior_relation],
1163
+ ]) {
1164
+ if (relation && relation.relation_id !== value.relation_id) {
1165
+ context.addIssue({
1166
+ code: "custom",
1167
+ path: [field, "relation_id"],
1168
+ message: "Offer relation delta objects retain one exact relation identity.",
1169
+ });
1170
+ }
1171
+ }
1172
+ if ((value.relation === null) !== (value.relation_input === null)) {
1173
+ context.addIssue({
1174
+ code: "custom",
1175
+ path: ["relation_input"],
1176
+ message: "A current Offer relation requires its exact canonical input.",
1177
+ });
1178
+ }
1179
+ if (value.relation && value.relation_input) {
1180
+ const offerRevision = value.catalog_context.offer_revision;
1181
+ if (value.relation_input.agent_readiness_profile_id !==
1182
+ value.relation.agent_readiness_profile_id ||
1183
+ value.relation_input.offer_id !== value.relation.offer_id ||
1184
+ value.relation_input.purpose !== value.relation.purpose ||
1185
+ value.relation_input.declaration_revision_digest !==
1186
+ value.relation.declaration_revision_digest ||
1187
+ value.relation_input.admitted_offer_revision_digest !==
1188
+ value.relation.admitted_offer_revision_digest ||
1189
+ value.catalog_context.declaration_revision.revision_digest !==
1190
+ value.relation.declaration_revision_digest ||
1191
+ value.catalog_context.entity_id !== value.catalog_context.declaration_revision.entity_id ||
1192
+ offerRevision?.offer_id !== value.relation.offer_id ||
1193
+ offerRevision?.entity_id !== value.catalog_context.entity_id ||
1194
+ offerRevision?.revision_digest !== value.relation.admitted_offer_revision_digest) {
1195
+ context.addIssue({
1196
+ code: "custom",
1197
+ path: ["catalog_context"],
1198
+ message: "Current Offer relation delta lacks exact same-Entity Catalog closure.",
1199
+ });
1200
+ }
1201
+ }
1202
+ else if (value.catalog_context.offer_revision !== null) {
1203
+ context.addIssue({
1204
+ code: "custom",
1205
+ path: ["catalog_context", "offer_revision"],
1206
+ message: "A withdrawn Offer relation carries no current Offer closure.",
1207
+ });
1208
+ }
1209
+ });
1210
+ export const agentReadinessOfferRelationIndexSchema = z
1211
+ .object({
1212
+ relation_index_contract: z.literal("sourcey.agent-readiness-offer-relation-index/v1alpha1"),
1213
+ relations: z.record(agentReadinessIdentifierSchema, agentReadinessOfferRelationRevisionSchema),
1214
+ by_profile: z.record(agentReadinessProfileIdSchema, z.array(agentReadinessIdentifierSchema)),
1215
+ by_offer: z.record(agentReadinessOfferIdSchema, z.array(agentReadinessIdentifierSchema)),
1216
+ })
1217
+ .strict()
1218
+ .superRefine((value, context) => {
1219
+ const expectedByProfile = relationMembership(value.relations, "agent_readiness_profile_id");
1220
+ const expectedByOffer = relationMembership(value.relations, "offer_id");
1221
+ validateRelationMembership(value.by_profile, expectedByProfile, context, ["by_profile"]);
1222
+ validateRelationMembership(value.by_offer, expectedByOffer, context, ["by_offer"]);
1223
+ for (const [relationId, relation] of Object.entries(value.relations)) {
1224
+ if (relation.relation_id !== relationId) {
1225
+ context.addIssue({
1226
+ code: "custom",
1227
+ path: ["relations", relationId, "relation_id"],
1228
+ message: "An Offer relation index key must equal the relation identity.",
1229
+ });
1230
+ }
1231
+ }
1232
+ const identities = Object.values(value.relations).map((relation) => `${relation.agent_readiness_profile_id}:${relation.offer_id}:${relation.purpose}`);
1233
+ if (new Set(identities).size !== identities.length) {
1234
+ context.addIssue({
1235
+ code: "custom",
1236
+ path: ["relations"],
1237
+ message: "Current Offer relations cannot repeat profile, Offer, and purpose identity.",
1238
+ });
1239
+ }
1240
+ });
1241
+ export const agentReadinessOfferRelationInputsSchema = z
1242
+ .object({
1243
+ input_contract: z.literal("sourcey.agent-readiness-offer-relation-inputs/v1alpha1"),
1244
+ relations: z.array(z
1245
+ .object({
1246
+ relation_id: agentReadinessIdentifierSchema,
1247
+ input_digest: agentReadinessDigestSchema,
1248
+ relation_revision_digest: agentReadinessDigestSchema,
1249
+ path: z
1250
+ .string()
1251
+ .regex(/^inputs\/agent-readiness-offer-relations\/sha256-[a-f0-9]{64}\.json$/u),
1252
+ })
1253
+ .strict()),
1254
+ })
1255
+ .strict()
1256
+ .superRefine((value, context) => {
1257
+ const relationIds = value.relations.map((relation) => relation.relation_id);
1258
+ const inputDigests = value.relations.map((relation) => relation.input_digest);
1259
+ if (new Set(relationIds).size !== relationIds.length ||
1260
+ new Set(inputDigests).size !== inputDigests.length) {
1261
+ context.addIssue({
1262
+ code: "custom",
1263
+ path: ["relations"],
1264
+ message: "Offer relation input index identities and input digests must be unique.",
1265
+ });
1266
+ }
1267
+ const sorted = [...value.relations].sort((left, right) => left.relation_id.localeCompare(right.relation_id));
1268
+ if (sorted.some((relation, index) => relation.relation_id !== value.relations[index]?.relation_id)) {
1269
+ context.addIssue({
1270
+ code: "custom",
1271
+ path: ["relations"],
1272
+ message: "Offer relation inputs must be canonically ordered by relation identity.",
1273
+ });
1274
+ }
1275
+ });
1276
+ export const agentReadinessIndexSchema = z
1277
+ .object({
1278
+ agent_readiness_index_contract: z.literal("sourcey.agent-readiness-index/v1alpha1"),
1279
+ profiles: z.record(z.string(), z
1280
+ .object({
1281
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
1282
+ entity_id: agentReadinessEntityIdSchema,
1283
+ lifecycle: lifecycleStatusSchema,
1284
+ revision_digest: agentReadinessDigestSchema,
1285
+ policy_digest: agentReadinessDigestSchema,
1286
+ projection_digest: agentReadinessDigestSchema,
1287
+ canonical_url: z.url(),
1288
+ path: z.string().startsWith("agent-readiness/"),
1289
+ })
1290
+ .strict()),
1291
+ })
1292
+ .strict();
1293
+ export const agentReadinessInputsSchema = z
1294
+ .object({
1295
+ input_contract: z.literal("sourcey.agent-readiness-inputs/v1alpha1"),
1296
+ policy_digest: agentReadinessDigestSchema,
1297
+ profiles: z.array(z
1298
+ .object({
1299
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
1300
+ input_digest: agentReadinessDigestSchema,
1301
+ revision_digest: agentReadinessDigestSchema,
1302
+ path: z.string().startsWith("inputs/agent-readiness/"),
1303
+ })
1304
+ .strict()),
1305
+ })
1306
+ .strict();
1307
+ export const agentReadinessDeltaObjectSchema = z
1308
+ .object({
1309
+ object_contract: z.literal("sourcey.agent-readiness-delta-object/v1alpha1"),
1310
+ agent_readiness_profile_id: agentReadinessProfileIdSchema,
1311
+ profile_input: agentReadinessProfileInputSchema.nullable(),
1312
+ projection: agentReadinessProjectionSchema.nullable(),
1313
+ prior_projection: agentReadinessProjectionLineageSchema.nullable(),
1314
+ catalog_context: z
1315
+ .object({
1316
+ entity_slug: z.string().regex(SLUG_PATTERN),
1317
+ entity_revision: entityRevisionSchema,
1318
+ declaration_revision: agentReadinessDeclarationRevisionSchema,
1319
+ })
1320
+ .strict()
1321
+ .nullable(),
1322
+ })
1323
+ .strict()
1324
+ .superRefine((value, context) => {
1325
+ if (!value.projection && !value.prior_projection) {
1326
+ context.addIssue({
1327
+ code: "custom",
1328
+ message: "An Agent Readiness delta object requires a current or prior projection.",
1329
+ });
1330
+ return;
1331
+ }
1332
+ for (const [key, projection] of [
1333
+ ["projection", value.projection],
1334
+ ["prior_projection", value.prior_projection],
1335
+ ]) {
1336
+ if (projection &&
1337
+ projection.agent_readiness_profile_id !== value.agent_readiness_profile_id) {
1338
+ context.addIssue({
1339
+ code: "custom",
1340
+ path: [key, "agent_readiness_profile_id"],
1341
+ message: "Agent Readiness delta projections must retain the addressed profile ID.",
1342
+ });
1343
+ }
1344
+ }
1345
+ const current = value.projection;
1346
+ if (!current) {
1347
+ if (value.profile_input || value.catalog_context) {
1348
+ context.addIssue({
1349
+ code: "custom",
1350
+ message: "A retired Agent Readiness delta cannot carry current input or context.",
1351
+ });
1352
+ }
1353
+ return;
1354
+ }
1355
+ if (!value.catalog_context) {
1356
+ context.addIssue({
1357
+ code: "custom",
1358
+ path: ["catalog_context"],
1359
+ message: "A current Agent Readiness projection requires its exact Catalog context.",
1360
+ });
1361
+ return;
1362
+ }
1363
+ if (value.prior_projection &&
1364
+ !sameAgentReadinessScopeIdentity(value.prior_projection.scope, current.scope)) {
1365
+ context.addIssue({
1366
+ code: "custom",
1367
+ path: ["projection", "scope"],
1368
+ message: "An Agent Readiness profile cannot change product or funnel identity.",
1369
+ });
1370
+ }
1371
+ if (!value.prior_projection && !value.profile_input) {
1372
+ context.addIssue({
1373
+ code: "custom",
1374
+ path: ["profile_input"],
1375
+ message: "A new Agent Readiness profile requires its exact input.",
1376
+ });
1377
+ }
1378
+ if (!value.profile_input &&
1379
+ value.prior_projection?.revision_digest !== current.revision_digest) {
1380
+ context.addIssue({
1381
+ code: "custom",
1382
+ path: ["profile_input"],
1383
+ message: "A policy-only regrade must retain the exact current revision.",
1384
+ });
1385
+ }
1386
+ if (current.entity_id !== value.catalog_context.entity_revision.entity_id ||
1387
+ current.entity_id !== value.catalog_context.declaration_revision.entity_id ||
1388
+ current.declaration_revision_digest !==
1389
+ value.catalog_context.declaration_revision.revision_digest ||
1390
+ !sameAgentReadinessScopeIdentity(current.scope, value.catalog_context.declaration_revision.declaration.scope)) {
1391
+ context.addIssue({
1392
+ code: "custom",
1393
+ path: ["catalog_context"],
1394
+ message: "Agent Readiness projection does not match its Entity context.",
1395
+ });
1396
+ }
1397
+ if (value.profile_input &&
1398
+ (value.profile_input.agent_readiness_profile_id !== value.agent_readiness_profile_id ||
1399
+ value.profile_input.entity_id !== value.catalog_context.entity_revision.entity_id ||
1400
+ value.profile_input.declaration_revision_digest !==
1401
+ value.catalog_context.declaration_revision.revision_digest ||
1402
+ value.profile_input.catalog_binding.entity_revision_digest !==
1403
+ value.catalog_context.entity_revision.revision_digest)) {
1404
+ context.addIssue({
1405
+ code: "custom",
1406
+ path: ["catalog_context"],
1407
+ message: "Agent Readiness input does not bind its exact Entity context.",
1408
+ });
1409
+ }
1410
+ });
1411
+ function validateOfferRelationRevision(value, context) {
1412
+ const canonicalStages = agentReadinessStageSchema.options.filter((stage) => value.applicable_stages.includes(stage));
1413
+ if (canonicalStages.length !== value.applicable_stages.length ||
1414
+ canonicalStages.some((stage, index) => value.applicable_stages[index] !== stage)) {
1415
+ context.addIssue({
1416
+ code: "custom",
1417
+ path: ["applicable_stages"],
1418
+ message: "Offer relation stages must be unique and ordered by the canonical funnel.",
1419
+ });
1420
+ }
1421
+ validateOfferRelationInterval(value, context);
1422
+ }
1423
+ function validateOfferRelationInterval(value, context) {
1424
+ if (value.effective_until &&
1425
+ Date.parse(value.effective_until) <= Date.parse(value.effective_from)) {
1426
+ context.addIssue({
1427
+ code: "custom",
1428
+ path: ["effective_until"],
1429
+ message: "Agent Readiness Offer relation effective interval is empty.",
1430
+ });
1431
+ }
1432
+ }
1433
+ export function sameAgentReadinessOfferRelationIdentity(left, right) {
1434
+ return (left.relation_id === right.relation_id &&
1435
+ left.agent_readiness_profile_id === right.agent_readiness_profile_id &&
1436
+ left.offer_id === right.offer_id &&
1437
+ left.purpose === right.purpose);
1438
+ }
1439
+ function relationMembership(relations, field) {
1440
+ const memberships = new Map();
1441
+ for (const relation of Object.values(relations)) {
1442
+ memberships.set(field === "offer_id" ? relation.offer_id : relation.agent_readiness_profile_id, [
1443
+ ...(memberships.get(field === "offer_id" ? relation.offer_id : relation.agent_readiness_profile_id) ?? []),
1444
+ relation.relation_id,
1445
+ ]);
1446
+ }
1447
+ for (const [key, ids] of memberships)
1448
+ memberships.set(key, [...ids].sort());
1449
+ return memberships;
1450
+ }
1451
+ function validateRelationMembership(actual, expected, context, path) {
1452
+ if (Object.keys(actual).length !== expected.size) {
1453
+ context.addIssue({
1454
+ code: "custom",
1455
+ path,
1456
+ message: "Offer relation index membership is incomplete.",
1457
+ });
1458
+ return;
1459
+ }
1460
+ for (const [key, expectedIds] of expected) {
1461
+ const actualIds = actual[key];
1462
+ if (!actualIds ||
1463
+ actualIds.length !== expectedIds.length ||
1464
+ new Set(actualIds).size !== actualIds.length ||
1465
+ actualIds.some((id, index) => id !== expectedIds[index])) {
1466
+ context.addIssue({
1467
+ code: "custom",
1468
+ path: [...path, key],
1469
+ message: "Offer relation index membership must be unique, complete, and canonically ordered.",
1470
+ });
1471
+ }
1472
+ }
1473
+ }
1474
+ function sameSurface(left, right) {
1475
+ return left.node_kind === right.node_kind && left.node_id === right.node_id;
1476
+ }
1477
+ function assertUniqueSurfaceReferences(surfaces, context, path) {
1478
+ if (new Set(surfaces.map((surface) => `${surface.node_kind}:${surface.node_id}`)).size !==
1479
+ surfaces.length) {
1480
+ context.addIssue({
1481
+ code: "custom",
1482
+ path,
1483
+ message: "Surface references must be unique.",
1484
+ });
1485
+ }
1486
+ }
1487
+ //# sourceMappingURL=index.js.map