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
@@ -0,0 +1,42 @@
1
+ {
2
+ "usId": "US-16103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "REQ-161",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "title": "A carried-over batch is offered next session",
8
+ "asA": "operator whose session ended before the ask fired",
9
+ "iWant": "the SessionEnd hook to flush a bundle idempotently and the SessionStart hook of the next session to inject a one-line context reminder that pending entries exist",
10
+ "soThat": "a crash or /clear does not lose findings and the next session's first pause carries the ask",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-16103-1",
14
+ "description": "rcf feedback hook session-end writes the outbox bundle for any pending entries under 1 second (the shared Claude Code SessionEnd budget is 1.5s) and is byte-idempotent (same content hash means no rewrite). Codex SessionEnd runs the same handler; output is discarded either way.",
15
+ "given": "a fixture with two pending entries and a stubbed clock so the elapsed time is measurable",
16
+ "when": "rcf feedback hook session-end is run twice back-to-back",
17
+ "then": "the first run writes one bundle file under outbox; the second run runs to completion in under 1 second without rewriting the same-hash file; both exit 0",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-16103-2",
23
+ "description": "rcf feedback hook session-start with pending entries and a new sessionId prints one plain line to stdout on Claude Code (\"rcf feedback: <n> unsubmitted entr(y|ies) carried over from an earlier session; ask the operator once at a natural pause (RULE 17).\") and the Codex-shaped equivalent under --harness codex. The line is what the harness injects as context; it never blocks. If SessionStart on Codex cannot inject context (verified at build time against the current Codex reference), the fallback in RULE 17 (\"check rcf feedback status at session start\") is what carries the same posture.",
24
+ "given": "a fixture with two pending entries carried over from a prior sessionId",
25
+ "when": "rcf feedback hook session-start is run under each harness",
26
+ "then": "the Claude Code stdout matches the exact wording above; the Codex JSON matches the reference shape currently accepted for SessionStart context; both return exit 0; state.json is not mutated (asked is set on Stop, not on session-start)",
27
+ "testable": true,
28
+ "scope": "library"
29
+ },
30
+ {
31
+ "id": "AC-16103-3",
32
+ "description": "rcf feedback defer means \"not now, ask again next session\" (design 3.1). Entries in status deferredUntilSession whose stored sessionId is not the current one are requeued to pending on the SessionStart hook AND on the Stop hook (belt to the SessionStart braces, so the flow works when only Stop is installed). The requeue appends one state-transition line per entry with status pending and no sessionId field, so fold-by-id preserves the entry's prior sessionId and the carry-over gate in both hooks (pending.sessionId !== currentSessionId) fires naturally in the new session. Entries recorded or last deferred under the current sessionId are not re-transitioned (idempotent per session; deferring twice in one session is a no-op on the second call).",
33
+ "given": "a fixture with one pending entry deferred in session A (entries.jsonl carries the deferredUntilSession line with sessionId A)",
34
+ "when": "rcf feedback hook session-start --harness claude-code is run with session_id B, then rcf feedback hook stop --harness claude-code is run with the same session_id B",
35
+ "then": "SessionStart appends one { status: pending } transition (no sessionId field) so the entry returns to pending with its sessionId still A; the carry-over line prints to stdout naming the count and RULE 17; the following Stop exits 2 with the ask on stderr and appends exactly one asked record for session B; a second SessionStart in session B is a no-op (no new transition, silent stdout); a further SessionStart in a fresh session_id C after a Stop-only path (no SessionStart wired) still requeues on the Stop hook so the ask fires there",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "createdAt": "2026-09-16T13:45:23.000Z",
41
+ "updatedAt": "2026-09-17T03:30:00Z"
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "usId": "US-16104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "REQ-161",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "title": "rcf init installs the feedback hooks and rcf doctor keeps them honest",
8
+ "asA": "operator running rcf init on a project",
9
+ "iWant": "the feedback Stop / SessionEnd / SessionStart hook entries merged into .claude/settings.json and .codex/hooks.json (with --no-feedback-hooks to skip), and rcf doctor to report missing-hook (fixable with --fix) and foreign-hook (refused) so the harness config stays honest across clones",
10
+ "soThat": "every clone gets the same ask behaviour without a per-developer setup step, and drift is surfaced instead of quietly diverging",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-16104-1",
14
+ "description": "rcf init merges three feedback hook entries into .claude/settings.json (Stop -> \"npx rcf-lite feedback hook stop --harness claude-code\" timeout 10; SessionEnd -> \"... hook session-end ...\" timeout 5; SessionStart matcher \"startup|resume\" -> \"... hook session-start ...\") and three matching entries into .codex/hooks.json (in the Codex schema for the same events). Merge discipline mirrors writeMcpConfig: parse, refuse on invalid JSON with the same message shape as .mcp.json, never clobber other hooks, add ours only if an entry whose command contains \"rcf feedback hook\" is absent. The \"npx rcf-lite\" prefix is replaced by binPath when init was called with --bin-path, mirroring the .mcp.json entry pattern.",
15
+ "given": "a fresh fixture project with no .claude/settings.json and no .codex/hooks.json",
16
+ "when": "rcf init is run without --no-feedback-hooks",
17
+ "then": "both files contain the three feedback hook entries in the right shape; a second rcf init on the same tree is byte-idempotent; a pre-existing settings.json with an unrelated hook is preserved and the feedback entries are added alongside it",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-16104-2",
23
+ "description": "rcf init --no-feedback-hooks writes neither .claude/settings.json nor .codex/hooks.json feedback entries and prints the instruction-only fallback line once (RULE 17 still applies). --no-feedback-hooks composes with --no-playwright-mcp and other init skips without interaction.",
24
+ "given": "a fresh fixture project",
25
+ "when": "rcf init --no-feedback-hooks is run",
26
+ "then": "no feedback hook entry is present in either config file; init exits 0; the one-line instruction fallback appears in stdout",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-16104-3",
32
+ "description": "rcf doctor --check feedback-hooks reports missing-hook (fixable) per hook per file when an expected entry is absent, and foreign-hook (refused, hand-repair message) when an entry whose command contains \"rcf feedback hook\" is present with different flags than the current install shape. rcf doctor --fix adds the missing entries and touches nothing else. A clean tree reports no findings and doctor stays exit 0.",
33
+ "given": "three fixture projects: one missing all feedback hook entries; one with a foreign entry (same command, wrong flags); one clean",
34
+ "when": "rcf doctor --check feedback-hooks --fix is run against each",
35
+ "then": "the missing-entries project ends with the entries present (added only); the foreign-entry project keeps the foreign entry, reports the foreign-hook message and exits non-zero; the clean project makes no writes and exits 0",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "createdAt": "2026-09-16T14:07:38.000Z",
41
+ "updatedAt": "2026-09-16T14:14:36Z"
42
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "usId": "US-16201",
3
+ "prdId": "PRD-001",
4
+ "reqId": "REQ-162",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "title": "RULE 17 tells every agent when to log and when to ask",
8
+ "asA": "harness (Claude Code or Codex) that reads the managed instructions block",
9
+ "iWant": "a static RULE 17 in guidance/managed/agent-instructions-block.md that names rcf feedback add for logging, describes the one-ask-per-session posture (harness hook or operator wrap-up as trigger, preview then submit --yes or defer or opt-out), and states the redaction posture",
10
+ "soThat": "an agent under pace still follows the shape when the harness hooks are not trusted, and the same rule serves both harnesses",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-16201-1",
14
+ "description": "guidance/managed/agent-instructions-block.md gains RULE 17 with the wording specified in design section 3.4. pnpm run build:managed regenerates the block hash and harness-template.md so rcf doctor doctor-agent-instructions and gen-managed-artefacts stay byte-consistent. The wording is static (no version numbers, no dates) and names all four verbs (preview, submit --yes, defer, opt-out). A byte-exact template test loads the shipped block and asserts the RULE 17 slice is byte-for-byte identical to the design-section-3.4 fixture stored in test/fixtures/managed/rule-17.md, so a wording drift on ship is caught.",
15
+ "given": "a fixture repository state with RULE 17 not yet added",
16
+ "when": "the change is applied, pnpm run build:managed is run, and rcf doctor is run",
17
+ "then": "RULE 17 appears in the block file exactly as specified; the hash file changes on this release; doctor doctor-agent-instructions reports clean; a byte-exact template test asserts the RULE 17 slice of the block matches test/fixtures/managed/rule-17.md byte-for-byte",
18
+ "testable": true,
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "AC-16201-2",
23
+ "description": "rcf init writes CLAUDE.md and AGENTS.md with the regenerated block (RULE 17 included). The existing managed-block installation path (writeAgentInstructions) is the only touch-point; no init-time flag is added for RULE 17.",
24
+ "given": "a fresh fixture project",
25
+ "when": "rcf init is run",
26
+ "then": "CLAUDE.md and AGENTS.md both contain the RULE 17 block text between the managed-block markers; the block outside the markers is untouched",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "createdAt": "2026-09-16T13:45:23.000Z",
32
+ "updatedAt": "2026-09-16T14:14:36Z"
33
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "createdAt": "2026-09-16T22:20:45Z",
3
+ "updatedAt": "2026-09-16T22:20:45Z",
4
+ "asA": "beta reader relying on the referee-guarantees page to know what `rcf define validate` proves",
5
+ "iWant": "a broken ADR supersededBy pointer to be reported as a brokenReference the same way a broken parent link is, and the soft `relatedAdrs` back-reference to stay silent so the ratified blueprint-supersede workflow is not broken",
6
+ "soThat": "the docs-page promise that every reference in every document resolves is enforced on the strong chain-of-decisions reference (supersededBy), while the soft see-also field stays a schemas follow-up (either value-narrowed or workflow-aware)",
7
+ "usId": "US-16301",
8
+ "prdId": "PRD-001",
9
+ "reqId": "REQ-163",
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "title": "US-16301: define validate walks ADR supersededBy; relatedAdrs stays a schemas follow-up (compatibility carry)",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-16301-1",
16
+ "description": "An ADR whose supersededBy names an id with no file on disk (or an id that resolves to a non-ADR kind) surfaces as a brokenReference error naming the ADR file and the field `supersededBy`, and the corresponding target id joins tree.brokenIds. A supersededBy field that is absent or empty is silent.",
17
+ "given": "an initialised RCF project with adr-001.json whose supersededBy is set to a non-existent id ADR-999",
18
+ "when": "walkTree runs (as invoked by `rcf define validate`)",
19
+ "then": "errors contain a brokenReference with documentId ADR-001 and field supersededBy naming ADR-999, and tree.brokenIds contains ADR-999",
20
+ "testable": true,
21
+ "scope": "library"
22
+ },
23
+ {
24
+ "id": "AC-16301-2",
25
+ "description": "An ADR whose relatedAdrs contains an id with no file on disk stays SILENT under walkTree: the ratified `rcf define blueprint supersede` workflow writes a project ADR whose relatedAdrs lists both the applied blueprint ADR (on disk) and the incoming blueprint ADR (not yet on disk; the incoming add is the closing step of option 3). Walking relatedAdrs would refuse that workflow between the supersede write and the re-add; the compatibility carry keeps the soft back-reference unchecked here. Tightening this is a schemas follow-up (value-narrow to applied ADR ids, or a workflow-aware exception on the supersede write path).",
26
+ "given": "an initialised RCF project with adr-001.json whose relatedAdrs is set to [ADR-777] (a non-existent id, mirroring the transient state between supersede and re-add)",
27
+ "when": "walkTree runs (as invoked by `rcf define validate`)",
28
+ "then": "no brokenReference error targets the relatedAdrs field on ADR-001",
29
+ "testable": true,
30
+ "scope": "library"
31
+ }
32
+ ],
33
+ "tacIds": [
34
+ "TAC-4109-referee-validate-adr-crosslinks"
35
+ ]
36
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "createdAt": "2026-09-16T22:28:54Z",
3
+ "updatedAt": "2026-09-16T22:28:54Z",
4
+ "asA": "beta reader who typed the command from the referee-guarantees page",
5
+ "iWant": "`rcf audit coverage` with no flag to fail the gate on a stub or missing test, and `--mode shallow-any` to be the documented escape valve",
6
+ "soThat": "the docs promise 'a stub or stale pointer fails the gate exactly as a missing test does' holds by construction, and my existing `--strict` invocations do not need rewriting",
7
+ "usId": "US-16401",
8
+ "prdId": "PRD-001",
9
+ "reqId": "REQ-164",
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "title": "US-16401: strict-by-default coverage with a shallow-any opt-out and a legacy --strict alias",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-16401-1",
16
+ "description": "The plain `rcf audit coverage` command runs strict (per-AC) mode. On a tree whose ACs are not all covered by resolving TCs, it prints the table and exits 4; on a fully covered tree it exits 0. The default is the same as the legacy `--strict` invocation.",
17
+ "given": "an initialised RCF project with a scaffold AC-101-1 that has no covering TC",
18
+ "when": "`rcf audit coverage` is invoked with no strictness flag",
19
+ "then": "the exit code is 4",
20
+ "testable": true,
21
+ "scope": "library"
22
+ },
23
+ {
24
+ "id": "AC-16401-2",
25
+ "description": "`--mode shallow-any` reports gaps and exits 0. The output's Coverage-mode line reads `shallow-any` and the table renders the same shape as strict mode; the exit code is 0 even on uncovered ACs.",
26
+ "given": "the same scaffold as AC-16401-1",
27
+ "when": "`rcf audit coverage --mode shallow-any` is invoked",
28
+ "then": "the exit code is 0 and the output includes 'Coverage mode: shallow-any'",
29
+ "testable": true,
30
+ "scope": "library"
31
+ },
32
+ {
33
+ "id": "AC-16401-3",
34
+ "description": "Conflicting flags exit 2 with a usage message. Passing `--mode shallow-any --strict` (in either order) is refused before running the audit; the error names both flags. `--mode` with an unknown value (e.g. `lenient`) also exits 2 with a usage message.",
35
+ "given": "an initialised RCF project",
36
+ "when": "`rcf audit coverage --mode shallow-any --strict` is invoked",
37
+ "then": "the exit code is 2 and stderr matches /--mode shallow-any conflicts with --strict/",
38
+ "testable": true,
39
+ "scope": "library"
40
+ }
41
+ ],
42
+ "tacIds": [
43
+ "TAC-4110-referee-coverage-mode-selector"
44
+ ]
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "createdAt": "2026-09-16T22:38:04Z",
3
+ "updatedAt": "2026-09-16T22:38:04Z",
4
+ "asA": "beta reader trusting the referee-guarantees page's finalise refusal list",
5
+ "iWant": "`rcf build finalise` to refuse promotion when the verify report carries UI-BASELINE-UNMET, BROWSER-VERIFICATION-MISSING or SCOPE-MISMATCH on any AC",
6
+ "soThat": "a UI baseline violation, a missing browser check on a UI-bearing FBS, a bound TC narrower than its AC scope, or a block-severity probe-pack failure all fail the gate the same way the mock-only and EVAL refusals already do",
7
+ "usId": "US-16501",
8
+ "prdId": "PRD-001",
9
+ "reqId": "REQ-165",
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "title": "US-16501: finalise refuses on UI-BASELINE-UNMET, BROWSER-VERIFICATION-MISSING and SCOPE-MISMATCH",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-16501-1",
16
+ "description": "On a verify PASS (exit 0, ship authority) whose report carries at least one per-AC UI-BASELINE-UNMET verdict, `rcf build finalise` exits 4 and leaves the FBS at 'complete'. The stderr message names the AC(s), the count of UI-BASELINE-UNMET verdicts, and the referee-guarantees claim ids C-28 and C-36 (a block-severity probe-pack failure aggregates into UI-BASELINE-UNMET, so the same branch closes both).",
17
+ "given": "an FBS at status 'complete' and a stub verify subprocess whose report writes verdictAuthority='ship' and perAcVerdicts includes {acId, verdict: 'UI-BASELINE-UNMET'}",
18
+ "when": "`rcf build finalise <fbsId> --url ...` is invoked",
19
+ "then": "the exit code is 4, the FBS on disk stays at 'complete', and stderr matches /UI-BASELINE-UNMET/ and /Referee-guarantees claims C-28 and C-36/",
20
+ "testable": true,
21
+ "scope": "runtime"
22
+ },
23
+ {
24
+ "id": "AC-16501-2",
25
+ "description": "Same shape for BROWSER-VERIFICATION-MISSING: a UI-bearing FBS with no browserVerification[] record aggregates into a per-AC verdict that finalise refuses. Exit 4, FBS at 'complete', stderr names C-29.",
26
+ "given": "the same scaffold with perAcVerdicts = [{acId, verdict: 'BROWSER-VERIFICATION-MISSING'}]",
27
+ "when": "`rcf build finalise <fbsId> --url ...` is invoked",
28
+ "then": "the exit code is 4 and stderr matches /BROWSER-VERIFICATION-MISSING/ and /Referee-guarantees claim C-29/",
29
+ "testable": true,
30
+ "scope": "runtime"
31
+ },
32
+ {
33
+ "id": "AC-16501-3",
34
+ "description": "Same shape for SCOPE-MISMATCH (NV-BL-GATE-01): a bound TC narrower than its AC scope aggregates into a per-AC SCOPE-MISMATCH verdict that finalise refuses. Exit 4, FBS at 'complete', stderr names C-30.",
35
+ "given": "the same scaffold with perAcVerdicts = [{acId, verdict: 'SCOPE-MISMATCH'}]",
36
+ "when": "`rcf build finalise <fbsId> --url ...` is invoked",
37
+ "then": "the exit code is 4 and stderr matches /SCOPE-MISMATCH/ and /Referee-guarantees claim C-30/",
38
+ "testable": true,
39
+ "scope": "runtime"
40
+ }
41
+ ],
42
+ "tacIds": [
43
+ "TAC-4111-referee-finalise-per-ac-refusals"
44
+ ]
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "createdAt": "2026-09-16T22:38:04Z",
3
+ "updatedAt": "2026-09-16T22:38:04Z",
4
+ "asA": "beta reader trusting the referee-guarantees page's verified-invariant promise",
5
+ "iWant": "`rcf define update` to refuse writing FBS.executionStatus=verified by default, and `rcf build finalise` to refuse promotion when the git working tree is not on a default trunk",
6
+ "soThat": "a chain that says verified traces to an actual post-merge runtime check by construction, and a mid-branch dev-loop finalise cannot stamp verified without the operator's deliberate opt-out",
7
+ "usId": "US-16502",
8
+ "prdId": "PRD-001",
9
+ "reqId": "REQ-165",
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "title": "US-16502: finalise is the only path to verified, and it fires only on a default trunk",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-16502-1",
16
+ "description": "The writer refuses a define-update patch that sets FBS.executionStatus=verified when `options.allowVerifiedOverride` is not true. The refusal is an RcfError with kind='usage' whose message names the finalise gate and the --acknowledge-verified-override escape flag; the FBS on disk stays unchanged.",
17
+ "given": "an FBS at status 'complete' loaded through walkTree",
18
+ "when": "updateDocument is called with sets = [{path:'executionStatus', value:'verified'}] and options = {}",
19
+ "then": "the result is an RcfError with kind='usage' matching /verified is written only by the finalise gate/, and the FBS file on disk still reads status 'complete'",
20
+ "testable": true,
21
+ "scope": "library"
22
+ },
23
+ {
24
+ "id": "AC-16502-2",
25
+ "description": "Passing `options.allowVerifiedOverride: true` (the seam that finalise and `rcf define update --acknowledge-verified-override` both use) writes the value: the returned shape carries the doc id and the FBS on disk reads status 'verified'.",
26
+ "given": "the same scaffold as AC-16502-1",
27
+ "when": "updateDocument is called with the same sets and options = {allowVerifiedOverride: true}",
28
+ "then": "the result carries an id and the FBS file on disk reads status 'verified'",
29
+ "testable": true,
30
+ "scope": "library"
31
+ },
32
+ {
33
+ "id": "AC-16502-3",
34
+ "description": "`rcf build finalise` refuses promotion when the git working tree is not on a default trunk (main or master). Exit 4, FBS at 'complete', stderr names the branch and the referee-guarantees claim C-26. --allow-pre-merge is the deliberate opt-out: on a non-default branch it promotes and logs the pre-merge decision on stdout including the C-26 claim id.",
35
+ "given": "the same scaffold with a spawn seam that returns 'feature/x' as the current branch",
36
+ "when": "`rcf build finalise <fbsId> --url ...` is invoked",
37
+ "then": "the exit code is 4 and stderr matches /git working tree is on branch 'feature\\/x'/; with --allow-pre-merge appended the exit code is 0 and stdout matches /Referee-guarantees claim C-26 records the pre-merge decision here/",
38
+ "testable": true,
39
+ "scope": "runtime"
40
+ }
41
+ ],
42
+ "tacIds": [
43
+ "TAC-4112-referee-finalise-verified-invariant"
44
+ ]
45
+ }
@@ -40,8 +40,18 @@
40
40
  # `npm install rcf-lite`.
41
41
 
42
42
  feedVersion: 1
43
- latest: "0.27.0"
43
+ latest: "0.28.0"
44
44
  releases:
45
+ - version: "0.28.0"
46
+ date: "2026-09-17"
47
+ breaking: false
48
+ headlines:
49
+ - "rcf-lite 0.28.0 lands two referee-facing trains together. The rcf feedback verb family lets an agent record what a blueprint or rcf-lite did that contradicts its own docs, fails, or forces a workaround, and after one operator yes at a natural pause files each finding as a GitHub issue under the operator's own gh login, or writes a pastable outbox bundle when gh is not available."
50
+ - "The referee-guarantees train tightens the three sentences the docs page makes about rcf define validate, rcf audit coverage and rcf build finalise: validate now walks ADR supersededBy, coverage is strict by default with --mode shallow-any as the deliberate opt-out, and finalise refuses on the three per-AC verdicts, gates the manual verified override behind --acknowledge-verified-override, and adds a merge-state precondition with --allow-pre-merge as the deliberate pre-merge dry-run opt-out."
51
+ - "rcf init merges three hook entries into .claude/settings.json and .codex/hooks.json so the feedback ask fires once per session at idle; RULE 17 lands in the managed instructions block as the belt-and-braces path. Coverage-strict-by-default is the single migration surface: run rcf audit coverage --mode shallow-any when the intent is a printed gap report rather than a gate."
52
+ minAgentAction: rerun-init
53
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
54
+
45
55
  - version: "0.27.0"
46
56
  date: "2026-09-11"
47
57
  breaking: false
@@ -59,6 +59,18 @@ const LIBRARY_VERSION_KNOWN = 1;
59
59
  * @property {string} [contact]
60
60
  */
61
61
 
62
+ /**
63
+ * @typedef {object} LibraryIssuesField
64
+ * @property {string} repo OWNER/REPO on github.com; HOST/OWNER/REPO permitted for GHES
65
+ * @property {'public' | 'private'} visibility advisory; the tool re-checks live on submit
66
+ *
67
+ * The library owner names where feedback reports on this library are
68
+ * filed (design 3.3, ADR-4104). Absence is valid; the consuming
69
+ * project's `rcf doctor feedback-destinations` warns until the field
70
+ * lands. Snapshotted onto the registry entry as `issuesRepo` and
71
+ * `issuesVisibility` on `library add`.
72
+ */
73
+
62
74
  /**
63
75
  * @typedef {object} LoadedLibrary
64
76
  * @property {number} libraryVersion
@@ -69,6 +81,7 @@ const LIBRARY_VERSION_KNOWN = 1;
69
81
  * @property {LibraryBands} bands
70
82
  * @property {LibraryBlueprintEntry[]} blueprints
71
83
  * @property {string} [notes]
84
+ * @property {LibraryIssuesField} [issues]
72
85
  * @property {string} root absolute path to the library root
73
86
  */
74
87
 
@@ -128,6 +141,7 @@ export async function loadLibrary(libraryRoot, opts = {}) {
128
141
  bands: normaliseBands(doc.bands),
129
142
  blueprints: doc.blueprints.map((b) => ({ slug: b.slug, path: b.path })),
130
143
  ...(typeof doc.notes === 'string' ? { notes: doc.notes } : {}),
144
+ ...(doc.issues ? { issues: normaliseIssues(doc.issues) } : {}),
131
145
  root,
132
146
  };
133
147
 
@@ -203,9 +217,43 @@ function validateManifestShape(doc, metaPath) {
203
217
  if (doc.notes !== undefined && typeof doc.notes !== 'string') {
204
218
  return rcfError({ kind: 'validation', message: 'library.json: notes must be a string when present', filePath: metaPath });
205
219
  }
220
+ if (doc.issues !== undefined) {
221
+ const err = validateIssuesField(doc.issues, metaPath);
222
+ if (err) return err;
223
+ }
206
224
  return null;
207
225
  }
208
226
 
227
+ /**
228
+ * Validate the optional `issues` object (design 3.3, AC-15801-1). Refuses
229
+ * a present-but-shapeless value so a typo does not silently disable
230
+ * feedback routing. `repo` accepts `OWNER/REPO` on github.com and a
231
+ * host-qualified `HOST/OWNER/REPO` for GHES; `visibility` is one of
232
+ * `public` or `private`.
233
+ */
234
+ function validateIssuesField(issues, metaPath) {
235
+ if (typeof issues !== 'object' || issues === null || Array.isArray(issues)) {
236
+ return rcfError({ kind: 'validation', message: 'library.json: issues must be an object with { repo, visibility } when present', filePath: metaPath });
237
+ }
238
+ if (typeof issues.repo !== 'string' || issues.repo.length === 0) {
239
+ return rcfError({ kind: 'validation', message: 'library.json: issues.repo is required (OWNER/REPO or HOST/OWNER/REPO)', filePath: metaPath });
240
+ }
241
+ if (!/^([A-Za-z0-9.-]+\/)?[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/.test(issues.repo)) {
242
+ return rcfError({ kind: 'validation', message: `library.json: issues.repo '${issues.repo}' must be OWNER/REPO on github.com or HOST/OWNER/REPO for GHES`, filePath: metaPath });
243
+ }
244
+ if (issues.visibility !== undefined && issues.visibility !== 'public' && issues.visibility !== 'private') {
245
+ return rcfError({ kind: 'validation', message: `library.json: issues.visibility '${issues.visibility}' must be 'public' or 'private' when present`, filePath: metaPath });
246
+ }
247
+ return null;
248
+ }
249
+
250
+ function normaliseIssues(issues) {
251
+ return {
252
+ repo: issues.repo,
253
+ visibility: issues.visibility === 'private' ? 'private' : 'public',
254
+ };
255
+ }
256
+
209
257
  function validateBands(bands, metaPath) {
210
258
  if (typeof bands !== 'object' || bands === null) {
211
259
  return rcfError({ kind: 'validation', message: 'library.json: bands object is required', filePath: metaPath });
@@ -47,6 +47,8 @@ const CORE_BAND_RESERVATIONS_PATH = join(here, '..', '..', 'data', 'core-band-re
47
47
  * @property {'operator'} reviewedBy
48
48
  * @property {{ tier: 'local' | 'git' | 'tarball', shaVerifiedAt?: string, tarballSha256?: string }} provenance
49
49
  * @property {string} cachePath
50
+ * @property {string} [issuesRepo] OWNER/REPO from the library's issues field (design 3.3, ADR-4104)
51
+ * @property {'public' | 'private'} [issuesVisibility] library-declared visibility, advisory
50
52
  */
51
53
 
52
54
  /**
@@ -336,6 +338,17 @@ function validateRegistryShape(doc, path) {
336
338
  if (entry.sourceKind === 'local' && entry.resolvedSha !== undefined) {
337
339
  return rcfError({ kind: 'validation', message: `library registry: libraries[${i}] sourceKind=local must not carry a resolvedSha`, filePath: path });
338
340
  }
341
+ if (entry.issuesRepo !== undefined) {
342
+ if (typeof entry.issuesRepo !== 'string' || entry.issuesRepo.length === 0) {
343
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].issuesRepo must be a non-empty string when present`, filePath: path });
344
+ }
345
+ if (!/^([A-Za-z0-9.-]+\/)?[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/.test(entry.issuesRepo)) {
346
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].issuesRepo '${entry.issuesRepo}' must be OWNER/REPO on github.com or HOST/OWNER/REPO for GHES`, filePath: path });
347
+ }
348
+ }
349
+ if (entry.issuesVisibility !== undefined && entry.issuesVisibility !== 'public' && entry.issuesVisibility !== 'private') {
350
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].issuesVisibility '${entry.issuesVisibility}' must be 'public' or 'private' when present`, filePath: path });
351
+ }
339
352
  }
340
353
  return null;
341
354
  }
@@ -139,20 +139,15 @@ export async function runProbePacksForFbs({
139
139
  checkAppliesDetail = `appliesTo threw: ${err.message}`;
140
140
  }
141
141
  if (!checkApplicable) {
142
- // Spec section 5.5 says the residual cure records
143
- // applicable: false at the check level. rcf-schemas 0.6.1
144
- // (browserVerificationProbePackCheck) closes the schema and
145
- // still requires a verdict enum, so the manifest write path
146
- // refuses a check that carries `applicable: false` alone.
147
- // Until the schema minor promotes an `applicable` field at
148
- // the check level (follow-up rcf-schemas bump), emit
149
- // `verdict: 'skipped'` with a detail naming the applicability
150
- // gate. Semantically the aggregate verdict still treats this
151
- // as neither pass nor fail (skipped does not raise `highest`).
142
+ // Spec section 5.5 residual cure: record `applicable: false`
143
+ // at the check level so the aggregate verdict treats the
144
+ // check as neither pass nor fail. rcf-schemas 0.6.3 added
145
+ // the optional `applicable` boolean on
146
+ // browserVerificationProbePackCheck, and its if/then guard
147
+ // omits `verdict`/`severity` when `applicable: false`.
152
148
  checkRecords.push({
153
149
  id: check.id,
154
- verdict: 'skipped',
155
- severity: check.severity,
150
+ applicable: false,
156
151
  detail: checkAppliesDetail ?? 'check appliesTo returned false (required capability not applied)',
157
152
  });
158
153
  continue;
package/src/build/mark.js CHANGED
@@ -86,7 +86,7 @@ export function planMark(tree, { fbsId, status }) {
86
86
  refused: true,
87
87
  message: `build: refusing --mark verified on ${fbsId}; 'verified' is written only by the `
88
88
  + `independent verify gate, not by --mark. Promote it with: rcf build finalise ${fbsId} --url <deploy-url>. `
89
- + `For a deliberate manual override (no verify run) use: rcf define update ${fbsId} --set executionStatus=verified`,
89
+ + `For a deliberate manual override (no verify run) use: rcf define update ${fbsId} --set executionStatus=verified --acknowledge-verified-override`,
90
90
  };
91
91
  }
92
92
  const fromIndex = LIFECYCLE.indexOf(from);