rcf-lite 0.27.0 → 0.28.1

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 (601) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +19 -0
  3. package/bin/rcf.js +2 -0
  4. package/blueprints/application-account-settings/CHANGELOG.md +35 -6
  5. package/blueprints/application-account-settings/README.md +1 -1
  6. package/blueprints/application-account-settings/blueprint.json +4 -2
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
  8. package/blueprints/application-account-settings/contributions/probes/probe-utils.mjs +177 -0
  9. package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs +67 -0
  10. package/blueprints/application-account-settings/contributions/probes/run-profile-form-autocomplete.mjs +5 -0
  11. package/blueprints/application-account-settings/contributions/probes/run-sessions-adapter-uniform.mjs +5 -0
  12. package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs +5 -0
  13. package/blueprints/application-account-settings/contributions/probes/run-shell-tablist-per-capability.mjs +5 -0
  14. package/blueprints/application-account-settings/contributions/probes/run-theme-radiogroup.mjs +5 -0
  15. package/blueprints/application-account-settings/contributions/probes/sessions-adapter-uniform.mjs +130 -0
  16. package/blueprints/application-account-settings/contributions/probes/sessions-surface-shape.mjs +70 -0
  17. package/blueprints/application-account-settings/contributions/probes/shell-tablist-per-capability.mjs +60 -0
  18. package/blueprints/application-account-settings/contributions/probes/theme-radiogroup.mjs +126 -0
  19. package/blueprints/application-admin-console/CHANGELOG.md +32 -6
  20. package/blueprints/application-admin-console/README.md +1 -1
  21. package/blueprints/application-admin-console/blueprint.json +4 -2
  22. package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +1 -1
  23. package/blueprints/application-admin-console/contributions/probes/audit-log-surface.mjs +79 -0
  24. package/blueprints/application-admin-console/contributions/probes/org-switcher-surface.mjs +83 -0
  25. package/blueprints/application-admin-console/contributions/probes/permission-matrix-grid.mjs +67 -0
  26. package/blueprints/application-admin-console/contributions/probes/probe-utils.mjs +177 -0
  27. package/blueprints/application-admin-console/contributions/probes/run-audit-log-surface.mjs +5 -0
  28. package/blueprints/application-admin-console/contributions/probes/run-org-switcher-surface.mjs +5 -0
  29. package/blueprints/application-admin-console/contributions/probes/run-permission-matrix-grid.mjs +5 -0
  30. package/blueprints/application-admin-console/contributions/probes/run-sign-in-access-gated-surface.mjs +5 -0
  31. package/blueprints/application-admin-console/contributions/probes/run-users-directory-surface.mjs +5 -0
  32. package/blueprints/application-admin-console/contributions/probes/sign-in-access-gated-surface.mjs +117 -0
  33. package/blueprints/application-admin-console/contributions/probes/users-directory-surface.mjs +145 -0
  34. package/blueprints/application-api-rest/CHANGELOG.md +16 -8
  35. package/blueprints/application-api-rest/README.md +3 -3
  36. package/blueprints/application-api-rest/blueprint.json +3 -2
  37. package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +1 -1
  38. package/blueprints/application-api-rest/contributions/probes/cursor-pagination-round-trip.mjs +154 -0
  39. package/blueprints/application-api-rest/contributions/probes/health-probes-distinct.mjs +124 -0
  40. package/blueprints/application-api-rest/contributions/probes/probe-utils.mjs +177 -0
  41. package/blueprints/application-api-rest/contributions/probes/problem-details-on-error.mjs +77 -0
  42. package/blueprints/application-api-rest/contributions/probes/request-id-echoed.mjs +76 -0
  43. package/blueprints/application-api-rest/contributions/probes/run-cursor-pagination-round-trip.mjs +5 -0
  44. package/blueprints/application-api-rest/contributions/probes/run-health-probes-distinct.mjs +5 -0
  45. package/blueprints/application-api-rest/contributions/probes/run-problem-details-on-error.mjs +5 -0
  46. package/blueprints/application-api-rest/contributions/probes/run-request-id-echoed.mjs +5 -0
  47. package/blueprints/application-api-rest/docs/topics.md +1 -1
  48. package/blueprints/application-charts/CHANGELOG.md +35 -9
  49. package/blueprints/application-charts/README.md +6 -6
  50. package/blueprints/application-charts/blueprint.json +5 -3
  51. package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +1 -1
  52. package/blueprints/application-charts/contributions/probes/keyboard-traversal.mjs +151 -0
  53. package/blueprints/application-charts/contributions/probes/non-colour-distinction.mjs +67 -0
  54. package/blueprints/application-charts/contributions/probes/probe-utils.mjs +177 -0
  55. package/blueprints/application-charts/contributions/probes/run-keyboard-traversal.mjs +5 -0
  56. package/blueprints/application-charts/contributions/probes/run-non-colour-distinction.mjs +5 -0
  57. package/blueprints/application-charts/contributions/probes/run-text-alternative-table.mjs +5 -0
  58. package/blueprints/application-charts/contributions/probes/text-alternative-table.mjs +139 -0
  59. package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +1 -1
  60. package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +1 -1
  61. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +5 -5
  62. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +1 -1
  63. package/blueprints/application-charts/guide/application-charts.md +1 -1
  64. package/blueprints/application-dashboard/CHANGELOG.md +20 -10
  65. package/blueprints/application-dashboard/README.md +6 -6
  66. package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
  67. package/blueprints/application-dashboard/blueprint.json +3 -2
  68. package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +1 -1
  69. package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +1 -1
  70. package/blueprints/application-dashboard/contributions/probes/export-handle-formats.mjs +75 -0
  71. package/blueprints/application-dashboard/contributions/probes/four-tile-states.mjs +75 -0
  72. package/blueprints/application-dashboard/contributions/probes/primary-kpi-top-left.mjs +58 -0
  73. package/blueprints/application-dashboard/contributions/probes/probe-utils.mjs +177 -0
  74. package/blueprints/application-dashboard/contributions/probes/run-export-handle-formats.mjs +4 -0
  75. package/blueprints/application-dashboard/contributions/probes/run-four-tile-states.mjs +4 -0
  76. package/blueprints/application-dashboard/contributions/probes/run-primary-kpi-top-left.mjs +4 -0
  77. package/blueprints/application-dashboard/contributions/probes/run-shell-five-regions.mjs +4 -0
  78. package/blueprints/application-dashboard/contributions/probes/shell-five-regions.mjs +93 -0
  79. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +1 -1
  80. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +1 -1
  81. package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +1 -1
  82. package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +2 -2
  83. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +2 -2
  84. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +2 -2
  85. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +1 -1
  86. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +1 -1
  87. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +1 -1
  88. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +2 -2
  89. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +5 -5
  90. package/blueprints/application-dashboard/docs/topics.md +2 -2
  91. package/blueprints/application-dashboard/guide/application-dashboard.md +2 -2
  92. package/blueprints/application-datatable/CHANGELOG.md +19 -9
  93. package/blueprints/application-datatable/README.md +2 -2
  94. package/blueprints/application-datatable/blueprint.json +3 -2
  95. package/blueprints/application-datatable/contributions/probes/apg-table-shape.mjs +57 -0
  96. package/blueprints/application-datatable/contributions/probes/four-states-regions.mjs +80 -0
  97. package/blueprints/application-datatable/contributions/probes/probe-utils.mjs +177 -0
  98. package/blueprints/application-datatable/contributions/probes/run-apg-table-shape.mjs +4 -0
  99. package/blueprints/application-datatable/contributions/probes/run-four-states-regions.mjs +4 -0
  100. package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs +4 -0
  101. package/blueprints/application-datatable/contributions/probes/run-sort-adapter-round-trip.mjs +4 -0
  102. package/blueprints/application-datatable/contributions/probes/search-adapter-round-trip.mjs +58 -0
  103. package/blueprints/application-datatable/contributions/probes/sort-adapter-round-trip.mjs +60 -0
  104. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +1 -1
  105. package/blueprints/application-datatable/docs/topics.md +1 -1
  106. package/blueprints/application-empty-error-states/CHANGELOG.md +33 -3
  107. package/blueprints/application-empty-error-states/blueprint.json +4 -2
  108. package/blueprints/application-empty-error-states/contributions/probes/empty-list-and-no-search.mjs +66 -0
  109. package/blueprints/application-empty-error-states/contributions/probes/error-boundary-alert.mjs +65 -0
  110. package/blueprints/application-empty-error-states/contributions/probes/forbidden-and-server-error.mjs +167 -0
  111. package/blueprints/application-empty-error-states/contributions/probes/not-found-and-recovery.mjs +61 -0
  112. package/blueprints/application-empty-error-states/contributions/probes/permission-denied-and-offline.mjs +155 -0
  113. package/blueprints/application-empty-error-states/contributions/probes/probe-utils.mjs +177 -0
  114. package/blueprints/application-empty-error-states/contributions/probes/run-empty-list-and-no-search.mjs +5 -0
  115. package/blueprints/application-empty-error-states/contributions/probes/run-error-boundary-alert.mjs +5 -0
  116. package/blueprints/application-empty-error-states/contributions/probes/run-forbidden-and-server-error.mjs +5 -0
  117. package/blueprints/application-empty-error-states/contributions/probes/run-not-found-and-recovery.mjs +5 -0
  118. package/blueprints/application-empty-error-states/contributions/probes/run-permission-denied-and-offline.mjs +5 -0
  119. package/blueprints/application-error-handling/CHANGELOG.md +45 -6
  120. package/blueprints/application-error-handling/blueprint.json +3 -2
  121. package/blueprints/application-error-handling/contributions/probes/category-vocabulary.mjs +90 -0
  122. package/blueprints/application-error-handling/contributions/probes/probe-utils.mjs +177 -0
  123. package/blueprints/application-error-handling/contributions/probes/record-shape-adr-1701.mjs +78 -0
  124. package/blueprints/application-error-handling/contributions/probes/run-category-vocabulary.mjs +5 -0
  125. package/blueprints/application-error-handling/contributions/probes/run-record-shape-adr-1701.mjs +5 -0
  126. package/blueprints/application-error-handling/contributions/probes/run-two-boundaries-registered.mjs +5 -0
  127. package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs +343 -0
  128. package/blueprints/application-file-upload/CHANGELOG.md +28 -6
  129. package/blueprints/application-file-upload/README.md +1 -1
  130. package/blueprints/application-file-upload/blueprint.json +3 -2
  131. package/blueprints/application-file-upload/contributions/probes/assertive-completion-slot.mjs +78 -0
  132. package/blueprints/application-file-upload/contributions/probes/chunked-transport-endpoints.mjs +173 -0
  133. package/blueprints/application-file-upload/contributions/probes/per-file-progressbar.mjs +124 -0
  134. package/blueprints/application-file-upload/contributions/probes/probe-utils.mjs +177 -0
  135. package/blueprints/application-file-upload/contributions/probes/run-assertive-completion-slot.mjs +4 -0
  136. package/blueprints/application-file-upload/contributions/probes/run-chunked-transport-endpoints.mjs +4 -0
  137. package/blueprints/application-file-upload/contributions/probes/run-per-file-progressbar.mjs +4 -0
  138. package/blueprints/application-file-upload/contributions/probes/run-upload-surface-shape.mjs +4 -0
  139. package/blueprints/application-file-upload/contributions/probes/upload-surface-shape.mjs +55 -0
  140. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +1 -1
  141. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +1 -1
  142. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +1 -1
  143. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +1 -1
  144. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +1 -1
  145. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +1 -1
  146. package/blueprints/application-forms-wizard/CHANGELOG.md +20 -6
  147. package/blueprints/application-forms-wizard/README.md +2 -2
  148. package/blueprints/application-forms-wizard/blueprint.json +3 -2
  149. package/blueprints/application-forms-wizard/contributions/probes/draft-persistence-round-trip.mjs +110 -0
  150. package/blueprints/application-forms-wizard/contributions/probes/probe-utils.mjs +177 -0
  151. package/blueprints/application-forms-wizard/contributions/probes/run-draft-persistence-round-trip.mjs +4 -0
  152. package/blueprints/application-forms-wizard/contributions/probes/run-step-page-shape.mjs +4 -0
  153. package/blueprints/application-forms-wizard/contributions/probes/run-task-list-surface.mjs +4 -0
  154. package/blueprints/application-forms-wizard/contributions/probes/step-page-shape.mjs +61 -0
  155. package/blueprints/application-forms-wizard/contributions/probes/task-list-surface.mjs +109 -0
  156. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +1 -1
  157. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +1 -1
  158. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +1 -1
  159. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +1 -1
  160. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +1 -1
  161. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +1 -1
  162. package/blueprints/application-notifications-in-app/CHANGELOG.md +38 -5
  163. package/blueprints/application-notifications-in-app/README.md +4 -4
  164. package/blueprints/application-notifications-in-app/blueprint.json +4 -2
  165. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +1 -1
  166. package/blueprints/application-notifications-in-app/contributions/probes/centre-acknowledge-round-trip.mjs +210 -0
  167. package/blueprints/application-notifications-in-app/contributions/probes/live-region-preseeding.mjs +93 -0
  168. package/blueprints/application-notifications-in-app/contributions/probes/probe-utils.mjs +177 -0
  169. package/blueprints/application-notifications-in-app/contributions/probes/run-centre-acknowledge-round-trip.mjs +5 -0
  170. package/blueprints/application-notifications-in-app/contributions/probes/run-live-region-preseeding.mjs +5 -0
  171. package/blueprints/application-notifications-in-app/contributions/probes/run-toast-contract.mjs +5 -0
  172. package/blueprints/application-notifications-in-app/contributions/probes/toast-contract.mjs +92 -0
  173. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +3 -3
  174. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +1 -1
  175. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +1 -1
  176. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +1 -1
  177. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +1 -1
  178. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +1 -1
  179. package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +3 -3
  180. package/blueprints/application-onboarding-tour/CHANGELOG.md +31 -5
  181. package/blueprints/application-onboarding-tour/README.md +1 -1
  182. package/blueprints/application-onboarding-tour/blueprint.json +5 -3
  183. package/blueprints/application-onboarding-tour/contributions/probes/checklist-anchor-open.mjs +81 -0
  184. package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs +159 -0
  185. package/blueprints/application-onboarding-tour/contributions/probes/first-run-detection.mjs +67 -0
  186. package/blueprints/application-onboarding-tour/contributions/probes/probe-utils.mjs +177 -0
  187. package/blueprints/application-onboarding-tour/contributions/probes/run-checklist-anchor-open.mjs +5 -0
  188. package/blueprints/application-onboarding-tour/contributions/probes/run-completion-persistence.mjs +5 -0
  189. package/blueprints/application-onboarding-tour/contributions/probes/run-first-run-detection.mjs +5 -0
  190. package/blueprints/application-onboarding-tour/contributions/probes/run-stepper-role-dialog.mjs +5 -0
  191. package/blueprints/application-onboarding-tour/contributions/probes/stepper-role-dialog.mjs +45 -0
  192. package/blueprints/application-spa/CHANGELOG.md +20 -11
  193. package/blueprints/application-spa/README.md +9 -10
  194. package/blueprints/application-spa/blueprint.json +3 -2
  195. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
  196. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
  197. package/blueprints/application-spa/contributions/probes/designed-empty-state.mjs +72 -0
  198. package/blueprints/application-spa/contributions/probes/probe-utils.mjs +177 -0
  199. package/blueprints/application-spa/contributions/probes/route-inventory-published.mjs +185 -0
  200. package/blueprints/application-spa/contributions/probes/run-designed-empty-state.mjs +5 -0
  201. package/blueprints/application-spa/contributions/probes/run-route-inventory-published.mjs +5 -0
  202. package/blueprints/application-spa/contributions/probes/run-shell-nav-present.mjs +5 -0
  203. package/blueprints/application-spa/contributions/probes/shell-nav-present.mjs +69 -0
  204. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +1 -1
  205. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +2 -2
  206. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +3 -3
  207. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +2 -2
  208. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +2 -2
  209. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +1 -1
  210. package/blueprints/application-spa/docs/topics.md +1 -1
  211. package/blueprints/delivery-ci-workflows/CHANGELOG.md +31 -11
  212. package/blueprints/delivery-ci-workflows/README.md +3 -3
  213. package/blueprints/delivery-ci-workflows/blueprint.json +3 -2
  214. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +2 -2
  215. package/blueprints/delivery-ci-workflows/contributions/probes/node-gate-entrypoint.mjs +76 -0
  216. package/blueprints/delivery-ci-workflows/contributions/probes/probe-utils.mjs +56 -0
  217. package/blueprints/delivery-ci-workflows/contributions/probes/real-account-github-actions-run-record.mjs +139 -0
  218. package/blueprints/delivery-ci-workflows/contributions/probes/run-node-gate-entrypoint.mjs +3 -0
  219. package/blueprints/delivery-ci-workflows/contributions/probes/run-real-account-github-actions-run-record.mjs +3 -0
  220. package/blueprints/delivery-ci-workflows/contributions/probes/run-workflow-template-shape.mjs +3 -0
  221. package/blueprints/delivery-ci-workflows/contributions/probes/workflow-template-shape.mjs +94 -0
  222. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +1 -1
  223. package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
  224. package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +4 -4
  225. package/blueprints/deploy-cloudflare-workers/README.md +3 -3
  226. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +2 -2
  227. package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
  228. package/blueprints/deploy-hetzner-server/CHANGELOG.md +98 -7
  229. package/blueprints/deploy-hetzner-server/blueprint.json +7 -6
  230. package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +46 -21
  231. package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +344 -83
  232. package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +211 -42
  233. package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +140 -22
  234. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +111 -30
  235. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +158 -30
  236. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +154 -32
  237. package/blueprints/edge-cloudflare-access/CHANGELOG.md +6 -5
  238. package/blueprints/edge-cloudflare-access/blueprint.json +1 -1
  239. package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
  240. package/blueprints/edge-cloudflare-access/docs/topics.md +1 -1
  241. package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +4 -7
  242. package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
  243. package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +4 -6
  244. package/blueprints/edge-cloudflare-tunnel/README.md +1 -2
  245. package/blueprints/edge-cloudflare-tunnel/docs/topics.md +1 -1
  246. package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +2 -3
  247. package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
  248. package/blueprints/email-smtp-resend/CHANGELOG.md +24 -8
  249. package/blueprints/email-smtp-resend/README.md +2 -2
  250. package/blueprints/email-smtp-resend/blueprint.json +3 -2
  251. package/blueprints/email-smtp-resend/contributions/probes/probe-utils.mjs +50 -0
  252. package/blueprints/email-smtp-resend/contributions/probes/real-account-resend-send.mjs +50 -0
  253. package/blueprints/email-smtp-resend/contributions/probes/run-real-account-resend-send.mjs +3 -0
  254. package/blueprints/email-smtp-resend/contributions/probes/run-smtp-round-trip.mjs +3 -0
  255. package/blueprints/email-smtp-resend/contributions/probes/run-unverified-sender-refusal.mjs +3 -0
  256. package/blueprints/email-smtp-resend/contributions/probes/smtp-round-trip.mjs +43 -0
  257. package/blueprints/email-smtp-resend/contributions/probes/unverified-sender-refusal.mjs +99 -0
  258. package/blueprints/email-smtp-resend/docs/topics.md +2 -3
  259. package/blueprints/jobs-background/CHANGELOG.md +66 -5
  260. package/blueprints/jobs-background/README.md +2 -2
  261. package/blueprints/jobs-background/blueprint.json +3 -2
  262. package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +38 -10
  263. package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +28 -6
  264. package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +16 -2
  265. package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +102 -21
  266. package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +10 -2
  267. package/blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs +355 -0
  268. package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +33 -2
  269. package/blueprints/jobs-background/contributions/probes/run-retry-and-fail-real-account.mjs +12 -0
  270. package/blueprints/jobs-background/docs/topics.md +1 -1
  271. package/blueprints/jobs-background/guide/jobs-background.md +1 -1
  272. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +25 -19
  273. package/blueprints/messaging-queue-cloudflare/README.md +12 -12
  274. package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
  275. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +2 -2
  276. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +1 -1
  277. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +180 -12
  278. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +1 -1
  279. package/blueprints/messaging-queue-cloudflare/docs/topics.md +2 -2
  280. package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +2 -2
  281. package/blueprints/object-storage-s3/CHANGELOG.md +75 -4
  282. package/blueprints/object-storage-s3/blueprint.json +3 -2
  283. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +73 -12
  284. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +55 -7
  285. package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +102 -18
  286. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +105 -36
  287. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +104 -55
  288. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +129 -7
  289. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +80 -18
  290. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +291 -37
  291. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +8 -2
  292. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +5 -5
  293. package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +8 -5
  294. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +8 -2
  295. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +8 -2
  296. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +6 -3
  297. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +10 -2
  298. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +1 -1
  299. package/blueprints/object-storage-s3/docs/topics.md +1 -1
  300. package/blueprints/object-storage-s3/guide/object-storage-s3.md +1 -1
  301. package/blueprints/observability-essentials/CHANGELOG.md +23 -7
  302. package/blueprints/observability-essentials/README.md +2 -2
  303. package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +1 -1
  304. package/blueprints/observability-essentials/blueprint.json +3 -2
  305. package/blueprints/observability-essentials/contributions/probes/liveness-probe.mjs +84 -0
  306. package/blueprints/observability-essentials/contributions/probes/metrics-endpoint.mjs +96 -0
  307. package/blueprints/observability-essentials/contributions/probes/probe-utils.mjs +52 -0
  308. package/blueprints/observability-essentials/contributions/probes/readiness-probe.mjs +171 -0
  309. package/blueprints/observability-essentials/contributions/probes/run-liveness-probe.mjs +3 -0
  310. package/blueprints/observability-essentials/contributions/probes/run-metrics-endpoint.mjs +3 -0
  311. package/blueprints/observability-essentials/contributions/probes/run-readiness-probe.mjs +3 -0
  312. package/blueprints/observability-essentials/docs/topics.md +2 -3
  313. package/blueprints/observability-logging/CHANGELOG.md +29 -4
  314. package/blueprints/observability-logging/README.md +2 -2
  315. package/blueprints/observability-logging/blueprint.json +3 -2
  316. package/blueprints/observability-logging/contributions/probes/correlation-id-flow.mjs +173 -0
  317. package/blueprints/observability-logging/contributions/probes/line-shape-and-fields.mjs +82 -0
  318. package/blueprints/observability-logging/contributions/probes/probe-utils.mjs +47 -0
  319. package/blueprints/observability-logging/contributions/probes/redaction-boundary.mjs +130 -0
  320. package/blueprints/observability-logging/contributions/probes/run-correlation-id-flow.mjs +3 -0
  321. package/blueprints/observability-logging/contributions/probes/run-line-shape-and-fields.mjs +3 -0
  322. package/blueprints/observability-logging/contributions/probes/run-redaction-boundary.mjs +3 -0
  323. package/blueprints/observability-probe-endpoints/CHANGELOG.md +23 -8
  324. package/blueprints/observability-probe-endpoints/README.md +3 -3
  325. package/blueprints/observability-probe-endpoints/blueprint.json +3 -2
  326. package/blueprints/observability-probe-endpoints/contributions/probes/kubernetes-startup-enabled.mjs +80 -0
  327. package/blueprints/observability-probe-endpoints/contributions/probes/partial-profile-refusal.mjs +101 -0
  328. package/blueprints/observability-probe-endpoints/contributions/probes/probe-utils.mjs +49 -0
  329. package/blueprints/observability-probe-endpoints/contributions/probes/profile-boot-materialisation.mjs +69 -0
  330. package/blueprints/observability-probe-endpoints/contributions/probes/run-kubernetes-startup-enabled.mjs +3 -0
  331. package/blueprints/observability-probe-endpoints/contributions/probes/run-partial-profile-refusal.mjs +3 -0
  332. package/blueprints/observability-probe-endpoints/contributions/probes/run-profile-boot-materialisation.mjs +3 -0
  333. package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
  334. package/blueprints/persistence-data-d1/CHANGELOG.md +16 -3
  335. package/blueprints/persistence-data-d1/README.md +2 -2
  336. package/blueprints/persistence-data-d1/blueprint.json +3 -2
  337. package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +1 -1
  338. package/blueprints/persistence-data-d1/contributions/probes/facade-round-trip.mjs +140 -0
  339. package/blueprints/persistence-data-d1/contributions/probes/migrations-forward-only.mjs +66 -0
  340. package/blueprints/persistence-data-d1/contributions/probes/probe-utils.mjs +51 -0
  341. package/blueprints/persistence-data-d1/contributions/probes/real-account-d1-round-trip.mjs +133 -0
  342. package/blueprints/persistence-data-d1/contributions/probes/run-facade-round-trip.mjs +3 -0
  343. package/blueprints/persistence-data-d1/contributions/probes/run-migrations-forward-only.mjs +3 -0
  344. package/blueprints/persistence-data-d1/contributions/probes/run-real-account-d1-round-trip.mjs +3 -0
  345. package/blueprints/persistence-data-d1/docs/topics.md +2 -3
  346. package/blueprints/persistence-data-postgres/CHANGELOG.md +84 -4
  347. package/blueprints/persistence-data-postgres/README.md +2 -2
  348. package/blueprints/persistence-data-postgres/blueprint.json +3 -2
  349. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
  350. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +87 -12
  351. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +245 -19
  352. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +109 -26
  353. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +151 -38
  354. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +24 -6
  355. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +261 -48
  356. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +76 -20
  357. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +1 -1
  358. package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
  359. package/blueprints/persistence-data-sqlite/CHANGELOG.md +16 -2
  360. package/blueprints/persistence-data-sqlite/README.md +2 -2
  361. package/blueprints/persistence-data-sqlite/blueprint.json +3 -2
  362. package/blueprints/persistence-data-sqlite/contributions/probes/boot-open-migrate.mjs +90 -0
  363. package/blueprints/persistence-data-sqlite/contributions/probes/facade-round-trip.mjs +82 -0
  364. package/blueprints/persistence-data-sqlite/contributions/probes/probe-utils.mjs +83 -0
  365. package/blueprints/persistence-data-sqlite/contributions/probes/run-boot-open-migrate.mjs +5 -0
  366. package/blueprints/persistence-data-sqlite/contributions/probes/run-facade-round-trip.mjs +5 -0
  367. package/blueprints/persistence-data-sqlite/contributions/probes/run-wal-checkpoint.mjs +5 -0
  368. package/blueprints/persistence-data-sqlite/contributions/probes/wal-checkpoint.mjs +137 -0
  369. package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
  370. package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +5 -5
  371. package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
  372. package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +1 -1
  373. package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +6 -10
  374. package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +1 -1
  375. package/blueprints/platform-cloudflare-kv/CHANGELOG.md +16 -12
  376. package/blueprints/platform-cloudflare-kv/README.md +2 -4
  377. package/blueprints/platform-cloudflare-kv/blueprint.json +2 -2
  378. package/blueprints/platform-cloudflare-kv/docs/topics.md +1 -1
  379. package/blueprints/platform-docker-compose-host/CHANGELOG.md +92 -5
  380. package/blueprints/platform-docker-compose-host/blueprint.json +2 -2
  381. package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +116 -29
  382. package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +181 -109
  383. package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +146 -26
  384. package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +238 -24
  385. package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +207 -21
  386. package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +246 -42
  387. package/blueprints/platform-docker-compose-host/docs/topics.md +1 -1
  388. package/blueprints/security-auth-clerk/CHANGELOG.md +18 -6
  389. package/blueprints/security-auth-clerk/README.md +3 -3
  390. package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
  391. package/blueprints/security-auth-clerk/blueprint.json +3 -2
  392. package/blueprints/security-auth-clerk/contributions/probes/hosted-identity-ui-config.mjs +61 -0
  393. package/blueprints/security-auth-clerk/contributions/probes/probe-utils.mjs +188 -0
  394. package/blueprints/security-auth-clerk/contributions/probes/real-account-principal-directory-round-trip.mjs +216 -0
  395. package/blueprints/security-auth-clerk/contributions/probes/real-account-session-inventory.mjs +260 -0
  396. package/blueprints/security-auth-clerk/contributions/probes/role-model-adapter.mjs +53 -0
  397. package/blueprints/security-auth-clerk/contributions/probes/run-hosted-identity-ui-config.mjs +4 -0
  398. package/blueprints/security-auth-clerk/contributions/probes/run-real-account-principal-directory-round-trip.mjs +4 -0
  399. package/blueprints/security-auth-clerk/contributions/probes/run-real-account-session-inventory.mjs +4 -0
  400. package/blueprints/security-auth-clerk/contributions/probes/run-role-model-adapter.mjs +4 -0
  401. package/blueprints/security-auth-clerk/docs/topics.md +2 -3
  402. package/blueprints/security-auth-keycloak/CHANGELOG.md +18 -7
  403. package/blueprints/security-auth-keycloak/README.md +2 -2
  404. package/blueprints/security-auth-keycloak/blueprint.json +3 -2
  405. package/blueprints/security-auth-keycloak/contributions/probes/discovery-shape.mjs +68 -0
  406. package/blueprints/security-auth-keycloak/contributions/probes/introspection-shape.mjs +88 -0
  407. package/blueprints/security-auth-keycloak/contributions/probes/jwt-verifier-shape.mjs +86 -0
  408. package/blueprints/security-auth-keycloak/contributions/probes/probe-utils.mjs +180 -0
  409. package/blueprints/security-auth-keycloak/contributions/probes/real-account-realm-round-trip.mjs +91 -0
  410. package/blueprints/security-auth-keycloak/contributions/probes/role-adapter-shape.mjs +69 -0
  411. package/blueprints/security-auth-keycloak/contributions/probes/run-discovery-shape.mjs +4 -0
  412. package/blueprints/security-auth-keycloak/contributions/probes/run-introspection-shape.mjs +4 -0
  413. package/blueprints/security-auth-keycloak/contributions/probes/run-jwt-verifier-shape.mjs +4 -0
  414. package/blueprints/security-auth-keycloak/contributions/probes/run-real-account-realm-round-trip.mjs +4 -0
  415. package/blueprints/security-auth-keycloak/contributions/probes/run-role-adapter-shape.mjs +4 -0
  416. package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
  417. package/blueprints/security-auth-magic-link/CHANGELOG.md +15 -4
  418. package/blueprints/security-auth-magic-link/README.md +2 -2
  419. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +1 -1
  420. package/blueprints/security-auth-magic-link/blueprint.json +3 -2
  421. package/blueprints/security-auth-magic-link/contributions/probes/probe-utils.mjs +174 -0
  422. package/blueprints/security-auth-magic-link/contributions/probes/real-account-magic-link-send.mjs +139 -0
  423. package/blueprints/security-auth-magic-link/contributions/probes/run-real-account-magic-link-send.mjs +4 -0
  424. package/blueprints/security-auth-magic-link/contributions/probes/run-token-entropy-shape.mjs +4 -0
  425. package/blueprints/security-auth-magic-link/contributions/probes/run-token-issue-verify.mjs +4 -0
  426. package/blueprints/security-auth-magic-link/contributions/probes/token-entropy-shape.mjs +60 -0
  427. package/blueprints/security-auth-magic-link/contributions/probes/token-issue-verify.mjs +90 -0
  428. package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
  429. package/blueprints/security-auth-oauth2/CHANGELOG.md +16 -5
  430. package/blueprints/security-auth-oauth2/README.md +2 -2
  431. package/blueprints/security-auth-oauth2/blueprint.json +3 -2
  432. package/blueprints/security-auth-oauth2/contributions/probes/authorisation-code-flow-shape.mjs +259 -0
  433. package/blueprints/security-auth-oauth2/contributions/probes/pkce-challenge-shape.mjs +58 -0
  434. package/blueprints/security-auth-oauth2/contributions/probes/probe-utils.mjs +190 -0
  435. package/blueprints/security-auth-oauth2/contributions/probes/provider-adapter-shape.mjs +64 -0
  436. package/blueprints/security-auth-oauth2/contributions/probes/real-account-authorisation-code-flow.mjs +93 -0
  437. package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs +4 -0
  438. package/blueprints/security-auth-oauth2/contributions/probes/run-pkce-challenge-shape.mjs +4 -0
  439. package/blueprints/security-auth-oauth2/contributions/probes/run-provider-adapter-shape.mjs +4 -0
  440. package/blueprints/security-auth-oauth2/contributions/probes/run-real-account-authorisation-code-flow.mjs +4 -0
  441. package/blueprints/security-auth-oauth2/contributions/probes/run-session-bridge-shape.mjs +4 -0
  442. package/blueprints/security-auth-oauth2/contributions/probes/session-bridge-shape.mjs +78 -0
  443. package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
  444. package/blueprints/security-secrets-management/CHANGELOG.md +15 -4
  445. package/blueprints/security-secrets-management/README.md +2 -2
  446. package/blueprints/security-secrets-management/blueprint.json +3 -2
  447. package/blueprints/security-secrets-management/contributions/probes/add-recipient-rotation.mjs +107 -0
  448. package/blueprints/security-secrets-management/contributions/probes/encrypt-decrypt-round-trip.mjs +122 -0
  449. package/blueprints/security-secrets-management/contributions/probes/key-rotation.mjs +93 -0
  450. package/blueprints/security-secrets-management/contributions/probes/mismatched-key-refusal.mjs +74 -0
  451. package/blueprints/security-secrets-management/contributions/probes/probe-utils.mjs +214 -0
  452. package/blueprints/security-secrets-management/contributions/probes/run-add-recipient-rotation.mjs +4 -0
  453. package/blueprints/security-secrets-management/contributions/probes/run-encrypt-decrypt-round-trip.mjs +4 -0
  454. package/blueprints/security-secrets-management/contributions/probes/run-key-rotation.mjs +4 -0
  455. package/blueprints/security-secrets-management/contributions/probes/run-mismatched-key-refusal.mjs +4 -0
  456. package/blueprints/security-secrets-management/docs/topics.md +2 -3
  457. package/fixtures/canary-manifest.json +9 -9
  458. package/guidance/harness-template.md +25 -0
  459. package/guidance/managed/agent-instructions-block.hash +1 -1
  460. package/guidance/managed/agent-instructions-block.md +25 -0
  461. package/package.json +2 -2
  462. package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
  463. package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
  464. package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
  465. package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
  466. package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
  467. package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
  468. package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
  469. package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
  470. package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
  471. package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
  472. package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
  473. package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
  474. package/rcf/code-nodes/cn-600.json +46 -0
  475. package/rcf/code-nodes/cn-601.json +18 -0
  476. package/rcf/code-nodes/cn-602.json +16 -0
  477. package/rcf/code-nodes/cn-603.json +12 -0
  478. package/rcf/code-nodes/cn-604.json +14 -0
  479. package/rcf/code-nodes/cn-605.json +18 -0
  480. package/rcf/code-nodes/cn-606.json +12 -0
  481. package/rcf/code-nodes/cn-607.json +12 -0
  482. package/rcf/code-nodes/cn-608.json +14 -0
  483. package/rcf/code-nodes/cn-609.json +17 -0
  484. package/rcf/code-nodes/cn-620.json +18 -0
  485. package/rcf/code-nodes/cn-621.json +14 -0
  486. package/rcf/code-nodes/cn-622.json +15 -0
  487. package/rcf/code-nodes/cn-623.json +16 -0
  488. package/rcf/code-nodes/cn-624.json +14 -0
  489. package/rcf/code-nodes/cn-625.json +15 -0
  490. package/rcf/code-nodes/cn-626.json +13 -0
  491. package/rcf/code-nodes/cn-627.json +13 -0
  492. package/rcf/code-nodes/cn-628.json +14 -0
  493. package/rcf/code-nodes/cn-629.json +12 -0
  494. package/rcf/code-nodes/cn-630.json +12 -0
  495. package/rcf/code-nodes/cn-631.json +13 -0
  496. package/rcf/code-nodes/cn-632.json +13 -0
  497. package/rcf/fbs/fbs-180.json +45 -0
  498. package/rcf/fbs/fbs-181.json +46 -0
  499. package/rcf/fbs/fbs-182.json +43 -0
  500. package/rcf/fbs/fbs-183.json +50 -0
  501. package/rcf/fbs/fbs-184.json +49 -0
  502. package/rcf/fbs/fbs-185.json +34 -0
  503. package/rcf/fbs/fbs-186.json +16 -0
  504. package/rcf/fbs/fbs-187.json +17 -0
  505. package/rcf/fbs/fbs-188.json +17 -0
  506. package/rcf/fbs/fbs-189.json +17 -0
  507. package/rcf/requirements/req-155.json +13 -0
  508. package/rcf/requirements/req-156.json +13 -0
  509. package/rcf/requirements/req-157.json +13 -0
  510. package/rcf/requirements/req-158.json +13 -0
  511. package/rcf/requirements/req-159.json +13 -0
  512. package/rcf/requirements/req-160.json +13 -0
  513. package/rcf/requirements/req-161.json +13 -0
  514. package/rcf/requirements/req-162.json +13 -0
  515. package/rcf/requirements/req-163.json +13 -0
  516. package/rcf/requirements/req-164.json +13 -0
  517. package/rcf/requirements/req-165.json +13 -0
  518. package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
  519. package/rcf/tacs/tac-4102-feedback-store.json +50 -0
  520. package/rcf/tacs/tac-4103-feedback-redact.json +40 -0
  521. package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
  522. package/rcf/tacs/tac-4105-feedback-render.json +45 -0
  523. package/rcf/tacs/tac-4106-feedback-destination.json +40 -0
  524. package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
  525. package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
  526. package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
  527. package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
  528. package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
  529. package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
  530. package/rcf/test-suites/ts-140.json +9 -9
  531. package/rcf/test-suites/ts-150.json +9 -9
  532. package/rcf/test-suites/ts-185.json +54 -0
  533. package/rcf/test-suites/ts-186.json +58 -0
  534. package/rcf/test-suites/ts-187.json +44 -0
  535. package/rcf/test-suites/ts-188.json +174 -0
  536. package/rcf/test-suites/ts-189.json +60 -0
  537. package/rcf/test-suites/ts-190.json +30 -0
  538. package/rcf/test-suites/ts-191.json +51 -0
  539. package/rcf/test-suites/ts-192.json +37 -0
  540. package/rcf/test-suites/ts-193.json +60 -0
  541. package/rcf/test-suites/ts-194.json +67 -0
  542. package/rcf/test-suites/ts-195.json +52 -0
  543. package/rcf/test-suites/ts-196.json +58 -0
  544. package/rcf/test-suites/ts-197.json +66 -0
  545. package/rcf/test-suites/ts-198.json +87 -0
  546. package/rcf/test-suites/ts-199.json +51 -0
  547. package/rcf/test-suites/ts-200.json +30 -0
  548. package/rcf/test-suites/ts-201.json +38 -0
  549. package/rcf/test-suites/ts-202.json +38 -0
  550. package/rcf/test-suites/ts-203.json +38 -0
  551. package/rcf/user-stories/us-15501.json +60 -0
  552. package/rcf/user-stories/us-15502.json +33 -0
  553. package/rcf/user-stories/us-15503.json +33 -0
  554. package/rcf/user-stories/us-15601.json +60 -0
  555. package/rcf/user-stories/us-15701.json +42 -0
  556. package/rcf/user-stories/us-15801.json +51 -0
  557. package/rcf/user-stories/us-15802.json +33 -0
  558. package/rcf/user-stories/us-15901.json +33 -0
  559. package/rcf/user-stories/us-15902.json +51 -0
  560. package/rcf/user-stories/us-16001.json +51 -0
  561. package/rcf/user-stories/us-16101.json +42 -0
  562. package/rcf/user-stories/us-16102.json +33 -0
  563. package/rcf/user-stories/us-16103.json +42 -0
  564. package/rcf/user-stories/us-16104.json +42 -0
  565. package/rcf/user-stories/us-16201.json +33 -0
  566. package/rcf/user-stories/us-16301.json +36 -0
  567. package/rcf/user-stories/us-16401.json +45 -0
  568. package/rcf/user-stories/us-16501.json +45 -0
  569. package/rcf/user-stories/us-16502.json +45 -0
  570. package/releases/releases.yaml +21 -1
  571. package/src/blueprint/library-loader.js +48 -0
  572. package/src/blueprint/library-registry.js +13 -0
  573. package/src/browser-verify/pack-runner.js +7 -12
  574. package/src/build/mark.js +1 -1
  575. package/src/cli/blueprint-library.js +149 -0
  576. package/src/cli/coverage.js +49 -24
  577. package/src/cli/doctor.js +195 -7
  578. package/src/cli/feedback.js +2213 -0
  579. package/src/cli/finalise.js +158 -1
  580. package/src/cli/help.js +6 -0
  581. package/src/cli/init.js +63 -0
  582. package/src/cli/update.js +21 -1
  583. package/src/core/store/walker.js +33 -0
  584. package/src/core/store/writer.js +23 -0
  585. package/src/feedback/destination.js +455 -0
  586. package/src/feedback/fingerprint.js +132 -0
  587. package/src/feedback/gh.js +376 -0
  588. package/src/feedback/hook.js +183 -0
  589. package/src/feedback/labels.js +87 -0
  590. package/src/feedback/redact-allowlist.json +14 -0
  591. package/src/feedback/redact.js +1148 -0
  592. package/src/feedback/render.js +267 -0
  593. package/src/feedback/store.js +604 -0
  594. package/src/finalise/index.js +4 -0
  595. package/src/finalise/ingest.js +61 -0
  596. package/src/finalise/ship-without-eval.js +19 -7
  597. package/src/mcp/tools.js +8 -2
  598. package/src/setup/feedback-hooks.js +397 -0
  599. package/src/setup/managed-gitignore.js +3 -0
  600. package/src/view/html-page.js +5 -5
  601. package/src/view/style.css +2 -2
@@ -0,0 +1,75 @@
1
+ // export-handle-formats probe for application-dashboard v1.0.9.
2
+ //
3
+ // AC-19106-1 (server-observable half): the export handle region
4
+ // carries a labelled button with aria-haspopup="listbox" AND a
5
+ // role="listbox" enumerating the applied formats. The fixture
6
+ // accepts a startServer({ exportFormats: [...] }) override so the
7
+ // probe DRIVES two distinct format sets and asserts the rendered
8
+ // listbox follows the input on each run. Browser-observable
9
+ // activation and focus-return are covered by the conformanceOnly
10
+ // limitation on the single row.
11
+ //
12
+ // anchorAcId: application-dashboard-AC-19106-1.
13
+
14
+ import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
15
+
16
+ export const anchorReqId = 'application-dashboard-REQ-005';
17
+ export const accountBound = false;
18
+
19
+ async function driveOne(startServer, formatsInput) {
20
+ const started = await startServer({ port: 0, exportFormats: formatsInput });
21
+ const baseUrl = `http://127.0.0.1:${started.port}`;
22
+ const close = () => new Promise((res, rej) => started.server.close((e) => (e ? rej(e) : res())));
23
+ try {
24
+ const res = await fetch(`${baseUrl}/`);
25
+ const body = await res.text();
26
+ const exportRegion = body.match(/<section[^>]+data-region="export-handle"[^>]*>([\s\S]*?)<\/section>/);
27
+ const inner = exportRegion ? exportRegion[1] : '';
28
+ const hasBtn = /<button[^>]+aria-haspopup="listbox"[^>]*>/.test(inner);
29
+ const listbox = /<ul[^>]+role="listbox"[^>]*>/.test(inner);
30
+ const formats = Array.from(inner.matchAll(/data-export-format="([^"]+)"/g)).map((m) => m[1]);
31
+ const followsInput = formats.length === formatsInput.length
32
+ && formatsInput.every((f) => formats.includes(f))
33
+ && formats.every((f) => formatsInput.includes(f));
34
+ return { res, body, hasBtn, listbox, formats, followsInput, close };
35
+ } catch (e) {
36
+ try { await close(); }
37
+ catch (closeErr) { throw new AggregateError([e, closeErr], 'probe body threw and teardown also threw'); }
38
+ throw e;
39
+ }
40
+ }
41
+
42
+ export default async function runProbe() {
43
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
44
+
45
+ const results = [];
46
+ const shipped = ['csv', 'pdf', 'png-chart'];
47
+ const elicited = ['csv', 'xlsx', 'json', 'png-chart'];
48
+ const runA = await driveOne(startServer, shipped);
49
+ try {
50
+ const runB = await driveOne(startServer, elicited);
51
+ try {
52
+ const derived = runA.followsInput && runB.followsInput
53
+ && JSON.stringify(runA.formats) !== JSON.stringify(runB.formats);
54
+ const pass = runA.res.status === 200 && runB.res.status === 200 && runA.hasBtn && runA.listbox && runB.hasBtn && runB.listbox && derived;
55
+ results.push(conformanceOnlyResult({
56
+ anchorAcId: 'application-dashboard-AC-19106-1',
57
+ anchorReqId: 'application-dashboard-REQ-005',
58
+ verdict: pass ? 'pass' : 'fail',
59
+ detail: `Given a rendered dashboard surface, the export handle - drove two distinct format sets: runA=[${runA.formats.join(',')}] runB=[${runB.formats.join(',')}]; listbox follows input (${derived})`,
60
+ evidence: evidenceFromResponse({
61
+ route: '/',
62
+ response: runB.res,
63
+ bodyText: runB.body,
64
+ extraFields: {
65
+ input: { runA: shipped, runB: elicited },
66
+ derived: { runAFormats: runA.formats, runBFormats: runB.formats, followsInput: derived, hasButtonA: runA.hasBtn, hasButtonB: runB.hasBtn },
67
+ altBodyExcerpt: runA.body.slice(0, 240),
68
+ },
69
+ }),
70
+ limitation: 'application-dashboard-AC-19106-1: control activation and Escape/focus-return are browser-only',
71
+ }));
72
+ } finally { await runB.close(); }
73
+ } finally { await runA.close(); }
74
+ return { results };
75
+ }
@@ -0,0 +1,75 @@
1
+ // four-tile-states probe for application-dashboard v1.0.9.
2
+ //
3
+ // Verifies AC-19103-1: every tile state (loading, empty, error,
4
+ // populated) is rendered on each of two named tiles. The probe
5
+ // drives ?tile=primary&state=<state> AND ?tile=active-users&state=<state>
6
+ // so each state is observed on two tiles (the
7
+ // varied input is the state and tile id, the derived output is the
8
+ // state attribute and cue on the correct tile's region).
9
+ //
10
+ // anchorAcId: application-dashboard-AC-19103-1.
11
+
12
+ import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
13
+
14
+ export const anchorReqId = 'application-dashboard-REQ-003';
15
+ export const accountBound = false;
16
+
17
+ const STATES = ['loading', 'empty', 'error', 'populated'];
18
+ const TILES = ['primary', 'active-users'];
19
+
20
+ function assertTileState({ body, tileId, state }) {
21
+ const articleRe = new RegExp(`<article[^>]+data-tile-id="${tileId}"[^>]*>([\\s\\S]*?)<\/article>`);
22
+ const article = body.match(articleRe);
23
+ if (!article) return { present: false, reason: `no article for ${tileId}` };
24
+ const inner = article[1];
25
+ const wrapperRe = /<div[^>]+role="region"[^>]+aria-live="polite"[^>]+data-tile-state="([^"]+)"[^>]+aria-label="([^"]+)"[^>]*>/;
26
+ const wrap = inner.match(wrapperRe);
27
+ if (!wrap) return { present: false, reason: 'inner region missing role/aria-live/data-tile-state/aria-label' };
28
+ const cueRe = new RegExp(`data-state-cue="${state}"`);
29
+ const hasCue = cueRe.test(inner);
30
+ return {
31
+ present: true,
32
+ stateAttr: wrap[1],
33
+ accessibleName: wrap[2],
34
+ hasCue,
35
+ matches: wrap[1] === state,
36
+ };
37
+ }
38
+
39
+ export default async function runProbe() {
40
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
41
+ const fixture = await startFixture({ startServer, port: 0 });
42
+ try {
43
+ const results = [];
44
+ for (const tileId of TILES) {
45
+ for (const state of STATES) {
46
+ const res = await fetch(`${fixture.baseUrl}/?tile=${tileId}&state=${state}`);
47
+ const body = await res.text();
48
+ const observation = assertTileState({ body, tileId, state });
49
+ const pass = res.status === 200
50
+ && observation.present
51
+ && observation.matches
52
+ && observation.hasCue
53
+ && typeof observation.accessibleName === 'string' && observation.accessibleName.includes(state);
54
+ results.push({
55
+ anchorAcId: 'application-dashboard-AC-19103-1',
56
+ anchorReqId: 'application-dashboard-REQ-003',
57
+ verdict: pass ? 'pass' : 'fail',
58
+ detail: `Given a rendered tile in each of the - tile=${tileId} at state="${state}" carries role="region" aria-live="polite" data-tile-state="${observation.stateAttr}" data-state-cue="${state}" accessibleName="${observation.accessibleName}"`,
59
+ evidence: evidenceFromResponse({
60
+ route: `/?tile=${tileId}&state=${state}`,
61
+ response: res,
62
+ bodyText: body,
63
+ extraFields: {
64
+ input: { tileId, state },
65
+ derived: observation,
66
+ },
67
+ }),
68
+ });
69
+ }
70
+ }
71
+ return { results };
72
+ } finally {
73
+ await fixture.close();
74
+ }
75
+ }
@@ -0,0 +1,58 @@
1
+ // primary-kpi-top-left probe for application-dashboard v1.0.9.
2
+ //
3
+ // AC-19102-1 requires computed layout at 1440/1024/360 viewports;
4
+ // that observation is browser-only and recorded as notObservableHere
5
+ // per the browser-only rule. The server-observable half - primary tile
6
+ // first in DOM order, inline grid-column-start:1 AND grid-row-start:1,
7
+ // data-kpi-kind in the ADR-2001 enum - remains a real evidence row.
8
+ //
9
+ // anchorAcId: application-dashboard-AC-19102-1.
10
+
11
+ import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
12
+
13
+ export const anchorReqId = 'application-dashboard-REQ-002';
14
+ export const accountBound = false;
15
+
16
+ const KPI_ENUM = ['revenue', 'active-users', 'error-rate', 'throughput', 'custom'];
17
+
18
+ export default async function runProbe() {
19
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
20
+ const fixture = await startFixture({ startServer, port: 0 });
21
+ try {
22
+ const results = [];
23
+
24
+ const okRes = await fetch(`${fixture.baseUrl}/`);
25
+ const okBody = await okRes.text();
26
+ const tileRowMatch = okBody.match(/<section[^>]+data-region="tile-row"[^>]*>([\s\S]*?)<\/section>/);
27
+ const firstArticle = tileRowMatch ? tileRowMatch[1].match(/<article[^>]*>/) : null;
28
+ const firstAttrs = firstArticle ? firstArticle[0] : '';
29
+ const isPrimaryFirst = /data-tile-role="primary-kpi"/.test(firstAttrs);
30
+ const hasColumnStart = /grid-column-start:1/.test(firstAttrs);
31
+ const hasRowStart = /grid-row-start:1/.test(firstAttrs);
32
+ const kindMatch = firstAttrs.match(/data-kpi-kind="([^"]+)"/);
33
+ const kindValue = kindMatch ? kindMatch[1] : null;
34
+ const kindOk = kindValue !== null && KPI_ENUM.includes(kindValue);
35
+ const okPass = okRes.status === 200 && isPrimaryFirst && hasColumnStart && hasRowStart && kindOk;
36
+
37
+ results.push(conformanceOnlyResult({
38
+ anchorAcId: 'application-dashboard-AC-19102-1',
39
+ anchorReqId: 'application-dashboard-REQ-002',
40
+ verdict: okPass ? 'pass' : 'fail',
41
+ detail: `Given a rendered dashboard surface at each of - primary tile first in DOM order with inline grid-column-start:1, grid-row-start:1, data-kpi-kind="${kindValue}" (server-observable half of AC-19102-1)`,
42
+ evidence: evidenceFromResponse({
43
+ route: '/',
44
+ response: okRes,
45
+ bodyText: okBody,
46
+ extraFields: {
47
+ input: { adr2001Enum: KPI_ENUM },
48
+ derived: { firstArticleAttrs: firstAttrs.slice(0, 240), primaryFirst: isPrimaryFirst, colStart: hasColumnStart, rowStart: hasRowStart, kindValue },
49
+ },
50
+ }),
51
+ limitation: 'application-dashboard-AC-19102-1: computed CSS layout at 1440/1024/360 viewports is browser-only',
52
+ }));
53
+
54
+ return { results };
55
+ } finally {
56
+ await fixture.close();
57
+ }
58
+ }
@@ -0,0 +1,177 @@
1
+ // Shared helpers for application-dashboard probes.
2
+ //
3
+ // The engine under probe is the sample-app fixture at
4
+ // packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js. The
5
+ // fixture stamps an x-fixture-request-id header on every response as
6
+ // part of its own request pipeline (no probe-side monkey-patch), so
7
+ // the identifier the probe records is the identifier the engine
8
+ // itself issued. Probes call the fixture over real HTTP via node's
9
+ // fetch, vary inputs, assert derived outputs, and record the
10
+ // request-id, status, body excerpt, the varied input and the derived
11
+ // output as evidence on every result row.
12
+ // No account-bound branch: the engine is a local fixture, not a
13
+ // third-party account, so no CI_HAS_* gate is invented. Every env
14
+ // var this pack reads is declared on the fixture README.
15
+
16
+ import { mkdir, writeFile } from 'node:fs/promises';
17
+ import { dirname, resolve } from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+
20
+ const HERE = dirname(fileURLToPath(import.meta.url));
21
+ export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
22
+ export const FIXTURE_DIR = resolve(PROJECT_ROOT, 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard');
23
+ export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/application-dashboard');
24
+
25
+ export const DEFAULT_PORT = 0;
26
+
27
+ export function aggregate(results) {
28
+ if (!Array.isArray(results) || results.length === 0) return 'fail';
29
+ if (results.some((r) => r.verdict === 'fail')) return 'fail';
30
+ if (results.some((r) => r.verdict === 'warn')) return 'warn';
31
+ return 'pass';
32
+ }
33
+
34
+ // Empty results never pass: a synthesised row is emitted with an actionable detail and its
35
+ // own evidence object recording the empty condition so the row is
36
+ // not a naked verdict scalar.
37
+ export function normaliseResults(results) {
38
+ if (!Array.isArray(results) || results.length === 0) {
39
+ return [{
40
+ anchorReqId: 'unknown',
41
+ verdict: 'fail',
42
+ detail: 'no checks ran',
43
+ evidence: {
44
+ reason: 'empty-results',
45
+ route: 'n/a',
46
+ status: 0,
47
+ xFixtureRequestId: null,
48
+ bodyExcerpt: '',
49
+ },
50
+ }];
51
+ }
52
+ return results;
53
+ }
54
+
55
+ export async function writeReport({ probeName, engine, results, extra }) {
56
+ await mkdir(REPORT_DIR, { recursive: true });
57
+ const report = {
58
+ slug: 'application-dashboard',
59
+ probeName,
60
+ runAt: new Date().toISOString(),
61
+ engine,
62
+ results,
63
+ aggregateVerdict: aggregate(results),
64
+ ...(extra ?? {}),
65
+ };
66
+ const path = resolve(REPORT_DIR, `${probeName}.json`);
67
+ await writeFile(path, JSON.stringify(report, null, 2) + '\n', 'utf8');
68
+ return { report, path };
69
+ }
70
+
71
+ // Starts the fixture on an ephemeral port (or PROBE_PORT when set)
72
+ // and returns { server, port, baseUrl, close }. The close helper
73
+ // rejects when the underlying close callback carries an error;
74
+ // swallowing a teardown error would hide a boundary failure.
75
+ export async function startFixture({ startServer, port } = {}) {
76
+ const resolvedPort = typeof port === 'number'
77
+ ? port
78
+ : Number(process.env.PROBE_PORT ?? DEFAULT_PORT);
79
+ const started = await startServer({ port: resolvedPort });
80
+ return {
81
+ server: started.server,
82
+ port: started.port,
83
+ baseUrl: `http://127.0.0.1:${started.port}`,
84
+ close: () => new Promise((res, rej) => started.server.close((err) => {
85
+ if (err) rej(err);
86
+ else res();
87
+ })),
88
+ };
89
+ }
90
+
91
+ // Reads a distinctive slice of a response body: the first N chars
92
+ // so the report carries a body excerpt alongside the header id.
93
+ export function bodyExcerpt(text, max = 240) {
94
+ if (text == null) return '';
95
+ const s = typeof text === 'string' ? text : String(text);
96
+ return s.length > max ? s.slice(0, max) + '...' : s;
97
+ }
98
+
99
+ // Records the positive-evidence shape on a probe result. Every row
100
+ // carries route, status, the request id the fixture stamped, and a
101
+ // body excerpt; the caller may extend the object with the varied
102
+ // input and the derived output for that row.
103
+ export function evidenceFromResponse({ route, response, bodyText, extraFields }) {
104
+ return {
105
+ route,
106
+ status: response.status,
107
+ xFixtureRequestId: response.headers.get('x-fixture-request-id') || null,
108
+ bodyExcerpt: bodyExcerpt(bodyText),
109
+ ...(extraFields ?? {}),
110
+ };
111
+ }
112
+
113
+ export async function runShim(probeName, engine, mainFn) {
114
+ try {
115
+ const outcome = (await mainFn()) ?? { results: [] };
116
+ const { results, extra } = outcome;
117
+ const { report, path } = await writeReport({ probeName, engine, results: normaliseResults(results), extra });
118
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
119
+ process.stdout.write(`report written to ${path}\n`);
120
+ if (report.aggregateVerdict !== 'pass') process.exitCode = 1;
121
+ } catch (err) {
122
+ const results = [{
123
+ anchorReqId: 'unknown',
124
+ verdict: 'fail',
125
+ detail: `probe threw: ${err && err.message ? err.message : String(err)}`,
126
+ evidence: {
127
+ reason: 'probe-threw',
128
+ route: 'n/a',
129
+ status: 0,
130
+ xFixtureRequestId: null,
131
+ bodyExcerpt: err && err.stack ? String(err.stack).slice(0, 240) : '',
132
+ },
133
+ }];
134
+ const { report, path } = await writeReport({ probeName, engine, results });
135
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
136
+ process.stderr.write(`probe error: ${err && err.stack ? err.stack : String(err)}\n`);
137
+ process.stderr.write(`report written to ${path}\n`);
138
+ process.exitCode = 1;
139
+ }
140
+ }
141
+
142
+ // Browser-observable properties are AMBER on the shelf by ruling.
143
+ // A row that names such a property is recorded as notObservableHere
144
+ // carrying an object with the AC id and a reason; the tally script
145
+ // reads notObservableHere.ac to accept the row.
146
+ export function notObservableHereResult({ ac, anchorAcId, detail, reason, evidence } = {}) {
147
+ // A notObservableHere row anchors nothing else: no anchorAcId,
148
+ // no anchorReqId - only notObservableHere.ac.
149
+ const acId = ac || anchorAcId;
150
+ return {
151
+ verdict: 'pass',
152
+ notObservableHere: {
153
+ ac: acId,
154
+ reason: reason || 'not observable on server-side probe pack; needs a browser-driven runner',
155
+ },
156
+ detail: detail || 'not observable on server-side probe pack',
157
+ evidence: {
158
+ reason: reason || 'not observable here; needs a browser-driven probe runner',
159
+ ...(evidence || {}),
160
+ },
161
+ };
162
+ }
163
+
164
+ // A row that keeps a real observation but records that the
165
+ // observation only covers part of an AC uses conformanceOnly +
166
+ // limitation carrying the AC id and the property not observed.
167
+ export function conformanceOnlyResult({ anchorAcId, anchorReqId, verdict, detail, evidence, limitation }) {
168
+ return {
169
+ ...(anchorAcId ? { anchorAcId } : {}),
170
+ ...(anchorReqId ? { anchorReqId } : {}),
171
+ verdict: verdict || 'pass',
172
+ conformanceOnly: true,
173
+ limitation: limitation || 'browser-observable property not asserted from the server-side probe',
174
+ detail,
175
+ evidence,
176
+ };
177
+ }
@@ -0,0 +1,4 @@
1
+ import runProbe from './export-handle-formats.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
4
+ runShim('export-handle-formats', engine, runProbe);
@@ -0,0 +1,4 @@
1
+ import runProbe from './four-tile-states.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
4
+ runShim('four-tile-states', engine, runProbe);
@@ -0,0 +1,4 @@
1
+ import runProbe from './primary-kpi-top-left.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
4
+ runShim('primary-kpi-top-left', engine, runProbe);
@@ -0,0 +1,4 @@
1
+ import runProbe from './shell-five-regions.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-dashboard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js' };
4
+ runShim('shell-five-regions', engine, runProbe);
@@ -0,0 +1,93 @@
1
+ // shell-five-regions probe for application-dashboard v1.0.9.
2
+ //
3
+ // AC-19101-1: the DOM carries five labelled role="region" elements.
4
+ // The fixture accepts a startServer({ regions: [...] }) override, so
5
+ // the probe DRIVES two distinct region sets and asserts the
6
+ // rendered DOM follows each input (derived, not
7
+ // fixed inventory).
8
+ //
9
+ // anchorAcId: application-dashboard-AC-19101-1.
10
+
11
+ import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
12
+
13
+ const FULL_SET = ['tile-row', 'chart-region', 'filter-chrome', 'timeframe-picker', 'export-handle'];
14
+ const REDUCED_SET = ['tile-row', 'timeframe-picker', 'export-handle'];
15
+
16
+ function scrapeRegions(body) {
17
+ const sectionRe = /<section\b([^>]*)>/g;
18
+ const regions = [];
19
+ let match;
20
+ while ((match = sectionRe.exec(body)) !== null) {
21
+ const attrs = match[1];
22
+ if (!/role="region"/.test(attrs)) continue;
23
+ const labelMatch = attrs.match(/aria-label="([^"]+)"/);
24
+ const dataRegionMatch = attrs.match(/data-region="([^"]+)"/);
25
+ regions.push({
26
+ ariaLabel: labelMatch ? labelMatch[1] : null,
27
+ dataRegion: dataRegionMatch ? dataRegionMatch[1] : null,
28
+ });
29
+ }
30
+ return regions;
31
+ }
32
+
33
+ async function driveOne(startServer, regionsInput, expected) {
34
+ const fixture = await new Promise((resolve, reject) => {
35
+ startServer({ port: 0, regions: regionsInput }).then((started) => {
36
+ resolve({ server: started.server, port: started.port, baseUrl: `http://127.0.0.1:${started.port}`, close: () => new Promise((r, rj) => started.server.close((e) => (e ? rj(e) : r()))) });
37
+ }).catch(reject);
38
+ });
39
+ try {
40
+ const res = await fetch(`${fixture.baseUrl}/`);
41
+ const body = await res.text();
42
+ const regions = scrapeRegions(body);
43
+ const dataRegionsFound = regions.map((r) => r.dataRegion).filter(Boolean);
44
+ // Only count REAL known-content regions (skip shell-root wrapper if present).
45
+ const contentRegions = dataRegionsFound.filter((r) => r !== 'shell-root');
46
+ const matchesInput = contentRegions.length === expected.length
47
+ && expected.every((r) => contentRegions.includes(r))
48
+ && contentRegions.every((r) => expected.includes(r));
49
+ return { res, body, regions, dataRegionsFound, contentRegions, matchesInput, fixture };
50
+ } finally {
51
+ await fixture.close();
52
+ }
53
+ }
54
+
55
+ export const anchorReqId = 'application-dashboard-REQ-001';
56
+ export const accountBound = false;
57
+
58
+ export default async function runProbe() {
59
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/server.js');
60
+
61
+ const results = [];
62
+ const runFull = await driveOne(startServer, FULL_SET, FULL_SET);
63
+ const runReduced = await driveOne(startServer, REDUCED_SET, REDUCED_SET);
64
+ const derivedFromInput = runFull.matchesInput && runReduced.matchesInput
65
+ && JSON.stringify(runFull.contentRegions) !== JSON.stringify(runReduced.contentRegions);
66
+ const labelsUniqueFull = new Set(runFull.regions.map((r) => r.ariaLabel).filter(Boolean)).size === runFull.regions.length;
67
+ const allLabelledFull = runFull.regions.every((r) => typeof r.ariaLabel === 'string' && r.ariaLabel.length > 0);
68
+ const pass = runFull.res.status === 200 && runReduced.res.status === 200
69
+ && derivedFromInput && labelsUniqueFull && allLabelledFull && runFull.contentRegions.length === 5;
70
+
71
+ results.push({
72
+ anchorAcId: 'application-dashboard-AC-19101-1',
73
+ verdict: pass ? 'pass' : 'fail',
74
+ detail: `Given a rendered dashboard surface, the DOM carries - drove two distinct region sets: full=[${runFull.contentRegions.join(',')}] reduced=[${runReduced.contentRegions.join(',')}]; regions follow the input (${derivedFromInput}); five labels unique in the full run (${labelsUniqueFull})`,
75
+ evidence: evidenceFromResponse({
76
+ route: '/',
77
+ response: runFull.res,
78
+ bodyText: runFull.body,
79
+ extraFields: {
80
+ input: { runFull: FULL_SET, runReduced: REDUCED_SET },
81
+ derived: {
82
+ fullContentRegions: runFull.contentRegions,
83
+ reducedContentRegions: runReduced.contentRegions,
84
+ derivedFromInput,
85
+ fullLabelsUnique: labelsUniqueFull,
86
+ fullAllLabelled: allLabelledFull,
87
+ },
88
+ altBodyExcerpt: runReduced.body.slice(0, 240),
89
+ },
90
+ }),
91
+ });
92
+ return { results };
93
+ }
@@ -2,7 +2,7 @@
2
2
  "reqId": "application-dashboard-REQ-002",
3
3
  "prdId": "PRD-001",
4
4
  "title": "The primary KPI tile sits top-left in DOM order and in CSS Grid position across the ratified breakpoints",
5
- "description": "The tile row's primary KPI carries a top-left placement the reader reaches first, on the NN/g F-scan of the surface, at every ratified breakpoint (1440, 1024, 360). At 1440 and 1024 the primary KPI is the first tile in DOM order and its computed CSS Grid column-start is 1 and row-start is 1; at 360 the tile row reflows to one column and the primary KPI is the first tile in DOM order and its row-start is 1. The tile carries a `data-tile-role=\"primary-kpi\"` attribute and a `data-kpi-kind` attribute whose value is one of the ADR-2001 enum values (revenue, active-users, error-rate, throughput, custom). A dashboard that ships no primary KPI tile fails this REQ at project-side review; a dashboard whose primary KPI is not top-left at any of the three breakpoints fails the pack check AC-19102-1. When the elicited `primary-kpi-kind` is `custom` the tile also carries a `data-kpi-name` attribute whose value is the operator-elicited `primary-kpi-custom-name` short name.",
5
+ "description": "The tile row's primary KPI carries a top-left placement the reader reaches first, on the NN/g F-scan of the surface, at every shipped breakpoint (1440, 1024, 360). At 1440 and 1024 the primary KPI is the first tile in DOM order and its computed CSS Grid column-start is 1 and row-start is 1; at 360 the tile row reflows to one column and the primary KPI is the first tile in DOM order and its row-start is 1. The tile carries a `data-tile-role=\"primary-kpi\"` attribute and a `data-kpi-kind` attribute whose value is one of the ADR-2001 enum values (revenue, active-users, error-rate, throughput, custom). A dashboard that ships no primary KPI tile fails this REQ at project-side check; a dashboard whose primary KPI is not top-left at any of the three breakpoints fails the pack check AC-19102-1. When the elicited `primary-kpi-kind` is `custom` the tile also carries a `data-kpi-name` attribute whose value is the operator-elicited `primary-kpi-custom-name` short name.",
6
6
  "category": "functional",
7
7
  "domain": "application",
8
8
  "priority": "must",
@@ -2,7 +2,7 @@
2
2
  "reqId": "application-dashboard-REQ-003",
3
3
  "prdId": "PRD-001",
4
4
  "title": "Every tile honours a four-state contract with distinct visuals, role region, aria-live polite, and non-colour distinction",
5
- "description": "Every tile on the shell renders one of four states at any moment: loading, empty, error, populated. Each state carries a distinct visual (a skeleton stripe or spinner for loading, a labelled empty-state block for empty, a labelled error block with the recorded reason for error, and the actual metric for populated). Each tile wraps its content in `role=\"region\"` with an `aria-live=\"polite\"` announcer that reads the state transition on change. The state distinction combines a visual cue and a text label (non-colour distinction, WCAG 1.4.1): the state's visual is not colour-only, and the state's accessible name reads `<tile title>, <state>` on entry. A tile that renders no visible state (a blank tile) fails REQ-003 at project-side review; a tile that carries state-only through colour fails the pack check AC-19103-1.",
5
+ "description": "Every tile on the shell renders one of four states at any moment: loading, empty, error, populated. Each state carries a distinct visual (a skeleton stripe or spinner for loading, a labelled empty-state block for empty, a labelled error block with the recorded reason for error, and the actual metric for populated). Each tile wraps its content in `role=\"region\"` with an `aria-live=\"polite\"` announcer that reads the state transition on change. The state distinction combines a visual cue and a text label (non-colour distinction, WCAG 1.4.1): the state's visual is not colour-only, and the state's accessible name reads `<tile title>, <state>` on entry. A tile that renders no visible state (a blank tile) fails REQ-003 at project-side check; a tile that carries state-only through colour fails the pack check AC-19103-1.",
6
6
  "category": "functional",
7
7
  "domain": "application",
8
8
  "priority": "must",
@@ -8,7 +8,7 @@
8
8
  "purpose": "Owns the shell's timeframe picker and filter chrome, and the refetch fan-out contract: a preset change or a filter change issues one refetch per tile and one per rendered chart, every fetch carrying the same boundary and the same preset name, and once the batch has returned the shell updates one `data-as-of` attribute the tiles inherit. The fan-out contract is the substitutable interface the pack asserts on (AC-19104-1).",
9
9
  "responsibilities": [
10
10
  "Render the timeframe picker as an accessible list of presets (labelled `<button>` elements or a `<select>`) with a keyboard-reachable default from ADR-2002 (`last-7-days` unless elicited) (AC-19104-1).",
11
- "Render filter chrome as labelled interactive elements (chips, dropdowns, text inputs) keyboard-reachable in reading order before the tile row; a hover-only control is refused at project-side review (AC-19105-1).",
11
+ "Render filter chrome as labelled interactive elements (chips, dropdowns, text inputs) keyboard-reachable in reading order before the tile row; a hover-only control is refused at project-side check (AC-19105-1).",
12
12
  "On a preset change or a filter change, issue one refetch per tile and one per rendered chart; every fetch carries the same `from` and `to` boundary, the same `preset` name and the same active-filters set (AC-19104-1, AC-19105-2).",
13
13
  "Update one `data-as-of` attribute on the shell root once every fetch has returned (or the timeout has elapsed) and propagate the same value to every tile's `data-as-of` attribute (AC-19104-1).",
14
14
  "Expose a request log on `window.__dashboardFetches` (an append-only array of `{ from, to, preset, filters, tileId, chartId, at }` records) so the pack can read every fetch after each preset change (AC-19104-1)."
@@ -28,8 +28,8 @@
28
28
  "description": "PNG-of-chart export generation delegates to the charts shell; the dashboard export handle carries no PNG generator of its own."
29
29
  }
30
30
  ],
31
- "tradeoffs": "The three shipped formats (CSV, PDF, PNG-of-chart) cover the common dashboard export cases; ADR-2003's elicited override handles SVG, XLSX and any operator-specific format. The delegation to the charts shell means a project that ships a bespoke chart engine outside the render shell needs a PNG output path of its own; the export handle names the residual under project-side review.",
32
- "notes": "Known mechanism-reach gap: the pack browser has no download-capture seam today, so AC-19106-2 (PNG delegation) is proven at project-side review, not through the shipped pack. The README names it individually.",
31
+ "tradeoffs": "The three shipped formats (CSV, PDF, PNG-of-chart) cover the common dashboard export cases; ADR-2003's elicited override handles SVG, XLSX and any operator-specific format. The delegation to the charts shell means a project that ships a bespoke chart engine outside the render shell needs a PNG output path of its own; the export handle names the residual under project-side check.",
32
+ "notes": "Known mechanism-reach gap: the pack browser has no download-capture seam today, so AC-19106-2 (PNG delegation) is proven at project-side check, not through the shipped pack. The README names it individually.",
33
33
  "createdAt": "2026-09-04T22:10:00Z",
34
34
  "updatedAt": "2026-09-04T22:10:00Z"
35
35
  }
@@ -21,7 +21,7 @@
21
21
  },
22
22
  {
23
23
  "id": "AC-19101-2",
24
- "description": "Given the shell's chart region, the rendered chart mounts through the application-charts render shell (TAC-1901): the chart region contains at least one `section.chartRegion[role=\"region\"]` element carrying the shape the application-charts pack asserts on (an `svg.chartSvg` and a paired `<table>` element in the same landmark). A chart region that renders a chart outside the render shell fails project-side review.",
24
+ "description": "Given the shell's chart region, the rendered chart mounts through the application-charts render shell (TAC-1901): the chart region contains at least one `section.chartRegion[role=\"region\"]` element carrying the shape the application-charts pack asserts on (an `svg.chartSvg` and a paired `<table>` element in the same landmark). A chart region that renders a chart outside the render shell fails project-side check.",
25
25
  "given": "the rendered chart region",
26
26
  "when": "the mount seam is inspected",
27
27
  "then": "the chart mounts through the application-charts render shell",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  {
33
33
  "id": "AC-19101-3",
34
- "description": "Given a rendered dashboard surface, when a required region is omitted from the DOM (no export handle, no filter chrome, no timeframe picker), the surface either supersedes REQ-001 with a project-authored REQ documenting the omission (the pack looks up the sidecar `rcf/blueprints/application-dashboard.applied.json` for a `supersedes` entry) or renders the region as an empty labelled `role=\"region\"` element the pack can inspect; a silent omission fails project-side review.",
34
+ "description": "Given a rendered dashboard surface, when a required region is omitted from the DOM (no export handle, no filter chrome, no timeframe picker), the surface either supersedes REQ-001 with a project-authored REQ documenting the omission (the pack looks up the sidecar `rcf/blueprints/application-dashboard.applied.json` for a `supersedes` entry) or renders the region as an empty labelled `role=\"region\"` element the pack can inspect; a silent omission fails project-side check.",
35
35
  "given": "a rendered dashboard surface with a missing region and no documented supersedes entry",
36
36
  "when": "the pack inspects the shell",
37
37
  "then": "the surface fails the region-count check; the applying project must either supersede REQ-001 with a documented reason or render the region as an empty labelled role=region element",
@@ -21,10 +21,10 @@
21
21
  },
22
22
  {
23
23
  "id": "AC-19102-2",
24
- "description": "Given a rendered dashboard surface with no primary KPI tile, the surface either supersedes REQ-002 with a project-authored REQ documenting the omission or fails project-side review. This case is a documentation-and-review contract; the pack asserts the primary KPI tile exists (AC-19102-1) but does not itself enforce the fallback path.",
24
+ "description": "Given a rendered dashboard surface with no primary KPI tile, the surface either supersedes REQ-002 with a project-authored REQ documenting the omission or fails project-side check. This case is a documentation contract; the pack asserts the primary KPI tile exists (AC-19102-1) but does not itself enforce the fallback path.",
25
25
  "given": "a rendered dashboard with no primary KPI tile",
26
26
  "when": "the surface is reviewed",
27
- "then": "the surface supersedes REQ-002 with a project-authored REQ or fails review",
27
+ "then": "the surface supersedes REQ-002 with a project-authored REQ or fails the check",
28
28
  "testable": true,
29
29
  "scope": "library",
30
30
  "disposition": "fixed"
@@ -21,7 +21,7 @@
21
21
  },
22
22
  {
23
23
  "id": "AC-19103-2",
24
- "description": "Given a tile transitioning between states (loading to populated, populated to error) at runtime, the tile's `aria-live=\"polite\"` region announces the new state's accessible name to the assistive tech; the announcement text reads `<tile title>, <new state>` and the visual cue changes in the same paint. This AC is a runtime-observable behaviour on state transition; the pack does not simulate the transition today (the runner has no synthetic-event seam beyond click/type/press), so the AC is proven at project-side review and the README names the transition-observation gap under known mechanism-reach gaps.",
24
+ "description": "Given a tile transitioning between states (loading to populated, populated to error) at runtime, the tile's `aria-live=\"polite\"` region announces the new state's accessible name to the assistive tech; the announcement text reads `<tile title>, <new state>` and the visual cue changes in the same paint. This AC is a runtime-observable behaviour on state transition; the pack does not simulate the transition today (the runner has no synthetic-event seam beyond click/type/press), so the AC is proven at project-side check and the README names the transition-observation gap under known mechanism-reach gaps.",
25
25
  "given": "a tile transitioning between states",
26
26
  "when": "the transition renders",
27
27
  "then": "the aria-live polite region announces the new state's accessible name and the visual cue changes",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  {
23
23
  "id": "AC-19104-2",
24
- "description": "Given a rendered dashboard with an operator-elicited auto-refresh interval (ADR-2002), the shell refetches on the same fan-out contract at the interval: every tile refetches with the same from/to/preset, the as-of stamp updates on the shell root and every tile. When no auto-refresh interval is elicited, the shell does not refresh unattended (a dashboard that refreshes every ten seconds without an operator opt-in is a defect). The pack asserts the initial default is auto-refresh off through a `data-auto-refresh` attribute on the shell root; a fixture whose default is on fails project-side review. Applying agent sets: the elicited auto-refresh interval value in seconds (ADR-2002) or the explicit off default, recorded on the manifest and reflected on the shell root as `data-auto-refresh`.",
24
+ "description": "Given a rendered dashboard with an operator-elicited auto-refresh interval (ADR-2002), the shell refetches on the same fan-out contract at the interval: every tile refetches with the same from/to/preset, the as-of stamp updates on the shell root and every tile. When no auto-refresh interval is elicited, the shell does not refresh unattended (a dashboard that refreshes every ten seconds without an operator opt-in is a defect). The pack asserts the initial default is auto-refresh off through a `data-auto-refresh` attribute on the shell root; a fixture whose default is on fails project-side check. Applying agent sets: the elicited auto-refresh interval value in seconds (ADR-2002) or the explicit off default, recorded on the manifest and reflected on the shell root as `data-auto-refresh`.",
25
25
  "given": "a rendered dashboard with or without an elicited auto-refresh interval",
26
26
  "when": "the shell renders",
27
27
  "then": "auto-refresh is off unless the interval is elicited; refreshes follow the same fan-out contract",
@@ -11,7 +11,7 @@
11
11
  "acceptanceCriteria": [
12
12
  {
13
13
  "id": "AC-19105-1",
14
- "description": "Given a rendered dashboard surface with filter chrome, every filter control (chip, dropdown, search input) is a labelled interactive element (a `<button>`, a `<select>` or an `<input>`) with an accessible name; the controls are keyboard-reachable in reading order before the tile row; the operator's active filter selection is reflected on the shell as a `data-active-filters` attribute the pack can read. A filter chrome that ships hover-only controls (a hover-reveal menu on a mouseover element) fails project-side review.",
14
+ "description": "Given a rendered dashboard surface with filter chrome, every filter control (chip, dropdown, search input) is a labelled interactive element (a `<button>`, a `<select>` or an `<input>`) with an accessible name; the controls are keyboard-reachable in reading order before the tile row; the operator's active filter selection is reflected on the shell as a `data-active-filters` attribute the pack can read. A filter chrome that ships hover-only controls (a hover-reveal menu on a mouseover element) fails project-side check.",
15
15
  "given": "a rendered dashboard with filter chrome",
16
16
  "when": "the accessibility tree is read",
17
17
  "then": "every filter control is a labelled interactive element keyboard-reachable in reading order",