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
@@ -1,26 +1,34 @@
1
1
  # application-api-rest CHANGELOG
2
2
 
3
+ ## 2.1.10 - 2026-09-11
4
+
5
+ - Adds a contributions/probes pack meeting rule 7d: each probe drives a real HTTP round trip against the dependency-free sample-app fixture at packages/rcf-lite/test/fixtures/probe-pack-application-api-rest/ and records the fixture-echoed x-fixture-request-id, response status, a distinctive body excerpt, the varied input and the derived output on every result row.
6
+ - Probes: cursor-pagination-round-trip, problem-details-on-error, health-probes-distinct, request-id-echoed.
7
+ - Cursor probe varies limits and derives forward/backward traversal from server-side cursor state (opaque UUID keys over a CURSOR_MAP, not positional JSON); malformed cursor and over-limit rows produce 400 with problem-details bodies anchored on AC-2109-3 and AC-2109-5.
8
+ - Liveness returns 200 with zero dependency checks and readiness reports checked dependencies (matches AC-2108-1).
9
+ - Detail texts open with the first eight words of the AC or REQ text they observe, then " - " and the derived observation.
10
+ - Anatomy test pin bumped to 2.1.10; strict evidence predicate; notObservableHere.ac resolves against a shipped AC id.
11
+
12
+
3
13
  ## 2.1.5 - 2026-09-10
4
14
 
5
- Findings closed: F-2, F-3, F-4, F-5, F-6, F-7, F-8. Template-AC fill-in clauses on AC-2102-2, AC-2104-6, AC-2106-4, AC-2108-4, AC-2112-1, AC-2118-3 and AC-2119-5 now enumerate the specific applying-project substitutions (declared property-name casing, documentation-exposure policy per environment, operation-to-auth-class mapping onto the four classes fixed on REQ-005, resolved startup-probe path, idempotency-key verb-and-class combinations, deploy documentation location and order, verification-pipeline definition) in place of the generic phrasing. TAC-303-application-api-rest-contract-surface patch-bumped to 1.0.2: responsibilities[2] now names `x-idempotency-key` (`required` or `forbidden`) explicitly and references AC-2112-1.
15
+ Template-AC fill-in clauses on AC-2102-2, AC-2104-6, AC-2106-4, AC-2108-4, AC-2112-1, AC-2118-3 and AC-2119-5 now enumerate the specific applying-project substitutions (declared property-name casing, documentation-exposure policy per environment, operation-to-auth-class mapping onto the four classes fixed on REQ-005, resolved startup-probe path, idempotency-key verb-and-class combinations, deploy documentation location and order, verification-pipeline definition) in place of the earlier generic phrasing, so applying projects have precise values to fill in. TAC-303-application-api-rest-contract-surface patch-bumped to 1.0.2: responsibilities[2] now names `x-idempotency-key` (`required` or `forbidden`) explicitly and references AC-2112-1.
6
16
 
7
17
 
8
18
  ## 2.1.4 - 2026-09-10
9
19
 
10
- Dimension-d single-definition-ownership cleanup on REQ-013: REQ description now references the request-id header owned on TAC-301.responsibilities[0] rather than restating the header literal. Chain-consistency lint zero on pass 1 and pass 2.
20
+ Dimension-d single-definition-ownership cleanup on REQ-013: REQ description now references the request-id header owned on TAC-301.responsibilities[0] rather than restating the header literal. Chain-consistency lint clean.
11
21
 
12
22
  ## 2.1.3 (register-sweep patch, 2026-09-10)
13
23
 
14
24
  - Register: neutral wording in shipped prose (no capability change).
15
25
 
16
- ## 2.1.2 (application-core completion pass, 2026-09-09)
26
+ ## 2.1.2 (2026-09-09)
17
27
 
18
28
  - Donor hand-sweep on all 118 ACs: flipped 24 additional ACs from fixed to template where the assertion carries a project-set literal (deprecation dates, per-endpoint auth-class binding, downstream dependency sets on readiness, resolved probe paths, declared page-size and maximum limits, filter parameter and sortable-key sets, key-required operation set, de-duplication TTL, per-class rate-limit values and window durations, per-endpoint rate-limit overrides, log-level per class, histogram bucket boundaries, per-endpoint CORS overrides, PII-redaction policy). Each flipped AC carries an Applying agent sets: <specific values> clause. Final split: 87 fixed / 31 template.
19
29
  - Adds vendorCitation to seven ACs whose assertions rest on RFC wire shapes: AC-2102-3 cites RFC 3339 (Date and Time on the Internet: Timestamps); AC-2111-1 through AC-2111-6 cite RFC 7807 (Problem Details for HTTP APIs). Both citation URLs point at datatracker.ietf.org and carry verifiedOn 2026-09-09 (fetched via WebFetch during this pass).
20
30
 
21
- ## 2.1.1 (application-core hardening, 2026-09-09)
22
-
23
- - hardening pass: chain-consistency lint zero (pass1 + pass2); added deliveredBy to every REQ, added ownerRef and disposition to every AC per section 7b, closed case drifts on `content-type` and `idempotency-key` in REQ-002, REQ-010, AC-2102-4, AC-2102-5, AC-2112-1, AC-2112-2 and ADR-306 to match the owner spellings on TAC-301.
24
- - Added AC-2108-9 (readiness deadline: aggregate 503 naming the failed check id and the configured deadline while liveness continues at 200) covering the 2026-09-08 review finding F-1 on TAC-306.interfaces[0] (readiness check registry).
25
-
31
+ ## 2.1.1 (2026-09-09)
26
32
 
33
+ - Hardening cleanup: chain-consistency lint clean; added deliveredBy to every REQ, added ownerRef and disposition to every AC per section 7b, closed case drifts on `content-type` and `idempotency-key` in REQ-002, REQ-010, AC-2102-4, AC-2102-5, AC-2112-1, AC-2112-2 and ADR-306 to match the owner spellings on TAC-301.
34
+ - Added AC-2108-9 (readiness deadline: aggregate 503 naming the failed check id and the configured deadline while liveness continues at 200) on TAC-306.interfaces[0] (readiness check registry), so applying projects have an explicit acceptance criterion for the readiness-deadline path.
@@ -1,6 +1,6 @@
1
1
  # application-api-rest blueprint (v2.0.0)
2
2
 
3
- The second content blueprint on the rcf-build-lite blueprint mechanism (design brief v2, ratified; Phase 3 of the blueprint programme). Scope: a REST service, single deployable, versioned wire contract, no UI in scope. Composes with the application-spa blueprint by design, including two deliberate scope:global conflicts.
3
+ A content blueprint on the rcf-build-lite blueprint mechanism. Scope: a REST service, single deployable, versioned wire contract, no UI in scope. Composes with the application-spa blueprint by design, including two deliberate scope:global conflicts.
4
4
 
5
5
  ## Apply
6
6
 
@@ -27,9 +27,9 @@ The doc set is contributions (copied into the project tree by `rcf define bluepr
27
27
 
28
28
  ## What it contributes, and what it deliberately does not
29
29
 
30
- Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (ratified decision 5) and no code.
30
+ Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (shipped policy 5) and no code.
31
31
 
32
- No FBS contributions, as a matter of principle (ratified policy 2026-08-19): FBSs are the work of the implementing agent, not the blueprint; project constraints have to be applied at the time of creation. The blueprint contributes the WHAT; the implementing agent derives the HOW-tasks (FBS) in the host project, where the ACs contributed here get picked up by the project's own build sequencing.
32
+ No FBS contributions, as a matter of principle (policy): FBSs are the work of the implementing agent, not the blueprint; project constraints have to be applied at the time of creation. The blueprint contributes the WHAT; the implementing agent derives the HOW-tasks (FBS) in the host project, where the ACs contributed here get picked up by the project's own build sequencing.
33
33
 
34
34
  ## The four global decisions
35
35
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "slug": "application-api-rest",
3
- "version": "2.1.5",
3
+ "version": "2.1.10",
4
4
  "category": "application",
5
5
  "contributions": [
6
6
  {
@@ -269,5 +269,6 @@
269
269
  "role": "errorHandling",
270
270
  "reason": "The error translator writes the wire envelope from the internal record; an error-handling companion supplies the record factory and the boundary that constructs it, and the shelf application-error-handling blueprint is the fallback when no library provider is registered."
271
271
  }
272
- ]
272
+ ],
273
+ "updatedAt": "2026-09-11T16:04:17Z"
273
274
  }
@@ -12,7 +12,7 @@
12
12
  {
13
13
  "name": "Per-endpoint auth annotations without classes",
14
14
  "summary": "Each endpoint declares its own middleware stack of auth requirements.",
15
- "reasonNotChosen": "Infinite postures means no enumerable audit story; every endpoint is a bespoke security review, and rate limiting and audit logging cannot attach to anything stable."
15
+ "reasonNotChosen": "Infinite postures means no enumerable audit story; every endpoint is a bespoke security assessment, and rate limiting and audit logging cannot attach to anything stable."
16
16
  },
17
17
  {
18
18
  "name": "Gateway-terminated auth only",
@@ -0,0 +1,154 @@
1
+ // cursor-pagination-round-trip probe for application-api-rest v2.1.10.
2
+ //
3
+ // AC-2109-1 envelope, AC-2109-2 traversal, AC-2109-3 opacity and
4
+ // malformed cursor, AC-2109-5 declared max limit enforcement.
5
+ //
6
+ // anchorAcId: per-row.
7
+
8
+ import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
9
+
10
+ export const anchorReqId = 'application-api-rest-REQ-007';
11
+ export const accountBound = false;
12
+
13
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
14
+
15
+ export default async function runProbe() {
16
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-api-rest/server.js');
17
+ const fixture = await startFixture({ startServer, port: 0 });
18
+ try {
19
+ const results = [];
20
+
21
+ // Row 1 (AC-2109-1): first-page envelope carries items, next, prev.
22
+ const firstRes = await fetch(`${fixture.baseUrl}/v1/widgets?limit=5`);
23
+ const firstBody = await firstRes.text();
24
+ const first = JSON.parse(firstBody);
25
+ const envelopeOk = Array.isArray(first.items)
26
+ && first.items.length === 5
27
+ && typeof first.next === 'string'
28
+ && first.prev === null;
29
+ results.push({
30
+ anchorAcId: 'application-api-rest-AC-2109-1',
31
+ verdict: firstRes.status === 200 && envelopeOk ? 'pass' : 'fail',
32
+ detail: `Every collection endpoint accepts ?cursor= and ?limit= and - GET /v1/widgets?limit=5 returned items[${first.items?.length ?? 0}] next=${typeof first.next}(${(first.next || '').slice(0, 12)}...) prev=${first.prev}`,
33
+ evidence: evidenceFromResponse({
34
+ route: '/v1/widgets?limit=5',
35
+ response: firstRes,
36
+ bodyText: firstBody,
37
+ extraFields: {
38
+ input: { limit: 5, cursor: null },
39
+ derived: { itemsLen: first.items?.length ?? 0, next: first.next, prev: first.prev, firstIds: (first.items || []).map((i) => i.id) },
40
+ },
41
+ }),
42
+ });
43
+
44
+ // Row 2 (AC-2109-2): traversal visits every item exactly once and next is null on the last page.
45
+ const visited = new Set();
46
+ let dupes = 0;
47
+ for (const it of first.items) { if (visited.has(it.id)) dupes += 1; visited.add(it.id); }
48
+ let cursor = first.next;
49
+ let pages = 0;
50
+ let last = first, lastRes = firstRes, lastBody = firstBody;
51
+ while (cursor && pages < 20) {
52
+ const r = await fetch(`${fixture.baseUrl}/v1/widgets?limit=5&cursor=${encodeURIComponent(cursor)}`);
53
+ const b = await r.text();
54
+ const p = JSON.parse(b);
55
+ for (const it of (p.items || [])) { if (visited.has(it.id)) dupes += 1; visited.add(it.id); }
56
+ last = p; lastRes = r; lastBody = b; cursor = p.next; pages += 1;
57
+ }
58
+ const traversalOk = last.next === null && dupes === 0 && visited.size === 12;
59
+ results.push({
60
+ anchorAcId: 'application-api-rest-AC-2109-2',
61
+ verdict: traversalOk ? 'pass' : 'fail',
62
+ detail: `next is null on the last page and - traversal via next visited ${visited.size} unique items over ${pages + 1} pages, dupes=${dupes}, final next=${last.next}`,
63
+ evidence: evidenceFromResponse({
64
+ route: '/v1/widgets (traversal tail)',
65
+ response: lastRes,
66
+ bodyText: lastBody,
67
+ extraFields: {
68
+ input: { limit: 5, followFromCursor: first.next },
69
+ derived: { uniqueVisited: visited.size, dupes, finalNext: last.next, pages: pages + 1 },
70
+ },
71
+ }),
72
+ });
73
+
74
+ // Row 3 (AC-2109-3 opacity): the emitted token is not a decodable
75
+ // positional marker. It is an opaque UUID; base64url decode is not
76
+ // parseable as JSON and any positional info the client tries to
77
+ // recover fails.
78
+ const cursorStr = first.next;
79
+ const numericFallback = Number.parseInt(cursorStr, 10);
80
+ const parseableAsInt = Number.isFinite(numericFallback) && String(numericFallback) === cursorStr;
81
+ let base64JsonReadable = false;
82
+ try {
83
+ const decoded = Buffer.from(cursorStr, 'base64url').toString('utf8');
84
+ const parsed = JSON.parse(decoded);
85
+ if (parsed && typeof parsed === 'object') base64JsonReadable = true;
86
+ } catch { base64JsonReadable = false; }
87
+ const looksLikeUuid = UUID_RE.test(cursorStr);
88
+ const opaque = !parseableAsInt && !base64JsonReadable;
89
+ results.push({
90
+ anchorAcId: 'application-api-rest-AC-2109-3',
91
+ verdict: opaque ? 'pass' : 'fail',
92
+ detail: `Cursors are opaque: they carry no client-decodable positional - cursor "${cursorStr}" parseableAsInt=${parseableAsInt} base64UrlJsonReadable=${base64JsonReadable} looksLikeUuid=${looksLikeUuid}`,
93
+ evidence: evidenceFromResponse({
94
+ route: '/v1/widgets?limit=5',
95
+ response: firstRes,
96
+ bodyText: firstBody,
97
+ extraFields: {
98
+ input: { cursor: cursorStr },
99
+ derived: { parseableAsInt, base64UrlJsonReadable: base64JsonReadable, looksLikeUuid, opaque },
100
+ },
101
+ }),
102
+ });
103
+
104
+ // Row 4 (AC-2109-3 malformed cursor -> problem+json).
105
+ const malformedRes = await fetch(`${fixture.baseUrl}/v1/widgets?limit=5&cursor=not-a-cursor`);
106
+ const malformedBody = await malformedRes.text();
107
+ let malformedJson = null;
108
+ try { malformedJson = JSON.parse(malformedBody); } catch {}
109
+ const malformedOk = malformedRes.status === 400
110
+ && (malformedRes.headers.get('content-type') || '').includes('application/problem+json')
111
+ && malformedJson && malformedJson.type && malformedJson.type.includes('cursor-invalid');
112
+ results.push({
113
+ anchorAcId: 'application-api-rest-AC-2109-3',
114
+ verdict: malformedOk ? 'pass' : 'fail',
115
+ detail: `Cursors are opaque: they carry no client-decodable positional - malformed cursor "not-a-cursor" returned ${malformedRes.status} problem+json type=${malformedJson?.type ?? 'null'}`,
116
+ evidence: evidenceFromResponse({
117
+ route: '/v1/widgets?cursor=not-a-cursor',
118
+ response: malformedRes,
119
+ bodyText: malformedBody,
120
+ extraFields: {
121
+ input: { cursor: 'not-a-cursor' },
122
+ derived: { httpStatus: malformedRes.status, problemType: malformedJson?.type ?? null },
123
+ },
124
+ }),
125
+ });
126
+
127
+ // Row 5 (AC-2109-5 max-limit -> problem+json).
128
+ const overLimitRes = await fetch(`${fixture.baseUrl}/v1/widgets?limit=999`);
129
+ const overLimitBody = await overLimitRes.text();
130
+ let overLimitJson = null;
131
+ try { overLimitJson = JSON.parse(overLimitBody); } catch {}
132
+ const overLimitOk = overLimitRes.status === 400
133
+ && (overLimitRes.headers.get('content-type') || '').includes('application/problem+json')
134
+ && overLimitJson && overLimitJson.type && overLimitJson.type.includes('limit-exceeded');
135
+ results.push({
136
+ anchorAcId: 'application-api-rest-AC-2109-5',
137
+ verdict: overLimitOk ? 'pass' : 'fail',
138
+ detail: `The declared maximum limit is enforced: a request - ?limit=999 returned ${overLimitRes.status} problem+json type=${overLimitJson?.type ?? 'null'}`,
139
+ evidence: evidenceFromResponse({
140
+ route: '/v1/widgets?limit=999',
141
+ response: overLimitRes,
142
+ bodyText: overLimitBody,
143
+ extraFields: {
144
+ input: { limit: 999 },
145
+ derived: { httpStatus: overLimitRes.status, problemType: overLimitJson?.type ?? null },
146
+ },
147
+ }),
148
+ });
149
+
150
+ return { results };
151
+ } finally {
152
+ await fixture.close();
153
+ }
154
+ }
@@ -0,0 +1,124 @@
1
+ // health-probes-distinct probe for application-api-rest v2.1.10.
2
+ //
3
+ // AC-2108-1: liveness returns 200 with no dependency checks whatsoever.
4
+ // AC-2108-2: readiness returns 200 only when every declared check passes.
5
+ // AC-2108-4: startup returns 200 only after initialisation completes.
6
+ //
7
+ // anchorAcId: per-row.
8
+
9
+ import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
10
+
11
+ export const anchorReqId = 'application-api-rest-REQ-006';
12
+ export const accountBound = false;
13
+
14
+ export default async function runProbe() {
15
+ const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-api-rest/server.js');
16
+ const fixture = await startFixture({ startServer, port: 0 });
17
+ try {
18
+ const results = [];
19
+
20
+ // AC-2108-1: liveness is 200 regardless of dependency availability.
21
+ // The derivation is that varying ?deps= does NOT change the returned
22
+ // status, and the response records dependencyChecksPerformed=0.
23
+ const liveUp = await fetch(`${fixture.baseUrl}/livez?deps=up`);
24
+ const liveUpBody = await liveUp.text();
25
+ const liveUpJson = JSON.parse(liveUpBody);
26
+ const liveDown = await fetch(`${fixture.baseUrl}/livez?deps=down`);
27
+ const liveDownBody = await liveDown.text();
28
+ const liveDownJson = JSON.parse(liveDownBody);
29
+ const liveUnknown = await fetch(`${fixture.baseUrl}/livez?deps=unknown`);
30
+ const liveUnknownBody = await liveUnknown.text();
31
+ const liveUnknownJson = JSON.parse(liveUnknownBody);
32
+ const allTwoHundred = liveUp.status === 200 && liveDown.status === 200 && liveUnknown.status === 200;
33
+ const noDepsChecked = liveUpJson.dependencyChecksPerformed === 0
34
+ && liveDownJson.dependencyChecksPerformed === 0
35
+ && liveUnknownJson.dependencyChecksPerformed === 0;
36
+ const livenessOk = allTwoHundred && noDepsChecked;
37
+ results.push({
38
+ anchorAcId: 'application-api-rest-AC-2108-1',
39
+ verdict: livenessOk ? 'pass' : 'fail',
40
+ detail: `GET on the resolved liveness path returns 200 - /livez returned ${liveUp.status}/${liveDown.status}/${liveUnknown.status} across ?deps=up|down|unknown; dependencyChecksPerformed reported ${liveUpJson.dependencyChecksPerformed}/${liveDownJson.dependencyChecksPerformed}/${liveUnknownJson.dependencyChecksPerformed}`,
41
+ evidence: evidenceFromResponse({
42
+ route: '/livez?deps=down',
43
+ response: liveDown,
44
+ bodyText: liveDownBody,
45
+ extraFields: {
46
+ input: { depsSequence: ['up', 'down', 'unknown'] },
47
+ derived: {
48
+ statuses: [liveUp.status, liveDown.status, liveUnknown.status],
49
+ dependencyChecksPerformed: [liveUpJson.dependencyChecksPerformed, liveDownJson.dependencyChecksPerformed, liveUnknownJson.dependencyChecksPerformed],
50
+ unaffectedByDependencyOutage: livenessOk,
51
+ },
52
+ altBodyExcerpt: liveUpBody.slice(0, 240),
53
+ },
54
+ }),
55
+ });
56
+
57
+ // AC-2108-2: readiness returns 200 only when every declared check passes.
58
+ const readyUp = await fetch(`${fixture.baseUrl}/readyz?deps=up`);
59
+ const readyUpBody = await readyUp.text();
60
+ const readyUpJson = JSON.parse(readyUpBody);
61
+ const readyDown = await fetch(`${fixture.baseUrl}/readyz?deps=down`);
62
+ const readyDownBody = await readyDown.text();
63
+ const readyDownJson = JSON.parse(readyDownBody);
64
+ const readinessAllChecked = Array.isArray(readyUpJson.checks) && readyUpJson.checks.every((c) => c.ok === true);
65
+ const readinessDownDetected = readyDown.status === 503 && readyDownJson.checks.some((c) => c.ok === false);
66
+ const readinessDerived = readyUp.status === 200 && readinessAllChecked && readinessDownDetected;
67
+ results.push({
68
+ anchorAcId: 'application-api-rest-AC-2108-2',
69
+ verdict: readinessDerived ? 'pass' : 'fail',
70
+ detail: `GET on the resolved readiness path returns 200 - /readyz enumerates ${readyUpJson.checks?.length ?? 0} declared checks; all pass in up-state (${readyUp.status}), at least one down in down-state (${readyDown.status})`,
71
+ evidence: evidenceFromResponse({
72
+ route: '/readyz?deps=up',
73
+ response: readyUp,
74
+ bodyText: readyUpBody,
75
+ extraFields: {
76
+ input: { depsSequence: ['up', 'down'] },
77
+ derived: {
78
+ checksInUp: readyUpJson.checks,
79
+ checksInDown: readyDownJson.checks,
80
+ upStatus: readyUp.status,
81
+ downStatus: readyDown.status,
82
+ },
83
+ altBodyExcerpt: readyDownBody.slice(0, 240),
84
+ },
85
+ }),
86
+ });
87
+
88
+ // AC-2108-4: startup returns 200 only after initialisation completes.
89
+ const startupInit = await fetch(`${fixture.baseUrl}/startupz?state=init`);
90
+ const startupInitBody = await startupInit.text();
91
+ const startupInitJson = JSON.parse(startupInitBody);
92
+ const startupComplete = await fetch(`${fixture.baseUrl}/startupz?state=complete`);
93
+ const startupCompleteBody = await startupComplete.text();
94
+ const startupCompleteJson = JSON.parse(startupCompleteBody);
95
+ const startupDerived = startupInit.status === 503
96
+ && Array.isArray(startupInitJson.pending) && startupInitJson.pending.length > 0
97
+ && startupComplete.status === 200
98
+ && Array.isArray(startupCompleteJson.pending) && startupCompleteJson.pending.length === 0;
99
+ results.push({
100
+ anchorAcId: 'application-api-rest-AC-2108-4',
101
+ verdict: startupDerived ? 'pass' : 'fail',
102
+ detail: `GET on the resolved startup path returns 200 - /startupz drives ${startupInitJson.pending?.length ?? 0} pending steps in init-state (${startupInit.status}) and ${startupCompleteJson.pending?.length ?? 0} in complete-state (${startupComplete.status})`,
103
+ evidence: evidenceFromResponse({
104
+ route: '/startupz?state=init',
105
+ response: startupInit,
106
+ bodyText: startupInitBody,
107
+ extraFields: {
108
+ input: { stateSequence: ['init', 'complete'] },
109
+ derived: {
110
+ initStatus: startupInit.status,
111
+ initPending: startupInitJson.pending,
112
+ completeStatus: startupComplete.status,
113
+ completePending: startupCompleteJson.pending,
114
+ },
115
+ altBodyExcerpt: startupCompleteBody.slice(0, 240),
116
+ },
117
+ }),
118
+ });
119
+
120
+ return { results };
121
+ } finally {
122
+ await fixture.close();
123
+ }
124
+ }
@@ -0,0 +1,177 @@
1
+ // Shared helpers for application-api-rest probes.
2
+ //
3
+ // The engine under probe is the sample-app fixture at
4
+ // packages/rcf-lite/test/fixtures/probe-pack-application-api-rest/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-api-rest');
23
+ export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/application-api-rest');
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-api-rest',
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,77 @@
1
+ // problem-details-on-error probe for application-api-rest v2.1.10.
2
+ //
3
+ // Verifies AC-2111-1 (RFC 7807 shape and content-type on any error
4
+ // path) and AC-2111-3 (envelope status equals HTTP status line).
5
+ // Each observation is a separate row so a defect at one AC does
6
+ // not hide behind the other's pass.
7
+ //
8
+ // anchorAcId: application-api-rest-AC-2111-1 (row 1) and
9
+ // application-api-rest-AC-2111-3 (row 2).
10
+
11
+ import { startFixture, evidenceFromResponse } from './probe-utils.mjs';
12
+
13
+ export const anchorReqId = 'application-api-rest-REQ-009';
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-api-rest/server.js');
18
+ const fixture = await startFixture({ startServer, port: 0 });
19
+ try {
20
+ const results = [];
21
+
22
+ const res = await fetch(`${fixture.baseUrl}/v1/widgets/does-not-exist`);
23
+ const body = await res.text();
24
+ const parsed = JSON.parse(body);
25
+ const cType = res.headers.get('content-type') || '';
26
+ const requiredFields = ['type', 'title', 'status', 'detail', 'instance'];
27
+ const missing = requiredFields.filter((k) => !(k in parsed));
28
+ const shapeOk = res.status === 404
29
+ && cType.includes('application/problem+json')
30
+ && missing.length === 0;
31
+ results.push({
32
+ anchorAcId: 'application-api-rest-AC-2111-1',
33
+ anchorReqId: 'application-api-rest-REQ-009',
34
+ verdict: shapeOk ? 'pass' : 'fail',
35
+ detail: shapeOk
36
+ ? 'Every 4xx and 5xx response body is an - GET /v1/widgets/does-not-exist returned application/problem+json with all five RFC 7807 fields'
37
+ : `Every 4xx and 5xx response body is an - problem-details shape fault: status=${res.status} contentType=${cType} missing=${JSON.stringify(missing)}`,
38
+ evidence: evidenceFromResponse({
39
+ route: '/v1/widgets/does-not-exist',
40
+ response: res,
41
+ bodyText: body,
42
+ extraFields: {
43
+ input: { path: '/v1/widgets/does-not-exist' },
44
+ derived: { contentType: cType, missingFields: missing },
45
+ },
46
+ }),
47
+ });
48
+
49
+ // Row 2: envelope status equals HTTP status line (AC-2111-3).
50
+ // Drive an unknown route to force a distinct 404 body and check
51
+ // both status positions agree.
52
+ const res2 = await fetch(`${fixture.baseUrl}/unknown-route`);
53
+ const body2 = await res2.text();
54
+ const parsed2 = JSON.parse(body2);
55
+ const equalOk = res2.status === 404 && parsed2.status === res2.status;
56
+ results.push({
57
+ anchorAcId: 'application-api-rest-AC-2111-3',
58
+ anchorReqId: 'application-api-rest-REQ-009',
59
+ verdict: equalOk ? 'pass' : 'fail',
60
+ detail: equalOk
61
+ ? `The status field inside the envelope always equals - envelope status=${parsed2.status} equals HTTP status ${res2.status}`
62
+ : `The status field inside the envelope always equals - status-equality fault: httpStatus=${res2.status} envelopeStatus=${parsed2.status}`,
63
+ evidence: evidenceFromResponse({
64
+ route: '/unknown-route',
65
+ response: res2,
66
+ bodyText: body2,
67
+ extraFields: {
68
+ input: { path: '/unknown-route' },
69
+ derived: { httpStatus: res2.status, envelopeStatus: parsed2.status, equal: parsed2.status === res2.status },
70
+ },
71
+ }),
72
+ });
73
+ return { results };
74
+ } finally {
75
+ await fixture.close();
76
+ }
77
+ }