@qijenchen/design-system 0.1.0-beta.13 → 0.1.0-beta.130

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 (1751) hide show
  1. package/AGENTS.md +8 -0
  2. package/CLAUDE.md +3 -199
  3. package/README.md +6 -4
  4. package/cli-init.mjs +30 -2
  5. package/dist/components/Accordion/accordion.d.ts +3 -3
  6. package/dist/components/Accordion/accordion.d.ts.map +1 -1
  7. package/dist/components/Accordion/accordion.js +6 -3
  8. package/dist/components/Accordion/accordion.js.map +1 -1
  9. package/dist/components/Accordion/index.d.ts +2 -0
  10. package/dist/components/Accordion/index.d.ts.map +1 -0
  11. package/dist/components/Accordion/index.js +9 -0
  12. package/dist/components/Accordion/index.js.map +1 -0
  13. package/dist/components/AccountMenu/account-menu.d.ts +93 -0
  14. package/dist/components/AccountMenu/account-menu.d.ts.map +1 -0
  15. package/dist/components/AccountMenu/account-menu.js +73 -0
  16. package/dist/components/AccountMenu/account-menu.js.map +1 -0
  17. package/dist/components/AccountMenu/index.d.ts +2 -0
  18. package/dist/components/AccountMenu/index.d.ts.map +1 -0
  19. package/dist/components/AccountMenu/index.js +6 -0
  20. package/dist/components/AccountMenu/index.js.map +1 -0
  21. package/dist/components/AgentPanel/agent-fab.d.ts +24 -0
  22. package/dist/components/AgentPanel/agent-fab.d.ts.map +1 -0
  23. package/dist/components/AgentPanel/agent-logo.d.ts +40 -0
  24. package/dist/components/AgentPanel/agent-logo.d.ts.map +1 -0
  25. package/dist/components/AgentPanel/agent-logo.js +344 -0
  26. package/dist/components/AgentPanel/agent-logo.js.map +1 -0
  27. package/dist/components/AgentPanel/agent-panel.d.ts +148 -0
  28. package/dist/components/AgentPanel/agent-panel.d.ts.map +1 -0
  29. package/dist/components/AgentPanel/agent-panel.js +670 -0
  30. package/dist/components/AgentPanel/agent-panel.js.map +1 -0
  31. package/dist/components/AgentPanel/index.d.ts +2 -0
  32. package/dist/components/AgentPanel/index.d.ts.map +1 -0
  33. package/dist/components/AgentPanel/index.js +13 -0
  34. package/dist/components/AgentPanel/index.js.map +1 -0
  35. package/dist/components/Alert/alert.d.ts +7 -2
  36. package/dist/components/Alert/alert.d.ts.map +1 -1
  37. package/dist/components/Alert/alert.js +12 -8
  38. package/dist/components/Alert/alert.js.map +1 -1
  39. package/dist/components/Alert/index.d.ts +2 -0
  40. package/dist/components/Alert/index.d.ts.map +1 -0
  41. package/dist/components/Alert/index.js +7 -0
  42. package/dist/components/Alert/index.js.map +1 -0
  43. package/dist/components/AppShell/_demo-helpers.d.ts +3 -1
  44. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  45. package/dist/components/AppShell/app-shell.d.ts +19 -4
  46. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  47. package/dist/components/AppShell/app-shell.js +48 -11
  48. package/dist/components/AppShell/app-shell.js.map +1 -1
  49. package/dist/components/AppShell/index.d.ts +2 -0
  50. package/dist/components/AppShell/index.d.ts.map +1 -0
  51. package/dist/components/AppShell/index.js +8 -0
  52. package/dist/components/AppShell/index.js.map +1 -0
  53. package/dist/components/AspectRatio/aspect-ratio.d.ts +3 -2
  54. package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -1
  55. package/dist/components/AspectRatio/aspect-ratio.js +4 -2
  56. package/dist/components/AspectRatio/aspect-ratio.js.map +1 -1
  57. package/dist/components/AspectRatio/index.d.ts +2 -0
  58. package/dist/components/AspectRatio/index.d.ts.map +1 -0
  59. package/dist/components/AspectRatio/index.js +6 -0
  60. package/dist/components/AspectRatio/index.js.map +1 -0
  61. package/dist/components/Avatar/avatar.d.ts +14 -7
  62. package/dist/components/Avatar/avatar.d.ts.map +1 -1
  63. package/dist/components/Avatar/avatar.js +24 -30
  64. package/dist/components/Avatar/avatar.js.map +1 -1
  65. package/dist/components/Avatar/index.d.ts +2 -0
  66. package/dist/components/Avatar/index.d.ts.map +1 -0
  67. package/dist/components/Avatar/index.js +6 -0
  68. package/dist/components/Avatar/index.js.map +1 -0
  69. package/dist/components/Badge/badge.d.ts +21 -9
  70. package/dist/components/Badge/badge.d.ts.map +1 -1
  71. package/dist/components/Badge/badge.js +9 -6
  72. package/dist/components/Badge/badge.js.map +1 -1
  73. package/dist/components/Badge/index.d.ts +2 -0
  74. package/dist/components/Badge/index.d.ts.map +1 -0
  75. package/dist/components/Badge/index.js +7 -0
  76. package/dist/components/Badge/index.js.map +1 -0
  77. package/dist/components/Breadcrumb/breadcrumb.d.ts +16 -3
  78. package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
  79. package/dist/components/Breadcrumb/breadcrumb.js +21 -53
  80. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
  81. package/dist/components/Breadcrumb/index.d.ts +2 -0
  82. package/dist/components/Breadcrumb/index.d.ts.map +1 -0
  83. package/dist/components/Breadcrumb/index.js +12 -0
  84. package/dist/components/Breadcrumb/index.js.map +1 -0
  85. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +7 -4
  86. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  87. package/dist/components/BulkActionBar/bulk-action-bar.js +8 -8
  88. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  89. package/dist/components/BulkActionBar/index.d.ts +2 -0
  90. package/dist/components/BulkActionBar/index.d.ts.map +1 -0
  91. package/dist/components/BulkActionBar/index.js +7 -0
  92. package/dist/components/BulkActionBar/index.js.map +1 -0
  93. package/dist/components/Button/button-group.d.ts +31 -5
  94. package/dist/components/Button/button-group.d.ts.map +1 -1
  95. package/dist/components/Button/button-group.js +31 -14
  96. package/dist/components/Button/button-group.js.map +1 -1
  97. package/dist/components/Button/button.d.ts +15 -14
  98. package/dist/components/Button/button.d.ts.map +1 -1
  99. package/dist/components/Button/button.js +94 -52
  100. package/dist/components/Button/button.js.map +1 -1
  101. package/dist/components/Button/index.d.ts +3 -0
  102. package/dist/components/Button/index.d.ts.map +1 -0
  103. package/dist/components/Button/index.js +11 -0
  104. package/dist/components/Button/index.js.map +1 -0
  105. package/dist/components/Calendar/calendar.d.ts +22 -19
  106. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  107. package/dist/components/Calendar/calendar.js +180 -135
  108. package/dist/components/Calendar/calendar.js.map +1 -1
  109. package/dist/components/Calendar/index.d.ts +2 -0
  110. package/dist/components/Calendar/index.d.ts.map +1 -0
  111. package/dist/components/Calendar/index.js +6 -0
  112. package/dist/components/Calendar/index.js.map +1 -0
  113. package/dist/components/Carousel/carousel.d.ts +15 -9
  114. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  115. package/dist/components/Carousel/carousel.js +91 -50
  116. package/dist/components/Carousel/carousel.js.map +1 -1
  117. package/dist/components/Carousel/index.d.ts +2 -0
  118. package/dist/components/Carousel/index.d.ts.map +1 -0
  119. package/dist/components/Carousel/index.js +11 -0
  120. package/dist/components/Carousel/index.js.map +1 -0
  121. package/dist/components/Chart/chart.d.ts +2 -2
  122. package/dist/components/Chart/chart.d.ts.map +1 -1
  123. package/dist/components/Chart/chart.js +5 -2
  124. package/dist/components/Chart/chart.js.map +1 -1
  125. package/dist/components/Chart/index.d.ts +2 -0
  126. package/dist/components/Chart/index.d.ts.map +1 -0
  127. package/dist/components/Chart/index.js +11 -0
  128. package/dist/components/Chart/index.js.map +1 -0
  129. package/dist/components/Checkbox/checkbox-group.d.ts +2 -1
  130. package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -1
  131. package/dist/components/Checkbox/checkbox-group.js +21 -14
  132. package/dist/components/Checkbox/checkbox-group.js.map +1 -1
  133. package/dist/components/Checkbox/checkbox.d.ts +20 -11
  134. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  135. package/dist/components/Checkbox/checkbox.js +117 -18
  136. package/dist/components/Checkbox/checkbox.js.map +1 -1
  137. package/dist/components/Checkbox/index.d.ts +3 -0
  138. package/dist/components/Checkbox/index.d.ts.map +1 -0
  139. package/dist/components/Checkbox/index.js +10 -0
  140. package/dist/components/Checkbox/index.js.map +1 -0
  141. package/dist/components/Chip/chip.d.ts +30 -11
  142. package/dist/components/Chip/chip.d.ts.map +1 -1
  143. package/dist/components/Chip/chip.js +83 -33
  144. package/dist/components/Chip/chip.js.map +1 -1
  145. package/dist/components/Chip/index.d.ts +2 -0
  146. package/dist/components/Chip/index.d.ts.map +1 -0
  147. package/dist/components/Chip/index.js +8 -0
  148. package/dist/components/Chip/index.js.map +1 -0
  149. package/dist/components/CircularProgress/circular-progress.d.ts +2 -3
  150. package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -1
  151. package/dist/components/CircularProgress/circular-progress.js +5 -4
  152. package/dist/components/CircularProgress/circular-progress.js.map +1 -1
  153. package/dist/components/CircularProgress/index.d.ts +2 -0
  154. package/dist/components/CircularProgress/index.d.ts.map +1 -0
  155. package/dist/components/CircularProgress/index.js +6 -0
  156. package/dist/components/CircularProgress/index.js.map +1 -0
  157. package/dist/components/Coachmark/coachmark-story-helpers.d.ts +22 -0
  158. package/dist/components/Coachmark/coachmark-story-helpers.d.ts.map +1 -0
  159. package/dist/components/Coachmark/coachmark.d.ts +15 -6
  160. package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
  161. package/dist/components/Coachmark/coachmark.js +12 -4
  162. package/dist/components/Coachmark/coachmark.js.map +1 -1
  163. package/dist/components/Coachmark/index.d.ts +2 -0
  164. package/dist/components/Coachmark/index.d.ts.map +1 -0
  165. package/dist/components/Coachmark/index.js +6 -0
  166. package/dist/components/Coachmark/index.js.map +1 -0
  167. package/dist/components/Combobox/combobox.d.ts +39 -15
  168. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  169. package/dist/components/Combobox/combobox.js +169 -65
  170. package/dist/components/Combobox/combobox.js.map +1 -1
  171. package/dist/components/Combobox/index.d.ts +2 -0
  172. package/dist/components/Combobox/index.d.ts.map +1 -0
  173. package/dist/components/Combobox/index.js +6 -0
  174. package/dist/components/Combobox/index.js.map +1 -0
  175. package/dist/components/Command/command.d.ts +7 -3
  176. package/dist/components/Command/command.d.ts.map +1 -1
  177. package/dist/components/Command/command.js +23 -10
  178. package/dist/components/Command/command.js.map +1 -1
  179. package/dist/components/Command/index.d.ts +2 -0
  180. package/dist/components/Command/index.d.ts.map +1 -0
  181. package/dist/components/Command/index.js +14 -0
  182. package/dist/components/Command/index.js.map +1 -0
  183. package/dist/components/DataTable/active-editor-controller.d.ts +4 -3
  184. package/dist/components/DataTable/active-editor-controller.d.ts.map +1 -1
  185. package/dist/components/DataTable/cell-registry.d.ts +5 -5
  186. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  187. package/dist/components/DataTable/cell-registry.js +89 -95
  188. package/dist/components/DataTable/cell-registry.js.map +1 -1
  189. package/dist/components/DataTable/column-types.d.ts +11 -21
  190. package/dist/components/DataTable/column-types.d.ts.map +1 -1
  191. package/dist/components/DataTable/column-types.js.map +1 -1
  192. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +4 -3
  193. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts.map +1 -1
  194. package/dist/components/DataTable/data-table-column-visibility-panel.js +193 -0
  195. package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -0
  196. package/dist/components/DataTable/data-table-filter-group.d.ts +51 -0
  197. package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -0
  198. package/dist/components/DataTable/data-table-filter-group.js +159 -0
  199. package/dist/components/DataTable/data-table-filter-group.js.map +1 -0
  200. package/dist/components/DataTable/data-table-filter-labels.d.ts +44 -0
  201. package/dist/components/DataTable/data-table-filter-labels.d.ts.map +1 -0
  202. package/dist/components/DataTable/data-table-filter-labels.js +55 -0
  203. package/dist/components/DataTable/data-table-filter-labels.js.map +1 -0
  204. package/dist/components/DataTable/data-table-filter-panel.d.ts +12 -3
  205. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  206. package/dist/components/DataTable/data-table-filter-panel.js +316 -0
  207. package/dist/components/DataTable/data-table-filter-panel.js.map +1 -0
  208. package/dist/components/DataTable/data-table-filter-value-picker.d.ts +32 -0
  209. package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -0
  210. package/dist/components/DataTable/data-table-filter-value-picker.js +205 -0
  211. package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -0
  212. package/dist/components/DataTable/data-table-interaction-layer.d.ts +17 -20
  213. package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
  214. package/dist/components/DataTable/data-table-interaction-layer.js +1 -3
  215. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
  216. package/dist/components/DataTable/data-table-sort-manager.d.ts +5 -5
  217. package/dist/components/DataTable/data-table-sort-manager.d.ts.map +1 -1
  218. package/dist/components/DataTable/data-table-sort-manager.js +150 -0
  219. package/dist/components/DataTable/data-table-sort-manager.js.map +1 -0
  220. package/dist/components/DataTable/data-table.d.ts +66 -15
  221. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  222. package/dist/components/DataTable/data-table.js +367 -185
  223. package/dist/components/DataTable/data-table.js.map +1 -1
  224. package/dist/components/DataTable/filter-operators.d.ts +1 -1
  225. package/dist/components/DataTable/filter-operators.js +140 -0
  226. package/dist/components/DataTable/filter-operators.js.map +1 -0
  227. package/dist/components/DataTable/filter-tree.d.ts +6 -1
  228. package/dist/components/DataTable/filter-tree.d.ts.map +1 -1
  229. package/dist/components/DataTable/filter-tree.js +318 -0
  230. package/dist/components/DataTable/filter-tree.js.map +1 -0
  231. package/dist/components/DataTable/index.d.ts +5 -0
  232. package/dist/components/DataTable/index.d.ts.map +1 -0
  233. package/dist/components/DataTable/index.js +21 -0
  234. package/dist/components/DataTable/index.js.map +1 -0
  235. package/dist/components/DataTable/lib/column-meta.js +25 -0
  236. package/dist/components/DataTable/lib/column-meta.js.map +1 -0
  237. package/dist/components/DateGrid/date-grid.d.ts +23 -19
  238. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  239. package/dist/components/DateGrid/date-grid.js +60 -12
  240. package/dist/components/DateGrid/date-grid.js.map +1 -1
  241. package/dist/components/DateGrid/index.d.ts +2 -0
  242. package/dist/components/DateGrid/index.d.ts.map +1 -0
  243. package/dist/components/DateGrid/index.js +6 -0
  244. package/dist/components/DateGrid/index.js.map +1 -0
  245. package/dist/components/DatePicker/date-picker.d.ts +12 -12
  246. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  247. package/dist/components/DatePicker/date-picker.js +418 -309
  248. package/dist/components/DatePicker/date-picker.js.map +1 -1
  249. package/dist/components/DatePicker/index.d.ts +2 -0
  250. package/dist/components/DatePicker/index.d.ts.map +1 -0
  251. package/dist/components/DatePicker/index.js +8 -0
  252. package/dist/components/DatePicker/index.js.map +1 -0
  253. package/dist/components/DescriptionList/description-list.d.ts +6 -6
  254. package/dist/components/DescriptionList/description-list.d.ts.map +1 -1
  255. package/dist/components/DescriptionList/description-list.js +11 -10
  256. package/dist/components/DescriptionList/description-list.js.map +1 -1
  257. package/dist/components/DescriptionList/index.d.ts +2 -0
  258. package/dist/components/DescriptionList/index.d.ts.map +1 -0
  259. package/dist/components/DescriptionList/index.js +7 -0
  260. package/dist/components/DescriptionList/index.js.map +1 -0
  261. package/dist/components/Dialog/dialog.d.ts +22 -5
  262. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  263. package/dist/components/Dialog/dialog.js +44 -23
  264. package/dist/components/Dialog/dialog.js.map +1 -1
  265. package/dist/components/Dialog/index.d.ts +2 -0
  266. package/dist/components/Dialog/index.d.ts.map +1 -0
  267. package/dist/components/Dialog/index.js +16 -0
  268. package/dist/components/Dialog/index.js.map +1 -0
  269. package/dist/components/DropdownMenu/dropdown-menu.d.ts +19 -10
  270. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  271. package/dist/components/DropdownMenu/dropdown-menu.js +79 -28
  272. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  273. package/dist/components/DropdownMenu/index.d.ts +2 -0
  274. package/dist/components/DropdownMenu/index.d.ts.map +1 -0
  275. package/dist/components/DropdownMenu/index.js +21 -0
  276. package/dist/components/DropdownMenu/index.js.map +1 -0
  277. package/dist/components/Empty/empty.d.ts +14 -6
  278. package/dist/components/Empty/empty.d.ts.map +1 -1
  279. package/dist/components/Empty/empty.js +7 -7
  280. package/dist/components/Empty/empty.js.map +1 -1
  281. package/dist/components/Empty/index.d.ts +2 -0
  282. package/dist/components/Empty/index.d.ts.map +1 -0
  283. package/dist/components/Empty/index.js +6 -0
  284. package/dist/components/Empty/index.js.map +1 -0
  285. package/dist/components/Field/field-context.d.ts +111 -4
  286. package/dist/components/Field/field-context.d.ts.map +1 -1
  287. package/dist/components/Field/field-context.js +70 -0
  288. package/dist/components/Field/field-context.js.map +1 -1
  289. package/dist/components/Field/field-edit-keys.d.ts +21 -0
  290. package/dist/components/Field/field-edit-keys.d.ts.map +1 -0
  291. package/dist/components/Field/field-edit-keys.js +19 -0
  292. package/dist/components/Field/field-edit-keys.js.map +1 -0
  293. package/dist/components/Field/field-types.d.ts +22 -3
  294. package/dist/components/Field/field-types.d.ts.map +1 -1
  295. package/dist/components/Field/field-types.js.map +1 -1
  296. package/dist/components/Field/field-wrapper.d.ts +24 -6
  297. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  298. package/dist/components/Field/field-wrapper.js +98 -74
  299. package/dist/components/Field/field-wrapper.js.map +1 -1
  300. package/dist/components/Field/field.d.ts +7 -4
  301. package/dist/components/Field/field.d.ts.map +1 -1
  302. package/dist/components/Field/field.js +39 -6
  303. package/dist/components/Field/field.js.map +1 -1
  304. package/dist/components/Field/index.d.ts +3 -0
  305. package/dist/components/Field/index.d.ts.map +1 -0
  306. package/dist/components/Field/index.js +14 -0
  307. package/dist/components/Field/index.js.map +1 -0
  308. package/dist/components/Field/use-form-validation.d.ts +92 -0
  309. package/dist/components/Field/use-form-validation.d.ts.map +1 -0
  310. package/dist/components/Field/use-form-validation.js +137 -0
  311. package/dist/components/Field/use-form-validation.js.map +1 -0
  312. package/dist/components/FieldControlGroup/field-control-group.d.ts +8 -11
  313. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  314. package/dist/components/FieldControlGroup/field-control-group.js +2 -2
  315. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  316. package/dist/components/FieldControlGroup/index.d.ts +2 -0
  317. package/dist/components/FieldControlGroup/index.d.ts.map +1 -0
  318. package/dist/components/FieldControlGroup/index.js +6 -0
  319. package/dist/components/FieldControlGroup/index.js.map +1 -0
  320. package/dist/components/FileItem/file-item.d.ts +14 -2
  321. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  322. package/dist/components/FileItem/file-item.js +45 -16
  323. package/dist/components/FileItem/file-item.js.map +1 -1
  324. package/dist/components/FileItem/index.d.ts +2 -0
  325. package/dist/components/FileItem/index.d.ts.map +1 -0
  326. package/dist/components/FileItem/index.js +6 -0
  327. package/dist/components/FileItem/index.js.map +1 -0
  328. package/dist/components/FileUpload/file-upload.d.ts +39 -19
  329. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  330. package/dist/components/FileUpload/file-upload.js +102 -32
  331. package/dist/components/FileUpload/file-upload.js.map +1 -1
  332. package/dist/components/FileUpload/index.d.ts +2 -0
  333. package/dist/components/FileUpload/index.d.ts.map +1 -0
  334. package/dist/components/FileUpload/index.js +6 -0
  335. package/dist/components/FileUpload/index.js.map +1 -0
  336. package/dist/components/FileViewer/can-render-image.d.ts +6 -0
  337. package/dist/components/FileViewer/can-render-image.d.ts.map +1 -0
  338. package/dist/components/FileViewer/can-render-image.js +11 -0
  339. package/dist/components/FileViewer/can-render-image.js.map +1 -0
  340. package/dist/components/FileViewer/file-viewer.d.ts +4 -4
  341. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  342. package/dist/components/FileViewer/file-viewer.js +88 -50
  343. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  344. package/dist/components/FileViewer/image-renderer.d.ts +0 -5
  345. package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
  346. package/dist/components/FileViewer/image-renderer.js +23 -10
  347. package/dist/components/FileViewer/image-renderer.js.map +1 -1
  348. package/dist/components/FileViewer/index.d.ts +2 -0
  349. package/dist/components/FileViewer/index.d.ts.map +1 -0
  350. package/dist/components/FileViewer/index.js +7 -0
  351. package/dist/components/FileViewer/index.js.map +1 -0
  352. package/dist/components/HoverCard/hover-card.d.ts +9 -5
  353. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  354. package/dist/components/HoverCard/hover-card.js +12 -5
  355. package/dist/components/HoverCard/hover-card.js.map +1 -1
  356. package/dist/components/HoverCard/index.d.ts +2 -0
  357. package/dist/components/HoverCard/index.d.ts.map +1 -0
  358. package/dist/components/HoverCard/index.js +8 -0
  359. package/dist/components/HoverCard/index.js.map +1 -0
  360. package/dist/components/InlineEdit/index.d.ts +2 -0
  361. package/dist/components/InlineEdit/index.d.ts.map +1 -0
  362. package/dist/components/InlineEdit/index.js +6 -0
  363. package/dist/components/InlineEdit/index.js.map +1 -0
  364. package/dist/components/InlineEdit/inline-edit.d.ts +86 -0
  365. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -0
  366. package/dist/components/InlineEdit/inline-edit.js +254 -0
  367. package/dist/components/InlineEdit/inline-edit.js.map +1 -0
  368. package/dist/components/Input/index.d.ts +2 -0
  369. package/dist/components/Input/index.d.ts.map +1 -0
  370. package/dist/components/Input/index.js +6 -0
  371. package/dist/components/Input/index.js.map +1 -0
  372. package/dist/components/Input/input.d.ts +31 -10
  373. package/dist/components/Input/input.d.ts.map +1 -1
  374. package/dist/components/Input/input.js +67 -30
  375. package/dist/components/Input/input.js.map +1 -1
  376. package/dist/components/LinkInput/index.d.ts +2 -0
  377. package/dist/components/LinkInput/index.d.ts.map +1 -0
  378. package/dist/components/LinkInput/index.js +6 -0
  379. package/dist/components/LinkInput/index.js.map +1 -0
  380. package/dist/components/LinkInput/link-input.d.ts +9 -9
  381. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  382. package/dist/components/LinkInput/link-input.js +40 -37
  383. package/dist/components/LinkInput/link-input.js.map +1 -1
  384. package/dist/components/Menu/index.d.ts +2 -0
  385. package/dist/components/Menu/index.d.ts.map +1 -0
  386. package/dist/components/Menu/index.js +9 -0
  387. package/dist/components/Menu/index.js.map +1 -0
  388. package/dist/components/Menu/menu-item.d.ts +20 -4
  389. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  390. package/dist/components/Menu/menu-item.js +37 -9
  391. package/dist/components/Menu/menu-item.js.map +1 -1
  392. package/dist/components/Notice/index.d.ts +2 -0
  393. package/dist/components/Notice/index.d.ts.map +1 -0
  394. package/dist/components/Notice/index.js +8 -0
  395. package/dist/components/Notice/index.js.map +1 -0
  396. package/dist/components/Notice/notice.d.ts +35 -7
  397. package/dist/components/Notice/notice.d.ts.map +1 -1
  398. package/dist/components/Notice/notice.js +34 -10
  399. package/dist/components/Notice/notice.js.map +1 -1
  400. package/dist/components/NumberInput/index.d.ts +2 -0
  401. package/dist/components/NumberInput/index.d.ts.map +1 -0
  402. package/dist/components/NumberInput/index.js +7 -0
  403. package/dist/components/NumberInput/index.js.map +1 -0
  404. package/dist/components/NumberInput/number-input.d.ts +5 -5
  405. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  406. package/dist/components/NumberInput/number-input.js +40 -18
  407. package/dist/components/NumberInput/number-input.js.map +1 -1
  408. package/dist/components/OverflowIndicator/index.d.ts +2 -0
  409. package/dist/components/OverflowIndicator/index.d.ts.map +1 -0
  410. package/dist/components/OverflowIndicator/index.js +6 -0
  411. package/dist/components/OverflowIndicator/index.js.map +1 -0
  412. package/dist/components/OverflowIndicator/overflow-indicator.d.ts +6 -2
  413. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
  414. package/dist/components/OverflowIndicator/overflow-indicator.js +11 -7
  415. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
  416. package/dist/components/Pagination/index.d.ts +2 -0
  417. package/dist/components/Pagination/index.d.ts.map +1 -0
  418. package/dist/components/Pagination/index.js +6 -0
  419. package/dist/components/Pagination/index.js.map +1 -0
  420. package/dist/components/Pagination/pagination.d.ts +49 -0
  421. package/dist/components/Pagination/pagination.d.ts.map +1 -0
  422. package/dist/components/Pagination/pagination.js +182 -0
  423. package/dist/components/Pagination/pagination.js.map +1 -0
  424. package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts +1 -1
  425. package/dist/components/PeoplePicker/avatar-stack-overflow.js.map +1 -1
  426. package/dist/components/PeoplePicker/index.d.ts +2 -0
  427. package/dist/components/PeoplePicker/index.d.ts.map +1 -0
  428. package/dist/components/PeoplePicker/index.js +15 -0
  429. package/dist/components/PeoplePicker/index.js.map +1 -0
  430. package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -1
  431. package/dist/components/PeoplePicker/people-picker-helpers.js +2 -2
  432. package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -1
  433. package/dist/components/PeoplePicker/people-picker.d.ts +26 -10
  434. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  435. package/dist/components/PeoplePicker/people-picker.js +97 -65
  436. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  437. package/dist/components/PeoplePicker/person-display.d.ts +19 -11
  438. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  439. package/dist/components/PeoplePicker/person-display.js +39 -23
  440. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  441. package/dist/components/Popover/index.d.ts +2 -0
  442. package/dist/components/Popover/index.d.ts.map +1 -0
  443. package/dist/components/Popover/index.js +14 -0
  444. package/dist/components/Popover/index.js.map +1 -0
  445. package/dist/components/Popover/popover.d.ts +2 -2
  446. package/dist/components/Popover/popover.d.ts.map +1 -1
  447. package/dist/components/Popover/popover.js +72 -42
  448. package/dist/components/Popover/popover.js.map +1 -1
  449. package/dist/components/ProfileCard/index.d.ts +2 -0
  450. package/dist/components/ProfileCard/index.d.ts.map +1 -0
  451. package/dist/components/ProfileCard/index.js +8 -0
  452. package/dist/components/ProfileCard/index.js.map +1 -0
  453. package/dist/components/{NameCard/name-card.d.ts → ProfileCard/profile-card.d.ts} +34 -20
  454. package/dist/components/ProfileCard/profile-card.d.ts.map +1 -0
  455. package/dist/components/{NameCard/name-card.js → ProfileCard/profile-card.js} +27 -16
  456. package/dist/components/ProfileCard/profile-card.js.map +1 -0
  457. package/dist/components/ProgressBar/index.d.ts +2 -0
  458. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  459. package/dist/components/ProgressBar/index.js +6 -0
  460. package/dist/components/ProgressBar/index.js.map +1 -0
  461. package/dist/components/ProgressBar/progress-bar.d.ts +2 -14
  462. package/dist/components/ProgressBar/progress-bar.d.ts.map +1 -1
  463. package/dist/components/ProgressBar/progress-bar.js +5 -9
  464. package/dist/components/ProgressBar/progress-bar.js.map +1 -1
  465. package/dist/components/RadioGroup/index.d.ts +2 -0
  466. package/dist/components/RadioGroup/index.d.ts.map +1 -0
  467. package/dist/components/RadioGroup/index.js +8 -0
  468. package/dist/components/RadioGroup/index.js.map +1 -0
  469. package/dist/components/RadioGroup/radio-group.d.ts +18 -12
  470. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  471. package/dist/components/RadioGroup/radio-group.js +131 -40
  472. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  473. package/dist/components/Rating/index.d.ts +2 -0
  474. package/dist/components/Rating/index.d.ts.map +1 -0
  475. package/dist/components/Rating/index.js +6 -0
  476. package/dist/components/Rating/index.js.map +1 -0
  477. package/dist/components/Rating/rating.d.ts +6 -2
  478. package/dist/components/Rating/rating.d.ts.map +1 -1
  479. package/dist/components/Rating/rating.js +17 -10
  480. package/dist/components/Rating/rating.js.map +1 -1
  481. package/dist/components/ScrollArea/index.d.ts +2 -0
  482. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  483. package/dist/components/ScrollArea/index.js +7 -0
  484. package/dist/components/ScrollArea/index.js.map +1 -0
  485. package/dist/components/ScrollArea/scroll-area.d.ts +16 -4
  486. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
  487. package/dist/components/ScrollArea/scroll-area.js +9 -6
  488. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  489. package/dist/components/SegmentedControl/index.d.ts +2 -0
  490. package/dist/components/SegmentedControl/index.d.ts.map +1 -0
  491. package/dist/components/SegmentedControl/index.js +9 -0
  492. package/dist/components/SegmentedControl/index.js.map +1 -0
  493. package/dist/components/SegmentedControl/segmented-control.d.ts +8 -7
  494. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  495. package/dist/components/SegmentedControl/segmented-control.js +31 -20
  496. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  497. package/dist/components/Select/index.d.ts +2 -0
  498. package/dist/components/Select/index.d.ts.map +1 -0
  499. package/dist/components/Select/index.js +6 -0
  500. package/dist/components/Select/index.js.map +1 -0
  501. package/dist/components/Select/select.d.ts +70 -13
  502. package/dist/components/Select/select.d.ts.map +1 -1
  503. package/dist/components/Select/select.js +271 -83
  504. package/dist/components/Select/select.js.map +1 -1
  505. package/dist/components/SelectMenu/index.d.ts +2 -0
  506. package/dist/components/SelectMenu/index.d.ts.map +1 -0
  507. package/dist/components/SelectMenu/index.js +8 -0
  508. package/dist/components/SelectMenu/index.js.map +1 -0
  509. package/dist/components/SelectMenu/select-menu.d.ts +61 -10
  510. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  511. package/dist/components/SelectMenu/select-menu.js +216 -93
  512. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  513. package/dist/components/SelectionControl/boolean-value.d.ts +11 -0
  514. package/dist/components/SelectionControl/boolean-value.d.ts.map +1 -0
  515. package/dist/components/SelectionControl/boolean-value.js +23 -0
  516. package/dist/components/SelectionControl/boolean-value.js.map +1 -0
  517. package/dist/components/SelectionControl/index.d.ts +3 -0
  518. package/dist/components/SelectionControl/index.d.ts.map +1 -0
  519. package/dist/components/SelectionControl/index.js +9 -0
  520. package/dist/components/SelectionControl/index.js.map +1 -0
  521. package/dist/components/SelectionControl/selection-item.d.ts +5 -1
  522. package/dist/components/SelectionControl/selection-item.d.ts.map +1 -1
  523. package/dist/components/SelectionControl/selection-item.js +3 -1
  524. package/dist/components/SelectionControl/selection-item.js.map +1 -1
  525. package/dist/components/Separator/index.d.ts +2 -0
  526. package/dist/components/Separator/index.d.ts.map +1 -0
  527. package/dist/components/Separator/index.js +6 -0
  528. package/dist/components/Separator/index.js.map +1 -0
  529. package/dist/components/Separator/separator.d.ts +2 -2
  530. package/dist/components/Separator/separator.js +4 -3
  531. package/dist/components/Separator/separator.js.map +1 -1
  532. package/dist/components/Sheet/index.d.ts +2 -0
  533. package/dist/components/Sheet/index.d.ts.map +1 -0
  534. package/dist/components/Sheet/index.js +18 -0
  535. package/dist/components/Sheet/index.js.map +1 -0
  536. package/dist/components/Sheet/sheet.d.ts +15 -8
  537. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  538. package/dist/components/Sheet/sheet.js +9 -5
  539. package/dist/components/Sheet/sheet.js.map +1 -1
  540. package/dist/components/Sidebar/index.d.ts +2 -0
  541. package/dist/components/Sidebar/index.d.ts.map +1 -0
  542. package/dist/components/Sidebar/index.js +24 -0
  543. package/dist/components/Sidebar/index.js.map +1 -0
  544. package/dist/components/Sidebar/sidebar.d.ts +17 -11
  545. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  546. package/dist/components/Sidebar/sidebar.js +78 -35
  547. package/dist/components/Sidebar/sidebar.js.map +1 -1
  548. package/dist/components/Skeleton/index.d.ts +2 -0
  549. package/dist/components/Skeleton/index.d.ts.map +1 -0
  550. package/dist/components/Skeleton/index.js +6 -0
  551. package/dist/components/Skeleton/index.js.map +1 -0
  552. package/dist/components/Skeleton/skeleton.d.ts +2 -2
  553. package/dist/components/Skeleton/skeleton.js +4 -3
  554. package/dist/components/Skeleton/skeleton.js.map +1 -1
  555. package/dist/components/Slider/index.d.ts +2 -0
  556. package/dist/components/Slider/index.d.ts.map +1 -0
  557. package/dist/components/Slider/index.js +7 -0
  558. package/dist/components/Slider/index.js.map +1 -0
  559. package/dist/components/Slider/slider.d.ts +7 -7
  560. package/dist/components/Slider/slider.d.ts.map +1 -1
  561. package/dist/components/Slider/slider.js +39 -17
  562. package/dist/components/Slider/slider.js.map +1 -1
  563. package/dist/components/Steps/index.d.ts +2 -0
  564. package/dist/components/Steps/index.d.ts.map +1 -0
  565. package/dist/components/Steps/index.js +12 -0
  566. package/dist/components/Steps/index.js.map +1 -0
  567. package/dist/components/Steps/steps.d.ts +8 -6
  568. package/dist/components/Steps/steps.d.ts.map +1 -1
  569. package/dist/components/Steps/steps.js +74 -32
  570. package/dist/components/Steps/steps.js.map +1 -1
  571. package/dist/components/Switch/index.d.ts +2 -0
  572. package/dist/components/Switch/index.d.ts.map +1 -0
  573. package/dist/components/Switch/index.js +7 -0
  574. package/dist/components/Switch/index.js.map +1 -0
  575. package/dist/components/Switch/switch.d.ts +20 -18
  576. package/dist/components/Switch/switch.d.ts.map +1 -1
  577. package/dist/components/Switch/switch.js +133 -26
  578. package/dist/components/Switch/switch.js.map +1 -1
  579. package/dist/components/Tabs/index.d.ts +2 -0
  580. package/dist/components/Tabs/index.d.ts.map +1 -0
  581. package/dist/components/Tabs/index.js +10 -0
  582. package/dist/components/Tabs/index.js.map +1 -0
  583. package/dist/components/Tabs/tabs-inline-action-geometry.d.ts +31 -0
  584. package/dist/components/Tabs/tabs-inline-action-geometry.d.ts.map +1 -0
  585. package/dist/components/Tabs/tabs-inline-action-geometry.js +43 -0
  586. package/dist/components/Tabs/tabs-inline-action-geometry.js.map +1 -0
  587. package/dist/components/Tabs/tabs.d.ts +14 -11
  588. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  589. package/dist/components/Tabs/tabs.js +184 -69
  590. package/dist/components/Tabs/tabs.js.map +1 -1
  591. package/dist/components/Tag/index.d.ts +2 -0
  592. package/dist/components/Tag/index.d.ts.map +1 -0
  593. package/dist/components/Tag/index.js +7 -0
  594. package/dist/components/Tag/index.js.map +1 -0
  595. package/dist/components/Tag/tag.d.ts +39 -23
  596. package/dist/components/Tag/tag.d.ts.map +1 -1
  597. package/dist/components/Tag/tag.js +71 -63
  598. package/dist/components/Tag/tag.js.map +1 -1
  599. package/dist/components/Textarea/index.d.ts +2 -0
  600. package/dist/components/Textarea/index.d.ts.map +1 -0
  601. package/dist/components/Textarea/index.js +7 -0
  602. package/dist/components/Textarea/index.js.map +1 -0
  603. package/dist/components/Textarea/textarea.d.ts +24 -17
  604. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  605. package/dist/components/Textarea/textarea.js +110 -72
  606. package/dist/components/Textarea/textarea.js.map +1 -1
  607. package/dist/components/TimePicker/index.d.ts +2 -0
  608. package/dist/components/TimePicker/index.d.ts.map +1 -0
  609. package/dist/components/TimePicker/index.js +6 -0
  610. package/dist/components/TimePicker/index.js.map +1 -0
  611. package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
  612. package/dist/components/TimePicker/time-columns.js +44 -36
  613. package/dist/components/TimePicker/time-columns.js.map +1 -1
  614. package/dist/components/TimePicker/time-picker.d.ts +8 -7
  615. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  616. package/dist/components/TimePicker/time-picker.js +71 -53
  617. package/dist/components/TimePicker/time-picker.js.map +1 -1
  618. package/dist/components/Toast/index.d.ts +2 -0
  619. package/dist/components/Toast/index.d.ts.map +1 -0
  620. package/dist/components/Toast/index.js +7 -0
  621. package/dist/components/Toast/index.js.map +1 -0
  622. package/dist/components/Toast/toast.d.ts +2 -2
  623. package/dist/components/Toast/toast.d.ts.map +1 -1
  624. package/dist/components/Toast/toast.js +82 -20
  625. package/dist/components/Toast/toast.js.map +1 -1
  626. package/dist/components/Tooltip/index.d.ts +2 -0
  627. package/dist/components/Tooltip/index.d.ts.map +1 -0
  628. package/dist/components/Tooltip/index.js +9 -0
  629. package/dist/components/Tooltip/index.js.map +1 -0
  630. package/dist/components/Tooltip/tooltip.d.ts +2 -2
  631. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  632. package/dist/components/Tooltip/tooltip.js +57 -25
  633. package/dist/components/Tooltip/tooltip.js.map +1 -1
  634. package/dist/components/TreeView/index.d.ts +2 -0
  635. package/dist/components/TreeView/index.d.ts.map +1 -0
  636. package/dist/components/TreeView/index.js +8 -0
  637. package/dist/components/TreeView/index.js.map +1 -0
  638. package/dist/components/TreeView/tree-view.d.ts +71 -14
  639. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  640. package/dist/components/TreeView/tree-view.js +313 -34
  641. package/dist/components/TreeView/tree-view.js.map +1 -1
  642. package/dist/hooks/use-controllable.d.ts.map +1 -1
  643. package/dist/hooks/use-controllable.js +4 -2
  644. package/dist/hooks/use-controllable.js.map +1 -1
  645. package/dist/hooks/use-is-touch-device.d.ts.map +1 -1
  646. package/dist/hooks/use-is-touch-device.js +3 -1
  647. package/dist/hooks/use-is-touch-device.js.map +1 -1
  648. package/dist/hooks/use-overflow-items.d.ts +10 -6
  649. package/dist/hooks/use-overflow-items.d.ts.map +1 -1
  650. package/dist/hooks/use-overflow-items.js.map +1 -1
  651. package/dist/hooks/use-truncated.d.ts +27 -0
  652. package/dist/hooks/use-truncated.d.ts.map +1 -0
  653. package/dist/hooks/use-truncated.js +57 -0
  654. package/dist/hooks/use-truncated.js.map +1 -0
  655. package/dist/{react-day-picker.css → index.css} +43 -0
  656. package/dist/index.d.ts +121 -67
  657. package/dist/index.d.ts.map +1 -1
  658. package/dist/index.js +140 -160
  659. package/dist/index.js.map +1 -1
  660. package/dist/lib/drag-visual.d.ts +2 -2
  661. package/dist/lib/drag-visual.js.map +1 -1
  662. package/dist/lib/utils.d.ts +1 -0
  663. package/dist/lib/utils.d.ts.map +1 -1
  664. package/dist/lib/utils.js +24 -2
  665. package/dist/lib/utils.js.map +1 -1
  666. package/dist/patterns/element-anatomy/index.d.ts +3 -0
  667. package/dist/patterns/element-anatomy/index.d.ts.map +1 -0
  668. package/dist/patterns/element-anatomy/index.js +22 -0
  669. package/dist/patterns/element-anatomy/index.js.map +1 -0
  670. package/dist/patterns/element-anatomy/item-anatomy.d.ts +32 -16
  671. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  672. package/dist/patterns/element-anatomy/item-anatomy.js +83 -35
  673. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  674. package/dist/patterns/element-anatomy/truncated-text.d.ts +27 -0
  675. package/dist/patterns/element-anatomy/truncated-text.d.ts.map +1 -0
  676. package/dist/patterns/element-anatomy/truncated-text.js +16 -0
  677. package/dist/patterns/element-anatomy/truncated-text.js.map +1 -0
  678. package/dist/patterns/header-canonical/chrome-header.d.ts +20 -4
  679. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
  680. package/dist/patterns/header-canonical/chrome-header.js +4 -2
  681. package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
  682. package/dist/patterns/header-canonical/index.d.ts +2 -0
  683. package/dist/patterns/header-canonical/index.d.ts.map +1 -0
  684. package/dist/patterns/header-canonical/index.js +6 -0
  685. package/dist/patterns/header-canonical/index.js.map +1 -0
  686. package/dist/patterns/horizontal-overflow/horizontal-overflow.d.ts +1 -1
  687. package/dist/patterns/horizontal-overflow/horizontal-overflow.js.map +1 -1
  688. package/dist/patterns/horizontal-overflow/index.d.ts +2 -0
  689. package/dist/patterns/horizontal-overflow/index.d.ts.map +1 -0
  690. package/dist/patterns/horizontal-overflow/index.js +14 -0
  691. package/dist/patterns/horizontal-overflow/index.js.map +1 -0
  692. package/dist/patterns/overlay-surface/index.d.ts +2 -0
  693. package/dist/patterns/overlay-surface/index.d.ts.map +1 -0
  694. package/dist/patterns/overlay-surface/index.js +8 -0
  695. package/dist/patterns/overlay-surface/index.js.map +1 -0
  696. package/dist/patterns/overlay-surface/overlay-surface.d.ts +12 -2
  697. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
  698. package/dist/patterns/overlay-surface/overlay-surface.js +6 -2
  699. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  700. package/dist/patterns/resize-handle/index.d.ts +2 -0
  701. package/dist/patterns/resize-handle/index.d.ts.map +1 -0
  702. package/dist/patterns/resize-handle/index.js +5 -0
  703. package/dist/patterns/resize-handle/index.js.map +1 -0
  704. package/dist/patterns/resize-handle/resize-handle.d.ts +9 -11
  705. package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -1
  706. package/dist/patterns/resize-handle/resize-handle.js +3 -6
  707. package/dist/patterns/resize-handle/resize-handle.js.map +1 -1
  708. package/dist/story-governance/category-matrix.d.ts +35 -0
  709. package/dist/story-governance/category-matrix.d.ts.map +1 -0
  710. package/dist/tokens/categorical-color.d.ts +60 -0
  711. package/dist/tokens/categorical-color.d.ts.map +1 -0
  712. package/dist/tokens/categorical-color.js +125 -0
  713. package/dist/tokens/categorical-color.js.map +1 -0
  714. package/dist/tokens/motion/motion.d.ts +8 -7
  715. package/dist/tokens/motion/motion.d.ts.map +1 -1
  716. package/dist/tokens/motion/motion.js +6 -6
  717. package/dist/tokens/motion/motion.js.map +1 -1
  718. package/dist/tokens/motion/overlay-motion.d.ts +19 -0
  719. package/dist/tokens/motion/overlay-motion.d.ts.map +1 -0
  720. package/dist/tokens/motion/overlay-motion.js +9 -0
  721. package/dist/tokens/motion/overlay-motion.js.map +1 -0
  722. package/dist/tokens/uiSize/icon-size.d.ts +3 -4
  723. package/dist/tokens/uiSize/icon-size.d.ts.map +1 -1
  724. package/dist/tokens/uiSize/icon-size.js +5 -0
  725. package/dist/tokens/uiSize/icon-size.js.map +1 -0
  726. package/ds-canonical/adapters/claude/agents/README.md +58 -0
  727. package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +14 -0
  728. package/ds-canonical/adapters/claude-root-instructions.md +24 -0
  729. package/ds-canonical/adapters/claude-settings-base.json +169 -0
  730. package/ds-canonical/commands/README.md +9 -14
  731. package/ds-canonical/fork/AGENTS.md +110 -0
  732. package/ds-canonical/fork/CLAUDE.md +54 -0
  733. package/ds-canonical/fork/codex/agents/skills/bug-fix-rhythm/SKILL.md +207 -0
  734. package/ds-canonical/fork/codex/agents/skills/code-quality-audit/SKILL.md +71 -0
  735. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/SKILL.md +244 -0
  736. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/flow-diagram.md +180 -0
  737. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/handoff-template.md +177 -0
  738. package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  739. package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +43 -0
  740. package/ds-canonical/fork/codex/agents/skills/independent-review/agents/openai.yaml +4 -0
  741. package/ds-canonical/fork/codex/agents/skills/independent-review/references/evidence-contract.md +23 -0
  742. package/ds-canonical/fork/codex/agents/skills/performance-audit/SKILL.md +114 -0
  743. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/SKILL.md +252 -0
  744. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/audit-checks.md +250 -0
  745. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/common-misuses.md +329 -0
  746. package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/report-template.md +163 -0
  747. package/ds-canonical/fork/codex/agents/skills/propose-options/SKILL.md +190 -0
  748. package/ds-canonical/fork/codex/agents/skills/prototype/SKILL.md +246 -0
  749. package/ds-canonical/fork/codex/agents/skills/prototype/references/audit-checks.md +39 -0
  750. package/ds-canonical/fork/codex/agents/skills/prototype/references/benchmark-sources.md +94 -0
  751. package/ds-canonical/fork/codex/agents/skills/prototype/references/checkpoints.md +200 -0
  752. package/ds-canonical/fork/codex/agents/skills/prototype/references/evaluation-matrix.md +142 -0
  753. package/ds-canonical/fork/codex/agents/skills/prototype/references/ooux-template.md +198 -0
  754. package/ds-canonical/fork/codex/agents/skills/prototype/references/proposal-template.md +230 -0
  755. package/ds-canonical/fork/codex/agents/skills/scan-similar-bugs/SKILL.md +203 -0
  756. package/ds-canonical/fork/codex/agents/skills/ux-audit/SKILL.md +135 -0
  757. package/ds-canonical/fork/codex/agents/skills/visual-audit/SKILL.md +258 -0
  758. package/ds-canonical/fork/codex/agents/skills/visual-audit/output/.gitkeep +0 -0
  759. package/ds-canonical/fork/codex/agents/skills/visual-audit/references/audit-architecture.md +101 -0
  760. package/ds-canonical/fork/codex/agents/skills/visual-audit/references/visual-checklist.md +297 -0
  761. package/ds-canonical/fork/codex/agents/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  762. package/ds-canonical/fork/codex/hooks.json +57 -0
  763. package/ds-canonical/fork/common/closed-tool-execution.mjs +1005 -0
  764. package/ds-canonical/fork/common/instruction.md +110 -0
  765. package/ds-canonical/fork/consumer/governance-check.mjs +3163 -0
  766. package/ds-canonical/fork/consumer/lib/closed-tool-execution.mjs +1005 -0
  767. package/ds-canonical/fork/consumer/lock.json +189 -0
  768. package/ds-canonical/fork/consumer/lock.schema.json +338 -0
  769. package/ds-canonical/fork/consumer/managed-files/0235cf6b3fd402a3717881dc205b5bf77aed7632e7d7d6f1811a40e3033bd816.blob +145 -0
  770. package/ds-canonical/fork/consumer/managed-files/145aab4b4fc470fc9ba7679b4a1d87d4f6a6d604940bd40f8d675c8af696498f.blob +53 -0
  771. package/ds-canonical/fork/consumer/managed-files/189e551431181e4a88783c02130d2787b801ef731c86e35bcde89a7313aa020e.blob +149 -0
  772. package/ds-canonical/fork/consumer/managed-files/24ad71c8613ddcf6fd23818cb3bb477a1fb6d83af4550b0bad43099813088686.blob +28 -0
  773. package/ds-canonical/fork/consumer/managed-files/2d1ef5617a5ce3c39ad9aae1c42af7d199f9270c0a0ccb490b63d62dbc6913db.blob +1005 -0
  774. package/ds-canonical/fork/consumer/managed-files/3625e02235cf166a50649a4d704cfb68fead69d0e168c481df013ebae9f6be25.blob +1412 -0
  775. package/ds-canonical/fork/consumer/managed-files/3ddedc67b464bdfe3dde9803a2d917920c96d633678b802eee638a44cd47366a.blob +8 -0
  776. package/ds-canonical/fork/consumer/managed-files/423729840acdd43c812f17c245b871716c6b60f76e4d3e94864d0e34a815bf8d.blob +348 -0
  777. package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +549 -0
  778. package/ds-canonical/fork/consumer/managed-files/475fba657eaeb8abd88f60635f3eadab27a9d0d3114ba4fffc65f43a2a0fe6e2.blob +124 -0
  779. package/ds-canonical/fork/consumer/managed-files/5aeda1df235815f40dd755951f2b868d4e02035653d4536a8dde209cdc75b493.blob +268 -0
  780. package/ds-canonical/fork/consumer/managed-files/61c6aca6d7f04bedbf556eaa9d3043681fe48cbe0e93a8ccb1d69a7c5e23fdcf.blob +113 -0
  781. package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +2454 -0
  782. package/ds-canonical/fork/consumer/managed-files/65410b66e8799a560e07b71779c186fed2a0ef50575ac44745df7a0938a9c2b4.blob +321 -0
  783. package/ds-canonical/fork/consumer/managed-files/6b746628ac11fcccbe277ef6fea94cc2a7b90ea2822e83536eae80d5ee4b3fa5.blob +167 -0
  784. package/ds-canonical/fork/consumer/managed-files/76d485470d30ff014afacf7ce643763de9f4f956d9fc8128dbc1814774cf2e63.blob +671 -0
  785. package/ds-canonical/fork/consumer/managed-files/7937321877e5c34c27dae36c0d507d21cd42fa3f46a8f11a284b8b4a52b6faa4.blob +84 -0
  786. package/ds-canonical/fork/consumer/managed-files/794bb911ba8ebef58ab0d44a55b9968a19d2c62bcfb310b1ee3a84166f087f21.blob +924 -0
  787. package/ds-canonical/fork/consumer/managed-files/7ab15a8aeca39485d7b9b57234bbc4a69e0b9e70b4a851dfe10f6447127cee78.blob +51 -0
  788. package/ds-canonical/fork/consumer/managed-files/7b17835d0ceb17cdcdcaf930540a3e5d0943a34a747ac43c12ca8cd485c11581.blob +44 -0
  789. package/ds-canonical/fork/consumer/managed-files/7eb6cc60abfdabaf6617c336058fad1454ccde08889295767bfd9b7fd153cc6e.blob +900 -0
  790. package/ds-canonical/fork/consumer/managed-files/81037efa5b3b9f4a875704005fb268acdc9233bb901f44902e4e37e1da92b8e3.blob +46 -0
  791. package/ds-canonical/fork/consumer/managed-files/884721550b56308812b20917adac7a12f36fdb4ecda6b02460a7f5a219c0c966.blob +82 -0
  792. package/ds-canonical/fork/consumer/managed-files/91f414b9462ddc1e4be1d4c6ca4ac7a7340a6eec9e98ee109cbc049d3b354b6a.blob +36 -0
  793. package/ds-canonical/fork/consumer/managed-files/92e4828cdcb96ff0d01daa16f6885f24045a8e72820665650f2a1890dc3a446c.blob +121 -0
  794. package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +36 -0
  795. package/ds-canonical/fork/consumer/managed-files/974521d6b8fe796ea4c58b3c78b0c2b8a1be262b97100d77aaf4cc9c7724bcab.blob +45 -0
  796. package/ds-canonical/fork/consumer/managed-files/9791c85388d2e2e2bd564e2550fadc3351c4c960a47ce838098afcba7544eb90.blob +973 -0
  797. package/ds-canonical/fork/consumer/managed-files/a448d2222133335c30e6fda5116e26a40db3283a19d62ccc0663c30d272262a7.blob +174 -0
  798. package/ds-canonical/fork/consumer/managed-files/ab072e7f2eca51f0e18a5e18c4b333260ee5d219a12cc6df5bb2d683f0b2734d.blob +2639 -0
  799. package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +620 -0
  800. package/ds-canonical/fork/consumer/managed-files/c4aa767f11714467de0038a2149cf78074baddc17fc6a9e074b6aed7544c6f3c.blob +80 -0
  801. package/ds-canonical/fork/consumer/managed-files/c893e9b734b162f4c631fef871128c16a9ab565f796a0e76d7f320f821f220f5.blob +41 -0
  802. package/ds-canonical/fork/consumer/managed-files/cd9c61f8ff24fb9bcc3663e346e2cfa419cfb84e02aae18d3dc66dd192681696.blob +9 -0
  803. package/ds-canonical/fork/consumer/managed-files/da2ad2737315d25a5300905ddefd62f1695056a8a1af155c5b34170ad9923bce.blob +38 -0
  804. package/ds-canonical/fork/consumer/managed-files/e26057408661597aac4a57cdf7e30e2f9d0afb1b9a2dbbb692c3805cd9028ca5.blob +250 -0
  805. package/ds-canonical/fork/consumer/managed-files/e68ae1915965d8e17d4b2441c00c2b97fe062ea308ae8535c9eebb2fc16fa245.blob +20 -0
  806. package/ds-canonical/fork/consumer/managed-files/e71c65f45c6af7ce12b6b3c0d8028f185da5b719e2050c9b2a6b243d41ae4878.blob +182 -0
  807. package/ds-canonical/fork/consumer/managed-files/e813096d69c49812e40e00be9ac8fa14d77f0ec1f97ab4c45cb096b3bedd35de.blob +3 -0
  808. package/ds-canonical/fork/consumer/managed-files/e930ebca6fd8eeb30802aac0930efae7bcc44cc0996f24de07c11ca6a081fedf.blob +277 -0
  809. package/ds-canonical/fork/consumer/managed-files/ea94e914d5c8acb84ad7660e5bda0f01b6ccc8cf96b0f6b1ce048f8938d0f5b5.blob +47 -0
  810. package/ds-canonical/fork/consumer/managed-files/f4db6e616d5229aa7e700c6a3ace022cb9d90baae74e38ca65fce617f18e0d9b.blob +110 -0
  811. package/ds-canonical/fork/consumer/managed-files/faa128c26102415dc5345e68698efbbd28a395c35ee278dceae044cf430692b2.blob +11 -0
  812. package/ds-canonical/fork/governance.lock +1696 -0
  813. package/ds-canonical/fork/hooks/_log-fire.sh +143 -0
  814. package/ds-canonical/fork/hooks/block_prototype_imports.py +241 -0
  815. package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +106 -0
  816. package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +731 -0
  817. package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +173 -0
  818. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +219 -0
  819. package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +57 -0
  820. package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +213 -0
  821. package/ds-canonical/fork/hooks/check_field_family_invariants.sh +376 -0
  822. package/ds-canonical/fork/hooks/check_fork_product_quality.sh +38 -0
  823. package/ds-canonical/fork/hooks/check_item_list_gap.sh +56 -0
  824. package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +160 -0
  825. package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +319 -0
  826. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +339 -0
  827. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +99 -0
  828. package/ds-canonical/fork/hooks/check_story_determinism.sh +39 -0
  829. package/ds-canonical/fork/hooks/check_story_invariants.sh +400 -0
  830. package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +241 -0
  831. package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +86 -0
  832. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +333 -0
  833. package/ds-canonical/fork/hooks/lib/_hook_integrity.sh +158 -0
  834. package/ds-canonical/fork/hooks/lib/_micro_geometry.sh +291 -0
  835. package/ds-canonical/fork/hooks/lib/_provider_paths.sh +162 -0
  836. package/ds-canonical/fork/launchers/approval-evidence.mjs +1286 -0
  837. package/ds-canonical/fork/launchers/authority-decision-evidence.mjs +413 -0
  838. package/ds-canonical/fork/launchers/canonical-order.mjs +8 -0
  839. package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +154 -0
  840. package/ds-canonical/fork/launchers/format-provider-hook-output.mjs +25 -0
  841. package/ds-canonical/fork/launchers/independent-review.mjs +490 -0
  842. package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +99 -0
  843. package/ds-canonical/fork/launchers/normalize-provider-event.mjs +355 -0
  844. package/ds-canonical/fork/launchers/product-hook-dispatch-runtime.mjs +1067 -0
  845. package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +1640 -0
  846. package/ds-canonical/fork/launchers/provider-hook-output-transport.mjs +540 -0
  847. package/ds-canonical/fork/launchers/settings-hooks.json +35 -0
  848. package/ds-canonical/fork/manifest.json +1984 -0
  849. package/ds-canonical/fork/providers/claude/hook-config.json +327 -0
  850. package/ds-canonical/fork/providers/claude/instruction.md +54 -0
  851. package/ds-canonical/fork/providers/claude/skills/bug-fix-rhythm/SKILL.md +207 -0
  852. package/ds-canonical/fork/providers/claude/skills/code-quality-audit/SKILL.md +71 -0
  853. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/SKILL.md +244 -0
  854. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/flow-diagram.md +180 -0
  855. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/handoff-template.md +177 -0
  856. package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  857. package/ds-canonical/fork/providers/claude/skills/independent-review/SKILL.md +43 -0
  858. package/ds-canonical/fork/providers/claude/skills/independent-review/agents/openai.yaml +4 -0
  859. package/ds-canonical/fork/providers/claude/skills/independent-review/references/evidence-contract.md +23 -0
  860. package/ds-canonical/fork/providers/claude/skills/performance-audit/SKILL.md +114 -0
  861. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/SKILL.md +252 -0
  862. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/audit-checks.md +250 -0
  863. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/common-misuses.md +329 -0
  864. package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/report-template.md +163 -0
  865. package/ds-canonical/fork/providers/claude/skills/propose-options/SKILL.md +190 -0
  866. package/ds-canonical/fork/providers/claude/skills/prototype/SKILL.md +246 -0
  867. package/ds-canonical/fork/providers/claude/skills/prototype/references/audit-checks.md +39 -0
  868. package/ds-canonical/fork/providers/claude/skills/prototype/references/benchmark-sources.md +94 -0
  869. package/ds-canonical/fork/providers/claude/skills/prototype/references/checkpoints.md +200 -0
  870. package/ds-canonical/fork/providers/claude/skills/prototype/references/evaluation-matrix.md +142 -0
  871. package/ds-canonical/fork/providers/claude/skills/prototype/references/ooux-template.md +198 -0
  872. package/ds-canonical/fork/providers/claude/skills/prototype/references/proposal-template.md +230 -0
  873. package/ds-canonical/fork/providers/claude/skills/scan-similar-bugs/SKILL.md +203 -0
  874. package/ds-canonical/fork/providers/claude/skills/ux-audit/SKILL.md +135 -0
  875. package/ds-canonical/fork/providers/claude/skills/visual-audit/SKILL.md +258 -0
  876. package/ds-canonical/fork/providers/claude/skills/visual-audit/output/.gitkeep +0 -0
  877. package/ds-canonical/fork/providers/claude/skills/visual-audit/references/audit-architecture.md +101 -0
  878. package/ds-canonical/fork/providers/claude/skills/visual-audit/references/visual-checklist.md +297 -0
  879. package/ds-canonical/fork/providers/claude/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  880. package/ds-canonical/fork/providers/codex/hook-config.json +57 -0
  881. package/ds-canonical/fork/providers/codex/skills/bug-fix-rhythm/SKILL.md +207 -0
  882. package/ds-canonical/fork/providers/codex/skills/code-quality-audit/SKILL.md +71 -0
  883. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/SKILL.md +244 -0
  884. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/flow-diagram.md +180 -0
  885. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/handoff-template.md +177 -0
  886. package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  887. package/ds-canonical/fork/providers/codex/skills/independent-review/SKILL.md +43 -0
  888. package/ds-canonical/fork/providers/codex/skills/independent-review/agents/openai.yaml +4 -0
  889. package/ds-canonical/fork/providers/codex/skills/independent-review/references/evidence-contract.md +23 -0
  890. package/ds-canonical/fork/providers/codex/skills/performance-audit/SKILL.md +114 -0
  891. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/SKILL.md +252 -0
  892. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/audit-checks.md +250 -0
  893. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/common-misuses.md +329 -0
  894. package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/report-template.md +163 -0
  895. package/ds-canonical/fork/providers/codex/skills/propose-options/SKILL.md +190 -0
  896. package/ds-canonical/fork/providers/codex/skills/prototype/SKILL.md +246 -0
  897. package/ds-canonical/fork/providers/codex/skills/prototype/references/audit-checks.md +39 -0
  898. package/ds-canonical/fork/providers/codex/skills/prototype/references/benchmark-sources.md +94 -0
  899. package/ds-canonical/fork/providers/codex/skills/prototype/references/checkpoints.md +200 -0
  900. package/ds-canonical/fork/providers/codex/skills/prototype/references/evaluation-matrix.md +142 -0
  901. package/ds-canonical/fork/providers/codex/skills/prototype/references/ooux-template.md +198 -0
  902. package/ds-canonical/fork/providers/codex/skills/prototype/references/proposal-template.md +230 -0
  903. package/ds-canonical/fork/providers/codex/skills/scan-similar-bugs/SKILL.md +203 -0
  904. package/ds-canonical/fork/providers/codex/skills/ux-audit/SKILL.md +135 -0
  905. package/ds-canonical/fork/providers/codex/skills/visual-audit/SKILL.md +258 -0
  906. package/ds-canonical/fork/providers/codex/skills/visual-audit/output/.gitkeep +0 -0
  907. package/ds-canonical/fork/providers/codex/skills/visual-audit/references/audit-architecture.md +101 -0
  908. package/ds-canonical/fork/providers/codex/skills/visual-audit/references/visual-checklist.md +297 -0
  909. package/ds-canonical/fork/providers/codex/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  910. package/ds-canonical/fork/references/story-baseline-registry.json +123 -0
  911. package/ds-canonical/fork/references/story-baseline-registry.schema.json +145 -0
  912. package/ds-canonical/fork/references/utility-registry.json +426 -0
  913. package/ds-canonical/fork/references/utility-registry.schema.json +409 -0
  914. package/ds-canonical/fork/review/canonical-order.mjs +8 -0
  915. package/ds-canonical/fork/review/provider-review-binding.mjs +2377 -0
  916. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +196 -0
  917. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +69 -0
  918. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +242 -0
  919. package/ds-canonical/fork/skills/delivery-handoff/references/flow-diagram.md +180 -0
  920. package/ds-canonical/fork/skills/delivery-handoff/references/handoff-template.md +177 -0
  921. package/ds-canonical/fork/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  922. package/ds-canonical/fork/skills/independent-review/SKILL.md +37 -0
  923. package/ds-canonical/fork/skills/independent-review/agents/openai.yaml +4 -0
  924. package/ds-canonical/fork/skills/independent-review/references/evidence-contract.md +23 -0
  925. package/ds-canonical/fork/skills/performance-audit/SKILL.md +112 -0
  926. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +250 -0
  927. package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +250 -0
  928. package/ds-canonical/fork/skills/product-ui-audit/references/common-misuses.md +329 -0
  929. package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +163 -0
  930. package/ds-canonical/fork/skills/propose-options/SKILL.md +179 -0
  931. package/ds-canonical/fork/skills/prototype/SKILL.md +244 -0
  932. package/ds-canonical/fork/skills/prototype/references/audit-checks.md +39 -0
  933. package/ds-canonical/fork/skills/prototype/references/benchmark-sources.md +94 -0
  934. package/ds-canonical/fork/skills/prototype/references/checkpoints.md +200 -0
  935. package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +142 -0
  936. package/ds-canonical/fork/skills/prototype/references/ooux-template.md +198 -0
  937. package/ds-canonical/fork/skills/prototype/references/proposal-template.md +230 -0
  938. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +201 -0
  939. package/ds-canonical/fork/skills/ux-audit/SKILL.md +133 -0
  940. package/ds-canonical/fork/skills/visual-audit/SKILL.md +248 -0
  941. package/ds-canonical/fork/skills/visual-audit/output/.gitkeep +0 -0
  942. package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +101 -0
  943. package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +297 -0
  944. package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  945. package/ds-canonical/hooks/README.md +39 -25
  946. package/ds-canonical/hooks/_log-fire.sh +111 -12
  947. package/ds-canonical/hooks/auto_regen_ds_barrel.sh +90 -0
  948. package/ds-canonical/hooks/block_prototype_imports.py +156 -26
  949. package/ds-canonical/hooks/check_audit_post_report_validator.sh +328 -32
  950. package/ds-canonical/hooks/check_audit_sample_escape.sh +10 -7
  951. package/ds-canonical/hooks/check_benchmark_citation.sh +41 -8
  952. package/ds-canonical/hooks/check_canonical_propagation.sh +85 -24
  953. package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +106 -0
  954. package/ds-canonical/hooks/check_codex_brief_invariants.sh +138 -29
  955. package/ds-canonical/hooks/check_codex_collab_5step.sh +31 -25
  956. package/ds-canonical/hooks/check_consumer_app_invariants.sh +731 -0
  957. package/ds-canonical/hooks/check_consumer_code_quality.sh +173 -0
  958. package/ds-canonical/hooks/check_datatable_invariants.sh +173 -29
  959. package/ds-canonical/hooks/check_dim_count_drift.sh +8 -7
  960. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +219 -0
  961. package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +57 -0
  962. package/ds-canonical/hooks/check_escape_marker_abuse.sh +213 -0
  963. package/ds-canonical/hooks/check_field_controls_contracts.sh +37 -8
  964. package/ds-canonical/hooks/check_field_family_invariants.sh +195 -24
  965. package/ds-canonical/hooks/check_file_size_budget.sh +32 -14
  966. package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +111 -0
  967. package/ds-canonical/hooks/check_item_list_gap.sh +56 -0
  968. package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +160 -0
  969. package/ds-canonical/hooks/check_main_branch_workbench.sh +27 -68
  970. package/ds-canonical/hooks/check_naming_and_abstraction.sh +21 -10
  971. package/ds-canonical/hooks/check_opacity_token_usage.sh +238 -68
  972. package/ds-canonical/hooks/check_orphan_ds_css.sh +96 -0
  973. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +110 -0
  974. package/ds-canonical/hooks/check_pattern_invariants.sh +160 -15
  975. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +4 -4
  976. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +6 -4
  977. package/ds-canonical/hooks/check_plugin_fork_health.sh +282 -0
  978. package/ds-canonical/hooks/check_propose_discipline.sh +255 -0
  979. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +6 -4
  980. package/ds-canonical/hooks/check_propose_without_benchmark.sh +71 -0
  981. package/ds-canonical/hooks/check_select_all_canonical.sh +1 -1
  982. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +99 -0
  983. package/ds-canonical/hooks/check_solo_workflow.sh +62 -168
  984. package/ds-canonical/hooks/check_spec_class_drift.sh +33 -19
  985. package/ds-canonical/hooks/check_ssot_header_declaration.sh +56 -0
  986. package/ds-canonical/hooks/check_story_determinism.sh +39 -0
  987. package/ds-canonical/hooks/check_story_invariants.sh +722 -222
  988. package/ds-canonical/hooks/check_storybook_addon_packaging.sh +201 -0
  989. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +143 -64
  990. package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +241 -0
  991. package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +86 -0
  992. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +15 -12
  993. package/ds-canonical/hooks/chrome_header_dispatcher.sh +105 -0
  994. package/ds-canonical/hooks/enforce_home_charter.sh +31 -10
  995. package/ds-canonical/hooks/governance_control_plane.sh +15 -0
  996. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +333 -0
  997. package/ds-canonical/hooks/inject_pending_self_audit.sh +68 -21
  998. package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +148 -0
  999. package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +121 -0
  1000. package/ds-canonical/hooks/lib/_code_quality.sh +9 -9
  1001. package/ds-canonical/hooks/lib/_cva_default_sync.sh +11 -13
  1002. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +48 -21
  1003. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +18 -10
  1004. package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +107 -0
  1005. package/ds-canonical/hooks/lib/_hook_integrity.sh +158 -0
  1006. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +5 -5
  1007. package/ds-canonical/hooks/lib/_micro_geometry.sh +291 -0
  1008. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +42 -23
  1009. package/ds-canonical/hooks/lib/_person_data_richness.sh +5 -5
  1010. package/ds-canonical/hooks/lib/_provider_paths.sh +162 -0
  1011. package/ds-canonical/hooks/lib/_story_compile_drift.sh +5 -5
  1012. package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +290 -0
  1013. package/ds-canonical/hooks/lib/_token_hygiene.sh +55 -20
  1014. package/ds-canonical/hooks/lib/approval-evidence.mjs +1286 -0
  1015. package/ds-canonical/hooks/lib/audit-report-validator.mjs +122 -0
  1016. package/ds-canonical/hooks/lib/provider-marker-regex.mjs +23 -0
  1017. package/ds-canonical/hooks/lib/tsx-governance-analysis.mjs +410 -0
  1018. package/ds-canonical/hooks/log_governance_fires.sh +45 -13
  1019. package/ds-canonical/hooks/log_skill_invokes.sh +8 -7
  1020. package/ds-canonical/hooks/post_edit_dispatcher.sh +106 -28
  1021. package/ds-canonical/hooks/registrations.json +488 -0
  1022. package/ds-canonical/hooks/registrations.schema.json +58 -0
  1023. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_addon_subdir_ship.sh +76 -0
  1024. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_app_story_title.sh +81 -0
  1025. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_ds_primitive_misuse.sh +120 -0
  1026. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_no_ds_catalog.sh +101 -0
  1027. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_consumer_story_baseline.sh +76 -0
  1028. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_data_table_size_num_to_meta_width.sh +68 -0
  1029. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_fork_user_plugin_install.sh +79 -0
  1030. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_plugin_freshness.sh +68 -0
  1031. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_cite_required.sh +88 -0
  1032. package/ds-canonical/hooks/{check_propose_plain_chinese.sh → retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh} +2 -2
  1033. package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_storybook_addon_preset_cjs.sh +87 -0
  1034. package/ds-canonical/hooks/{lib/_approval_re.sh → retired/_approval_re.sh.retired-2026-08-18} +6 -7
  1035. package/ds-canonical/hooks/retired/check_container_breathing.sh +1 -1
  1036. package/ds-canonical/hooks/retired/check_governance_compliance.sh +1 -1
  1037. package/ds-canonical/hooks/session_start_governance_check.sh +157 -69
  1038. package/ds-canonical/hooks/stop_audit_content_quality.sh +20 -0
  1039. package/ds-canonical/hooks/stop_extract_canonical_rules.sh +20 -0
  1040. package/ds-canonical/hooks/stop_passive_logging.sh +133 -59
  1041. package/ds-canonical/hooks/stop_self_audit.sh +472 -178
  1042. package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v1.jsonl +3 -0
  1043. package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v2.jsonl +3 -0
  1044. package/ds-canonical/hooks/tests/registration-output-contracts.mjs +151 -0
  1045. package/ds-canonical/hooks/tests/run-all.sh +35 -5
  1046. package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +224 -0
  1047. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +181 -9
  1048. package/ds-canonical/hooks/tests/test_check_addon_subdir_ship.sh +171 -0
  1049. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +275 -81
  1050. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +292 -14
  1051. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +0 -0
  1052. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +41 -9
  1053. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +56 -5
  1054. package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +198 -0
  1055. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +197 -81
  1056. package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +375 -0
  1057. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +49 -5
  1058. package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +140 -0
  1059. package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +164 -0
  1060. package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +86 -0
  1061. package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +417 -0
  1062. package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +214 -0
  1063. package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +209 -0
  1064. package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +71 -0
  1065. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +126 -12
  1066. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +13 -8
  1067. package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +150 -0
  1068. package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +76 -0
  1069. package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +278 -0
  1070. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +108 -18
  1071. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +67 -5
  1072. package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +151 -0
  1073. package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +200 -0
  1074. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +178 -68
  1075. package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +44 -0
  1076. package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +264 -0
  1077. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +45 -110
  1078. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +19 -2
  1079. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +151 -6
  1080. package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +228 -0
  1081. package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +191 -0
  1082. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +103 -7
  1083. package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +132 -0
  1084. package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +181 -0
  1085. package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +69 -0
  1086. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +10 -7
  1087. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +5 -5
  1088. package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +100 -0
  1089. package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +224 -0
  1090. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +86 -105
  1091. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +35 -7
  1092. package/ds-canonical/hooks/tests/test_check_ssot_header_declaration.sh +72 -0
  1093. package/ds-canonical/hooks/tests/{test_check_story_anatomy.sh.broken → test_check_story_anatomy.sh} +73 -4
  1094. package/ds-canonical/hooks/tests/test_check_story_category.sh +411 -0
  1095. package/ds-canonical/hooks/tests/test_check_story_determinism.sh +39 -0
  1096. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +734 -43
  1097. package/ds-canonical/hooks/tests/{test_check_story_name_jargon.sh.broken → test_check_story_name_jargon.sh} +22 -1
  1098. package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +89 -0
  1099. package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +200 -0
  1100. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +626 -28
  1101. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +182 -97
  1102. package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +76 -0
  1103. package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +182 -0
  1104. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +63 -15
  1105. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +12 -6
  1106. package/ds-canonical/hooks/tests/test_chrome_header_dispatcher.sh +125 -0
  1107. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +58 -4
  1108. package/ds-canonical/hooks/tests/test_governance_control_plane.sh +66 -0
  1109. package/ds-canonical/hooks/tests/test_governance_coverage_check.sh +88 -0
  1110. package/ds-canonical/hooks/tests/test_hook_integrity_classification.sh +217 -0
  1111. package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +276 -0
  1112. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +116 -11
  1113. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +117 -1
  1114. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +74 -5
  1115. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +234 -77
  1116. package/ds-canonical/hooks/tests/test_provider_peer_symmetry.sh +76 -0
  1117. package/ds-canonical/hooks/tests/test_registration_output_contracts.sh +20 -0
  1118. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +145 -22
  1119. package/ds-canonical/hooks/tests/test_stop_audit_content_quality.sh +75 -0
  1120. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +101 -23
  1121. package/ds-canonical/hooks/tests/test_stop_extract_canonical_rules.sh +75 -0
  1122. package/ds-canonical/hooks/tests/{test_stop_governance_drift_check.sh.broken → test_stop_governance_drift_check.sh} +22 -12
  1123. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +102 -1
  1124. package/ds-canonical/hooks/tests/test_stop_repository_command_context.sh +38 -0
  1125. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +427 -13
  1126. package/ds-canonical/references/README.md +19 -11
  1127. package/ds-canonical/references/build-ui-canonicals.md +23 -6
  1128. package/ds-canonical/references/certified-surfaces.md +46 -0
  1129. package/ds-canonical/references/composition-fidelity.md +47 -0
  1130. package/ds-canonical/references/cva-patterns.md +2 -2
  1131. package/ds-canonical/references/drag-canonical.md +67 -311
  1132. package/ds-canonical/references/failure-class-registry.json +160 -0
  1133. package/ds-canonical/references/governance-audit-coverage.md +34 -0
  1134. package/ds-canonical/references/item-anatomy-recipe.md +3 -3
  1135. package/ds-canonical/references/naming-conventions.md +2 -1
  1136. package/ds-canonical/references/principle-dim-map.json +136 -9
  1137. package/ds-canonical/references/props-naming.md +18 -3
  1138. package/ds-canonical/references/repository-hygiene-policy.json +143 -0
  1139. package/ds-canonical/references/repository-hygiene.md +106 -0
  1140. package/ds-canonical/references/runtime-evidence-retention.md +88 -0
  1141. package/ds-canonical/references/scenario-definition.md +146 -0
  1142. package/ds-canonical/references/spec-rules.md +1 -1
  1143. package/ds-canonical/references/ssot-consultation.md +5 -5
  1144. package/ds-canonical/references/ssot-index.md +11 -10
  1145. package/ds-canonical/references/story-baseline-registry.json +55 -11
  1146. package/ds-canonical/references/story-baseline-registry.schema.json +145 -0
  1147. package/ds-canonical/references/structural-token-retention.md +7 -10
  1148. package/ds-canonical/references/tailwind-gotchas.md +4 -4
  1149. package/ds-canonical/references/ui-dev-rules.md +22 -1
  1150. package/ds-canonical/rules/README.md +15 -10
  1151. package/ds-canonical/rules/meta-patterns.md +30 -30
  1152. package/ds-canonical/rules/self-verify.md +22 -12
  1153. package/ds-canonical/rules/spec-rules.md +2 -2
  1154. package/ds-canonical/rules/story-rules.md +36 -9
  1155. package/ds-canonical/rules/ui-development.md +23 -15
  1156. package/ds-canonical/skills/README.md +29 -17
  1157. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +26 -13
  1158. package/ds-canonical/skills/canonical-reviewer/SKILL.md +29 -0
  1159. package/ds-canonical/skills/code-quality-audit/SKILL.md +15 -11
  1160. package/ds-canonical/skills/codex-collab/SKILL.md +22 -235
  1161. package/ds-canonical/skills/codex-collab/references/brief-template.md +37 -43
  1162. package/ds-canonical/skills/codex-collab/references/transport.md +38 -57
  1163. package/ds-canonical/skills/codify-corrections/SKILL.md +37 -36
  1164. package/ds-canonical/skills/codify-principle/SKILL.md +35 -34
  1165. package/ds-canonical/skills/component-quality-gate/SKILL.md +17 -17
  1166. package/ds-canonical/skills/component-quality-gate/references/checklist.md +8 -8
  1167. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +47 -224
  1168. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +36 -102
  1169. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +33 -147
  1170. package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +28 -0
  1171. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +15 -80
  1172. package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +34 -0
  1173. package/ds-canonical/skills/delivery-handoff/SKILL.md +19 -8
  1174. package/ds-canonical/skills/design-system-audit/SKILL.md +130 -76
  1175. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +207 -105
  1176. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +59 -50
  1177. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +33 -9
  1178. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +51 -32
  1179. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +57 -53
  1180. package/ds-canonical/skills/ensure-canonical/SKILL.md +37 -35
  1181. package/ds-canonical/skills/governance-health/SKILL.md +31 -25
  1182. package/ds-canonical/skills/governance-status/SKILL.md +30 -0
  1183. package/ds-canonical/skills/independent-review/SKILL.md +37 -0
  1184. package/ds-canonical/skills/independent-review/agents/openai.yaml +4 -0
  1185. package/ds-canonical/skills/independent-review/references/evidence-contract.md +23 -0
  1186. package/ds-canonical/skills/knowledge-prune/SKILL.md +57 -114
  1187. package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +15 -0
  1188. package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +57 -0
  1189. package/ds-canonical/skills/knowledge-prune/references/world-class-prune-alignment.md +7 -0
  1190. package/ds-canonical/skills/new-component/SKILL.md +33 -25
  1191. package/ds-canonical/skills/new-component/references/new-component-checklist.md +12 -11
  1192. package/ds-canonical/skills/performance-audit/SKILL.md +15 -12
  1193. package/ds-canonical/skills/product-ui-audit/SKILL.md +52 -34
  1194. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +10 -7
  1195. package/ds-canonical/skills/product-ui-audit/references/report-template.md +30 -26
  1196. package/ds-canonical/skills/propose-options/SKILL.md +23 -23
  1197. package/ds-canonical/skills/prototype/SKILL.md +19 -21
  1198. package/ds-canonical/skills/prototype/references/audit-checks.md +6 -5
  1199. package/ds-canonical/skills/prototype/references/checkpoints.md +26 -17
  1200. package/ds-canonical/skills/prototype/references/evaluation-matrix.md +2 -2
  1201. package/ds-canonical/skills/prototype/references/ooux-template.md +1 -1
  1202. package/ds-canonical/skills/prototype/references/proposal-template.md +5 -5
  1203. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +29 -28
  1204. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +26 -25
  1205. package/ds-canonical/skills/story-writing/SKILL.md +25 -14
  1206. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +2 -2
  1207. package/ds-canonical/skills/story-writing/references/category-templates.md +15 -15
  1208. package/ds-canonical/skills/ux-audit/SKILL.md +13 -10
  1209. package/ds-canonical/skills/visual-audit/SKILL.md +47 -46
  1210. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +7 -7
  1211. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +14 -14
  1212. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +3 -3
  1213. package/ds-canonical/templates/_README.md +22 -0
  1214. package/ds-canonical/templates/consumer-governance.md +82 -0
  1215. package/ds-canonical/templates/dashboard-app.tsx +186 -0
  1216. package/ds-canonical/templates/product-launchers/fork-governance-dispatcher.sh +154 -0
  1217. package/ds-canonical/templates/product-launchers/format-provider-hook-output.mjs +25 -0
  1218. package/ds-canonical/templates/product-launchers/independent-review.mjs +490 -0
  1219. package/ds-canonical/templates/product-launchers/inject_fork_governance_preamble.sh +99 -0
  1220. package/ds-canonical/templates/product-launchers/normalize-provider-event.mjs +355 -0
  1221. package/ds-canonical/templates/product-launchers/product-hook-dispatch-runtime.mjs +1067 -0
  1222. package/ds-canonical/templates/product-provider-wiring.json +82 -0
  1223. package/ds-canonical/templates/product-provider-wiring.schema.json +153 -0
  1224. package/ds-story-manifest.json +1786 -0
  1225. package/llms-full.txt +450 -0
  1226. package/llms.txt +74 -0
  1227. package/package.json +43 -10
  1228. package/src/README.md +1 -1
  1229. package/src/components/Accordion/accordion.anatomy.stories.tsx +496 -0
  1230. package/src/components/Accordion/accordion.principles.stories.tsx +365 -0
  1231. package/src/components/Accordion/accordion.spec.md +31 -5
  1232. package/src/components/Accordion/accordion.stories.tsx +192 -0
  1233. package/src/components/Accordion/accordion.tsx +13 -5
  1234. package/src/components/Accordion/index.ts +5 -0
  1235. package/src/components/AccountMenu/account-menu.anatomy.stories.tsx +117 -0
  1236. package/src/components/AccountMenu/account-menu.principles.stories.tsx +99 -0
  1237. package/src/components/AccountMenu/account-menu.spec.md +127 -0
  1238. package/src/components/AccountMenu/account-menu.stories.tsx +65 -0
  1239. package/src/components/AccountMenu/account-menu.tsx +194 -0
  1240. package/src/components/AccountMenu/index.ts +5 -0
  1241. package/src/components/AgentPanel/agent-fab.tsx +111 -0
  1242. package/src/components/AgentPanel/agent-logo.tsx +417 -0
  1243. package/src/components/AgentPanel/agent-panel.anatomy.stories.tsx +124 -0
  1244. package/src/components/AgentPanel/agent-panel.css +43 -0
  1245. package/src/components/AgentPanel/agent-panel.principles.stories.tsx +40 -0
  1246. package/src/components/AgentPanel/agent-panel.spec.md +226 -0
  1247. package/src/components/AgentPanel/agent-panel.stories.tsx +215 -0
  1248. package/src/components/AgentPanel/agent-panel.tsx +0 -0
  1249. package/src/components/AgentPanel/index.ts +5 -0
  1250. package/src/components/Alert/alert.anatomy.stories.tsx +241 -0
  1251. package/src/components/Alert/alert.principles.stories.tsx +214 -0
  1252. package/src/components/Alert/alert.spec.md +28 -26
  1253. package/src/components/Alert/alert.stories.tsx +136 -0
  1254. package/src/components/Alert/alert.tsx +19 -8
  1255. package/src/components/Alert/index.ts +5 -0
  1256. package/src/components/AppShell/_demo-helpers.tsx +107 -28
  1257. package/src/components/AppShell/app-shell.anatomy.stories.tsx +185 -0
  1258. package/src/components/AppShell/app-shell.principles.stories.tsx +140 -0
  1259. package/src/components/AppShell/app-shell.spec.md +84 -48
  1260. package/src/components/AppShell/app-shell.stories.tsx +445 -0
  1261. package/src/components/AppShell/app-shell.tsx +77 -24
  1262. package/src/components/AppShell/index.ts +5 -0
  1263. package/src/components/AspectRatio/aspect-ratio.anatomy.stories.tsx +208 -0
  1264. package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +303 -0
  1265. package/src/components/AspectRatio/aspect-ratio.spec.md +24 -12
  1266. package/src/components/AspectRatio/aspect-ratio.stories.tsx +91 -0
  1267. package/src/components/AspectRatio/aspect-ratio.tsx +6 -3
  1268. package/src/components/AspectRatio/index.ts +5 -0
  1269. package/src/components/Avatar/avatar.anatomy.stories.tsx +705 -0
  1270. package/src/components/Avatar/avatar.principles.stories.tsx +249 -0
  1271. package/src/components/Avatar/avatar.spec.md +66 -103
  1272. package/src/components/Avatar/avatar.stories.tsx +156 -0
  1273. package/src/components/Avatar/avatar.tsx +85 -64
  1274. package/src/components/Avatar/index.ts +5 -0
  1275. package/src/components/Badge/badge.anatomy.stories.tsx +591 -0
  1276. package/src/components/Badge/badge.principles.stories.tsx +391 -0
  1277. package/src/components/Badge/badge.spec.md +43 -23
  1278. package/src/components/Badge/badge.stories.tsx +82 -0
  1279. package/src/components/Badge/badge.tsx +38 -14
  1280. package/src/components/Badge/index.ts +5 -0
  1281. package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +462 -0
  1282. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +353 -0
  1283. package/src/components/Breadcrumb/breadcrumb.spec.md +55 -43
  1284. package/src/components/Breadcrumb/breadcrumb.stories.tsx +381 -0
  1285. package/src/components/Breadcrumb/breadcrumb.tsx +43 -86
  1286. package/src/components/Breadcrumb/index.ts +5 -0
  1287. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +225 -0
  1288. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +255 -0
  1289. package/src/components/BulkActionBar/bulk-action-bar.spec.md +64 -36
  1290. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +124 -0
  1291. package/src/components/BulkActionBar/bulk-action-bar.tsx +26 -18
  1292. package/src/components/BulkActionBar/index.ts +5 -0
  1293. package/src/components/Button/button-group.tsx +64 -21
  1294. package/src/components/Button/button.anatomy.stories.tsx +729 -0
  1295. package/src/components/Button/button.principles.stories.tsx +369 -0
  1296. package/src/components/Button/button.spec.md +42 -39
  1297. package/src/components/Button/button.stories.tsx +368 -0
  1298. package/src/components/Button/button.tsx +109 -55
  1299. package/src/components/Button/index.ts +6 -0
  1300. package/src/components/Calendar/calendar.anatomy.stories.tsx +237 -0
  1301. package/src/components/Calendar/calendar.principles.stories.tsx +152 -0
  1302. package/src/components/Calendar/calendar.spec.md +80 -55
  1303. package/src/components/Calendar/calendar.stories.tsx +108 -0
  1304. package/src/components/Calendar/calendar.tsx +200 -134
  1305. package/src/components/Calendar/index.ts +5 -0
  1306. package/src/components/Carousel/carousel.anatomy.stories.tsx +517 -0
  1307. package/src/components/Carousel/carousel.principles.stories.tsx +334 -0
  1308. package/src/components/Carousel/carousel.spec.md +51 -15
  1309. package/src/components/Carousel/carousel.stories.tsx +125 -0
  1310. package/src/components/Carousel/carousel.tsx +139 -56
  1311. package/src/components/Carousel/index.ts +5 -0
  1312. package/src/components/Chart/chart.anatomy.stories.tsx +310 -0
  1313. package/src/components/Chart/chart.principles.stories.tsx +437 -0
  1314. package/src/components/Chart/chart.spec.md +24 -5
  1315. package/src/components/Chart/chart.stories.tsx +263 -0
  1316. package/src/components/Chart/chart.tsx +10 -3
  1317. package/src/components/Chart/index.ts +5 -0
  1318. package/src/components/Checkbox/checkbox-group.tsx +28 -16
  1319. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +614 -0
  1320. package/src/components/Checkbox/checkbox.principles.stories.tsx +216 -0
  1321. package/src/components/Checkbox/checkbox.spec.md +65 -42
  1322. package/src/components/Checkbox/checkbox.stories.tsx +119 -0
  1323. package/src/components/Checkbox/checkbox.tsx +189 -32
  1324. package/src/components/Checkbox/index.ts +6 -0
  1325. package/src/components/Chip/chip.anatomy.stories.tsx +442 -0
  1326. package/src/components/Chip/chip.principles.stories.tsx +228 -0
  1327. package/src/components/Chip/chip.spec.md +52 -40
  1328. package/src/components/Chip/chip.stories.tsx +111 -0
  1329. package/src/components/Chip/chip.tsx +130 -45
  1330. package/src/components/Chip/index.ts +5 -0
  1331. package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +177 -0
  1332. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +265 -0
  1333. package/src/components/CircularProgress/circular-progress.spec.md +32 -32
  1334. package/src/components/CircularProgress/circular-progress.stories.tsx +149 -0
  1335. package/src/components/CircularProgress/circular-progress.tsx +5 -6
  1336. package/src/components/CircularProgress/index.ts +5 -0
  1337. package/src/components/Coachmark/coachmark-story-helpers.tsx +39 -0
  1338. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +356 -0
  1339. package/src/components/Coachmark/coachmark.principles.stories.tsx +356 -0
  1340. package/src/components/Coachmark/coachmark.spec.md +36 -29
  1341. package/src/components/Coachmark/coachmark.stories.tsx +220 -0
  1342. package/src/components/Coachmark/coachmark.tsx +36 -10
  1343. package/src/components/Coachmark/index.ts +5 -0
  1344. package/src/components/Combobox/combobox.anatomy.stories.tsx +926 -0
  1345. package/src/components/Combobox/combobox.principles.stories.tsx +238 -0
  1346. package/src/components/Combobox/combobox.spec.md +45 -16
  1347. package/src/components/Combobox/combobox.stories.tsx +194 -0
  1348. package/src/components/Combobox/combobox.tsx +278 -97
  1349. package/src/components/Combobox/index.ts +5 -0
  1350. package/src/components/Command/command.anatomy.stories.tsx +107 -0
  1351. package/src/components/Command/command.principles.stories.tsx +86 -0
  1352. package/src/components/Command/command.spec.md +33 -23
  1353. package/src/components/Command/command.stories.tsx +312 -0
  1354. package/src/components/Command/command.tsx +28 -12
  1355. package/src/components/Command/index.ts +5 -0
  1356. package/src/components/DataTable/active-editor-controller.ts +4 -3
  1357. package/src/components/DataTable/cell-registry.tsx +161 -120
  1358. package/src/components/DataTable/column-types.ts +14 -18
  1359. package/src/components/DataTable/data-table-column-visibility-panel.tsx +28 -12
  1360. package/src/components/DataTable/data-table-filter-group.tsx +248 -0
  1361. package/src/components/DataTable/data-table-filter-labels.ts +100 -0
  1362. package/src/components/DataTable/data-table-filter-panel.tsx +85 -448
  1363. package/src/components/DataTable/data-table-filter-value-picker.tsx +254 -0
  1364. package/src/components/DataTable/data-table-interaction-layer.tsx +26 -29
  1365. package/src/components/DataTable/data-table-sort-manager.tsx +19 -11
  1366. package/src/components/DataTable/data-table.anatomy.stories.tsx +522 -0
  1367. package/src/components/DataTable/data-table.css +34 -8
  1368. package/src/components/DataTable/data-table.principles.stories.tsx +270 -0
  1369. package/src/components/DataTable/data-table.spec.md +186 -172
  1370. package/src/components/DataTable/data-table.stories.tsx +2311 -0
  1371. package/src/components/DataTable/data-table.tsx +678 -278
  1372. package/src/components/DataTable/filter-operators.spec.md +269 -0
  1373. package/src/components/DataTable/filter-operators.ts +1 -1
  1374. package/src/components/DataTable/filter-tree.ts +194 -44
  1375. package/src/components/DataTable/index.ts +8 -0
  1376. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +587 -0
  1377. package/src/components/DateGrid/date-grid.principles.stories.tsx +344 -0
  1378. package/src/components/DateGrid/date-grid.spec.md +46 -41
  1379. package/src/components/DateGrid/date-grid.stories.tsx +204 -0
  1380. package/src/components/DateGrid/date-grid.tsx +89 -28
  1381. package/src/components/DateGrid/index.ts +5 -0
  1382. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +946 -0
  1383. package/src/components/DatePicker/date-picker.principles.stories.tsx +205 -0
  1384. package/src/components/DatePicker/date-picker.spec.md +61 -57
  1385. package/src/components/DatePicker/date-picker.stories.tsx +364 -0
  1386. package/src/components/DatePicker/date-picker.tsx +382 -198
  1387. package/src/components/DatePicker/index.ts +5 -0
  1388. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +254 -0
  1389. package/src/components/DescriptionList/description-list.principles.stories.tsx +309 -0
  1390. package/src/components/DescriptionList/description-list.spec.md +35 -30
  1391. package/src/components/DescriptionList/description-list.stories.tsx +113 -0
  1392. package/src/components/DescriptionList/description-list.tsx +16 -14
  1393. package/src/components/DescriptionList/index.ts +5 -0
  1394. package/src/components/Dialog/dialog.anatomy.stories.tsx +485 -0
  1395. package/src/components/Dialog/dialog.principles.stories.tsx +261 -0
  1396. package/src/components/Dialog/dialog.spec.md +58 -32
  1397. package/src/components/Dialog/dialog.stories.tsx +548 -0
  1398. package/src/components/Dialog/dialog.tsx +81 -36
  1399. package/src/components/Dialog/index.ts +5 -0
  1400. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +971 -0
  1401. package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +341 -0
  1402. package/src/components/DropdownMenu/dropdown-menu.spec.md +40 -22
  1403. package/src/components/DropdownMenu/dropdown-menu.stories.tsx +276 -0
  1404. package/src/components/DropdownMenu/dropdown-menu.tsx +153 -40
  1405. package/src/components/DropdownMenu/index.ts +5 -0
  1406. package/src/components/Empty/empty.anatomy.stories.tsx +275 -0
  1407. package/src/components/Empty/empty.principles.stories.tsx +314 -0
  1408. package/src/components/Empty/empty.spec.md +42 -42
  1409. package/src/components/Empty/empty.stories.tsx +69 -0
  1410. package/src/components/Empty/empty.tsx +23 -11
  1411. package/src/components/Empty/index.ts +5 -0
  1412. package/src/components/Field/field-context.ts +196 -4
  1413. package/src/components/Field/field-controls.spec.md +161 -54
  1414. package/src/components/Field/field-edit-keys.ts +66 -0
  1415. package/src/components/Field/field-types.ts +71 -20
  1416. package/src/components/Field/field-wrapper.tsx +139 -89
  1417. package/src/components/Field/field.anatomy.stories.tsx +547 -0
  1418. package/src/components/Field/field.principles.stories.tsx +255 -0
  1419. package/src/components/Field/field.spec.md +76 -34
  1420. package/src/components/Field/field.stories.tsx +751 -0
  1421. package/src/components/Field/field.tsx +65 -12
  1422. package/src/components/Field/form-validation.spec.md +60 -34
  1423. package/src/components/Field/index.ts +6 -0
  1424. package/src/components/Field/use-form-validation.ts +270 -0
  1425. package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +119 -0
  1426. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +121 -0
  1427. package/src/components/FieldControlGroup/field-control-group.spec.md +41 -19
  1428. package/src/components/FieldControlGroup/field-control-group.stories.tsx +162 -0
  1429. package/src/components/FieldControlGroup/field-control-group.tsx +13 -15
  1430. package/src/components/FieldControlGroup/index.ts +5 -0
  1431. package/src/components/FileItem/file-item.anatomy.stories.tsx +346 -0
  1432. package/src/components/FileItem/file-item.principles.stories.tsx +245 -0
  1433. package/src/components/FileItem/file-item.spec.md +133 -104
  1434. package/src/components/FileItem/file-item.stories.tsx +289 -0
  1435. package/src/components/FileItem/file-item.tsx +85 -39
  1436. package/src/components/FileItem/index.ts +5 -0
  1437. package/src/components/FileUpload/file-upload.anatomy.stories.tsx +446 -0
  1438. package/src/components/FileUpload/file-upload.principles.stories.tsx +312 -0
  1439. package/src/components/FileUpload/file-upload.spec.md +66 -24
  1440. package/src/components/FileUpload/file-upload.stories.tsx +219 -0
  1441. package/src/components/FileUpload/file-upload.tsx +138 -43
  1442. package/src/components/FileUpload/index.ts +5 -0
  1443. package/src/components/FileViewer/can-render-image.ts +15 -0
  1444. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1130 -0
  1445. package/src/components/FileViewer/file-viewer.principles.stories.tsx +636 -0
  1446. package/src/components/FileViewer/file-viewer.spec.md +70 -58
  1447. package/src/components/FileViewer/file-viewer.stories.tsx +417 -0
  1448. package/src/components/FileViewer/file-viewer.tsx +157 -72
  1449. package/src/components/FileViewer/image-renderer.tsx +38 -15
  1450. package/src/components/FileViewer/index.ts +5 -0
  1451. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +151 -0
  1452. package/src/components/HoverCard/hover-card.principles.stories.tsx +211 -0
  1453. package/src/components/HoverCard/hover-card.spec.md +38 -28
  1454. package/src/components/HoverCard/hover-card.stories.tsx +304 -0
  1455. package/src/components/HoverCard/hover-card.tsx +23 -6
  1456. package/src/components/HoverCard/index.ts +5 -0
  1457. package/src/components/InlineEdit/index.ts +5 -0
  1458. package/src/components/InlineEdit/inline-edit.anatomy.stories.tsx +250 -0
  1459. package/src/components/InlineEdit/inline-edit.principles.stories.tsx +142 -0
  1460. package/src/components/InlineEdit/inline-edit.spec.md +186 -0
  1461. package/src/components/InlineEdit/inline-edit.stories.tsx +261 -0
  1462. package/src/components/InlineEdit/inline-edit.tsx +455 -0
  1463. package/src/components/Input/index.ts +5 -0
  1464. package/src/components/Input/input.anatomy.stories.tsx +780 -0
  1465. package/src/components/Input/input.principles.stories.tsx +260 -0
  1466. package/src/components/Input/input.spec.md +34 -26
  1467. package/src/components/Input/input.stories.tsx +150 -0
  1468. package/src/components/Input/input.tsx +102 -45
  1469. package/src/components/LinkInput/index.ts +5 -0
  1470. package/src/components/LinkInput/link-input.anatomy.stories.tsx +748 -0
  1471. package/src/components/LinkInput/link-input.principles.stories.tsx +182 -0
  1472. package/src/components/LinkInput/link-input.spec.md +25 -7
  1473. package/src/components/LinkInput/link-input.stories.tsx +133 -0
  1474. package/src/components/LinkInput/link-input.tsx +89 -66
  1475. package/src/components/Menu/index.ts +5 -0
  1476. package/src/components/Menu/menu-item.anatomy.stories.tsx +780 -0
  1477. package/src/components/Menu/menu-item.principles.stories.tsx +81 -0
  1478. package/src/components/Menu/menu-item.spec.md +55 -32
  1479. package/src/components/Menu/menu-item.stories.tsx +242 -0
  1480. package/src/components/Menu/menu-item.tsx +71 -12
  1481. package/src/components/Notice/index.ts +5 -0
  1482. package/src/components/Notice/notice.anatomy.stories.tsx +614 -0
  1483. package/src/components/Notice/notice.principles.stories.tsx +102 -0
  1484. package/src/components/Notice/notice.spec.md +39 -18
  1485. package/src/components/Notice/notice.stories.tsx +257 -0
  1486. package/src/components/Notice/notice.tsx +62 -16
  1487. package/src/components/NumberInput/index.ts +5 -0
  1488. package/src/components/NumberInput/number-input.anatomy.stories.tsx +822 -0
  1489. package/src/components/NumberInput/number-input.principles.stories.tsx +206 -0
  1490. package/src/components/NumberInput/number-input.spec.md +35 -16
  1491. package/src/components/NumberInput/number-input.stories.tsx +167 -0
  1492. package/src/components/NumberInput/number-input.tsx +65 -31
  1493. package/src/components/OverflowIndicator/index.ts +5 -0
  1494. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +550 -0
  1495. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +76 -0
  1496. package/src/components/OverflowIndicator/overflow-indicator.spec.md +36 -26
  1497. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +222 -0
  1498. package/src/components/OverflowIndicator/overflow-indicator.tsx +22 -7
  1499. package/src/components/Pagination/index.ts +5 -0
  1500. package/src/components/Pagination/pagination.anatomy.stories.tsx +144 -0
  1501. package/src/components/Pagination/pagination.principles.stories.tsx +81 -0
  1502. package/src/components/Pagination/pagination.spec.md +150 -0
  1503. package/src/components/Pagination/pagination.stories.tsx +97 -0
  1504. package/src/components/Pagination/pagination.tsx +263 -0
  1505. package/src/components/PeoplePicker/avatar-stack-overflow.ts +1 -1
  1506. package/src/components/PeoplePicker/index.ts +5 -0
  1507. package/src/components/PeoplePicker/people-picker-helpers.ts +5 -5
  1508. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +437 -0
  1509. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +196 -0
  1510. package/src/components/PeoplePicker/people-picker.spec.md +97 -40
  1511. package/src/components/PeoplePicker/people-picker.stories.tsx +245 -0
  1512. package/src/components/PeoplePicker/people-picker.tsx +225 -108
  1513. package/src/components/PeoplePicker/person-display.tsx +83 -47
  1514. package/src/components/Popover/index.ts +5 -0
  1515. package/src/components/Popover/popover.anatomy.stories.tsx +282 -0
  1516. package/src/components/Popover/popover.principles.stories.tsx +316 -0
  1517. package/src/components/Popover/popover.spec.md +41 -31
  1518. package/src/components/Popover/popover.stories.tsx +120 -0
  1519. package/src/components/Popover/popover.tsx +106 -47
  1520. package/src/components/ProfileCard/index.ts +5 -0
  1521. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +493 -0
  1522. package/src/components/ProfileCard/profile-card.principles.stories.tsx +225 -0
  1523. package/src/components/ProfileCard/profile-card.spec.md +189 -0
  1524. package/src/components/ProfileCard/profile-card.stories.tsx +57 -0
  1525. package/src/components/{NameCard/name-card.tsx → ProfileCard/profile-card.tsx} +66 -39
  1526. package/src/components/ProgressBar/index.ts +5 -0
  1527. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +441 -0
  1528. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +326 -0
  1529. package/src/components/ProgressBar/progress-bar.spec.md +25 -21
  1530. package/src/components/ProgressBar/progress-bar.stories.tsx +133 -0
  1531. package/src/components/ProgressBar/progress-bar.tsx +6 -23
  1532. package/src/components/README.md +5 -4
  1533. package/src/components/RadioGroup/index.ts +5 -0
  1534. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +672 -0
  1535. package/src/components/RadioGroup/radio-group.principles.stories.tsx +163 -0
  1536. package/src/components/RadioGroup/radio-group.spec.md +15 -9
  1537. package/src/components/RadioGroup/radio-group.stories.tsx +204 -0
  1538. package/src/components/RadioGroup/radio-group.tsx +219 -67
  1539. package/src/components/Rating/index.ts +5 -0
  1540. package/src/components/Rating/rating.anatomy.stories.tsx +498 -0
  1541. package/src/components/Rating/rating.principles.stories.tsx +296 -0
  1542. package/src/components/Rating/rating.spec.md +41 -29
  1543. package/src/components/Rating/rating.stories.tsx +119 -0
  1544. package/src/components/Rating/rating.tsx +37 -18
  1545. package/src/components/ScrollArea/index.ts +5 -0
  1546. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +451 -0
  1547. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +331 -0
  1548. package/src/components/ScrollArea/scroll-area.spec.md +24 -22
  1549. package/src/components/ScrollArea/scroll-area.stories.tsx +247 -0
  1550. package/src/components/ScrollArea/scroll-area.tsx +24 -7
  1551. package/src/components/SegmentedControl/index.ts +5 -0
  1552. package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +295 -0
  1553. package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +284 -0
  1554. package/src/components/SegmentedControl/segmented-control.spec.md +38 -39
  1555. package/src/components/SegmentedControl/segmented-control.stories.tsx +37 -0
  1556. package/src/components/SegmentedControl/segmented-control.tsx +44 -24
  1557. package/src/components/Select/index.ts +5 -0
  1558. package/src/components/Select/select.anatomy.stories.tsx +834 -0
  1559. package/src/components/Select/select.principles.stories.tsx +312 -0
  1560. package/src/components/Select/select.spec.md +99 -39
  1561. package/src/components/Select/select.stories.tsx +273 -0
  1562. package/src/components/Select/select.tsx +389 -97
  1563. package/src/components/SelectMenu/index.ts +5 -0
  1564. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +830 -0
  1565. package/src/components/SelectMenu/select-menu.principles.stories.tsx +106 -0
  1566. package/src/components/SelectMenu/select-menu.spec.md +51 -32
  1567. package/src/components/SelectMenu/select-menu.stories.tsx +143 -0
  1568. package/src/components/SelectMenu/select-menu.tsx +276 -33
  1569. package/src/components/SelectionControl/boolean-value.tsx +39 -0
  1570. package/src/components/SelectionControl/index.ts +6 -0
  1571. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +580 -0
  1572. package/src/components/SelectionControl/selection-item.principles.stories.tsx +77 -0
  1573. package/src/components/SelectionControl/selection-item.spec.md +30 -16
  1574. package/src/components/SelectionControl/selection-item.stories.tsx +137 -0
  1575. package/src/components/SelectionControl/selection-item.tsx +8 -2
  1576. package/src/components/Separator/index.ts +5 -0
  1577. package/src/components/Separator/separator.anatomy.stories.tsx +125 -0
  1578. package/src/components/Separator/separator.principles.stories.tsx +141 -0
  1579. package/src/components/Separator/separator.spec.md +15 -9
  1580. package/src/components/Separator/separator.stories.tsx +106 -0
  1581. package/src/components/Separator/separator.tsx +2 -2
  1582. package/src/components/Sheet/index.ts +5 -0
  1583. package/src/components/Sheet/sheet.anatomy.stories.tsx +269 -0
  1584. package/src/components/Sheet/sheet.principles.stories.tsx +353 -0
  1585. package/src/components/Sheet/sheet.spec.md +16 -17
  1586. package/src/components/Sheet/sheet.stories.tsx +172 -0
  1587. package/src/components/Sheet/sheet.tsx +24 -14
  1588. package/src/components/Sidebar/index.ts +5 -0
  1589. package/src/components/Sidebar/sidebar.anatomy.stories.tsx +776 -0
  1590. package/src/components/Sidebar/sidebar.principles.stories.tsx +507 -0
  1591. package/src/components/Sidebar/sidebar.spec.md +65 -62
  1592. package/src/components/Sidebar/sidebar.stories.tsx +535 -0
  1593. package/src/components/Sidebar/sidebar.tsx +134 -57
  1594. package/src/components/Skeleton/index.ts +5 -0
  1595. package/src/components/Skeleton/skeleton.anatomy.stories.tsx +145 -0
  1596. package/src/components/Skeleton/skeleton.principles.stories.tsx +234 -0
  1597. package/src/components/Skeleton/skeleton.spec.md +15 -14
  1598. package/src/components/Skeleton/skeleton.stories.tsx +134 -0
  1599. package/src/components/Skeleton/skeleton.tsx +2 -2
  1600. package/src/components/Slider/index.ts +5 -0
  1601. package/src/components/Slider/slider.anatomy.stories.tsx +237 -0
  1602. package/src/components/Slider/slider.principles.stories.tsx +250 -0
  1603. package/src/components/Slider/slider.spec.md +66 -118
  1604. package/src/components/Slider/slider.stories.tsx +115 -0
  1605. package/src/components/Slider/slider.tsx +83 -26
  1606. package/src/components/Steps/index.ts +5 -0
  1607. package/src/components/Steps/steps.anatomy.stories.tsx +448 -0
  1608. package/src/components/Steps/steps.principles.stories.tsx +300 -0
  1609. package/src/components/Steps/steps.spec.md +91 -74
  1610. package/src/components/Steps/steps.stories.tsx +306 -0
  1611. package/src/components/Steps/steps.tsx +99 -37
  1612. package/src/components/Switch/index.ts +5 -0
  1613. package/src/components/Switch/switch.anatomy.stories.tsx +227 -0
  1614. package/src/components/Switch/switch.principles.stories.tsx +177 -0
  1615. package/src/components/Switch/switch.spec.md +53 -24
  1616. package/src/components/Switch/switch.stories.tsx +95 -0
  1617. package/src/components/Switch/switch.tsx +176 -43
  1618. package/src/components/Tabs/index.ts +5 -0
  1619. package/src/components/Tabs/tabs-inline-action-geometry.ts +94 -0
  1620. package/src/components/Tabs/tabs.anatomy.stories.tsx +424 -0
  1621. package/src/components/Tabs/tabs.principles.stories.tsx +291 -0
  1622. package/src/components/Tabs/tabs.spec.md +58 -69
  1623. package/src/components/Tabs/tabs.stories.tsx +257 -0
  1624. package/src/components/Tabs/tabs.tsx +262 -82
  1625. package/src/components/Tag/index.ts +5 -0
  1626. package/src/components/Tag/tag.anatomy.stories.tsx +667 -0
  1627. package/src/components/Tag/tag.principles.stories.tsx +270 -0
  1628. package/src/components/Tag/tag.spec.md +112 -100
  1629. package/src/components/Tag/tag.stories.tsx +88 -0
  1630. package/src/components/Tag/tag.tsx +120 -80
  1631. package/src/components/Textarea/index.ts +5 -0
  1632. package/src/components/Textarea/textarea.anatomy.stories.tsx +310 -0
  1633. package/src/components/Textarea/textarea.principles.stories.tsx +192 -0
  1634. package/src/components/Textarea/textarea.spec.md +35 -16
  1635. package/src/components/Textarea/textarea.stories.tsx +57 -0
  1636. package/src/components/Textarea/textarea.tsx +154 -83
  1637. package/src/components/TimePicker/index.ts +5 -0
  1638. package/src/components/TimePicker/time-columns.tsx +15 -3
  1639. package/src/components/TimePicker/time-picker.anatomy.stories.tsx +283 -0
  1640. package/src/components/TimePicker/time-picker.principles.stories.tsx +133 -0
  1641. package/src/components/TimePicker/time-picker.spec.md +58 -52
  1642. package/src/components/TimePicker/time-picker.stories.tsx +193 -0
  1643. package/src/components/TimePicker/time-picker.tsx +119 -60
  1644. package/src/components/Toast/index.ts +5 -0
  1645. package/src/components/Toast/toast.anatomy.stories.tsx +328 -0
  1646. package/src/components/Toast/toast.principles.stories.tsx +216 -0
  1647. package/src/components/Toast/toast.spec.md +26 -16
  1648. package/src/components/Toast/toast.stories.tsx +241 -0
  1649. package/src/components/Toast/toast.tsx +101 -23
  1650. package/src/components/Tooltip/index.ts +5 -0
  1651. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +422 -0
  1652. package/src/components/Tooltip/tooltip.principles.stories.tsx +204 -0
  1653. package/src/components/Tooltip/tooltip.spec.md +37 -23
  1654. package/src/components/Tooltip/tooltip.stories.tsx +82 -0
  1655. package/src/components/Tooltip/tooltip.tsx +58 -12
  1656. package/src/components/TreeView/index.ts +5 -0
  1657. package/src/components/TreeView/tree-view.anatomy.stories.tsx +436 -0
  1658. package/src/components/TreeView/tree-view.principles.stories.tsx +223 -0
  1659. package/src/components/TreeView/tree-view.spec.md +103 -54
  1660. package/src/components/TreeView/tree-view.stories.tsx +365 -0
  1661. package/src/components/TreeView/tree-view.tsx +501 -58
  1662. package/src/hooks/use-controllable.ts +7 -2
  1663. package/src/hooks/use-is-touch-device.ts +8 -1
  1664. package/src/hooks/use-overflow-items.ts +10 -6
  1665. package/src/hooks/use-truncated.ts +111 -0
  1666. package/src/index.ts +648 -71
  1667. package/src/lib/drag-visual.ts +2 -2
  1668. package/src/lib/utils.ts +21 -1
  1669. package/src/patterns/README.md +20 -16
  1670. package/src/patterns/action-bar/action-bar.spec.md +63 -45
  1671. package/src/patterns/action-bar/action-bar.stories.tsx +619 -0
  1672. package/src/patterns/element-anatomy/element-anatomy.spec.md +17 -13
  1673. package/src/patterns/element-anatomy/index.ts +6 -0
  1674. package/src/patterns/element-anatomy/inline-action.spec.md +33 -22
  1675. package/src/patterns/element-anatomy/item-anatomy.spec.md +108 -79
  1676. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1648 -0
  1677. package/src/patterns/element-anatomy/item-anatomy.tsx +147 -56
  1678. package/src/patterns/element-anatomy/truncated-text.spec.md +68 -0
  1679. package/src/patterns/element-anatomy/truncated-text.tsx +61 -0
  1680. package/src/patterns/header-canonical/chrome-header.tsx +26 -6
  1681. package/src/patterns/header-canonical/header-canonical.css +3 -4
  1682. package/src/patterns/header-canonical/header-canonical.spec.md +96 -42
  1683. package/src/patterns/header-canonical/header-canonical.stories.tsx +257 -0
  1684. package/src/patterns/header-canonical/index.ts +5 -0
  1685. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +36 -15
  1686. package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +139 -0
  1687. package/src/patterns/horizontal-overflow/horizontal-overflow.tsx +1 -1
  1688. package/src/patterns/horizontal-overflow/index.ts +5 -0
  1689. package/src/patterns/overlay-surface/index.ts +5 -0
  1690. package/src/patterns/overlay-surface/overlay-surface.spec.md +94 -58
  1691. package/src/patterns/overlay-surface/overlay-surface.stories.tsx +132 -0
  1692. package/src/patterns/overlay-surface/overlay-surface.tsx +37 -18
  1693. package/src/patterns/resize-handle/index.ts +5 -0
  1694. package/src/patterns/resize-handle/resize-handle.spec.md +22 -13
  1695. package/src/patterns/resize-handle/resize-handle.stories.tsx +73 -0
  1696. package/src/patterns/resize-handle/resize-handle.tsx +13 -18
  1697. package/src/story-governance/category-matrix.json +132 -0
  1698. package/src/story-governance/category-matrix.ts +55 -0
  1699. package/src/styles/base.css +99 -0
  1700. package/src/styles/tokens.css +14 -0
  1701. package/src/tokens/README.md +10 -5
  1702. package/src/tokens/categorical-color.ts +164 -0
  1703. package/src/tokens/color/color.spec.md +95 -72
  1704. package/src/tokens/color/color.stories.tsx +403 -0
  1705. package/src/tokens/color/primitives.css +23 -7
  1706. package/src/tokens/color/semantic.css +75 -21
  1707. package/src/tokens/density/density.spec.md +33 -30
  1708. package/src/tokens/density/density.stories.tsx +254 -0
  1709. package/src/tokens/elevation/elevation.spec.md +11 -14
  1710. package/src/tokens/elevation/elevation.stories.tsx +99 -0
  1711. package/src/tokens/layoutSpace/layoutSpace.css +1 -1
  1712. package/src/tokens/layoutSpace/layoutSpace.spec.md +44 -31
  1713. package/src/tokens/layoutSpace/layoutSpace.stories.tsx +76 -0
  1714. package/src/tokens/motion/motion.css +49 -20
  1715. package/src/tokens/motion/motion.spec.md +45 -21
  1716. package/src/tokens/motion/motion.stories.tsx +196 -0
  1717. package/src/tokens/motion/motion.ts +8 -7
  1718. package/src/tokens/motion/overlay-motion.ts +26 -0
  1719. package/src/tokens/opacity/opacity.spec.md +15 -20
  1720. package/src/tokens/opacity/opacity.stories.tsx +66 -0
  1721. package/src/tokens/orphan-tokens.spec.md +22 -11
  1722. package/src/tokens/radius/radius.spec.md +14 -11
  1723. package/src/tokens/radius/radius.stories.tsx +87 -0
  1724. package/src/tokens/token-system.spec.md +241 -0
  1725. package/src/tokens/typography/typography.css +1 -1
  1726. package/src/tokens/typography/typography.spec.md +12 -8
  1727. package/src/tokens/typography/typography.stories.tsx +134 -0
  1728. package/src/tokens/uiSize/icon-size.ts +3 -4
  1729. package/src/tokens/uiSize/uiSize.css +58 -1
  1730. package/src/tokens/uiSize/uiSize.spec.md +61 -32
  1731. package/src/tokens/uiSize/uiSize.stories.tsx +106 -0
  1732. package/src/tokens/utility-registry.json +426 -0
  1733. package/src/tokens/utility-registry.schema.json +409 -0
  1734. package/tools/README.md +9 -0
  1735. package/tools/codemods/cli.mjs +93 -0
  1736. package/tools/codemods/index.mjs +582 -0
  1737. package/tools/shared/safe-filesystem.mjs +371 -0
  1738. package/tools/visual-baseline/cli.mjs +97 -0
  1739. package/tools/visual-baseline/index.mjs +522 -0
  1740. package/dist/components/NameCard/name-card.d.ts.map +0 -1
  1741. package/dist/components/NameCard/name-card.js.map +0 -1
  1742. package/ds-canonical/commands/gov-status.md +0 -79
  1743. package/ds-canonical/hooks/check_app_shell_primary_header_consistency.sh +0 -68
  1744. package/ds-canonical/hooks/check_chrome_header_handcraft.sh +0 -70
  1745. package/ds-canonical/hooks/check_header_with_tabs_border.sh +0 -87
  1746. package/ds-canonical/hooks/check_tab_lg_chrome_header_equal.sh +0 -66
  1747. package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +0 -15
  1748. package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +0 -187
  1749. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +0 -74
  1750. package/ds-canonical/skills/design-system-audit/references/spec-template.md +0 -66
  1751. package/src/components/NameCard/name-card.spec.md +0 -171
@@ -0,0 +1,2377 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { compareUtf8Bytes } from './canonical-order.mjs'
3
+
4
+ export const EXACT_REVIEW_CERTIFICATION_CONTRACT = 'exact-provider-runtime-surface-role-target-v1'
5
+ export const MANAGED_REVIEW_TRANSPORT = 'managed-model-broker-v1'
6
+ export const PORTABLE_REVIEW_EXCHANGE_CORE = 'content-addressed-model-broker-exchange-v1'
7
+ export const REVIEW_TARGET_AXES = Object.freeze([
8
+ 'operatingSystem',
9
+ 'platform',
10
+ 'arch',
11
+ 'executionEnvironment',
12
+ 'distributionVersion',
13
+ 'pathClass',
14
+ ])
15
+
16
+ const PROVIDER_ID = /^[a-z][a-z0-9-]*$/
17
+ const TARGET_ID = /^[a-z0-9][a-z0-9-]*$/
18
+ const SHA256 = /^[a-f0-9]{64}$/
19
+ const REVIEW_PROFILE_ID = /^[a-z][a-z0-9-]*$/
20
+ const REVIEW_TIERS = Object.freeze(['standard', 'high', 'maximum'])
21
+ // Capability authority must not be transferable by reflecting over an object
22
+ // or replayable after its invocation-profile authority changes. Module-private
23
+ // metadata binds the exact minted object to the exact profile that authorized
24
+ // its runtime/surface/check/assertion evidence; serialized or stale records must
25
+ // be reverified.
26
+ const VERIFIED_ENTITLEMENT_AVAILABILITY = new WeakMap()
27
+
28
+ export class ProviderReviewBindingError extends Error {
29
+ constructor(code, detail) {
30
+ super(`${code}:${detail}`)
31
+ this.name = 'ProviderReviewBindingError'
32
+ this.code = code
33
+ }
34
+ }
35
+
36
+ function block(code, detail) {
37
+ throw new ProviderReviewBindingError(code, detail)
38
+ }
39
+
40
+ function object(value, code, label) {
41
+ if (!value || typeof value !== 'object' || Array.isArray(value)) block(code, `${label} is missing or invalid`)
42
+ return value
43
+ }
44
+
45
+ function nonEmpty(value, code, label) {
46
+ if (typeof value !== 'string' || !value.trim()) block(code, `${label} is missing or invalid`)
47
+ return value
48
+ }
49
+
50
+ function stableValue(value) {
51
+ if (Array.isArray(value)) return value.map(stableValue)
52
+ if (value && typeof value === 'object') {
53
+ return Object.fromEntries(Object.keys(value).sort(compareUtf8Bytes).map((key) => [key, stableValue(value[key])]))
54
+ }
55
+ return value
56
+ }
57
+
58
+ function digest(value) {
59
+ return createHash('sha256').update(JSON.stringify(stableValue(value))).digest('hex')
60
+ }
61
+
62
+ function providerById(registry, providerId, label) {
63
+ if (!PROVIDER_ID.test(providerId ?? '')) block('REVIEW_PROVIDER_INVALID', `${label} provider id is invalid:${providerId ?? '<missing>'}`)
64
+ const matches = (registry.providers || []).filter((provider) => provider?.id === providerId)
65
+ if (matches.length !== 1) block('REVIEW_PROVIDER_UNAVAILABLE', `${label} provider is not a registered concrete runtime:${providerId}`)
66
+ if (matches[0].providerKind && matches[0].providerKind !== 'concrete-runtime') {
67
+ block('REVIEW_PROVIDER_UNAVAILABLE', `${label} provider is not a concrete runtime:${providerId}`)
68
+ }
69
+ return matches[0]
70
+ }
71
+
72
+ function exactReviewPolicy(registry, policyId, reviewClass) {
73
+ const policies = object(registry.canonical?.reviewSelectionPolicies, 'REVIEW_SELECTION_POLICY_UNAVAILABLE', 'review selection policies')
74
+ const policy = object(policies[policyId], 'REVIEW_SELECTION_POLICY_UNAVAILABLE', `review selection policy ${policyId}`)
75
+ if (policy.schemaVersion !== 1
76
+ || JSON.stringify(policy.assuranceTierOrder) !== JSON.stringify(REVIEW_TIERS)
77
+ || JSON.stringify(policy.reasoningTierOrder) !== JSON.stringify(REVIEW_TIERS)
78
+ || JSON.stringify(policy.computeTierOrder) !== JSON.stringify(REVIEW_TIERS)
79
+ || policy.costPolicy !== 'batch-or-stop-never-capability-downgrade'
80
+ || policy.bindingPolicy !== 'freeze-exact-provider-profile-model-and-registry-digests-after-selection'
81
+ || policy.unavailableOutcome !== 'REVIEW-BLOCKED') {
82
+ block('REVIEW_SELECTION_POLICY_INVALID', policyId)
83
+ }
84
+ const expectedRanking = [
85
+ 'assurance-tier-desc',
86
+ 'reasoning-tier-desc',
87
+ 'compute-tier-desc',
88
+ 'available-required-entitlement-route-first',
89
+ 'provider-local-capability-rank-desc',
90
+ 'provider-id-utf8-asc',
91
+ 'review-profile-id-utf8-asc',
92
+ 'model-release-id-utf8-asc',
93
+ ]
94
+ if (JSON.stringify(policy.ranking) !== JSON.stringify(expectedRanking)) {
95
+ block('REVIEW_SELECTION_POLICY_INVALID', `${policyId}:ranking`)
96
+ }
97
+ const eligibility = policy.eligibility
98
+ if (!eligibility || Object.values(eligibility).some((value) => value !== true)) {
99
+ block('REVIEW_SELECTION_POLICY_INVALID', `${policyId}:eligibility`)
100
+ }
101
+ const reviewClassPolicy = object(policy.reviewClasses?.[reviewClass], 'REVIEW_CLASS_UNAVAILABLE', `${policyId}/${reviewClass}`)
102
+ if (!REVIEW_TIERS.includes(reviewClassPolicy.assuranceTier)
103
+ || !REVIEW_TIERS.includes(reviewClassPolicy.reasoningTier)
104
+ || !REVIEW_TIERS.includes(reviewClassPolicy.computeTier)) {
105
+ block('REVIEW_CLASS_INVALID', `${policyId}/${reviewClass}`)
106
+ }
107
+ return { policy, reviewClassPolicy }
108
+ }
109
+
110
+ function reviewBinding(registry, skill, selfProviderId, authorProviderId) {
111
+ object(registry, 'REVIEW_REGISTRY_INVALID', 'provider registry')
112
+ if (!Array.isArray(registry.providers)) block('REVIEW_REGISTRY_INVALID', 'provider registry providers must be an array')
113
+ if (typeof skill !== 'string' || !/^[a-z][a-z0-9-]*$/.test(skill)) block('REVIEW_SKILL_INVALID', `review skill is invalid:${skill ?? '<missing>'}`)
114
+ const self = providerById(registry, selfProviderId, 'self')
115
+ if (authorProviderId !== self.id) block('REVIEW_AUTHOR_COLLISION', `author must equal the current provider:${authorProviderId ?? '<missing>'}/${self.id}`)
116
+ const binding = self.adapter?.skillBindings?.[skill]
117
+ if (!binding || typeof binding !== 'object' || Array.isArray(binding)) {
118
+ block('REVIEW_BINDING_UNAVAILABLE', `${self.id} has no binding for ${skill}`)
119
+ }
120
+ if (binding.self !== self.id) block('REVIEW_BINDING_INVALID', `${self.id}/${skill} self binding mismatches`)
121
+ if (Object.hasOwn(binding, 'peer')) block('REVIEW_FIXED_PEER_FORBIDDEN', `${self.id}/${skill}`)
122
+ if (!/^[a-z][a-z0-9-]*-v[1-9][0-9]*$/.test(binding.selectionPolicy ?? '')) {
123
+ block('REVIEW_SELECTION_POLICY_UNAVAILABLE', `${self.id}/${skill}`)
124
+ }
125
+ if (!/^[a-z][a-z0-9-]*$/.test(binding.reviewClass ?? '')) block('REVIEW_CLASS_INVALID', `${self.id}/${skill}`)
126
+ const { policy, reviewClassPolicy } = exactReviewPolicy(registry, binding.selectionPolicy, binding.reviewClass)
127
+ return { self, binding, policy, reviewClassPolicy }
128
+ }
129
+
130
+ function records(value, field, code, label) {
131
+ object(value, code, label)
132
+ if (!Array.isArray(value[field])) block(code, `${label}.${field} must be an array`)
133
+ return value[field]
134
+ }
135
+
136
+ function uniqueSortedById(items, code, label) {
137
+ const ids = items.map((item) => item?.id)
138
+ if (ids.some((id) => typeof id !== 'string')
139
+ || new Set(ids).size !== ids.length
140
+ || ids.some((id, index) => index > 0 && compareUtf8Bytes(ids[index - 1], id) >= 0)) {
141
+ block(code, `${label} must be unique and UTF-8 sorted by id`)
142
+ }
143
+ }
144
+
145
+ function tierRank(policy, axis, value, label) {
146
+ const order = policy[axis]
147
+ const rank = Array.isArray(order) ? order.indexOf(value) : -1
148
+ if (rank < 0) block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${label}:${value ?? '<missing>'}`)
149
+ return rank
150
+ }
151
+
152
+ function invocationProfileById(invocationRegistry, profileId) {
153
+ object(invocationRegistry, 'REVIEW_INVOCATION_REGISTRY_INVALID', 'model invocation profile registry')
154
+ const matches = [
155
+ ...(invocationRegistry.profiles?.[profileId] ? [invocationRegistry.profiles[profileId]] : []),
156
+ ...(invocationRegistry.externalEntitlementProfiles?.[profileId] ? [invocationRegistry.externalEntitlementProfiles[profileId]] : []),
157
+ ]
158
+ if (matches.length !== 1) block('REVIEW_INVOCATION_PROFILE_UNAVAILABLE', profileId)
159
+ return matches[0]
160
+ }
161
+
162
+ function modelReleaseById(modelReleaseRegistry, modelReleaseId) {
163
+ const releaseRecords = records(modelReleaseRegistry, 'records', 'REVIEW_MODEL_RELEASE_REGISTRY_INVALID', 'model release registry')
164
+ const matches = releaseRecords.filter((record) => record?.id === modelReleaseId)
165
+ if (matches.length !== 1) block('REVIEW_MODEL_RELEASE_UNAVAILABLE', modelReleaseId)
166
+ return matches[0]
167
+ }
168
+
169
+ function reviewProfileRecords(capabilityRegistry) {
170
+ if (capabilityRegistry?.schemaVersion !== 1
171
+ || capabilityRegistry?.kind !== 'provider-neutral-review-capability-registry'
172
+ || capabilityRegistry?.selectionSemantics !== 'exact-candidates-only-capability-values-require-separate-certification'
173
+ || !capabilityRegistry.providerCapabilityPrecedence
174
+ || typeof capabilityRegistry.providerCapabilityPrecedence !== 'object'
175
+ || Array.isArray(capabilityRegistry.providerCapabilityPrecedence)) {
176
+ block('REVIEW_CAPABILITY_REGISTRY_INVALID', 'review capability registry identity is invalid')
177
+ }
178
+ const profiles = records(capabilityRegistry, 'reviewProfiles', 'REVIEW_CAPABILITY_REGISTRY_INVALID', 'review capability registry')
179
+ if (profiles.length === 0) block('REVIEW_CAPABILITY_REGISTRY_INVALID', 'review capability registry is empty')
180
+ uniqueSortedById(profiles, 'REVIEW_CAPABILITY_REGISTRY_INVALID', 'review capability profiles')
181
+ return profiles
182
+ }
183
+
184
+ function providerCapabilityForProfile(capabilityRegistry, profile) {
185
+ const providerRows = capabilityRegistry.providerCapabilityPrecedence?.[profile.providerId]
186
+ if (!Array.isArray(providerRows) || providerRows.length === 0) {
187
+ block('REVIEW_CAPABILITY_REGISTRY_INVALID', `${profile.providerId} lacks provider-local capability precedence`)
188
+ }
189
+ const modelIds = new Set()
190
+ const ranks = new Set()
191
+ for (const row of providerRows) {
192
+ exactObjectKeys(row, [
193
+ 'modelReleaseId',
194
+ 'capabilityRank',
195
+ 'assuranceTier',
196
+ 'reasoningTier',
197
+ 'computeTier',
198
+ 'exchangeBudget',
199
+ ], 'REVIEW_CAPABILITY_REGISTRY_INVALID', `${profile.providerId} capability precedence`)
200
+ exactObjectKeys(row.exchangeBudget, [
201
+ 'maxInputBytes',
202
+ 'maxOutputBytes',
203
+ 'maxPayloadBytes',
204
+ ], 'REVIEW_CAPABILITY_REGISTRY_INVALID', `${row.modelReleaseId} exchange budget`)
205
+ if (!row.modelReleaseId.startsWith(`${profile.providerId}/`)
206
+ || modelIds.has(row.modelReleaseId)
207
+ || !Number.isSafeInteger(row.capabilityRank)
208
+ || row.capabilityRank <= 0
209
+ || ranks.has(row.capabilityRank)
210
+ || !REVIEW_TIERS.includes(row.assuranceTier)
211
+ || !REVIEW_TIERS.includes(row.reasoningTier)
212
+ || !REVIEW_TIERS.includes(row.computeTier)
213
+ || !Number.isSafeInteger(row.exchangeBudget.maxInputBytes)
214
+ || row.exchangeBudget.maxInputBytes <= 0
215
+ || !Number.isSafeInteger(row.exchangeBudget.maxOutputBytes)
216
+ || row.exchangeBudget.maxOutputBytes <= 0
217
+ || !Number.isSafeInteger(row.exchangeBudget.maxPayloadBytes)
218
+ || row.exchangeBudget.maxPayloadBytes
219
+ < row.exchangeBudget.maxInputBytes + row.exchangeBudget.maxOutputBytes) {
220
+ block('REVIEW_CAPABILITY_REGISTRY_INVALID', `${profile.providerId}/${row.modelReleaseId ?? '<missing>'}`)
221
+ }
222
+ modelIds.add(row.modelReleaseId)
223
+ ranks.add(row.capabilityRank)
224
+ }
225
+ const matches = providerRows.filter((row) => row.modelReleaseId === profile.modelReleaseId)
226
+ if (matches.length !== 1) {
227
+ block('REVIEW_CAPABILITY_REGISTRY_INVALID', `${profile.id} lacks one exact provider-local capability rank`)
228
+ }
229
+ return matches[0]
230
+ }
231
+
232
+ function capabilityCertificationRecords(certificationLedger) {
233
+ if (certificationLedger?.schemaVersion !== 1
234
+ || certificationLedger?.kind !== 'review-capability-certification-ledger') {
235
+ block('REVIEW_CAPABILITY_CERTIFICATION_LEDGER_INVALID', 'review capability certification ledger identity is invalid')
236
+ }
237
+ const certifications = records(
238
+ certificationLedger,
239
+ 'certifications',
240
+ 'REVIEW_CAPABILITY_CERTIFICATION_LEDGER_INVALID',
241
+ 'review capability certification ledger',
242
+ )
243
+ uniqueSortedById(certifications, 'REVIEW_CAPABILITY_CERTIFICATION_LEDGER_INVALID', 'review capability certifications')
244
+ return certifications
245
+ }
246
+
247
+ function validateExactReviewProfile({
248
+ profile,
249
+ registry,
250
+ invocationRegistry,
251
+ modelReleaseRegistry,
252
+ } = {}) {
253
+ object(profile, 'REVIEW_CAPABILITY_PROFILE_INVALID', 'review capability profile')
254
+ if (!REVIEW_PROFILE_ID.test(profile.id ?? '')
255
+ || !PROVIDER_ID.test(profile.providerId ?? '')
256
+ || !['managed-api', 'subscription-entitlement'].includes(profile.routeClass)
257
+ || !REVIEW_PROFILE_ID.test(profile.invocationProfileId ?? '')
258
+ || !/^[a-z][a-z0-9-]*\/[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(profile.modelReleaseId ?? '')
259
+ || typeof profile.requestModelId !== 'string'
260
+ || profile.modelIdentityPolicy !== 'exact-model-release-response-match-no-mutable-alias') {
261
+ block('REVIEW_CAPABILITY_PROFILE_INVALID', profile.id ?? '<missing>')
262
+ }
263
+ providerById(registry, profile.providerId, 'capability')
264
+ const release = modelReleaseById(modelReleaseRegistry, profile.modelReleaseId)
265
+ if (release.providerId !== profile.providerId
266
+ || release.requestModelId !== profile.requestModelId
267
+ || release.responseModelPolicy?.kind !== 'exact'
268
+ || release.responseModelPolicy.expectedModelId !== profile.requestModelId
269
+ || release.id !== `${profile.providerId}/${profile.requestModelId}`) {
270
+ block('REVIEW_MODEL_ALIAS_FORBIDDEN', profile.id)
271
+ }
272
+ const invocationProfile = invocationProfileById(invocationRegistry, profile.invocationProfileId)
273
+ if (invocationProfile.providerId !== profile.providerId
274
+ || !invocationProfile.modelIdentity?.allowedModelReleaseIds?.includes(profile.modelReleaseId)) {
275
+ block('REVIEW_INVOCATION_PROFILE_MISMATCH', profile.id)
276
+ }
277
+ if (profile.routeClass === 'subscription-entitlement') {
278
+ if (typeof profile.entitlementId !== 'string'
279
+ || invocationProfile.mode !== 'external-subscription-entitlement'
280
+ || invocationProfile.entitlementId !== profile.entitlementId
281
+ || invocationProfile.availabilityPolicy !== 'exact-certified-entitlement-readback-required'
282
+ || invocationProfile.runtimeCertification !== 'required-not-source-certified'
283
+ || invocationProfile.availabilityEvidence?.kind !== 'certified-runtime-evidence-assertion-v1'
284
+ || !PROVIDER_ID.test(invocationProfile.availabilityEvidence.compatibilityProviderId ?? '')
285
+ || invocationProfile.availabilityEvidence.runtimeProviderId !== profile.providerId
286
+ || invocationProfile.availabilityEvidence.runtimeProfileId !== profile.providerId
287
+ || !REVIEW_PROFILE_ID.test(invocationProfile.availabilityEvidence.runtimeKind ?? '')
288
+ || !REVIEW_PROFILE_ID.test(invocationProfile.availabilityEvidence.surface ?? '')
289
+ || !REVIEW_PROFILE_ID.test(invocationProfile.availabilityEvidence.repositoryRole ?? '')
290
+ || invocationProfile.availabilityEvidence.providerEvidenceId !== profile.providerId
291
+ || !REVIEW_PROFILE_ID.test(invocationProfile.availabilityEvidence.checkId ?? '')
292
+ || !REVIEW_PROFILE_ID.test(invocationProfile.availabilityEvidence.assertionId ?? '')
293
+ || invocationProfile.costFallbackPolicy !== 'forbidden'
294
+ || invocationProfile.responseSelector?.schemaVersion !== 1
295
+ || invocationProfile.responseSelector?.kind !== 'provider-review-result-response-selector'
296
+ || invocationProfile.responseSelector?.carrierShape !== 'content-addressed-provider-review-result-v1') {
297
+ block('REVIEW_ENTITLEMENT_PROFILE_INVALID', profile.id)
298
+ }
299
+ } else if (profile.entitlementId !== null || invocationProfile.mode !== 'broker-content-only') {
300
+ block('REVIEW_INVOCATION_PROFILE_MISMATCH', profile.id)
301
+ }
302
+ return { release, invocationProfile }
303
+ }
304
+
305
+ function activeCapabilityCertification(certifications, profile, policy, now) {
306
+ const matching = certifications.filter((record) => record?.reviewProfileId === profile.id)
307
+ const eligible = []
308
+ for (const certification of matching) {
309
+ if (!REVIEW_PROFILE_ID.test(certification.id ?? '')
310
+ || certification.reviewProfileDigest !== digest(profile)
311
+ || certification.providerId !== profile.providerId
312
+ || certification.modelReleaseId !== profile.modelReleaseId
313
+ || certification.entitlementId !== profile.entitlementId
314
+ || !['certified', 'expired', 'revoked'].includes(certification.status)
315
+ || !Number.isFinite(Date.parse(certification.certifiedAt ?? ''))
316
+ || !Number.isFinite(Date.parse(certification.expiresAt ?? ''))
317
+ || Date.parse(certification.expiresAt) <= Date.parse(certification.certifiedAt)
318
+ || !certification.evidence
319
+ || typeof certification.evidence.reference !== 'string'
320
+ || !SHA256.test(certification.evidence.sha256 ?? '')) {
321
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${profile.id}/${certification?.id ?? '<missing>'}`)
322
+ }
323
+ tierRank(policy, 'assuranceTierOrder', certification.assuranceTier, `${certification.id}/assuranceTier`)
324
+ tierRank(policy, 'reasoningTierOrder', certification.reasoningTier, `${certification.id}/reasoningTier`)
325
+ tierRank(policy, 'computeTierOrder', certification.computeTier, `${certification.id}/computeTier`)
326
+ if (certification.status === 'certified'
327
+ && Date.parse(certification.certifiedAt) <= now.getTime()
328
+ && Date.parse(certification.expiresAt) > now.getTime()) eligible.push(certification)
329
+ }
330
+ if (eligible.length > 1) block('REVIEW_CAPABILITY_CERTIFICATION_AMBIGUOUS', profile.id)
331
+ return eligible[0] ?? null
332
+ }
333
+
334
+ function selectionReceiptDigest(receipt) {
335
+ const { selectionDigest: ignored, ...content } = receipt
336
+ return digest(content)
337
+ }
338
+
339
+ function entitlementAvailabilityKey(record) {
340
+ return `${record?.providerId ?? ''}/${record?.invocationProfileId ?? ''}/${record?.entitlementId ?? ''}`
341
+ }
342
+
343
+ function exactObjectKeys(value, expected, code, label) {
344
+ object(value, code, label)
345
+ const actual = Object.keys(value).sort(compareUtf8Bytes)
346
+ const normalizedExpected = [...expected].sort(compareUtf8Bytes)
347
+ if (actual.length !== normalizedExpected.length
348
+ || actual.some((key, index) => key !== normalizedExpected[index])) {
349
+ block(code, `${label} has an invalid or open shape`)
350
+ }
351
+ }
352
+
353
+ function runtimeEvidenceUnsigned(evidence) {
354
+ const { attestation: ignoredAttestation, evidenceDigest: ignoredDigest, ...unsigned } = evidence
355
+ return unsigned
356
+ }
357
+
358
+ function evidenceBytes(value) {
359
+ if (Buffer.isBuffer(value)) return Buffer.from(value)
360
+ if (value instanceof Uint8Array) return Buffer.from(value)
361
+ if (typeof value === 'string') return Buffer.from(value, 'utf8')
362
+ block('REVIEW_ENTITLEMENT_EVIDENCE_INVALID', 'runtime evidence bytes are missing or invalid')
363
+ }
364
+
365
+ function contentSha256(bytes) {
366
+ return createHash('sha256').update(bytes).digest('hex')
367
+ }
368
+
369
+ function freezeEntitlementRecord(record, invocationProfile) {
370
+ Object.freeze(record.target)
371
+ Object.freeze(record.evidence)
372
+ Object.freeze(record)
373
+ VERIFIED_ENTITLEMENT_AVAILABILITY.set(record, Object.freeze({
374
+ invocationProfileDigest: digest(invocationProfile),
375
+ }))
376
+ return record
377
+ }
378
+
379
+ /**
380
+ * Mint the only entitlement-availability value accepted by capability selection.
381
+ *
382
+ * The token is derived from an existing exact runtime certification and the exact
383
+ * content-addressed runtime evidence bytes named by that certification. No caller
384
+ * supplied availability boolean, hash-only record, or serialized receipt can mint
385
+ * the private in-process capability.
386
+ */
387
+ export function verifyEntitlementAvailabilityEvidence({
388
+ invocationRegistry,
389
+ invocationProfileId,
390
+ certificationLedger,
391
+ target,
392
+ expectedGitTree = null,
393
+ runtimeEvidenceBytes,
394
+ now = new Date(),
395
+ } = {}) {
396
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
397
+ block('REVIEW_TIME_INVALID', 'entitlement evidence verification clock is invalid')
398
+ }
399
+ const invocationProfile = invocationProfileById(invocationRegistry, invocationProfileId)
400
+ const binding = object(
401
+ invocationProfile.availabilityEvidence,
402
+ 'REVIEW_ENTITLEMENT_EVIDENCE_INVALID',
403
+ `${invocationProfileId} availability evidence binding`,
404
+ )
405
+ exactObjectKeys(binding, [
406
+ 'kind',
407
+ 'compatibilityProviderId',
408
+ 'runtimeProviderId',
409
+ 'runtimeProfileId',
410
+ 'runtimeKind',
411
+ 'surface',
412
+ 'repositoryRole',
413
+ 'providerEvidenceId',
414
+ 'checkId',
415
+ 'assertionId',
416
+ ], 'REVIEW_ENTITLEMENT_EVIDENCE_INVALID', `${invocationProfileId} availability evidence binding`)
417
+ if (invocationProfile.mode !== 'external-subscription-entitlement'
418
+ || invocationProfile.availabilityPolicy !== 'exact-certified-entitlement-readback-required'
419
+ || binding.kind !== 'certified-runtime-evidence-assertion-v1'
420
+ || binding.runtimeProviderId !== invocationProfile.providerId
421
+ || binding.runtimeProfileId !== invocationProfile.providerId
422
+ || binding.providerEvidenceId !== invocationProfile.providerId) {
423
+ block('REVIEW_ENTITLEMENT_EVIDENCE_INVALID', `${invocationProfileId} is not an exact entitlement readback profile`)
424
+ }
425
+ if (certificationLedger?.schemaVersion !== 2
426
+ || certificationLedger?.$schema !== '../schemas/provider-surface-certification.schema.json') {
427
+ block('REVIEW_ENTITLEMENT_CERTIFICATION_UNTRUSTED', 'entitlement readback requires the promoted canonical provider certification ledger')
428
+ }
429
+ const certification = verifyExactProviderCertification({
430
+ certificationLedger,
431
+ compatibilityProviderId: binding.compatibilityProviderId,
432
+ runtimeProviderId: binding.runtimeProviderId,
433
+ runtimeProfileId: binding.runtimeProfileId,
434
+ runtimeKind: binding.runtimeKind,
435
+ surface: binding.surface,
436
+ repositoryRole: binding.repositoryRole,
437
+ target,
438
+ expectedGitTree,
439
+ now,
440
+ requireEvidence: true,
441
+ })
442
+ const bytes = evidenceBytes(runtimeEvidenceBytes)
443
+ const artifactSha256 = contentSha256(bytes)
444
+ const certifiedEvidence = object(
445
+ certification.evidence,
446
+ 'REVIEW_ENTITLEMENT_EVIDENCE_INVALID',
447
+ `${certification.certificationId} runtime evidence binding`,
448
+ )
449
+ if (certifiedEvidence.artifactSha256 !== artifactSha256
450
+ || certifiedEvidence.reference !== `infra/governance/evidence/provider-runtime/${artifactSha256}.json`) {
451
+ block('REVIEW_ENTITLEMENT_EVIDENCE_CONTENT_MISMATCH', `${certification.certificationId}/${invocationProfileId}`)
452
+ }
453
+ let evidence
454
+ try {
455
+ evidence = JSON.parse(bytes.toString('utf8'))
456
+ } catch {
457
+ block('REVIEW_ENTITLEMENT_EVIDENCE_INVALID', `${certification.certificationId} runtime evidence is not JSON`)
458
+ }
459
+ // Trust is inherited from the promoted exact certification record above. The
460
+ // embedded attestation status remains a required consistency assertion, but
461
+ // is never accepted without that canonical certification/content binding.
462
+ if (evidence?.schemaVersion !== 4
463
+ || evidence.kind !== 'provider-runtime-conformance'
464
+ || evidence.scope !== 'provider'
465
+ || evidence.status !== 'pass'
466
+ || evidence.attestation?.status !== 'verified'
467
+ || evidence.evidenceDigest !== certifiedEvidence.evidenceDigest
468
+ || evidence.evidenceDigest !== `sha256:${digest(runtimeEvidenceUnsigned(evidence))}`
469
+ || evidence.subject?.gitTree !== (expectedGitTree ?? evidence.subject?.gitTree)) {
470
+ block('REVIEW_ENTITLEMENT_EVIDENCE_UNTRUSTED', `${certification.certificationId}/${invocationProfileId}`)
471
+ }
472
+ const observedAt = evidence.run?.generatedAt
473
+ const evidenceExpiresAt = evidence.run?.validUntil
474
+ if (!Number.isFinite(Date.parse(observedAt ?? ''))
475
+ || !Number.isFinite(Date.parse(evidenceExpiresAt ?? ''))
476
+ || Date.parse(evidenceExpiresAt) <= Date.parse(observedAt)
477
+ || Date.parse(observedAt) > now.getTime()
478
+ || Date.parse(evidenceExpiresAt) <= now.getTime()) {
479
+ block('REVIEW_ENTITLEMENT_UNAVAILABLE', `${invocationProfile.providerId}/${invocationProfileId}/${invocationProfile.entitlementId}`)
480
+ }
481
+ const providerMatches = (evidence.providers || []).filter((provider) => provider?.id === binding.providerEvidenceId)
482
+ if (providerMatches.length !== 1
483
+ || providerMatches[0].status !== 'pass'
484
+ || providerMatches[0].targetBinding?.id !== certification.target.id) {
485
+ block('REVIEW_ENTITLEMENT_EVIDENCE_TARGET_MISMATCH', `${certification.certificationId}/${certification.target.id}`)
486
+ }
487
+ if (certifiedEvidence.targetId !== certification.target.id
488
+ || certifiedEvidence.providerId !== binding.runtimeProfileId
489
+ || (certifiedEvidence.targetDigest !== undefined
490
+ && certifiedEvidence.targetDigest !== providerMatches[0].targetBinding?.digest)) {
491
+ block('REVIEW_ENTITLEMENT_EVIDENCE_TARGET_MISMATCH', `${certification.certificationId}/${certification.target.id}`)
492
+ }
493
+ const checkMatches = (providerMatches[0].checks || []).filter((check) => check?.id === binding.checkId)
494
+ const assertionMatches = checkMatches.length === 1
495
+ ? (checkMatches[0].result?.assertions || []).filter((assertion) => assertion?.id === binding.assertionId)
496
+ : []
497
+ if (checkMatches.length !== 1
498
+ || checkMatches[0].certificationImpact !== 'capability-only'
499
+ || checkMatches[0].status !== 'pass'
500
+ || assertionMatches.length !== 1
501
+ || assertionMatches[0].pass !== true) {
502
+ block('REVIEW_ENTITLEMENT_READBACK_REJECTED', `${invocationProfile.providerId}/${invocationProfileId}/${invocationProfile.entitlementId}`)
503
+ }
504
+ const expiresAt = new Date(Math.min(
505
+ Date.parse(evidenceExpiresAt),
506
+ Date.parse(certification.expiresAt),
507
+ )).toISOString()
508
+ if (Date.parse(expiresAt) <= now.getTime()) {
509
+ block('REVIEW_ENTITLEMENT_UNAVAILABLE', `${invocationProfile.providerId}/${invocationProfileId}/${invocationProfile.entitlementId}`)
510
+ }
511
+ const readback = {
512
+ providerId: invocationProfile.providerId,
513
+ invocationProfileId,
514
+ entitlementId: invocationProfile.entitlementId,
515
+ source: 'verified-provider-adapter-readback',
516
+ status: 'available',
517
+ observedAt,
518
+ expiresAt,
519
+ runtimeProviderId: binding.runtimeProviderId,
520
+ runtimeProfileId: binding.runtimeProfileId,
521
+ runtimeKind: binding.runtimeKind,
522
+ runtimeSurface: binding.surface,
523
+ repositoryRole: binding.repositoryRole,
524
+ target: certification.target,
525
+ targetDigest: certification.targetDigest,
526
+ runtimeCertificationId: certification.certificationId,
527
+ runtimeCertificationDigest: certification.recordDigest,
528
+ runtimeEvidenceDigest: evidence.evidenceDigest,
529
+ evidence: {
530
+ reference: certifiedEvidence.reference,
531
+ sha256: artifactSha256,
532
+ },
533
+ }
534
+ const record = {
535
+ ...readback,
536
+ adapterReadbackDigest: digest(readback),
537
+ }
538
+ return freezeEntitlementRecord(record, invocationProfile)
539
+ }
540
+
541
+ function validateEntitlementAvailability(value, {
542
+ code = 'REVIEW_ENTITLEMENT_AVAILABILITY_INVALID',
543
+ now = null,
544
+ requireVerified = true,
545
+ invocationRegistry = null,
546
+ } = {}) {
547
+ if (!Array.isArray(value)) block(code, 'entitlement availability must be an array')
548
+ const keys = value.map(entitlementAvailabilityKey)
549
+ if (new Set(keys).size !== keys.length
550
+ || keys.some((key, index) => index > 0 && compareUtf8Bytes(keys[index - 1], key) >= 0)) {
551
+ block(code, 'entitlement availability must be unique and UTF-8 sorted')
552
+ }
553
+ for (const record of value) {
554
+ exactObjectKeys(record, [
555
+ 'providerId',
556
+ 'invocationProfileId',
557
+ 'entitlementId',
558
+ 'source',
559
+ 'status',
560
+ 'observedAt',
561
+ 'expiresAt',
562
+ 'runtimeProviderId',
563
+ 'runtimeProfileId',
564
+ 'runtimeKind',
565
+ 'runtimeSurface',
566
+ 'repositoryRole',
567
+ 'target',
568
+ 'targetDigest',
569
+ 'runtimeCertificationId',
570
+ 'runtimeCertificationDigest',
571
+ 'runtimeEvidenceDigest',
572
+ 'adapterReadbackDigest',
573
+ 'evidence',
574
+ ], code, `entitlement availability ${entitlementAvailabilityKey(record)}`)
575
+ exactObjectKeys(record.evidence, ['reference', 'sha256'], code, `entitlement availability evidence ${entitlementAvailabilityKey(record)}`)
576
+ if (!PROVIDER_ID.test(record?.providerId ?? '')
577
+ || !REVIEW_PROFILE_ID.test(record?.invocationProfileId ?? '')
578
+ || !/^[a-z][a-z0-9-]*$/.test(record?.entitlementId ?? '')
579
+ || record.source !== 'verified-provider-adapter-readback'
580
+ || record.status !== 'available'
581
+ || !Number.isFinite(Date.parse(record.observedAt ?? ''))
582
+ || !Number.isFinite(Date.parse(record.expiresAt ?? ''))
583
+ || Date.parse(record.expiresAt) <= Date.parse(record.observedAt)
584
+ || !PROVIDER_ID.test(record.runtimeProviderId ?? '')
585
+ || !REVIEW_PROFILE_ID.test(record.runtimeProfileId ?? '')
586
+ || !REVIEW_PROFILE_ID.test(record.runtimeKind ?? '')
587
+ || !REVIEW_PROFILE_ID.test(record.runtimeSurface ?? '')
588
+ || !REVIEW_PROFILE_ID.test(record.repositoryRole ?? '')
589
+ || !REVIEW_PROFILE_ID.test(record.runtimeCertificationId ?? '')
590
+ || digest(reviewTargetIdentity(record.target)) !== record.targetDigest
591
+ || !SHA256.test(record.runtimeCertificationDigest ?? '')
592
+ || !/^sha256:[a-f0-9]{64}$/.test(record.runtimeEvidenceDigest ?? '')
593
+ || !SHA256.test(record.adapterReadbackDigest ?? '')
594
+ || !record.evidence
595
+ || record.evidence.reference !== `infra/governance/evidence/provider-runtime/${record.evidence.sha256}.json`
596
+ || !SHA256.test(record.evidence.sha256 ?? '')
597
+ || record.adapterReadbackDigest !== digest(Object.fromEntries(
598
+ Object.entries(record).filter(([key]) => key !== 'adapterReadbackDigest'),
599
+ ))
600
+ || (requireVerified && !VERIFIED_ENTITLEMENT_AVAILABILITY.has(record))) {
601
+ block(code, entitlementAvailabilityKey(record))
602
+ }
603
+ if (requireVerified) {
604
+ const currentProfile = invocationProfileById(invocationRegistry, record.invocationProfileId)
605
+ if (VERIFIED_ENTITLEMENT_AVAILABILITY.get(record)?.invocationProfileDigest !== digest(currentProfile)) {
606
+ block(code, `${entitlementAvailabilityKey(record)}:invocation profile authority is stale`)
607
+ }
608
+ }
609
+ if (now && (Date.parse(record.observedAt) > now.getTime()
610
+ || Date.parse(record.expiresAt) <= now.getTime())) {
611
+ block('REVIEW_ENTITLEMENT_UNAVAILABLE', entitlementAvailabilityKey(record))
612
+ }
613
+ }
614
+ return value
615
+ }
616
+
617
+ export function validateBlockedReviewCapabilitySelectionReceipt(receipt) {
618
+ object(receipt, 'REVIEW_SELECTION_RECEIPT_INVALID', 'blocked review capability selection receipt')
619
+ if (receipt.schemaVersion !== 1
620
+ || receipt.kind !== 'provider-review-capability-selection-blocked'
621
+ || receipt.selectionStatus !== 'REVIEW-BLOCKED'
622
+ || !['REVIEW_CAPABILITY_UNAVAILABLE', 'REVIEW_ENTITLEMENT_UNAVAILABLE'].includes(receipt.selectionReasonCode)
623
+ || !PROVIDER_ID.test(receipt.authorProviderId ?? '')
624
+ || receipt.selfProviderId !== receipt.authorProviderId
625
+ || !/^[a-z][a-z0-9-]*$/.test(receipt.skill ?? '')
626
+ || !/^[a-z][a-z0-9-]*-v[1-9][0-9]*$/.test(receipt.selectionPolicy ?? '')
627
+ || !/^[a-z][a-z0-9-]*$/.test(receipt.reviewClass ?? '')
628
+ || !REVIEW_TIERS.includes(receipt.requiredAssuranceTier)
629
+ || !REVIEW_TIERS.includes(receipt.requiredReasoningTier)
630
+ || !REVIEW_TIERS.includes(receipt.requiredComputeTier)
631
+ || (receipt.requiredEntitlementId !== null
632
+ && !/^[a-z][a-z0-9-]*$/.test(receipt.requiredEntitlementId ?? ''))
633
+ || !SHA256.test(receipt.bindingDigest ?? '')
634
+ || !SHA256.test(receipt.selectionPolicyDigest ?? '')
635
+ || !SHA256.test(receipt.providerRegistryDigest ?? '')
636
+ || !SHA256.test(receipt.capabilityRegistryDigest ?? '')
637
+ || !SHA256.test(receipt.capabilityCertificationLedgerDigest ?? '')
638
+ || !SHA256.test(receipt.invocationRegistryDigest ?? '')
639
+ || !SHA256.test(receipt.modelReleaseRegistryDigest ?? '')
640
+ || !SHA256.test(receipt.entitlementAvailabilityDigest ?? '')
641
+ || receipt.entitlementAvailabilityDigest !== digest(receipt.entitlementAvailability)
642
+ || !SHA256.test(receipt.selectionDigest ?? '')
643
+ || receipt.selectionDigest !== selectionReceiptDigest(receipt)) {
644
+ block('REVIEW_SELECTION_RECEIPT_INVALID', 'blocked selection receipt identity, shape, or digest mismatches')
645
+ }
646
+ validateEntitlementAvailability(receipt.entitlementAvailability, {
647
+ code: 'REVIEW_SELECTION_RECEIPT_INVALID',
648
+ requireVerified: false,
649
+ })
650
+ return true
651
+ }
652
+
653
+ export function validateReviewCapabilitySelectionReceipt(receipt) {
654
+ object(receipt, 'REVIEW_SELECTION_RECEIPT_INVALID', 'review capability selection receipt')
655
+ if (receipt.schemaVersion !== 1
656
+ || receipt.kind !== 'provider-review-capability-selection'
657
+ || !PROVIDER_ID.test(receipt.authorProviderId ?? '')
658
+ || receipt.selfProviderId !== receipt.authorProviderId
659
+ || !/^[a-z][a-z0-9-]*$/.test(receipt.skill ?? '')
660
+ || !/^[a-z][a-z0-9-]*-v[1-9][0-9]*$/.test(receipt.selectionPolicy ?? '')
661
+ || !/^[a-z][a-z0-9-]*$/.test(receipt.reviewClass ?? '')
662
+ || !REVIEW_TIERS.includes(receipt.requiredAssuranceTier)
663
+ || !REVIEW_TIERS.includes(receipt.requiredReasoningTier)
664
+ || !REVIEW_TIERS.includes(receipt.requiredComputeTier)
665
+ || !receipt.selected
666
+ || !PROVIDER_ID.test(receipt.selected.providerId ?? '')
667
+ || receipt.selected.providerId === receipt.authorProviderId
668
+ || !REVIEW_PROFILE_ID.test(receipt.selected.reviewProfileId ?? '')
669
+ || !REVIEW_PROFILE_ID.test(receipt.selected.invocationProfileId ?? '')
670
+ || !['managed-api', 'subscription-entitlement'].includes(receipt.selected.routeClass)
671
+ || !/^[a-z][a-z0-9-]*\/[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(receipt.selected.modelReleaseId ?? '')
672
+ || typeof receipt.selected.requestModelId !== 'string'
673
+ || !REVIEW_TIERS.includes(receipt.selected.assuranceTier)
674
+ || !REVIEW_TIERS.includes(receipt.selected.reasoningTier)
675
+ || !REVIEW_TIERS.includes(receipt.selected.computeTier)
676
+ || !REVIEW_PROFILE_ID.test(receipt.selected.capabilityCertificationId ?? '')
677
+ || !Number.isFinite(Date.parse(receipt.selected.capabilityCertificationExpiresAt ?? ''))
678
+ || !SHA256.test(receipt.selected.capabilityEvidenceDigest ?? '')
679
+ || !SHA256.test(receipt.bindingDigest ?? '')
680
+ || !SHA256.test(receipt.selectionPolicyDigest ?? '')
681
+ || !SHA256.test(receipt.providerRegistryDigest ?? '')
682
+ || !SHA256.test(receipt.capabilityRegistryDigest ?? '')
683
+ || !SHA256.test(receipt.capabilityCertificationLedgerDigest ?? '')
684
+ || !SHA256.test(receipt.invocationRegistryDigest ?? '')
685
+ || !SHA256.test(receipt.modelReleaseRegistryDigest ?? '')
686
+ || !SHA256.test(receipt.selectedProviderRecordDigest ?? '')
687
+ || !SHA256.test(receipt.selectedProfileDigest ?? '')
688
+ || !SHA256.test(receipt.selectedInvocationProfileDigest ?? '')
689
+ || !SHA256.test(receipt.selectedModelReleaseDigest ?? '')
690
+ || !SHA256.test(receipt.selectedCapabilityCertificationDigest ?? '')
691
+ || !SHA256.test(receipt.entitlementAvailabilityDigest ?? '')
692
+ || receipt.entitlementAvailabilityDigest !== digest(receipt.entitlementAvailability)
693
+ || !SHA256.test(receipt.selectionDigest ?? '')
694
+ || receipt.selectionDigest !== selectionReceiptDigest(receipt)) {
695
+ block('REVIEW_SELECTION_RECEIPT_INVALID', 'selection receipt identity, shape, or digest mismatches')
696
+ }
697
+ validateEntitlementAvailability(receipt.entitlementAvailability, {
698
+ code: 'REVIEW_SELECTION_RECEIPT_INVALID',
699
+ requireVerified: false,
700
+ })
701
+ if (receipt.selected.routeClass === 'subscription-entitlement') {
702
+ if (typeof receipt.selected.entitlementId !== 'string'
703
+ || !receipt.entitlementAvailability.some((record) => (
704
+ record.providerId === receipt.selected.providerId
705
+ && record.invocationProfileId === receipt.selected.invocationProfileId
706
+ && record.entitlementId === receipt.selected.entitlementId
707
+ ))
708
+ || (receipt.requiredEntitlementId !== null
709
+ && receipt.requiredEntitlementId !== receipt.selected.entitlementId)) {
710
+ block('REVIEW_SELECTION_RECEIPT_INVALID', 'subscription entitlement binding mismatches')
711
+ }
712
+ } else if (receipt.selected.entitlementId !== null || receipt.requiredEntitlementId !== null) {
713
+ block('REVIEW_SELECTION_RECEIPT_INVALID', 'managed API selection cannot claim an entitlement')
714
+ }
715
+ return true
716
+ }
717
+
718
+ export function resolveHighestCertifiedReviewCapability({
719
+ registry,
720
+ capabilityRegistry,
721
+ capabilityCertificationLedger,
722
+ invocationRegistry,
723
+ modelReleaseRegistry,
724
+ skill,
725
+ selfProviderId,
726
+ authorProviderId = selfProviderId,
727
+ requiredEntitlementId = null,
728
+ entitlementAvailability = [],
729
+ expectedPeerProviderId = null,
730
+ expectedReviewProfileId = null,
731
+ expectedModelReleaseId = null,
732
+ now = new Date(),
733
+ } = {}) {
734
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) block('REVIEW_TIME_INVALID', 'capability selection clock is invalid')
735
+ const { self, binding, policy, reviewClassPolicy } = reviewBinding(registry, skill, selfProviderId, authorProviderId)
736
+ if (requiredEntitlementId !== null && !/^[a-z][a-z0-9-]*$/.test(requiredEntitlementId)) {
737
+ block('REVIEW_ENTITLEMENT_INVALID', requiredEntitlementId ?? '<missing>')
738
+ }
739
+ validateEntitlementAvailability(entitlementAvailability, { now, invocationRegistry })
740
+ if (requiredEntitlementId !== null
741
+ && !entitlementAvailability.some((record) => record.entitlementId === requiredEntitlementId)) {
742
+ block('REVIEW_ENTITLEMENT_UNAVAILABLE', requiredEntitlementId)
743
+ }
744
+ const profiles = reviewProfileRecords(capabilityRegistry)
745
+ const certifications = capabilityCertificationRecords(capabilityCertificationLedger)
746
+ const candidates = []
747
+ for (const profile of profiles) {
748
+ const { release, invocationProfile } = validateExactReviewProfile({
749
+ profile,
750
+ registry,
751
+ invocationRegistry,
752
+ modelReleaseRegistry,
753
+ })
754
+ if (profile.providerId === self.id || profile.providerId === authorProviderId) continue
755
+ if (profile.routeClass === 'subscription-entitlement'
756
+ && !entitlementAvailability.some((record) => (
757
+ record.providerId === profile.providerId
758
+ && record.invocationProfileId === profile.invocationProfileId
759
+ && record.entitlementId === profile.entitlementId
760
+ ))) continue
761
+ if (requiredEntitlementId !== null && profile.entitlementId !== requiredEntitlementId) continue
762
+ const certification = activeCapabilityCertification(certifications, profile, policy, now)
763
+ if (!certification) continue
764
+ const providerCapability = providerCapabilityForProfile(capabilityRegistry, profile)
765
+ const requiredAssuranceRank = tierRank(
766
+ policy,
767
+ 'assuranceTierOrder',
768
+ reviewClassPolicy.assuranceTier,
769
+ `${binding.reviewClass}/assuranceTier`,
770
+ )
771
+ const requiredReasoningRank = tierRank(
772
+ policy,
773
+ 'reasoningTierOrder',
774
+ reviewClassPolicy.reasoningTier,
775
+ `${binding.reviewClass}/reasoningTier`,
776
+ )
777
+ const requiredComputeRank = tierRank(
778
+ policy,
779
+ 'computeTierOrder',
780
+ reviewClassPolicy.computeTier,
781
+ `${binding.reviewClass}/computeTier`,
782
+ )
783
+ const assuranceRank = tierRank(policy, 'assuranceTierOrder', certification.assuranceTier, `${certification.id}/assuranceTier`)
784
+ const reasoningRank = tierRank(policy, 'reasoningTierOrder', certification.reasoningTier, `${certification.id}/reasoningTier`)
785
+ const computeRank = tierRank(policy, 'computeTierOrder', certification.computeTier, `${certification.id}/computeTier`)
786
+ if (assuranceRank < requiredAssuranceRank
787
+ || reasoningRank < requiredReasoningRank
788
+ || computeRank < requiredComputeRank) continue
789
+ candidates.push({
790
+ profile,
791
+ release,
792
+ invocationProfile,
793
+ certification,
794
+ assuranceRank,
795
+ reasoningRank,
796
+ computeRank,
797
+ providerCapabilityRank: providerCapability.capabilityRank,
798
+ availableRequiredEntitlementRoute: profile.routeClass === 'subscription-entitlement' ? 1 : 0,
799
+ })
800
+ }
801
+ candidates.sort((left, right) => (
802
+ right.assuranceRank - left.assuranceRank
803
+ || right.reasoningRank - left.reasoningRank
804
+ || right.computeRank - left.computeRank
805
+ || right.availableRequiredEntitlementRoute - left.availableRequiredEntitlementRoute
806
+ || right.providerCapabilityRank - left.providerCapabilityRank
807
+ || compareUtf8Bytes(left.profile.providerId, right.profile.providerId)
808
+ || compareUtf8Bytes(left.profile.id, right.profile.id)
809
+ || compareUtf8Bytes(left.profile.modelReleaseId, right.profile.modelReleaseId)
810
+ ))
811
+ if (candidates.length === 0) {
812
+ block('REVIEW_CAPABILITY_UNAVAILABLE', `${self.id}/${skill}/${binding.reviewClass}/${requiredEntitlementId ?? 'any-entitlement'}`)
813
+ }
814
+ const selected = candidates[0]
815
+ if (expectedPeerProviderId !== null && selected.profile.providerId !== expectedPeerProviderId) {
816
+ block('REVIEW_PEER_MISMATCH', `${selected.profile.providerId}, not ${expectedPeerProviderId}`)
817
+ }
818
+ if (expectedReviewProfileId !== null && selected.profile.id !== expectedReviewProfileId) {
819
+ block('REVIEW_PROFILE_MISMATCH', `${selected.profile.id}, not ${expectedReviewProfileId}`)
820
+ }
821
+ if (expectedModelReleaseId !== null && selected.profile.modelReleaseId !== expectedModelReleaseId) {
822
+ block('REVIEW_MODEL_RELEASE_MISMATCH', `${selected.profile.modelReleaseId}, not ${expectedModelReleaseId}`)
823
+ }
824
+ const peer = providerById(registry, selected.profile.providerId, 'peer')
825
+ const bindingDigest = digest({
826
+ skill,
827
+ self: self.id,
828
+ selectionPolicy: binding.selectionPolicy,
829
+ reviewClass: binding.reviewClass,
830
+ binding,
831
+ })
832
+ const receipt = {
833
+ schemaVersion: 1,
834
+ kind: 'provider-review-capability-selection',
835
+ skill,
836
+ authorProviderId,
837
+ selfProviderId: self.id,
838
+ selectionPolicy: binding.selectionPolicy,
839
+ reviewClass: binding.reviewClass,
840
+ requiredAssuranceTier: reviewClassPolicy.assuranceTier,
841
+ requiredReasoningTier: reviewClassPolicy.reasoningTier,
842
+ requiredComputeTier: reviewClassPolicy.computeTier,
843
+ requiredEntitlementId,
844
+ entitlementAvailability,
845
+ entitlementAvailabilityDigest: digest(entitlementAvailability),
846
+ selected: {
847
+ providerId: peer.id,
848
+ reviewProfileId: selected.profile.id,
849
+ invocationProfileId: selected.profile.invocationProfileId,
850
+ routeClass: selected.profile.routeClass,
851
+ entitlementId: selected.profile.entitlementId,
852
+ modelReleaseId: selected.profile.modelReleaseId,
853
+ requestModelId: selected.profile.requestModelId,
854
+ assuranceTier: selected.certification.assuranceTier,
855
+ reasoningTier: selected.certification.reasoningTier,
856
+ computeTier: selected.certification.computeTier,
857
+ capabilityCertificationId: selected.certification.id,
858
+ capabilityCertificationExpiresAt: selected.certification.expiresAt,
859
+ capabilityEvidenceDigest: selected.certification.evidence.sha256,
860
+ },
861
+ bindingDigest,
862
+ selectionPolicyDigest: digest(policy),
863
+ providerRegistryDigest: digest(registry),
864
+ capabilityRegistryDigest: digest(capabilityRegistry),
865
+ capabilityCertificationLedgerDigest: digest(capabilityCertificationLedger),
866
+ invocationRegistryDigest: digest(invocationRegistry),
867
+ modelReleaseRegistryDigest: digest(modelReleaseRegistry),
868
+ selectedProviderRecordDigest: digest(peer),
869
+ selectedProfileDigest: digest(selected.profile),
870
+ selectedInvocationProfileDigest: digest(selected.invocationProfile),
871
+ selectedModelReleaseDigest: digest(selected.release),
872
+ selectedCapabilityCertificationDigest: digest(selected.certification),
873
+ }
874
+ receipt.selectionDigest = selectionReceiptDigest(receipt)
875
+ validateReviewCapabilitySelectionReceipt(receipt)
876
+ return {
877
+ skill,
878
+ self,
879
+ peer,
880
+ transport: binding.transport,
881
+ invocation: binding.invocation ?? null,
882
+ certificationContract: binding.certificationContract ?? null,
883
+ binding,
884
+ bindingDigest,
885
+ policy,
886
+ reviewClassPolicy,
887
+ selectedProfile: selected.profile,
888
+ selectedCapabilityCertification: selected.certification,
889
+ selectionReceipt: receipt,
890
+ }
891
+ }
892
+
893
+ function blockedCapabilitySelection({
894
+ registry,
895
+ capabilityRegistry,
896
+ capabilityCertificationLedger,
897
+ invocationRegistry,
898
+ modelReleaseRegistry,
899
+ skill,
900
+ self,
901
+ binding,
902
+ policy,
903
+ reviewClassPolicy,
904
+ requiredEntitlementId,
905
+ entitlementAvailability,
906
+ selectionReasonCode,
907
+ } = {}) {
908
+ const bindingDigest = digest({
909
+ skill,
910
+ self: self.id,
911
+ selectionPolicy: binding.selectionPolicy,
912
+ reviewClass: binding.reviewClass,
913
+ binding,
914
+ })
915
+ const receipt = {
916
+ schemaVersion: 1,
917
+ kind: 'provider-review-capability-selection-blocked',
918
+ selectionStatus: 'REVIEW-BLOCKED',
919
+ selectionReasonCode,
920
+ skill,
921
+ authorProviderId: self.id,
922
+ selfProviderId: self.id,
923
+ selectionPolicy: binding.selectionPolicy,
924
+ reviewClass: binding.reviewClass,
925
+ requiredAssuranceTier: reviewClassPolicy.assuranceTier,
926
+ requiredReasoningTier: reviewClassPolicy.reasoningTier,
927
+ requiredComputeTier: reviewClassPolicy.computeTier,
928
+ requiredEntitlementId,
929
+ entitlementAvailability,
930
+ entitlementAvailabilityDigest: digest(entitlementAvailability),
931
+ bindingDigest,
932
+ selectionPolicyDigest: digest(policy),
933
+ providerRegistryDigest: digest(registry),
934
+ capabilityRegistryDigest: digest(capabilityRegistry),
935
+ capabilityCertificationLedgerDigest: digest(capabilityCertificationLedger),
936
+ invocationRegistryDigest: digest(invocationRegistry),
937
+ modelReleaseRegistryDigest: digest(modelReleaseRegistry),
938
+ }
939
+ receipt.selectionDigest = selectionReceiptDigest(receipt)
940
+ validateBlockedReviewCapabilitySelectionReceipt(receipt)
941
+ return receipt
942
+ }
943
+
944
+ export function verifyReviewCapabilitySelection({
945
+ receipt,
946
+ registry,
947
+ capabilityRegistry,
948
+ capabilityCertificationLedger,
949
+ invocationRegistry,
950
+ modelReleaseRegistry,
951
+ skill,
952
+ selfProviderId,
953
+ authorProviderId = selfProviderId,
954
+ requiredEntitlementId = null,
955
+ entitlementAvailability = [],
956
+ observedProviderId,
957
+ observedReviewProfileId,
958
+ observedModelReleaseId,
959
+ observedResponseModelId,
960
+ now = new Date(),
961
+ } = {}) {
962
+ validateReviewCapabilitySelectionReceipt(receipt)
963
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) block('REVIEW_TIME_INVALID', 'selection verification clock is invalid')
964
+ if (typeof skill !== 'string' || !selfProviderId || !authorProviderId) {
965
+ block('REVIEW_SELECTION_VERIFICATION_CONTEXT_REQUIRED', 'skill, self provider, and author provider must be explicit')
966
+ }
967
+ validateEntitlementAvailability(entitlementAvailability, { now, invocationRegistry })
968
+ for (const [actual, expected, code, label] of [
969
+ [digest(registry), receipt.providerRegistryDigest, 'REVIEW_PROVIDER_REGISTRY_STALE', 'provider registry'],
970
+ [digest(capabilityRegistry), receipt.capabilityRegistryDigest, 'REVIEW_CAPABILITY_REGISTRY_STALE', 'capability registry'],
971
+ [digest(capabilityCertificationLedger), receipt.capabilityCertificationLedgerDigest, 'REVIEW_CAPABILITY_CERTIFICATION_STALE', 'capability certification ledger'],
972
+ [digest(invocationRegistry), receipt.invocationRegistryDigest, 'REVIEW_INVOCATION_REGISTRY_STALE', 'invocation registry'],
973
+ [digest(modelReleaseRegistry), receipt.modelReleaseRegistryDigest, 'REVIEW_MODEL_RELEASE_REGISTRY_STALE', 'model release registry'],
974
+ ]) {
975
+ if (actual !== expected) block(code, label)
976
+ }
977
+ const canonical = resolveHighestCertifiedReviewCapability({
978
+ registry,
979
+ capabilityRegistry,
980
+ capabilityCertificationLedger,
981
+ invocationRegistry,
982
+ modelReleaseRegistry,
983
+ skill,
984
+ selfProviderId,
985
+ authorProviderId,
986
+ requiredEntitlementId,
987
+ entitlementAvailability,
988
+ now,
989
+ }).selectionReceipt
990
+ if (JSON.stringify(stableValue(canonical)) !== JSON.stringify(stableValue(receipt))) {
991
+ block('REVIEW_SELECTION_RECEIPT_NONCANONICAL', 'selection receipt differs from the current canonical highest eligible capability')
992
+ }
993
+ const selected = canonical.selected
994
+ if (authorProviderId === selected.providerId
995
+ || observedProviderId !== selected.providerId) {
996
+ block('REVIEW_PROVIDER_SUBSTITUTION', `${observedProviderId ?? '<missing>'}/${selected.providerId}`)
997
+ }
998
+ if (observedReviewProfileId !== selected.reviewProfileId) {
999
+ block('REVIEW_PROFILE_SUBSTITUTION', `${observedReviewProfileId ?? '<missing>'}/${selected.reviewProfileId}`)
1000
+ }
1001
+ if (observedModelReleaseId !== selected.modelReleaseId) {
1002
+ block('REVIEW_MODEL_RELEASE_SUBSTITUTION', `${observedModelReleaseId ?? '<missing>'}/${selected.modelReleaseId}`)
1003
+ }
1004
+ if (observedResponseModelId !== selected.requestModelId) {
1005
+ block('REVIEW_MODEL_SUBSTITUTION', `${observedResponseModelId ?? '<missing>'}/${selected.requestModelId}`)
1006
+ }
1007
+ if (Date.parse(selected.capabilityCertificationExpiresAt) <= now.getTime()) {
1008
+ block('REVIEW_CAPABILITY_CERTIFICATION_EXPIRED', selected.capabilityCertificationId)
1009
+ }
1010
+ return true
1011
+ }
1012
+
1013
+ export function resolveProviderReviewBinding({
1014
+ registry,
1015
+ skill,
1016
+ selfProviderId,
1017
+ authorProviderId = selfProviderId,
1018
+ expectedPeerProviderId = null,
1019
+ requireCertificationContract = false,
1020
+ capabilityRegistry = null,
1021
+ capabilityCertificationLedger = null,
1022
+ invocationRegistry = null,
1023
+ modelReleaseRegistry = null,
1024
+ requiredEntitlementId = null,
1025
+ entitlementAvailability = [],
1026
+ expectedReviewProfileId = null,
1027
+ expectedModelReleaseId = null,
1028
+ requireSelectedCapability = false,
1029
+ now = new Date(),
1030
+ } = {}) {
1031
+ const { self, binding, policy, reviewClassPolicy } = reviewBinding(registry, skill, selfProviderId, authorProviderId)
1032
+ const transport = nonEmpty(binding.transport, 'REVIEW_TRANSPORT_UNAVAILABLE', `${self.id}/${skill} transport`)
1033
+ if (requireCertificationContract && binding.certificationContract !== EXACT_REVIEW_CERTIFICATION_CONTRACT) {
1034
+ block('REVIEW_CERTIFICATION_CONTRACT_UNAVAILABLE', `${self.id}/${skill} lacks ${EXACT_REVIEW_CERTIFICATION_CONTRACT}`)
1035
+ }
1036
+ if (requireCertificationContract && transport !== PORTABLE_REVIEW_EXCHANGE_CORE) {
1037
+ block('REVIEW_EXCHANGE_CORE_UNATTESTED', `${self.id}/${skill} must use ${PORTABLE_REVIEW_EXCHANGE_CORE}`)
1038
+ }
1039
+ const selectionInputs = [capabilityRegistry, capabilityCertificationLedger, invocationRegistry, modelReleaseRegistry]
1040
+ const suppliedSelectionInputs = selectionInputs.filter((value) => value !== null).length
1041
+ if (suppliedSelectionInputs !== 0 && suppliedSelectionInputs !== selectionInputs.length) {
1042
+ block('REVIEW_CAPABILITY_INPUTS_INCOMPLETE', `${self.id}/${skill}`)
1043
+ }
1044
+ if (suppliedSelectionInputs === selectionInputs.length) {
1045
+ try {
1046
+ return resolveHighestCertifiedReviewCapability({
1047
+ registry,
1048
+ capabilityRegistry,
1049
+ capabilityCertificationLedger,
1050
+ invocationRegistry,
1051
+ modelReleaseRegistry,
1052
+ skill,
1053
+ selfProviderId,
1054
+ authorProviderId,
1055
+ requiredEntitlementId,
1056
+ entitlementAvailability,
1057
+ expectedPeerProviderId,
1058
+ expectedReviewProfileId,
1059
+ expectedModelReleaseId,
1060
+ now,
1061
+ })
1062
+ } catch (error) {
1063
+ if (requireSelectedCapability
1064
+ || !['REVIEW_CAPABILITY_UNAVAILABLE', 'REVIEW_ENTITLEMENT_UNAVAILABLE'].includes(error?.code)) throw error
1065
+ const bindingDigest = digest({
1066
+ skill,
1067
+ self: self.id,
1068
+ selectionPolicy: binding.selectionPolicy,
1069
+ reviewClass: binding.reviewClass,
1070
+ binding,
1071
+ })
1072
+ return {
1073
+ skill,
1074
+ self,
1075
+ peer: null,
1076
+ transport,
1077
+ invocation: binding.invocation ?? null,
1078
+ certificationContract: binding.certificationContract ?? null,
1079
+ binding,
1080
+ bindingDigest,
1081
+ policy,
1082
+ reviewClassPolicy,
1083
+ selectionStatus: 'REVIEW-BLOCKED',
1084
+ selectionReasonCode: error.code,
1085
+ selectionReceipt: blockedCapabilitySelection({
1086
+ registry,
1087
+ capabilityRegistry,
1088
+ capabilityCertificationLedger,
1089
+ invocationRegistry,
1090
+ modelReleaseRegistry,
1091
+ skill,
1092
+ self,
1093
+ binding,
1094
+ policy,
1095
+ reviewClassPolicy,
1096
+ requiredEntitlementId,
1097
+ entitlementAvailability,
1098
+ selectionReasonCode: error.code,
1099
+ }),
1100
+ }
1101
+ }
1102
+ }
1103
+ if (requireSelectedCapability || expectedPeerProviderId !== null
1104
+ || expectedReviewProfileId !== null || expectedModelReleaseId !== null
1105
+ || requiredEntitlementId !== null) {
1106
+ block('REVIEW_CAPABILITY_SELECTION_REQUIRED', `${self.id}/${skill}`)
1107
+ }
1108
+ const bindingDigest = digest({
1109
+ skill,
1110
+ self: self.id,
1111
+ selectionPolicy: binding.selectionPolicy,
1112
+ reviewClass: binding.reviewClass,
1113
+ binding,
1114
+ })
1115
+ return {
1116
+ skill,
1117
+ self,
1118
+ peer: null,
1119
+ transport,
1120
+ invocation: binding.invocation ?? null,
1121
+ certificationContract: binding.certificationContract ?? null,
1122
+ binding,
1123
+ bindingDigest,
1124
+ policy,
1125
+ reviewClassPolicy,
1126
+ selectionStatus: 'REVIEW-BLOCKED',
1127
+ selectionReasonCode: 'REVIEW_CAPABILITY_SELECTION_REQUIRED',
1128
+ }
1129
+ }
1130
+
1131
+ /**
1132
+ * Resolve native-hook projection eligibility from the same provider registry and review-binding
1133
+ * authority used at runtime. Both the adapter generator and the event dispatcher consume this
1134
+ * function so a batch cannot silently select a different descriptor set than its generated view.
1135
+ */
1136
+ export function resolveProviderHookEligibility({
1137
+ registry,
1138
+ providerId,
1139
+ descriptor,
1140
+ hasUsableVersionedTranscript,
1141
+ allowDeferredSelection = false,
1142
+ } = {}) {
1143
+ object(registry, 'HOOK_ELIGIBILITY_REGISTRY_INVALID', 'provider registry')
1144
+ object(descriptor, 'HOOK_ELIGIBILITY_DESCRIPTOR_INVALID', 'hook descriptor')
1145
+ if (typeof hasUsableVersionedTranscript !== 'function') {
1146
+ block('HOOK_ELIGIBILITY_TRANSCRIPT_CONTRACT_INVALID', 'versioned transcript predicate is unavailable')
1147
+ }
1148
+ const provider = providerById(registry, providerId, 'hook')
1149
+ if (descriptor.transcript === 'stable-required'
1150
+ && !hasUsableVersionedTranscript(provider.runtime?.transcript)) {
1151
+ return {
1152
+ eligible: false,
1153
+ reasonCode: 'STABLE_TRANSCRIPT_CONTRACT_UNAVAILABLE',
1154
+ detail: `${providerId} does not declare a tested versioned native transcript contract`,
1155
+ peer: null,
1156
+ }
1157
+ }
1158
+
1159
+ const requirements = descriptor.requires || []
1160
+ if (!requirements.length) return { eligible: true, reasonCode: null, detail: null, peer: null }
1161
+ let resolved = null
1162
+ try {
1163
+ resolved = resolveProviderReviewBinding({
1164
+ registry,
1165
+ skill: descriptor.reviewSkill,
1166
+ selfProviderId: providerId,
1167
+ requireCertificationContract: ['deep-audit-cross-codex', 'independent-review'].includes(descriptor.reviewSkill),
1168
+ })
1169
+ } catch (error) {
1170
+ if (requirements.includes('peer-review-binding') || requirements.includes('peer-cli')) {
1171
+ return {
1172
+ eligible: false,
1173
+ reasonCode: error.code || 'PEER_REVIEW_BINDING_UNAVAILABLE',
1174
+ detail: `${providerId} has no distinct registered ${descriptor.reviewSkill} peer`,
1175
+ peer: null,
1176
+ }
1177
+ }
1178
+ throw error
1179
+ }
1180
+ if (!resolved.peer && (requirements.includes('peer-review-binding') || requirements.includes('peer-cli'))) {
1181
+ if (allowDeferredSelection) {
1182
+ return {
1183
+ eligible: true,
1184
+ reasonCode: null,
1185
+ detail: null,
1186
+ peer: null,
1187
+ selectionStatus: 'deferred-to-review-prepare',
1188
+ selectionPolicy: resolved.binding.selectionPolicy,
1189
+ reviewClass: resolved.binding.reviewClass,
1190
+ }
1191
+ }
1192
+ return {
1193
+ eligible: false,
1194
+ reasonCode: resolved.selectionReasonCode || 'REVIEW_CAPABILITY_SELECTION_REQUIRED',
1195
+ detail: `${providerId} requires a distinct certified capability selection at review prepare time`,
1196
+ peer: null,
1197
+ selectionPolicy: resolved.binding.selectionPolicy,
1198
+ reviewClass: resolved.binding.reviewClass,
1199
+ }
1200
+ }
1201
+ if (requirements.includes('peer-cli')) {
1202
+ const cli = resolved.peer?.runtime?.cli
1203
+ if (!cli?.executable
1204
+ || !cli?.localExecutable
1205
+ || !cli?.replyArtifactPrefix
1206
+ || !cli?.briefInvocationMarkers?.length
1207
+ || !cli?.discoveryMarkers?.length) {
1208
+ return {
1209
+ eligible: false,
1210
+ reasonCode: 'PEER_CLI_METADATA_UNAVAILABLE',
1211
+ detail: `${providerId} peer ${resolved.peer?.id || '<missing>'} has no complete CLI/reply/discovery metadata`,
1212
+ peer: null,
1213
+ }
1214
+ }
1215
+ }
1216
+ return {
1217
+ eligible: true,
1218
+ reasonCode: null,
1219
+ detail: null,
1220
+ peer: resolved.peer,
1221
+ }
1222
+ }
1223
+
1224
+ export function compatibilityProviderIdForAdapter(compatibilityMatrix, adapterProviderId) {
1225
+ object(compatibilityMatrix, 'REVIEW_COMPATIBILITY_INVALID', 'compatibility matrix')
1226
+ object(compatibilityMatrix.providers, 'REVIEW_COMPATIBILITY_INVALID', 'compatibility matrix providers')
1227
+ const matches = Object.entries(compatibilityMatrix.providers)
1228
+ .filter(([, record]) => record?.adapterProviderId === adapterProviderId)
1229
+ .map(([providerId]) => providerId)
1230
+ if (matches.length !== 1) {
1231
+ block('REVIEW_COMPATIBILITY_UNAVAILABLE', `adapter provider must map to exactly one compatibility provider:${adapterProviderId}`)
1232
+ }
1233
+ return matches[0]
1234
+ }
1235
+
1236
+ export function reviewTargetIdentity(target) {
1237
+ object(target, 'REVIEW_TARGET_INVALID', 'review target')
1238
+ if (!TARGET_ID.test(target.id ?? '')) block('REVIEW_TARGET_INVALID', `review target id is invalid:${target.id ?? '<missing>'}`)
1239
+ const result = { id: target.id }
1240
+ for (const axis of REVIEW_TARGET_AXES) result[axis] = nonEmpty(target[axis], 'REVIEW_TARGET_INVALID', `review target.${axis}`)
1241
+ return result
1242
+ }
1243
+
1244
+ export function certificationAggregateStatus(certification, { now = new Date() } = {}) {
1245
+ object(certification, 'REVIEW_CERTIFICATION_INVALID', 'certification')
1246
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) block('REVIEW_TIME_INVALID', 'certification clock is invalid')
1247
+ if (!Array.isArray(certification.platformMatrix) || certification.platformMatrix.length === 0) {
1248
+ block('REVIEW_CERTIFICATION_INVALID', `${certification.id ?? '<unknown>'} has no platform targets`)
1249
+ }
1250
+ const targets = certification.platformMatrix.filter((target) => target.status !== 'unsupported')
1251
+ if (targets.length === 0) return 'not-applicable'
1252
+ let certified = 0
1253
+ let expired = 0
1254
+ for (const target of targets) {
1255
+ if (target.status !== 'certified') continue
1256
+ const expiresAt = target.expiresAt ?? certification.expiresAt
1257
+ if (typeof expiresAt === 'string' && Number.isFinite(Date.parse(expiresAt)) && Date.parse(expiresAt) <= now.getTime()) expired += 1
1258
+ else certified += 1
1259
+ }
1260
+ if (certified === targets.length) return 'certified'
1261
+ if (certified > 0) return 'conditional'
1262
+ if (expired > 0 && expired === targets.length) return 'expired'
1263
+ return 'not-certified'
1264
+ }
1265
+
1266
+ function certificationRecords(ledger) {
1267
+ if (Array.isArray(ledger)) return ledger
1268
+ object(ledger, 'REVIEW_CERTIFICATION_LEDGER_INVALID', 'certification ledger')
1269
+ if (!Array.isArray(ledger.certifications)) block('REVIEW_CERTIFICATION_LEDGER_INVALID', 'certification ledger records must be an array')
1270
+ return ledger.certifications
1271
+ }
1272
+
1273
+ export function verifyExactProviderCertification({
1274
+ certificationLedger,
1275
+ compatibilityProviderId,
1276
+ runtimeProviderId,
1277
+ runtimeProfileId = runtimeProviderId,
1278
+ runtimeKind,
1279
+ surface,
1280
+ repositoryRole,
1281
+ target,
1282
+ expectedGitTree = null,
1283
+ now = new Date(),
1284
+ requireEvidence = true,
1285
+ } = {}) {
1286
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) block('REVIEW_TIME_INVALID', 'certification clock is invalid')
1287
+ for (const [value, label] of [
1288
+ [compatibilityProviderId, 'provider'], [runtimeProviderId, 'runtimeProviderId'], [runtimeKind, 'runtimeKind'],
1289
+ [runtimeProfileId, 'runtimeProfileId'], [surface, 'surface'], [repositoryRole, 'repositoryRole'],
1290
+ ]) nonEmpty(value, 'REVIEW_CERTIFICATION_REQUEST_INVALID', label)
1291
+ const identity = reviewTargetIdentity(target)
1292
+ const records = certificationRecords(certificationLedger).filter((record) => (
1293
+ record?.provider === compatibilityProviderId
1294
+ && record.runtimeKind === runtimeKind
1295
+ && record.surface === surface
1296
+ && record.repositoryRole === repositoryRole
1297
+ ))
1298
+ if (records.length !== 1) {
1299
+ block(records.length ? 'REVIEW_CERTIFICATION_AMBIGUOUS' : 'REVIEW_CERTIFICATION_MISSING', `${compatibilityProviderId}/${runtimeKind}/${surface}/${repositoryRole}`)
1300
+ }
1301
+ const record = records[0]
1302
+ if (record.status === 'expired') block('REVIEW_CERTIFICATION_EXPIRED', `${record.id}:${record.status}`)
1303
+ if (!['certified', 'conditional'].includes(record.status)) block('REVIEW_NOT_CERTIFIED', `${record.id}:${record.status}`)
1304
+ const matches = record.platformMatrix.filter((candidate) => candidate?.id === identity.id)
1305
+ if (matches.length !== 1) block('REVIEW_TARGET_UNCERTIFIED', `${record.id}/${identity.id}`)
1306
+ const certifiedTarget = matches[0]
1307
+ for (const axis of REVIEW_TARGET_AXES) {
1308
+ if (certifiedTarget[axis] !== identity[axis]) {
1309
+ block('REVIEW_TARGET_AXES_MISMATCH', `${record.id}/${identity.id}/${axis}:${identity[axis]}!=${certifiedTarget[axis]}`)
1310
+ }
1311
+ }
1312
+ if (certifiedTarget.status !== 'certified') block('REVIEW_TARGET_UNCERTIFIED', `${record.id}/${identity.id}:${certifiedTarget.status}`)
1313
+ const certifiedAt = certifiedTarget.certifiedAt ?? record.certifiedAt
1314
+ const expiresAt = certifiedTarget.expiresAt ?? record.expiresAt
1315
+ if (!Number.isFinite(Date.parse(certifiedAt ?? '')) || !Number.isFinite(Date.parse(expiresAt ?? ''))) {
1316
+ block('REVIEW_CERTIFICATION_DATES_INVALID', `${record.id}/${identity.id}`)
1317
+ }
1318
+ if (Date.parse(expiresAt) <= Date.parse(certifiedAt)) block('REVIEW_CERTIFICATION_DATES_INVALID', `${record.id}/${identity.id}:expiry ordering`)
1319
+ if (Date.parse(expiresAt) <= now.getTime()) block('REVIEW_CERTIFICATION_EXPIRED', `${record.id}/${identity.id}`)
1320
+ const aggregate = certificationAggregateStatus(record, { now })
1321
+ if (!['certified', 'conditional'].includes(aggregate)) block('REVIEW_NOT_CERTIFIED', `${record.id}:${record.status}/${aggregate}`)
1322
+ const evidence = certifiedTarget.runtimeEvidence ?? record.runtimeEvidence ?? null
1323
+ if (requireEvidence && (!evidence || typeof evidence !== 'object' || Array.isArray(evidence))) {
1324
+ block('REVIEW_CERTIFICATION_EVIDENCE_MISSING', `${record.id}/${identity.id}`)
1325
+ }
1326
+ if (evidence) {
1327
+ const observedRuntimeIdentity = evidence.profileId ?? evidence.providerId
1328
+ const expectedRuntimeIdentity = evidence.profileId === undefined ? runtimeProviderId : runtimeProfileId
1329
+ if (observedRuntimeIdentity !== expectedRuntimeIdentity) block('REVIEW_CERTIFICATION_EVIDENCE_PROVIDER_MISMATCH', `${record.id}/${identity.id}`)
1330
+ if (evidence.targetId !== identity.id) block('REVIEW_CERTIFICATION_EVIDENCE_TARGET_MISMATCH', `${record.id}/${identity.id}`)
1331
+ for (const axis of REVIEW_TARGET_AXES) {
1332
+ if (evidence[axis] !== identity[axis]) block('REVIEW_CERTIFICATION_EVIDENCE_AXES_MISMATCH', `${record.id}/${identity.id}/${axis}`)
1333
+ }
1334
+ if (expectedGitTree !== null && evidence.gitTree !== expectedGitTree) {
1335
+ block('REVIEW_CERTIFICATION_STALE', `${record.id}/${identity.id}`)
1336
+ }
1337
+ }
1338
+ return {
1339
+ certificationId: record.id,
1340
+ certificationStatus: record.status,
1341
+ aggregateStatus: aggregate,
1342
+ compatibilityProviderId,
1343
+ runtimeProviderId,
1344
+ runtimeKind,
1345
+ surface,
1346
+ repositoryRole,
1347
+ target: identity,
1348
+ targetDigest: digest(identity),
1349
+ certifiedAt,
1350
+ expiresAt,
1351
+ evidence,
1352
+ record,
1353
+ recordDigest: digest(record),
1354
+ }
1355
+ }
1356
+
1357
+ function canonicalIsoTime(value, code, label) {
1358
+ if (typeof value !== 'string'
1359
+ || !Number.isFinite(Date.parse(value))
1360
+ || new Date(Date.parse(value)).toISOString() !== value) {
1361
+ block(code, `${label} is not a canonical ISO timestamp`)
1362
+ }
1363
+ return value
1364
+ }
1365
+
1366
+ function reviewCapabilityEvidenceProjection(value) {
1367
+ const { evidenceDigest: ignoredEvidenceDigest, ...projection } = value
1368
+ return projection
1369
+ }
1370
+
1371
+ function reviewCapabilityEvidenceBytes(value) {
1372
+ return Buffer.from(`${JSON.stringify(stableValue(value))}\n`, 'utf8')
1373
+ }
1374
+
1375
+ function reviewCapabilityCertificationRecord({
1376
+ certificationId,
1377
+ profile,
1378
+ capability,
1379
+ certifiedAt,
1380
+ expiresAt,
1381
+ evidenceReference,
1382
+ evidenceSha256,
1383
+ }) {
1384
+ return {
1385
+ id: certificationId,
1386
+ reviewProfileId: profile.id,
1387
+ reviewProfileDigest: digest(profile),
1388
+ providerId: profile.providerId,
1389
+ modelReleaseId: profile.modelReleaseId,
1390
+ entitlementId: profile.entitlementId,
1391
+ status: 'certified',
1392
+ assuranceTier: capability.assuranceTier,
1393
+ reasoningTier: capability.reasoningTier,
1394
+ computeTier: capability.computeTier,
1395
+ certifiedAt,
1396
+ expiresAt,
1397
+ evidence: {
1398
+ reference: evidenceReference,
1399
+ sha256: evidenceSha256,
1400
+ },
1401
+ }
1402
+ }
1403
+
1404
+ function exactFlagValue(args, flag, expected, code, label) {
1405
+ const indexes = args.flatMap((value, index) => value === flag ? [index] : [])
1406
+ if (indexes.length !== 1 || args[indexes[0] + 1] !== expected) {
1407
+ block(code, `${label} does not bind ${flag}=${JSON.stringify(expected)}`)
1408
+ }
1409
+ }
1410
+
1411
+ function verifySignedReviewCapabilityProbe({
1412
+ runtimeEvidenceBytes,
1413
+ capabilityRegistry,
1414
+ invocationProfile,
1415
+ profile,
1416
+ capability,
1417
+ target,
1418
+ } = {}) {
1419
+ let evidence
1420
+ try {
1421
+ evidence = JSON.parse(evidenceBytes(runtimeEvidenceBytes).toString('utf8'))
1422
+ } catch {
1423
+ block('REVIEW_CAPABILITY_PROBE_INVALID', `${profile.id}:runtime evidence is not JSON`)
1424
+ }
1425
+ const providerMatches = (evidence.providers || []).filter(
1426
+ (provider) => provider?.id === invocationProfile.availabilityEvidence.providerEvidenceId,
1427
+ )
1428
+ const distribution = providerMatches[0]?.tool?.distribution
1429
+ if (providerMatches.length !== 1
1430
+ || providerMatches[0].status !== 'pass'
1431
+ || distribution?.resolutionStatus !== 'pass'
1432
+ || distribution.distributionVersion !== target.distributionVersion
1433
+ || !/^sha256:[a-f0-9]{64}$/.test(distribution.authorityDigest ?? '')) {
1434
+ block('REVIEW_CAPABILITY_PROBE_INVALID', `${profile.id}:signed exact runtime evidence is absent or failed`)
1435
+ }
1436
+ const candidates = reviewProfileRecords(capabilityRegistry)
1437
+ .filter((candidate) => (
1438
+ candidate.providerId === profile.providerId
1439
+ && candidate.routeClass === 'subscription-entitlement'
1440
+ && candidate.entitlementId === profile.entitlementId
1441
+ && candidate.invocationProfileId === profile.invocationProfileId
1442
+ ))
1443
+ .map((candidate) => ({
1444
+ profile: candidate,
1445
+ capability: providerCapabilityForProfile(capabilityRegistry, candidate),
1446
+ }))
1447
+ .sort((left, right) => (
1448
+ right.capability.capabilityRank - left.capability.capabilityRank
1449
+ || compareUtf8Bytes(left.profile.id, right.profile.id)
1450
+ ))
1451
+ const selectedIndex = candidates.findIndex(
1452
+ (candidate) => candidate.profile.id === profile.id,
1453
+ )
1454
+ if (selectedIndex < 0) {
1455
+ block('REVIEW_CAPABILITY_PROBE_INVALID', `${profile.id}:candidate schedule is incomplete`)
1456
+ }
1457
+ const probeRows = candidates.slice(0, selectedIndex + 1).map((candidate, ordinal) => {
1458
+ const candidateProfile = candidate.profile
1459
+ const checkId = `review-capability-${candidateProfile.id}`
1460
+ const checkMatches = (providerMatches[0].checks || [])
1461
+ .filter((check) => check?.id === checkId)
1462
+ const check = checkMatches[0]
1463
+ const args = check?.command?.arguments
1464
+ const selectedCandidate = candidateProfile.id === profile.id
1465
+ const assertions = new Map(
1466
+ (check?.result?.assertions || [])
1467
+ .map((assertion) => [assertion?.id, assertion?.pass]),
1468
+ )
1469
+ if (checkMatches.length !== 1
1470
+ || check.driver !== 'claude-review-capability-probe'
1471
+ || check.certificationImpact !== 'capability-only'
1472
+ || check.command?.executable
1473
+ !== invocationProfile.deploymentAdapter.executable
1474
+ || check.command.cwd !== '<fixture>'
1475
+ || check.command.stdin !== 'sha256'
1476
+ || !Array.isArray(args)) {
1477
+ block('REVIEW_CAPABILITY_PROBE_INVALID',
1478
+ `${candidateProfile.id}:signed exact candidate outcome is absent or failed`)
1479
+ }
1480
+ if (check.status !== 'pass') {
1481
+ block(
1482
+ selectedCandidate
1483
+ ? 'REVIEW_CAPABILITY_PROBE_INVALID'
1484
+ : 'REVIEW_HIGHER_CAPABILITY_OUTCOME_UNVERIFIED',
1485
+ `${candidateProfile.id}:candidate probe is transient, quota/capacity/auth blocked, timed out, or otherwise unverified`,
1486
+ )
1487
+ }
1488
+ if (assertions.get('review-capability-profile-observed') !== true
1489
+ || assertions.get('review-capability-maximum-compute-observed') !== true
1490
+ || assertions.get('review-capability-isolated-no-tools-route-observed') !== true) {
1491
+ block('REVIEW_CAPABILITY_PROBE_INVALID',
1492
+ `${candidateProfile.id}:successful candidate outcome lacks exact profile/compute/isolation evidence`)
1493
+ }
1494
+ exactFlagValue(args, '--model', candidateProfile.requestModelId,
1495
+ 'REVIEW_CAPABILITY_PROBE_INVALID', candidateProfile.id)
1496
+ exactFlagValue(args, '--effort', invocationProfile.deploymentAdapter
1497
+ .effortByComputeTier[candidate.capability.computeTier],
1498
+ 'REVIEW_CAPABILITY_PROBE_INVALID', candidateProfile.id)
1499
+ exactFlagValue(args, '--tools', '',
1500
+ 'REVIEW_CAPABILITY_PROBE_INVALID', candidateProfile.id)
1501
+ exactFlagValue(args, '--mcp-config', '{"mcpServers":{}}',
1502
+ 'REVIEW_CAPABILITY_PROBE_INVALID', candidateProfile.id)
1503
+ exactFlagValue(args, '--permission-mode', 'plan',
1504
+ 'REVIEW_CAPABILITY_PROBE_INVALID', candidateProfile.id)
1505
+ for (const required of [
1506
+ '--no-session-persistence',
1507
+ '--strict-mcp-config',
1508
+ '--safe-mode',
1509
+ '--no-chrome',
1510
+ ]) {
1511
+ if (args.filter((value) => value === required).length !== 1) {
1512
+ block('REVIEW_CAPABILITY_PROBE_INVALID',
1513
+ `${candidateProfile.id} lacks exact ${required}`)
1514
+ }
1515
+ }
1516
+ if (args.some((value) => (
1517
+ [
1518
+ '--fallback-model',
1519
+ '--resume',
1520
+ '--continue',
1521
+ '--max-budget-usd',
1522
+ ].includes(value)
1523
+ ))) {
1524
+ block('REVIEW_CAPABILITY_PROBE_INVALID',
1525
+ `${candidateProfile.id} capability probe permits fallback or session reuse`)
1526
+ }
1527
+ const available =
1528
+ assertions.get('review-capability-outcome-available') === true
1529
+ && assertions.get('review-capability-model-usage-exact') === true
1530
+ const permanentlyUnavailable =
1531
+ assertions.get('review-capability-outcome-permanently-unavailable') === true
1532
+ && assertions.get('review-capability-machine-readable-unavailability-observed') === true
1533
+ if (available === permanentlyUnavailable) {
1534
+ block('REVIEW_CAPABILITY_PROBE_INVALID',
1535
+ `${candidateProfile.id}:candidate outcome is ambiguous`)
1536
+ }
1537
+ if ((selectedCandidate && !available)
1538
+ || (!selectedCandidate && !permanentlyUnavailable)) {
1539
+ block(
1540
+ selectedCandidate
1541
+ ? 'REVIEW_CAPABILITY_PROBE_INVALID'
1542
+ : (available
1543
+ ? 'REVIEW_HIGHER_CAPABILITY_AVAILABLE'
1544
+ : 'REVIEW_HIGHER_CAPABILITY_OUTCOME_UNVERIFIED'),
1545
+ `${candidateProfile.id}:${selectedCandidate ? 'selected-not-available' : (available ? 'higher-candidate-available' : 'higher-candidate-not-permanently-unavailable')}`,
1546
+ )
1547
+ }
1548
+ return {
1549
+ ordinal,
1550
+ reviewProfileId: candidateProfile.id,
1551
+ modelReleaseId: candidateProfile.modelReleaseId,
1552
+ requestModelId: candidateProfile.requestModelId,
1553
+ capabilityRank: candidate.capability.capabilityRank,
1554
+ checkId,
1555
+ outcome: available ? 'available' : 'permanently-unavailable',
1556
+ checkDigest: digest(check),
1557
+ }
1558
+ })
1559
+ const checkId = `review-capability-${profile.id}`
1560
+ const selectedRow = probeRows[probeRows.length - 1]
1561
+ const candidateSet = candidates.map(({ profile: candidateProfile, capability: row }) => ({
1562
+ reviewProfileId: candidateProfile.id,
1563
+ modelReleaseId: candidateProfile.modelReleaseId,
1564
+ requestModelId: candidateProfile.requestModelId,
1565
+ capabilityRank: row.capabilityRank,
1566
+ }))
1567
+ const projection = {
1568
+ reviewProfileId: profile.id,
1569
+ requestModelId: profile.requestModelId,
1570
+ computeTier: capability.computeTier,
1571
+ effort: invocationProfile.deploymentAdapter.effortByComputeTier[capability.computeTier],
1572
+ checkId,
1573
+ checkDigest: selectedRow.checkDigest,
1574
+ candidateSetDigest: digest(candidateSet),
1575
+ orderedProbeRows: probeRows,
1576
+ orderedProbeSetDigest: digest(probeRows),
1577
+ runtimeExecutableAuthorityDigest: distribution.authorityDigest.slice('sha256:'.length),
1578
+ distributionVersion: distribution.distributionVersion,
1579
+ }
1580
+ return {
1581
+ ...projection,
1582
+ capabilityProbeDigest: digest(projection),
1583
+ }
1584
+ }
1585
+
1586
+ /**
1587
+ * Prepare a deterministic capability-certification carrier from an already
1588
+ * promoted exact runtime certification. The function does not grant trust to
1589
+ * an unsigned runtime observation: the existing provider certification ledger
1590
+ * and its content-addressed runtime evidence remain the trust root. The tier
1591
+ * assertion becomes authoritative only when the returned record is reviewed
1592
+ * and materialized in the canonical capability ledger.
1593
+ */
1594
+ export function prepareReviewCapabilityCertification({
1595
+ registry,
1596
+ capabilityRegistry,
1597
+ invocationRegistry,
1598
+ modelReleaseRegistry,
1599
+ runtimeCertificationLedger,
1600
+ reviewProfileId,
1601
+ certificationId,
1602
+ capability,
1603
+ target,
1604
+ expectedGitTree,
1605
+ runtimeEvidenceBytes,
1606
+ certifiedAt,
1607
+ expiresAt,
1608
+ now = new Date(),
1609
+ } = {}) {
1610
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
1611
+ block('REVIEW_TIME_INVALID', 'capability certification clock is invalid')
1612
+ }
1613
+ if (!REVIEW_PROFILE_ID.test(reviewProfileId ?? '')
1614
+ || !REVIEW_PROFILE_ID.test(certificationId ?? '')) {
1615
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId ?? '<missing>'}/${reviewProfileId ?? '<missing>'}`)
1616
+ }
1617
+ exactObjectKeys(capability, [
1618
+ 'assuranceTier',
1619
+ 'reasoningTier',
1620
+ 'computeTier',
1621
+ 'exchangeBudget',
1622
+ ], 'REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId} capability`)
1623
+ for (const [field, value] of Object.entries(capability)
1624
+ .filter(([key]) => key !== 'exchangeBudget')) {
1625
+ if (!REVIEW_TIERS.includes(value)) {
1626
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId}/${field}:${value ?? '<missing>'}`)
1627
+ }
1628
+ }
1629
+ exactObjectKeys(capability.exchangeBudget, [
1630
+ 'maxInputBytes',
1631
+ 'maxOutputBytes',
1632
+ 'maxPayloadBytes',
1633
+ ], 'REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId} exchange budget`)
1634
+ const { maxInputBytes, maxOutputBytes, maxPayloadBytes } = capability.exchangeBudget
1635
+ if (!Number.isSafeInteger(maxInputBytes) || maxInputBytes <= 0
1636
+ || !Number.isSafeInteger(maxOutputBytes) || maxOutputBytes <= 0
1637
+ || !Number.isSafeInteger(maxPayloadBytes)
1638
+ || maxPayloadBytes < maxInputBytes + maxOutputBytes) {
1639
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId}:exchange budget`)
1640
+ }
1641
+ canonicalIsoTime(certifiedAt, 'REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId}.certifiedAt`)
1642
+ canonicalIsoTime(expiresAt, 'REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId}.expiresAt`)
1643
+ if (Date.parse(certifiedAt) > now.getTime()
1644
+ || Date.parse(expiresAt) <= Date.parse(certifiedAt)
1645
+ || Date.parse(expiresAt) <= now.getTime()) {
1646
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId}:validity window`)
1647
+ }
1648
+ const profiles = reviewProfileRecords(capabilityRegistry)
1649
+ const matchingProfiles = profiles.filter((profile) => profile.id === reviewProfileId)
1650
+ if (matchingProfiles.length !== 1) {
1651
+ block('REVIEW_CAPABILITY_PROFILE_INVALID', reviewProfileId)
1652
+ }
1653
+ const profile = matchingProfiles[0]
1654
+ const providerCapability = providerCapabilityForProfile(capabilityRegistry, profile)
1655
+ const governedCapability = {
1656
+ assuranceTier: providerCapability.assuranceTier,
1657
+ reasoningTier: providerCapability.reasoningTier,
1658
+ computeTier: providerCapability.computeTier,
1659
+ exchangeBudget: stableValue(providerCapability.exchangeBudget),
1660
+ }
1661
+ if (JSON.stringify(stableValue(capability))
1662
+ !== JSON.stringify(stableValue(governedCapability))) {
1663
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID',
1664
+ `${reviewProfileId}:caller capability differs from reviewed provider-local capability authority`)
1665
+ }
1666
+ const { release, invocationProfile } = validateExactReviewProfile({
1667
+ profile,
1668
+ registry,
1669
+ invocationRegistry,
1670
+ modelReleaseRegistry,
1671
+ })
1672
+ if (profile.routeClass !== 'subscription-entitlement') {
1673
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${reviewProfileId} is not an external entitlement route`)
1674
+ }
1675
+ const availability = verifyEntitlementAvailabilityEvidence({
1676
+ invocationRegistry,
1677
+ invocationProfileId: profile.invocationProfileId,
1678
+ certificationLedger: runtimeCertificationLedger,
1679
+ target,
1680
+ expectedGitTree,
1681
+ runtimeEvidenceBytes,
1682
+ now,
1683
+ })
1684
+ if (availability.providerId !== profile.providerId
1685
+ || availability.entitlementId !== profile.entitlementId
1686
+ || availability.invocationProfileId !== profile.invocationProfileId) {
1687
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${reviewProfileId}:runtime entitlement binding`)
1688
+ }
1689
+ const capabilityProbe = verifySignedReviewCapabilityProbe({
1690
+ runtimeEvidenceBytes,
1691
+ capabilityRegistry,
1692
+ invocationProfile,
1693
+ profile,
1694
+ capability: governedCapability,
1695
+ target,
1696
+ })
1697
+ const effectiveExpiresAt = new Date(Math.min(
1698
+ Date.parse(expiresAt),
1699
+ Date.parse(availability.expiresAt),
1700
+ )).toISOString()
1701
+ if (Date.parse(effectiveExpiresAt) <= Date.parse(certifiedAt)) {
1702
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', `${certificationId}:runtime-bound expiry`)
1703
+ }
1704
+ const projection = {
1705
+ schemaVersion: 1,
1706
+ kind: 'provider-neutral-review-capability-certification-evidence',
1707
+ certificationContract: EXACT_REVIEW_CERTIFICATION_CONTRACT,
1708
+ exchangeCore: PORTABLE_REVIEW_EXCHANGE_CORE,
1709
+ certificationId,
1710
+ reviewProfileId: profile.id,
1711
+ reviewProfileDigest: digest(profile),
1712
+ providerId: profile.providerId,
1713
+ invocationProfileId: profile.invocationProfileId,
1714
+ invocationProfileDigest: digest(invocationProfile),
1715
+ routeClass: profile.routeClass,
1716
+ entitlementId: profile.entitlementId,
1717
+ modelReleaseId: profile.modelReleaseId,
1718
+ requestModelId: profile.requestModelId,
1719
+ modelReleaseDigest: digest(release),
1720
+ capabilityRank: providerCapability.capabilityRank,
1721
+ capability: stableValue(governedCapability),
1722
+ capabilityProbe,
1723
+ certifiedAt,
1724
+ expiresAt: effectiveExpiresAt,
1725
+ runtimeBinding: {
1726
+ compatibilityProviderId: invocationProfile.availabilityEvidence.compatibilityProviderId,
1727
+ runtimeProviderId: availability.runtimeProviderId,
1728
+ runtimeProfileId: availability.runtimeProfileId,
1729
+ runtimeKind: availability.runtimeKind,
1730
+ surface: availability.runtimeSurface,
1731
+ repositoryRole: availability.repositoryRole,
1732
+ certificationId: availability.runtimeCertificationId,
1733
+ certificationDigest: availability.runtimeCertificationDigest,
1734
+ target: stableValue(availability.target),
1735
+ targetDigest: availability.targetDigest,
1736
+ evidenceReference: availability.evidence.reference,
1737
+ evidenceSha256: availability.evidence.sha256,
1738
+ runtimeEvidenceDigest: availability.runtimeEvidenceDigest,
1739
+ runtimeExecutableAuthorityDigest:
1740
+ capabilityProbe.runtimeExecutableAuthorityDigest,
1741
+ capabilityProbeDigest: capabilityProbe.capabilityProbeDigest,
1742
+ },
1743
+ }
1744
+ const evidence = {
1745
+ ...projection,
1746
+ evidenceDigest: digest(projection),
1747
+ }
1748
+ const bytes = reviewCapabilityEvidenceBytes(evidence)
1749
+ const evidenceSha256 = contentSha256(bytes)
1750
+ const evidenceReference =
1751
+ `infra/governance/evidence/review-capability/${evidenceSha256}.json`
1752
+ const certification = reviewCapabilityCertificationRecord({
1753
+ certificationId,
1754
+ profile,
1755
+ capability,
1756
+ certifiedAt,
1757
+ expiresAt: effectiveExpiresAt,
1758
+ evidenceReference,
1759
+ evidenceSha256,
1760
+ })
1761
+ return Object.freeze({
1762
+ evidence: Object.freeze(evidence),
1763
+ evidenceBytes: bytes,
1764
+ evidenceSha256,
1765
+ evidenceReference,
1766
+ certification: Object.freeze(certification),
1767
+ })
1768
+ }
1769
+
1770
+ export function materializeReviewCapabilityCertification({
1771
+ capabilityCertificationLedger,
1772
+ prepared,
1773
+ } = {}) {
1774
+ capabilityCertificationRecords(capabilityCertificationLedger)
1775
+ object(prepared, 'REVIEW_CAPABILITY_CERTIFICATION_INVALID', 'prepared capability certification')
1776
+ if (!Buffer.isBuffer(prepared.evidenceBytes)
1777
+ || prepared.evidenceBytes.length === 0
1778
+ || prepared.evidenceSha256 !== contentSha256(prepared.evidenceBytes)
1779
+ || prepared.evidenceReference
1780
+ !== `infra/governance/evidence/review-capability/${prepared.evidenceSha256}.json`
1781
+ || prepared.certification?.evidence?.reference !== prepared.evidenceReference
1782
+ || prepared.certification?.evidence?.sha256 !== prepared.evidenceSha256) {
1783
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', 'prepared evidence is not content-addressed')
1784
+ }
1785
+ let decoded
1786
+ try {
1787
+ decoded = JSON.parse(prepared.evidenceBytes.toString('utf8'))
1788
+ } catch {
1789
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', 'prepared evidence is invalid JSON')
1790
+ }
1791
+ if (JSON.stringify(stableValue(decoded)) !== JSON.stringify(stableValue(prepared.evidence))
1792
+ || decoded?.schemaVersion !== 1
1793
+ || decoded.kind !== 'provider-neutral-review-capability-certification-evidence'
1794
+ || decoded.certificationContract !== EXACT_REVIEW_CERTIFICATION_CONTRACT
1795
+ || decoded.exchangeCore !== PORTABLE_REVIEW_EXCHANGE_CORE
1796
+ || decoded.evidenceDigest !== digest(reviewCapabilityEvidenceProjection(decoded))
1797
+ || decoded.certificationId !== prepared.certification?.id
1798
+ || decoded.reviewProfileId !== prepared.certification?.reviewProfileId
1799
+ || decoded.reviewProfileDigest !== prepared.certification?.reviewProfileDigest
1800
+ || decoded.providerId !== prepared.certification?.providerId
1801
+ || decoded.modelReleaseId !== prepared.certification?.modelReleaseId
1802
+ || decoded.entitlementId !== prepared.certification?.entitlementId
1803
+ || decoded.certifiedAt !== prepared.certification?.certifiedAt
1804
+ || decoded.expiresAt !== prepared.certification?.expiresAt
1805
+ || decoded.capability?.assuranceTier !== prepared.certification?.assuranceTier
1806
+ || decoded.capability?.reasoningTier !== prepared.certification?.reasoningTier
1807
+ || decoded.capability?.computeTier !== prepared.certification?.computeTier) {
1808
+ block('REVIEW_CAPABILITY_CERTIFICATION_INVALID', 'prepared evidence/ledger projection mismatches')
1809
+ }
1810
+ const current = capabilityCertificationLedger.certifications
1811
+ const sameId = current.filter((record) => record.id === prepared.certification.id)
1812
+ if (sameId.length > 1) {
1813
+ block('REVIEW_CAPABILITY_CERTIFICATION_AMBIGUOUS', prepared.certification.id)
1814
+ }
1815
+ if (sameId.length === 1) {
1816
+ if (JSON.stringify(stableValue(sameId[0]))
1817
+ !== JSON.stringify(stableValue(prepared.certification))) {
1818
+ block('REVIEW_CAPABILITY_CERTIFICATION_SUBSTITUTED', prepared.certification.id)
1819
+ }
1820
+ return capabilityCertificationLedger
1821
+ }
1822
+ const overlapping = current.filter((record) => (
1823
+ record.reviewProfileId === prepared.certification.reviewProfileId
1824
+ && record.status === 'certified'
1825
+ && Date.parse(record.expiresAt) > Date.parse(prepared.certification.certifiedAt)
1826
+ && Date.parse(record.certifiedAt) < Date.parse(prepared.certification.expiresAt)
1827
+ ))
1828
+ if (overlapping.length > 0) {
1829
+ block('REVIEW_CAPABILITY_CERTIFICATION_AMBIGUOUS', prepared.certification.reviewProfileId)
1830
+ }
1831
+ const next = {
1832
+ ...capabilityCertificationLedger,
1833
+ certifications: [...current, prepared.certification]
1834
+ .sort((left, right) => compareUtf8Bytes(left.id, right.id)),
1835
+ }
1836
+ capabilityCertificationRecords(next)
1837
+ return next
1838
+ }
1839
+
1840
+ function genuineReceiptProjection(receipt) {
1841
+ const { receiptDigest: ignoredReceiptDigest, ...projection } = receipt
1842
+ return projection
1843
+ }
1844
+
1845
+ export function validateGenuineCrossProviderReviewReceipt(receipt) {
1846
+ exactObjectKeys(receipt, [
1847
+ 'schemaVersion',
1848
+ 'kind',
1849
+ 'protocol',
1850
+ 'exchangeCore',
1851
+ 'assurance',
1852
+ 'authorProviderId',
1853
+ 'reviewerProviderId',
1854
+ 'reviewProfileId',
1855
+ 'invocationProfileId',
1856
+ 'modelReleaseId',
1857
+ 'requestModelId',
1858
+ 'observedResponseModelId',
1859
+ 'selectionDigest',
1860
+ 'capabilityCertificationId',
1861
+ 'capabilityCertificationDigest',
1862
+ 'capabilityEvidenceDigest',
1863
+ 'runtimeCertificationId',
1864
+ 'runtimeCertificationDigest',
1865
+ 'runtimeTargetDigest',
1866
+ 'structuralCompletionDigest',
1867
+ 'exchangeScheduleDigest',
1868
+ 'capabilityBudgetDigest',
1869
+ 'aggregateVerdict',
1870
+ 'taskRootVerdictSetDigest',
1871
+ 'requestCount',
1872
+ 'responseDigestSetDigest',
1873
+ 'executionEvidenceDigest',
1874
+ 'fullNoSampleClosure',
1875
+ 'genuineCrossProviderReview',
1876
+ 'promotionEligible',
1877
+ 'managedEvidence',
1878
+ 'receiptDigest',
1879
+ ], 'REVIEW_GENUINE_RECEIPT_INVALID', 'genuine review receipt')
1880
+ if (receipt.schemaVersion !== 1
1881
+ || receipt.kind !== 'provider-neutral-genuine-cross-provider-review-receipt'
1882
+ || receipt.exchangeCore !== PORTABLE_REVIEW_EXCHANGE_CORE
1883
+ || receipt.assurance !== 'exact-runtime-and-capability-attested'
1884
+ || !PROVIDER_ID.test(receipt.authorProviderId ?? '')
1885
+ || !PROVIDER_ID.test(receipt.reviewerProviderId ?? '')
1886
+ || receipt.authorProviderId === receipt.reviewerProviderId
1887
+ || !REVIEW_PROFILE_ID.test(receipt.reviewProfileId ?? '')
1888
+ || !REVIEW_PROFILE_ID.test(receipt.invocationProfileId ?? '')
1889
+ || !REVIEW_PROFILE_ID.test(receipt.capabilityCertificationId ?? '')
1890
+ || !REVIEW_PROFILE_ID.test(receipt.runtimeCertificationId ?? '')
1891
+ || typeof receipt.modelReleaseId !== 'string'
1892
+ || typeof receipt.requestModelId !== 'string'
1893
+ || receipt.observedResponseModelId !== receipt.requestModelId
1894
+ || !SHA256.test(receipt.selectionDigest ?? '')
1895
+ || !SHA256.test(receipt.capabilityCertificationDigest ?? '')
1896
+ || !SHA256.test(receipt.capabilityEvidenceDigest ?? '')
1897
+ || !SHA256.test(receipt.runtimeCertificationDigest ?? '')
1898
+ || !SHA256.test(receipt.runtimeTargetDigest ?? '')
1899
+ || !SHA256.test(receipt.structuralCompletionDigest ?? '')
1900
+ || !SHA256.test(receipt.exchangeScheduleDigest ?? '')
1901
+ || !SHA256.test(receipt.capabilityBudgetDigest ?? '')
1902
+ || !['verified', 'findings', 'unverifiable'].includes(receipt.aggregateVerdict)
1903
+ || !SHA256.test(receipt.taskRootVerdictSetDigest ?? '')
1904
+ || !Number.isSafeInteger(receipt.requestCount)
1905
+ || receipt.requestCount <= 0
1906
+ || !SHA256.test(receipt.responseDigestSetDigest ?? '')
1907
+ || !SHA256.test(receipt.executionEvidenceDigest ?? '')
1908
+ || receipt.fullNoSampleClosure !== true
1909
+ || receipt.genuineCrossProviderReview !== true
1910
+ || receipt.promotionEligible !== (receipt.aggregateVerdict === 'verified')
1911
+ || receipt.managedEvidence !== false
1912
+ || !SHA256.test(receipt.receiptDigest ?? '')
1913
+ || receipt.receiptDigest !== digest(genuineReceiptProjection(receipt))) {
1914
+ block('REVIEW_GENUINE_RECEIPT_INVALID', 'genuine review receipt identity or digest mismatches')
1915
+ }
1916
+ return true
1917
+ }
1918
+
1919
+ /**
1920
+ * Upgrade a portable structural closure to a genuine review receipt only after
1921
+ * the exact capability selection, runtime certification, response identity,
1922
+ * and every ordered provider invocation are revalidated. This does not rewrite
1923
+ * the structural completion and cannot be used to claim managed execution.
1924
+ */
1925
+ export function buildGenuineCrossProviderReviewReceipt({
1926
+ structuralCompletion,
1927
+ exchangeSchedule,
1928
+ executionEvidence,
1929
+ selectionReceipt,
1930
+ registry,
1931
+ capabilityRegistry,
1932
+ capabilityCertificationLedger,
1933
+ invocationRegistry,
1934
+ modelReleaseRegistry,
1935
+ entitlementAvailability,
1936
+ capabilityEvidenceBytes,
1937
+ runtimeCertificationLedger,
1938
+ runtimeTarget,
1939
+ expectedGitTree,
1940
+ now = new Date(),
1941
+ } = {}) {
1942
+ object(structuralCompletion, 'REVIEW_GENUINE_TRANSITION_BLOCKED', 'structural completion')
1943
+ object(exchangeSchedule, 'REVIEW_GENUINE_TRANSITION_BLOCKED', 'exchange schedule')
1944
+ validateReviewCapabilitySelectionReceipt(selectionReceipt)
1945
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
1946
+ block('REVIEW_TIME_INVALID', 'genuine review transition clock is invalid')
1947
+ }
1948
+ const selected = selectionReceipt.selected
1949
+ verifyReviewCapabilitySelection({
1950
+ receipt: selectionReceipt,
1951
+ registry,
1952
+ capabilityRegistry,
1953
+ capabilityCertificationLedger,
1954
+ invocationRegistry,
1955
+ modelReleaseRegistry,
1956
+ skill: selectionReceipt.skill,
1957
+ selfProviderId: selectionReceipt.selfProviderId,
1958
+ authorProviderId: selectionReceipt.authorProviderId,
1959
+ requiredEntitlementId: selectionReceipt.requiredEntitlementId,
1960
+ entitlementAvailability,
1961
+ observedProviderId: selected.providerId,
1962
+ observedReviewProfileId: selected.reviewProfileId,
1963
+ observedModelReleaseId: selected.modelReleaseId,
1964
+ observedResponseModelId: selected.requestModelId,
1965
+ now,
1966
+ })
1967
+ const capabilityRecords = capabilityCertificationRecords(capabilityCertificationLedger)
1968
+ const capabilityMatches = capabilityRecords.filter((record) => (
1969
+ record.id === selected.capabilityCertificationId
1970
+ ))
1971
+ if (capabilityMatches.length !== 1
1972
+ || digest(capabilityMatches[0]) !== selectionReceipt.selectedCapabilityCertificationDigest) {
1973
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'selected capability certification is absent or substituted')
1974
+ }
1975
+ const capabilityRecord = capabilityMatches[0]
1976
+ const capabilityBytes = evidenceBytes(capabilityEvidenceBytes)
1977
+ if (contentSha256(capabilityBytes) !== capabilityRecord.evidence.sha256
1978
+ || capabilityRecord.evidence.reference
1979
+ !== `infra/governance/evidence/review-capability/${capabilityRecord.evidence.sha256}.json`) {
1980
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'capability evidence content binding mismatches')
1981
+ }
1982
+ let capabilityEvidence
1983
+ try {
1984
+ capabilityEvidence = JSON.parse(capabilityBytes.toString('utf8'))
1985
+ } catch {
1986
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'capability evidence is invalid JSON')
1987
+ }
1988
+ if (capabilityEvidence?.schemaVersion !== 1
1989
+ || capabilityEvidence.kind !== 'provider-neutral-review-capability-certification-evidence'
1990
+ || capabilityEvidence.evidenceDigest
1991
+ !== digest(reviewCapabilityEvidenceProjection(capabilityEvidence))
1992
+ || capabilityEvidence.certificationId !== capabilityRecord.id
1993
+ || capabilityEvidence.reviewProfileId !== selected.reviewProfileId
1994
+ || capabilityEvidence.reviewProfileDigest !== selectionReceipt.selectedProfileDigest
1995
+ || capabilityEvidence.providerId !== selected.providerId
1996
+ || capabilityEvidence.invocationProfileId !== selected.invocationProfileId
1997
+ || capabilityEvidence.modelReleaseId !== selected.modelReleaseId
1998
+ || capabilityEvidence.requestModelId !== selected.requestModelId
1999
+ || capabilityEvidence.capability?.assuranceTier !== selected.assuranceTier
2000
+ || capabilityEvidence.capability?.reasoningTier !== selected.reasoningTier
2001
+ || capabilityEvidence.capability?.computeTier !== selected.computeTier) {
2002
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'capability evidence is stale or substituted')
2003
+ }
2004
+ const certifiedBudget = capabilityEvidence.capability?.exchangeBudget
2005
+ if (!certifiedBudget
2006
+ || exchangeSchedule.capabilityBudget?.capabilityCertificationId
2007
+ !== capabilityRecord.id
2008
+ || exchangeSchedule.capabilityBudget?.selectedCapabilityCertificationDigest
2009
+ !== selectionReceipt.selectedCapabilityCertificationDigest
2010
+ || exchangeSchedule.capabilityBudget?.maxInputBytes !== certifiedBudget.maxInputBytes
2011
+ || exchangeSchedule.capabilityBudget?.maxOutputBytes !== certifiedBudget.maxOutputBytes
2012
+ || exchangeSchedule.capabilityBudget?.maxPayloadBytes !== certifiedBudget.maxPayloadBytes
2013
+ || exchangeSchedule.capabilityBudgetDigest
2014
+ !== exchangeSchedule.capabilityBudget.capabilityBudgetDigest) {
2015
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'exchange schedule is detached from the certified capability budget')
2016
+ }
2017
+ const invocationProfile = invocationProfileById(
2018
+ invocationRegistry,
2019
+ selected.invocationProfileId,
2020
+ )
2021
+ const runtimeBinding = capabilityEvidence.runtimeBinding
2022
+ const runtimeCertification = verifyExactProviderCertification({
2023
+ certificationLedger: runtimeCertificationLedger,
2024
+ compatibilityProviderId: invocationProfile.availabilityEvidence.compatibilityProviderId,
2025
+ runtimeProviderId: selected.providerId,
2026
+ runtimeProfileId: invocationProfile.availabilityEvidence.runtimeProfileId,
2027
+ runtimeKind: invocationProfile.availabilityEvidence.runtimeKind,
2028
+ surface: invocationProfile.availabilityEvidence.surface,
2029
+ repositoryRole: invocationProfile.availabilityEvidence.repositoryRole,
2030
+ target: runtimeTarget,
2031
+ expectedGitTree,
2032
+ now,
2033
+ requireEvidence: true,
2034
+ })
2035
+ if (runtimeBinding?.runtimeProviderId !== runtimeCertification.runtimeProviderId
2036
+ || runtimeBinding.runtimeProfileId !== invocationProfile.availabilityEvidence.runtimeProfileId
2037
+ || runtimeBinding.runtimeKind !== runtimeCertification.runtimeKind
2038
+ || runtimeBinding.surface !== runtimeCertification.surface
2039
+ || runtimeBinding.repositoryRole !== runtimeCertification.repositoryRole
2040
+ || runtimeBinding.certificationId !== runtimeCertification.certificationId
2041
+ || runtimeBinding.certificationDigest !== runtimeCertification.recordDigest
2042
+ || runtimeBinding.targetDigest !== runtimeCertification.targetDigest) {
2043
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'runtime certification is detached from the capability evidence')
2044
+ }
2045
+ const { completionDigest, ...structuralProjection } = structuralCompletion
2046
+ if (structuralCompletion.evidenceKind
2047
+ !== 'deep-audit-model-broker-review-graph-exchange-completion'
2048
+ || completionDigest !== digest(structuralProjection)
2049
+ || structuralCompletion.exchangeScheduleDigest
2050
+ !== exchangeSchedule.exchangeScheduleDigest
2051
+ || structuralCompletion.requestCount !== exchangeSchedule.requestCount
2052
+ || !['verified', 'findings', 'unverifiable']
2053
+ .includes(structuralCompletion.aggregateVerdict)
2054
+ || !SHA256.test(structuralCompletion.taskRootVerdictSetDigest ?? '')
2055
+ || structuralCompletion.taskRootVerdictSetDigest
2056
+ !== digest(structuralCompletion.taskRootVerdicts)
2057
+ || structuralCompletion.fullNoSampleClosure !== true
2058
+ || structuralCompletion.structuralOnly !== true
2059
+ || structuralCompletion.genuineCrossProviderReview !== false
2060
+ || structuralCompletion.promotionEligible !== false
2061
+ || structuralCompletion.managedEvidence !== false
2062
+ || exchangeSchedule.fullRegisteredReview !== true
2063
+ || exchangeSchedule.sampling !== false
2064
+ || exchangeSchedule.structuralOnly !== true
2065
+ || exchangeSchedule.genuineCrossProviderReview !== false
2066
+ || exchangeSchedule.reviewIdentity?.selectionDigest !== selectionReceipt.selectionDigest) {
2067
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'structural completion/schedule is incomplete, stale, or overclaimed')
2068
+ }
2069
+ if (!Array.isArray(executionEvidence)
2070
+ || executionEvidence.length !== exchangeSchedule.requestCount) {
2071
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'execution evidence is partial')
2072
+ }
2073
+ const responseRows = []
2074
+ const providerRunIds = new Set()
2075
+ for (const [ordinal, row] of executionEvidence.entries()) {
2076
+ const planned = exchangeSchedule.requests[ordinal]
2077
+ exactObjectKeys(row, [
2078
+ 'requestOrdinal',
2079
+ 'requestDigest',
2080
+ 'carrierDigest',
2081
+ 'providerRunId',
2082
+ 'responseSha256',
2083
+ 'observedProviderId',
2084
+ 'observedReviewProfileId',
2085
+ 'observedInvocationProfileId',
2086
+ 'observedModelReleaseId',
2087
+ 'observedResponseModelId',
2088
+ 'runtimeCertificationId',
2089
+ 'runtimeCertificationDigest',
2090
+ 'runtimeTargetDigest',
2091
+ 'runtimeExecutableAuthorityDigest',
2092
+ 'runtimeExecutableBindingDigest',
2093
+ 'executionBindingDigest',
2094
+ 'authReadbackDigest',
2095
+ 'versionReadbackDigest',
2096
+ 'isolationPathClass',
2097
+ 'repositoryMounted',
2098
+ ], 'REVIEW_GENUINE_TRANSITION_BLOCKED', `execution evidence ${ordinal}`)
2099
+ if (!planned
2100
+ || row.requestOrdinal !== ordinal
2101
+ || row.requestDigest !== planned.requestDigest
2102
+ || !SHA256.test(row.carrierDigest ?? '')
2103
+ || !nonEmpty(row.providerRunId, 'REVIEW_GENUINE_TRANSITION_BLOCKED', `execution evidence ${ordinal}.providerRunId`)
2104
+ || providerRunIds.has(row.providerRunId)
2105
+ || !SHA256.test(row.responseSha256 ?? '')
2106
+ || row.observedProviderId !== selected.providerId
2107
+ || row.observedReviewProfileId !== selected.reviewProfileId
2108
+ || row.observedInvocationProfileId !== selected.invocationProfileId
2109
+ || row.observedModelReleaseId !== selected.modelReleaseId
2110
+ || row.observedResponseModelId !== selected.requestModelId
2111
+ || row.runtimeCertificationId !== runtimeCertification.certificationId
2112
+ || row.runtimeCertificationDigest !== runtimeCertification.recordDigest
2113
+ || row.runtimeTargetDigest !== runtimeCertification.targetDigest
2114
+ || row.runtimeExecutableAuthorityDigest
2115
+ !== runtimeBinding.runtimeExecutableAuthorityDigest
2116
+ || !SHA256.test(row.runtimeExecutableBindingDigest ?? '')
2117
+ || !SHA256.test(row.executionBindingDigest ?? '')
2118
+ || !SHA256.test(row.authReadbackDigest ?? '')
2119
+ || !SHA256.test(row.versionReadbackDigest ?? '')
2120
+ || !['no-space', 'contains-space'].includes(row.isolationPathClass)
2121
+ || row.repositoryMounted !== false
2122
+ || row.executionBindingDigest !== digest({
2123
+ schemaVersion: 1,
2124
+ kind: 'provider-neutral-external-entitlement-execution-binding',
2125
+ runtimeExecutableAuthorityDigest: row.runtimeExecutableAuthorityDigest,
2126
+ runtimeExecutableBindingDigest: row.runtimeExecutableBindingDigest,
2127
+ certifiedRuntimeTargetDigest: row.runtimeTargetDigest,
2128
+ authReadbackDigest: row.authReadbackDigest,
2129
+ versionReadbackDigest: row.versionReadbackDigest,
2130
+ isolationPathClass: row.isolationPathClass,
2131
+ repositoryMounted: row.repositoryMounted,
2132
+ })) {
2133
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', `execution evidence is missing, duplicate, reordered, or substituted:${ordinal}`)
2134
+ }
2135
+ providerRunIds.add(row.providerRunId)
2136
+ responseRows.push({
2137
+ requestDigest: row.requestDigest,
2138
+ carrierDigest: row.carrierDigest,
2139
+ providerRunId: row.providerRunId,
2140
+ responseSha256: row.responseSha256,
2141
+ })
2142
+ }
2143
+ const responseDigestSetDigest = digest(responseRows)
2144
+ if (responseDigestSetDigest !== structuralCompletion.responseDigestSetDigest) {
2145
+ block('REVIEW_GENUINE_TRANSITION_BLOCKED', 'execution response closure differs from the structural completion')
2146
+ }
2147
+ const executionEvidenceDigest = digest(executionEvidence)
2148
+ const projection = {
2149
+ schemaVersion: 1,
2150
+ kind: 'provider-neutral-genuine-cross-provider-review-receipt',
2151
+ protocol: exchangeSchedule.protocol,
2152
+ exchangeCore: PORTABLE_REVIEW_EXCHANGE_CORE,
2153
+ assurance: 'exact-runtime-and-capability-attested',
2154
+ authorProviderId: selectionReceipt.authorProviderId,
2155
+ reviewerProviderId: selected.providerId,
2156
+ reviewProfileId: selected.reviewProfileId,
2157
+ invocationProfileId: selected.invocationProfileId,
2158
+ modelReleaseId: selected.modelReleaseId,
2159
+ requestModelId: selected.requestModelId,
2160
+ observedResponseModelId: selected.requestModelId,
2161
+ selectionDigest: selectionReceipt.selectionDigest,
2162
+ capabilityCertificationId: capabilityRecord.id,
2163
+ capabilityCertificationDigest: digest(capabilityRecord),
2164
+ capabilityEvidenceDigest: capabilityEvidence.evidenceDigest,
2165
+ runtimeCertificationId: runtimeCertification.certificationId,
2166
+ runtimeCertificationDigest: runtimeCertification.recordDigest,
2167
+ runtimeTargetDigest: runtimeCertification.targetDigest,
2168
+ structuralCompletionDigest: completionDigest,
2169
+ exchangeScheduleDigest: exchangeSchedule.exchangeScheduleDigest,
2170
+ capabilityBudgetDigest: exchangeSchedule.capabilityBudgetDigest,
2171
+ aggregateVerdict: structuralCompletion.aggregateVerdict,
2172
+ taskRootVerdictSetDigest: structuralCompletion.taskRootVerdictSetDigest,
2173
+ requestCount: exchangeSchedule.requestCount,
2174
+ responseDigestSetDigest,
2175
+ executionEvidenceDigest,
2176
+ fullNoSampleClosure: true,
2177
+ genuineCrossProviderReview: true,
2178
+ promotionEligible: structuralCompletion.aggregateVerdict === 'verified',
2179
+ managedEvidence: false,
2180
+ }
2181
+ const receipt = { ...projection, receiptDigest: digest(projection) }
2182
+ validateGenuineCrossProviderReviewReceipt(receipt)
2183
+ return receipt
2184
+ }
2185
+
2186
+ export function projectProviderReviewBindings({
2187
+ registry,
2188
+ compatibilityMatrix,
2189
+ certificationLedger,
2190
+ skill = 'independent-review',
2191
+ repositoryRole = 'product-consumer',
2192
+ } = {}) {
2193
+ object(registry, 'REVIEW_REGISTRY_INVALID', 'provider registry')
2194
+ const providers = (registry.providers || []).filter((provider) => provider?.adapter?.generate)
2195
+ const bindings = providers.map((provider) => {
2196
+ const resolved = resolveProviderReviewBinding({
2197
+ registry,
2198
+ skill,
2199
+ selfProviderId: provider.id,
2200
+ requireCertificationContract: true,
2201
+ })
2202
+ return {
2203
+ selfProviderId: provider.id,
2204
+ selectionPolicy: resolved.binding.selectionPolicy,
2205
+ reviewClass: resolved.binding.reviewClass,
2206
+ requiredAssuranceTier: resolved.reviewClassPolicy.assuranceTier,
2207
+ requiredReasoningTier: resolved.reviewClassPolicy.reasoningTier,
2208
+ requiredComputeTier: resolved.reviewClassPolicy.computeTier,
2209
+ transport: resolved.transport,
2210
+ invocation: resolved.invocation,
2211
+ certificationContract: resolved.certificationContract,
2212
+ bindingDigest: resolved.bindingDigest,
2213
+ }
2214
+ }).sort((left, right) => compareUtf8Bytes(left.selfProviderId, right.selfProviderId))
2215
+ const providerCompatibility = (registry.providers || [])
2216
+ .filter((provider) => provider?.providerKind === 'concrete-runtime')
2217
+ .map((provider) => ({
2218
+ providerId: provider.id,
2219
+ compatibilityProviderId: compatibilityProviderIdForAdapter(compatibilityMatrix, provider.id),
2220
+ }))
2221
+ .sort((left, right) => compareUtf8Bytes(left.providerId, right.providerId))
2222
+ const compatibilityIds = new Set(providerCompatibility.map((binding) => binding.compatibilityProviderId))
2223
+ const certifications = certificationRecords(certificationLedger)
2224
+ .filter((record) => compatibilityIds.has(record.provider) && record.repositoryRole === repositoryRole)
2225
+ .sort((left, right) => compareUtf8Bytes(left.id, right.id))
2226
+ return {
2227
+ schemaVersion: 2,
2228
+ kind: 'provider-neutral-independent-review-projection',
2229
+ skill,
2230
+ repositoryRole,
2231
+ certificationContract: EXACT_REVIEW_CERTIFICATION_CONTRACT,
2232
+ bindings,
2233
+ providerCompatibility,
2234
+ certifications,
2235
+ projectionDigest: digest({ skill, repositoryRole, bindings, providerCompatibility, certifications }),
2236
+ }
2237
+ }
2238
+
2239
+ export function resolveProjectedReviewRequest({
2240
+ projection,
2241
+ selectionReceipt,
2242
+ registry,
2243
+ capabilityRegistry,
2244
+ capabilityCertificationLedger,
2245
+ invocationRegistry,
2246
+ modelReleaseRegistry,
2247
+ selfProviderId,
2248
+ authorProviderId = selfProviderId,
2249
+ runtimeKind,
2250
+ surface,
2251
+ repositoryRole,
2252
+ target,
2253
+ requiredEntitlementId = null,
2254
+ entitlementAvailability = [],
2255
+ now = new Date(),
2256
+ requireEvidence = true,
2257
+ } = {}) {
2258
+ object(projection, 'REVIEW_PROJECTION_INVALID', 'independent review projection')
2259
+ if (projection.schemaVersion !== 2 || projection.kind !== 'provider-neutral-independent-review-projection') {
2260
+ block('REVIEW_PROJECTION_INVALID', 'independent review projection identity is invalid')
2261
+ }
2262
+ if (projection.skill !== 'independent-review' || typeof projection.repositoryRole !== 'string') {
2263
+ block('REVIEW_PROJECTION_INVALID', 'independent review projection role or skill is invalid')
2264
+ }
2265
+ if (projection.projectionDigest !== digest({
2266
+ skill: projection.skill,
2267
+ repositoryRole: projection.repositoryRole,
2268
+ bindings: projection.bindings,
2269
+ providerCompatibility: projection.providerCompatibility,
2270
+ certifications: projection.certifications,
2271
+ })) block('REVIEW_PROJECTION_TAMPERED', 'independent review projection digest mismatches')
2272
+ if (projection.certificationContract !== EXACT_REVIEW_CERTIFICATION_CONTRACT) {
2273
+ block('REVIEW_CERTIFICATION_CONTRACT_UNAVAILABLE', 'projection certification contract is missing or stale')
2274
+ }
2275
+ if (repositoryRole !== projection.repositoryRole) {
2276
+ block('REVIEW_ROLE_MISMATCH', `${repositoryRole ?? '<missing>'}/${projection.repositoryRole}`)
2277
+ }
2278
+ if (authorProviderId !== selfProviderId) block('REVIEW_AUTHOR_COLLISION', `${authorProviderId ?? '<missing>'}/${selfProviderId ?? '<missing>'}`)
2279
+ const bindings = (projection.bindings || []).filter((binding) => binding?.selfProviderId === selfProviderId)
2280
+ if (bindings.length !== 1) block('REVIEW_BINDING_UNAVAILABLE', `${projection.skill}/${selfProviderId ?? '<missing>'}`)
2281
+ const binding = bindings[0]
2282
+ if (binding.certificationContract !== EXACT_REVIEW_CERTIFICATION_CONTRACT) {
2283
+ block('REVIEW_CERTIFICATION_CONTRACT_UNAVAILABLE', `${projection.skill}/${selfProviderId}`)
2284
+ }
2285
+ if (selectionReceipt === null || selectionReceipt === undefined) {
2286
+ return {
2287
+ skill: projection.skill,
2288
+ authorProviderId,
2289
+ currentProviderId: selfProviderId,
2290
+ peerProviderId: null,
2291
+ reviewProfileId: null,
2292
+ modelReleaseId: null,
2293
+ requestModelId: null,
2294
+ selectionDigest: null,
2295
+ selectionPolicy: binding.selectionPolicy,
2296
+ reviewClass: binding.reviewClass,
2297
+ requiredAssuranceTier: binding.requiredAssuranceTier,
2298
+ requiredReasoningTier: binding.requiredReasoningTier,
2299
+ requiredComputeTier: binding.requiredComputeTier,
2300
+ selectionStatus: 'REVIEW-BLOCKED',
2301
+ selectionReasonCode: 'REVIEW_CAPABILITY_SELECTION_REQUIRED',
2302
+ transport: binding.transport,
2303
+ invocation: binding.invocation,
2304
+ certificationContract: binding.certificationContract,
2305
+ bindingDigest: binding.bindingDigest,
2306
+ certification: null,
2307
+ }
2308
+ }
2309
+ if (binding.selectionPolicy !== selectionReceipt?.selectionPolicy
2310
+ || binding.reviewClass !== selectionReceipt?.reviewClass
2311
+ || binding.requiredAssuranceTier !== selectionReceipt?.requiredAssuranceTier
2312
+ || binding.requiredReasoningTier !== selectionReceipt?.requiredReasoningTier
2313
+ || binding.requiredComputeTier !== selectionReceipt?.requiredComputeTier
2314
+ || binding.bindingDigest !== selectionReceipt?.bindingDigest) {
2315
+ block('REVIEW_SELECTION_BINDING_MISMATCH', `${projection.skill}/${selfProviderId}`)
2316
+ }
2317
+ verifyReviewCapabilitySelection({
2318
+ receipt: selectionReceipt,
2319
+ registry,
2320
+ capabilityRegistry,
2321
+ capabilityCertificationLedger,
2322
+ invocationRegistry,
2323
+ modelReleaseRegistry,
2324
+ skill: projection.skill,
2325
+ selfProviderId,
2326
+ authorProviderId,
2327
+ requiredEntitlementId,
2328
+ entitlementAvailability,
2329
+ observedProviderId: selectionReceipt.selected?.providerId,
2330
+ observedReviewProfileId: selectionReceipt.selected?.reviewProfileId,
2331
+ observedModelReleaseId: selectionReceipt.selected?.modelReleaseId,
2332
+ observedResponseModelId: selectionReceipt.selected?.requestModelId,
2333
+ now,
2334
+ })
2335
+ if (selectionReceipt.selfProviderId !== selfProviderId
2336
+ || selectionReceipt.authorProviderId !== authorProviderId
2337
+ || selectionReceipt.skill !== projection.skill) {
2338
+ block('REVIEW_SELECTION_BINDING_MISMATCH', `${projection.skill}/${selfProviderId}`)
2339
+ }
2340
+ const compatibility = (projection.providerCompatibility || [])
2341
+ .filter((entry) => entry?.providerId === selectionReceipt.selected.providerId)
2342
+ if (compatibility.length !== 1) block('REVIEW_COMPATIBILITY_UNAVAILABLE', selectionReceipt.selected.providerId)
2343
+ nonEmpty(binding.transport, 'REVIEW_TRANSPORT_UNAVAILABLE', `${projection.skill}/${selfProviderId} transport`)
2344
+ const certification = verifyExactProviderCertification({
2345
+ certificationLedger: projection.certifications,
2346
+ compatibilityProviderId: compatibility[0].compatibilityProviderId,
2347
+ runtimeProviderId: selectionReceipt.selected.providerId,
2348
+ runtimeKind,
2349
+ surface,
2350
+ repositoryRole,
2351
+ target,
2352
+ now,
2353
+ requireEvidence,
2354
+ })
2355
+ return {
2356
+ skill: projection.skill,
2357
+ authorProviderId,
2358
+ currentProviderId: selfProviderId,
2359
+ peerProviderId: selectionReceipt.selected.providerId,
2360
+ reviewProfileId: selectionReceipt.selected.reviewProfileId,
2361
+ modelReleaseId: selectionReceipt.selected.modelReleaseId,
2362
+ requestModelId: selectionReceipt.selected.requestModelId,
2363
+ selectionDigest: selectionReceipt.selectionDigest,
2364
+ selectionPolicy: selectionReceipt.selectionPolicy,
2365
+ reviewClass: selectionReceipt.reviewClass,
2366
+ requiredAssuranceTier: selectionReceipt.requiredAssuranceTier,
2367
+ requiredReasoningTier: selectionReceipt.requiredReasoningTier,
2368
+ requiredComputeTier: selectionReceipt.requiredComputeTier,
2369
+ selectionStatus: 'selected',
2370
+ selectionReasonCode: null,
2371
+ transport: binding.transport,
2372
+ invocation: binding.invocation,
2373
+ certificationContract: binding.certificationContract,
2374
+ bindingDigest: binding.bindingDigest,
2375
+ certification,
2376
+ }
2377
+ }