rcf-lite 0.26.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 (1525) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +10 -0
  3. package/bin/rcf.js +2 -0
  4. package/blueprints/application-account-settings/CHANGELOG.md +64 -2
  5. package/blueprints/application-account-settings/README.md +10 -10
  6. package/blueprints/application-account-settings/blueprint.json +26 -4
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +1 -1
  8. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
  9. package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +5 -5
  10. package/blueprints/application-account-settings/contributions/probes/probe-utils.mjs +177 -0
  11. package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs +67 -0
  12. package/blueprints/application-account-settings/contributions/probes/run-profile-form-autocomplete.mjs +5 -0
  13. package/blueprints/application-account-settings/contributions/probes/run-sessions-adapter-uniform.mjs +5 -0
  14. package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs +5 -0
  15. package/blueprints/application-account-settings/contributions/probes/run-shell-tablist-per-capability.mjs +5 -0
  16. package/blueprints/application-account-settings/contributions/probes/run-theme-radiogroup.mjs +5 -0
  17. package/blueprints/application-account-settings/contributions/probes/sessions-adapter-uniform.mjs +130 -0
  18. package/blueprints/application-account-settings/contributions/probes/sessions-surface-shape.mjs +70 -0
  19. package/blueprints/application-account-settings/contributions/probes/shell-tablist-per-capability.mjs +60 -0
  20. package/blueprints/application-account-settings/contributions/probes/theme-radiogroup.mjs +126 -0
  21. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +6 -2
  22. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +4 -0
  23. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +7 -3
  24. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +4 -0
  25. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +4 -0
  26. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +6 -2
  27. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-007.json +22 -0
  28. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-009.json +21 -0
  29. package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +8 -4
  30. package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +3 -3
  31. package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +13 -7
  32. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +19 -3
  33. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -2
  34. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +13 -2
  35. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +23 -2
  36. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +51 -3
  37. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +25 -6
  38. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +13 -2
  39. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -2
  40. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +4 -2
  41. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +13 -2
  42. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25111.json +71 -0
  43. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25112.json +77 -0
  44. package/blueprints/application-account-settings/docs/topics.md +4 -4
  45. package/blueprints/application-account-settings/guide/application-account-settings.md +1 -1
  46. package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +2 -2
  47. package/blueprints/application-admin-console/CHANGELOG.md +69 -7
  48. package/blueprints/application-admin-console/README.md +4 -4
  49. package/blueprints/application-admin-console/blueprint.json +34 -2
  50. package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +2 -2
  51. package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +5 -5
  52. package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +7 -7
  53. package/blueprints/application-admin-console/contributions/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +3 -3
  54. package/blueprints/application-admin-console/contributions/probes/audit-log-surface.mjs +79 -0
  55. package/blueprints/application-admin-console/contributions/probes/org-switcher-surface.mjs +83 -0
  56. package/blueprints/application-admin-console/contributions/probes/permission-matrix-grid.mjs +67 -0
  57. package/blueprints/application-admin-console/contributions/probes/probe-utils.mjs +177 -0
  58. package/blueprints/application-admin-console/contributions/probes/run-audit-log-surface.mjs +5 -0
  59. package/blueprints/application-admin-console/contributions/probes/run-org-switcher-surface.mjs +5 -0
  60. package/blueprints/application-admin-console/contributions/probes/run-permission-matrix-grid.mjs +5 -0
  61. package/blueprints/application-admin-console/contributions/probes/run-sign-in-access-gated-surface.mjs +5 -0
  62. package/blueprints/application-admin-console/contributions/probes/run-users-directory-surface.mjs +5 -0
  63. package/blueprints/application-admin-console/contributions/probes/sign-in-access-gated-surface.mjs +117 -0
  64. package/blueprints/application-admin-console/contributions/probes/users-directory-surface.mjs +145 -0
  65. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +4 -0
  66. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +5 -1
  67. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +4 -0
  68. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +4 -0
  69. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +6 -2
  70. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +4 -0
  71. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-007.json +22 -0
  72. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-008.json +22 -0
  73. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-009.json +21 -0
  74. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-014.json +6 -2
  75. package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +9 -7
  76. package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +6 -6
  77. package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +1 -1
  78. package/blueprints/application-admin-console/contributions/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +5 -5
  79. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +4 -2
  80. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +4 -2
  81. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +10 -4
  82. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +13 -2
  83. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +15 -3
  84. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +35 -2
  85. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +22 -3
  86. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +4 -2
  87. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +4 -2
  88. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21110.json +68 -0
  89. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21111.json +76 -0
  90. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21112.json +77 -0
  91. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21815.json +21 -2
  92. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21816.json +21 -2
  93. package/blueprints/application-admin-console/guide/application-admin-console.md +3 -3
  94. package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +2 -2
  95. package/blueprints/application-api-rest/CHANGELOG.md +34 -0
  96. package/blueprints/application-api-rest/README.md +3 -3
  97. package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +2 -0
  98. package/blueprints/application-api-rest/blueprint.json +3 -2
  99. package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +1 -1
  100. package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +2 -2
  101. package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +1 -1
  102. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +1 -1
  103. package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +1 -1
  104. package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +3 -3
  105. package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +1 -1
  106. package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +1 -1
  107. package/blueprints/application-api-rest/contributions/probes/cursor-pagination-round-trip.mjs +154 -0
  108. package/blueprints/application-api-rest/contributions/probes/health-probes-distinct.mjs +124 -0
  109. package/blueprints/application-api-rest/contributions/probes/probe-utils.mjs +177 -0
  110. package/blueprints/application-api-rest/contributions/probes/problem-details-on-error.mjs +77 -0
  111. package/blueprints/application-api-rest/contributions/probes/request-id-echoed.mjs +76 -0
  112. package/blueprints/application-api-rest/contributions/probes/run-cursor-pagination-round-trip.mjs +5 -0
  113. package/blueprints/application-api-rest/contributions/probes/run-health-probes-distinct.mjs +5 -0
  114. package/blueprints/application-api-rest/contributions/probes/run-problem-details-on-error.mjs +5 -0
  115. package/blueprints/application-api-rest/contributions/probes/run-request-id-echoed.mjs +5 -0
  116. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +6 -2
  117. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +7 -3
  118. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +6 -2
  119. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +6 -2
  120. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +6 -2
  121. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +6 -2
  122. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +6 -2
  123. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +6 -2
  124. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +6 -2
  125. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +8 -4
  126. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +6 -2
  127. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +6 -2
  128. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +7 -3
  129. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +6 -2
  130. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +6 -2
  131. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +6 -2
  132. package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +1 -1
  133. package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +1 -1
  134. package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +2 -2
  135. package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +1 -1
  136. package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +1 -1
  137. package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +1 -1
  138. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +13 -7
  139. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +27 -13
  140. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +18 -9
  141. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +32 -10
  142. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +19 -6
  143. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +14 -8
  144. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +20 -12
  145. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +37 -15
  146. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +15 -9
  147. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +21 -11
  148. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +42 -8
  149. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +23 -13
  150. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +17 -11
  151. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +13 -8
  152. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +13 -8
  153. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +11 -6
  154. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +19 -14
  155. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +20 -10
  156. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +20 -7
  157. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +16 -10
  158. package/blueprints/application-api-rest/docs/topics.md +1 -1
  159. package/blueprints/application-charts/CHANGELOG.md +53 -6
  160. package/blueprints/application-charts/README.md +10 -10
  161. package/blueprints/application-charts/blueprint.json +115 -19
  162. package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +2 -2
  163. package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +1 -1
  164. package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +1 -1
  165. package/blueprints/application-charts/contributions/probes/keyboard-traversal.mjs +151 -0
  166. package/blueprints/application-charts/contributions/probes/non-colour-distinction.mjs +67 -0
  167. package/blueprints/application-charts/contributions/probes/probe-utils.mjs +177 -0
  168. package/blueprints/application-charts/contributions/probes/run-keyboard-traversal.mjs +5 -0
  169. package/blueprints/application-charts/contributions/probes/run-non-colour-distinction.mjs +5 -0
  170. package/blueprints/application-charts/contributions/probes/run-text-alternative-table.mjs +5 -0
  171. package/blueprints/application-charts/contributions/probes/text-alternative-table.mjs +139 -0
  172. package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +11 -4
  173. package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +11 -4
  174. package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +10 -3
  175. package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +10 -3
  176. package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +3 -2
  177. package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +1 -1
  178. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +52 -8
  179. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +58 -6
  180. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +54 -6
  181. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +55 -6
  182. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +64 -8
  183. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +45 -7
  184. package/blueprints/application-charts/docs/topics.md +2 -2
  185. package/blueprints/application-charts/guide/application-charts.md +3 -3
  186. package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +2 -2
  187. package/blueprints/application-dashboard/CHANGELOG.md +39 -8
  188. package/blueprints/application-dashboard/README.md +13 -13
  189. package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
  190. package/blueprints/application-dashboard/blueprint.json +149 -22
  191. package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +4 -4
  192. package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +2 -2
  193. package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +1 -1
  194. package/blueprints/application-dashboard/contributions/probes/export-handle-formats.mjs +75 -0
  195. package/blueprints/application-dashboard/contributions/probes/four-tile-states.mjs +75 -0
  196. package/blueprints/application-dashboard/contributions/probes/primary-kpi-top-left.mjs +58 -0
  197. package/blueprints/application-dashboard/contributions/probes/probe-utils.mjs +177 -0
  198. package/blueprints/application-dashboard/contributions/probes/run-export-handle-formats.mjs +4 -0
  199. package/blueprints/application-dashboard/contributions/probes/run-four-tile-states.mjs +4 -0
  200. package/blueprints/application-dashboard/contributions/probes/run-primary-kpi-top-left.mjs +4 -0
  201. package/blueprints/application-dashboard/contributions/probes/run-shell-five-regions.mjs +4 -0
  202. package/blueprints/application-dashboard/contributions/probes/shell-five-regions.mjs +93 -0
  203. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +10 -3
  204. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +11 -4
  205. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +11 -4
  206. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +11 -4
  207. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +11 -4
  208. package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +1 -1
  209. package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +2 -2
  210. package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +3 -3
  211. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +55 -7
  212. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +56 -8
  213. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +59 -7
  214. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +55 -7
  215. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +55 -7
  216. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +60 -8
  217. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +57 -9
  218. package/blueprints/application-dashboard/docs/topics.md +3 -3
  219. package/blueprints/application-dashboard/guide/application-dashboard.md +5 -5
  220. package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +4 -4
  221. package/blueprints/application-datatable/CHANGELOG.md +36 -5
  222. package/blueprints/application-datatable/README.md +4 -4
  223. package/blueprints/application-datatable/blueprint.json +169 -26
  224. package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +1 -1
  225. package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +1 -1
  226. package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +1 -1
  227. package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +1 -1
  228. package/blueprints/application-datatable/contributions/probes/apg-table-shape.mjs +57 -0
  229. package/blueprints/application-datatable/contributions/probes/four-states-regions.mjs +80 -0
  230. package/blueprints/application-datatable/contributions/probes/probe-utils.mjs +177 -0
  231. package/blueprints/application-datatable/contributions/probes/run-apg-table-shape.mjs +4 -0
  232. package/blueprints/application-datatable/contributions/probes/run-four-states-regions.mjs +4 -0
  233. package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs +4 -0
  234. package/blueprints/application-datatable/contributions/probes/run-sort-adapter-round-trip.mjs +4 -0
  235. package/blueprints/application-datatable/contributions/probes/search-adapter-round-trip.mjs +58 -0
  236. package/blueprints/application-datatable/contributions/probes/sort-adapter-round-trip.mjs +60 -0
  237. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +11 -4
  238. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +11 -4
  239. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +10 -3
  240. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +11 -4
  241. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +10 -3
  242. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +11 -4
  243. package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +1 -1
  244. package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +1 -1
  245. package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +2 -2
  246. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +29 -7
  247. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +29 -7
  248. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +28 -6
  249. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +65 -7
  250. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +32 -7
  251. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +60 -7
  252. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +72 -7
  253. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +59 -9
  254. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +58 -9
  255. package/blueprints/application-datatable/docs/topics.md +1 -1
  256. package/blueprints/application-datatable/guide/application-datatable.md +1 -1
  257. package/blueprints/application-empty-error-states/CHANGELOG.md +64 -4
  258. package/blueprints/application-empty-error-states/README.md +3 -3
  259. package/blueprints/application-empty-error-states/blueprint.json +38 -2
  260. package/blueprints/application-empty-error-states/contributions/probes/empty-list-and-no-search.mjs +66 -0
  261. package/blueprints/application-empty-error-states/contributions/probes/error-boundary-alert.mjs +65 -0
  262. package/blueprints/application-empty-error-states/contributions/probes/forbidden-and-server-error.mjs +167 -0
  263. package/blueprints/application-empty-error-states/contributions/probes/not-found-and-recovery.mjs +61 -0
  264. package/blueprints/application-empty-error-states/contributions/probes/permission-denied-and-offline.mjs +155 -0
  265. package/blueprints/application-empty-error-states/contributions/probes/probe-utils.mjs +177 -0
  266. package/blueprints/application-empty-error-states/contributions/probes/run-empty-list-and-no-search.mjs +5 -0
  267. package/blueprints/application-empty-error-states/contributions/probes/run-error-boundary-alert.mjs +5 -0
  268. package/blueprints/application-empty-error-states/contributions/probes/run-forbidden-and-server-error.mjs +5 -0
  269. package/blueprints/application-empty-error-states/contributions/probes/run-not-found-and-recovery.mjs +5 -0
  270. package/blueprints/application-empty-error-states/contributions/probes/run-permission-denied-and-offline.mjs +5 -0
  271. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +4 -0
  272. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +7 -3
  273. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +4 -0
  274. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +6 -2
  275. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +7 -3
  276. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-006.json +21 -0
  277. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-007.json +21 -0
  278. package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +7 -4
  279. package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +3 -2
  280. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +17 -2
  281. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +31 -2
  282. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +27 -2
  283. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +13 -2
  284. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +33 -2
  285. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +13 -2
  286. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +23 -2
  287. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +27 -2
  288. package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +93 -9
  289. package/blueprints/application-error-handling/CHANGELOG.md +56 -0
  290. package/blueprints/application-error-handling/blueprint.json +106 -20
  291. package/blueprints/application-error-handling/contributions/adrs/adr-1701-application-error-handling-record-shape.json +1 -1
  292. package/blueprints/application-error-handling/contributions/adrs/adr-1702-application-error-handling-classification-vocabulary.json +1 -1
  293. package/blueprints/application-error-handling/contributions/adrs/adr-1703-application-error-handling-transport-mapping.json +1 -1
  294. package/blueprints/application-error-handling/contributions/probes/category-vocabulary.mjs +90 -0
  295. package/blueprints/application-error-handling/contributions/probes/probe-utils.mjs +177 -0
  296. package/blueprints/application-error-handling/contributions/probes/record-shape-adr-1701.mjs +78 -0
  297. package/blueprints/application-error-handling/contributions/probes/run-category-vocabulary.mjs +5 -0
  298. package/blueprints/application-error-handling/contributions/probes/run-record-shape-adr-1701.mjs +5 -0
  299. package/blueprints/application-error-handling/contributions/probes/run-two-boundaries-registered.mjs +5 -0
  300. package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs +343 -0
  301. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-001.json +10 -3
  302. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-002.json +10 -3
  303. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-003.json +10 -3
  304. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-004.json +10 -3
  305. package/blueprints/application-error-handling/contributions/tacs/tac-1701-application-error-handling-boundary.json +1 -1
  306. package/blueprints/application-error-handling/contributions/tacs/tac-1702-application-error-handling-record-factory.json +1 -1
  307. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16101.json +63 -4
  308. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16102.json +49 -4
  309. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16103.json +51 -5
  310. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16104.json +49 -4
  311. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16105.json +49 -4
  312. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16106.json +49 -4
  313. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16107.json +53 -4
  314. package/blueprints/application-file-upload/CHANGELOG.md +60 -5
  315. package/blueprints/application-file-upload/README.md +1 -1
  316. package/blueprints/application-file-upload/blueprint.json +58 -2
  317. package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +3 -3
  318. package/blueprints/application-file-upload/contributions/probes/assertive-completion-slot.mjs +78 -0
  319. package/blueprints/application-file-upload/contributions/probes/chunked-transport-endpoints.mjs +173 -0
  320. package/blueprints/application-file-upload/contributions/probes/per-file-progressbar.mjs +124 -0
  321. package/blueprints/application-file-upload/contributions/probes/probe-utils.mjs +177 -0
  322. package/blueprints/application-file-upload/contributions/probes/run-assertive-completion-slot.mjs +4 -0
  323. package/blueprints/application-file-upload/contributions/probes/run-chunked-transport-endpoints.mjs +4 -0
  324. package/blueprints/application-file-upload/contributions/probes/run-per-file-progressbar.mjs +4 -0
  325. package/blueprints/application-file-upload/contributions/probes/run-upload-surface-shape.mjs +4 -0
  326. package/blueprints/application-file-upload/contributions/probes/upload-surface-shape.mjs +55 -0
  327. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +5 -1
  328. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +8 -4
  329. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +7 -3
  330. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +7 -3
  331. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +5 -1
  332. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-006.json +21 -0
  333. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-007.json +21 -0
  334. package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +4 -2
  335. package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +7 -2
  336. package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +16 -6
  337. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +23 -2
  338. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +29 -4
  339. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +13 -2
  340. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +45 -2
  341. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +37 -2
  342. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +13 -2
  343. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +17 -2
  344. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +14 -5
  345. package/blueprints/application-forms-wizard/CHANGELOG.md +50 -5
  346. package/blueprints/application-forms-wizard/README.md +3 -3
  347. package/blueprints/application-forms-wizard/blueprint.json +59 -2
  348. package/blueprints/application-forms-wizard/contributions/probes/draft-persistence-round-trip.mjs +110 -0
  349. package/blueprints/application-forms-wizard/contributions/probes/probe-utils.mjs +177 -0
  350. package/blueprints/application-forms-wizard/contributions/probes/run-draft-persistence-round-trip.mjs +4 -0
  351. package/blueprints/application-forms-wizard/contributions/probes/run-step-page-shape.mjs +4 -0
  352. package/blueprints/application-forms-wizard/contributions/probes/run-task-list-surface.mjs +4 -0
  353. package/blueprints/application-forms-wizard/contributions/probes/step-page-shape.mjs +61 -0
  354. package/blueprints/application-forms-wizard/contributions/probes/task-list-surface.mjs +109 -0
  355. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +5 -1
  356. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +7 -3
  357. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +7 -3
  358. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +7 -3
  359. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +5 -1
  360. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-006.json +21 -0
  361. package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +6 -4
  362. package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +4 -3
  363. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +35 -2
  364. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +27 -2
  365. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +21 -2
  366. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +13 -2
  367. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +33 -2
  368. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +18 -3
  369. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +23 -2
  370. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +13 -2
  371. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +3 -3
  372. package/blueprints/application-notifications-in-app/CHANGELOG.md +70 -5
  373. package/blueprints/application-notifications-in-app/README.md +9 -9
  374. package/blueprints/application-notifications-in-app/blueprint.json +153 -23
  375. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +1 -1
  376. package/blueprints/application-notifications-in-app/contributions/probes/centre-acknowledge-round-trip.mjs +210 -0
  377. package/blueprints/application-notifications-in-app/contributions/probes/live-region-preseeding.mjs +93 -0
  378. package/blueprints/application-notifications-in-app/contributions/probes/probe-utils.mjs +177 -0
  379. package/blueprints/application-notifications-in-app/contributions/probes/run-centre-acknowledge-round-trip.mjs +5 -0
  380. package/blueprints/application-notifications-in-app/contributions/probes/run-live-region-preseeding.mjs +5 -0
  381. package/blueprints/application-notifications-in-app/contributions/probes/run-toast-contract.mjs +5 -0
  382. package/blueprints/application-notifications-in-app/contributions/probes/toast-contract.mjs +92 -0
  383. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +11 -4
  384. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +8 -1
  385. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +10 -3
  386. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +11 -4
  387. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +12 -5
  388. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-006.json +21 -0
  389. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +3 -3
  390. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +15 -9
  391. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +2 -2
  392. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +30 -6
  393. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +44 -6
  394. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +40 -6
  395. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +31 -5
  396. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +51 -9
  397. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +19 -4
  398. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +19 -4
  399. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +19 -4
  400. package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +4 -4
  401. package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +4 -4
  402. package/blueprints/application-onboarding-tour/CHANGELOG.md +59 -2
  403. package/blueprints/application-onboarding-tour/README.md +3 -3
  404. package/blueprints/application-onboarding-tour/blueprint.json +24 -2
  405. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +4 -4
  406. package/blueprints/application-onboarding-tour/contributions/probes/checklist-anchor-open.mjs +81 -0
  407. package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs +159 -0
  408. package/blueprints/application-onboarding-tour/contributions/probes/first-run-detection.mjs +67 -0
  409. package/blueprints/application-onboarding-tour/contributions/probes/probe-utils.mjs +177 -0
  410. package/blueprints/application-onboarding-tour/contributions/probes/run-checklist-anchor-open.mjs +5 -0
  411. package/blueprints/application-onboarding-tour/contributions/probes/run-completion-persistence.mjs +5 -0
  412. package/blueprints/application-onboarding-tour/contributions/probes/run-first-run-detection.mjs +5 -0
  413. package/blueprints/application-onboarding-tour/contributions/probes/run-stepper-role-dialog.mjs +5 -0
  414. package/blueprints/application-onboarding-tour/contributions/probes/stepper-role-dialog.mjs +45 -0
  415. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +6 -2
  416. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +6 -2
  417. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +4 -0
  418. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +4 -0
  419. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-005.json +22 -0
  420. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-006.json +22 -0
  421. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +2 -1
  422. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +7 -7
  423. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +67 -2
  424. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +35 -2
  425. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +13 -2
  426. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +33 -2
  427. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +13 -2
  428. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +13 -2
  429. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +17 -2
  430. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26108.json +62 -0
  431. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26109.json +72 -0
  432. package/blueprints/application-onboarding-tour/docs/topics.md +2 -2
  433. package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +1 -1
  434. package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +2 -2
  435. package/blueprints/application-spa/CHANGELOG.md +39 -0
  436. package/blueprints/application-spa/README.md +11 -12
  437. package/blueprints/application-spa/blueprint.json +3 -2
  438. package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +1 -1
  439. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +2 -2
  440. package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +1 -1
  441. package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +1 -1
  442. package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +1 -1
  443. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +2 -2
  444. package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +1 -1
  445. package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +1 -1
  446. package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +1 -1
  447. package/blueprints/application-spa/contributions/probes/designed-empty-state.mjs +72 -0
  448. package/blueprints/application-spa/contributions/probes/probe-utils.mjs +177 -0
  449. package/blueprints/application-spa/contributions/probes/route-inventory-published.mjs +185 -0
  450. package/blueprints/application-spa/contributions/probes/run-designed-empty-state.mjs +5 -0
  451. package/blueprints/application-spa/contributions/probes/run-route-inventory-published.mjs +5 -0
  452. package/blueprints/application-spa/contributions/probes/run-shell-nav-present.mjs +5 -0
  453. package/blueprints/application-spa/contributions/probes/shell-nav-present.mjs +69 -0
  454. package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +6 -2
  455. package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +6 -2
  456. package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +6 -2
  457. package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +6 -2
  458. package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +6 -2
  459. package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +6 -2
  460. package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +6 -2
  461. package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +6 -2
  462. package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +7 -3
  463. package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +6 -2
  464. package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +6 -2
  465. package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +6 -2
  466. package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +6 -2
  467. package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +6 -2
  468. package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +6 -2
  469. package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +6 -2
  470. package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +6 -2
  471. package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +7 -3
  472. package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +6 -2
  473. package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +6 -2
  474. package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +6 -2
  475. package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +4 -3
  476. package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +1 -1
  477. package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +1 -1
  478. package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +1 -1
  479. package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +1 -1
  480. package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +1 -1
  481. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +2 -2
  482. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +3 -3
  483. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +4 -4
  484. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +3 -3
  485. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +3 -3
  486. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +22 -8
  487. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +18 -9
  488. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +13 -7
  489. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +15 -10
  490. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +13 -7
  491. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +12 -7
  492. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +25 -6
  493. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +17 -9
  494. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +17 -9
  495. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +19 -10
  496. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +19 -11
  497. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +15 -8
  498. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +15 -8
  499. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +15 -10
  500. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +13 -7
  501. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +15 -9
  502. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +20 -10
  503. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +9 -5
  504. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +11 -6
  505. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +16 -10
  506. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +13 -7
  507. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +13 -7
  508. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +28 -9
  509. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +11 -6
  510. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +14 -8
  511. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +24 -9
  512. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +11 -6
  513. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +11 -7
  514. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +25 -5
  515. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +25 -5
  516. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +19 -9
  517. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +40 -10
  518. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +35 -9
  519. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1134.json +23 -3
  520. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1135.json +19 -3
  521. package/blueprints/application-spa/docs/topics.md +1 -1
  522. package/blueprints/application-spa/guide/application-spa.md +2 -2
  523. package/blueprints/delivery-ci-workflows/CHANGELOG.md +40 -2
  524. package/blueprints/delivery-ci-workflows/README.md +4 -4
  525. package/blueprints/delivery-ci-workflows/blueprint.json +64 -2
  526. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +2 -2
  527. package/blueprints/delivery-ci-workflows/contributions/probes/node-gate-entrypoint.mjs +76 -0
  528. package/blueprints/delivery-ci-workflows/contributions/probes/probe-utils.mjs +56 -0
  529. package/blueprints/delivery-ci-workflows/contributions/probes/real-account-github-actions-run-record.mjs +139 -0
  530. package/blueprints/delivery-ci-workflows/contributions/probes/run-node-gate-entrypoint.mjs +3 -0
  531. package/blueprints/delivery-ci-workflows/contributions/probes/run-real-account-github-actions-run-record.mjs +3 -0
  532. package/blueprints/delivery-ci-workflows/contributions/probes/run-workflow-template-shape.mjs +3 -0
  533. package/blueprints/delivery-ci-workflows/contributions/probes/workflow-template-shape.mjs +94 -0
  534. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +4 -0
  535. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json +4 -0
  536. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json +4 -0
  537. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +5 -1
  538. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json +4 -0
  539. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json +4 -0
  540. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json +4 -0
  541. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json +4 -0
  542. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +4 -0
  543. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json +4 -0
  544. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +6 -2
  545. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +4 -0
  546. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +4 -0
  547. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +4 -0
  548. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +4 -0
  549. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +4 -0
  550. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +4 -0
  551. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +4 -0
  552. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +4 -0
  553. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +4 -0
  554. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +4 -0
  555. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +4 -0
  556. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +4 -0
  557. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +20 -4
  558. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json +19 -3
  559. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json +20 -4
  560. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json +20 -4
  561. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json +20 -4
  562. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json +20 -4
  563. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json +20 -4
  564. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json +20 -4
  565. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +12 -5
  566. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json +21 -5
  567. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +21 -5
  568. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +35 -5
  569. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +21 -5
  570. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +8 -5
  571. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +21 -5
  572. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +19 -3
  573. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +19 -3
  574. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +21 -5
  575. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +19 -3
  576. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +19 -3
  577. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +23 -6
  578. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +24 -7
  579. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +21 -5
  580. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6124.json +19 -3
  581. package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
  582. package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +19 -4
  583. package/blueprints/deploy-cloudflare-workers/README.md +5 -5
  584. package/blueprints/deploy-cloudflare-workers/blueprint.json +4 -4
  585. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +1 -1
  586. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +4 -4
  587. package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +25 -7
  588. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +5 -1
  589. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +6 -2
  590. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +5 -1
  591. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +5 -1
  592. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +5 -1
  593. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +5 -1
  594. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +5 -1
  595. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +5 -1
  596. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +5 -1
  597. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +5 -1
  598. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +5 -1
  599. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +5 -1
  600. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +5 -1
  601. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +7 -3
  602. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +3 -2
  603. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +5 -2
  604. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +21 -9
  605. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +23 -4
  606. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +7 -4
  607. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +7 -4
  608. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +11 -4
  609. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +7 -4
  610. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +7 -4
  611. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +15 -4
  612. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +11 -4
  613. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +7 -4
  614. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +11 -4
  615. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +11 -4
  616. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +41 -3
  617. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +17 -2
  618. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +18 -3
  619. package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
  620. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +7 -2
  621. package/blueprints/deploy-hetzner-server/CHANGELOG.md +115 -8
  622. package/blueprints/deploy-hetzner-server/README.md +12 -12
  623. package/blueprints/deploy-hetzner-server/blueprint.json +8 -7
  624. package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3801-deploy-hetzner-server-cloud-host-contract.json +2 -2
  625. package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json +2 -2
  626. package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +46 -21
  627. package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +344 -83
  628. package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +211 -42
  629. package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +140 -22
  630. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +111 -30
  631. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +158 -30
  632. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +154 -32
  633. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-001.json +6 -2
  634. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-002.json +6 -2
  635. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-003.json +5 -1
  636. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-004.json +5 -1
  637. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-005.json +6 -2
  638. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-006.json +5 -1
  639. package/blueprints/deploy-hetzner-server/contributions/schemas/hetzner-server.schema.json +1 -1
  640. package/blueprints/deploy-hetzner-server/contributions/templates/cloud-init.yaml.tmpl +1 -1
  641. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37101.json +63 -2
  642. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37102.json +35 -2
  643. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37103.json +59 -2
  644. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37104.json +31 -2
  645. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37105.json +25 -2
  646. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37106.json +35 -2
  647. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37107.json +31 -2
  648. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37108.json +43 -2
  649. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37109.json +31 -2
  650. package/blueprints/deploy-hetzner-server/docs/topics.md +2 -2
  651. package/blueprints/deploy-hetzner-server/guide/deploy-hetzner-server.md +12 -11
  652. package/blueprints/edge-cloudflare-access/CHANGELOG.md +36 -3
  653. package/blueprints/edge-cloudflare-access/README.md +2 -2
  654. package/blueprints/edge-cloudflare-access/blueprint.json +12 -2
  655. package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
  656. package/blueprints/edge-cloudflare-access/contributions/probes/real-account-gated-url.mjs +10 -2
  657. package/blueprints/edge-cloudflare-access/contributions/probes/wrangler-seam.mjs +1 -1
  658. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-001.json +5 -1
  659. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-002.json +5 -1
  660. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-003.json +5 -1
  661. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-004.json +6 -2
  662. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-005.json +5 -1
  663. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-006.json +7 -3
  664. package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-007.json +22 -0
  665. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34101.json +13 -3
  666. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34102.json +63 -2
  667. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34103.json +18 -3
  668. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34104.json +36 -3
  669. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34105.json +13 -3
  670. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34106.json +9 -3
  671. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34107.json +68 -3
  672. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34108.json +5 -3
  673. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34109.json +10 -4
  674. package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34110.json +33 -0
  675. package/blueprints/edge-cloudflare-access/docs/topics.md +2 -2
  676. package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +33 -2
  677. package/blueprints/edge-cloudflare-rate-limiting/README.md +3 -3
  678. package/blueprints/edge-cloudflare-rate-limiting/blueprint.json +1 -1
  679. package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/real-account-burst-and-429.mjs +10 -2
  680. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-001.json +6 -2
  681. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-002.json +5 -1
  682. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-003.json +5 -1
  683. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-004.json +6 -2
  684. package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-005.json +5 -1
  685. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +2 -2
  686. package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +2 -2
  687. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36101.json +27 -3
  688. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36102.json +9 -3
  689. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36103.json +24 -5
  690. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36104.json +88 -3
  691. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36105.json +5 -3
  692. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36106.json +22 -3
  693. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36107.json +16 -5
  694. package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36108.json +14 -3
  695. package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
  696. package/blueprints/edge-cloudflare-rate-limiting/guide/edge-cloudflare-rate-limiting.md +2 -2
  697. package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +40 -7
  698. package/blueprints/edge-cloudflare-tunnel/README.md +21 -23
  699. package/blueprints/edge-cloudflare-tunnel/blueprint.json +29 -4
  700. package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4001-edge-cloudflare-tunnel-ingress-bridge-contract.json +4 -4
  701. package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4002-edge-cloudflare-tunnel-connector-runtime.json +1 -1
  702. package/blueprints/edge-cloudflare-tunnel/contributions/probes/manifest-schema-validate.mjs +3 -3
  703. package/blueprints/edge-cloudflare-tunnel/contributions/probes/probe-utils.mjs +13 -2
  704. package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-connector-healthy.mjs +8 -9
  705. package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-tunnel-hostname-routes.mjs +2 -2
  706. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-001.json +6 -2
  707. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-002.json +5 -1
  708. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-003.json +7 -3
  709. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-004.json +5 -1
  710. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-005.json +5 -1
  711. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-006.json +22 -0
  712. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-007.json +22 -0
  713. package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +1 -1
  714. package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4004-edge-cloudflare-tunnel-zone-and-hostname-apply.json +29 -0
  715. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39101.json +39 -3
  716. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39102.json +23 -4
  717. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39103.json +53 -3
  718. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39104.json +33 -3
  719. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39105.json +25 -3
  720. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39106.json +86 -2
  721. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39107.json +25 -3
  722. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39108.json +35 -2
  723. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39109.json +74 -0
  724. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39110.json +60 -0
  725. package/blueprints/edge-cloudflare-tunnel/docs/topics.md +2 -2
  726. package/blueprints/edge-cloudflare-tunnel/guide/edge-cloudflare-tunnel.md +60 -13
  727. package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +32 -1
  728. package/blueprints/edge-cloudflare-turnstile/README.md +2 -2
  729. package/blueprints/edge-cloudflare-turnstile/blueprint.json +1 -1
  730. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-001.json +6 -2
  731. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-002.json +5 -1
  732. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-003.json +6 -2
  733. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-004.json +5 -1
  734. package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-005.json +5 -1
  735. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +2 -2
  736. package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +2 -2
  737. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35101.json +46 -5
  738. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35102.json +53 -2
  739. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35103.json +81 -2
  740. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35104.json +29 -6
  741. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35105.json +14 -4
  742. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35106.json +9 -3
  743. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35107.json +5 -3
  744. package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35108.json +5 -3
  745. package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
  746. package/blueprints/edge-cloudflare-turnstile/probe-packs/edge-cloudflare-turnstile.pack.mjs +27 -5
  747. package/blueprints/email-smtp-resend/CHANGELOG.md +40 -0
  748. package/blueprints/email-smtp-resend/README.md +4 -4
  749. package/blueprints/email-smtp-resend/assets/stub-adapter.md +2 -0
  750. package/blueprints/email-smtp-resend/blueprint.json +121 -18
  751. package/blueprints/email-smtp-resend/contributions/probes/probe-utils.mjs +50 -0
  752. package/blueprints/email-smtp-resend/contributions/probes/real-account-resend-send.mjs +50 -0
  753. package/blueprints/email-smtp-resend/contributions/probes/run-real-account-resend-send.mjs +3 -0
  754. package/blueprints/email-smtp-resend/contributions/probes/run-smtp-round-trip.mjs +3 -0
  755. package/blueprints/email-smtp-resend/contributions/probes/run-unverified-sender-refusal.mjs +3 -0
  756. package/blueprints/email-smtp-resend/contributions/probes/smtp-round-trip.mjs +43 -0
  757. package/blueprints/email-smtp-resend/contributions/probes/unverified-sender-refusal.mjs +99 -0
  758. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +7 -3
  759. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +4 -0
  760. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +4 -0
  761. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +4 -0
  762. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +4 -0
  763. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +4 -0
  764. package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +3 -3
  765. package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +7 -2
  766. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +15 -8
  767. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +27 -7
  768. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +49 -4
  769. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +6 -3
  770. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +21 -5
  771. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +27 -7
  772. package/blueprints/email-smtp-resend/docs/topics.md +2 -3
  773. package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +2 -2
  774. package/blueprints/jobs-background/CHANGELOG.md +91 -6
  775. package/blueprints/jobs-background/README.md +8 -8
  776. package/blueprints/jobs-background/blueprint.json +57 -3
  777. package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +1 -1
  778. package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +6 -6
  779. package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +38 -10
  780. package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +28 -6
  781. package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +16 -2
  782. package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +102 -21
  783. package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +14 -6
  784. package/blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs +355 -0
  785. package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +33 -2
  786. package/blueprints/jobs-background/contributions/probes/run-retry-and-fail-real-account.mjs +12 -0
  787. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +7 -3
  788. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +7 -3
  789. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +5 -1
  790. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +5 -1
  791. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +5 -1
  792. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +5 -1
  793. package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +5 -5
  794. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +20 -3
  795. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +44 -9
  796. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +48 -3
  797. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +63 -3
  798. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +20 -3
  799. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +20 -3
  800. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +20 -3
  801. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +21 -3
  802. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +23 -6
  803. package/blueprints/jobs-background/docs/topics.md +3 -3
  804. package/blueprints/jobs-background/guide/jobs-background.md +6 -6
  805. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +41 -19
  806. package/blueprints/messaging-queue-cloudflare/README.md +14 -14
  807. package/blueprints/messaging-queue-cloudflare/blueprint.json +127 -19
  808. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +3 -3
  809. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +1 -1
  810. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +183 -15
  811. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +6 -2
  812. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +6 -2
  813. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +5 -1
  814. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +6 -2
  815. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +6 -2
  816. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +6 -2
  817. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +22 -4
  818. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +23 -4
  819. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +20 -3
  820. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +29 -7
  821. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +20 -3
  822. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -4
  823. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -3
  824. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +28 -6
  825. package/blueprints/messaging-queue-cloudflare/docs/topics.md +3 -3
  826. package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +8 -6
  827. package/blueprints/object-storage-s3/CHANGELOG.md +94 -6
  828. package/blueprints/object-storage-s3/README.md +2 -2
  829. package/blueprints/object-storage-s3/blueprint.json +156 -24
  830. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +73 -12
  831. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +55 -7
  832. package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +103 -19
  833. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +105 -36
  834. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +104 -55
  835. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +129 -7
  836. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +80 -18
  837. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +291 -37
  838. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +8 -2
  839. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +5 -5
  840. package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +8 -5
  841. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +8 -2
  842. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +8 -2
  843. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +6 -3
  844. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +10 -2
  845. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +6 -2
  846. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +6 -2
  847. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +5 -1
  848. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +6 -2
  849. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +6 -2
  850. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +6 -2
  851. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-101.json +5 -1
  852. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +36 -4
  853. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +32 -5
  854. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +42 -3
  855. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +22 -4
  856. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -4
  857. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +13 -5
  858. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +10 -4
  859. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +12 -4
  860. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28110.json +20 -3
  861. package/blueprints/object-storage-s3/docs/topics.md +1 -1
  862. package/blueprints/object-storage-s3/guide/object-storage-s3.md +3 -3
  863. package/blueprints/observability-essentials/CHANGELOG.md +37 -0
  864. package/blueprints/observability-essentials/README.md +3 -3
  865. package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +17 -0
  866. package/blueprints/observability-essentials/blueprint.json +34 -2
  867. package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +1 -1
  868. package/blueprints/observability-essentials/contributions/probes/liveness-probe.mjs +84 -0
  869. package/blueprints/observability-essentials/contributions/probes/metrics-endpoint.mjs +96 -0
  870. package/blueprints/observability-essentials/contributions/probes/probe-utils.mjs +52 -0
  871. package/blueprints/observability-essentials/contributions/probes/readiness-probe.mjs +171 -0
  872. package/blueprints/observability-essentials/contributions/probes/run-liveness-probe.mjs +3 -0
  873. package/blueprints/observability-essentials/contributions/probes/run-metrics-endpoint.mjs +3 -0
  874. package/blueprints/observability-essentials/contributions/probes/run-readiness-probe.mjs +3 -0
  875. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +4 -0
  876. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +4 -0
  877. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +4 -0
  878. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +4 -0
  879. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +4 -0
  880. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +6 -2
  881. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +7 -3
  882. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +4 -0
  883. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +4 -0
  884. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +4 -0
  885. package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +6 -1
  886. package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +1 -1
  887. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +25 -7
  888. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +9 -5
  889. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +51 -6
  890. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +7 -4
  891. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +6 -3
  892. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +37 -6
  893. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +18 -11
  894. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +6 -3
  895. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +7 -4
  896. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +8 -5
  897. package/blueprints/observability-essentials/docs/topics.md +3 -4
  898. package/blueprints/observability-essentials/guide/observability-essentials.md +1 -1
  899. package/blueprints/observability-logging/CHANGELOG.md +44 -4
  900. package/blueprints/observability-logging/README.md +2 -2
  901. package/blueprints/observability-logging/blueprint.json +78 -29
  902. package/blueprints/observability-logging/contributions/adrs/adr-1605-observability-logging-serialisation-refusal.json +25 -0
  903. package/blueprints/observability-logging/contributions/probes/correlation-id-flow.mjs +173 -0
  904. package/blueprints/observability-logging/contributions/probes/line-shape-and-fields.mjs +82 -0
  905. package/blueprints/observability-logging/contributions/probes/probe-utils.mjs +47 -0
  906. package/blueprints/observability-logging/contributions/probes/redaction-boundary.mjs +130 -0
  907. package/blueprints/observability-logging/contributions/probes/run-correlation-id-flow.mjs +3 -0
  908. package/blueprints/observability-logging/contributions/probes/run-line-shape-and-fields.mjs +3 -0
  909. package/blueprints/observability-logging/contributions/probes/run-redaction-boundary.mjs +3 -0
  910. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-001.json +10 -3
  911. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-002.json +8 -1
  912. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-003.json +8 -1
  913. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-004.json +8 -1
  914. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-005.json +8 -1
  915. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-006.json +16 -0
  916. package/blueprints/observability-logging/contributions/tacs/tac-1601-observability-logging-logger-factory.json +4 -4
  917. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15101.json +62 -8
  918. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15102.json +11 -6
  919. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15103.json +37 -5
  920. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15104.json +35 -4
  921. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15105.json +24 -6
  922. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15106.json +22 -4
  923. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15107.json +34 -3
  924. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15108.json +21 -3
  925. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15109.json +71 -0
  926. package/blueprints/observability-probe-endpoints/CHANGELOG.md +32 -0
  927. package/blueprints/observability-probe-endpoints/README.md +4 -4
  928. package/blueprints/observability-probe-endpoints/blueprint.json +42 -2
  929. package/blueprints/observability-probe-endpoints/contributions/probes/kubernetes-startup-enabled.mjs +80 -0
  930. package/blueprints/observability-probe-endpoints/contributions/probes/partial-profile-refusal.mjs +101 -0
  931. package/blueprints/observability-probe-endpoints/contributions/probes/probe-utils.mjs +49 -0
  932. package/blueprints/observability-probe-endpoints/contributions/probes/profile-boot-materialisation.mjs +69 -0
  933. package/blueprints/observability-probe-endpoints/contributions/probes/run-kubernetes-startup-enabled.mjs +3 -0
  934. package/blueprints/observability-probe-endpoints/contributions/probes/run-partial-profile-refusal.mjs +3 -0
  935. package/blueprints/observability-probe-endpoints/contributions/probes/run-profile-boot-materialisation.mjs +3 -0
  936. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +6 -2
  937. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +4 -0
  938. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +4 -0
  939. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +4 -0
  940. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +4 -0
  941. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +4 -0
  942. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +4 -0
  943. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +4 -0
  944. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +30 -9
  945. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +24 -6
  946. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +6 -3
  947. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +9 -6
  948. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +49 -4
  949. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +9 -6
  950. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +12 -8
  951. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +6 -3
  952. package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
  953. package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +3 -6
  954. package/blueprints/persistence-data-d1/CHANGELOG.md +32 -0
  955. package/blueprints/persistence-data-d1/README.md +3 -3
  956. package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +2 -0
  957. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +2 -0
  958. package/blueprints/persistence-data-d1/blueprint.json +108 -23
  959. package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +4 -4
  960. package/blueprints/persistence-data-d1/contributions/probes/facade-round-trip.mjs +140 -0
  961. package/blueprints/persistence-data-d1/contributions/probes/migrations-forward-only.mjs +66 -0
  962. package/blueprints/persistence-data-d1/contributions/probes/probe-utils.mjs +51 -0
  963. package/blueprints/persistence-data-d1/contributions/probes/real-account-d1-round-trip.mjs +133 -0
  964. package/blueprints/persistence-data-d1/contributions/probes/run-facade-round-trip.mjs +3 -0
  965. package/blueprints/persistence-data-d1/contributions/probes/run-migrations-forward-only.mjs +3 -0
  966. package/blueprints/persistence-data-d1/contributions/probes/run-real-account-d1-round-trip.mjs +3 -0
  967. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +5 -1
  968. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +5 -1
  969. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +5 -1
  970. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +7 -3
  971. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +5 -1
  972. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +5 -1
  973. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +5 -1
  974. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +35 -4
  975. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +25 -4
  976. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +11 -4
  977. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +13 -6
  978. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +11 -4
  979. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +7 -4
  980. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +23 -3
  981. package/blueprints/persistence-data-d1/docs/topics.md +2 -3
  982. package/blueprints/persistence-data-postgres/CHANGELOG.md +99 -3
  983. package/blueprints/persistence-data-postgres/README.md +2 -2
  984. package/blueprints/persistence-data-postgres/blueprint.json +203 -24
  985. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
  986. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +1 -1
  987. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +87 -12
  988. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +245 -19
  989. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +109 -26
  990. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +151 -38
  991. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +24 -6
  992. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +261 -48
  993. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +76 -20
  994. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +6 -2
  995. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +6 -2
  996. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +6 -2
  997. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +7 -3
  998. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +6 -2
  999. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +6 -2
  1000. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +7 -3
  1001. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +2 -2
  1002. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +5 -5
  1003. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +22 -4
  1004. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +118 -3
  1005. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +20 -3
  1006. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +26 -5
  1007. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +62 -3
  1008. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +20 -3
  1009. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +20 -3
  1010. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +20 -3
  1011. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +20 -3
  1012. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +48 -3
  1013. package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
  1014. package/blueprints/persistence-data-sqlite/CHANGELOG.md +28 -0
  1015. package/blueprints/persistence-data-sqlite/README.md +2 -2
  1016. package/blueprints/persistence-data-sqlite/blueprint.json +148 -31
  1017. package/blueprints/persistence-data-sqlite/contributions/probes/boot-open-migrate.mjs +90 -0
  1018. package/blueprints/persistence-data-sqlite/contributions/probes/facade-round-trip.mjs +82 -0
  1019. package/blueprints/persistence-data-sqlite/contributions/probes/probe-utils.mjs +83 -0
  1020. package/blueprints/persistence-data-sqlite/contributions/probes/run-boot-open-migrate.mjs +5 -0
  1021. package/blueprints/persistence-data-sqlite/contributions/probes/run-facade-round-trip.mjs +5 -0
  1022. package/blueprints/persistence-data-sqlite/contributions/probes/run-wal-checkpoint.mjs +5 -0
  1023. package/blueprints/persistence-data-sqlite/contributions/probes/wal-checkpoint.mjs +137 -0
  1024. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +5 -1
  1025. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +5 -1
  1026. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +5 -1
  1027. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +5 -1
  1028. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +5 -1
  1029. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +5 -1
  1030. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +5 -1
  1031. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +5 -1
  1032. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +5 -1
  1033. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +5 -1
  1034. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +5 -1
  1035. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +35 -4
  1036. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +7 -4
  1037. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +19 -3
  1038. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +21 -4
  1039. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +7 -4
  1040. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +11 -4
  1041. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +7 -4
  1042. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +7 -4
  1043. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +11 -8
  1044. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +23 -3
  1045. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +19 -3
  1046. package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
  1047. package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +1 -1
  1048. package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +40 -2
  1049. package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
  1050. package/blueprints/platform-cloudflare-cron-triggers/blueprint.json +78 -17
  1051. package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3301-platform-cloudflare-cron-triggers-scheduled-trigger-contract.json +2 -2
  1052. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/real-account-scheduled-smoke.mjs +24 -3
  1053. package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/skew-tolerance.mjs +1 -1
  1054. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-001.json +6 -2
  1055. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-002.json +5 -1
  1056. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-003.json +5 -1
  1057. package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-004.json +6 -2
  1058. package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3301-platform-cloudflare-cron-triggers-scheduled-handler.json +1 -1
  1059. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32101.json +86 -5
  1060. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32102.json +69 -5
  1061. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32103.json +51 -4
  1062. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32104.json +65 -4
  1063. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32105.json +68 -5
  1064. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32106.json +62 -3
  1065. package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32107.json +56 -3
  1066. package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +4 -4
  1067. package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +40 -4
  1068. package/blueprints/platform-cloudflare-durable-objects/README.md +6 -6
  1069. package/blueprints/platform-cloudflare-durable-objects/blueprint.json +3 -2
  1070. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3401-platform-cloudflare-durable-objects-single-cell-contract.json +1 -1
  1071. package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3402-platform-cloudflare-durable-objects-websocket-hub-contract.json +1 -1
  1072. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +2 -2
  1073. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +41 -35
  1074. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +1 -1
  1075. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +1 -1
  1076. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +1 -1
  1077. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/wrangler-seam.mjs +11 -5
  1078. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-001.json +5 -1
  1079. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-002.json +6 -2
  1080. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-003.json +5 -1
  1081. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-004.json +5 -1
  1082. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-005.json +6 -2
  1083. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-006.json +6 -2
  1084. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-007.json +5 -1
  1085. package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-008.json +5 -1
  1086. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33101.json +73 -2
  1087. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33102.json +59 -2
  1088. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33103.json +77 -2
  1089. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33104.json +75 -6
  1090. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33105.json +73 -2
  1091. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33106.json +49 -2
  1092. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33107.json +45 -2
  1093. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33108.json +84 -3
  1094. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33109.json +45 -2
  1095. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33110.json +59 -2
  1096. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33111.json +45 -2
  1097. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33112.json +53 -2
  1098. package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33113.json +68 -5
  1099. package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +2 -2
  1100. package/blueprints/platform-cloudflare-durable-objects/guide/platform-cloudflare-durable-objects.md +9 -9
  1101. package/blueprints/platform-cloudflare-kv/CHANGELOG.md +58 -12
  1102. package/blueprints/platform-cloudflare-kv/README.md +7 -11
  1103. package/blueprints/platform-cloudflare-kv/blueprint.json +115 -20
  1104. package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3201-platform-cloudflare-kv-key-value-store-contract.json +3 -3
  1105. package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +1 -1
  1106. package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +1 -1
  1107. package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +53 -18
  1108. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-001.json +6 -2
  1109. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-002.json +5 -1
  1110. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-003.json +5 -1
  1111. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-004.json +6 -2
  1112. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-005.json +7 -3
  1113. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-006.json +22 -0
  1114. package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-007.json +22 -0
  1115. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31101.json +59 -2
  1116. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31102.json +45 -2
  1117. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31103.json +73 -3
  1118. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31104.json +67 -2
  1119. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31105.json +59 -2
  1120. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31106.json +45 -2
  1121. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31107.json +45 -2
  1122. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31108.json +45 -2
  1123. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31109.json +92 -0
  1124. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31110.json +88 -0
  1125. package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31111.json +89 -0
  1126. package/blueprints/platform-cloudflare-kv/docs/topics.md +2 -2
  1127. package/blueprints/platform-cloudflare-kv/guide/platform-cloudflare-kv.md +2 -2
  1128. package/blueprints/platform-docker-compose-host/CHANGELOG.md +124 -3
  1129. package/blueprints/platform-docker-compose-host/README.md +7 -7
  1130. package/blueprints/platform-docker-compose-host/blueprint.json +23 -6
  1131. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3901-platform-docker-compose-host-contract.json +3 -3
  1132. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3902-platform-docker-compose-host-reverse-proxy.json +4 -4
  1133. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3903-platform-docker-compose-host-reject-coolify.json +2 -2
  1134. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3904-platform-docker-compose-host-log-driver.json +2 -2
  1135. package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +116 -29
  1136. package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +181 -109
  1137. package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +146 -26
  1138. package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +238 -25
  1139. package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +207 -21
  1140. package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +246 -42
  1141. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-001.json +6 -2
  1142. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-002.json +5 -1
  1143. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-003.json +6 -2
  1144. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-004.json +5 -1
  1145. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-005.json +6 -2
  1146. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-006.json +6 -2
  1147. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-007.json +22 -0
  1148. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38101.json +73 -2
  1149. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38102.json +67 -2
  1150. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38103.json +59 -2
  1151. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38104.json +75 -2
  1152. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38105.json +49 -2
  1153. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38106.json +45 -2
  1154. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38107.json +49 -2
  1155. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38108.json +49 -2
  1156. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38109.json +57 -2
  1157. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38110.json +92 -0
  1158. package/blueprints/platform-docker-compose-host/docs/topics.md +4 -4
  1159. package/blueprints/platform-docker-compose-host/guide/platform-docker-compose-host.md +6 -6
  1160. package/blueprints/security-auth-clerk/CHANGELOG.md +36 -4
  1161. package/blueprints/security-auth-clerk/README.md +4 -4
  1162. package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
  1163. package/blueprints/security-auth-clerk/blueprint.json +23 -2
  1164. package/blueprints/security-auth-clerk/contributions/probes/hosted-identity-ui-config.mjs +61 -0
  1165. package/blueprints/security-auth-clerk/contributions/probes/probe-utils.mjs +188 -0
  1166. package/blueprints/security-auth-clerk/contributions/probes/real-account-principal-directory-round-trip.mjs +216 -0
  1167. package/blueprints/security-auth-clerk/contributions/probes/real-account-session-inventory.mjs +260 -0
  1168. package/blueprints/security-auth-clerk/contributions/probes/role-model-adapter.mjs +53 -0
  1169. package/blueprints/security-auth-clerk/contributions/probes/run-hosted-identity-ui-config.mjs +4 -0
  1170. package/blueprints/security-auth-clerk/contributions/probes/run-real-account-principal-directory-round-trip.mjs +4 -0
  1171. package/blueprints/security-auth-clerk/contributions/probes/run-real-account-session-inventory.mjs +4 -0
  1172. package/blueprints/security-auth-clerk/contributions/probes/run-role-model-adapter.mjs +4 -0
  1173. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +6 -2
  1174. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +5 -1
  1175. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +6 -2
  1176. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +6 -2
  1177. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +5 -2
  1178. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +5 -1
  1179. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +4 -1
  1180. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +4 -1
  1181. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +4 -1
  1182. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-010.json +22 -0
  1183. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-011.json +22 -0
  1184. package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +14 -4
  1185. package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +7 -1
  1186. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +6 -3
  1187. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +19 -3
  1188. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +6 -3
  1189. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +6 -3
  1190. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +4 -2
  1191. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +4 -2
  1192. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +4 -2
  1193. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +13 -3
  1194. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +8 -2
  1195. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +4 -2
  1196. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +4 -2
  1197. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9112.json +102 -0
  1198. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9113.json +103 -0
  1199. package/blueprints/security-auth-clerk/docs/topics.md +2 -3
  1200. package/blueprints/security-auth-keycloak/CHANGELOG.md +34 -4
  1201. package/blueprints/security-auth-keycloak/README.md +3 -3
  1202. package/blueprints/security-auth-keycloak/blueprint.json +103 -2
  1203. package/blueprints/security-auth-keycloak/contributions/probes/discovery-shape.mjs +68 -0
  1204. package/blueprints/security-auth-keycloak/contributions/probes/introspection-shape.mjs +88 -0
  1205. package/blueprints/security-auth-keycloak/contributions/probes/jwt-verifier-shape.mjs +86 -0
  1206. package/blueprints/security-auth-keycloak/contributions/probes/probe-utils.mjs +180 -0
  1207. package/blueprints/security-auth-keycloak/contributions/probes/real-account-realm-round-trip.mjs +91 -0
  1208. package/blueprints/security-auth-keycloak/contributions/probes/role-adapter-shape.mjs +69 -0
  1209. package/blueprints/security-auth-keycloak/contributions/probes/run-discovery-shape.mjs +4 -0
  1210. package/blueprints/security-auth-keycloak/contributions/probes/run-introspection-shape.mjs +4 -0
  1211. package/blueprints/security-auth-keycloak/contributions/probes/run-jwt-verifier-shape.mjs +4 -0
  1212. package/blueprints/security-auth-keycloak/contributions/probes/run-real-account-realm-round-trip.mjs +4 -0
  1213. package/blueprints/security-auth-keycloak/contributions/probes/run-role-adapter-shape.mjs +4 -0
  1214. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +5 -2
  1215. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +5 -1
  1216. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +5 -1
  1217. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +5 -1
  1218. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +6 -2
  1219. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +6 -2
  1220. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +4 -1
  1221. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +4 -1
  1222. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +4 -1
  1223. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +4 -1
  1224. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +5 -1
  1225. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +4 -1
  1226. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-013.json +22 -0
  1227. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-014.json +22 -0
  1228. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-015.json +22 -0
  1229. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-016.json +22 -0
  1230. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-017.json +22 -0
  1231. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-018.json +22 -0
  1232. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-019.json +22 -0
  1233. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +4 -2
  1234. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +8 -2
  1235. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +8 -2
  1236. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +3 -1
  1237. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +2 -1
  1238. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +6 -3
  1239. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +10 -3
  1240. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +12 -2
  1241. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +8 -2
  1242. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +6 -3
  1243. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +18 -3
  1244. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +6 -3
  1245. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +6 -3
  1246. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +4 -2
  1247. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +6 -3
  1248. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +14 -3
  1249. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +4 -2
  1250. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +4 -2
  1251. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11114.json +72 -0
  1252. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11115.json +88 -0
  1253. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11116.json +117 -0
  1254. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11117.json +117 -0
  1255. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11118.json +117 -0
  1256. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11119.json +117 -0
  1257. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11120.json +103 -0
  1258. package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
  1259. package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +1 -1
  1260. package/blueprints/security-auth-magic-link/CHANGELOG.md +30 -3
  1261. package/blueprints/security-auth-magic-link/README.md +3 -3
  1262. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +1 -1
  1263. package/blueprints/security-auth-magic-link/blueprint.json +3 -2
  1264. package/blueprints/security-auth-magic-link/contributions/probes/probe-utils.mjs +174 -0
  1265. package/blueprints/security-auth-magic-link/contributions/probes/real-account-magic-link-send.mjs +139 -0
  1266. package/blueprints/security-auth-magic-link/contributions/probes/run-real-account-magic-link-send.mjs +4 -0
  1267. package/blueprints/security-auth-magic-link/contributions/probes/run-token-entropy-shape.mjs +4 -0
  1268. package/blueprints/security-auth-magic-link/contributions/probes/run-token-issue-verify.mjs +4 -0
  1269. package/blueprints/security-auth-magic-link/contributions/probes/token-entropy-shape.mjs +60 -0
  1270. package/blueprints/security-auth-magic-link/contributions/probes/token-issue-verify.mjs +90 -0
  1271. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +4 -1
  1272. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +5 -1
  1273. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +6 -2
  1274. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +5 -1
  1275. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +5 -1
  1276. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +4 -1
  1277. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +4 -1
  1278. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +5 -1
  1279. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +5 -1
  1280. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +6 -2
  1281. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +6 -2
  1282. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +10 -5
  1283. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +8 -4
  1284. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +6 -3
  1285. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +8 -4
  1286. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +6 -3
  1287. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +6 -3
  1288. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +8 -4
  1289. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +6 -3
  1290. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +6 -3
  1291. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +6 -3
  1292. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +14 -3
  1293. package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
  1294. package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +1 -1
  1295. package/blueprints/security-auth-oauth2/CHANGELOG.md +32 -4
  1296. package/blueprints/security-auth-oauth2/README.md +3 -3
  1297. package/blueprints/security-auth-oauth2/blueprint.json +35 -3
  1298. package/blueprints/security-auth-oauth2/contributions/probes/authorisation-code-flow-shape.mjs +259 -0
  1299. package/blueprints/security-auth-oauth2/contributions/probes/pkce-challenge-shape.mjs +58 -0
  1300. package/blueprints/security-auth-oauth2/contributions/probes/probe-utils.mjs +190 -0
  1301. package/blueprints/security-auth-oauth2/contributions/probes/provider-adapter-shape.mjs +64 -0
  1302. package/blueprints/security-auth-oauth2/contributions/probes/real-account-authorisation-code-flow.mjs +93 -0
  1303. package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs +4 -0
  1304. package/blueprints/security-auth-oauth2/contributions/probes/run-pkce-challenge-shape.mjs +4 -0
  1305. package/blueprints/security-auth-oauth2/contributions/probes/run-provider-adapter-shape.mjs +4 -0
  1306. package/blueprints/security-auth-oauth2/contributions/probes/run-real-account-authorisation-code-flow.mjs +4 -0
  1307. package/blueprints/security-auth-oauth2/contributions/probes/run-session-bridge-shape.mjs +4 -0
  1308. package/blueprints/security-auth-oauth2/contributions/probes/session-bridge-shape.mjs +78 -0
  1309. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +5 -2
  1310. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +5 -1
  1311. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +5 -1
  1312. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +4 -1
  1313. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +5 -1
  1314. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +6 -2
  1315. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +4 -1
  1316. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +6 -2
  1317. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +5 -1
  1318. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +4 -1
  1319. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-011.json +22 -0
  1320. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-012.json +22 -0
  1321. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-013.json +22 -0
  1322. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +2 -1
  1323. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +9 -2
  1324. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +6 -3
  1325. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +6 -3
  1326. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +4 -2
  1327. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +4 -2
  1328. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +8 -4
  1329. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +6 -3
  1330. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +6 -3
  1331. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +6 -3
  1332. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +4 -2
  1333. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +4 -2
  1334. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +17 -2
  1335. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10112.json +82 -0
  1336. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10113.json +68 -0
  1337. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10114.json +88 -0
  1338. package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
  1339. package/blueprints/security-secrets-management/CHANGELOG.md +26 -3
  1340. package/blueprints/security-secrets-management/README.md +2 -2
  1341. package/blueprints/security-secrets-management/blueprint.json +170 -32
  1342. package/blueprints/security-secrets-management/contributions/probes/add-recipient-rotation.mjs +107 -0
  1343. package/blueprints/security-secrets-management/contributions/probes/encrypt-decrypt-round-trip.mjs +122 -0
  1344. package/blueprints/security-secrets-management/contributions/probes/key-rotation.mjs +93 -0
  1345. package/blueprints/security-secrets-management/contributions/probes/mismatched-key-refusal.mjs +74 -0
  1346. package/blueprints/security-secrets-management/contributions/probes/probe-utils.mjs +214 -0
  1347. package/blueprints/security-secrets-management/contributions/probes/run-add-recipient-rotation.mjs +4 -0
  1348. package/blueprints/security-secrets-management/contributions/probes/run-encrypt-decrypt-round-trip.mjs +4 -0
  1349. package/blueprints/security-secrets-management/contributions/probes/run-key-rotation.mjs +4 -0
  1350. package/blueprints/security-secrets-management/contributions/probes/run-mismatched-key-refusal.mjs +4 -0
  1351. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +5 -1
  1352. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +6 -2
  1353. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +6 -2
  1354. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +5 -1
  1355. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +6 -2
  1356. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +5 -1
  1357. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +5 -1
  1358. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +5 -1
  1359. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +5 -1
  1360. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +6 -3
  1361. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +6 -3
  1362. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +6 -3
  1363. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +4 -2
  1364. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +6 -3
  1365. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +8 -4
  1366. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +6 -3
  1367. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +6 -3
  1368. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +6 -3
  1369. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +6 -3
  1370. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +6 -3
  1371. package/blueprints/security-secrets-management/docs/topics.md +2 -3
  1372. package/fixtures/canary-manifest.json +9 -9
  1373. package/guidance/harness-template.md +25 -0
  1374. package/guidance/managed/agent-instructions-block.hash +1 -1
  1375. package/guidance/managed/agent-instructions-block.md +25 -0
  1376. package/package.json +2 -2
  1377. package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
  1378. package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
  1379. package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
  1380. package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
  1381. package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
  1382. package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
  1383. package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
  1384. package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
  1385. package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
  1386. package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
  1387. package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
  1388. package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
  1389. package/rcf/code-nodes/cn-600.json +45 -0
  1390. package/rcf/code-nodes/cn-601.json +18 -0
  1391. package/rcf/code-nodes/cn-602.json +15 -0
  1392. package/rcf/code-nodes/cn-603.json +12 -0
  1393. package/rcf/code-nodes/cn-604.json +14 -0
  1394. package/rcf/code-nodes/cn-605.json +17 -0
  1395. package/rcf/code-nodes/cn-606.json +12 -0
  1396. package/rcf/code-nodes/cn-607.json +12 -0
  1397. package/rcf/code-nodes/cn-608.json +14 -0
  1398. package/rcf/code-nodes/cn-609.json +17 -0
  1399. package/rcf/code-nodes/cn-620.json +18 -0
  1400. package/rcf/code-nodes/cn-621.json +14 -0
  1401. package/rcf/code-nodes/cn-622.json +15 -0
  1402. package/rcf/code-nodes/cn-623.json +16 -0
  1403. package/rcf/code-nodes/cn-624.json +14 -0
  1404. package/rcf/code-nodes/cn-625.json +15 -0
  1405. package/rcf/code-nodes/cn-626.json +13 -0
  1406. package/rcf/code-nodes/cn-627.json +13 -0
  1407. package/rcf/code-nodes/cn-628.json +14 -0
  1408. package/rcf/code-nodes/cn-629.json +12 -0
  1409. package/rcf/code-nodes/cn-630.json +12 -0
  1410. package/rcf/code-nodes/cn-631.json +13 -0
  1411. package/rcf/code-nodes/cn-632.json +13 -0
  1412. package/rcf/fbs/fbs-180.json +45 -0
  1413. package/rcf/fbs/fbs-181.json +45 -0
  1414. package/rcf/fbs/fbs-182.json +42 -0
  1415. package/rcf/fbs/fbs-183.json +50 -0
  1416. package/rcf/fbs/fbs-184.json +49 -0
  1417. package/rcf/fbs/fbs-185.json +34 -0
  1418. package/rcf/fbs/fbs-186.json +16 -0
  1419. package/rcf/fbs/fbs-187.json +17 -0
  1420. package/rcf/fbs/fbs-188.json +17 -0
  1421. package/rcf/fbs/fbs-189.json +17 -0
  1422. package/rcf/requirements/req-155.json +13 -0
  1423. package/rcf/requirements/req-156.json +13 -0
  1424. package/rcf/requirements/req-157.json +13 -0
  1425. package/rcf/requirements/req-158.json +13 -0
  1426. package/rcf/requirements/req-159.json +13 -0
  1427. package/rcf/requirements/req-160.json +13 -0
  1428. package/rcf/requirements/req-161.json +13 -0
  1429. package/rcf/requirements/req-162.json +13 -0
  1430. package/rcf/requirements/req-163.json +13 -0
  1431. package/rcf/requirements/req-164.json +13 -0
  1432. package/rcf/requirements/req-165.json +13 -0
  1433. package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
  1434. package/rcf/tacs/tac-4102-feedback-store.json +50 -0
  1435. package/rcf/tacs/tac-4103-feedback-redact.json +39 -0
  1436. package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
  1437. package/rcf/tacs/tac-4105-feedback-render.json +45 -0
  1438. package/rcf/tacs/tac-4106-feedback-destination.json +39 -0
  1439. package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
  1440. package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
  1441. package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
  1442. package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
  1443. package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
  1444. package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
  1445. package/rcf/test-suites/ts-050.json +1 -1
  1446. package/rcf/test-suites/ts-052.json +1 -1
  1447. package/rcf/test-suites/ts-053.json +2 -2
  1448. package/rcf/test-suites/ts-054.json +2 -2
  1449. package/rcf/test-suites/ts-055.json +2 -2
  1450. package/rcf/test-suites/ts-056.json +4 -4
  1451. package/rcf/test-suites/ts-057.json +2 -2
  1452. package/rcf/test-suites/ts-140.json +9 -9
  1453. package/rcf/test-suites/ts-150.json +9 -9
  1454. package/rcf/test-suites/ts-185.json +54 -0
  1455. package/rcf/test-suites/ts-186.json +58 -0
  1456. package/rcf/test-suites/ts-187.json +44 -0
  1457. package/rcf/test-suites/ts-188.json +166 -0
  1458. package/rcf/test-suites/ts-189.json +38 -0
  1459. package/rcf/test-suites/ts-190.json +30 -0
  1460. package/rcf/test-suites/ts-191.json +51 -0
  1461. package/rcf/test-suites/ts-192.json +37 -0
  1462. package/rcf/test-suites/ts-193.json +60 -0
  1463. package/rcf/test-suites/ts-194.json +67 -0
  1464. package/rcf/test-suites/ts-195.json +52 -0
  1465. package/rcf/test-suites/ts-196.json +58 -0
  1466. package/rcf/test-suites/ts-197.json +66 -0
  1467. package/rcf/test-suites/ts-198.json +87 -0
  1468. package/rcf/test-suites/ts-199.json +51 -0
  1469. package/rcf/test-suites/ts-200.json +30 -0
  1470. package/rcf/test-suites/ts-201.json +38 -0
  1471. package/rcf/test-suites/ts-202.json +38 -0
  1472. package/rcf/test-suites/ts-203.json +38 -0
  1473. package/rcf/user-stories/us-15501.json +60 -0
  1474. package/rcf/user-stories/us-15502.json +33 -0
  1475. package/rcf/user-stories/us-15503.json +33 -0
  1476. package/rcf/user-stories/us-15601.json +51 -0
  1477. package/rcf/user-stories/us-15701.json +42 -0
  1478. package/rcf/user-stories/us-15801.json +42 -0
  1479. package/rcf/user-stories/us-15802.json +33 -0
  1480. package/rcf/user-stories/us-15901.json +33 -0
  1481. package/rcf/user-stories/us-15902.json +51 -0
  1482. package/rcf/user-stories/us-16001.json +51 -0
  1483. package/rcf/user-stories/us-16101.json +42 -0
  1484. package/rcf/user-stories/us-16102.json +33 -0
  1485. package/rcf/user-stories/us-16103.json +42 -0
  1486. package/rcf/user-stories/us-16104.json +42 -0
  1487. package/rcf/user-stories/us-16201.json +33 -0
  1488. package/rcf/user-stories/us-16301.json +36 -0
  1489. package/rcf/user-stories/us-16401.json +45 -0
  1490. package/rcf/user-stories/us-16501.json +45 -0
  1491. package/rcf/user-stories/us-16502.json +45 -0
  1492. package/rcf/user-stories/us-7701.json +3 -3
  1493. package/releases/releases.yaml +21 -1
  1494. package/src/blueprint/library-loader.js +48 -0
  1495. package/src/blueprint/library-registry.js +13 -0
  1496. package/src/browser-verify/pack-runner.js +7 -12
  1497. package/src/build/mark.js +1 -1
  1498. package/src/cli/blueprint-library.js +149 -0
  1499. package/src/cli/coverage.js +49 -24
  1500. package/src/cli/doctor.js +195 -7
  1501. package/src/cli/feedback.js +2204 -0
  1502. package/src/cli/finalise.js +158 -1
  1503. package/src/cli/help.js +6 -0
  1504. package/src/cli/init.js +63 -0
  1505. package/src/cli/update.js +21 -1
  1506. package/src/cli/view.js +22 -11
  1507. package/src/core/store/walker.js +33 -0
  1508. package/src/core/store/writer.js +23 -0
  1509. package/src/feedback/destination.js +361 -0
  1510. package/src/feedback/fingerprint.js +132 -0
  1511. package/src/feedback/gh.js +376 -0
  1512. package/src/feedback/hook.js +183 -0
  1513. package/src/feedback/labels.js +87 -0
  1514. package/src/feedback/redact-allowlist.json +14 -0
  1515. package/src/feedback/redact.js +1108 -0
  1516. package/src/feedback/render.js +267 -0
  1517. package/src/feedback/store.js +604 -0
  1518. package/src/finalise/index.js +4 -0
  1519. package/src/finalise/ingest.js +61 -0
  1520. package/src/finalise/ship-without-eval.js +19 -7
  1521. package/src/mcp/tools.js +8 -2
  1522. package/src/setup/feedback-hooks.js +397 -0
  1523. package/src/setup/managed-gitignore.js +3 -0
  1524. package/src/view/html-page.js +5 -5
  1525. package/src/view/style.css +2 -2
@@ -0,0 +1,1108 @@
1
+ // Feedback redactor (TAC-4103-feedback-redact, ADR-4103). Slice 2
2
+ // (FBS-181) ships the rules of design section 5 (eight in slice 2, plus rule 9 url-credential added round 4 for R3b), applied to any
3
+ // string that would leave the machine (issue title, body, evidence
4
+ // pointers). Pure, deterministic, no network, no LLM.
5
+ //
6
+ // Every replacement lands on a ledger of { rule, before, after, count }
7
+ // entries so `rcf feedback preview` can show the operator exactly what
8
+ // was stripped. Rule 8 is the second-pass refusal: if the redacted
9
+ // output still matches rule 5 (a secret-shaped run of characters), we
10
+ // return residual { line, snippet } markers so the caller can refuse
11
+ // the entry rather than send it.
12
+ //
13
+ // The rules, in canonical order (also the ledger's rule-name
14
+ // vocabulary): `project-root`, `absolute-path`, `email`, `hostname`,
15
+ // `private-ip`, `secret-token`, `operator-identity`, `size-shape`,
16
+ // `url-credential` (design amendment R3b, added fix round 4).
17
+ // Rule 6 in the design (operator identity) is applied AFTER rule 5
18
+ // (secret-token) so a name that looks like a random token is redacted
19
+ // as a token first; both are load-bearing and this ordering keeps the
20
+ // secret-shape check the last line of defence, which is what the
21
+ // residual-match refusal in rule 8 leans on.
22
+
23
+ import { readFileSync } from 'node:fs';
24
+ import { dirname, resolve } from 'node:path';
25
+ import { fileURLToPath } from 'node:url';
26
+
27
+ const here = dirname(fileURLToPath(import.meta.url));
28
+ const BUNDLED_ALLOWLIST = JSON.parse(
29
+ readFileSync(resolve(here, 'redact-allowlist.json'), 'utf8'),
30
+ );
31
+
32
+ /** Body size cap (bytes). Mirrors src/cli/feedback.js:BODY_CAP_BYTES. */
33
+ export const BODY_CAP_BYTES = 8 * 1024;
34
+
35
+ /**
36
+ * Open secret-key vocabulary (design amendment R3a). A key/value pair
37
+ * is treated as a secret when the key, right-bounded at a word edge so
38
+ * `keyword` and `authors` do not fold, matches any stem below. False
39
+ * positives (`mypw=1`) are acceptable per design; false negatives are
40
+ * not. Consumed in exactly three places so the first pass, the residual
41
+ * pass and the whole-text safeguard scan share ONE vocabulary:
42
+ *
43
+ * 1. `kv-secret` early-guard regex in `redact()` (before path pass).
44
+ * 2. `kv-secret` entry in `secretPatterns()` (rule 5 primary pass).
45
+ * 3. `matchesSecretKeyLoose()` used by the rule-9 URL-credential
46
+ * scanner for query-parameter names.
47
+ *
48
+ * The list intentionally covers the full shortname surface the HQ gate
49
+ * on PR #221 (F-P0-A) named as leaking: `pw`, `pwd`, `pass`, `key`,
50
+ * `auth`, plus the long list from R3a. Word-boundary detail:
51
+ * `stem\b` at the right side only. That fails inside `keyword`
52
+ * (`y` -> `w`, no boundary) but succeeds inside `dbpassword`
53
+ * (`d` -> `=`, boundary), matching the round 3 gate probes.
54
+ */
55
+ export const SECRET_KEY_VOCABULARY = Object.freeze([
56
+ // Long forms first so alternation prefers them (does not change
57
+ // correctness under `\b`, but keeps the ledger `before` samples
58
+ // stable for the operator).
59
+ //
60
+ // `authorization` is intentionally NOT in this list. The
61
+ // `Authorization:` header shape is handled by a line-anchored
62
+ // pattern in `secretPatterns()` that folds the WHOLE header line
63
+ // (scheme + credential + any tail), which is what the operator
64
+ // wants for the header case (F-slice-2-02). Adding `authorization`
65
+ // to the kv vocabulary would preempt that pattern: the guard would
66
+ // fold `Authorization: Basic` alone and leave the credential.
67
+ 'passphrase',
68
+ 'clientsecret',
69
+ 'client_secret',
70
+ 'client-secret',
71
+ 'privatekey',
72
+ 'private_key',
73
+ 'private-key',
74
+ 'accesskey',
75
+ 'access_key',
76
+ 'access-key',
77
+ 'apikey',
78
+ 'api_key',
79
+ 'api-key',
80
+ 'credential',
81
+ 'credentials',
82
+ 'signature',
83
+ 'password',
84
+ 'passwd',
85
+ 'session',
86
+ 'cookie',
87
+ 'secret',
88
+ 'bearer',
89
+ 'creds',
90
+ 'token',
91
+ 'salt',
92
+ 'cred',
93
+ 'pass',
94
+ 'auth',
95
+ 'pwd',
96
+ 'sig',
97
+ 'pw',
98
+ 'key',
99
+ // `hash` is intentionally NOT in this vocabulary. Per design R3a
100
+ // the `hash` stem is only a secret when the value is 16+ chars.
101
+ // The specific `hash`-with-long-value pattern is a separate regex
102
+ // handled inside `secretPatterns()` so a bare `hash=abc` (short
103
+ // digest displayed for humans) does not fold.
104
+ ]);
105
+
106
+ // Build the alternation source ONCE at module load. Regex-escapes each
107
+ // stem (currently none carry regex metacharacters, but the escape keeps
108
+ // the constant safe if vocabulary is extended by extension in future).
109
+ const SECRET_KEY_ALTERNATION = SECRET_KEY_VOCABULARY.map(escapeReStatic).join('|');
110
+
111
+ /**
112
+ * Regex source for the vocabulary above, right-bounded with `\b` so
113
+ * `keyword` and `authors` do not fold but `dbpassword` still does.
114
+ * Callers wrap this in a larger regex with their own value pattern.
115
+ */
116
+ export function secretKeyRegexSource() {
117
+ return `(?:${SECRET_KEY_ALTERNATION})\\b`;
118
+ }
119
+
120
+ /**
121
+ * Value-shape character class (design amendment R4). Common secret /
122
+ * URL-safe alphabet plus punctuation that turns up in passwords. Used
123
+ * by the R4 separator scanner to bound the value token; the length
124
+ * gate and mixed-classes check are applied by `looksLikeSecretValue`.
125
+ */
126
+ const R4_VALUE_CHAR_CLASS = `[A-Za-z0-9._~+/=@!#$%^&*?\\-]`;
127
+
128
+ /**
129
+ * R4 separator: one of the prose bridges `is` / `was` / `set to`
130
+ * bounded by whitespace, OR up to 40 units of a non-word non-newline
131
+ * character or an HTML numeric entity (`=`, `=`). Ordering
132
+ * matters: the entity alternative is tried first so the digits inside
133
+ * (`61`) do not stop the run at the leading `&#`. The prose bridge
134
+ * captures markdown-table pipes, bullet-list dashes, arrows,
135
+ * whitespace, tabs and `:` / `=` alongside the R3a shape.
136
+ */
137
+ const R4_SEPARATOR_SRC =
138
+ '(?:\\s+(?:is|was|set\\s+to)\\s+|(?:&#(?:\\d+|x[0-9a-fA-F]+);|[^\\w\\n]){1,40})';
139
+
140
+ /**
141
+ * R4 combined regex source: `<vocab-key>\b<separator><value-shape>`.
142
+ * The value shape is bounded by the R4 character class so `\S{8,}`
143
+ * greed does not consume adjacent structural punctuation (e.g. the
144
+ * closing pipe of a markdown table cell). Post-match, callers apply
145
+ * `looksLikeSecretValue` to gate on 2+ character classes so plain
146
+ * English words (`required`, `enabled`) do not fold.
147
+ */
148
+ const R4_REGEX_SRC =
149
+ `\\b(?:${SECRET_KEY_ALTERNATION})\\b${R4_SEPARATOR_SRC}(${R4_VALUE_CHAR_CLASS}{8,})`;
150
+
151
+ /**
152
+ * Round 5 (design amendment R4): does a candidate value shape look
153
+ * like a secret? Guards R4 against over-redaction of ordinary prose:
154
+ * requires 8+ chars AND at least two character classes among {upper,
155
+ * lower, digit, symbol}. Rejects single-class runs like `required`
156
+ * (all lower) and `12345678` (all digits) so a sentence like
157
+ * `the password is required` does not fold the trailing word.
158
+ *
159
+ * @param {string} value
160
+ */
161
+ function looksLikeSecretValue(value) {
162
+ if (typeof value !== 'string') return false;
163
+ if (value.length < 8) return false;
164
+ let classes = 0;
165
+ if (/[A-Z]/.test(value)) classes += 1;
166
+ if (/[a-z]/.test(value)) classes += 1;
167
+ if (/\d/.test(value)) classes += 1;
168
+ if (/[^A-Za-z0-9]/.test(value)) classes += 1;
169
+ return classes >= 2;
170
+ }
171
+
172
+ /**
173
+ * Round 5 (design amendment R4): scan `text` for vocabulary keys
174
+ * separated from a value-shape token by any separator. Returns the
175
+ * match ranges the redactor should fold (and the residual scan should
176
+ * flag). Skips matches whose value fails `looksLikeSecretValue` so
177
+ * ordinary prose survives.
178
+ *
179
+ * @param {string} text
180
+ * @returns {Array<{start: number, end: number, match: string, value: string}>}
181
+ */
182
+ function scanR4Leaks(text) {
183
+ const re = new RegExp(R4_REGEX_SRC, 'gi');
184
+ const out = [];
185
+ let m;
186
+ while ((m = re.exec(text)) !== null) {
187
+ const value = m[1];
188
+ if (!looksLikeSecretValue(value)) {
189
+ // Guard against zero-width infinite loops on future pattern
190
+ // changes; the fixed regex above cannot match zero-length.
191
+ if (re.lastIndex === m.index) re.lastIndex += 1;
192
+ continue;
193
+ }
194
+ out.push({ start: m.index, end: m.index + m[0].length, match: m[0], value });
195
+ }
196
+ return out;
197
+ }
198
+
199
+ /**
200
+ * Case-insensitive test: does `name`, after lower-casing and stripping
201
+ * separators, MATCH any vocabulary stem? Used by the rule-9 URL-
202
+ * credential scanner to decide whether a URL query parameter name
203
+ * (`?apiKey=...`, `?client-secret=...`) is secret-carrying. Distinct
204
+ * from the regex above because query-parameter names are already
205
+ * isolated by the URL parser, so we do not need a boundary check.
206
+ *
207
+ * @param {string} name
208
+ */
209
+ export function matchesSecretKeyLoose(name) {
210
+ if (typeof name !== 'string' || name.length === 0) return false;
211
+ const norm = name.toLowerCase().replace(/[_\-\s]/g, '');
212
+ for (const stem of SECRET_KEY_VOCABULARY) {
213
+ if (norm === stem.replace(/[_\-]/g, '')) return true;
214
+ }
215
+ return false;
216
+ }
217
+
218
+ /**
219
+ * Known webhook-style hosts where the credential lives in the URL path
220
+ * (design amendment R3b). Format: `host[/pathPrefix]`. When a URL's
221
+ * host matches (exact or as a suffix under a subdomain), any path
222
+ * segments AFTER the recognisable prefix are folded to
223
+ * `<url-credential>` because the token IS the path.
224
+ */
225
+ const WEBHOOK_HOST_PATH_PREFIXES = Object.freeze([
226
+ { host: 'hooks.slack.com', prefix: '/services' },
227
+ { host: 'discord.com', prefix: '/api/webhooks' },
228
+ { host: 'discordapp.com', prefix: '/api/webhooks' },
229
+ { host: 'hooks.zapier.com', prefix: '' },
230
+ { host: 'api.telegram.org', prefix: '/bot' },
231
+ ]);
232
+
233
+ /**
234
+ * Presigned-URL query parameter names (design amendment R3b). Lower-
235
+ * cased on match. The rule-9 scanner also consults the open vocabulary
236
+ * above via `matchesSecretKeyLoose`, so `?token=` and `?api_key=` fold
237
+ * without appearing here; this list carries the presigned-only names
238
+ * that would not otherwise trip the vocabulary.
239
+ */
240
+ const PRESIGNED_QUERY_NAMES = Object.freeze(new Set([
241
+ 'x-amz-signature',
242
+ 'x-amz-credential',
243
+ 'x-amz-security-token',
244
+ 'x-amz-date',
245
+ 'sas',
246
+ 'se',
247
+ 'sv',
248
+ 'sp',
249
+ 'access_token',
250
+ ]));
251
+
252
+ // Small local escape helper used at module-init time before the main
253
+ // `escapeRe` is defined below. Cheap and duplicates one line to keep
254
+ // module ordering simple.
255
+ function escapeReStatic(s) {
256
+ return String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
257
+ }
258
+
259
+ /**
260
+ * @typedef {object} RedactionContext
261
+ * @property {string | string[]} [projectRoot] absolute path (redacted to `<project>`);
262
+ * an array carries every spelling that names the same root (the as-typed
263
+ * spelling AND its realpath, e.g. `/tmp/foo` and `/private/tmp/foo` on macOS)
264
+ * so a path expressed either way is stripped (design 5 rule 1, F-slice-2-06).
265
+ * @property {string} [projectName] manifest projectName (redacted to `<project>`)
266
+ * @property {string} [operatorName] identity ## Name line, or null
267
+ * @property {string | string[]} [gitRemote] git remote url or URLs (redacted to `<project-remote>`);
268
+ * an array carries every remote a `git remote -v` walk names (F-slice-2-07).
269
+ * @property {string[]} [allowHosts] extension list merged with the bundled allowlist
270
+ */
271
+
272
+ /**
273
+ * @typedef {object} LedgerRow
274
+ * @property {string} rule
275
+ * @property {string} before
276
+ * @property {string} after
277
+ * @property {number} count
278
+ */
279
+
280
+ /**
281
+ * @typedef {object} ResidualHit
282
+ * @property {number} line 1-indexed line number in redacted output
283
+ * @property {string} snippet matched substring (already redacted string)
284
+ * @property {string} pattern short label for the pattern family
285
+ */
286
+
287
+ /**
288
+ * @typedef {object} RedactResult
289
+ * @property {string} text redacted string
290
+ * @property {LedgerRow[]} ledger ordered by rule application
291
+ * @property {ResidualHit[]} residual rule-8 second-pass hits (empty on ok)
292
+ */
293
+
294
+ /**
295
+ * Redact one string with the rules from design section 5 (eight core plus rule 9 url-credential).
296
+ * Deterministic; safe to call repeatedly; no I/O beyond the bundled
297
+ * allowlist read at module load.
298
+ *
299
+ * @param {string} input
300
+ * @param {RedactionContext} [context]
301
+ * @returns {RedactResult}
302
+ */
303
+ export function redact(input, context = {}) {
304
+ if (typeof input !== 'string') input = String(input ?? '');
305
+ const ledger = [];
306
+ let text = input;
307
+
308
+ // Rule 1: project root -> <project>. Applied first so absolute paths
309
+ // under it keep their relative tail rather than getting basename-only
310
+ // treatment from rule 2. Accepts either a single string or an array
311
+ // of spellings (typed AND realpath) so a path expressed either way
312
+ // is stripped (F-slice-2-06).
313
+ const projectRootSpellings = normaliseRootSpellings(context.projectRoot);
314
+ for (const spelling of projectRootSpellings) {
315
+ const norm = spelling.replace(/[/\\]+$/, '');
316
+ text = replaceAndLog(text, escapedLiteral(norm), '<project>', 'project-root', ledger);
317
+ }
318
+
319
+ // Rule 1.5: KV-secret early guard runs BEFORE the absolute-path
320
+ // pass. A body like `/tmp/cache password=Abc12345` was previously
321
+ // consumed by the terminal-directory extension of the path regex
322
+ // (the space plus `password` folded into the path match), so the
323
+ // `password` key label vanished into `<path>` and the kv-secret
324
+ // pass then saw a bare `=Abc12345` with no key label to bind. The
325
+ // guard redacts every `keyname=value` pair first, so the path
326
+ // sweep only sees `/tmp/cache <redacted:secret>` and cannot swallow
327
+ // the key. Round 3: R-P0-3 P0 regression from round 2.
328
+ //
329
+ // Round 4 (F-P0-A): vocabulary comes from the shared
330
+ // SECRET_KEY_VOCABULARY constant so this guard, the rule-5 first-
331
+ // pass entry and the residual-scan safeguard cover the same set.
332
+ const kvSecretGuardRe = new RegExp(
333
+ `${secretKeyRegexSource()}["'\\s]*[:=][ \\t]*(?:"(?:\\\\.|[^"\\\\\\n])+"|'(?:\\\\.|[^'\\\\\\n])+'|[^\\s,;)}\\]]+)`,
334
+ 'gi',
335
+ );
336
+ text = replaceEachDistinct(text, kvSecretGuardRe, '<redacted:secret>', 'secret-token', ledger);
337
+ // Round 4: `hash` is redacted only when the value is 16+ chars
338
+ // (design R3a). Handled as its own regex so a short `hash=abc` shape
339
+ // (public commit digest displayed for humans) does not fold.
340
+ const kvHashGuardRe = /\bhash["'\s]*[:=][ \t]*(?:"(?:\\.|[^"\\\n]){16,}"|'(?:\\.|[^'\\\n]){16,}'|[^\s,;)}\]]{16,})/gi;
341
+ text = replaceEachDistinct(text, kvHashGuardRe, '<redacted:secret>', 'secret-token', ledger);
342
+
343
+ // Rule 2: other absolute paths -> <path>/<basename>. POSIX and
344
+ // Windows shapes. Path segments allow letters, digits, dots,
345
+ // hyphens, underscores, tildes, pluses, colons, at-signs and
346
+ // spaces. A non-terminal segment carrying spaces (e.g.
347
+ // `/Users/john doe/work` or `/Users/john doe/work` with a double
348
+ // space) is accepted when it is followed by another separator, so
349
+ // any width of whitespace between tokens folds. A terminal
350
+ // (no-separator) segment accepts a space continuation of any width
351
+ // (`[ \t]+`) so `/Users/john doe` (double space) also folds; a
352
+ // sentence like `in /Users/john doe end here` still folds only
353
+ // `/Users/john doe` because the continuation is a single word,
354
+ // not the rest of the sentence (F-slice-2-06).
355
+ // Terminal-segment shape: a first word with a `.` looks like a
356
+ // filename (no space continuation - space starts a sentence again,
357
+ // as in `/foo.js line 42`); a first word without a `.` looks like
358
+ // a directory (allow one continuation - `john doe` is one dir on
359
+ // macOS). This split avoids swallowing the trailing sentence when
360
+ // the path ends in a filename.
361
+ const posixAbsRe = /(?<![A-Za-z0-9_/-])\/(?:Users|home|tmp|var|opt|private|etc|root)(?:\/(?:[A-Za-z0-9._+@~-]+(?:\s+[A-Za-z0-9._+@~-]+)*(?=\/)|[A-Za-z0-9_+@~-]+(?:[ \t]+[A-Za-z0-9._+@~-]+)?|[A-Za-z0-9._+@~-]+))+/g;
362
+ text = replaceRegex(text, posixAbsRe, (match) => {
363
+ const bn = match.split('/').filter(Boolean).pop() ?? 'file';
364
+ // A basename with a space is almost always a username directory
365
+ // (e.g. macOS `Users/First Last`); dropping the basename keeps
366
+ // the personal name off the wire (F-slice-2-06 terminal case).
367
+ if (/\s/.test(bn)) return '<path>';
368
+ return `<path>/${bn}`;
369
+ }, 'absolute-path', ledger);
370
+ const winAbsRe = /(?<![A-Za-z0-9])[A-Z]:\\(?:(?:[A-Za-z0-9._+@~-]+(?:\s+[A-Za-z0-9._+@~-]+)*(?=\\))|[A-Za-z0-9_+@~-]+(?:[ \t]+[A-Za-z0-9._+@~-]+)?|[A-Za-z0-9._+@~-]+)(?:\\(?:(?:[A-Za-z0-9._+@~-]+(?:\s+[A-Za-z0-9._+@~-]+)*(?=\\))|[A-Za-z0-9_+@~-]+(?:[ \t]+[A-Za-z0-9._+@~-]+)?|[A-Za-z0-9._+@~-]+))+/g;
371
+ text = replaceRegex(text, winAbsRe, (match) => {
372
+ const bn = match.split('\\').pop() ?? 'file';
373
+ if (/\s/.test(bn)) return '<path>';
374
+ return `<path>\\${bn}`;
375
+ }, 'absolute-path', ledger);
376
+
377
+ // Operator identity as a literal substitution happens BEFORE the
378
+ // shape-based rules 3-6 so a git remote of the form
379
+ // `git@github.com:owner/repo.git` is not first consumed by the email
380
+ // rule. The operator-name literal likewise takes precedence over
381
+ // any accidental shape overlaps. Accepts either a single remote or
382
+ // an array (F-slice-2-07: `git remote -v` yields multiple).
383
+ const gitRemotes = Array.isArray(context.gitRemote)
384
+ ? context.gitRemote
385
+ : (typeof context.gitRemote === 'string' && context.gitRemote.length > 0 ? [context.gitRemote] : []);
386
+ for (const gr of gitRemotes) {
387
+ text = replaceAndLog(text, escapedLiteral(gr), '<project-remote>', 'operator-identity', ledger);
388
+ }
389
+ if (context.operatorName) {
390
+ const opName = context.operatorName.trim();
391
+ if (opName.length > 0) {
392
+ text = replaceAndLog(text, escapedLiteral(opName), '<operator>', 'operator-identity', ledger);
393
+ for (const tok of opName.split(/\s+/)) {
394
+ if (tok.length > 3) {
395
+ text = replaceAndLog(text, `\\b${escapeRe(tok)}\\b`, '<operator>', 'operator-identity', ledger);
396
+ }
397
+ }
398
+ }
399
+ }
400
+ if (context.projectName) {
401
+ const pn = context.projectName.trim();
402
+ if (pn.length > 0) {
403
+ text = replaceAndLog(text, `\\b${escapeRe(pn)}\\b`, '<project>', 'operator-identity', ledger);
404
+ }
405
+ }
406
+
407
+ // Rule 3: emails -> <email>. RFC-5322 lite; case-insensitive.
408
+ const emailRe = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;
409
+ text = replaceRegex(text, emailRe, () => '<email>', 'email', ledger);
410
+
411
+ // Rule 4: hostnames and URLs whose registrable domain is not on the
412
+ // allowlist. URLs keep their path suffix; bare hostnames collapse.
413
+ // Loopback (localhost, 127.0.0.1) and everything on the allowlist
414
+ // survive; every other public hostname or URL loses its host.
415
+ const allowHosts = new Set([
416
+ ...BUNDLED_ALLOWLIST.hosts,
417
+ ...(Array.isArray(context.allowHosts) ? context.allowHosts : []),
418
+ ].map((h) => h.toLowerCase()));
419
+
420
+ // Rule 9: URL-embedded credentials (design amendment R3b, added
421
+ // round 4 for F-P0-B). Runs BEFORE the rule-4 hostname pass so a
422
+ // Slack/Discord webhook URL whose path IS the credential has that
423
+ // path folded to `<url-credential>` before the host itself is
424
+ // folded to `<host>` and the path suffix would otherwise leave the
425
+ // machine intact. Same for `user:pass@host` userinfo, presigned
426
+ // query tokens, and any query parameter whose name matches the
427
+ // shared secret-key vocabulary. The ledger names this rule
428
+ // `url-credential`; false positives are visible in the disclosure.
429
+ text = redactUrlCredentials(text, ledger);
430
+
431
+ // URLs first (http/https), then bare hostnames.
432
+ const urlRe = /https?:\/\/([A-Za-z0-9.-]+)((?::[0-9]+)?(?:\/[^\s)]*)?)/g;
433
+ text = replaceRegex(text, urlRe, (_m, host, tail) => {
434
+ if (isHostAllowed(host, allowHosts)) return `https://${host}${tail}`;
435
+ return `<host>${tail}`;
436
+ }, 'hostname', ledger);
437
+ // Bare hostnames: a word that looks like a domain (has a dot,
438
+ // ends with a 2+ letter TLD) and is not on the allowlist. Skip if
439
+ // preceded by @ (already handled by rule 3), a slash or backslash
440
+ // (path fragment; the winAbsRe substitution leaves `<path>\file.ext`
441
+ // which must not fold to `<host>`), a digit-dot (IP handled by
442
+ // rule 5b), or another word character (a longer host suffix).
443
+ const bareHostRe = /(?<![@/\\\w.])(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,}(?![\w.-])/g;
444
+ text = replaceRegex(text, bareHostRe, (host) => {
445
+ if (isHostAllowed(host, allowHosts)) return host;
446
+ return '<host>';
447
+ }, 'hostname', ledger);
448
+
449
+ // Rule 5: private and link-local IPs -> <ip>. Loopback survives.
450
+ // Deliberately named `private-ip` in the ledger vocabulary.
451
+ const privateIpRe = /\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3})\b/g;
452
+ text = replaceRegex(text, privateIpRe, () => '<ip>', 'private-ip', ledger);
453
+ // Any other public IPv4 outside loopback also collapses.
454
+ const publicIpRe = /\b(?!127\.)(?!0\.)(?:\d{1,3}\.){3}\d{1,3}\b/g;
455
+ text = replaceRegex(text, publicIpRe, () => '<ip>', 'private-ip', ledger);
456
+
457
+ // F-slice-2-05: IPv6 is also part of rule 4 (design 5 explicitly
458
+ // names fc00::/7). Match unique-local (fc00::/7), link-local
459
+ // (fe80::/10) and generic IPv6 shapes (including :: compression),
460
+ // but keep loopback `::1`. Runs after IPv4 so a `::ffff:10.0.0.1`
461
+ // mapped-address form still folds sensibly.
462
+ // F-slice-2-05: preserve loopback in every legal spelling - `::1`,
463
+ // the fully expanded `0:0:0:0:0:0:0:1`, and every zero-padded
464
+ // variant of it (`0000:0000:0000:0000:0000:0000:0000:0001`, etc).
465
+ // A single `::1` matcher would let the expanded forms fall through
466
+ // to the general ipv6 pattern and get redacted against design 5
467
+ // rule 4's loopback exemption.
468
+ const ipv6LoopbackRe = /(?<![0-9A-Fa-f:])(?:::1|(?:0{1,4}:){7}0{0,3}1)(?![0-9A-Fa-f:])/g;
469
+ const ipv6Re = /(?<![0-9A-Fa-f:])(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}|(?:[0-9A-Fa-f]{1,4}:){1,7}:|(?:[0-9A-Fa-f]{1,4}:){1,6}:[0-9A-Fa-f]{1,4}|(?:[0-9A-Fa-f]{1,4}:){1,5}(?::[0-9A-Fa-f]{1,4}){1,2}|(?:[0-9A-Fa-f]{1,4}:){1,4}(?::[0-9A-Fa-f]{1,4}){1,3}|(?:[0-9A-Fa-f]{1,4}:){1,3}(?::[0-9A-Fa-f]{1,4}){1,4}|(?:[0-9A-Fa-f]{1,4}:){1,2}(?::[0-9A-Fa-f]{1,4}){1,5}|[0-9A-Fa-f]{1,4}:(?::[0-9A-Fa-f]{1,4}){1,6}|:(?::[0-9A-Fa-f]{1,4}){1,7})(?![0-9A-Fa-f:])/g;
470
+ // Protect loopback markers before the general pattern runs.
471
+ const LOOPBACK_TOKEN = 'IPV6LO';
472
+ const savedLoopback = [];
473
+ text = text.replace(ipv6LoopbackRe, (m) => {
474
+ savedLoopback.push(m);
475
+ return `${LOOPBACK_TOKEN}${savedLoopback.length - 1}${LOOPBACK_TOKEN}`;
476
+ });
477
+ text = replaceRegex(text, ipv6Re, () => '<ip>', 'private-ip', ledger);
478
+ text = text.replace(new RegExp(`${LOOPBACK_TOKEN}(\\d+)${LOOPBACK_TOKEN}`, 'g'), (_m, i) => savedLoopback[Number(i)]);
479
+
480
+ // Rule 8a-early: dash normalisation runs BEFORE the rule-6 secret
481
+ // pass so em-dash-delimited shapes (e.g. `—BEGIN PRIVATE KEY—`)
482
+ // reach the secret patterns as ASCII forms. Doing this later would
483
+ // let a PEM block with em-dashes on the delimiters slip both the
484
+ // first-pass PEM regex (needs `-`) AND the residual pass because
485
+ // the residual scan runs after this normalisation - R-P0-2.
486
+ // Normalise dashes: em (—), en (–), figure (‒),
487
+ // horizontal bar (―), hyphen (‐), non-breaking hyphen
488
+ // (‑), minus sign (−). All become ASCII hyphen.
489
+ const dashRe = /[‐-―−]/g;
490
+ let dashes = 0;
491
+ text = text.replace(dashRe, () => {
492
+ dashes += 1;
493
+ return '-';
494
+ });
495
+
496
+ // Rule 6: secret-looking strings -> <redacted:secret>. This block is
497
+ // the last line of defence and rule 8's residual check re-runs it.
498
+ text = redactSecrets(text, ledger);
499
+
500
+ // Rule 8a-late: size / shape. Strip control characters; truncate to
501
+ // BODY_CAP_BYTES with an explicit marker. Dash normalisation is now
502
+ // in 8a-early above; the size-shape ledger row still totals both.
503
+ const before = text;
504
+ let ctrl = 0;
505
+ text = text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, () => {
506
+ ctrl += 1;
507
+ return '';
508
+ });
509
+ let truncated = 0;
510
+ if (Buffer.byteLength(text, 'utf8') > BODY_CAP_BYTES) {
511
+ text = truncateToBytes(text, BODY_CAP_BYTES - 32);
512
+ text = `${text}\n[truncated by rcf feedback]\n`;
513
+ truncated = 1;
514
+ }
515
+ if (ctrl > 0 || dashes > 0 || truncated > 0) {
516
+ ledger.push({
517
+ rule: 'size-shape',
518
+ before: `${before.length} chars, ${ctrl} control, ${dashes} dashes${truncated ? ', over cap' : ''}`,
519
+ after: `${text.length} chars`,
520
+ count: ctrl + dashes + truncated,
521
+ });
522
+ }
523
+
524
+ // Rule 8b: second-pass residual secret check. Any surviving match
525
+ // for the rule-5 pattern family names the failing line and lets
526
+ // `submit` refuse without sending. `preview` shows the same list so
527
+ // the agent can rewrite the body.
528
+ const residual = findResidualSecrets(text);
529
+
530
+ return { text, ledger, residual };
531
+ }
532
+
533
+ /**
534
+ * Detect residual secrets in already-redacted text. Wider than the
535
+ * first-pass `redactSecrets` set: the residual check drops the word-
536
+ * boundary anchors so a token buried inside a longer identifier
537
+ * (a shape the first pass would skip) still trips the refusal. Used
538
+ * by `preview` for the disclosure line and by `submit` (slice 4) for
539
+ * the refusal.
540
+ *
541
+ * @param {string} text
542
+ * @returns {ResidualHit[]}
543
+ */
544
+ export function findResidualSecrets(text) {
545
+ // F-slice-2-04 / R-P0-2: the residual pass runs the SAME pattern
546
+ // family the first pass used, plus the word-boundary-loosened
547
+ // token variants so a secret buried inside a longer identifier
548
+ // still trips the refusal. Scans the WHOLE text with each pattern
549
+ // (not line-by-line) so multiline shapes such as a PEM block are
550
+ // matched: a per-line loop could never see a BEGIN..END pair on
551
+ // its own line. Every rule-5 family is represented: what leaves
552
+ // the machine cannot include a shape the first pass would have
553
+ // caught even after later normalisation.
554
+ const primaries = secretPatterns();
555
+ const looseTokens = [
556
+ { name: 'github-token', re: /(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}/g },
557
+ { name: 'github-pat', re: /github_pat_[A-Za-z0-9_]{20,}/g },
558
+ { name: 'aws-access', re: /AKIA[0-9A-Z]{16}/g },
559
+ { name: 'stripe', re: /sk_(?:live|test)_[A-Za-z0-9]{20,}/g },
560
+ { name: 'openai', re: /sk-[A-Za-z0-9]{20,}/g },
561
+ { name: 'slack', re: /xox[abp]-[A-Za-z0-9-]{10,}/g },
562
+ { name: 'jwt', re: /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g },
563
+ { name: 'bearer', re: /Bearer\s+[A-Za-z0-9._~+/=-]{4,}/g },
564
+ ];
565
+ const residualPatterns = [...primaries, ...looseTokens];
566
+ /** @type {ResidualHit[]} */
567
+ const hits = [];
568
+ const seen = new Set();
569
+ // Round 3: also scan a diacritic-stripped shadow copy so a key
570
+ // label carrying a Latin-1 supplement letter (`pássword=Abc12345`,
571
+ // `sécret=X`, homoglyph variants) still trips the residual pass and
572
+ // submit refuses fail-closed. The shadow scan preserves byte
573
+ // offsets by mapping combining marks and diacritics to their base
574
+ // ASCII counterparts one codepoint at a time; every non-ASCII
575
+ // codepoint that is not a diacritic marker collapses to a single
576
+ // `_` placeholder so line and column offsets survive intact.
577
+ const shadow = stripDiacritics(text);
578
+ const scans = [
579
+ { source: text, label: '' },
580
+ ...(shadow !== text ? [{ source: shadow, label: 'unicode-key' }] : []),
581
+ ];
582
+ for (const { source, label } of scans) {
583
+ for (const { name, re } of residualPatterns) {
584
+ re.lastIndex = 0;
585
+ let m;
586
+ while ((m = re.exec(source)) !== null) {
587
+ // Line number = 1 + count of newlines before m.index. Uses
588
+ // `text` (not `source`) because the shadow preserves newline
589
+ // positions, so the raw text's line count is authoritative
590
+ // for what the operator sees on stdout.
591
+ let line = 1;
592
+ for (let i = 0; i < m.index; i += 1) {
593
+ if (text.charCodeAt(i) === 10) line += 1;
594
+ }
595
+ // Snippet is drawn from the RAW text so the operator sees the
596
+ // actual bytes at the offending line, not the placeholder.
597
+ const rawSnippet = text.slice(m.index, m.index + m[0].length);
598
+ const snippet = rawSnippet.replace(/\s+/g, ' ').slice(0, 80);
599
+ const pattern = label ? `${label}:${name}` : name;
600
+ const key = `${pattern}|${line}|${snippet}`;
601
+ if (!seen.has(key)) {
602
+ seen.add(key);
603
+ hits.push({ line, snippet, pattern });
604
+ }
605
+ // Guard against zero-width matches (defensive; no such pattern
606
+ // in the set today, but a future pattern with an optional
607
+ // group could hang the loop otherwise).
608
+ if (re.lastIndex === m.index) re.lastIndex += 1;
609
+ }
610
+ }
611
+ }
612
+ // Round 5 (design amendment R4): also scan for a vocabulary key
613
+ // labelling a value-shape token via a non-`:=` separator (markdown
614
+ // table pipe, prose bridge, whitespace, tab, hyphen, arrow, HTML
615
+ // entity). The residual pass and the primary pass share
616
+ // `scanR4Leaks` so the mixed-classes gate is the same on both
617
+ // sides: what the redactor deemed benign under R4 does not
618
+ // resurface as a refusal here.
619
+ for (const scan of scans) {
620
+ const r4Hits = scanR4Leaks(scan.source);
621
+ for (const hit of r4Hits) {
622
+ let line = 1;
623
+ for (let i = 0; i < hit.start; i += 1) {
624
+ if (text.charCodeAt(i) === 10) line += 1;
625
+ }
626
+ const rawSnippet = text.slice(hit.start, hit.end);
627
+ const snippet = rawSnippet.replace(/\s+/g, ' ').slice(0, 80);
628
+ const pattern = scan.label ? `${scan.label}:kv-secret-r4` : 'kv-secret-r4';
629
+ const key = `${pattern}|${line}|${snippet}`;
630
+ if (!seen.has(key)) {
631
+ seen.add(key);
632
+ hits.push({ line, snippet, pattern });
633
+ }
634
+ }
635
+ }
636
+ hits.sort((a, b) => a.line - b.line || a.pattern.localeCompare(b.pattern));
637
+ return hits;
638
+ }
639
+
640
+ /**
641
+ * Return a copy of `input` where every non-ASCII codepoint that carries
642
+ * a base ASCII letter (via NFKD decomposition) is folded to that letter,
643
+ * every remaining non-ASCII codepoint collapses to `_`, and every ASCII
644
+ * character passes through untouched. The output has the same length in
645
+ * codepoints as the input, so `String.prototype.replace` match indices
646
+ * carry over one-for-one for line-number arithmetic in the residual pass.
647
+ * Fail-closed: on any exception, return the input unchanged so the raw
648
+ * scan is still authoritative.
649
+ *
650
+ * @param {string} input
651
+ * @returns {string}
652
+ */
653
+ function stripDiacritics(input) {
654
+ try {
655
+ let out = '';
656
+ for (let i = 0; i < input.length; i += 1) {
657
+ const c = input.charCodeAt(i);
658
+ if (c < 128) { out += input[i]; continue; }
659
+ // Preserve UTF-16 code-unit alignment. A high surrogate plus a
660
+ // low surrogate is one non-BMP codepoint; emit two `_` so the
661
+ // shadow has the same `.length` and regex offsets carry over
662
+ // unchanged for line-number arithmetic.
663
+ if (c >= 0xD800 && c <= 0xDBFF) {
664
+ out += '__';
665
+ i += 1;
666
+ continue;
667
+ }
668
+ // BMP non-ASCII: NFKD fold to the first ASCII letter or digit
669
+ // in the decomposition (e.g. `á` -> `a` + combining acute).
670
+ // If nothing ASCII remains, collapse to `_` so the placeholder
671
+ // holds the offset without introducing pattern shapes of its own.
672
+ const decomposed = input[i].normalize('NFKD');
673
+ let picked = null;
674
+ for (const dch of decomposed) {
675
+ const cc = dch.charCodeAt(0);
676
+ if ((cc >= 48 && cc <= 57) || (cc >= 65 && cc <= 90) || (cc >= 97 && cc <= 122)) {
677
+ picked = dch;
678
+ break;
679
+ }
680
+ }
681
+ out += picked ?? '_';
682
+ }
683
+ return out;
684
+ } catch {
685
+ return input;
686
+ }
687
+ }
688
+
689
+ /**
690
+ * Merge the bundled allowlist with the per-project extension.
691
+ * Public helper so callers can preview the merged set (doctor,
692
+ * `feedback status` in slice 5) without re-implementing the merge.
693
+ *
694
+ * @param {string[]} [extend]
695
+ * @returns {string[]}
696
+ */
697
+ export function allowedHosts(extend = []) {
698
+ return [...new Set([
699
+ ...BUNDLED_ALLOWLIST.hosts,
700
+ ...(Array.isArray(extend) ? extend : []),
701
+ ].map((h) => h.toLowerCase()))];
702
+ }
703
+
704
+ /**
705
+ * Rule 9 (design amendment R3b): fold URL-embedded credentials.
706
+ * Called from `redact()` before the rule-4 hostname pass so the
707
+ * webhook path IS folded before the host would collapse and leave
708
+ * the credential-carrying tail intact. Every replacement lands on
709
+ * the ledger as one `url-credential` row per distinct before-URL
710
+ * so the operator sees exactly what was stripped.
711
+ *
712
+ * The URL regex is deliberately looser than the rule-4 hostname
713
+ * regex: it captures optional userinfo, host with optional port,
714
+ * an optional path, and an optional query. A match that leaves the
715
+ * URL unchanged (no credential detected) is treated as a no-op and
716
+ * the ledger stays clean.
717
+ *
718
+ * @param {string} input
719
+ * @param {LedgerRow[]} ledger
720
+ * @returns {string}
721
+ */
722
+ function redactUrlCredentials(input, ledger) {
723
+ // Optional userinfo (`user:pass@`), host with optional port,
724
+ // optional path (up to `?`, `#` or whitespace), optional query.
725
+ const re = /https?:\/\/(?:([^\s@/]+)@)?([A-Za-z0-9.-]+(?::[0-9]+)?)(\/[^\s?#)]*)?(\?[^\s#)]*)?/g;
726
+ const counts = new Map();
727
+ const afterFor = new Map();
728
+ const out = input.replace(re, (match, userinfo, hostAndPort, path, query) => {
729
+ const rewritten = rewriteOneUrlForCredentials(match, userinfo, hostAndPort, path, query);
730
+ if (rewritten === match) return match;
731
+ counts.set(match, (counts.get(match) ?? 0) + 1);
732
+ afterFor.set(match, rewritten);
733
+ return rewritten;
734
+ });
735
+ for (const [before, count] of counts) {
736
+ ledger.push({
737
+ rule: 'url-credential',
738
+ before,
739
+ after: afterFor.get(before) ?? '',
740
+ count,
741
+ });
742
+ }
743
+ return out;
744
+ }
745
+
746
+ /**
747
+ * Per-match URL rewriter. Extracted from `redactUrlCredentials` so the
748
+ * inner logic is straight-line and unit-testable. Returns the original
749
+ * `match` string when no credential shape was detected (caller treats
750
+ * that as a no-op and does not append a ledger row).
751
+ *
752
+ * @param {string} match
753
+ * @param {string | undefined} userinfo
754
+ * @param {string} hostAndPort
755
+ * @param {string | undefined} path
756
+ * @param {string | undefined} query
757
+ * @returns {string}
758
+ */
759
+ function rewriteOneUrlForCredentials(match, userinfo, hostAndPort, path, query) {
760
+ let credRedacted = false;
761
+ let out = match.slice(0, match.indexOf('://') + 3);
762
+
763
+ if (userinfo) {
764
+ // Drop the userinfo entirely so the rule-4 hostname pass that
765
+ // runs next still sees a well-formed URL and can fold a non-
766
+ // allowlisted host to `<host>`. Keeping a `<url-credential>@`
767
+ // marker in front of the host would leave the regex looking at
768
+ // a `<` first char and the host would leak. The ledger row for
769
+ // this URL still names `url-credential` so the operator sees
770
+ // exactly what was stripped (before -> after diff).
771
+ credRedacted = true;
772
+ }
773
+ out += hostAndPort;
774
+
775
+ let pathOut = path ?? '';
776
+ if (path) {
777
+ const hostOnly = hostAndPort.toLowerCase().split(':')[0];
778
+ let webhookHit = false;
779
+ for (const wh of WEBHOOK_HOST_PATH_PREFIXES) {
780
+ if (hostOnly === wh.host || hostOnly.endsWith(`.${wh.host}`)) {
781
+ const prefix = wh.prefix;
782
+ if (prefix === '' || path === prefix || path.startsWith(`${prefix}/`)) {
783
+ const suffix = path.slice(prefix.length);
784
+ if (suffix.length > 1) {
785
+ pathOut = `${prefix}/<url-credential>`;
786
+ credRedacted = true;
787
+ webhookHit = true;
788
+ }
789
+ break;
790
+ }
791
+ }
792
+ }
793
+ if (!webhookHit) {
794
+ const parts = path.split('/');
795
+ for (let i = 1; i < parts.length; i += 1) {
796
+ if (looksHighEntropyPath(parts[i])) {
797
+ parts[i] = '<url-credential>';
798
+ credRedacted = true;
799
+ }
800
+ }
801
+ pathOut = parts.join('/');
802
+ }
803
+ }
804
+ out += pathOut;
805
+
806
+ let queryOut = '';
807
+ if (query) {
808
+ const kvs = query.slice(1).split('&').map((pair) => {
809
+ if (!pair.includes('=')) return pair;
810
+ const eq = pair.indexOf('=');
811
+ const k = pair.slice(0, eq);
812
+ const v = pair.slice(eq + 1);
813
+ const kLower = k.toLowerCase();
814
+ if (PRESIGNED_QUERY_NAMES.has(kLower) || matchesSecretKeyLoose(k)) {
815
+ if (v.length > 0) {
816
+ credRedacted = true;
817
+ return `${k}=<url-credential>`;
818
+ }
819
+ return pair;
820
+ }
821
+ if (looksHighEntropyPath(v)) {
822
+ credRedacted = true;
823
+ return `${k}=<url-credential>`;
824
+ }
825
+ return pair;
826
+ });
827
+ queryOut = `?${kvs.join('&')}`;
828
+ }
829
+ out += queryOut;
830
+
831
+ return credRedacted ? out : match;
832
+ }
833
+
834
+ /**
835
+ * Entropy heuristic for URL path or query values: 16+ chars of the
836
+ * URL-safe alphabet with at least two character classes present. The
837
+ * webhook token `AAAAAAAAAAAAAAAAAAAAAAAA` (single class) will NOT
838
+ * trip this on its own; the webhook host-prefix rule catches it. The
839
+ * threshold is lower than the general `entropy-blob` (32) because a
840
+ * URL segment carrying a credential is usually shorter than a raw
841
+ * secret in prose.
842
+ *
843
+ * @param {string} value
844
+ */
845
+ function looksHighEntropyPath(value) {
846
+ if (typeof value !== 'string') return false;
847
+ if (value.length < 16) return false;
848
+ if (!/^[A-Za-z0-9._~+/=-]+$/.test(value)) return false;
849
+ let classes = 0;
850
+ if (/[A-Z]/.test(value)) classes += 1;
851
+ if (/[a-z]/.test(value)) classes += 1;
852
+ if (/\d/.test(value)) classes += 1;
853
+ if (/[._~+/=-]/.test(value)) classes += 1;
854
+ return classes >= 2;
855
+ }
856
+
857
+ // -- internal helpers -----------------------------------------------------
858
+
859
+ /**
860
+ * Fold a `projectRoot` context value (string, array of strings, or
861
+ * nullish) into a deduped array of spellings, longest first, so
862
+ * `/private/tmp/foo` is stripped before `/tmp/foo` would leave the
863
+ * trailing tail untouched.
864
+ *
865
+ * @param {string | string[] | null | undefined} value
866
+ * @returns {string[]}
867
+ */
868
+ function normaliseRootSpellings(value) {
869
+ if (!value) return [];
870
+ const raw = Array.isArray(value) ? value : [value];
871
+ const seen = new Set();
872
+ const out = [];
873
+ for (const s of raw) {
874
+ if (typeof s !== 'string' || s.length === 0) continue;
875
+ if (seen.has(s)) continue;
876
+ seen.add(s);
877
+ out.push(s);
878
+ }
879
+ out.sort((a, b) => b.length - a.length);
880
+ return out;
881
+ }
882
+
883
+ function replaceAndLog(text, pattern, replacement, rule, ledger) {
884
+ const re = pattern instanceof RegExp ? pattern : new RegExp(pattern, 'g');
885
+ let count = 0;
886
+ let sample = null;
887
+ const out = text.replace(re, (match) => {
888
+ count += 1;
889
+ if (sample === null) sample = match;
890
+ return typeof replacement === 'function' ? replacement(match) : replacement;
891
+ });
892
+ if (count > 0) {
893
+ ledger.push({
894
+ rule,
895
+ before: String(sample),
896
+ after: typeof replacement === 'function' ? replacement(sample) : replacement,
897
+ count,
898
+ });
899
+ }
900
+ return out;
901
+ }
902
+
903
+ function replaceRegex(text, re, replacer, rule, ledger) {
904
+ let count = 0;
905
+ let sampleBefore = null;
906
+ let sampleAfter = null;
907
+ const out = text.replace(re, (match, ...args) => {
908
+ const after = replacer(match, ...args);
909
+ if (after === match) return match;
910
+ count += 1;
911
+ if (sampleBefore === null) {
912
+ sampleBefore = match;
913
+ sampleAfter = after;
914
+ }
915
+ return after;
916
+ });
917
+ if (count > 0) {
918
+ ledger.push({ rule, before: sampleBefore, after: sampleAfter, count });
919
+ }
920
+ return out;
921
+ }
922
+
923
+ /**
924
+ * Variant of `replaceRegex` that logs ONE ledger row per distinct
925
+ * before-sample the pattern matched, not one row per pattern call.
926
+ * Two `password=A` and `password=B` hits in a single field both land
927
+ * as their own rows so the operator disclosure ledger names every
928
+ * secret that was stripped (F-slice-2-09 within-field case).
929
+ *
930
+ * @param {string} text
931
+ * @param {RegExp} re a /g flag is required
932
+ * @param {string} replacement the after text (constant)
933
+ * @param {string} rule ledger row rule name
934
+ * @param {LedgerRow[]} ledger
935
+ * @returns {string}
936
+ */
937
+ function replaceEachDistinct(text, re, replacement, rule, ledger) {
938
+ const counts = new Map();
939
+ const out = text.replace(re, (match) => {
940
+ counts.set(match, (counts.get(match) ?? 0) + 1);
941
+ return replacement;
942
+ });
943
+ for (const [before, count] of counts) {
944
+ ledger.push({ rule, before, after: replacement, count });
945
+ }
946
+ return out;
947
+ }
948
+
949
+ function escapeRe(s) {
950
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
951
+ }
952
+
953
+ function escapedLiteral(s) {
954
+ return escapeRe(s);
955
+ }
956
+
957
+ function isHostAllowed(host, allowSet) {
958
+ const h = host.toLowerCase();
959
+ if (allowSet.has(h)) return true;
960
+ // Match by registrable-domain suffix: `sub.github.com` matches
961
+ // `github.com` when the allowlist has `github.com`.
962
+ for (const allowed of allowSet) {
963
+ if (h === allowed) return true;
964
+ if (h.endsWith(`.${allowed}`)) return true;
965
+ }
966
+ return false;
967
+ }
968
+
969
+ function truncateToBytes(text, maxBytes) {
970
+ const buf = Buffer.from(text, 'utf8');
971
+ if (buf.length <= maxBytes) return text;
972
+ // Truncate at a UTF-8 boundary. Buffer.toString('utf8') on a slice
973
+ // that lands mid-codepoint would emit replacement chars; walk back
974
+ // to the last complete codepoint.
975
+ let cut = maxBytes;
976
+ while (cut > 0 && (buf[cut] & 0xc0) === 0x80) cut -= 1;
977
+ return buf.slice(0, cut).toString('utf8');
978
+ }
979
+
980
+ // Secret patterns are the closed vocabulary rule 5 (secret-token in the
981
+ // ledger) applies. Kept as a module-scope helper so `findResidualSecrets`
982
+ // runs the same set the redactor used.
983
+ //
984
+ // F-slice-2-01: `kv-secret` must catch short and quoted values too;
985
+ // any well-known key name paired with any non-empty value is a secret.
986
+ // F-slice-2-02: `authorization` matches to end of line so the header
987
+ // value AND the credential fold together.
988
+ // F-slice-2-03: `pem` matches the whole BEGIN..END block, not just
989
+ // the BEGIN delimiter, so the key payload leaves with it.
990
+ function secretPatterns() {
991
+ return [
992
+ { name: 'github-token', re: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b/g },
993
+ { name: 'github-pat', re: /\bgithub_pat_[A-Za-z0-9_]{20,}\b/g },
994
+ { name: 'aws-access', re: /\bAKIA[0-9A-Z]{16}\b/g },
995
+ { name: 'stripe', re: /\bsk_(?:live|test)_[A-Za-z0-9]{20,}\b/g },
996
+ { name: 'openai', re: /\bsk-[A-Za-z0-9]{20,}\b/g },
997
+ { name: 'slack', re: /\bxox[abp]-[A-Za-z0-9-]{10,}\b/g },
998
+ { name: 'jwt', re: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g },
999
+ // R-P0-2: broaden PEM to accept 1..5 dashes on each delimiter so a
1000
+ // block whose fences were folded by dash normalisation earlier in
1001
+ // the pass (em-dash `—BEGIN...—` -> `-BEGIN...-`) still
1002
+ // matches. The eight-rule ordering keeps this the last line of
1003
+ // defence before the residual scan.
1004
+ { name: 'pem', re: /-{1,5}BEGIN (?:[A-Z0-9 ]+ )?PRIVATE KEY-{1,5}[\s\S]*?-{1,5}END (?:[A-Z0-9 ]+ )?PRIVATE KEY-{1,5}/g },
1005
+ { name: 'bearer', re: /\bBearer\s+[A-Za-z0-9._~+/=-]{4,}/g },
1006
+ { name: 'authorization', re: /^[ \t]*authorization[ \t]*:[^\n]+/gim },
1007
+ // Well-known key names paired with ANY non-empty value are
1008
+ // secrets by convention. The value class stays permissive so
1009
+ // short and quoted values (e.g. "password": "abc") fold too.
1010
+ // R-P0-1: allow tab (and any whitespace) between key and the
1011
+ // `:` / `=` separator; the previous ["' ]* class dropped tabs
1012
+ // and let `password\t=Abc12345` slip past the redactor.
1013
+ // F-slice-2-01: quoted values with an embedded escaped quote
1014
+ // (`"ab\"cd"`) previously truncated at the first `"`; the value
1015
+ // alternatives now consume `\<any>` escape sequences too.
1016
+ // Round 4 (F-P0-A): vocabulary comes from the shared
1017
+ // SECRET_KEY_VOCABULARY constant so the first-pass, early-guard
1018
+ // and residual-scan safeguard cover the same set.
1019
+ {
1020
+ name: 'kv-secret',
1021
+ re: new RegExp(
1022
+ `${secretKeyRegexSource()}["'\\s]*[:=][ \\t]*(?:"(?:\\\\.|[^"\\\\\\n])+"|'(?:\\\\.|[^'\\\\\\n])+'|[^\\s,;)}\\]]+)`,
1023
+ 'gi',
1024
+ ),
1025
+ },
1026
+ // Round 4 (R3a): `hash` fires only when the value is 16+ chars.
1027
+ { name: 'kv-hash-long', re: /\bhash["'\s]*[:=][ \t]*(?:"(?:\\.|[^"\\\n]){16,}"|'(?:\\.|[^'\\\n]){16,}'|[^\s,;)}\]]{16,})/gi },
1028
+ // Round 4 (R3b): URL-embedded credentials caught at residual time.
1029
+ // Slack/Discord webhook path shape and userinfo shape. The first-
1030
+ // pass rule 9 handles these; this residual pattern is the belt-
1031
+ // and-braces backstop for a body that reassembled a webhook URL
1032
+ // from parts the primary scan did not treat as one URL.
1033
+ { name: 'webhook-path', re: /\/(?:services|api\/webhooks|bot)\/[A-Za-z0-9._~+/=-]{20,}/g },
1034
+ { name: 'url-userinfo', re: /https?:\/\/[^\s\/@]+:[^\s\/@]+@[A-Za-z0-9.-]+/g },
1035
+ // High-entropy blob. Anchored to non-word boundaries so it does not
1036
+ // fold with the specific patterns above; excludes 7/12/40-char
1037
+ // hex-only sha values (git object shape).
1038
+ { name: 'entropy-blob', re: /\b(?![0-9a-f]{7}\b)(?![0-9a-f]{12}\b)(?![0-9a-f]{40}\b)(?=[A-Za-z0-9_-]{32,})(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z0-9_-]{32,}\b/g },
1039
+ ];
1040
+ }
1041
+
1042
+ /**
1043
+ * Round 5 (design amendment R4): apply the R4 scanner and fold each
1044
+ * hit to `<redacted:secret>`. Ledger rows land under the canonical
1045
+ * `secret-token` rule name so operator disclosure stays consistent
1046
+ * with the primary kv-secret pass; `replaceEachDistinct` in the
1047
+ * caller-side ledger fold sums counts across identical before-samples.
1048
+ *
1049
+ * @param {string} text
1050
+ * @param {LedgerRow[]} ledger
1051
+ * @returns {string}
1052
+ */
1053
+ function redactR4Separators(text, ledger) {
1054
+ const hits = scanR4Leaks(text);
1055
+ if (hits.length === 0) return text;
1056
+ // Splice from the right so earlier indices stay valid.
1057
+ const counts = new Map();
1058
+ let out = text;
1059
+ for (let i = hits.length - 1; i >= 0; i -= 1) {
1060
+ const { start, end, match } = hits[i];
1061
+ counts.set(match, (counts.get(match) ?? 0) + 1);
1062
+ out = `${out.slice(0, start)}<redacted:secret>${out.slice(end)}`;
1063
+ }
1064
+ for (const [before, count] of counts) {
1065
+ ledger.push({ rule: 'secret-token', before, after: '<redacted:secret>', count });
1066
+ }
1067
+ return out;
1068
+ }
1069
+
1070
+ function redactSecrets(input, ledger) {
1071
+ let text = input;
1072
+ for (const { re } of secretPatterns()) {
1073
+ text = replaceEachDistinct(text, re, '<redacted:secret>', 'secret-token', ledger);
1074
+ }
1075
+ // Round 5 (design amendment R4): a vocabulary key labelling a value
1076
+ // via any separator (markdown table pipe, whitespace, tab, hyphen,
1077
+ // arrow, HTML entity, or the prose bridges is / was / set to) is a
1078
+ // secret. Runs AFTER the primary rule-5 loop so `key=value` and
1079
+ // `Authorization:` shapes already folded (canonical rule names
1080
+ // stay visible in the ledger), and AFTER the dash normalisation in
1081
+ // rule 8a-early so em-dash and other Unicode separators reach this
1082
+ // pass as ASCII hyphens. False positives are visible in the ledger
1083
+ // (design says false positives are acceptable; a labelled value
1084
+ // reaching the body is not) but the mixed-classes gate in
1085
+ // `looksLikeSecretValue` keeps ordinary prose intact.
1086
+ text = redactR4Separators(text, ledger);
1087
+ // F-slice-2-09: keep every distinct before/after pair so the
1088
+ // operator disclosure ledger shows exactly what was stripped.
1089
+ // `replaceEachDistinct` already writes one row per distinct
1090
+ // before-sample WITHIN a single pattern, so two different
1091
+ // `password=A` / `password=B` hits in the same field are two rows.
1092
+ // The fold below dedupes across DIFFERENT patterns that produced
1093
+ // the same before text (e.g. a token caught by both a specific
1094
+ // pattern and the loose entropy-blob) and sums their counts.
1095
+ const folded = [];
1096
+ for (const row of ledger) {
1097
+ if (row.rule !== 'secret-token') {
1098
+ folded.push(row);
1099
+ continue;
1100
+ }
1101
+ const twin = folded.find((r) => r.rule === 'secret-token' && r.before === row.before);
1102
+ if (twin) twin.count += row.count;
1103
+ else folded.push({ ...row });
1104
+ }
1105
+ ledger.length = 0;
1106
+ for (const r of folded) ledger.push(r);
1107
+ return text;
1108
+ }