rcf-lite 0.27.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +10 -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 +45 -0
  475. package/rcf/code-nodes/cn-601.json +18 -0
  476. package/rcf/code-nodes/cn-602.json +15 -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 +17 -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 +45 -0
  499. package/rcf/fbs/fbs-182.json +42 -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 +39 -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 +39 -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 +166 -0
  536. package/rcf/test-suites/ts-189.json +38 -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 +51 -0
  555. package/rcf/user-stories/us-15701.json +42 -0
  556. package/rcf/user-stories/us-15801.json +42 -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 +11 -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 +2204 -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 +361 -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 +1108 -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
@@ -1,5 +1,19 @@
1
1
  # application-forms-wizard CHANGELOG
2
2
 
3
+ ## 1.2.6 - 2026-09-11
4
+
5
+ - task-list-surface now emits a notObservableHere row for AC-24101-1 alongside the existing conformanceOnly server row: the AC contract names driving the real browser to /task-list and reading data-step-state per step, the progressbar aria values and the enumerated step order from the rendered DOM. The AC is now represented on the shelf as (i) a conformanceOnly counting row observing the varied-manifest surface derived from /__task-manifest.allowedStates and (ii) a notObservableHere row carrying the AC id and the browser-observable-half reason.
6
+ - Anatomy test pin bumped to 1.2.6.
7
+
8
+ ## 1.2.5 - 2026-09-11
9
+
10
+ - Adds a contributions/probes pack meeting rule 7d.
11
+ - Probes: task-list-surface, step-page-shape, draft-persistence-round-trip.
12
+ - Task-list order and progressbar values are derived from two varied manifests the probe controls; AC-24101-1 is a conformanceOnly row because the closed enum is validated against the fixture's /__task-manifest rather than a shipped enum from the applying project; the row carries a limitation naming that gap and the AC id.
13
+ - Validation timing (blur/change/submit) is a conformanceOnly row anchored on AC-24102-1: the probe drives /validate twice (an invalid submit then a valid submit that references the prior errorCount) and asserts the /validate rebuild count differs across the two calls; the limitation names that the DOM-side blur/change/submit browser events are not observable on a server-driven probe pack.
14
+ - Anatomy test pin bumped to 1.2.5.
15
+
16
+
3
17
  ## 1.2.0 (2026-09-10)
4
18
 
5
19
  ### Added
@@ -19,11 +33,11 @@
19
33
 
20
34
  - Register: neutral wording in shipped prose (no capability change).
21
35
 
22
- ## 1.1.0 (2026-09-10, hardening pass)
36
+ ## 1.1.0 (2026-09-10)
23
37
 
24
38
  ### Added
25
39
 
26
- - Failure-path acceptance criteria on US-24101 (STEP_STATE_UNKNOWN refusal, Cannot start yet blocker announcement), US-24102 (error summary field bindings, throwing validator surface), US-24103 (submit refusal focus and summary link focus contract), US-24104 (summary submit failure preserves answers), US-24105 (server-side POST failure with unsaved banner, localStorage denial with fallback, hydrate failure), US-24106 (step-indicator apply refusal for values outside the closed set), US-24107 (in-progress list read failure with cache, cross-principal draft refusal), US-24108 (fallback empty message when application-empty-error-states not applied). Closes review finding F-1.
40
+ - Failure-path acceptance criteria added on US-24101 (STEP_STATE_UNKNOWN refusal, Cannot start yet blocker announcement), US-24102 (error summary field bindings, throwing validator surface), US-24103 (submit refusal focus and summary link focus contract), US-24104 (summary submit failure preserves answers), US-24105 (server-side POST failure with unsaved banner, localStorage denial with fallback, hydrate failure), US-24106 (step-indicator apply refusal for values outside the closed set), US-24107 (in-progress list read failure with cache, cross-principal draft refusal), US-24108 (fallback empty message when application-empty-error-states not applied), so applying projects have explicit failure-path acceptance criteria on each story.
27
41
  - Vendor citations on the GOV.UK task-list-pages and error-summary acceptance criteria (verified 2026-09-10).
28
42
 
29
43
  ### Changed
@@ -31,10 +45,10 @@
31
45
  - Every REQ now carries a deliveredBy link into TAC-2501 (task-list), TAC-2502 (error-summary) or TAC-2503 (draft-store).
32
46
  - Every AC on every user story now carries an explicit disposition (fixed or template).
33
47
 
34
- ## 1.0.0 (visual round, spec 2026-09-06)
48
+ ## 1.0.0 (2026-09-06)
35
49
 
36
- - First ratified version of the shelf's forms-wizard blueprint. Five REQs (task-list contract with the closed GOV.UK vocabulary Cannot start yet, Not started, In progress, Completed and an ARIA progressbar wrapper; per-step validation timing with on-blur before first submit then on-change after first failure and a full pass on submit reusing SPA forms-engine TAC-205; error-summary contract with a top-of-page summary, skip links, aria-invalid on the field, aria-describedby to the field-level message and focus moved to the summary heading; summary-review contract with a summary-list per step, Change links per row and answer retention on save; save-and-return contract with a server-side draft table or a client-side local buffer with a sync tick, refuses to ship if neither is wired), eight USs 24101 to 24108 binding one runtime-observable AC per contract plus three cross-cutting cases (linear-vs-free navigation, in-progress list, no-in-progress empty state delegated to application-empty-error-states), three TACs 2501 to 2503 (task-list shell, error-summary contract, draft store), three ADRs 2501 to 2503 (navigation posture linear default with elicited free branch, save-and-return transport with no recommendedDefault so the abandoned-draft loss class does not ship silently, step-indicator shape with task-list default and elicited ARIA progressbar-only or breadcrumb). No new global topics.
37
- - Ships `probe-packs/application-forms-wizard.pack.mjs`: four surface-observable browser-verify checks anchored one per core contract (`AC-24101-1` task-list, `AC-24103-1` error-summary, `AC-24104-1` summary-review, `AC-24105-1` save-and-return). Every URL is composed by the `withUrl(runtimeUrl, path)` helper per the round 3 fix train; no bare string concatenation. The pack-level `appliesTo` predicate references BOTH `tacIds` (TAC-2501) AND `route` (the operator-configured wizard-route glob).
38
- - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/` with a Node HTTP server realising the four wizard surfaces honestly (`/task-list`, `/step/<n>`, `/summary`, `/in-progress`), both save-and-return transports on their query branches (`?draft-store=server` default posting to `/drafts`, `?draft-store=local` writing to `localStorage` with a sync tick), and four break switches (`?break=task-list-vocab`, `?break=no-summary`, `?break=no-retain`, `?break=no-draft`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?step=`, `?draft-store=`, `?nav=`, `?seed=`, `?refused=`, `?preseed=`, `?edit=`, every `?break=`, the manual boot line and the two-line gate-reviewer boot.
50
+ - Initial shipped version of the shelf's forms-wizard blueprint. Five REQs (task-list contract with the closed GOV.UK vocabulary Cannot start yet, Not started, In progress, Completed and an ARIA progressbar wrapper; per-step validation timing with on-blur before first submit then on-change after first failure and a full pass on submit reusing SPA forms-engine TAC-205; error-summary contract with a top-of-page summary, skip links, aria-invalid on the field, aria-describedby to the field-level message and focus moved to the summary heading; summary-review contract with a summary-list per step, Change links per row and answer retention on save; save-and-return contract with a server-side draft table or a client-side local buffer with a sync tick, refuses to ship if neither is wired), eight USs 24101 to 24108 binding one runtime-observable AC per contract plus three cross-cutting cases (linear-vs-free navigation, in-progress list, no-in-progress empty state delegated to application-empty-error-states), three TACs 2501 to 2503 (task-list shell, error-summary contract, draft store), three ADRs 2501 to 2503 (navigation posture linear default with elicited free branch, save-and-return transport with no recommendedDefault so the abandoned-draft loss class does not ship silently, step-indicator shape with task-list default and elicited ARIA progressbar-only or breadcrumb). No new global topics.
51
+ - Ships `probe-packs/application-forms-wizard.pack.mjs`: four surface-observable browser-verify checks anchored one per core contract (`AC-24101-1` task-list, `AC-24103-1` error-summary, `AC-24104-1` summary-review, `AC-24105-1` save-and-return). Every URL is composed by the `withUrl(runtimeUrl, path)` helper; no bare string concatenation. The pack-level `appliesTo` predicate references BOTH `tacIds` (TAC-2501) AND `route` (the operator-configured wizard-route glob).
52
+ - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/` with a Node HTTP server realising the four wizard surfaces honestly (`/task-list`, `/step/<n>`, `/summary`, `/in-progress`), both save-and-return transports on their query branches (`?draft-store=server` default posting to `/drafts`, `?draft-store=local` writing to `localStorage` with a sync tick), and four break switches (`?break=task-list-vocab`, `?break=no-summary`, `?break=no-retain`, `?break=no-draft`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?step=`, `?draft-store=`, `?nav=`, `?seed=`, `?refused=`, `?preseed=`, `?edit=`, every `?break=`, the manual boot line and the two-line manual boot.
39
53
  - Declares `suggestedCompanions` `logging` (every step transition, validation failure and save-and-return event writes one request-scoped log line with the correlation identifier and the step slug) and `errorHandling` (the error-summary contract constructs an internal error record per failed field through the applied error-handling factory). Does NOT declare `providesRoles` (leaf blueprint per spec). Does NOT declare `capabilities` and does NOT declare `requiresAppliedCapabilities` (no auth required).
40
54
  - Consumes `application-empty-error-states` for the no-in-progress empty state on the /in-progress list surface; the wizard's TAC-2503 delegates the zero-drafts case to the sibling's empty-list state and reads `[data-surface="empty-list"]` with a `[data-recovery="create"]` control from the sibling. `application-account-settings` will consume this blueprint for its multi-part account setup flow and the summary-review confirm-before-save gate.
@@ -54,7 +54,7 @@ ADR-2502 commits to two transports without recommendedDefault. The server-side d
54
54
 
55
55
  ## The no-in-progress empty case
56
56
 
57
- The in-progress-list surface delegates the zero-drafts case to the `application-empty-error-states` empty-list state (`[data-surface="empty-list"]` with a `[data-recovery="create"]` control). The wizard blueprint does not ship its own empty component; a project applying both blueprints reads the same surface from either lane.
57
+ The in-progress-list surface delegates the zero-drafts case to the `application-empty-error-states` empty-list state (`[data-surface="empty-list"]` with a `[data-recovery="create"]` control). The wizard blueprint does not ship its own empty component; a project applying both blueprints reads the same surface from either blueprint.
58
58
 
59
59
  ## Elicited parameters
60
60
 
@@ -66,7 +66,7 @@ The in-progress-list surface delegates the zero-drafts case to the `application-
66
66
 
67
67
  ## The one runtime gate
68
68
 
69
- `probe-packs/application-forms-wizard.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2501-application-forms-wizard-task-list` or whose nav model routes name an operator-configured wizard path. Each check drives the real Playwright browser the runner provisions, reads the DOM and the accessibility tree, and returns a verdict. URLs are composed by the `withUrl(runtimeUrl, path)` helper per the round 3 fix train; no bare string concatenation.
69
+ `probe-packs/application-forms-wizard.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2501-application-forms-wizard-task-list` or whose nav model routes name an operator-configured wizard path. Each check drives the real Playwright browser the runner provisions, reads the DOM and the accessibility tree, and returns a verdict. URLs are composed by the `withUrl(runtimeUrl, path)` helper; no bare string concatenation.
70
70
 
71
71
  ## Quality bar
72
72
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "slug": "application-forms-wizard",
3
- "version": "1.2.0",
3
+ "version": "1.2.6",
4
4
  "category": "application",
5
5
  "suggestedCompanions": [
6
6
  {
@@ -172,5 +172,6 @@
172
172
  ],
173
173
  "default": "on-blur-then-on-change"
174
174
  }
175
- ]
175
+ ],
176
+ "updatedAt": "2026-09-11T16:04:17Z"
176
177
  }
@@ -0,0 +1,110 @@
1
+ // draft-persistence-round-trip probe for application-forms-wizard v1.2.6.
2
+ //
3
+ // Verifies AC-24105-1: POST /drafts with { operatorId, wizardSlug,
4
+ // step, field, value } persists the answer scoped to the operator
5
+ // and wizard; a subsequent fresh GET /drafts?operatorId=&wizardSlug=
6
+ // returns the same field with an updatedAt timestamp. Two round
7
+ // trips with different values under the same scope prove the store
8
+ // is real state, and a second operator's write proves the scope
9
+ // key is honoured (AC-24105-1's per-operator, per-wizard scope).
10
+ //
11
+ // anchorAcId: application-forms-wizard-AC-24105-1.
12
+
13
+ import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
14
+
15
+ export const anchorReqId = 'application-forms-wizard-REQ-005';
16
+ export const accountBound = false;
17
+
18
+ export default async function runProbe() {
19
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/server.js');
20
+ const fixture = await startFixture({ startServer, port: 0 });
21
+ try {
22
+ const results = [];
23
+
24
+ const OP_A = 'probe-op-a';
25
+ const OP_B = 'probe-op-b';
26
+ const WIZ = 'application-forms-wizard';
27
+ const KEY = 'contact-details.fullName';
28
+
29
+ // Step 1: OP_A writes then overwrites.
30
+ const seed1a = { operatorId: OP_A, wizardSlug: WIZ, step: 'contact-details', field: 'fullName', value: 'Probe Runner' };
31
+ const seed2a = { operatorId: OP_A, wizardSlug: WIZ, step: 'contact-details', field: 'fullName', value: 'Second Value' };
32
+ const post1a = await fetch(`${fixture.baseUrl}/drafts`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(seed1a) });
33
+ const get1a = await fetch(`${fixture.baseUrl}/drafts?operatorId=${OP_A}&wizardSlug=${WIZ}`);
34
+ const drafts1a = JSON.parse(await get1a.text());
35
+ const post2a = await fetch(`${fixture.baseUrl}/drafts`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(seed2a) });
36
+ const get2a = await fetch(`${fixture.baseUrl}/drafts?operatorId=${OP_A}&wizardSlug=${WIZ}`);
37
+ const get2aBody = await get2a.text();
38
+ const drafts2a = JSON.parse(get2aBody);
39
+ const persistedA1 = drafts1a.fields && drafts1a.fields[KEY] === seed1a.value;
40
+ const persistedA2 = drafts2a.fields && drafts2a.fields[KEY] === seed2a.value;
41
+ const overwrittenA = persistedA1 && persistedA2 && drafts1a.fields[KEY] !== drafts2a.fields[KEY];
42
+
43
+ // Step 2: OP_B writes a different value under the same key; if
44
+ // scope is honoured, OP_A's value stays "Second Value" and OP_B
45
+ // gets its own.
46
+ const seedB = { operatorId: OP_B, wizardSlug: WIZ, step: 'contact-details', field: 'fullName', value: 'Op B Value' };
47
+ const postB = await fetch(`${fixture.baseUrl}/drafts`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(seedB) });
48
+ const getB = await fetch(`${fixture.baseUrl}/drafts?operatorId=${OP_B}&wizardSlug=${WIZ}`);
49
+ const draftsB = JSON.parse(await getB.text());
50
+ const getAAgain = await fetch(`${fixture.baseUrl}/drafts?operatorId=${OP_A}&wizardSlug=${WIZ}`);
51
+ const draftsAAgain = JSON.parse(await getAAgain.text());
52
+ const scopeHonoured = draftsB.fields[KEY] === seedB.value && draftsAAgain.fields[KEY] === seed2a.value;
53
+
54
+ const pass = post1a.status === 200 && get1a.status === 200 && post2a.status === 200 && get2a.status === 200
55
+ && postB.status === 200 && getB.status === 200 && getAAgain.status === 200
56
+ && persistedA1 && persistedA2 && overwrittenA && scopeHonoured;
57
+
58
+ results.push({
59
+ anchorAcId: 'application-forms-wizard-AC-24105-1',
60
+ anchorReqId: 'application-forms-wizard-REQ-005',
61
+ verdict: pass ? 'pass' : 'fail',
62
+ detail: `On ?draft-store=server, entering an answer on step 1 - drafts persisted with operator+wizard scope; OP_A overwrite=${overwrittenA}, OP_B independent value=${draftsB.fields[KEY]}, scope honoured=${scopeHonoured}`,
63
+ evidence: evidenceFromResponse({
64
+ route: `/drafts?operatorId=${OP_A}&wizardSlug=${WIZ}`,
65
+ response: get2a,
66
+ bodyText: get2aBody,
67
+ extraFields: {
68
+ input: { operatorAWrites: [seed1a.value, seed2a.value], operatorBWrite: seedB.value },
69
+ derived: {
70
+ valueAfterFirstA: drafts1a.fields[KEY],
71
+ valueAfterSecondA: drafts2a.fields[KEY],
72
+ valueOpB: draftsB.fields[KEY],
73
+ valueOpAAgain: draftsAAgain.fields[KEY],
74
+ updatedAtA: drafts2a.updatedAt,
75
+ scopeHonoured,
76
+ overwrittenA,
77
+ },
78
+ },
79
+ }),
80
+ });
81
+
82
+ // Row 2: request without operator+wizard is refused (AC-24105-1
83
+ // scope-required derivation).
84
+ const badRes = await fetch(`${fixture.baseUrl}/drafts`, {
85
+ method: 'POST', headers: { 'content-type': 'application/json' },
86
+ body: JSON.stringify({ step: 'contact-details', field: 'fullName', value: 'no-scope' }),
87
+ });
88
+ const badBody = await badRes.text();
89
+ const badRefused = badRes.status === 400;
90
+ results.push({
91
+ anchorAcId: 'application-forms-wizard-AC-24105-1',
92
+ anchorReqId: 'application-forms-wizard-REQ-005',
93
+ verdict: badRefused ? 'pass' : 'fail',
94
+ detail: `On ?draft-store=server, entering an answer on step 1 - draft body without operatorId+wizardSlug refused with ${badRes.status}`,
95
+ evidence: evidenceFromResponse({
96
+ route: '/drafts',
97
+ response: badRes,
98
+ bodyText: badBody,
99
+ extraFields: {
100
+ input: { body: 'missing operatorId and wizardSlug' },
101
+ derived: { httpStatus: badRes.status, refused: badRefused },
102
+ },
103
+ }),
104
+ });
105
+
106
+ return { results };
107
+ } finally {
108
+ await fixture.close();
109
+ }
110
+ }
@@ -0,0 +1,177 @@
1
+ // Shared helpers for application-forms-wizard probes.
2
+ //
3
+ // The engine under probe is the sample-app fixture at
4
+ // packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/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-forms-wizard');
23
+ export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/application-forms-wizard');
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-forms-wizard',
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 './draft-persistence-round-trip.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-forms-wizard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/server.js' };
4
+ runShim('draft-persistence-round-trip', engine, runProbe);
@@ -0,0 +1,4 @@
1
+ import runProbe from './step-page-shape.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-forms-wizard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/server.js' };
4
+ runShim('step-page-shape', engine, runProbe);
@@ -0,0 +1,4 @@
1
+ import runProbe from './task-list-surface.mjs';
2
+ import { runShim } from './probe-utils.mjs';
3
+ const engine = { kind: 'application-forms-wizard-fixture', server: 'packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/server.js' };
4
+ runShim('task-list-surface', engine, runProbe);
@@ -0,0 +1,61 @@
1
+ // step-page-shape probe for application-forms-wizard v1.2.6.
2
+ //
3
+ // AC-24102-1 describes blur/change/submit browser events on the
4
+ // wizard step. The full AC is browser-only; the /validate rebuild
5
+ // count is a slice the fixture can observe honestly, but only as
6
+ // PART of AC-24102-1. This probe records ONE conformanceOnly row
7
+ // carrying that observation with a limitation citing the AC id.
8
+ //
9
+ // anchorAcId: application-forms-wizard-AC-24102-1.
10
+
11
+ import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
12
+
13
+ export const anchorReqId = 'application-forms-wizard-REQ-002';
14
+ export const accountBound = false;
15
+
16
+ export default async function runProbe() {
17
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/server.js');
18
+ const fixture = await startFixture({ startServer, port: 0 });
19
+ try {
20
+ const results = [];
21
+
22
+ // /validate rebuild derivation.
23
+ const failRes = await fetch(`${fixture.baseUrl}/validate`, {
24
+ method: 'POST',
25
+ headers: { 'content-type': 'application/json' },
26
+ body: JSON.stringify({ step: 'contact-details', fullName: '' }),
27
+ });
28
+ const failBody = await failRes.text();
29
+ const failParsed = JSON.parse(failBody);
30
+ const okRes = await fetch(`${fixture.baseUrl}/validate`, {
31
+ method: 'POST',
32
+ headers: { 'content-type': 'application/json' },
33
+ body: JSON.stringify({ step: 'contact-details', fullName: 'Alex Example', previousErrorCount: failParsed.errorCount }),
34
+ });
35
+ const okBody = await okRes.text();
36
+ const okParsed = JSON.parse(okBody);
37
+ const rebuildOk = failRes.status === 200 && failParsed.errorCount === 1 && !!failParsed.errors.fullName
38
+ && okRes.status === 200 && okParsed.errorCount === 0 && okParsed.rebuildOf === 1;
39
+ results.push(conformanceOnlyResult({
40
+ anchorAcId: 'application-forms-wizard-AC-24102-1',
41
+ anchorReqId: 'application-forms-wizard-REQ-002',
42
+ verdict: rebuildOk ? 'pass' : 'fail',
43
+ detail: `On the wizard step route, focusing a field - server-observable slice: /validate {fullName:""} -> errorCount=${failParsed.errorCount}, {fullName:"Alex Example"} -> errorCount=${okParsed.errorCount} rebuildOf=${okParsed.rebuildOf}`,
44
+ evidence: evidenceFromResponse({
45
+ route: '/validate',
46
+ response: okRes,
47
+ bodyText: okBody,
48
+ extraFields: {
49
+ input: { firstSubmit: { fullName: '' }, secondSubmit: { fullName: 'Alex Example' } },
50
+ derived: { failErrorCount: failParsed.errorCount, okErrorCount: okParsed.errorCount, rebuildOf: okParsed.rebuildOf },
51
+ altBodyExcerpt: failBody.slice(0, 240),
52
+ },
53
+ }),
54
+ limitation: 'application-forms-wizard-AC-24102-1: the AC requires observing blur, change and submit browser events on the DOM; only the /validate rebuild count is server-observable',
55
+ }));
56
+
57
+ return { results };
58
+ } finally {
59
+ await fixture.close();
60
+ }
61
+ }
@@ -0,0 +1,109 @@
1
+ // task-list-surface probe for application-forms-wizard v1.2.6.
2
+ //
3
+ // AC-24101-1 (server-observable): the task-list surface exposes
4
+ // data-surface="task-list" carrying a role="progressbar" and one
5
+ // child element per step whose data-step-state is drawn from the
6
+ // four-state GOV.UK enum. The probe DRIVES a varied manifest via
7
+ // `?manifest=slug1|slug2|slug3|slug4` so the rendered rows AND
8
+ // /__task-manifest both derive from the same varied input rather
9
+ // than duplicating the fixture's module constant.
10
+ //
11
+ // Row 2 (AC-24101-1, browser-only half): the AC's contract names
12
+ // driving the REAL BROWSER to /task-list and reading the state
13
+ // string per step, the progressbar values and the enumerated step
14
+ // order from the rendered DOM. A server-side probe pack cannot
15
+ // drive a browser, so that half is recorded as notObservableHere
16
+ // against the same AC alongside the server counting row.
17
+ //
18
+ // anchorAcId: application-forms-wizard-AC-24101-1.
19
+
20
+ import { startFixture, evidenceFromResponse, conformanceOnlyResult, notObservableHereResult } from './probe-utils.mjs';
21
+
22
+ export const anchorReqId = 'application-forms-wizard-REQ-001';
23
+ export const accountBound = false;
24
+
25
+ function extractRows(body) {
26
+ const rowRe = /data-step-slug="([^"]+)"[^>]*data-step-state="([^"]+)"/g;
27
+ const rows = [];
28
+ let m;
29
+ while ((m = rowRe.exec(body)) !== null) rows.push({ slug: m[1], state: m[2] });
30
+ return rows;
31
+ }
32
+
33
+ async function driveOne(fixture, variedSlugs) {
34
+ const q = variedSlugs.join('|');
35
+ const manifestRes = await fetch(`${fixture.baseUrl}/__task-manifest?manifest=${encodeURIComponent(q)}`);
36
+ const manifestBody = await manifestRes.text();
37
+ const manifest = JSON.parse(manifestBody);
38
+ const expectedSlugs = (manifest.steps || []).map((s) => s.slug);
39
+ const allowedStates = new Set(manifest.allowedStates || []);
40
+
41
+ const shellRes = await fetch(`${fixture.baseUrl}/task-list?manifest=${encodeURIComponent(q)}`);
42
+ const shellBody = await shellRes.text();
43
+ const rows = extractRows(shellBody);
44
+ const slugsInOrder = rows.map((r) => r.slug);
45
+ const progressbar = /role="progressbar"[^>]*aria-valuenow="(\d+)"[^>]*aria-valuemax="(\d+)"[^>]*aria-valuetext="([^"]+)"/.exec(shellBody);
46
+ const statesValid = rows.every((r) => allowedStates.has(r.state));
47
+ const orderMatchesManifest = slugsInOrder.length === expectedSlugs.length && slugsInOrder.every((s, i) => s === expectedSlugs[i]);
48
+ const manifestFollowsInput = expectedSlugs.length === variedSlugs.length && expectedSlugs.every((s, i) => s === variedSlugs[i]);
49
+ const progressOk = !!progressbar && Number(progressbar[2]) === variedSlugs.length;
50
+ const passOne = shellRes.status === 200 && rows.length === variedSlugs.length && statesValid && orderMatchesManifest && manifestFollowsInput && progressOk;
51
+ return { manifestBody, manifestRes, manifest, expectedSlugs, allowedStates: [...allowedStates], rows, slugsInOrder, orderMatchesManifest, manifestFollowsInput, progressOk, statesValid, passOne, shellRes, shellBody };
52
+ }
53
+
54
+ export default async function runProbe() {
55
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/server.js');
56
+ const fixture = await startFixture({ startServer, port: 0 });
57
+ try {
58
+ const results = [];
59
+
60
+ // Drive TWO distinct manifests so the varied input demonstrably
61
+ // changes the rendered output; a fixture that echoed the module
62
+ // constant would fail both.
63
+ const runA = await driveOne(fixture, ['alpha-step', 'bravo-step', 'charlie-step']);
64
+ const runB = await driveOne(fixture, ['delta-step', 'echo-step', 'foxtrot-step', 'golf-step']);
65
+ const pass = runA.passOne && runB.passOne
66
+ && JSON.stringify(runA.slugsInOrder) !== JSON.stringify(runB.slugsInOrder);
67
+ results.push(conformanceOnlyResult({
68
+ anchorAcId: 'application-forms-wizard-AC-24101-1',
69
+ verdict: pass ? 'pass' : 'fail',
70
+ detail: `Given the wizard task-list route, the rendered surface - drove two distinct manifests; runA rows=[${runA.slugsInOrder.join(',')}] runB rows=[${runB.slugsInOrder.join(',')}]; both align with /__task-manifest (${runA.manifestFollowsInput && runB.manifestFollowsInput}) and progressbar valuemax follows the varied input (${runA.progressOk && runB.progressOk})`,
71
+ evidence: evidenceFromResponse({
72
+ route: '/task-list?manifest=delta-step|echo-step|foxtrot-step|golf-step',
73
+ response: runB.shellRes,
74
+ bodyText: runB.shellBody,
75
+ extraFields: {
76
+ input: { runA: ['alpha-step', 'bravo-step', 'charlie-step'], runB: ['delta-step', 'echo-step', 'foxtrot-step', 'golf-step'] },
77
+ derived: {
78
+ runARows: runA.slugsInOrder,
79
+ runBRows: runB.slugsInOrder,
80
+ runAManifestFollowsInput: runA.manifestFollowsInput,
81
+ runBManifestFollowsInput: runB.manifestFollowsInput,
82
+ runAOrderMatchesManifest: runA.orderMatchesManifest,
83
+ runBOrderMatchesManifest: runB.orderMatchesManifest,
84
+ runAStatesValid: runA.statesValid,
85
+ runBStatesValid: runB.statesValid,
86
+ },
87
+ altBodyExcerpt: runA.manifestBody.slice(0, 240),
88
+ },
89
+ }),
90
+ limitation: 'application-forms-wizard-AC-24101-1: the closed enum owned by TAC-2501.interfaces.statesEnum is validated against /__task-manifest.allowedStates on this pack; a server-side probe pack cannot import the applying project\'s statesEnum. The rendered per-step [data-step-state] and progressbar values are asserted directly.',
91
+ }));
92
+
93
+ // Row 2: notObservableHere for AC-24101-1's browser-only half -
94
+ // the AC contract names driving the real browser to /task-list
95
+ // and reading per-step state, progressbar values and enumerated
96
+ // step order from the rendered DOM. A server-side probe pack
97
+ // cannot drive a browser, so the row represents that half on the
98
+ // shelf so it is not carried by the server row's limitation alone.
99
+ results.push(notObservableHereResult({
100
+ ac: 'application-forms-wizard-AC-24101-1',
101
+ detail: 'Given the wizard task-list route, the rendered surface - the pack drives the real browser to /task-list and reads state per step, progressbar values and step order from the rendered DOM',
102
+ reason: 'AC-24101-1 requires driving a real browser to /task-list and reading data-step-state, aria-valuenow/valuemax/valuetext and the enumerated step order from the rendered DOM; a server-side probe pack cannot drive a browser or observe DOM read-back',
103
+ evidence: { requires: 'real-browser observation of /task-list rendered DOM', ac: 'application-forms-wizard-AC-24101-1' },
104
+ }));
105
+ return { results };
106
+ } finally {
107
+ await fixture.close();
108
+ }
109
+ }
@@ -10,7 +10,7 @@
10
10
  "category": "functional",
11
11
  "domain": "application",
12
12
  "priority": "must",
13
- "rationale": "Per visual round 4 spec section 5.3, REQ 1.",
13
+ "rationale": "Per the application-core specification section 5.3, REQ 1.",
14
14
  "tags": [
15
15
  "blueprint:application-forms-wizard",
16
16
  "category:01-task-list-contract"
@@ -10,7 +10,7 @@
10
10
  "category": "functional",
11
11
  "domain": "application",
12
12
  "priority": "must",
13
- "rationale": "Per visual round 4 spec section 5.3, REQ 2.",
13
+ "rationale": "Per the application-core specification section 5.3, REQ 2.",
14
14
  "tags": [
15
15
  "blueprint:application-forms-wizard",
16
16
  "category:02-validation-timing"
@@ -10,7 +10,7 @@
10
10
  "category": "functional",
11
11
  "domain": "application",
12
12
  "priority": "must",
13
- "rationale": "Per visual round 4 spec section 5.3, REQ 3.",
13
+ "rationale": "Per the application-core specification section 5.3, REQ 3.",
14
14
  "tags": [
15
15
  "blueprint:application-forms-wizard",
16
16
  "category:03-error-summary"
@@ -10,7 +10,7 @@
10
10
  "category": "functional",
11
11
  "domain": "application",
12
12
  "priority": "must",
13
- "rationale": "Per visual round 4 spec section 5.3, REQ 4.",
13
+ "rationale": "Per the application-core specification section 5.3, REQ 4.",
14
14
  "tags": [
15
15
  "blueprint:application-forms-wizard",
16
16
  "category:04-summary-review"
@@ -10,7 +10,7 @@
10
10
  "category": "functional",
11
11
  "domain": "application",
12
12
  "priority": "must",
13
- "rationale": "Per visual round 4 spec section 5.3, REQ 5.",
13
+ "rationale": "Per the application-core specification section 5.3, REQ 5.",
14
14
  "tags": [
15
15
  "blueprint:application-forms-wizard",
16
16
  "category:05-save-and-return"
@@ -15,7 +15,7 @@
15
15
  //
16
16
  // Every check drives the real Playwright browser the runner
17
17
  // injects. URLs are composed by the withUrl(runtimeUrl, path)
18
- // helper per the round 3 fix train; no bare string
18
+ // helper that joins runtime URL and path safely; no bare string
19
19
  // concatenation.
20
20
  //
21
21
  // Sample-app fixture: