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
@@ -127,10 +127,8 @@ API for local proof; the mock and its test lives under
127
127
  rather than gating on an `elicitedNonEmpty` predicate for
128
128
  `kv-binding-name`; the loader's `validateElicits` accepts only
129
129
  `requiresCapability` on the `when` block today. The guide teaches
130
- the pattern; a loader-capability uplift extending
131
- `validateElicits` to accept an `elicitedNonEmpty` predicate is
132
- captured as follow-up work item
133
- a follow-up capability change (0.26.x) is out of scope for this 0.25.x patch.
130
+ the pattern; supporting the predicate requires the loader to
131
+ accept an `elicitedNonEmpty` clause on the `when` block.
134
132
 
135
133
  ## Companion suggestions
136
134
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "slug": "platform-cloudflare-kv",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "category": "platform",
5
5
  "capabilities": [
6
6
  "keyValueStore"
@@ -178,5 +178,5 @@
178
178
  "standardsTraceClause": "generic enterprise practice"
179
179
  }
180
180
  ],
181
- "updatedAt": "2026-09-10T00:00:00.000Z"
181
+ "updatedAt": "2026-09-12T00:00:00.000Z"
182
182
  }
@@ -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 31101-31108 sit at the LOW end of the 31101-31899 band on purpose (watchpost run-4 lesson). A project-side story mechanically derived from a platform-cloudflare-kv REQ id into the number 31110 would collide against a shipped US-31110; band headroom (31109-31899) leaves that space.
62
+ US 31101-31108 sit at the LOW end of the 31101-31899 band on purpose. A project-side story mechanically derived from a platform-cloudflare-kv REQ id into the number 31110 would collide against a shipped US-31110; band headroom (31109-31899) leaves that space.
63
63
 
64
64
  ADR/TAC suffixes for this blueprint use the 3201-3299 block, continuing the shelf pattern.
65
65
 
@@ -1,3 +1,90 @@
1
+ ## 1.1.17 - 2026-09-12
2
+
3
+ - Compose row-walker now ENFORCES the three per-field correlation rules on `walkComposeRecordRow` (v1.1.17): when the record carries `postRunInventory` the row's `evidence.serverId` MUST be present in it (as an id or as an object carrying `.id`); when the record carries `postTeardownServerIds` the id MUST be absent from it (a passing row's server was never in the teardown baseline); when the record carries a `teardown` block that block MUST reference the id via `destroyed` or `provisioned`. Absence of any one of these fields is not a failure. The top-level `serverId` equality remains mandatory. One negative control per field (present-but-wrong: inventory missing the id, teardown-ids including the id, teardown block referencing a different id) calls `walkComposeRecordRow` end to end.
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 five.
5
+ - Colour on E is unchanged: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
6
+
7
+ ## 1.1.16 - 2026-09-12
8
+
9
+ - Row-walker requires the record's own top-level `serverId` equality (v1.1.16). The Compose row helper now REJECTS a record whose top-level `serverId` is missing or differs from the row's `evidence.serverId`, whatever the event trail carries. `postRunInventory` / `postTeardownServerIds` / `teardown` fields are read as additional correlation surfaces for diagnostic context at 1.1.16 but are not yet enforced; they never substitute for the top-level `serverId` equality. Two negative controls (missing top-level `serverId`, and a top-level `serverId` that differs from the row's `evidence.serverId`) call `walkComposeRecordRow` end to end; the positive control calls the same helper.
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 five.
11
+ - Colour on E is unchanged: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
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/platform-docker-compose-host/` 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 refuses events (v1.1.15). The Compose shipped stack driver (`packages/rcf-lite/test/fixtures/hetzner-throwaway-server/src/compose-stack-driver.mjs`) records events as `{event, at, detail}` and emits NO identifier field on the event body. The walker therefore correlates a `serverId` row against the record's own top-level `serverId` field (where the live record states it) plus `postRunInventory` / `postTeardownServerIds` / `teardown` inventory surfaces; a substring over the event body does NOT count and an invented `serverId` field on an event body is not consulted. The `containerId` correlation rule (v1.1.13) stays in force: only ENGINE evidence keyed by the id under `observedSecretModes.observations` counts.
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 identifier-correlation negative builds a synthetic record whose top-level `serverId` differs from the row's `evidence.serverId` and calls `walkComposeRecordRow` 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 five.
19
+ - Colour on E is unchanged: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
20
+
21
+ ## 1.1.13 - 2026-09-12
22
+
23
+ - Anatomy per-field validators tightened (v1.1.13). The `mode` field on `real-account-minimal-stack-up` secret rows must equal the exact string that `docker exec stat -c %a` prints for owner-read-only permissions - a single recorded value. Every other octal (including four-digit spellings, and "600", "640", "644", "755", "000", "040", "444") and every non-octal input ("", "abc", "9", "400 ", "4000", " 400") FAILS.
24
+ - Reload-burst window rule extended (v1.1.13). The counting `real-account-reload-burst / AC-composeHost-zeroDowntimeReload` row now REQUIRES four positive finite-integer millisecond timestamps under `evidence.burst`: `burstStartedAt`, `burstEndedAt`, `reloadStartedAt`, `reloadEndedAt`. The cross-field rule asserts `burstEndedAt > burstStartedAt`, `reloadEndedAt > reloadStartedAt`, and the reload interval sitting wholly inside the burst interval (`burstStartedAt <= reloadStartedAt AND reloadEndedAt <= burstEndedAt`). Missing endpoints, `NaN`, `Infinity`, `-Infinity`, zero, negatives, non-integer floats, string values, degenerate intervals and reload windows straddling the burst boundary all FAIL. The counter cross-field from v1.1.12 (`total > 0`, `drops === 0`, `twoXx === total`, `overlapCount > 0`) and `clockDomain === "server"` remain in force.
25
+ - Walker `containerId` correlation is now identifier-only (v1.1.13). The 64-hex `containerId` on a counting row counts only when the record's `observedSecretModes.observations` tree carries an entry keyed by the same id - that entry is populated by `docker inspect --format {{.Id}}` and `docker exec stat`, engine evidence keyed by the id. A `containerName` present in the compose services listing or in `observedNames` is NOT identifier evidence; a row whose only correlation is a name match FAILS the walker. A synthetic negative case in the anatomy test proves it in-memory without touching `.rcf/reports/`.
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>/platform-docker-compose-host/*.json` instead of the tree default. CI never sets this variable; the operator-side evidence walk uses it. Anatomy synthetic fixtures for reload-burst keep the v1.1.12 counters (`total: 4242`, `twoXx: 4242`, `drops: 0`, `overlapCount: 42`, `reloadDurationMs: 424`) and gain synthetic window timestamps (`burstStartedAt: 1000`, `burstEndedAt: 11000`, `reloadStartedAt: 2000`, `reloadEndedAt: 3000`); live server-clock epochs never appear in branch source.
28
+ - Family records regenerated (v1.1.13). Every shipped probe on this blueprint (`caddyfile-validate`, `compose-config-lint`, `secrets-as-files-scan`, `real-account-minimal-stack-up`, `real-account-reload-burst`) was run through its run-shim with NO account variables set: offline 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`. Five record files live under `.rcf/reports/blueprints/platform-docker-compose-host/`; 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 every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
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. The counter cross-field on `real-account-reload-burst / AC-composeHost-zeroDowntimeReload` requires `total > 0`, `drops === 0`, `twoXx === total` and `overlapCount > 0`, and `clockDomain` must equal `"server"`.
34
+ - 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. Stale local record artefacts under `.rcf/reports/blueprints/platform-docker-compose-host/` that predated the current per-probe validator schema have been removed from the branch tree so the strict walker returns cleanly.
35
+ - Anatomy synthetic burst counters for `real-account-reload-burst` land on `total: 4242`, `twoXx: 4242`, `drops: 0`, `overlapCount: 42`, `reloadDurationMs: 424` in branch source. Live server-clock epochs never appear in the branch tree.
36
+ - The `mode` validator on `real-account-minimal-stack-up` secret rows accepts only the exact recorded mode value that `docker exec stat -c %a` prints for owner-read-only permissions, and rejects every other octal spelling; a paired negative case proves the rejection.
37
+ - Colour on E is unchanged: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
38
+
39
+ ## 1.1.11 - 2026-09-11
40
+
41
+ - Anatomy applies row-specific value validators (v1.1.11) instead of null/undefined presence checks alone. `real-account-minimal-stack-up`'s upClean row requires a non-empty `observedSecretModes` whose entries each carry a 3- or 4-digit octal `mode`, and at least one of a non-empty-string `observedNames` or `healthcheckKeys` array; the secretShape row requires an octal `mode`. `real-account-reload-burst` requires non-negative integer counters `total`, `twoXx`, `drops` and `overlapCount` with `twoXx <= total` and `drops === total - twoXx`, and `clockDomain === "server"`. Empty strings, empty arrays, `false`, `NaN`, negative counters and inconsistent totals now FAIL; one negative-proof test per validator is added to `packages/rcf-lite/test/blueprint/platform-docker-compose-host-anatomy.test.js`.
42
+ - Unmapped offline probes (`caddyfile-validate`, `compose-config-lint`, `secrets-as-files-scan`) 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.
43
+ - Anatomy synthetic fixtures carry unmistakably synthetic vendor-id integers (`424245`, `424246`) and a 64-character synthetic hex `containerId` (`deadbeef` repeated eight times). No live-account identifiers appear in branch source.
44
+ - Anatomy walks any records under `.rcf/reports/blueprints/platform-docker-compose-host/`. 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`; `containerId` in the record's `observedSecretModes` tree or via a `containerName` present in the compose `services` / `observedNames` listing); when the directory is empty or absent the walk reports `no local records` and passes.
45
+ - Colour on E is unchanged: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
46
+
47
+ ## 1.1.10 - 2026-09-11
48
+
49
+ - Anatomy assertions are now driven by a per-probe requirement map (`PROBE_REQUIREMENTS` in `packages/rcf-lite/test/blueprint/platform-docker-compose-host-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` is a vendor integer or non-empty numeric string; the Docker `containerId` is a 64-character hex string) plus every required row-specific observation. `real-account-minimal-stack-up`'s upClean row requires the 64-hex `containerId` (nested under `evidence.observedSecretModes.observations[].containerId` on the live record), `observedSecretModes`, and one of `observedNames` or `healthcheckKeys`; the secretShape row requires the top-level 64-hex `containerId` and the observed `mode`. `real-account-reload-burst` requires the full tuple `total`, `twoXx`, `drops` and `overlapCount` (all nested under `evidence.burst` on the live record) plus `clockDomain === "server"`.
50
+ - Observation lookup traverses the whole evidence tree, so a required field nested under `evidence.burst` or `evidence.observedSecretModes.observations` still counts. Any counting row that misses one of the required fields FAILS; a counting row from an offline probe not declared in the map (`caddyfile-validate`, `compose-config-lint`, `secrets-as-files-scan`) FAILS on the spot - those probes may emit only skip / conformanceOnly / notObservableHere rows. Nine negative-proof tests in the same file demonstrate the failure modes (missing observation, cross-probe combination, non-hex64 `containerId`, `clockDomain` other than `"server"`, unmapped probe with a counting row, and nested-field deep search).
51
+ - Colour on E is unchanged: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on `AC-composeHost-upClean`, `AC-composeHost-zeroDowntimeReload` and `AC-composeHost-secretShape`.
52
+
53
+ ## 1.1.9 - 2026-09-11
54
+
55
+ - 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.
56
+ - Anatomy identifier set is narrowed to `serverId`, `snapshotId`, `firewallId`, `imageId`, `containerId`, `vendorRequestId`, `requestId`. Generic `id` and `resourceId`, and any `supplied<Name>` / `echoed<Name>` pair, are dropped. The derived-observation set is narrowed to the row-specific fields each counting probe carries (minimal-stack-up: `observedNames` / `healthcheckKeys` for healthy services and `observedSecretModes` / `mode` for the in-container mode; reload-burst: `total`, `twoXx`, `drops`, `overlapCount`, `clockDomain`). Generic `observed`, `port`, `protocol`, `direction` fields are dropped.
57
+ - Colour on E: AMBER on every AC whose only observation is offline conformanceOnly (`AC-composeHost-healthcheckLint`, `AC-composeHost-secretsAreFiles`, `AC-composeHost-restartClassification`, `AC-composeHost-logDriverClassification`, the reverse-proxy-artefact and read-only-bind-mount clauses of `AC-38107-4` / `AC-composeHost-reverseProxyArtefactValid`); GREEN on the live-observed clauses (`AC-composeHost-upClean` with the applied stack, `AC-composeHost-zeroDowntimeReload` with the on-server burst carrying `clockDomain="server"`, `AC-composeHost-secretShape` with the in-container mode observation on the 64-hex containerId). AC-composeHost-healthcheckLint is AMBER because its only observing row is offline `compose-config-lint`; the applied-stack `docker compose ps` observation lands on `AC-composeHost-upClean`, not `healthcheckLint`.
58
+
59
+ ## 1.1.8 - 2026-09-11
60
+
61
+ - 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. A container NAME Compose chose (for example `rcf-lite-throwaway-web`) is NO LONGER accepted as `containerId`; the 64-hex id from `docker inspect --format '{{.Id}}'` is what satisfies the identifier rule. Context/input fields (`expected`, `engineNote`, `event`, `service`, `path`, `source`, event names, manifest names, container names) no longer satisfy the derived-observation half either.
62
+ - Offline probes (`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 observed artefact and the validator output stay on the row as derived context. The stale header comment on `secrets-as-files-scan` referring to `notObservableHere.ac` is replaced with the current `conformanceOnly` explanation.
63
+ - `real-account-minimal-stack-up` secret-mode row records the 64-hex `containerId` from `docker inspect --format '{{.Id}}'` (retrieved by the compose-stack driver after the stack is up); the Compose service name is kept as `containerName` derived context.
64
+
65
+ ## 1.1.7 - 2026-09-11
66
+
67
+ - Anatomy assertions 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 (excerpt, statusCode, mode, wallClockTime, non-zero count, or structured engine-returned object). Event names, file paths, service names, manifest names, resource names, 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 and stored a Compose-chosen container NAME under `containerId` on the live secret-mode row; 1.1.8 removes both, and 1.1.9 further removes the supplied/echo pair path.
68
+ - `caddyfile-validate`, `compose-config-lint` and `secrets-as-files-scan` were extended to carry a deterministic sha256 of the observed artefact 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.
69
+ - The `real-account-reload-burst` record now carries `clockDomain: "server"` in the burst evidence body: the probe copies the fixture's `clockDomain` return field verbatim, and the regenerated live record includes it.
70
+
71
+ ## 1.1.6 - 2026-09-11
72
+
73
+ - `real-account-reload-burst` overlap proof runs in ONE clock domain: the on-server undici burst script itself spawns `sudo docker compose exec -T caddy caddy reload --config /etc/caddy/Caddyfile` after a small warm-up and stamps every observation (burst start, each request `startedAt`/`endedAt`, reload start, reload end) from the server's own `Date.now()`. The runner receives one JSON blob and does NO rebase from the ssh call time. Overlap and burst-window containment are computed from server-clock stamps directly. The probe copies the fixture's `clockDomain: 'server'` return field into the burst evidence object; the regenerated live record on this branch carries that field.
74
+ - Compose YAML parser in `probe-utils.mjs` now preserves fields on a list-item object after its first `key: value` line. The long-form service-level secret entry (whose `source`, `target` and `mode` fields sit on distinct list-item lines) parses as one `{source, target, mode}` object, so `secrets-as-files-scan` records the mode declared in `compose.yaml` for the `web-token` reference (previously read `unset`).
75
+ - Compose-stack driver default `--wait-timeout` for `docker compose up -d --wait` is the shipped elicited `healthcheck-timeout-seconds` value (30). `COMPOSE_UP_TIMEOUT_SECONDS` is declared in the fixture README env-var section as the optional override for the account-bound branch.
76
+ - `real-account-minimal-stack-up` observes the in-container mode of every mounted secret with `sudo docker exec <container> stat -c %a /run/secrets/<name>` and records one row per secret anchored to AC-composeHost-secretShape (a mode other than `400` FAILS the row); it also FAILS if a top-level secret has no consuming service.
77
+ - `secrets-as-files-scan` no longer assumes an unset service-level `mode` means `0o400`. The mode row is `anchorAcId: null`, `conformanceOnly: true`, with a `limitation` string that starts with `AC-composeHost-secretShape` and names the process-level observation on the real-account probe; the row does NOT use `notObservableHere` (the AC is process-observable via `docker exec stat`, not shelf-only). The offline scan continues to FAIL on undeclared secrets, on environment references bypassing service-level secrets, on orphan top-level secrets, and on plaintext-literal hits across compose.yaml, .env and every service's bind-mount source.
78
+ - Vendor references named at the module level: Docker Engine convenience install script (`https://docs.docker.com/engine/install/ubuntu/` verifiedOn 2026-09-11), Ubuntu 24.04 `nodejs` apt package (`https://packages.ubuntu.com/noble/nodejs` verifiedOn 2026-09-11), Docker Compose secret file mode default (`https://docs.docker.com/reference/compose-file/secrets/` verifiedOn 2026-09-11).
79
+ - Anchor detail prefixes: every `AC-composeHost-*` prefix carries the first eight words of the AC or REQ text it anchors.
80
+ - Anatomy assertions are strict inline: identity fields come from a fixed set (vendor / resource ids, event names, artefact paths, resource names) and observation fields come from a fixed set (excerpts, mode, statusCode, wallClockTime, vendor-return values, non-zero counts, structured derived observations). `notObservableHere` is reserved for browser-only ACs and this blueprint has none, so any `notObservableHere` row FAILS. `conformanceOnly` rows must carry a `limitation` string whose first token is a shipped AC id.
81
+ - Invented anchor fallbacks removed: `probe-utils.emptyResultsFail` and the `runShim` error branch no longer synthesise `anchorAcId: 'unknown'`.
82
+ - Skip helpers 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.
83
+ - `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`.
84
+ - Fixture `compose.yaml` declares the `web-token` service-level secret in long form (source, target and mode fields on distinct list-item lines) and the compose-stack driver `chmod 400`s the shipped `secrets/web-token` on the throwaway server after rsync but before `docker compose up -d`. Docker Compose (non-Swarm) mounts a compose secret with the source file's host mode, so both the long-form `mode:` declaration and the host-side chmod are required for AC-composeHost-secretShape "mounted at 0o400" to be observed in-container.
85
+ - `compose-config-lint` docker-engine wrap row carries `file: 'compose.yaml'` in evidence; the missing-healthcheck failure row carries `missingServices` / `expected: 'healthcheck block'` / `observed: 'absent'` so the anatomy identifier-plus-observation check is satisfied on every branch of the probe.
86
+ - Anatomy test regex for the compose secret matches the long-form declaration; anatomy test titles are plain descriptive strings (blueprint slug + AC id + one-line summary), and paired `testPointer` fields in `packages/rcf-lite/rcf/test-suites/ts-150.json` are updated in the same commit.
87
+
1
88
  # platform-docker-compose-host CHANGELOG
2
89
 
3
90
  ## 1.1.2 - 2026-09-10
@@ -24,15 +111,15 @@ Register patch.
24
111
  - `REQ-005` extended to name the `reverse-proxy=none` topology explicitly (the lint now refuses ANY proxy service block or reload verb when `none` is elicited); closes criterion a on the previously unbacked `none` branch (F-3).
25
112
  - Every existing REQ carries a `deliveredBy` link into a TAC or ADR (six links). Every existing AC carries `disposition`. `rcf define blueprint lint-consistency` reports zero pass-1 and pass-2 findings.
26
113
 
27
- ### Added (criterion b completion, second pass 2026-09-09)
114
+ ### Added
28
115
 
29
116
  - Elicited `healthcheck-timeout-seconds` added to `blueprint.json` (default 30, floor 5, ceiling 300); REQ-003 description extended to name the elicited answer, closing criterion a on the previously-unbacked healthcheck-timeout branch (F-4).
30
- - Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 35 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6 (from the 1-2 shipped in the first 1.1.0 pass): US-38101 gains five ACs (network drift closing F-9 first, volume drift closing F-9 second, image drift closing F-9 third, .env drift closing F-9 fourth, compose-file-location branch); US-38102 gains four ACs (SSM integration closing F-10 first, file-based fallback closing F-10 second, wrong-mode secret closing F-10 third, orphan top-level secret); US-38103 gains four ACs (wrong-mode probe closing F-10, orphan-secret probe closing F-10, plaintext in .env, clean-pass baseline); US-38104 gains four ACs (healthcheck-timeout elicit AC closing F-4, tcp kind closing F-6, command kind closing F-6, http kind closing F-6); US-38105 gains three ACs (real-account timeout, teardown discipline, dependency ordering); US-38106 gains three ACs (long-running policy classification closing F-7 first, job policy classification closing F-7 second, missing restart field); US-38107 gains three ACs (Traefik topology closing F-5 first, none topology closing F-5 second, read-only bind-mount); US-38108 gains three ACs (Traefik reload verb closing F-5, none topology no-op, reload window too short); US-38109 gains three ACs (journald marker probe closing F-8 first, loki marker probe closing F-8 second, missing logging block); US-38110 gains three ACs (sources file content, keyring presence, idempotent install). Every new AC carries `disposition`, most carry `ownerRef` into the owning TAC, and vendor-fact ACs carry `vendorCitation` (Docker Engine install, compose healthcheck reference, compose secrets reference, compose logging reference, Caddy docs, Traefik docs, journald docs, Loki docs) with today's verifiedOn date.
117
+ - Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 35 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6: US-38101 gains five ACs (network drift closing the first gap, volume drift closing the second gap, image drift closing the third gap, .env drift closing the fourth gap, compose-file-location branch); US-38102 gains four ACs (SSM integration closing the first gap, file-based fallback closing the second gap, wrong-mode secret closing the third gap, orphan top-level secret); US-38103 gains four ACs (wrong-mode probe, orphan-secret probe, plaintext in .env, clean-pass baseline); US-38104 gains four ACs (healthcheck-timeout elicit AC, tcp kind, command kind, http kind); US-38105 gains three ACs (real-account timeout, teardown discipline, dependency ordering); US-38106 gains three ACs (long-running policy classification closing the first gap, job policy classification closing the second gap, missing restart field); US-38107 gains three ACs (Traefik topology closing the first gap, none topology closing the second gap, read-only bind-mount); US-38108 gains three ACs (Traefik reload verb, none topology no-op, reload window too short); US-38109 gains three ACs (journald marker probe closing the first gap, loki marker probe closing the second gap, missing logging block); US-38110 gains three ACs (sources file content, keyring presence, idempotent install). Every new AC carries `disposition`, most carry `ownerRef` into the owning TAC, and vendor-fact ACs carry `vendorCitation` (Docker Engine install, compose healthcheck reference, compose secrets reference, compose logging reference, Caddy docs, Traefik docs, journald docs, Loki docs).
31
118
  - `rcf define blueprint lint-consistency` still reports zero pass-1 and pass-2 findings. Blueprint stays at v1.1.0 on the same unreleased minor.
32
119
 
33
- ### Fixed (review fix pass, 2026-09-09)
120
+ ### Fixed (2026-09-09)
34
121
 
35
- - Register sweep: every `blueprint.json` elicit prompt, guide passage, README row, ADR title/context/decision and probe comment on the blueprint has "a platform reverse-proxy decision", "a development host", "an internal ops host", "round-7 tunnel" and "hetzner-round-7-spec-2026-09-07.md" neutralised to concept ("a platform decision", "a common Linux-host baseline that already runs Caddy", "a Cloudflare-tunnel sibling"). CHANGELOG entries keep internal provenance (review F-3).
122
+ - Register sweep: every `blueprint.json` elicit prompt, guide passage, README row, ADR title/context/decision and probe comment on the blueprint has "a platform reverse-proxy decision", "a development host", "an internal ops host", "shipped tunnel" and "hetzner-shipped-spec-2026-09-07.md" neutralised to concept ("a platform decision", "a common Linux-host baseline that already runs Caddy", "a Cloudflare-tunnel sibling"). CHANGELOG entries keep internal provenance.
36
123
 
37
124
  ## 1.0.0 - 2026-09-08
38
125
 
@@ -43,4 +130,4 @@ Initial release. Hetzner blueprint per the Hetzner host specification.
43
130
  - Extends the shared throwaway-Hetzner-server fixture with a minimal compose stack (`compose.yaml`, `caddy/Caddyfile`, `secrets/web-token` file mount, `src/serve.mjs` healthchecked stub) plus five `run-<probe>.mjs` delegate shims.
44
131
  - Compose-config-lint carries four mutation switches (`SIMULATE_MISSING_HEALTHCHECK`, `SIMULATE_UNCLASSIFIED_RESTART`, `SIMULATE_UNCLASSIFIED_LOG_DRIVER`, `SIMULATE_EVENT_SECRECY_LEAK`); secrets-as-files-scan carries `SIMULATE_PLAINTEXT_SECRET`; caddyfile-validate carries `SIMULATE_INVALID_CADDYFILE` and runs `caddy validate` via the `caddy:2` container when a local `caddy` binary is not on PATH.
45
132
  - Reverse-proxy choice elicited via `reverse-proxy` (caddy default per a platform reverse-proxy decision; traefik and none alternatives); Coolify rejected verbatim per a platform reverse-proxy decision; log driver elicited via `log-driver` (journald default; loki opt-in).
46
- - Consumers: a follow-up work item migrates an internal ops host's remote-library compose stack onto this contract after 0.25.0 ships; blueprint acceptance never depends on that migration.
133
+ - Consumers: future work migrates an internal ops host's remote-library compose stack onto this contract after 0.25.0 ships; blueprint acceptance never depends on that migration.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "slug": "platform-docker-compose-host",
3
- "version": "1.1.2",
3
+ "version": "1.1.17",
4
4
  "category": "platform",
5
5
  "capabilities": [
6
6
  "containerHost"
@@ -222,5 +222,5 @@
222
222
  "standardsTraceClause": "generic enterprise practice"
223
223
  }
224
224
  ],
225
- "updatedAt": "2026-09-10T00:00:00.000Z"
225
+ "updatedAt": "2026-09-12T02:07:23.000Z"
226
226
  }
@@ -1,35 +1,43 @@
1
- // Probe: caddyfile-validate.
1
+ // Probe: caddyfile-validate (v1.1.8).
2
2
  //
3
- // anchorAcId: AC-composeHost-reverseProxyArtefactValid.
4
- // accountBound: false.
5
- //
6
- // Runs caddy validate against the applied fixture caddy/Caddyfile. When
7
- // a local caddy binary is not on PATH the probe uses the caddy:2
8
- // container image via docker run --rm (pinned tag), so review machines
9
- // without a local caddy still get a real validation. When neither is
10
- // available the probe records skipped with a warn note.
11
- //
12
- // The applying project may set reverseProxy to a value other than caddy
13
- // (traefik or none per ADR-3902); when that happens the probe returns
14
- // skipped with note.
3
+ // This is an offline validator: it reads the shipped Caddyfile and
4
+ // the shipped compose.yaml and shells out to `caddy validate` (or
5
+ // a caddy:2 container via `docker run --rm`). It has no engine-
6
+ // minted identifier - the sha256 of the read artefact is computed
7
+ // by this probe with Node's `createHash` and the compose bind-
8
+ // mount line is text the probe extracted. Every result row is a
9
+ // `conformanceOnly` de-claim naming the shipped AC clause the
10
+ // offline check does not observe. The exit status, tail excerpt,
11
+ // the observed bind-mount line and the hash of the read artefact
12
+ // stay on the row as derived context.
15
13
  //
16
14
  // Mutation:
17
- // - SIMULATE_INVALID_CADDYFILE=true writes an obviously-invalid
18
- // directive (\"not-a-directive-at-all\") into a scratch copy of the
19
- // Caddyfile; the probe FAILS naming the offending line.
15
+ // - SIMULATE_INVALID_CADDYFILE=true appends an unclosed-block syntax
16
+ // error to a scratch copy of the Caddyfile; the probe FAILS naming
17
+ // the offending tail.
20
18
 
21
19
  import { readFile, writeFile, mkdir, rm } from 'node:fs/promises';
22
20
  import { spawnSync } from 'node:child_process';
21
+ import { createHash } from 'node:crypto';
23
22
  import { tmpdir } from 'node:os';
24
- import { join, dirname } from 'node:path';
25
- import { runShim, CADDYFILE_PATH, whichCaddy, whichDocker } from './probe-utils.mjs';
23
+ import { join } from 'node:path';
24
+ import { runShim, CADDYFILE_PATH, COMPOSE_PATH, whichCaddy, whichDocker } from './probe-utils.mjs';
26
25
 
27
- export const anchorAcId = 'AC-composeHost-reverseProxyArtefactValid';
26
+ function sha256(text) {
27
+ return createHash('sha256').update(text, 'utf8').digest('hex');
28
+ }
29
+
30
+ export const anchorAcId = null;
28
31
  export const accountBound = false;
29
32
 
33
+ const VENDOR_CADDY = 'https://caddyserver.com/docs/command-line#caddy-validate';
34
+ const VENDOR_DOCKER = 'https://docs.docker.com/reference/cli/docker/container/run/';
35
+ const VENDOR_VERIFIED_ON = '2026-09-11';
36
+
37
+ const LIMIT_38107_4 = 'AC-38107-4: compose bind-mount for the reverse-proxy config is validated offline against the shipped compose.yaml text; the live on-server observation (the compose stack applying the read-only mount) is carried by real-account-minimal-stack-up.';
38
+ const LIMIT_REV_PROXY = 'AC-composeHost-reverseProxyArtefactValid: the reverse-proxy artefact is validated offline by `caddy validate` against the shipped Caddyfile; the live observation (the artefact serving traffic on the applied stack) is carried by real-account-reload-burst.';
39
+
30
40
  function isCaddyReverseProxy() {
31
- // Applying project passes reverseProxy via env for the probe run; the
32
- // shipped default per ADR-3902 is caddy.
33
41
  const v = process.env.REVERSE_PROXY;
34
42
  if (v === undefined || v === 'caddy') return true;
35
43
  return false;
@@ -42,12 +50,61 @@ export default async function runProbe() {
42
50
  extra.reverseProxy = process.env.REVERSE_PROXY ?? 'caddy';
43
51
  if (!isCaddyReverseProxy()) {
44
52
  results.push({
45
- anchorAcId,
53
+ anchorAcId: null,
54
+ conformanceOnly: true,
55
+ limitation: LIMIT_REV_PROXY,
46
56
  verdict: 'skipped',
47
- detail: `reverseProxy=${extra.reverseProxy}: caddyfile-validate skipped (applies only when reverseProxy=caddy)`,
57
+ detail: `offline caddyfile-validate: reverseProxy=${extra.reverseProxy}: skipped (applies only when reverseProxy=caddy)`,
58
+ evidence: { reverseProxy: extra.reverseProxy },
48
59
  });
49
60
  return { results, extra };
50
61
  }
62
+
63
+ // Bind-mount check: the compose file mounts caddy/Caddyfile
64
+ // read-only into the caddy service. AC-38107-4 requires the :ro
65
+ // suffix or read_only: true on the long-form. This is a source-
66
+ // tree observation carried as a conformanceOnly de-claim.
67
+ try {
68
+ const composeText = await readFile(COMPOSE_PATH, 'utf8');
69
+ const composeSha256 = sha256(composeText);
70
+ const caddyMountRe = /\.\/caddy\/Caddyfile:\/etc\/caddy\/Caddyfile:ro/;
71
+ if (caddyMountRe.test(composeText)) {
72
+ results.push({
73
+ anchorAcId: null,
74
+ conformanceOnly: true,
75
+ limitation: LIMIT_38107_4,
76
+ verdict: 'pass',
77
+ detail: 'offline caddyfile-validate: compose.yaml bind-mounts caddy/Caddyfile into the caddy service read-only (:ro suffix present)',
78
+ evidence: {
79
+ composeSha256,
80
+ composeMountLine: (composeText.match(/[^\n]*Caddyfile:\/etc\/caddy\/Caddyfile[^\n]*/) || [''])[0],
81
+ mountSuffix: ':ro',
82
+ },
83
+ });
84
+ } else {
85
+ results.push({
86
+ anchorAcId: null,
87
+ conformanceOnly: true,
88
+ limitation: LIMIT_38107_4,
89
+ verdict: 'fail',
90
+ detail: 'offline caddyfile-validate: compose.yaml Caddyfile bind-mount is not read-only; expected :ro suffix on ./caddy/Caddyfile:/etc/caddy/Caddyfile',
91
+ evidence: {
92
+ composeSha256,
93
+ composeMountLine: (composeText.match(/[^\n]*Caddyfile[^\n]*/) || [''])[0],
94
+ },
95
+ });
96
+ }
97
+ } catch (err) {
98
+ results.push({
99
+ anchorAcId: null,
100
+ conformanceOnly: true,
101
+ limitation: LIMIT_38107_4,
102
+ verdict: 'fail',
103
+ detail: `offline caddyfile-validate: could not read compose.yaml to check the Caddyfile bind-mount: ${err.message}`,
104
+ evidence: { composePath: COMPOSE_PATH, error: err.message },
105
+ });
106
+ }
107
+
51
108
  const scratchDir = join(tmpdir(), `rcf-lite-t2-caddyfile-validate-${Date.now()}`);
52
109
  await mkdir(scratchDir, { recursive: true });
53
110
  const scratchPath = join(scratchDir, 'Caddyfile');
@@ -56,6 +113,7 @@ export default async function runProbe() {
56
113
  if (process.env.SIMULATE_INVALID_CADDYFILE === 'true') {
57
114
  text = text + "\n{ unclosed_block_that_never_ends_and_is_a_syntax_error_caddy_will_reject\n";
58
115
  }
116
+ const caddyfileSha256 = sha256(text);
59
117
  await writeFile(scratchPath, text, 'utf8');
60
118
  const localCaddy = whichCaddy();
61
119
  const localDocker = whichDocker();
@@ -73,9 +131,12 @@ export default async function runProbe() {
73
131
  engineLabel = 'caddy:2 container (docker run --rm)';
74
132
  } else {
75
133
  results.push({
76
- anchorAcId,
134
+ anchorAcId: null,
135
+ conformanceOnly: true,
136
+ limitation: LIMIT_REV_PROXY,
77
137
  verdict: 'warn',
78
- detail: 'neither caddy binary nor docker on PATH; caddy validate could not be exercised',
138
+ detail: 'offline caddyfile-validate: neither caddy binary nor docker on PATH; caddy validate could not be exercised',
139
+ evidence: { caddyLocal: null, dockerLocal: null },
79
140
  });
80
141
  return { results, extra };
81
142
  }
@@ -85,15 +146,41 @@ export default async function runProbe() {
85
146
  const tail = ((r.stderr || '') + (r.stdout || '')).split('\n').slice(-10).join('\n');
86
147
  if (r.status === 0) {
87
148
  results.push({
88
- anchorAcId,
149
+ anchorAcId: null,
150
+ conformanceOnly: true,
151
+ limitation: LIMIT_REV_PROXY,
89
152
  verdict: 'pass',
90
- detail: `caddy validate exit 0 (${engineLabel}); tail: ${tail.slice(-200)}`,
153
+ detail: `offline caddyfile-validate: caddy validate exit 0 (${engineLabel}); tail: ${tail.slice(-200)}`,
154
+ evidence: {
155
+ caddyfileSha256,
156
+ engineLabel,
157
+ exitStatus: 0,
158
+ tailExcerpt: tail.slice(-400),
159
+ vendorDocs: {
160
+ caddyValidate: VENDOR_CADDY,
161
+ dockerRunRm: VENDOR_DOCKER,
162
+ verifiedOn: VENDOR_VERIFIED_ON,
163
+ },
164
+ },
91
165
  });
92
166
  } else {
93
167
  results.push({
94
- anchorAcId,
168
+ anchorAcId: null,
169
+ conformanceOnly: true,
170
+ limitation: LIMIT_REV_PROXY,
95
171
  verdict: 'fail',
96
- detail: `caddy validate exit ${r.status} (${engineLabel}); tail: ${tail.slice(-400)}`,
172
+ detail: `offline caddyfile-validate: caddy validate exit ${r.status} (${engineLabel}); tail: ${tail.slice(-400)}`,
173
+ evidence: {
174
+ caddyfileSha256,
175
+ engineLabel,
176
+ exitStatus: r.status,
177
+ tailExcerpt: tail.slice(-400),
178
+ vendorDocs: {
179
+ caddyValidate: VENDOR_CADDY,
180
+ dockerRunRm: VENDOR_DOCKER,
181
+ verifiedOn: VENDOR_VERIFIED_ON,
182
+ },
183
+ },
97
184
  });
98
185
  }
99
186
  } finally {