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
@@ -25,6 +25,7 @@
25
25
  // - if rcf-verify is absent, PROMPT to install (or accept an explicit
26
26
  // --install-verify flag) - NEVER silently skip the gate (§8.3).
27
27
 
28
+ import { spawn } from 'node:child_process';
28
29
  import { resolve as resolvePath } from 'node:path';
29
30
  import process from 'node:process';
30
31
  import { parseArgs } from 'node:util';
@@ -39,11 +40,17 @@ import {
39
40
  composeShipWithoutVerifiedRecord,
40
41
  composeShipWithoutEvalRecord,
41
42
  detectVerify,
43
+ findBrowserVerificationMissingAcs,
42
44
  findEvalRefusalAcs,
43
45
  findMockOnlyDeclaredAcs,
46
+ findScopeMismatchAcs,
47
+ findUiBaselineUnmetAcs,
44
48
  loadReport,
49
+ reportHasBrowserVerificationMissing,
45
50
  reportHasEvalRefusal,
46
51
  reportHasMockOnlyDeclared,
52
+ reportHasScopeMismatch,
53
+ reportHasUiBaselineUnmet,
47
54
  resolveAbsentVerify,
48
55
  spawnVerify,
49
56
  summariseReport,
@@ -51,6 +58,17 @@ import {
51
58
  writeShipWithoutVerifiedRecord,
52
59
  } from '../finalise/index.js';
53
60
 
61
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-26): the
62
+ // merge-state precondition. Finalise refuses to promote to verified
63
+ // when the git working tree is not on one of these default branches.
64
+ // Kept small and conventional (git init and every hosted git provider
65
+ // default to `main` or `master`); projects on a non-default trunk
66
+ // (rare in modern repos) either rename the trunk to a listed name or
67
+ // pass --allow-pre-merge on every finalise run. The alternative --
68
+ // reading the git remote's default-branch symbolic ref -- adds a
69
+ // network round-trip on every finalise and fails offline; the small
70
+ // name list is deliberately the safer default.
71
+ const DEFAULT_BRANCH_NAMES = new Set(['main', 'master']);
54
72
  // Kept in sync with verify's own sets by contract (build never imports verify -
55
73
  // that would break the §9 independence guarantee). Profiles: spec §4.
56
74
  // Severities: spec §5.1 finding taxonomy.
@@ -83,6 +101,16 @@ const OPTION_SPEC = {
83
101
  // string (spec section 8: missing reason exits 2). Shape mirrors
84
102
  // `--provision`: a value that looks like a flag is refused.
85
103
  'ship-without-eval': { type: 'string' },
104
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-26):
105
+ // finalise refuses promotion when the git working tree is not on
106
+ // the default branch (main / master) so `verified` traces to an
107
+ // actual post-merge runtime check by construction. --allow-pre-merge
108
+ // is the deliberate opt-out for pre-merge dev-loop dry runs; the
109
+ // decision is logged in the finalise stdout so the operator sees
110
+ // it. Absent a git working tree (e.g. verify against a bare tarball
111
+ // deploy), the check is skipped and a warn line records that
112
+ // finalise could not resolve the branch state.
113
+ 'allow-pre-merge': { type: 'boolean' },
86
114
  quiet: { type: 'boolean' },
87
115
  help: { type: 'boolean' },
88
116
  };
@@ -139,6 +167,15 @@ Options:
139
167
  string is mandatory; a missing reason exits
140
168
  2. The ack lands on the manifest under
141
169
  shipWithoutEval[] with a monotonic id.
170
+ --allow-pre-merge Referee-guarantee train (C-26): finalise
171
+ refuses to promote when the git working
172
+ tree is not on the default branch
173
+ (main / master), so verified traces to an
174
+ actual post-merge runtime check. This flag
175
+ is the deliberate opt-out for pre-merge
176
+ dev-loop dry runs; the decision is logged
177
+ on stdout. Absent a git checkout the check
178
+ degrades to a warn line.
142
179
  --quiet Suppress non-error confirmations
143
180
  --help Print this help
144
181
 
@@ -152,6 +189,58 @@ Exit codes:
152
189
  declined/unavailable - the FBS is left unchanged, findings surfaced
153
190
  `;
154
191
 
192
+ /**
193
+ * Referee-guarantee train (REQ-165 / US-16502, docs claim C-26).
194
+ * Resolve the current git branch as an out-of-band read so finalise
195
+ * can refuse promotion when the working tree is not on the default
196
+ * branch. Returns `{ ok: true, branch }` on success, `{ ok: false,
197
+ * reason }` when git is absent or the working tree is not a git
198
+ * checkout (bare tarball deploys, container ephemeral CWD). Never
199
+ * throws; the caller degrades to a warn line rather than a hard fail.
200
+ *
201
+ * Kept out of `#core/store` deliberately: this is a build-lite CLI
202
+ * concern (the ship gate reads the working tree state), not a document
203
+ * store concern. It also keeps the store free of a `spawn` seam.
204
+ *
205
+ * @param {object} args
206
+ * @param {string} args.cwd
207
+ * @param {{ spawn?: typeof spawn }} [args.deps]
208
+ * @returns {Promise<{ ok: true, branch: string } | { ok: false, reason: string }>}
209
+ */
210
+ async function resolveGitBranch({ cwd, deps = {} }) {
211
+ const spawnFn = deps.spawn ?? spawn;
212
+ return new Promise((resolveP) => {
213
+ let stdout = '';
214
+ let stderr = '';
215
+ let child;
216
+ try {
217
+ child = spawnFn('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
218
+ cwd, stdio: ['ignore', 'pipe', 'pipe'],
219
+ });
220
+ } catch (err) {
221
+ resolveP({ ok: false, reason: `git spawn failed: ${err.message}` });
222
+ return;
223
+ }
224
+ child.stdout.on('data', (chunk) => { stdout += chunk.toString('utf8'); });
225
+ child.stderr.on('data', (chunk) => { stderr += chunk.toString('utf8'); });
226
+ child.on('error', (err) => {
227
+ resolveP({ ok: false, reason: `git spawn failed: ${err.message}` });
228
+ });
229
+ child.on('close', (code) => {
230
+ if (code !== 0) {
231
+ resolveP({ ok: false, reason: `git rev-parse exited ${code}: ${stderr.trim() || 'no output'}` });
232
+ return;
233
+ }
234
+ const branch = stdout.trim();
235
+ if (!branch) {
236
+ resolveP({ ok: false, reason: 'git rev-parse returned empty branch name' });
237
+ return;
238
+ }
239
+ resolveP({ ok: true, branch });
240
+ });
241
+ });
242
+ }
243
+
155
244
  /**
156
245
  * @param {string[]} argv - argv slice after `finalise`
157
246
  * @param {object} [deps] - injectable seams (detect / spawn / prompt / install /
@@ -409,8 +498,76 @@ export async function main(argv, deps = {}) {
409
498
  stderr.write(`Report: ${outPath}\n`);
410
499
  return 4;
411
500
  }
501
+ // Referee-guarantee train (REQ-165 / US-16501, docs claims C-28,
502
+ // C-29, C-30, C-36): three further per-AC verdicts join the
503
+ // finalise refusal list. UI-BASELINE-UNMET (a browserVerification
504
+ // record whose verdict came back `block`, including the aggregate
505
+ // for a block-severity probe-pack failure, C-36), BROWSER-VERIFICATION-MISSING
506
+ // (a UI-bearing FBS with no bound browserVerification record), and
507
+ // SCOPE-MISMATCH (a bound TC narrower than the AC scope, per NV-BL-GATE-01).
508
+ // The docs page does not spell a named sister opt-out for these three;
509
+ // the refusal is honest and there is no ack path here. Graceful on the
510
+ // older report shape (no perAcVerdicts field): behaviour matches the
511
+ // MOCK-ONLY branch above.
512
+ if (passLoaded.ok && reportHasUiBaselineUnmet(passLoaded.report)) {
513
+ const uiUnmet = findUiBaselineUnmetAcs(passLoaded.report);
514
+ const acList = uiUnmet.map((a) => a.acId).filter(Boolean).join(', ');
515
+ stderr.write(`[finalise] gate NOT promoted: ${uiUnmet.length} AC(s) came back UI-BASELINE-UNMET on the report (${acList}); ${fbsId} left '${currentStatus}'.\n`);
516
+ stderr.write('The deployed UI failed at least one bound baseline invariant; a block-severity probe-pack failure aggregates into the same verdict. Fix the UI or the baseline, re-run rcf verify browser, then re-run finalise. Referee-guarantees claims C-28 and C-36.\n');
517
+ stderr.write(summariseReport(passLoaded.report));
518
+ stderr.write(`Report: ${outPath}\n`);
519
+ return 4;
520
+ }
521
+ if (passLoaded.ok && reportHasBrowserVerificationMissing(passLoaded.report)) {
522
+ const bvMissing = findBrowserVerificationMissingAcs(passLoaded.report);
523
+ const acList = bvMissing.map((a) => a.acId).filter(Boolean).join(', ');
524
+ stderr.write(`[finalise] gate NOT promoted: ${bvMissing.length} AC(s) came back BROWSER-VERIFICATION-MISSING on the report (${acList}); ${fbsId} left '${currentStatus}'.\n`);
525
+ stderr.write('A UI-bearing FBS has no browserVerification record on the manifest; verify has nothing to read for the baseline check. Run rcf verify browser <fbs-id> to lay the record down, then re-run finalise. Referee-guarantees claim C-29.\n');
526
+ stderr.write(summariseReport(passLoaded.report));
527
+ stderr.write(`Report: ${outPath}\n`);
528
+ return 4;
529
+ }
530
+ if (passLoaded.ok && reportHasScopeMismatch(passLoaded.report)) {
531
+ const scopeMismatch = findScopeMismatchAcs(passLoaded.report);
532
+ const acList = scopeMismatch.map((a) => a.acId).filter(Boolean).join(', ');
533
+ stderr.write(`[finalise] gate NOT promoted: ${scopeMismatch.length} AC(s) came back SCOPE-MISMATCH on the report (${acList}); ${fbsId} left '${currentStatus}'.\n`);
534
+ stderr.write('A bound TC is narrower than the AC scope (NV-BL-GATE-01). Widen the TC or narrow the AC scope in define, then re-run verify and finalise. Referee-guarantees claim C-30.\n');
535
+ stderr.write(summariseReport(passLoaded.report));
536
+ stderr.write(`Report: ${outPath}\n`);
537
+ return 4;
538
+ }
539
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-26):
540
+ // the merge-state precondition. `verified` promises "an actual
541
+ // post-merge runtime check" and the way finalise proves that is
542
+ // by refusing when the working tree is not on the default branch
543
+ // (main / master), so a mid-branch dev-loop run cannot stamp
544
+ // verified. --allow-pre-merge is the deliberate opt-out for
545
+ // pre-merge dry runs; the decision is logged in the finalise
546
+ // stdout so the operator sees it. Absent a git working tree the
547
+ // check degrades to a warn line rather than a hard fail: verify
548
+ // against a bare tarball deploy is legitimate and should not be
549
+ // refused by a git-shape check.
550
+ const gitBranch = await resolveGitBranch({ cwd, deps });
551
+ if (!gitBranch.ok) {
552
+ stderr.write(`[warn] finalise: could not resolve git branch (${gitBranch.reason}); skipping the post-merge precondition. Referee-guarantees claim C-26.\n`);
553
+ } else if (!DEFAULT_BRANCH_NAMES.has(gitBranch.branch)) {
554
+ if (flags['allow-pre-merge']) {
555
+ if (!quiet) {
556
+ stdout.write(`[finalise] --allow-pre-merge: promoting on branch '${gitBranch.branch}' (not a default trunk). Referee-guarantees claim C-26 records the pre-merge decision here.\n`);
557
+ }
558
+ } else {
559
+ stderr.write(`[finalise] gate NOT promoted: git working tree is on branch '${gitBranch.branch}', not a default trunk (${[...DEFAULT_BRANCH_NAMES].join(' / ')}); ${fbsId} left '${currentStatus}'.\n`);
560
+ stderr.write('The referee-guarantees page promises that verified traces to an actual post-merge runtime check. Merge the branch and re-run finalise, or pass --allow-pre-merge for a deliberate pre-merge dry run (the decision is logged on stdout). Referee-guarantees claim C-26.\n');
561
+ return 4;
562
+ }
563
+ }
412
564
  const result = await updateDocument({
413
- projectRoot, tree, id: fbsId, sets: [{ path: 'executionStatus', value: 'verified' }], options: {},
565
+ projectRoot, tree, id: fbsId, sets: [{ path: 'executionStatus', value: 'verified' }],
566
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-22):
567
+ // the writer refuses executionStatus=verified on FBS by default.
568
+ // Finalise is the only path the docs promise can write it, so
569
+ // this call carries the override flag through.
570
+ options: { allowVerifiedOverride: true },
414
571
  });
415
572
  if (isRcfError(result)) {
416
573
  if (result.kind === 'ioFailure') { writeUnexpectedFailure(result, stderr); return 1; }
package/src/cli/help.js CHANGED
@@ -19,6 +19,7 @@ import { HELP as AUDIT_EVAL_HELP } from './eval.js';
19
19
  import { HELP as CREATE_HELP } from './create.js';
20
20
  import { HELP as DELETE_HELP } from './delete.js';
21
21
  import { HELP as DOCTOR_HELP } from './doctor.js';
22
+ import { HELP as FEEDBACK_HELP } from './feedback.js';
22
23
  import { HELP as FINALISE_HELP } from './finalise.js';
23
24
  import { HELP as GUIDANCE_HELP } from './guidance.js';
24
25
  import { HELP as IMPACT_HELP } from './impact.js';
@@ -68,6 +69,8 @@ core Platform plumbing that predates any RCF stage.
68
69
  mcp Serve the project over MCP (local stdio).
69
70
  version [--check] Print installed version; --check compares
70
71
  against the release feed.
72
+ feedback <verb> Log a blueprint or core finding locally, and
73
+ (later slices) ask once, submit or bundle.
71
74
  help [group] [verb] Print help for a group or a verb.
72
75
 
73
76
  discover Learn what is already true for this project.
@@ -143,6 +146,8 @@ Verbs:
143
146
  mcp Serve the project over MCP (local stdio).
144
147
  version [--check] Print installed version; --check compares
145
148
  against the release feed.
149
+ feedback <verb> Log a blueprint or core finding locally, and
150
+ (later slices) ask once, submit or bundle.
146
151
  help [group] [verb] Print help for a group or a verb.
147
152
 
148
153
  Run 'rcf help <verb>' for per-verb help.
@@ -313,6 +318,7 @@ export const CORE_HELP = {
313
318
  guidance: GUIDANCE_HELP,
314
319
  mcp: MCP_HELP,
315
320
  version: VERSION_HELP,
321
+ feedback: FEEDBACK_HELP,
316
322
  };
317
323
 
318
324
  /**
package/src/cli/init.js CHANGED
@@ -38,6 +38,10 @@ import {
38
38
  import { PLAYWRIGHT_MCP_VERSION } from '../verify/engine/launcher.js';
39
39
  import { writeKnowledgeSeed } from '../setup/knowledge-seed.js';
40
40
  import { writeIdentityTemplate } from '../setup/identity-seed.js';
41
+ import {
42
+ writeClaudeFeedbackHooks,
43
+ writeCodexFeedbackHooks,
44
+ } from '../setup/feedback-hooks.js';
41
45
  import {
42
46
  composeGitignoreBlock,
43
47
  computeGitignoreBlockHash,
@@ -52,6 +56,8 @@ const OPTION_SPEC = {
52
56
  'non-interactive': { type: 'boolean' },
53
57
  'no-agent-setup': { type: 'boolean' },
54
58
  'no-playwright-mcp': { type: 'boolean' },
59
+ 'no-feedback-hooks': { type: 'boolean' },
60
+ 'bin-path': { type: 'string' },
55
61
  quiet: { type: 'boolean' },
56
62
  help: { type: 'boolean' },
57
63
  };
@@ -81,6 +87,13 @@ Options:
81
87
  init writes no Playwright entry and touches no
82
88
  existing one. Use when a user-scope Playwright
83
89
  entry is declared in a harness init cannot probe.
90
+ --no-feedback-hooks Skip the feedback hook install step
91
+ (.claude/settings.json + .codex/hooks.json).
92
+ RULE 17 in the managed instructions block still
93
+ covers the ask via the belt-and-braces path.
94
+ --bin-path <path> Absolute path to the rcf binary. When set, hook
95
+ and MCP entries use 'node <path> ...' instead of
96
+ 'npx rcf-lite ...' (pinned deployments).
84
97
  --quiet Suppress non-error stdout
85
98
  --help Print this help
86
99
  `;
@@ -222,6 +235,29 @@ export async function main(argv, deps = {}) {
222
235
  // refreshed in place; operator content outside preserved byte-for-byte.
223
236
  const gitignoreResult = await ensureManagedGitignore({ projectRoot: cwd });
224
237
 
238
+ // Step 6: feedback hooks (ADR-4108). Writes the three Stop /
239
+ // SessionEnd / SessionStart entries into .claude/settings.json and
240
+ // .codex/hooks.json unless --no-feedback-hooks is set. Merge
241
+ // discipline mirrors writeMcpConfig: parse, refuse on invalid JSON,
242
+ // add ours only when absent, never clobber. --bin-path pins the
243
+ // hook command to `node <path>` for pinned-bin deployments.
244
+ const feedbackOptOut = Boolean(flags['no-feedback-hooks']);
245
+ const feedbackBinPath = typeof flags['bin-path'] === 'string' ? flags['bin-path'] : undefined;
246
+ let claudeHookResult = null;
247
+ let codexHookResult = null;
248
+ if (!feedbackOptOut) {
249
+ claudeHookResult = await writeClaudeFeedbackHooks({ projectRoot: cwd, binPath: feedbackBinPath });
250
+ if (claudeHookResult && 'kind' in claudeHookResult && 'message' in claudeHookResult) {
251
+ stderr.write(`[error] ${claudeHookResult.kind} ${claudeHookResult.message}\n`);
252
+ return 2;
253
+ }
254
+ codexHookResult = await writeCodexFeedbackHooks({ projectRoot: cwd, binPath: feedbackBinPath });
255
+ if (codexHookResult && 'kind' in codexHookResult && 'message' in codexHookResult) {
256
+ stderr.write(`[error] ${codexHookResult.kind} ${codexHookResult.message}\n`);
257
+ return 2;
258
+ }
259
+ }
260
+
225
261
  // High-level completion summary: what was set up and what to do next -
226
262
  // not a developer file list (operator review 2026-07-16, comment 3a).
227
263
  if (!flags.quiet) {
@@ -248,6 +284,10 @@ export async function main(argv, deps = {}) {
248
284
  stdout.write(` Knowledge space ${knowledgeVerbAndTarget(knowledgeResult)}.\n`);
249
285
  stdout.write(` Operator profile ${identityVerbAndTarget(identityResult)}.\n`);
250
286
  stdout.write(` Gitignore ${gitignoreVerbAndTarget(gitignoreResult)}.\n`);
287
+ stdout.write(` Feedback hooks ${feedbackHooksVerbAndTarget(feedbackOptOut, claudeHookResult, codexHookResult)}.\n`);
288
+ if (feedbackOptOut) {
289
+ stdout.write(' (no-feedback-hooks) RULE 17 in the managed instructions block still covers the ask via the belt-and-braces path.\n');
290
+ }
251
291
  stdout.write('\nNext: start your agent session in this directory and tell it what you want to build. '
252
292
  + 'It elicits the requirements and drives the build from there - you do not fill in the document chain by hand.\n');
253
293
  stdout.write('\nRun `rcf doctor` to confirm the wiring stays clean over time '
@@ -268,6 +308,29 @@ function identityVerbAndTarget(result) {
268
308
  return 'template at rcf/.identity/profile.md (gitignored by default; fill in what is useful)';
269
309
  }
270
310
 
311
+ function feedbackHooksVerbAndTarget(optOut, claudeResult, codexResult) {
312
+ if (optOut) return 'skipped (--no-feedback-hooks; RULE 17 fallback in the managed instructions block still applies)';
313
+ const claudeVerb = claudeResult
314
+ ? (claudeResult.action === 'kept'
315
+ ? 'already present in .claude/settings.json'
316
+ : (claudeResult.action === 'created'
317
+ ? 'written to .claude/settings.json'
318
+ : (claudeResult.action === 'foreign'
319
+ ? 'foreign entry present in .claude/settings.json (rcf doctor --check feedback-hooks reports the details; no clobber)'
320
+ : 'merged into .claude/settings.json')))
321
+ : 'not touched';
322
+ const codexVerb = codexResult
323
+ ? (codexResult.action === 'kept'
324
+ ? 'already present in .codex/hooks.json'
325
+ : (codexResult.action === 'created'
326
+ ? 'written to .codex/hooks.json'
327
+ : (codexResult.action === 'foreign'
328
+ ? 'foreign entry present in .codex/hooks.json (rcf doctor --check feedback-hooks reports the details; no clobber)'
329
+ : 'merged into .codex/hooks.json')))
330
+ : 'not touched';
331
+ return `${claudeVerb}; ${codexVerb}`;
332
+ }
333
+
271
334
  function gitignoreVerbAndTarget(result) {
272
335
  if (result.action === 'noop') return 'managed block already up to date in .gitignore';
273
336
  if (result.action === 'created') return 'managed block written to .gitignore (rcf/.identity/ ignored)';
package/src/cli/update.js CHANGED
@@ -24,6 +24,12 @@ const OPTION_SPEC = {
24
24
  // Phase 10 (X2 CodeNode bridge, D5): re-derive a CN's file-level
25
25
  // dependencies via dependency-cruiser, merged into dependencies[].
26
26
  'derive-deps': { type: 'boolean' },
27
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-22):
28
+ // the writer refuses executionStatus=verified on FBS by default so
29
+ // finalise is the only path that promotes to verified. This flag
30
+ // is the deliberate manual override: a logged operator decision
31
+ // that skips the post-merge runtime check finalise runs.
32
+ 'acknowledge-verified-override': { type: 'boolean' },
27
33
  };
28
34
 
29
35
  export const HELP = `Usage: rcf define update <id> [options]
@@ -38,6 +44,14 @@ Options:
38
44
  --derive-deps CN only: re-derive file-level dependencies via
39
45
  dependency-cruiser and merge into dependencies[]
40
46
  (dev-time assist; never a runtime dependency)
47
+ --acknowledge-verified-override
48
+ FBS only: acknowledge writing
49
+ executionStatus=verified without a finalise
50
+ run. The writer refuses this write by
51
+ default so finalise (rcf build finalise) is
52
+ the sole path to verified; the override is
53
+ a deliberate, logged operator decision that
54
+ skips the post-merge runtime check.
41
55
  --help Print this help
42
56
  `;
43
57
 
@@ -138,7 +152,13 @@ export async function main(argv, deps = {}) {
138
152
  }
139
153
  const result = await updateDocument({
140
154
  projectRoot, tree: walkResult.tree, id, patch, sets,
141
- options: { dryRun: Boolean(flags['dry-run']) },
155
+ options: {
156
+ dryRun: Boolean(flags['dry-run']),
157
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-22):
158
+ // the writer's default refuses executionStatus=verified on FBS;
159
+ // this flag routes the operator's deliberate override through.
160
+ allowVerifiedOverride: Boolean(flags['acknowledge-verified-override']),
161
+ },
142
162
  walkErrors: walkResult.errors,
143
163
  });
144
164
  if (isRcfError(result)) return handleWriterError(result, stderr);
@@ -817,6 +817,39 @@ function collectBrokenReferences(tree, errors) {
817
817
  filePath: `rcf/adrs/${(adr.adrId ?? '').toLowerCase()}.json`,
818
818
  message: `ADR ${adr.adrId} references unknown TAD ${adr.tadId}`,
819
819
  });
820
+ // Referee-guarantee train (REQ-163 / US-16301, docs claim C-7):
821
+ // the "every reference in every document resolves" promise on the
822
+ // referee-guarantees page needs the ADR-schema-declared cross-links
823
+ // walked here. `supersededBy` is the strong, chain-of-decisions
824
+ // reference: an ADR that points at an unknown successor is a broken
825
+ // history record. Walk it under the same check helper as every other
826
+ // cross-link so a bad target fails validate with a brokenReference
827
+ // named to the ADR file and the field.
828
+ //
829
+ // `relatedAdrs` (the soft, "see also" back-reference) is intentionally
830
+ // NOT walked here. The `rcf define blueprint supersede` verb writes
831
+ // a project ruling ADR whose relatedAdrs lists BOTH the applied
832
+ // blueprint ADR (present on disk) AND the incoming blueprint ADR
833
+ // (not yet on disk: the incoming blueprint add is the closing step
834
+ // of the option-3 workflow the conflict message prints). Walking
835
+ // relatedAdrs would refuse that ratified workflow between the
836
+ // supersede write and the re-add. Escalation-clause carry: the docs
837
+ // claim held by `supersededBy` alone matches the strong-reference
838
+ // half of the referee promise; the soft `relatedAdrs` half is a
839
+ // schemas follow-up (either "value-narrowed to already-applied ADR
840
+ // ids" or "walked but with a workflow-aware exception on the
841
+ // supersede write path").
842
+ if (typeof adr.supersededBy === 'string' && adr.supersededBy.length > 0) {
843
+ check({
844
+ docId: adr.adrId,
845
+ docKind: 'adr',
846
+ fromField: 'supersededBy',
847
+ targetId: adr.supersededBy,
848
+ expectedKind: 'adr',
849
+ filePath: `rcf/adrs/${(adr.adrId ?? '').toLowerCase()}.json`,
850
+ message: `ADR ${adr.adrId} references unknown ADR ${adr.supersededBy} in supersededBy`,
851
+ });
852
+ }
820
853
  }
821
854
 
822
855
  // FBS parent + cross-link + dependency checks. `buildOrder` uniqueness
@@ -1115,6 +1115,29 @@ export async function updateDocument({ projectRoot, tree, id, patch, sets = [],
1115
1115
  return rcfError({ kind: 'usage', message: `update: id ${id} not found`, documentId: id });
1116
1116
  }
1117
1117
 
1118
+ // Referee-guarantee train (REQ-165 / US-16502, docs claim C-22):
1119
+ // `rcf build finalise` is the only path that writes FBS
1120
+ // executionStatus=verified. The manifest / FBS schema admits
1121
+ // `verified` as an executionStatus value (the finalise writer
1122
+ // depends on that), so `validateDocument` would silently accept a
1123
+ // manual override on the update path. Refuse it here unless the
1124
+ // caller passed `options.allowVerifiedOverride: true` (finalise
1125
+ // sets that flag; the define-update CLI sets it only when the
1126
+ // operator passes `--acknowledge-verified-override`, per the
1127
+ // escalation clause on this train). The docs promise is that a
1128
+ // chain that says `verified` traces to an actual post-merge
1129
+ // runtime check by construction; this refusal is the gate.
1130
+ if (kind === 'fbs' && !options.allowVerifiedOverride) {
1131
+ const touchesVerified = (patch && patch.executionStatus === 'verified')
1132
+ || sets.some((s) => s.path === 'executionStatus' && s.value === 'verified');
1133
+ if (touchesVerified) {
1134
+ return rcfError({
1135
+ kind: 'usage',
1136
+ message: `update: refusing to write executionStatus=verified on ${id}; verified is written only by the finalise gate (rcf build finalise <fbs-id> --url <deploy-url>). For a deliberate manual override use --acknowledge-verified-override on rcf define update; the override is a logged operator decision that skips the post-merge runtime check.`,
1137
+ documentId: id,
1138
+ });
1139
+ }
1140
+ }
1118
1141
  // Build patched body: start from doc, apply --from-file deep merge,
1119
1142
  // then apply each --set dot-path assignment.
1120
1143
  let next = deepClone(doc);