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
@@ -28,9 +28,9 @@ The doc set is contributions (copied into the project tree by `rcf define bluepr
28
28
 
29
29
  ## What it contributes, and what it deliberately does not
30
30
 
31
- 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.
31
+ 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.
32
32
 
33
- 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 deploy shape, the adapter contract, the manifest shape, the three URL kinds, the promote-is-explicit posture, the rollback-is-promote posture, the served-surface verify shape, the dev-mode drift posture, the build-provenance surface); 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
+ 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 deploy shape, the adapter contract, the manifest shape, the three URL kinds, the promote-is-explicit posture, the rollback-is-promote posture, the served-surface verify shape, the dev-mode drift posture, the build-provenance surface); 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.
34
34
 
35
35
  Deliberately not contributed: a vendor CLI implementation (the default vendor is named in ADR-1302 as Cloudflare's `wrangler`, the shape of the vendor binding is fixed by TAC-1301, the actual binding code is a project-authored implementation shelling to the CLI); a project's authorisation model for who is allowed to promote (promote authorisation sits at the CI platform's own permission model on the `workflow_dispatch` primitive); a promote-approval workflow (a project that wants an approver review on every promote layers a manual-approval step above the `workflow_dispatch` trigger); a canary or gradual-rollout controller (the vendor's own primitives support gradual promote where the operator wants it; the blueprint mandates the served-surface verifier on the eventual full promote); an image or artefact registry (the vendor's own upload-and-version primitive is the artefact store); a project's audit-log storage engine (the blueprint fixes the deploy-log record shape, not where the records land); a status page (the observability-essentials blueprint owns `statusPageContract`; the deploy log feeds into it); the secrets pipeline itself (the security-secrets-management blueprint owns `secretsSource`; this blueprint consumes it for the vendor API token and any application secret bindings the Worker reads).
36
36
 
@@ -46,7 +46,7 @@ Repo-root wrangler manifest as the sole declaration of Worker name, entry, compa
46
46
 
47
47
  ## What v1.2.0 adds
48
48
 
49
- v1.2.0 is an additive-minor bump. Every shipped v1.1.0 contribution carries through unchanged; the compose invocation is identical (`rcf define blueprint add <path-to>/blueprints/deploy-cloudflare-workers` unchanged); no capability minted; no new global topic; no runtime dependency added; `suggestedCompanions` unchanged (`logging`, `errorHandling`). The bump blesses the Workers-with-static-assets shape as the ratified SPA-on-Workers deploy shape, per the Cloudflare Pages landing-page recommendation (fetched 2026-09-06, verbatim quote on `ADR-1306`).
49
+ v1.2.0 is an additive-minor bump. Every shipped v1.1.0 contribution carries through unchanged; the compose invocation is identical (`rcf define blueprint add <path-to>/blueprints/deploy-cloudflare-workers` unchanged); no capability minted; no new global topic; no runtime dependency added; `suggestedCompanions` unchanged (`logging`, `errorHandling`). The bump blesses the Workers-with-static-assets shape as the shipped SPA-on-Workers deploy shape, per the Cloudflare Pages landing-page recommendation (verbatim quote on `ADR-1306`).
50
50
 
51
51
  - **Workers-with-static-assets shape (`REQ-013`, `REQ-014`).** Two new REQs cover the `[assets] directory` block on `wrangler.toml` and the SPA fallback discipline via `run_worker_first`. Three new USs in the existing 12xx band (`US-12113` SPA-on-Workers deploy, `US-12114` assets-directory elicitation, `US-12115` migrate-from-Pages guidance) bind the runtime-observable ACs to `TAC-1302-deploy-cloudflare-workers-wrangler-manifest`.
52
52
  - **Ratified shape decision (`ADR-1306-deploy-cloudflare-workers-spa-shape`).** Body carries the Cloudflare landing-page quote verbatim; the contribution entry carries `recommendedDefault: true` and `standardsTraceClause: Cloudflare Pages landing-page recommendation (2026-09-06)` per `blueprint-authoring.md` section 8a.2. The ADR names a project-level supersede path for projects that keep the bare-Worker shape or stay on Pages.
@@ -4,9 +4,9 @@
4
4
  "tadId": "TAD-001",
5
5
  "version": "1.2.0",
6
6
  "status": "accepted",
7
- "title": "Workers-with-static-assets is the ratified SPA-on-Workers deploy shape; Pages is a documented alternative held for legacy projects only",
7
+ "title": "Workers-with-static-assets is the shipped SPA-on-Workers deploy shape; Pages is a documented alternative held for legacy projects only",
8
8
  "context": "Cloudflare ships two shapes for browsing static assets in front of a Workers-tier deploy target: Cloudflare Pages (a workflow-shaped product with its own build pipeline and its own preview URL model) and Workers-with-static-assets (a wrangler.toml [assets] block declaring a directory the Cloudflare runtime serves at the edge). Cloudflare's own Pages landing page states, verbatim (fetched 2026-09-06): 'Workers supports most Pages use cases and offers a broader feature set. It is Cloudflare's primary platform for building applications. Start new projects with Workers.' The prior v1.1.0 blueprint blessed neither shape as the default; v1.1.0 taught the wrangler [assets] block in an asset sample but left the shape choice implicit. The round-6 bump takes the blueprint to v1.2.0 to close the gap: a rcf-lite project choosing SPA-on-Workers gets a single, ratified wrangler shape rather than a hand-rolled convention, and the ratified shape follows Cloudflare's own recommendation for new projects.",
9
- "decision": "The blueprint blesses Workers-with-static-assets as the ratified SPA-on-Workers deploy shape (recommendedDefault true for new SPA projects). A project answering the elicited assets-directory parameter with a non-empty path emits an [assets] block on wrangler.toml whose directory value carries the elicited path; a project answering with an empty path keeps the bare-Worker shape (no [assets] block). The elicited run-worker-first (boolean, default false) surfaces the SPA fallback discipline: truthy answers emit run_worker_first = true under the [assets] block; falsy or unanswered answers omit the field, letting Cloudflare's runtime run asset lookup before the Worker fetch handler. The blueprint does not mint a Cloudflare Pages blueprint; a future deploy-cloudflare-pages-legacy sibling mints on demand only if a project cannot make the jump. Every existing v1.1.0 contribution carries through unchanged.",
9
+ "decision": "The blueprint blesses Workers-with-static-assets as the shipped SPA-on-Workers deploy shape (recommendedDefault true for new SPA projects). A project answering the elicited assets-directory parameter with a non-empty path emits an [assets] block on wrangler.toml whose directory value carries the elicited path; a project answering with an empty path keeps the bare-Worker shape (no [assets] block). The elicited run-worker-first (boolean, default false) surfaces the SPA fallback discipline: truthy answers emit run_worker_first = true under the [assets] block; falsy or unanswered answers omit the field, letting Cloudflare's runtime run asset lookup before the Worker fetch handler. The blueprint does not mint a Cloudflare Pages blueprint; a future deploy-cloudflare-pages-legacy sibling mints on demand only if a project cannot make the jump. Every existing v1.1.0 contribution carries through unchanged.",
10
10
  "consequences": "One ratified shape lands on the shelf for greenfield SPA-on-Workers projects; the shape's standards trace is the Cloudflare Pages landing-page recommendation (2026-09-06 snapshot). The two new elicits become part of the operator surface at blueprint add: assets-directory names the static-assets root, run-worker-first names the SPA fallback discipline. A project generating both an [assets] block and a Pages-only pages_build_output_dir field is a mixed-shape drift the probe (assets-manifest-scan.mjs) refuses. A project on the legacy Pages shape stays on v1.1.0 semantics until it migrates; the guide's new Workers-with-static-assets section links Cloudflare's migrate-from-Pages walkthrough for projects that choose to jump. Future blueprints in this family (KV, cron, DO, Access, Turnstile, rate-limiting) all compose on this shape via the shared cf-platform sample-app fixture.",
11
11
  "alternativesConsidered": [
12
12
  {
@@ -14,7 +14,7 @@ Rules for new topics (inherited from the application-spa, application-api-rest,
14
14
 
15
15
  ## Id number bands (registry bootstrap)
16
16
 
17
- AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.5.0 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is ratified policy (2026-08-19); this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
17
+ AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.5.0 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is policy; this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
18
18
 
19
19
  This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
20
20
 
@@ -59,7 +59,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
59
59
  | platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
60
60
  | edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
61
61
 
62
- US 12101-12112 sit at the LOW end of the 12101-12899 band on purpose. A project-side story that mechanically derives from a deploy-cloudflare-workers REQ id into the number `12112` would collide against deploy-cloudflare-workers-US-12112 in this package; the band leaves headroom at the HIGH end (US 12181-12899) so a project's own stories anchored to deploy-cloudflare-workers REQs can allocate without conflict. The watchpost run4 lesson applies here too. Band spacing between the last shipped block (security-secrets-management, 8101-8899, 9xx) and this one (12101-12899, 13xx) leaves the 9xxx-11xxx US bands and the 10xx-12xx suffix blocks open for concurrent-lane authoring so a peer authoring another blueprint in the same PR window does not collide with this one.
62
+ US 12101-12112 sit at the LOW end of the 12101-12899 band on purpose. A project-side story that mechanically derives from a deploy-cloudflare-workers REQ id into the number `12112` would collide against deploy-cloudflare-workers-US-12112 in this package; the band leaves headroom at the HIGH end (US 12181-12899) so a project's own stories anchored to deploy-cloudflare-workers REQs can allocate without conflict. Band spacing between the last shipped block (security-secrets-management, 8101-8899, 9xx) and this one (12101-12899, 13xx) leaves the 9xxx-11xxx US bands and the 10xx-12xx suffix blocks reserved so concurrent allocation in another blueprint cannot collide with this one.
63
63
 
64
64
  ## Shared expectations for future composing blueprints
65
65
 
@@ -1,3 +1,94 @@
1
+ ## 1.1.17 - 2026-09-12
2
+
3
+ - Event-correlation fixtures now cover BOTH shipped producers (v1.1.17). The existing positive and negative controls in `deploy-hetzner-server-anatomy.test.js` remain built from the field set the first producer emits (`fixtures/hetzner-throwaway-server/provision.mjs` :77-85, the `{event, id, name, primaryIpv4, location, serverType, ts}` field set). A new positive and negative control pair, alongside the existing pair in the same test, is built from the field set the second producer emits (`fixtures/hetzner-throwaway-server/src/provisioner-facade.mjs` :50, :93-100, the `{event, id, primaryIpv4, location, serverType, labels}` field set, with `labels`, without `name` and `ts`); the negative shares the facade shape with a different top-level `id`. Every control calls `walkRecordRow` end to end and the helper correlates on the event body's own `id` field for both shapes.
4
+ - `blueprint.json` bumps to 1.1.17 with the anatomy pin in lockstep; `updatedAt` refreshed. Family records regenerated through the shipped run path with no account variables set so each carries `version: "1.1.17"` and the repository walk validates all six.
5
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with an identifier of the required shape present in the record's own engine evidence.
6
+
7
+ ## 1.1.16 - 2026-09-12
8
+
9
+ - Event-correlation fixtures are exact instances of the shipped `hetznerServerProvisioned` event (v1.1.16). The positive and negative controls in `deploy-hetzner-server-anatomy.test.js` are built from the field set one of the shipped producers emits (`fixtures/hetzner-throwaway-server/provision.mjs` :77-85): every field that producer emits, no invented `detail`, nothing omitted. The negative shares the same shape as the positive with a different top-level `id`, and carries the digits of the row's `evidence.serverId` inside the shipped `name` string field the producer really emits. Every control calls `walkRecordRow` end to end. The second shipped producer (`src/provisioner-facade.mjs` :50, :93-100) emits a different field set (with `labels`, without `name` and `ts`); it is not covered at 1.1.16.
10
+ - `blueprint.json` bumps to 1.1.16 with the anatomy pin in lockstep; `updatedAt` refreshed. Family records regenerated through the shipped run path with no account variables set so each carries `version: "1.1.16"` and the repository walk validates all six.
11
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with an identifier of the required shape present in the record's own engine evidence.
12
+
13
+ ## 1.1.15 - 2026-09-12
14
+
15
+ - Split record walker: `walkRepositoryRecords(dir, expectedVersion)` and `walkHandOffRecords(dir)` (v1.1.15). Two functions, two tests, no shared bypass. The repository walk (what CI runs) has NO conditional branch tied to any override: every present record under `.rcf/reports/blueprints/deploy-hetzner-server/` MUST carry `version === blueprint.version` and a missing or different version FAILS with the file named. The hand-off walk runs only when `RCF_LITE_RECORDS_DIR` is set, applies every row validator to the operator-side records, and asserts in its own message that those records predate the version writer (they carry no `version` field, and hand-editing a version into a hand-off record is out). There is no `RCF_LITE_EXPECTED_VERSION` variable anywhere.
16
+ - Event correlation uses the field the shipped producer actually emits (v1.1.15). `hetznerServerProvisioned` (and `hetznerServerDestroyed`) events carry the vendor id on the event body's own top-level `id` field (`packages/rcf-lite/test/fixtures/hetzner-throwaway-server/provision.mjs` and `src/provisioner-facade.mjs`); the walker correlates by exact equality against that field on `event === 'hetznerServerProvisioned' | 'hetznerServerDestroyed'` entries only. A substring over the event `name` or `detail` does NOT correlate, and no invented `serverId` field on an event body is consulted (the producer never emits one).
17
+ - Every negative case invokes the operative walker or helper (v1.1.15). Versionless, wrong-version, non-directory, malformed-JSON, empty / non-array / missing results and stub-row cases each build a scratch directory and call `walkRepositoryRecords`; the event-correlation negative builds a synthetic record with a misleading event trail and calls `walkRecordRow` end to end. No duplicated lambdas, no direct `assert.equal` stand-ins.
18
+ - `blueprint.json` bumps to 1.1.15 with the anatomy pin in lockstep; `updatedAt` refreshed. Family records regenerated through the shipped run path with no account variables set so each carries `version: "1.1.15"` and the repository walk validates all six.
19
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with an identifier of the required shape present in the record's own engine evidence.
20
+
21
+ ## 1.1.13 - 2026-09-12
22
+
23
+ - Anatomy per-field validators tightened (v1.1.13). The `exitStatus` and `cloudInit.code` fields on `real-account-cloud-init-hardened / AC-37105-1` must each equal exactly 0; `baselineChecks` accepts only `true`, `"pass"` or `"ok"` per entry (boolean `false`, the string `"fail"`, an empty status, a missing id and every other shape FAIL); `postCreateSnapshotIds` and `postTeardownSnapshotIds` reject `NaN`, `Infinity`, `-Infinity`, zero and negative integers alongside every non-vendor-id shape. Identifier presence is checked by shape (`serverId` and `snapshotId` are positive integers or non-empty numeric strings; a Docker `containerId` is 64-hex) and by presence in the record's own engine evidence, not by string echo.
24
+ - Cloud-init both-zero cross-field added (v1.1.13). When both `exitStatus` and `cloudInit` are present in the row's evidence tree, BOTH must be exactly 0. A row that carries `{exitStatus: 0, cloudInit: {code: 137}}` (or the mirror) FAILS - the anyOf letters through on `exitStatus` alone, but the contradictory `cloudInit.code` exposes an unclean run. Rows that carry only one of the two continue to pass on the anyOf as before, so the shipped happy-path record shape is unaffected. A synthetic negative case in `packages/rcf-lite/test/blueprint/deploy-hetzner-server-anatomy.test.js` proves both directions and the accepted `exitStatus === 0 AND cloudInit.code === 0` case.
25
+ - Snapshot inventory cross-field from v1.1.12 stays in force: a passing `real-account-snapshot-on-demand / AC-37108-1` row MUST carry `snapshotId` inside `postCreateSnapshotIds` AND MUST NOT carry it inside `postTeardownSnapshotIds`.
26
+ - Anatomy record walk rejects empty result sets (v1.1.13). A present record whose `results` is absent, not an array, or an empty array FAILS - a record that carries a probeName but no rows attests to nothing. The v1.1.12 malformed-row rejection (evidence / limitation / reason / `notObservableHere.ac` markers) stays in force. `no local records` remains the only permitted early-return, and only when the directory itself has no record files.
27
+ - Anatomy walkers accept an optional records-directory override (v1.1.13): with `RCF_LITE_RECORDS_DIR` set the walker reads `<dir>/deploy-hetzner-server/*.json` instead of the tree default. CI never sets this variable; the operator-side evidence walk uses it.
28
+ - Family records regenerated (v1.1.13). Every shipped probe on this blueprint (`cloud-init-render-lint`, `hcloud-dry-run-mock`, `manifest-schema-validate`, `real-account-cloud-init-hardened`, `real-account-snapshot-on-demand`, `real-account-throwaway-server-provision`) was run through its run-shim with NO account variables set: offline / mock probes wrote `conformanceOnly` rows anchored to their shipped ACs, and each real-account probe wrote its single-variable `accountBoundSkipped` row naming `CI_HAS_HETZNER_ACCOUNT`. Six record files live under `.rcf/reports/blueprints/deploy-hetzner-server/`; every row is one the current probe wrote at the current version and the strict walker validates all of them.
29
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with an identifier of the required shape present in the record's own engine evidence.
30
+
31
+ ## 1.1.12 - 2026-09-12
32
+
33
+ - Anatomy per-field validators tightened (v1.1.12) with explicit `NaN`, `Infinity`, `-Infinity` and negative-value negative cases for every numeric field. `exitStatus` must equal exactly 0 (a non-zero exit or a non-integer value FAILS); `cloudInit.code` must equal exactly 0; `baselineChecks` rejects a boolean `false` verdict and the string `"fail"` (only `true`, `"pass"` and `"ok"` are accepted); and `postCreateSnapshotIds` / `postTeardownSnapshotIds` reject `NaN`, `Infinity`, `-Infinity` and negative integers alongside the earlier non-conformant shapes.
34
+ - Snapshot inventory cross-field rule added (v1.1.12): a passing `real-account-snapshot-on-demand / AC-37108-1` row MUST carry `snapshotId` inside `postCreateSnapshotIds` AND MUST NOT carry it inside `postTeardownSnapshotIds`. A synthetic negative case in `packages/rcf-lite/test/blueprint/deploy-hetzner-server-anatomy.test.js` proves both halves fail with the appropriate error.
35
+ - Anatomy record walk no longer skips malformed rows as `stubs` (v1.1.12). Every row of every present local record is validated: a row lacking evidence, a `limitation`, a skip `reason` and a `notObservableHere.ac` marker FAILS. A paired synthetic negative case proves the walker rejects a stub row without touching `.rcf/reports/`. `no local records` remains the only permitted early-return, and only when the directory itself has no record files.
36
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with an identifier of the required shape present in the record's own engine evidence.
37
+
38
+ ## 1.1.11 - 2026-09-11
39
+
40
+ - Anatomy applies row-specific value validators (v1.1.11) instead of null/undefined presence checks alone. `real-account-throwaway-server-provision` requires a documentation-range-shaped `primaryIpv4` and a vendor-listed `location`; `real-account-cloud-init-hardened` requires a non-empty `baselineChecks` array whose entries each carry a non-empty `id` and a `verdict`/`status`, and at least one of an integer `exitStatus` or a `cloudInit` object with a numeric `code`; `real-account-snapshot-on-demand` requires a non-empty vendor-id array for `postCreateSnapshotIds` and a vendor-id array (possibly empty, once the snapshot is destroyed) for `postTeardownSnapshotIds`. Empty strings, empty arrays, `false`, `NaN` and malformed values now FAIL; one negative-proof test per validator is added to `packages/rcf-lite/test/blueprint/deploy-hetzner-server-anatomy.test.js`.
41
+ - Unmapped offline / mock probes (`hcloud-dry-run-mock`, `manifest-schema-validate`, `cloud-init-render-lint`) MUST NOT emit `accountBoundSkipped` rows: they have no declared gate variable to skip on, so only `conformanceOnly` rows are permitted. `assertRowsCarry7dShape` now refuses a skip row from any unmapped probe; the change is proved by a paired negative / positive test.
42
+ - Anatomy synthetic fixtures carry unmistakably synthetic vendor-id integers (`424242`, `424243`, `4242424`) and a documentation-range `primaryIpv4` (`198.51.100.10`, RFC 5737 TEST-NET-3). No live-account identifiers appear in branch source.
43
+ - Anatomy walks any records under `.rcf/reports/blueprints/deploy-hetzner-server/`. Every walkable counting row is validated against the per-probe map, and its mapped identifier must appear in the record's own inventory or event trail (`serverId` in `eventTrail` / `postRunInventory` / `postTeardownServerIds` / `teardown`; `snapshotId` in `postCreateSnapshotIds`); when the directory is empty or absent the walk reports `no local records` and passes.
44
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with a vendor-minted identifier.
45
+
46
+ ## 1.1.10 - 2026-09-11
47
+
48
+ - Anatomy assertions are now driven by a per-probe requirement map (`PROBE_REQUIREMENTS` in `packages/rcf-lite/test/blueprint/deploy-hetzner-server-anatomy.test.js`). For each counting probe on this blueprint, the map declares the row's required vendor-minted identifier (with a shape check: `serverId` and `snapshotId` are vendor integers or non-empty numeric strings; a Docker `containerId` is a 64-character hex string) plus every required row-specific observation. `real-account-throwaway-server-provision` requires `primaryIpv4` and `location`; `real-account-cloud-init-hardened` requires `baselineChecks` and one of `exitStatus` or `cloudInit` (the live record carries the exit status under `cloudInit.code`); `real-account-snapshot-on-demand` requires `postCreateSnapshotIds` and `postTeardownSnapshotIds`.
49
+ - Observation lookup traverses the whole evidence tree, so a required field nested under (for example) `evidence.cloudInit` or an array entry still counts. Any counting row that misses one of the required fields FAILS; a counting row from an offline or mock probe not declared in the map (`hcloud-dry-run-mock`, `manifest-schema-validate`, `cloud-init-render-lint`) FAILS on the spot - those probes may emit only skip / conformanceOnly / notObservableHere rows. Eight negative-proof tests in the same file demonstrate the failure modes (missing observation, cross-probe combination, non-vendor identifier value, unmapped probe with a counting row, and nested-field deep search).
50
+ - Colour on E is unchanged: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3**; GREEN on every other shipped AC that a real-account probe observes with a vendor-minted identifier.
51
+
52
+ ## 1.1.9 - 2026-09-11
53
+
54
+ - Ruling for this family, final: a counting row is a LIVE row whose identifier is a value the vendor API minted for the row (server id, snapshot id, firewall id, image id, vendor request id, or the 64-hex Docker container id from `docker inspect`) AND whose derived observation is row-specific (per the per-probe observation fields named on the anatomy test). Mock and offline rows carry no vendor-minted identifier by nature and are always `conformanceOnly` de-claims. There is no supplied/echo path for this family: a value the probe supplied is not evidence the engine echoed it back with vendor-minted state.
55
+ - `hcloud-dry-run-mock` rows for AC-37101-1 (sole-reader source scan and provisionerReady shape) and AC-37109-1 (event-secrecy substring scan and payload-key allow-list) are now `conformanceOnly` with `anchorAcId: null` and a `limitation` string beginning with the shipped AC id. Both checks stay on the row as derived context, and the verdict still gates on their outcome. Neither AC has a live observing probe on this blueprint, so both are AMBER on E.
56
+ - Anatomy identifier set (both blueprints) is narrowed to `serverId`, `snapshotId`, `firewallId`, `imageId`, `containerId`, `vendorRequestId`, `requestId`. Generic `id` and `resourceId`, and any `supplied<Name>` / `echoed<Name>` pair, are dropped from the identifier set. The derived-observation set is narrowed to the row-specific fields each counting probe carries (provision: `primaryIpv4`, `location`; cloud-init hardened: `exitStatus` and `baselineChecks`; snapshot on demand: `postCreateSnapshotIds` and `postTeardownSnapshotIds`; minimal-stack-up: `observedNames` / `healthcheckKeys` and `observedSecretModes` / `mode`; reload-burst: `total`, `twoXx`, `drops`, `overlapCount`, `clockDomain`). Generic `observed`, `port`, `protocol`, `direction` fields are dropped.
57
+ - Colour on E: AMBER on **AC-37101-1**, **AC-37102-1**, **AC-37104-1**, **AC-37106-1**, **AC-37107-1**, **AC-37109-1** and **AC-37109-3** (the offline mock and validator rows on this branch are `conformanceOnly` de-claims; no live probe on this blueprint carries a positive observation of these ACs). GREEN on every other shipped AC that a real-account probe observes with a vendor-minted identifier.
58
+ - The mock-purity test title retained for its chain pointer in `packages/rcf-lite/rcf/test-suites/ts-175.json` is left in place; every other anatomy title is a plain descriptive string. Future work covers the ts-175 pointer rework.
59
+
60
+ ## 1.1.8 - 2026-09-11
61
+
62
+ - Anatomy identifier rule tightened: an identifier is a value the engine or vendor minted (server id, snapshot id, firewall id, image id, engine request id, or the 64-hex Docker container id from `docker inspect`). A sha256 hash the probe itself computes over an artefact it read is NO LONGER accepted as an identifier - it is a derived-by-the-probe checksum, not an engine echo - and `contentSha256` is removed from the identifier set on both anatomy tests. Context/input fields (`expected`, `engineNote`, `event`, `service`, `path`, `source`, event names, manifest names, container names Compose chose) no longer satisfy the derived-observation half either.
63
+ - Offline probes (`manifest-schema-validate`, `cloud-init-render-lint`, `caddyfile-validate`, `compose-config-lint`, `secrets-as-files-scan`) carry no engine-minted identifier by nature: every result row is a `conformanceOnly` de-claim with `anchorAcId: null` and a `limitation` string beginning with a shipped AC id and naming the live probe (or the missing observation) the offline check does not observe. The hash of the artefact the row observed and the validator output stay on the row as derived context.
64
+ - Colour on E remains AMBER on `deploy-hetzner-server` (AC-37109-3 has no live once-per-lifecycle observation on this blueprint) and AMBER on every offline-only AC on `platform-docker-compose-host` where the live observation lives on `real-account-minimal-stack-up` or `real-account-reload-burst`.
65
+ - The mock-purity test title retained for its chain pointer in `packages/rcf-lite/rcf/test-suites/ts-175.json` is left in place; every other anatomy title is a plain descriptive string. Future work covers the ts-175 pointer rework.
66
+
67
+ ## 1.1.7 - 2026-09-11
68
+
69
+ - Anatomy assertions on both blueprints moved from key-name allow-lists towards a semantic rule: every result row's evidence must carry an engine-minted identifier (a vendor / resource id, engine request id, or a 64-hex Docker container id from `docker inspect`) AND a derived observation (body excerpt, status code, observed mode, engine timestamp, non-zero count, or structured engine-returned object). Event names, file paths, service names, manifest names, resource names the probe chose, and probe inputs are derived context, not identity. Note: at 1.1.7 the anatomy still accepted a probe-computed `contentSha256` as identity on offline validators; 1.1.8 removes that acceptance and 1.1.9 further removes the supplied/echo pair path.
70
+ - `hcloud-dry-run-mock` AC-37101-1 row (offline mock-path) carried `tool` and `apiHost` echoed by the facade on the `provisionerReady` event body as derived context, and the AC-37109-1 lifecycle-scan row carried `serverId` and `snapshotId` from the events being scanned. 1.1.9 reclassifies both AC-37101-1 and AC-37109-1 rows as `conformanceOnly` de-claims (offline mock ids are not vendor-minted).
71
+ - `manifest-schema-validate` and `cloud-init-render-lint` were extended to carry a deterministic sha256 of the manifest or rendered cloud-init on every row as derived context. Note: 1.1.8 reclassifies these rows as `conformanceOnly` (see above); the hash remains on the row as context.
72
+ - `hcloud-dry-run-mock` mock-path rows for `AC-37103-1`, `AC-37108-1` and `AC-37109-3` are `conformanceOnly` with `anchorAcId: null` and a shipped-AC limitation. `AC-37103-1` and `AC-37108-1` are also observed live on `real-account-throwaway-server-provision` and `real-account-snapshot-on-demand` respectively. `AC-37109-3` has no live observing probe on this blueprint; its shipped colour is AMBER until a live once-per-lifecycle observation is added.
73
+
74
+ ## 1.1.6 - 2026-09-11
75
+
76
+ - `createProvisionerFacade` in `src/provisioner-facade.mjs` now defaults the `token` parameter to `process.env.HETZNER_ACCOUNT_API_KEY`, making the facade module the sole non-comment reader of that operator variable across the fixture `.mjs`/`.js` source. Callers that inject an explicit token override the default; the mock probe still passes a synthetic literal.
77
+ - `hcloud-dry-run-mock` observes BOTH clauses of AC-37101-1 in a SINGLE result row: the source-tree grep confirms exactly one non-comment reader inside `src/provisioner-facade.mjs` (the row FAILS on zero readers, and FAILS on any reader outside that file), and the `provisionerReady` event fires with the metadata-only `{tool, apiHost}` payload; extra keys on the event body also FAIL the row.
78
+ - Mock-path rows that observe the shape of `hetznerServerProvisioned` and `hetznerSnapshotTaken` are `anchorAcId: null`, `conformanceOnly: true`, with a `limitation` string starting with the shipped AC id and naming the live probe that observes the AC. The `hetznerServerDestroyed` mock-path row is `conformanceOnly` on `AC-37109-3` (once-per-lifecycle); no live observing probe is credited on this row, so `deploy-hetzner-server` is AMBER on `AC-37109-3` until a live observation is added. `notObservableHere` is not used on these rows: the ACs are process/live-observable, not shelf-only, so the browser-only marker does not apply.
79
+ - The `hetznerServerDestroyed` mock-path row carries `wallClockTime` and `payloadKeys` in evidence alongside the destroyed id.
80
+ - AC-37109-1 event-secrecy scan carries a payload-key allow-list per event (subset of the REQ-006 named metadata set). A lifecycle event whose payload carries a key outside the allow-list FAILS the row alongside the token / ssh-key / user-data substring scan.
81
+ - `real-account-cloud-init-hardened` FAILS the row when the post-teardown `hcloud server list` call throws.
82
+ - Real-account provision and snapshot probes observe lifecycle events (`hetznerServerProvisioned`, `hetznerSnapshotTaken`) via an injected `eventSink`; `snapshot-verb.mjs` emits `hetznerSnapshotTaken` only after the vendor list call confirms the id landed.
83
+ - `real-account-throwaway-server-provision` FAILS the row when `hcloud server list` after provision or after teardown throws.
84
+ - Firewall validation binds each rule name to its required protocol/direction/port and refuses duplicate names.
85
+ - `destroy.mjs` propagates a snapshot-list failure before deletion rather than swallowing it as an empty list.
86
+ - Every result row on every probe carries an `evidence` object with BOTH a non-empty identifier (vendor id, event name, artefact path, or resource name) AND a non-empty observation (excerpt, statusCode, mode, wallClockTime, vendor-return value, non-zero count, or derived structured observation).
87
+ - Skip helpers `firstTierGateSkipResult` and `secondTierMissingSkipResult` name exactly one variable in `reason` and distinguish `unset` from `set-but-not-true (observed value ...)`; anatomy asserts the reason is one of the declared gate variables in the fixture README env-vars section.
88
+ - `probe-utils.mjs` accepts `RCF_REPORT_DIR_OVERRIDE` so local runs write to a scratch directory and the tracked `.rcf/reports/` stays byte-identical to `origin/main`.
89
+ - Anatomy test titles are plain descriptive strings (blueprint slug + AC id + one-line summary), with one exception: the mock-purity test title retained for its chain pointer so the `testPointer` in `packages/rcf-lite/rcf/test-suites/ts-175.json` stays resolvable; paired `testPointer` fields in `packages/rcf-lite/rcf/test-suites/ts-140.json` are updated in the same commit.
90
+ - Blueprint content otherwise unchanged from 1.1.2 (no ACs, REQs, TACs, ADRs or elicits added or removed).
91
+
1
92
  # Changelog
2
93
 
3
94
  ## 1.1.2 (register patch, 2026-09-10)
@@ -14,7 +105,7 @@ Adds deliveredBy on REQ-001, REQ-002 and REQ-004. Adds ownerRef on AC-37102-1 (m
14
105
 
15
106
  ## 1.0.1
16
107
 
17
- Round-7 real-account gate hardening patch train. Fixes nine real-path defects in the shared throwaway-Hetzner-server fixture at packages/rcf-lite/test/fixtures/hetzner-throwaway-server/ so the three real-account probes return aggregateVerdict pass on a live Hetzner Cloud project unpatched, and destroy plus sweep-orphans never leak a server. Every existing v1.0.0 contribution id byte-identical apart from the cloud-init template bodies (baseline unchanged; adds a NOPASSWD sudoers.d fragment for the deploy user) and the three mocked probe bodies (mutation-purity clean plus a new rendered-file assertion).
108
+ Baseline real-account gate hardening. Fixes nine real-path defects in the shared throwaway-Hetzner-server fixture at packages/rcf-lite/test/fixtures/hetzner-throwaway-server/ so the three real-account probes return aggregateVerdict pass on a live Hetzner Cloud project unpatched, and destroy plus sweep-orphans never leak a server. Every existing v1.0.0 contribution id byte-identical apart from the cloud-init template bodies (baseline unchanged; adds a NOPASSWD sudoers.d fragment for the deploy user) and the three mocked probe bodies (mutation-purity clean plus a new rendered-file assertion).
18
109
 
19
110
  Defect list fixed:
20
111
 
@@ -29,9 +120,9 @@ Defect list fixed:
29
120
 
30
121
  Also: the three mocked probe modules (cloud-init-render-lint, manifest-schema-validate, hcloud-dry-run-mock) no longer read any process.env.SIMULATE_ switch inside the probe body per the mutation-purity gate row. The switches live entirely inside fixture-side files (src/cloud-init-renderer.mjs, src/hcloud-mock.mjs, src/provisioner-facade.mjs and the fixture-side run-manifest-schema-validate.mjs shim) and alter INPUT only. The hcloud-dry-run-mock probe now consumes the SAME rendered cloud-init file the real path consumes (renderer writes it, both the mock and real path read it) and asserts an ssh public-key line under the deploy user plus a NOPASSWD directive naming that user (REQ-145 / AC-14501-1). Report envelopes under .rcf/reports/blueprints/deploy-hetzner-server/ regenerated from the real run.
31
122
 
32
- Chain: the operator estate hardening block covering REQ-145..149 / TS-175..179 / FBS-165..169 / CN-510..519 per the operator estate chain-block ruling 2026-09-08. Real run under the project maintainer one-off approval 2026-09-08: yes, one-off for round 7 gates; Ensure that after any testing etc the Hertner account leaves NO orphaned resources behind. Leave it in the state it started in.
123
+ Live-account gate carries a resource-hygiene rule: the throwaway server is destroyed at teardown and the account inventory is confirmed clean before the record is written, so a real run leaves the Hetzner account in the state it started in with zero orphaned servers, snapshots or firewalls.
33
124
 
34
- Defect (8) container-host and edge-tunnel stub drivers are OUT of scope for the round-7 real-account gate pass (the review train owns them).
125
+ Defect (8) container-host and edge-tunnel stub drivers are OUT of scope for the shipped real-account gate; a later blueprint release covers them.
35
126
 
36
127
  # deploy-hetzner-server changelog
37
128
 
@@ -64,8 +155,8 @@ Mints the shared `hetzner-throwaway-server` fixture under
64
155
  `packages/rcf-lite/test/fixtures/` (`platform-docker-compose-host` and `edge-cloudflare-tunnel` EXTEND it,
65
156
  they do not ship a second copy).
66
157
 
67
- Trace: hetzner-round-7-spec-2026-09-07.md section 5.1;
68
- maintainer ruling 2026-09-07 09:50Z (decisions 18 through 24 approved as
69
- recommended, "round 7 - agreee to all").
158
+ Trace: hetzner-shipped-spec-2026-09-07.md section 5.1;
159
+ Approved decisions
160
+ recommended, "shipped - agreee to all").
70
161
 
71
- Review-fix (2026-09-09): Adds three option-binding ACs to close section 7c on the elicits catalogue - provisioning-tool raw-api (AC-37101-5), server-type SKU enum (AC-37103-4 naming every shipped SKU), location enum (AC-37103-5 naming every shipped datacentre). Adds deliveredBy on REQ-003, REQ-005, REQ-006. Sweeps vendorCitation onto fixed ACs resting on vendor facts (AC-37101-2, AC-37105-1, AC-37108-1, AC-37108-2, AC-37108-3).
162
+ Follow-on ratification (2026-09-09): Adds three option-binding ACs to close section 7c on the elicits catalogue - provisioning-tool raw-api (AC-37101-5), server-type SKU enum (AC-37103-4 naming every shipped SKU), location enum (AC-37103-5 naming every shipped datacentre). Adds deliveredBy on REQ-003, REQ-005, REQ-006. Sweeps vendorCitation onto fixed ACs resting on vendor facts (AC-37101-2, AC-37105-1, AC-37108-1, AC-37108-2, AC-37108-3).
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "slug": "deploy-hetzner-server",
3
- "version": "1.1.2",
3
+ "version": "1.1.17",
4
4
  "category": "deploy",
5
5
  "capabilities": [
6
6
  "cloudHost"
@@ -201,7 +201,7 @@
201
201
  "topic": "linuxCloudHostContract",
202
202
  "recommendedDefault": true,
203
203
  "elicited": false,
204
- "standardsTraceClause": "Hetzner Cloud API server resource and cloud-init user-data contract per hetzner-round-7-spec-2026-09-07.md"
204
+ "standardsTraceClause": "Hetzner Cloud API server resource and cloud-init user-data contract per hetzner-baseline-spec-2026-09-07.md"
205
205
  },
206
206
  {
207
207
  "id": "ADR-3802-deploy-hetzner-server-snapshot-cadence",
@@ -211,7 +211,7 @@
211
211
  "topic": "snapshotAndBackupCadence",
212
212
  "recommendedDefault": true,
213
213
  "elicited": true,
214
- "standardsTraceClause": "Hetzner Cloud backups-and-snapshots documented pricing and mechanism per hetzner-round-7-spec-2026-09-07.md"
214
+ "standardsTraceClause": "Hetzner Cloud backups-and-snapshots documented pricing and mechanism per hetzner-baseline-spec-2026-09-07.md"
215
215
  },
216
216
  {
217
217
  "id": "ADR-3803-deploy-hetzner-server-provisioning-tool",
@@ -219,7 +219,7 @@
219
219
  "path": "adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json",
220
220
  "recommendedDefault": true,
221
221
  "elicited": true,
222
- "standardsTraceClause": "Hetzner Cloud CLI documented resource verbs per hetzner-round-7-spec-2026-09-07.md"
222
+ "standardsTraceClause": "Hetzner Cloud CLI documented resource verbs per hetzner-baseline-spec-2026-09-07.md"
223
223
  },
224
224
  {
225
225
  "id": "ADR-3804-deploy-hetzner-server-hardening-baseline",
@@ -227,7 +227,8 @@
227
227
  "path": "adrs/adr-3804-deploy-hetzner-server-hardening-baseline.json",
228
228
  "recommendedDefault": true,
229
229
  "elicited": false,
230
- "standardsTraceClause": "Debian unattended-upgrades wiki AND the estate baseline at operator/knowledge/systems/environments/hetzner-cloud/overview.md Security posture baseline per hetzner-round-7-spec-2026-09-07.md"
230
+ "standardsTraceClause": "Debian unattended-upgrades wiki AND the estate baseline at operator/knowledge/systems/environments/hetzner-cloud/overview.md Security posture baseline per hetzner-baseline-spec-2026-09-07.md"
231
231
  }
232
- ]
232
+ ],
233
+ "updatedAt": "2026-09-12T02:07:23.000Z"
233
234
  }
@@ -1,37 +1,44 @@
1
- // Probe: cloud-init render lint.
1
+ // Probe: cloud-init render lint (v1.1.8).
2
2
  //
3
- // anchorAcId: AC-37104-1. accountBound: false.
3
+ // This is an offline validator: it renders the shipped cloud-init
4
+ // template locally against the fixture manifest and asserts every
5
+ // baseline block is present. There is no engine-minted identifier
6
+ // on such a row - the sha256 of the rendered text is computed by
7
+ // this probe with Node's `createHash` and therefore does not
8
+ // satisfy the semantic anatomy identifier rule. Every result row
9
+ // is a `conformanceOnly` de-claim naming the shipped AC clause the
10
+ // offline check does not observe; the live observation for
11
+ // AC-37104-1 lives on `real-account-cloud-init-hardened` (six
12
+ // on-server baseline checks after `cloud-init status --wait`).
13
+ // The rendered-text hash and the observed block set stay on the
14
+ // row as derived context.
4
15
  //
5
- // Renders the shipped cloud-init template against the fixture manifest at
6
- // packages/rcf-lite/test/fixtures/hetzner-throwaway-server/hetzner/servers/ci-throwaway.json
7
- // via the fixture's src/cloud-init-renderer.mjs. Asserts the six hardening
8
- // baseline blocks appear in the rendered YAML.
9
- //
10
- // Purity: the probe reads only the shipped template and the fixture
11
- // manifest; no process.env.SIMULATE_ switch is read here. The
12
- // fixture-side renderer at src/cloud-init-renderer.mjs is the sole
13
- // reader of SIMULATE_HARDENING_DRIFT and it mutates INPUT (the
14
- // rendered YAML) only; the probe then FAILS naming the missing
15
- // baseline block per hetzner-round-7-spec-2026-09-07.md section 3.4
16
- // lesson 4. (2026-09-08).
16
+ // accountBound: false. Purity: no process.env.SIMULATE_ switch is
17
+ // read; fixture-side mutations live in the fixture-side renderer.
17
18
 
18
19
  import { readFile } from 'node:fs/promises';
19
20
  import { resolve } from 'node:path';
21
+ import { createHash } from 'node:crypto';
20
22
  import { FIXTURE_DIR } from './probe-utils.mjs';
21
23
 
22
- export const anchorAcId = 'AC-37104-1';
24
+ function sha256(text) {
25
+ return createHash('sha256').update(text, 'utf8').digest('hex');
26
+ }
27
+
28
+ export const anchorAcId = null;
23
29
  export const accountBound = false;
24
30
 
31
+ const LIMITATION = 'AC-37104-1: rendered cloud-init template is validated offline for baseline-block presence; the live on-server observation (six baseline checks after cloud-init settles) is carried by real-account-cloud-init-hardened.';
32
+
25
33
  export default async function runProbe() {
26
34
  const rendererPath = resolve(FIXTURE_DIR, 'src/cloud-init-renderer.mjs');
27
35
  const manifestPath = resolve(FIXTURE_DIR, 'hetzner/servers/ci-throwaway.json');
28
36
  const { renderCloudInit, BASELINE_BLOCKS } = await import(rendererPath);
29
37
  const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));
30
- // In-process render only; pass explicit stub public-key material so
31
- // the renderer never shells to hcloud (mock path stays hermetic).
32
38
  const rendered = await renderCloudInit(manifest, {
33
39
  publicKeys: ['ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFakePubKeyForRenderLintHardeningH1 rcf-lite-ci-mock'],
34
40
  });
41
+ const renderedSha256 = sha256(rendered);
35
42
  const missing = [];
36
43
  const present = [];
37
44
  for (const block of BASELINE_BLOCKS) {
@@ -47,16 +54,34 @@ export default async function runProbe() {
47
54
  if (missing.length > 0) {
48
55
  for (const m of missing) {
49
56
  results.push({
50
- anchorAcId,
57
+ anchorAcId: null,
58
+ conformanceOnly: true,
59
+ limitation: LIMITATION,
51
60
  verdict: 'fail',
52
- detail: `cloud-init hardening baseline block "${m.label}" is missing from the rendered YAML (missing markers: ${m.missingMarkers.join(', ')}).`,
61
+ detail: `offline cloud-init render lint: hardening baseline block "${m.label}" is missing from the rendered YAML (missing markers: ${m.missingMarkers.join(', ')}).`,
62
+ evidence: {
63
+ renderedSha256,
64
+ manifestName: manifest.name,
65
+ missingBlockId: m.id,
66
+ missingMarkers: m.missingMarkers,
67
+ renderedByteLength: rendered.length,
68
+ },
53
69
  });
54
70
  }
55
71
  } else {
56
72
  results.push({
57
- anchorAcId,
73
+ anchorAcId: null,
74
+ conformanceOnly: true,
75
+ limitation: LIMITATION,
58
76
  verdict: 'pass',
59
- detail: `all ${BASELINE_BLOCKS.length} baseline blocks present in the rendered YAML: ${present.join(', ')}.`,
77
+ detail: `offline cloud-init render lint: all ${BASELINE_BLOCKS.length} baseline blocks present in the rendered YAML: ${present.join(', ')}.`,
78
+ evidence: {
79
+ renderedSha256,
80
+ manifestName: manifest.name,
81
+ renderedByteLength: rendered.length,
82
+ presentBlocks: present,
83
+ renderHashSample: rendered.slice(0, 120),
84
+ },
60
85
  });
61
86
  }
62
87
  return {