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
@@ -7,14 +7,20 @@
7
7
  // Landing shape mirrors ship-without-verified: an optional
8
8
  // `shipWithoutEval[]` array on the manifest, with monotonic ids
9
9
  // `swe-<fbsId>-<n>`, the operator's reason string, the declared AC
10
- // verdicts, the report path, and an ISO timestamp. rcf-schemas 0.6.0
11
- // does not yet declare this field on the manifest schema; consumers
12
- // treat its absence as "no acks" and its presence as data.
10
+ // verdicts, the report path, and an ISO timestamp.
11
+ //
12
+ // Referee-guarantee train (REQ-165, docs claim C-33): rcf-schemas 0.6.3
13
+ // declares the field on the manifest schema, so the write path validates
14
+ // the composed manifest before writing it (mirrors the sister
15
+ // ship-without-verified writer's discipline). The docs sentence
16
+ // "--ship-without-eval records its acknowledgement as a valid manifest
17
+ // field" holds against the shipped pin.
13
18
 
14
19
  import { mkdir, rename, unlink, writeFile } from 'node:fs/promises';
15
20
  import { dirname, join } from 'node:path';
16
21
 
17
22
  import { rcfError } from '#core/errors';
23
+ import { validateDocument } from '#core/store';
18
24
 
19
25
  /**
20
26
  * @typedef {object} ShipWithoutEvalDeclaredAc
@@ -84,9 +90,11 @@ export function composeShipWithoutEvalRecord({
84
90
 
85
91
  /**
86
92
  * Persist a ship-without-eval acknowledgement onto the manifest.
87
- * Manifest write is atomic (tmp + rename). rcf-schemas 0.6.0's manifest
88
- * schema does not declare this field, so the write path skips the
89
- * validator (spec section 9: extensions land at a later minor).
93
+ * Reads `tree.manifest` for the current state, appends the composed
94
+ * record to `manifest.shipWithoutEval[]`, validates the composed
95
+ * manifest against the rcf-schemas 0.6.3 schema, and writes it
96
+ * atomically. On validation failure the on-disk manifest is untouched
97
+ * (mirrors the sister ship-without-verified writer's discipline).
90
98
  *
91
99
  * @param {object} args
92
100
  * @param {string} args.projectRoot
@@ -100,6 +108,10 @@ export async function writeShipWithoutEvalRecord({ projectRoot, tree, record })
100
108
  const existing = Array.isArray(nextManifest.shipWithoutEval) ? nextManifest.shipWithoutEval : [];
101
109
  nextManifest.shipWithoutEval = [...existing, record];
102
110
 
111
+ const relPath = 'rcf/manifest.json';
112
+ const validation = validateDocument({ doc: nextManifest, kind: 'manifest', filePath: relPath });
113
+ if (validation) return validation;
114
+
103
115
  const absPath = join(projectRoot, 'rcf', 'manifest.json');
104
116
  try {
105
117
  await mkdir(dirname(absPath), { recursive: true });
@@ -115,7 +127,7 @@ export async function writeShipWithoutEvalRecord({ projectRoot, tree, record })
115
127
  return rcfError({
116
128
  kind: 'ioFailure',
117
129
  message: `finalise: ship-without-eval manifest write failed: ${err.message}`,
118
- filePath: 'rcf/manifest.json',
130
+ filePath: relPath,
119
131
  stack: err.stack,
120
132
  });
121
133
  }
package/src/mcp/tools.js CHANGED
@@ -477,7 +477,8 @@ const DEFINITIONS = [
477
477
  type: 'object',
478
478
  properties: {
479
479
  scopeId: { type: 'string', description: 'Optional PRD / REQ / US id to scope coverage; below-AC ids are refused' },
480
- strict: { type: 'boolean', description: 'Per-AC-strict mode (every AC needs TC coverage); defaults to false (shallow-any)' },
480
+ mode: { type: 'string', enum: ['strict', 'shallow-any'], description: 'Coverage mode (referee-guarantee train REQ-164): strict (per-AC, default) or shallow-any (any AC covered by any resolving TC = REQ covered).' },
481
+ strict: { type: 'boolean', description: 'Legacy alias for mode; true = strict, false = shallow-any. Kept for backward compatibility. Prefer mode.' },
481
482
  withCode: { type: 'boolean', description: 'Phase 10: layer the code axis onto every AC (implemented-and-covered / implemented-uncovered / unimplemented) plus a codeNodeOrphans list. Informational only - never affects ok or the exit-code twin.' },
482
483
  },
483
484
  additionalProperties: false,
@@ -892,8 +893,13 @@ export function createToolRegistry({ projectRoot, log }) {
892
893
  // Phase 10 (D11): withCode layers the informational code axis on.
893
894
  // w-2026-07-28-005: pointer resolution gates "covered" - same rule
894
895
  // as the CLI, one resolution pass against the working tree.
896
+ // Referee-guarantee train (REQ-164 / US-16401): strict is the
897
+ // shipped default; pass `mode: 'shallow-any'` (or the legacy
898
+ // `strict: false`) to opt out. `strict: true` is honoured as-is
899
+ // for backward-compatible callers that still spell it out.
895
900
  const testPointers = await resolveTestPointers({ projectRoot, tree });
896
- return okResult(computeCoverage(tree, { strict: Boolean(args.strict), scopeId, withCode: Boolean(args.withCode), testPointers }));
901
+ const strict = args.mode === 'shallow-any' ? false : (args.strict === false ? false : true);
902
+ return okResult(computeCoverage(tree, { strict, scopeId, withCode: Boolean(args.withCode), testPointers }));
897
903
  },
898
904
 
899
905
  rcf_trace: async (args) => {
@@ -0,0 +1,397 @@
1
+ // Feedback hook installer (ADR-4108). Slice 5 (FBS-184): rcf init
2
+ // merges three feedback hook entries into the two committed harness
3
+ // config files (`.claude/settings.json`, `.codex/hooks.json`); rcf
4
+ // doctor detects and repairs missing entries, and refuses foreign
5
+ // entries whose command names our binary with the wrong flags.
6
+ //
7
+ // Merge discipline mirrors `writeMcpConfig`:
8
+ // - parse; refuse on invalid JSON with the same message shape;
9
+ // - preserve every other server/hook verbatim;
10
+ // - add our entries only when an entry naming `rcf feedback hook`
11
+ // is absent for that event; otherwise leave the file alone.
12
+ // A caller passing `binPath` gets the pinned-bin shape
13
+ // (`{ command: 'node', args: [binPath, 'feedback', 'hook', ...] }`),
14
+ // mirroring the `.mcp.json` entry pattern; the default is the
15
+ // portable `npx rcf-lite feedback hook <event>` shape.
16
+
17
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
18
+ import { dirname, join } from 'node:path';
19
+
20
+ import { rcfError } from '#core/errors';
21
+
22
+ /**
23
+ * Command-substring marker used across the estate to identify our
24
+ * hook commands. Matches both shapes we ship:
25
+ * - `npx rcf-lite feedback hook <event> --harness ...`
26
+ * - `node <binPath> feedback hook <event> --harness ...`
27
+ * so a foreign-shape entry that names our verbs is still detected as
28
+ * ours (and reported as foreign-hook) rather than treated as an
29
+ * unrelated command.
30
+ */
31
+ export const FEEDBACK_HOOK_COMMAND_MARKER = 'feedback hook';
32
+
33
+ /** Events the installer owns (per design 3.5). */
34
+ export const FEEDBACK_HOOK_EVENTS = /** @type {const} */ ([
35
+ { event: 'Stop', subVerb: 'stop', timeout: 10, matcher: null, codexEvent: 'Stop' },
36
+ { event: 'SessionEnd', subVerb: 'session-end', timeout: 5, matcher: null, codexEvent: 'SessionEnd' },
37
+ { event: 'SessionStart', subVerb: 'session-start', timeout: 5, matcher: 'startup|resume', codexEvent: 'SessionStart' },
38
+ ]);
39
+
40
+ /**
41
+ * Build the Claude Code hook command string for one event.
42
+ *
43
+ * @param {string} subVerb
44
+ * @param {'claude-code' | 'codex'} harness
45
+ * @param {string | undefined} binPath
46
+ * @returns {string}
47
+ */
48
+ function buildCommand(subVerb, harness, binPath) {
49
+ const args = ['feedback', 'hook', subVerb, '--harness', harness];
50
+ if (typeof binPath === 'string' && binPath.length > 0) {
51
+ return `node ${binPath} ${args.join(' ')}`;
52
+ }
53
+ return `npx rcf-lite ${args.join(' ')}`;
54
+ }
55
+
56
+ /**
57
+ * Build the Claude Code hook entry a `.claude/settings.json` file
58
+ * carries for one event. Matches the shape Claude Code writes to a
59
+ * user-scope file via `/hooks add`: hooks arrays keyed by event,
60
+ * each element `{ matcher?, hooks: [{ type: 'command', command,
61
+ * timeout }] }`.
62
+ *
63
+ * @param {typeof FEEDBACK_HOOK_EVENTS[number]} spec
64
+ * @param {string | undefined} binPath
65
+ */
66
+ export function claudeHookEntry(spec, binPath) {
67
+ const command = buildCommand(spec.subVerb, 'claude-code', binPath);
68
+ const inner = {
69
+ hooks: [
70
+ { type: 'command', command, timeout: spec.timeout },
71
+ ],
72
+ };
73
+ if (spec.matcher) inner.matcher = spec.matcher;
74
+ return inner;
75
+ }
76
+
77
+ /**
78
+ * Build the Codex hook entry a `.codex/hooks.json` file carries for
79
+ * one event. Codex's schema (0.153.4+) keys hooks by event name and
80
+ * takes an array of `{ command, timeout? }` shell entries; we mirror
81
+ * that shape so a Codex `hooks list` shows one entry per event.
82
+ *
83
+ * @param {typeof FEEDBACK_HOOK_EVENTS[number]} spec
84
+ * @param {string | undefined} binPath
85
+ */
86
+ export function codexHookEntry(spec, binPath) {
87
+ const command = buildCommand(spec.subVerb, 'codex', binPath);
88
+ return { command, timeout: spec.timeout };
89
+ }
90
+
91
+ /**
92
+ * Merge the three feedback hook entries into a parsed Claude Code
93
+ * settings object; returns `{ next, added, foreign, kept }`. Pure
94
+ * over the input; the caller writes if `added.length > 0` or a
95
+ * `foreign` list on a settings file with no gating drift.
96
+ *
97
+ * @param {object | null} current
98
+ * @param {string | undefined} binPath
99
+ */
100
+ export function mergeClaudeSettings(current, binPath) {
101
+ const base = current && typeof current === 'object' && !Array.isArray(current)
102
+ ? { ...current }
103
+ : {};
104
+ const hooks = base.hooks && typeof base.hooks === 'object' && !Array.isArray(base.hooks)
105
+ ? { ...base.hooks }
106
+ : {};
107
+ const added = [];
108
+ const foreign = [];
109
+ const kept = [];
110
+ for (const spec of FEEDBACK_HOOK_EVENTS) {
111
+ const bucketRaw = hooks[spec.event];
112
+ const bucket = Array.isArray(bucketRaw) ? bucketRaw.slice() : [];
113
+ const ours = bucket.filter((entry) => entryClaudeIsOurs(entry));
114
+ const expectedCommand = buildCommand(spec.subVerb, 'claude-code', binPath);
115
+ if (ours.length === 0) {
116
+ bucket.push(claudeHookEntry(spec, binPath));
117
+ hooks[spec.event] = bucket;
118
+ added.push(spec.event);
119
+ continue;
120
+ }
121
+ // Foreign detection: an entry that names our marker but whose
122
+ // command string (or timeout, or matcher for SessionStart) differs
123
+ // from the current install shape.
124
+ const drift = ours.filter((entry) => !entryClaudeMatches(entry, spec, expectedCommand));
125
+ if (drift.length > 0) {
126
+ for (const d of drift) {
127
+ foreign.push({ event: spec.event, command: firstClaudeCommand(d) ?? '(unknown)' });
128
+ }
129
+ } else {
130
+ kept.push(spec.event);
131
+ }
132
+ hooks[spec.event] = bucket;
133
+ }
134
+ return { next: { ...base, hooks }, added, foreign, kept };
135
+ }
136
+
137
+ /**
138
+ * Merge the three feedback hook entries into a parsed Codex hooks
139
+ * object; returns `{ next, added, foreign, kept }`. Pure over the
140
+ * input, same discipline as `mergeClaudeSettings`.
141
+ *
142
+ * @param {object | null} current
143
+ * @param {string | undefined} binPath
144
+ */
145
+ export function mergeCodexHooks(current, binPath) {
146
+ const base = current && typeof current === 'object' && !Array.isArray(current)
147
+ ? { ...current }
148
+ : {};
149
+ const hooks = base.hooks && typeof base.hooks === 'object' && !Array.isArray(base.hooks)
150
+ ? { ...base.hooks }
151
+ : {};
152
+ const added = [];
153
+ const foreign = [];
154
+ const kept = [];
155
+ for (const spec of FEEDBACK_HOOK_EVENTS) {
156
+ const bucketRaw = hooks[spec.codexEvent];
157
+ const bucket = Array.isArray(bucketRaw) ? bucketRaw.slice() : [];
158
+ const ours = bucket.filter((entry) => entryCodexIsOurs(entry));
159
+ const expectedCommand = buildCommand(spec.subVerb, 'codex', binPath);
160
+ if (ours.length === 0) {
161
+ bucket.push(codexHookEntry(spec, binPath));
162
+ hooks[spec.codexEvent] = bucket;
163
+ added.push(spec.codexEvent);
164
+ continue;
165
+ }
166
+ const drift = ours.filter((entry) => !entryCodexMatches(entry, spec, expectedCommand));
167
+ if (drift.length > 0) {
168
+ for (const d of drift) {
169
+ foreign.push({ event: spec.codexEvent, command: d?.command ?? '(unknown)' });
170
+ }
171
+ } else {
172
+ kept.push(spec.codexEvent);
173
+ }
174
+ hooks[spec.codexEvent] = bucket;
175
+ }
176
+ return { next: { ...base, hooks }, added, foreign, kept };
177
+ }
178
+
179
+ function entryClaudeIsOurs(entry) {
180
+ const hooks = Array.isArray(entry?.hooks) ? entry.hooks : [];
181
+ return hooks.some((h) => typeof h?.command === 'string' && h.command.includes(FEEDBACK_HOOK_COMMAND_MARKER));
182
+ }
183
+
184
+ function firstClaudeCommand(entry) {
185
+ const hooks = Array.isArray(entry?.hooks) ? entry.hooks : [];
186
+ const hit = hooks.find((h) => typeof h?.command === 'string' && h.command.includes(FEEDBACK_HOOK_COMMAND_MARKER));
187
+ return hit?.command;
188
+ }
189
+
190
+ function entryClaudeMatches(entry, spec, expectedCommand) {
191
+ const hooks = Array.isArray(entry?.hooks) ? entry.hooks : [];
192
+ // Compare matcher through a null-normalising cast: both spec and
193
+ // entry may express the absence of a matcher as either null or
194
+ // undefined (the former is deliberate on our specs; the latter is
195
+ // what JSON round-trip drops).
196
+ const specMatcher = spec.matcher ?? null;
197
+ const entryMatcher = entry?.matcher ?? null;
198
+ if (specMatcher !== entryMatcher) return false;
199
+ const ourHooks = hooks.filter((h) => typeof h?.command === 'string' && h.command.includes(FEEDBACK_HOOK_COMMAND_MARKER));
200
+ if (ourHooks.length !== 1) return false;
201
+ const h = ourHooks[0];
202
+ if (h.type !== 'command') return false;
203
+ if (h.command !== expectedCommand) return false;
204
+ if (h.timeout !== spec.timeout) return false;
205
+ return true;
206
+ }
207
+
208
+ function entryCodexIsOurs(entry) {
209
+ return typeof entry?.command === 'string' && entry.command.includes(FEEDBACK_HOOK_COMMAND_MARKER);
210
+ }
211
+
212
+ function entryCodexMatches(entry, spec, expectedCommand) {
213
+ if (entry?.command !== expectedCommand) return false;
214
+ if (entry?.timeout !== spec.timeout) return false;
215
+ return true;
216
+ }
217
+
218
+ /**
219
+ * Write / merge `.claude/settings.json` with the three feedback hook
220
+ * entries. Returns an action summary the caller renders (or an
221
+ * rcfError on invalid JSON, mirroring `writeMcpConfig`).
222
+ *
223
+ * @param {object} args
224
+ * @param {string} args.projectRoot
225
+ * @param {string} [args.binPath]
226
+ */
227
+ export async function writeClaudeFeedbackHooks({ projectRoot, binPath } = {}) {
228
+ const file = join(projectRoot, '.claude', 'settings.json');
229
+ const raw = await readIfExists(file);
230
+ let current = null;
231
+ let existed = raw !== null;
232
+ if (existed) {
233
+ try {
234
+ current = JSON.parse(raw);
235
+ } catch (err) {
236
+ return rcfError({
237
+ kind: 'parseFailure',
238
+ message: `.claude/settings.json exists but is not valid JSON (${err.message}); refusing to modify it. Fix it by hand, or add the feedback hook entries manually - see docs/feedback.md, section 'Slice 5 hooks'.`,
239
+ filePath: '.claude/settings.json',
240
+ });
241
+ }
242
+ if (current === null || typeof current !== 'object' || Array.isArray(current)) {
243
+ return rcfError({
244
+ kind: 'parseFailure',
245
+ message: '.claude/settings.json exists but is not a JSON object; refusing to modify it.',
246
+ filePath: '.claude/settings.json',
247
+ });
248
+ }
249
+ }
250
+ const merge = mergeClaudeSettings(current, binPath);
251
+ if (merge.foreign.length > 0) {
252
+ return {
253
+ file: '.claude/settings.json',
254
+ action: 'foreign',
255
+ foreign: merge.foreign,
256
+ added: [],
257
+ };
258
+ }
259
+ if (merge.added.length === 0) {
260
+ return {
261
+ file: '.claude/settings.json',
262
+ action: 'kept',
263
+ added: [],
264
+ foreign: [],
265
+ };
266
+ }
267
+ await mkdir(dirname(file), { recursive: true });
268
+ await writeFile(file, `${JSON.stringify(merge.next, null, 2)}\n`, 'utf8');
269
+ return {
270
+ file: '.claude/settings.json',
271
+ action: existed ? 'merged' : 'created',
272
+ added: merge.added,
273
+ foreign: [],
274
+ };
275
+ }
276
+
277
+ /**
278
+ * Write / merge `.codex/hooks.json` with the three feedback hook
279
+ * entries. Same discipline as `writeClaudeFeedbackHooks`.
280
+ *
281
+ * @param {object} args
282
+ * @param {string} args.projectRoot
283
+ * @param {string} [args.binPath]
284
+ */
285
+ export async function writeCodexFeedbackHooks({ projectRoot, binPath } = {}) {
286
+ const file = join(projectRoot, '.codex', 'hooks.json');
287
+ const raw = await readIfExists(file);
288
+ let current = null;
289
+ let existed = raw !== null;
290
+ if (existed) {
291
+ try {
292
+ current = JSON.parse(raw);
293
+ } catch (err) {
294
+ return rcfError({
295
+ kind: 'parseFailure',
296
+ message: `.codex/hooks.json exists but is not valid JSON (${err.message}); refusing to modify it. Fix it by hand, or add the feedback hook entries manually - see docs/feedback.md, section 'Slice 5 hooks'.`,
297
+ filePath: '.codex/hooks.json',
298
+ });
299
+ }
300
+ if (current === null || typeof current !== 'object' || Array.isArray(current)) {
301
+ return rcfError({
302
+ kind: 'parseFailure',
303
+ message: '.codex/hooks.json exists but is not a JSON object; refusing to modify it.',
304
+ filePath: '.codex/hooks.json',
305
+ });
306
+ }
307
+ }
308
+ const merge = mergeCodexHooks(current, binPath);
309
+ if (merge.foreign.length > 0) {
310
+ return {
311
+ file: '.codex/hooks.json',
312
+ action: 'foreign',
313
+ foreign: merge.foreign,
314
+ added: [],
315
+ };
316
+ }
317
+ if (merge.added.length === 0) {
318
+ return {
319
+ file: '.codex/hooks.json',
320
+ action: 'kept',
321
+ added: [],
322
+ foreign: [],
323
+ };
324
+ }
325
+ await mkdir(dirname(file), { recursive: true });
326
+ await writeFile(file, `${JSON.stringify(merge.next, null, 2)}\n`, 'utf8');
327
+ return {
328
+ file: '.codex/hooks.json',
329
+ action: existed ? 'merged' : 'created',
330
+ added: merge.added,
331
+ foreign: [],
332
+ };
333
+ }
334
+
335
+ /**
336
+ * Diagnose one Claude Code settings file WITHOUT writing. Returns
337
+ * `{ missing: string[], foreign: Array<{event,command}> }` per event.
338
+ * Doctor consumes this to decide missing-hook (fixable) vs
339
+ * foreign-hook (refused) rows.
340
+ *
341
+ * @param {object} args
342
+ * @param {string} args.projectRoot
343
+ * @param {string} [args.binPath]
344
+ */
345
+ export async function diagnoseClaudeFeedbackHooks({ projectRoot, binPath } = {}) {
346
+ const file = join(projectRoot, '.claude', 'settings.json');
347
+ const raw = await readIfExists(file);
348
+ if (raw === null) {
349
+ return { present: false, missing: FEEDBACK_HOOK_EVENTS.map((s) => s.event), foreign: [] };
350
+ }
351
+ let current;
352
+ try {
353
+ current = JSON.parse(raw);
354
+ } catch (err) {
355
+ return { present: true, parseError: err.message, missing: [], foreign: [] };
356
+ }
357
+ if (current === null || typeof current !== 'object' || Array.isArray(current)) {
358
+ return { present: true, parseError: 'not a JSON object', missing: [], foreign: [] };
359
+ }
360
+ const merge = mergeClaudeSettings(current, binPath);
361
+ return { present: true, missing: merge.added, foreign: merge.foreign };
362
+ }
363
+
364
+ /**
365
+ * Diagnose one Codex hooks file WITHOUT writing.
366
+ *
367
+ * @param {object} args
368
+ * @param {string} args.projectRoot
369
+ * @param {string} [args.binPath]
370
+ */
371
+ export async function diagnoseCodexFeedbackHooks({ projectRoot, binPath } = {}) {
372
+ const file = join(projectRoot, '.codex', 'hooks.json');
373
+ const raw = await readIfExists(file);
374
+ if (raw === null) {
375
+ return { present: false, missing: FEEDBACK_HOOK_EVENTS.map((s) => s.codexEvent), foreign: [] };
376
+ }
377
+ let current;
378
+ try {
379
+ current = JSON.parse(raw);
380
+ } catch (err) {
381
+ return { present: true, parseError: err.message, missing: [], foreign: [] };
382
+ }
383
+ if (current === null || typeof current !== 'object' || Array.isArray(current)) {
384
+ return { present: true, parseError: 'not a JSON object', missing: [], foreign: [] };
385
+ }
386
+ const merge = mergeCodexHooks(current, binPath);
387
+ return { present: true, missing: merge.added, foreign: merge.foreign };
388
+ }
389
+
390
+ async function readIfExists(path) {
391
+ try {
392
+ return await readFile(path, 'utf8');
393
+ } catch (err) {
394
+ if (/** @type {NodeJS.ErrnoException} */ (err).code === 'ENOENT') return null;
395
+ throw err;
396
+ }
397
+ }
@@ -27,6 +27,8 @@ import { identityEntry } from './identity-seed.js';
27
27
  import { preflightEntry } from '../preflight/secrets.js';
28
28
  // Track C+D §9.3: gitignore the view-server pid file and supervisor log.
29
29
  import { viewServerGitignoreEntry, viewServerLogGitignoreEntry } from '../view-supervisor/manifest-writer.js';
30
+ // FBS-180 slice 1: gitignore the local feedback log and outbox.
31
+ import { feedbackGitignoreEntry } from '../feedback/store.js';
30
32
 
31
33
  /**
32
34
  * @typedef {object} GitignoreEntry
@@ -53,6 +55,7 @@ export function managedGitignoreEntries() {
53
55
  preflightEntry,
54
56
  viewServerGitignoreEntry,
55
57
  viewServerLogGitignoreEntry,
58
+ feedbackGitignoreEntry,
56
59
  ];
57
60
  }
58
61
 
@@ -28,12 +28,12 @@ import {
28
28
  import { detailsWrap, escapeHtml } from './doc-renderers/helpers.js';
29
29
  import { allRequirementSubdiagrams } from './mermaid-diagram.js';
30
30
 
31
- // Inline SVG favicon: the Stravica monogram (terracotta rounded-square with
32
- // cream serif S), pinched from stravica.ai/assets/brand/logo-monogram.svg
33
- // so the review surface shares brand identity with the marketing site.
34
- // Delivered as a data URL so no separate file has to ship.
31
+ // Inline SVG favicon: the Stravica kit mark (deep-navy tile with the
32
+ // ribbon symbol in Stravica blue), taken from the estate brand kit at
33
+ // public/brand/assets/icons/favicon.svg so the review surface shares
34
+ // identity with stravica.ai. Delivered as a data URL so no separate file has to ship.
35
35
  const FAVICON_HREF =
36
- "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Crect width='512' height='512' rx='64' fill='%23c14a3a'/%3E%3Ctext x='256' y='370' font-family='Georgia,serif' font-size='360' font-weight='600' text-anchor='middle' fill='%23f7f5f0'%3ES%3C/text%3E%3C/svg%3E";
36
+ "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64' width='64' height='64' role='img'%3E%3Ctitle%3EStravica favicon%3C/title%3E%3Cdesc%3E%3C/desc%3E%3Crect x='0' y='0' width='64' height='64' rx='14' fill='%23080F19'/%3E%3Cg fill='%237295FF'%3E%3Cpath d='M38 9L17 21V32L38 20Z'/%3E%3Cpath d='M30 27L46 36V46L30 37L23 33Z'/%3E%3Cpath d='M46 46L25 58V47L37 40Z'/%3E%3C/g%3E%3C/svg%3E";
37
37
 
38
38
  const LIVE_WRAPPER_OPEN = '<div id="rcf-live-content">';
39
39
  const LIVE_WRAPPER_CLOSE = '</div>';
@@ -99,7 +99,7 @@ header h1 {
99
99
  gap: 0.75rem;
100
100
  }
101
101
 
102
- /* Stravica monogram alongside the project name - shared identity with
102
+ /* Stravica kit mark alongside the project name, shared identity with
103
103
  * the marketing site (stravica.ai). SVG is inlined as a data URL so no
104
104
  * separate asset has to ship. */
105
105
  header h1::before {
@@ -108,7 +108,7 @@ header h1::before {
108
108
  width: 2rem;
109
109
  height: 2rem;
110
110
  flex-shrink: 0;
111
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Crect width='512' height='512' rx='64' fill='%23c14a3a'/%3E%3Ctext x='256' y='370' font-family='Georgia,serif' font-size='360' font-weight='600' text-anchor='middle' fill='%23f7f5f0'%3ES%3C/text%3E%3C/svg%3E");
111
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 136 180' width='136' height='180' role='img'%3E%3Ctitle%3EStravica ribbon symbol%3C/title%3E%3Cdesc%3E%3C/desc%3E%3Cdefs%3E%3ClinearGradient id='ma' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop stop-color='%23174CFF'/%3E%3Cstop offset='1' stop-color='%23263BFF'/%3E%3C/linearGradient%3E%3ClinearGradient id='mb' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop stop-color='%231674FF'/%3E%3Cstop offset='1' stop-color='%232854FF'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg transform='translate(0 0) scale(1.0)'%3E%3Cpath fill='url(%23ma)' d='M86 4 L10 48 Q4 51 4 58 L4 81 Q4 87 10 84 L80 45 Q86 42 86 35 Z'/%3E%3Cpath fill='url(%23ma)' d='M88 108 L129 125 L47 172 Q41 176 41 170 L41 142 Q41 136 47 133 Z'/%3E%3Cpath fill='url(%23mb)' d='M41 84 L74 65 Q78 63 83 66 L124 88 Q130 91 130 98 L130 121 Q130 126 124 123 Z'/%3E%3C/g%3E%3C/svg%3E");
112
112
  background-repeat: no-repeat;
113
113
  background-position: center;
114
114
  background-size: contain;