rcf-lite 0.19.0 → 0.21.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 (263) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/bin/rcf.js +5 -0
  3. package/blueprints/application-admin-console/CHANGELOG.md +11 -0
  4. package/blueprints/application-admin-console/README.md +98 -0
  5. package/blueprints/application-admin-console/blueprint.json +226 -0
  6. package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +25 -0
  7. package/blueprints/application-admin-console/contributions/adrs/adr-2202-application-admin-console-baseline-roles.json +25 -0
  8. package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +20 -0
  9. package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +20 -0
  10. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +18 -0
  11. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +18 -0
  12. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +18 -0
  13. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +18 -0
  14. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +18 -0
  15. package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +18 -0
  16. package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +40 -0
  17. package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +44 -0
  18. package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +34 -0
  19. package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +40 -0
  20. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +34 -0
  21. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +34 -0
  22. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +34 -0
  23. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +28 -0
  24. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +34 -0
  25. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +27 -0
  26. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +27 -0
  27. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +27 -0
  28. package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +33 -0
  29. package/blueprints/application-admin-console/docs/topics.md +35 -0
  30. package/blueprints/application-admin-console/guide/application-admin-console.md +29 -0
  31. package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +182 -0
  32. package/blueprints/application-api-rest/docs/topics.md +5 -0
  33. package/blueprints/application-charts/CHANGELOG.md +12 -0
  34. package/blueprints/application-charts/README.md +73 -0
  35. package/blueprints/application-charts/blueprint.json +26 -0
  36. package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +25 -0
  37. package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +25 -0
  38. package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +25 -0
  39. package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +15 -0
  40. package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +15 -0
  41. package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +15 -0
  42. package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +15 -0
  43. package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +42 -0
  44. package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +40 -0
  45. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +35 -0
  46. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +35 -0
  47. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +35 -0
  48. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +35 -0
  49. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +35 -0
  50. package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +35 -0
  51. package/blueprints/application-charts/docs/topics.md +37 -0
  52. package/blueprints/application-charts/guide/application-charts.md +44 -0
  53. package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +191 -0
  54. package/blueprints/application-dashboard/CHANGELOG.md +10 -0
  55. package/blueprints/application-dashboard/README.md +102 -0
  56. package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +124 -0
  57. package/blueprints/application-dashboard/blueprint.json +29 -0
  58. package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +25 -0
  59. package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +25 -0
  60. package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +25 -0
  61. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +15 -0
  62. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +15 -0
  63. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +15 -0
  64. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +15 -0
  65. package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +15 -0
  66. package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +47 -0
  67. package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +41 -0
  68. package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +35 -0
  69. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +35 -0
  70. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +35 -0
  71. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +35 -0
  72. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +35 -0
  73. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +35 -0
  74. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +35 -0
  75. package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +35 -0
  76. package/blueprints/application-dashboard/docs/topics.md +43 -0
  77. package/blueprints/application-dashboard/guide/application-dashboard.md +48 -0
  78. package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +231 -0
  79. package/blueprints/application-datatable/CHANGELOG.md +8 -0
  80. package/blueprints/application-datatable/README.md +43 -0
  81. package/blueprints/application-datatable/blueprint.json +33 -0
  82. package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +25 -0
  83. package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +20 -0
  84. package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +20 -0
  85. package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +20 -0
  86. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +15 -0
  87. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +15 -0
  88. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +15 -0
  89. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +15 -0
  90. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +15 -0
  91. package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +15 -0
  92. package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +50 -0
  93. package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +39 -0
  94. package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +28 -0
  95. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +44 -0
  96. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +44 -0
  97. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +44 -0
  98. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +44 -0
  99. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +44 -0
  100. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +44 -0
  101. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +44 -0
  102. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +44 -0
  103. package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +44 -0
  104. package/blueprints/application-datatable/docs/topics.md +35 -0
  105. package/blueprints/application-datatable/guide/application-datatable.md +38 -0
  106. package/blueprints/application-datatable/probe-packs/application-datatable.pack.mjs +240 -0
  107. package/blueprints/application-error-handling/docs/topics.md +5 -0
  108. package/blueprints/application-notifications-in-app/CHANGELOG.md +9 -0
  109. package/blueprints/application-notifications-in-app/README.md +80 -0
  110. package/blueprints/application-notifications-in-app/blueprint.json +30 -0
  111. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +25 -0
  112. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json +25 -0
  113. package/blueprints/application-notifications-in-app/contributions/adrs/adr-2103-application-notifications-in-app-retention-window.json +25 -0
  114. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +15 -0
  115. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +15 -0
  116. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +15 -0
  117. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +15 -0
  118. package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +15 -0
  119. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +46 -0
  120. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +52 -0
  121. package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +40 -0
  122. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +35 -0
  123. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +35 -0
  124. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +35 -0
  125. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +35 -0
  126. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +35 -0
  127. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +26 -0
  128. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +26 -0
  129. package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +26 -0
  130. package/blueprints/application-notifications-in-app/docs/topics.md +39 -0
  131. package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +47 -0
  132. package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +328 -0
  133. package/blueprints/application-spa/docs/topics.md +5 -0
  134. package/blueprints/delivery-ci-workflows/docs/topics.md +5 -0
  135. package/blueprints/deploy-cloudflare-workers/docs/topics.md +5 -0
  136. package/blueprints/email-smtp-resend/docs/topics.md +5 -0
  137. package/blueprints/observability-essentials/docs/topics.md +5 -0
  138. package/blueprints/observability-logging/CHANGELOG.md +5 -0
  139. package/blueprints/observability-logging/README.md +1 -1
  140. package/blueprints/observability-logging/blueprint.json +113 -21
  141. package/blueprints/observability-logging/docs/topics.md +5 -0
  142. package/blueprints/observability-probe-endpoints/docs/topics.md +5 -0
  143. package/blueprints/persistence-data-d1/docs/topics.md +5 -0
  144. package/blueprints/persistence-data-sqlite/docs/topics.md +5 -0
  145. package/blueprints/security-auth-clerk/CHANGELOG.md +5 -0
  146. package/blueprints/security-auth-clerk/blueprint.json +2 -1
  147. package/blueprints/security-auth-clerk/docs/topics.md +5 -0
  148. package/blueprints/security-auth-keycloak/CHANGELOG.md +5 -0
  149. package/blueprints/security-auth-keycloak/blueprint.json +2 -1
  150. package/blueprints/security-auth-keycloak/docs/topics.md +5 -0
  151. package/blueprints/security-auth-magic-link/CHANGELOG.md +5 -0
  152. package/blueprints/security-auth-magic-link/blueprint.json +2 -1
  153. package/blueprints/security-auth-magic-link/docs/topics.md +5 -0
  154. package/blueprints/security-auth-oauth2/CHANGELOG.md +5 -0
  155. package/blueprints/security-auth-oauth2/blueprint.json +2 -1
  156. package/blueprints/security-auth-oauth2/docs/topics.md +5 -0
  157. package/blueprints/security-secrets-management/docs/topics.md +5 -0
  158. package/fixtures/canary-manifest.json +9 -9
  159. package/package.json +2 -2
  160. package/rcf/code-nodes/cn-098.json +13 -0
  161. package/rcf/code-nodes/cn-099.json +13 -0
  162. package/rcf/code-nodes/cn-100.json +13 -0
  163. package/rcf/code-nodes/cn-101.json +13 -0
  164. package/rcf/code-nodes/cn-102.json +13 -0
  165. package/rcf/code-nodes/cn-103.json +13 -0
  166. package/rcf/code-nodes/cn-104.json +13 -0
  167. package/rcf/code-nodes/cn-105.json +13 -0
  168. package/rcf/code-nodes/cn-106.json +13 -0
  169. package/rcf/code-nodes/cn-107.json +14 -0
  170. package/rcf/code-nodes/cn-108.json +13 -0
  171. package/rcf/code-nodes/cn-109.json +12 -0
  172. package/rcf/code-nodes/cn-110.json +12 -0
  173. package/rcf/code-nodes/cn-111.json +14 -0
  174. package/rcf/code-nodes/cn-112.json +14 -0
  175. package/rcf/code-nodes/cn-113.json +12 -0
  176. package/rcf/code-nodes/cn-114.json +13 -0
  177. package/rcf/code-nodes/cn-115.json +13 -0
  178. package/rcf/code-nodes/cn-116.json +12 -0
  179. package/rcf/code-nodes/cn-117.json +13 -0
  180. package/rcf/code-nodes/cn-118.json +13 -0
  181. package/rcf/code-nodes/cn-119.json +13 -0
  182. package/rcf/code-nodes/cn-120.json +13 -0
  183. package/rcf/code-nodes/cn-121.json +12 -0
  184. package/rcf/code-nodes/cn-122.json +12 -0
  185. package/rcf/code-nodes/cn-123.json +13 -0
  186. package/rcf/code-nodes/cn-124.json +13 -0
  187. package/rcf/code-nodes/cn-125.json +13 -0
  188. package/rcf/code-nodes/cn-126.json +13 -0
  189. package/rcf/code-nodes/cn-127.json +12 -0
  190. package/rcf/code-nodes/cn-128.json +14 -0
  191. package/rcf/code-nodes/cn-129.json +14 -0
  192. package/rcf/code-nodes/cn-130.json +14 -0
  193. package/rcf/code-nodes/cn-131.json +15 -0
  194. package/rcf/code-nodes/cn-132.json +12 -0
  195. package/rcf/code-nodes/cn-133.json +13 -0
  196. package/rcf/evals/eval-001.json +55 -0
  197. package/rcf/fbs/fbs-035.json +18 -0
  198. package/rcf/fbs/fbs-036.json +22 -0
  199. package/rcf/fbs/fbs-037.json +19 -0
  200. package/rcf/fbs/fbs-038.json +19 -0
  201. package/rcf/fbs/fbs-039.json +21 -0
  202. package/rcf/fbs/fbs-040.json +20 -0
  203. package/rcf/fbs/fbs-041.json +13 -0
  204. package/rcf/fbs/fbs-042.json +13 -0
  205. package/rcf/requirements/req-016.json +37 -0
  206. package/rcf/requirements/req-017.json +18 -0
  207. package/rcf/requirements/req-018.json +18 -0
  208. package/rcf/requirements/req-019.json +38 -0
  209. package/rcf/requirements/req-020.json +13 -0
  210. package/rcf/requirements/req-021.json +13 -0
  211. package/rcf/requirements/req-022.json +13 -0
  212. package/rcf/requirements/req-023.json +14 -0
  213. package/rcf/test-suites/ts-045.json +46 -0
  214. package/rcf/test-suites/ts-046.json +78 -0
  215. package/rcf/test-suites/ts-047.json +54 -0
  216. package/rcf/test-suites/ts-048.json +54 -0
  217. package/rcf/test-suites/ts-049.json +70 -0
  218. package/rcf/test-suites/ts-050.json +69 -0
  219. package/rcf/test-suites/ts-051.json +22 -0
  220. package/rcf/test-suites/ts-052.json +20 -0
  221. package/rcf/user-stories/us-1601.json +37 -0
  222. package/rcf/user-stories/us-1701.json +56 -0
  223. package/rcf/user-stories/us-1801.json +40 -0
  224. package/rcf/user-stories/us-1901.json +40 -0
  225. package/rcf/user-stories/us-2001.json +50 -0
  226. package/rcf/user-stories/us-2101.json +45 -0
  227. package/rcf/user-stories/us-2201.json +60 -0
  228. package/rcf/user-stories/us-2301.json +51 -0
  229. package/releases/releases.yaml +20 -1
  230. package/src/blueprint/apply.js +98 -1
  231. package/src/blueprint/capabilities.js +318 -0
  232. package/src/blueprint/loader.js +247 -0
  233. package/src/browser-verify/boot.js +180 -0
  234. package/src/browser-verify/index.js +13 -0
  235. package/src/browser-verify/manifest-writer.js +31 -6
  236. package/src/browser-verify/pack-browser.js +294 -0
  237. package/src/browser-verify/pack-loader.js +176 -0
  238. package/src/browser-verify/pack-runner.js +193 -0
  239. package/src/browser-verify/pack-schema.js +155 -0
  240. package/src/browser-verify/runner.js +24 -1
  241. package/src/cli/blueprint.js +92 -0
  242. package/src/cli/browser-verify.js +147 -7
  243. package/src/cli/create.js +14 -0
  244. package/src/cli/eval-coverage.js +221 -0
  245. package/src/cli/eval.js +43 -0
  246. package/src/cli/finalise.js +64 -0
  247. package/src/cli/help.js +4 -0
  248. package/src/core/errors/index.js +7 -0
  249. package/src/core/store/ids.js +5 -1
  250. package/src/core/store/init.js +4 -0
  251. package/src/core/store/loader.js +4 -0
  252. package/src/core/store/validator.js +8 -1
  253. package/src/core/store/walker.js +71 -2
  254. package/src/core/store/writer.js +4 -0
  255. package/src/eval/judge.js +338 -0
  256. package/src/finalise/index.js +8 -0
  257. package/src/finalise/ingest.js +27 -0
  258. package/src/finalise/ship-without-eval.js +123 -0
  259. package/src/query/eval-coverage.js +162 -0
  260. package/src/verify/chain/index.js +67 -0
  261. package/src/verify/cli/run.js +15 -0
  262. package/src/verify/engine/index.js +10 -0
  263. package/src/verify/verdict/index.js +46 -0
@@ -0,0 +1,56 @@
1
+ {
2
+ "createdAt": "2026-09-04T17:59:40.838Z",
3
+ "updatedAt": "2026-09-04T18:51:45.216Z",
4
+ "usId": "US-1701",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-017",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "Blueprint-shipped browser-verify probe packs load, scope to real surfaces, and gate ship on runtime failure",
10
+ "asA": "blueprint author shipping runtime-observable visual ACs alongside contributions",
11
+ "iWant": "the browser-verify runner to discover, scope and run my blueprint's probe pack, and record each check against the AC it names",
12
+ "soThat": "a runtime-observable AC that a Node build-scan cannot see (grid announcements, keyboard traversal, live-region text after a synthetic event) is compelled at ship the same way an invariant or an auth-smoke fail is compelled, and the run-4 pack-fires-on-every-FBS residual is cured at load time",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-1701-1",
16
+ "description": "The pack loader discovers `.pack.js` and `.pack.mjs` modules under `blueprints/<slug>/probe-packs/` for every applied blueprint, imports each with a dynamic ESM import, validates the exported default object against the pack schema (`packName` starts with the owning blueprint's slug and matches `^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$`, `version` semver, `blueprintSlug` matches the directory, `checks[]` non-empty with each entry carrying `id`, `severity` in {block, warn, advisory}, `description` and async `run`), and refuses at load (exit 2) with a diagnostic that names the pack path and the offending field on any violation. A valid pack registers on the run.",
17
+ "testable": true
18
+ },
19
+ {
20
+ "id": "AC-1701-2",
21
+ "description": "The applicability predicate `appliesTo({ fbs, uiBaseline, manifest })` is a required top-level field on every pack; its source (`appliesTo.toString()`) MUST reference at least one of `route`, `tacIds`, or the `blueprint:` US-tag prefix, and an unqualified predicate (a body that references none of the three, including the default `() => true`) is refused at load with exit 2 and a diagnostic that names the pack, the requirement and the three legal scoping seams. A pack whose `appliesTo` returns `false` for an FBS records `applicable: false` on the record for that FBS with a one-line reason drawn from the predicate context and no `run` function is invoked.",
22
+ "testable": true
23
+ },
24
+ {
25
+ "id": "AC-1701-3",
26
+ "description": "The loader cross-checks every `checks[].id` against the AC ids the pack's blueprint contributes through `blueprint.json:contributions[]` (reading each US contribution file and enumerating `acceptanceCriteria[].id`). A pack whose check names an AC id the blueprint does not contribute is refused at load (exit 2) with a diagnostic that names the pack, the offending check id and the AC ids the blueprint actually contributes.",
27
+ "testable": true
28
+ },
29
+ {
30
+ "id": "AC-1701-4",
31
+ "description": "The runner runs the pack pass after invariants and after auth-smoke on `agentScreenshotCritique` mode. For each applicable pack the runner invokes every check's `run({ browser, fetch, runtimeUrl, route, theme })` (browser and fetch injected by the runner), records `{ id, verdict, severity, detail? }` on the pack record, and appends the pack record to `browserVerification.probePacks[]` on the composed record. The aggregate verdict extends the existing rule: `block` on any pack check whose severity is `block` and verdict is `fail`; `warn` on any pack check whose severity is `warn` and verdict is `fail` (and no block from invariants, auth-smoke or pack); `pass` otherwise.",
32
+ "testable": true
33
+ },
34
+ {
35
+ "id": "AC-1701-5",
36
+ "description": "`rcf verify browser <fbs-id> --probe-pack <name>` restricts one run to one pack by name; a `--probe-pack` value that resolves to no discovered pack (nothing loaded under any applied blueprint's `probe-packs/` matches the name) exits 2 with a diagnostic that names the value and the packs that were discovered. When omitted, every discovered and applicable pack runs; when a pack's `appliesTo` returns false for the FBS, the pack record carries `applicable: false` and no browser check runs against it.",
37
+ "testable": true
38
+ },
39
+ {
40
+ "id": "AC-1701-6",
41
+ "description": "A pack MAY declare `preChecks[]`: an array of `{ id, description, run: async () => ({ verdict, detail? }) }` Node build-scan fast-fail checks that the runner invokes before any browser check on the same pack. A pre-check with verdict `fail` records on the pack record and every browser check that names it under `dependsOn` records verdict `skipped` with detail `skipped-by-pre-check:<preCheckId>`; browser checks with no `dependsOn` on a failing pre-check still run. Pre-check verdicts fold into the aggregate the same way pack checks do (a `fail` at `severity: block` blocks ship).",
42
+ "testable": true
43
+ },
44
+ {
45
+ "id": "AC-1701-7",
46
+ "description": "The `packBrowser` seam the runner injects into every pack check is a real headless browser provisioned through the pinned Playwright MCP server (`PLAYWRIGHT_MCP_VERSION` in `src/verify/engine/launcher.js`, spawned as `npx -y @playwright/mcp@<pin>` over stdio) via a thin in-package JSON-RPC 2.0 client (zero new npm dependencies in rcf-lite; no LLM call). Every check receives a stable API: `goto(url)`, `snapshot()` returning accessibility-tree text, `evaluate(fn, arg?)` returning a parsed value, `click(selector, hint?)`, `type(selector, text, hint?)`, `press(key)`, `screenshot(filename?)`, `close()`. When the consuming project already resolves `playwright` from its own `node_modules`, the runner MAY take that cheaper direct route and expose the identical API; the pinned MCP version remains the source of the browser otherwise. The CLI provisions the browser only when at least one applicable pack is loaded and `--no-browser` was not passed; `deps.packBrowser` on the CLI handler overrides the provisioning for tests.",
47
+ "testable": true
48
+ },
49
+ {
50
+ "id": "AC-1701-8",
51
+ "description": "A pack MAY declare a `boot: { bootCommand, waitForUrl, waitForSelector }` object. Before running the pack pass, the CLI probes the runtime URL; when it responds with any HTTP status the boot is skipped and the running server is used unchanged. When the runtime is not answering AND `boot.bootCommand` is a non-empty string, the CLI spawns `bootCommand` from the project root (Node.js child_process, cwd=projectRoot, no shell), polls `waitForUrl` at a bounded interval until a timeout, and when the URL responds runs the packs; when `waitForSelector` is set and a browser is available, the CLI navigates the browser to `waitForUrl` and polls the accessibility snapshot for a substring match on the selector until a bounded timeout (soft-failure only, packs still run). The CLI stops any process it started in reverse order after the pack pass completes (SIGTERM then SIGKILL fallback after 3s). `--no-boot` disables the fallback and forces packs to run against whatever the runtime URL currently answers. When the runtime is unreachable AND no `bootCommand` is declared, the CLI records the note and proceeds; the pack's own runtime checks then surface the failure.",
52
+ "testable": true
53
+ }
54
+ ],
55
+ "description": "As a blueprint author shipping a runtime-observable visual surface (row order after sort, live-region announcement text, focus return after dialog close, refetch on timeframe change), I want to ship a Playwright probe pack alongside my blueprint contributions and have `rcf verify browser` load and run it as a required ship gate on any FBS whose surface realises what the pack scopes, so that runtime failures refuse ship the same way invariants and auth-smoke already do, and a pack never fires on an FBS whose surface does not exist."
56
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "createdAt": "2026-09-04T20:05:20.719Z",
3
+ "updatedAt": "2026-09-04T20:05:44.478Z",
4
+ "usId": "US-1801",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-018",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "The application-datatable blueprint ships on the shelf and its probe pack refuses ship on a broken surface",
10
+ "asA": "shelf consumer applying the application-datatable v1.0.0 blueprint",
11
+ "iWant": "the shipped blueprint files, its Playwright probe pack, and a sample-app fixture proving both to load, apply and gate ship the way the T-0 runner extension expects",
12
+ "soThat": "a project consuming rcf-lite gets the datatable ACs, the pack that runs them, and a golden fixture the pack refuses on a broken surface",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-1801-1",
16
+ "description": "The shelf carries blueprints/application-datatable/blueprint.json declaring slug application-datatable, version 1.0.0, category application, and 22 contributions (6 REQs, 9 USs, 3 TACs, 4 ADRs); the suggestedCompanions array declares logging and errorHandling with reasons from the ratified spec section 5.1.",
17
+ "testable": true
18
+ },
19
+ {
20
+ "id": "AC-1801-2",
21
+ "description": "rcf define blueprint add ./blueprints/application-datatable applies the 22 contributions cleanly on a fresh init project; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
22
+ "testable": true
23
+ },
24
+ {
25
+ "id": "AC-1801-3",
26
+ "description": "The shipped probe pack blueprints/application-datatable/probe-packs/application-datatable.pack.js loads via T-0's pack-loader against a scratch project with the blueprint applied; each of its six check ids (AC-17101-1, AC-17102-1, AC-17103-2, AC-17104-3, AC-17105-1, AC-17106-1) resolves to an AC id contributed by the blueprint per T-0 AC-1701-3.",
27
+ "testable": true
28
+ },
29
+ {
30
+ "id": "AC-1801-4",
31
+ "description": "The sample-app fixture at packages/rcf-lite/test/fixtures/probe-pack-application-datatable/ ships a dependency-free Node HTTP server (server.js) with a start script; when started, its shell route realises every surface the pack's six checks probe, and running the pack against the fixture returns verdict=pass on every check (severity block, aggregate pass).",
32
+ "testable": true
33
+ },
34
+ {
35
+ "id": "AC-1801-5",
36
+ "description": "The probe pack refuses ship on a broken fixture: with the aria-live status region wrapper removed from the shell, running the pack returns verdict=fail on AC-17103-2 at severity=block and the aggregate verdict is block.",
37
+ "testable": true
38
+ }
39
+ ]
40
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "createdAt": "2026-09-04T21:08:30.292Z",
3
+ "updatedAt": "2026-09-04T21:08:30.292Z",
4
+ "asA": "shelf consumer applying the application-charts v1.0.0 blueprint",
5
+ "iWant": "the shipped blueprint files, its Playwright probe pack anchoring non-colour distinction, text-alternative table and keyboard traversal, and a sample-app fixture proving both to load, apply and gate ship the way the T-0 runner extension expects",
6
+ "soThat": "a project consuming rcf-lite gets the chart-accessibility ACs, the pack that runs them, and a golden fixture the pack refuses on a chart surface that drops the text-alternative table or the non-colour pattern.",
7
+ "acceptanceCriteria": [
8
+ {
9
+ "id": "AC-1901-1",
10
+ "description": "The shelf carries blueprints/application-charts/blueprint.json declaring slug application-charts, version 1.0.0, category application, and 15 contributions (4 REQs, 6 USs, 2 TACs, 3 ADRs); the suggestedCompanions array declares logging and errorHandling with reasons from the ratified spec section 5.2; providesRoles is absent (leaf blueprint per spec).",
11
+ "testable": true
12
+ },
13
+ {
14
+ "id": "AC-1901-2",
15
+ "description": "rcf define blueprint add ./blueprints/application-charts applies the 15 contributions cleanly on a fresh init project; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
16
+ "testable": true
17
+ },
18
+ {
19
+ "id": "AC-1901-3",
20
+ "description": "The shipped probe pack blueprints/application-charts/probe-packs/application-charts.pack.mjs loads via T-0's pack-loader against a scratch project with the blueprint applied; each of its three check ids (AC-18102-1 non-colour distinction, AC-18103-1 text-alternative table, AC-18104-1 keyboard traversal with reduced motion) resolves to an AC id contributed by the blueprint per T-0 AC-1701-3; every check carries a description field per spec section 9.",
21
+ "testable": true
22
+ },
23
+ {
24
+ "id": "AC-1901-4",
25
+ "description": "The sample-app fixture at packages/rcf-lite/test/fixtures/probe-pack-application-charts/ ships a dependency-free Node HTTP server (server.js) with a start script; when started, its chart route renders at least one bar chart and one line chart with two series each (colour plus pattern plus direct label), a visually-hidden focus-reachable table carrying the same values, keyboard-focusable data points announcing series x y unit, and a prefers-reduced-motion media rule; running the pack against the fixture returns verdict pass on every check (severity block, aggregate pass).",
26
+ "testable": true
27
+ },
28
+ {
29
+ "id": "AC-1901-5",
30
+ "description": "The probe pack refuses ship on a broken fixture: with the text-alternative table removed via the ?break=table switch, running the pack returns verdict fail on AC-18103-1 at severity block and the aggregate verdict is block; with the pattern attributes removed via the ?break=pattern switch, verdict fail on AC-18102-1 at severity block; with keyboard focus removed via the ?break=keyboard switch, verdict fail on AC-18104-1 at severity block.",
31
+ "testable": true
32
+ }
33
+ ],
34
+ "usId": "US-1901",
35
+ "prdId": "PRD-001",
36
+ "reqId": "REQ-019",
37
+ "version": "0.1.0",
38
+ "status": "draft",
39
+ "title": "The application-charts blueprint ships on the shelf and its probe pack refuses ship on a broken chart surface"
40
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "createdAt": "2026-09-04T22:10:00.000Z",
3
+ "updatedAt": "2026-09-04T22:10:00.000Z",
4
+ "usId": "US-2001",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-020",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "The application-dashboard blueprint ships on the shelf with its packaged design-guidance asset and probe pack refuses ship on a broken dashboard surface",
10
+ "asA": "shelf consumer applying the application-dashboard v1.0.0 blueprint",
11
+ "iWant": "the shipped blueprint files, the packaged design-guidance asset, the Playwright probe pack anchoring primary-KPI position, timeframe refetch fan-out and per-tile state contract, and a sample-app fixture proving the pack passes on a compliant surface and refuses on a broken one",
12
+ "soThat": "a project consuming rcf-lite gets the dashboard-shape ACs, the operator-facing design guidance the applying agent reads at ship, the pack that runs the three runtime-observable ACs, and a golden fixture the pack refuses on a surface that drops the primary-KPI placement or the timeframe fan-out or the four-state distinction",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-2001-1",
16
+ "description": "The shelf carries blueprints/application-dashboard/blueprint.json declaring slug application-dashboard, version 1.0.0, category application, and 18 contributions (5 REQs, 7 USs, 3 TACs, 3 ADRs); the suggestedCompanions array declares logging and errorHandling with reasons from the ratified spec section 5.3; providesRoles is absent (leaf blueprint per spec; the loader refuses an empty providesRoles array when set, so the leaf-blueprint intent is expressed by omitting the field).",
17
+ "testable": true
18
+ },
19
+ {
20
+ "id": "AC-2001-2",
21
+ "description": "rcf define blueprint add ./blueprints/application-dashboard applies the 18 contributions cleanly on a fresh init project; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
22
+ "testable": true
23
+ },
24
+ {
25
+ "id": "AC-2001-3",
26
+ "description": "The packaged design-guidance asset at blueprints/application-dashboard/assets/guidance/dashboard-design.md exists, carries the eight sections named in the ratified spec section 5.3.1 (primary KPI placement; tile density and count limits; timeframe and filter chrome; loading, empty and error states; colour and contrast; when a table beats a chart, delegating to application-datatable; refresh cadence and staleness; anti-patterns), and carries at least five https:// citations to the sources named in the spec (NN/g dashboard design, Few, Tufte, GOV.UK Design System patterns, WCAG 2.2 Understanding docs).",
27
+ "testable": true
28
+ },
29
+ {
30
+ "id": "AC-2001-4",
31
+ "description": "The shipped probe pack blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs loads via T-0's pack-loader against a scratch project with the blueprint applied; each of its three check ids (AC-19102-1 primary-KPI position, AC-19104-1 timeframe refetch fan-out, AC-19103-1 per-tile state contract) resolves to an AC id contributed by the blueprint per T-0 AC-1701-3; every check carries a description field per spec section 9; the pack's appliesTo predicate references the tacIds seam and binds TAC-2001-application-dashboard-tile-grid.",
32
+ "testable": true
33
+ },
34
+ {
35
+ "id": "AC-2001-5",
36
+ "description": "The sample-app fixture at packages/rcf-lite/test/fixtures/probe-pack-application-dashboard/ ships a dependency-free Node HTTP server (server.js) with a start script; when started, its dashboard route renders a tile grid with a primary KPI top-left (data attribute naming its kind from the enum), a chart region reusing the application-charts sample-app markup shape, a timeframe preset picker whose change refetches every tile with the same from/to boundary and updates an as-of ISO-8601 stamp, per-tile four states switchable by query, an export handle listing CSV/PDF/PNG, a request log exposed on window.__dashboardFetches and at /__requests, and CSS that reflows to one column at 360 with the primary KPI first. Running the pack against the fixture returns verdict pass on every check (severity block, aggregate pass).",
37
+ "testable": true
38
+ },
39
+ {
40
+ "id": "AC-2001-6",
41
+ "description": "The probe pack refuses ship on a broken fixture: with the primary KPI moved off top-left via the ?break=kpi-position switch, running the pack returns verdict fail on AC-19102-1 at severity block and the aggregate verdict is block; with the timeframe refetch fan-out drift-boundary via ?break=fanout, verdict fail on AC-19104-1 at severity block; with the aria-live and role region attributes dropped via ?break=state-aria, verdict fail on AC-19103-1 at severity block.",
42
+ "testable": true
43
+ },
44
+ {
45
+ "id": "AC-2001-7",
46
+ "description": "The pack-browser seam (packages/rcf-lite/src/browser-verify/pack-browser.js) exposes a resize(width, height) method to probe pack authors: on the MCP route the method calls the pinned Playwright MCP's browser_resize tool, on the project route it calls page.setViewportSize({ width, height }), and packs can drive the three breakpoint checks (1440/1024/360) through the new seam.",
47
+ "testable": true
48
+ }
49
+ ]
50
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "createdAt": "2026-09-04T23:59:00.000Z",
3
+ "updatedAt": "2026-09-04T23:59:00.000Z",
4
+ "usId": "US-2101",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-021",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "The application-notifications-in-app blueprint ships on the shelf and its probe pack refuses ship on a broken notifications surface",
10
+ "asA": "shelf consumer applying the application-notifications-in-app v1.0.0 blueprint",
11
+ "iWant": "the shipped blueprint files, the Playwright probe pack anchoring live-region preseeding, the transient toast contract with priority-to-role mapping and timeout floor, and the notification-centre acknowledge round-trip, plus a sample-app fixture proving the pack passes on a compliant surface and refuses on the four break switches",
12
+ "soThat": "a project consuming rcf-lite gets the in-app notifications-shape ACs, the pack that runs the three runtime-observable ACs, and a golden fixture the pack refuses on a surface that lazy-inserts the wrappers, inverts the priority-to-role mapping, dismisses toasts below the WCAG 2.2.1 floor, or drops the acknowledge POST",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-2101-1",
16
+ "description": "The shelf carries blueprints/application-notifications-in-app/blueprint.json declaring slug application-notifications-in-app, version 1.0.0, category application, and 19 contributions (5 REQs, 8 USs, 3 TACs, 3 ADRs); the suggestedCompanions array declares logging and errorHandling with reasons from the ratified spec section 5.4; providesRoles is absent (leaf blueprint per spec; the loader refuses an empty providesRoles array when set, so the leaf-blueprint intent is expressed by omitting the field).",
17
+ "testable": true
18
+ },
19
+ {
20
+ "id": "AC-2101-2",
21
+ "description": "rcf define blueprint add ./blueprints/application-notifications-in-app applies the 19 contributions cleanly on a fresh init project; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project.",
22
+ "testable": true
23
+ },
24
+ {
25
+ "id": "AC-2101-3",
26
+ "description": "The shipped probe pack blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs loads via T-0's pack-loader against a scratch project with the blueprint applied; each of its three check ids (AC-20101-1 live-region preseeding, AC-20102-1 transient toast contract, AC-20103-1 centre acknowledge round-trip) resolves to an AC id contributed by the blueprint per T-0 AC-1701-3; every check carries a description field per spec section 9; the AC-20101-1 description contains the word 'preseeded' per section 9 T-4 row; the pack's appliesTo predicate references BOTH tacIds and route (the two legal source-scan seams).",
27
+ "testable": true
28
+ },
29
+ {
30
+ "id": "AC-2101-4",
31
+ "description": "The sample-app fixture at packages/rcf-lite/test/fixtures/probe-pack-application-notifications-in-app/ ships a dependency-free Node HTTP server (server.js) with a start script; when started, its main route preseeds both live-region wrappers ([data-live-region=\"polite\"] with aria-live=polite AND [data-live-region=\"assertive\"] with role=alert), both empty at page load; the notification centre route lists a seeded backlog of notifications each carrying data-notification-id, a keyboard-reachable [data-action=\"acknowledge\"] control and a [data-action=\"mark-read\"] control, plus one [data-action=\"mark-all-read\"] control; the preferences route lists per-category silence toggles and sibling-channel digest sections disabled by default; POST /api/notifications/acknowledge round-trips and updates the seeded row's acknowledgedAt; GET /api/delivery-log returns {rows:[]} with the seeded backlog; window.__notificationFetches and /__requests mirror every client-side fetch record.",
32
+ "testable": true
33
+ },
34
+ {
35
+ "id": "AC-2101-5",
36
+ "description": "The probe pack refuses ship on each broken fixture: with ?break=preseed the wrappers are inserted lazily after the first event so AC-20101-1 fails at severity block; with ?break=role the priority-to-role mapping is inverted (error toast in polite/status, info toast in assertive/alert) so AC-20102-1 fails at severity block; with ?break=timeout the toast dismisses after two seconds and the shell root advertises a two-second floor so AC-20102-1 fails at severity block on both the shell-declared floor and the WCAG six-second floor; with ?break=ack the acknowledge click handler is a no-op so AC-20103-1 fails at severity block.",
37
+ "testable": true
38
+ },
39
+ {
40
+ "id": "AC-2101-6",
41
+ "description": "The blueprint's family-prefix reservation (application-notifications- reserved for the sibling channels -email, -push, -webhook per Baz decision 2026-09-04) is documented as a paragraph in the blueprint README AND as a row in the shelf band registry table in every applying blueprint's docs/topics.md (marked as a doc-only reservation with no shipped blueprint).",
42
+ "testable": true
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "createdAt": "2026-09-05T01:30:00.000Z",
3
+ "updatedAt": "2026-09-05T01:30:00.000Z",
4
+ "usId": "US-2201",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-022",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "The capability-declaration mechanism lands in the loader and apply verb; the four shelf auth blueprints adopt it in v1.1.0 minor bumps",
10
+ "asA": "shelf consumer applying a consumer blueprint that gates surfaces on identity or platform capabilities",
11
+ "iWant": "the blueprint loader to accept capabilities[], elicits[] and requiresAppliedCapabilities on blueprint.json with shape validation, the apply verb to discover applied capabilities by reading each applied blueprint's source blueprint.json, refuse admin-console-shaped applies with the spec 5.5.1 verbatim message when no required capability is applied and --allow-no-auth-yet is absent, prompt an elicitation phase gated by the discovered capabilities, and persist appliedCapabilities and appliedElicitations to rcf/blueprints/${slug}.applied.json; and the four shelf auth blueprints to declare capabilities[] in v1.1.0 minor bumps landing in the same PR",
12
+ "soThat": "a project applying admin-console (or any future capability-gated blueprint) gets deterministic apply-time surface configuration, a bare-SPA apply is refused with the operator-friendly message the spec ratified, custom-auth projects elicit their answers into a persistent record the console reads, and the four shelf auth blueprints announce their identity capability set in one release train per spec Q2 default",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-2201-1",
16
+ "description": "The blueprint loader accepts an optional capabilities[] top-level field on blueprint.json: when present it must be a non-empty array of lower camelCase strings on ^[a-z][a-zA-Z0-9]*$, and a malformed value refuses with a validation rcfError naming the field. LoadedBlueprint exposes capabilities[] verbatim.",
17
+ "testable": true
18
+ },
19
+ {
20
+ "id": "AC-2201-2",
21
+ "description": "The blueprint loader accepts an optional elicits[] top-level field: when present it must be a non-empty array of {id (kebab slug), prompt (non-empty operator-facing string, no em-dashes, no emojis), kind (one of enum, string, boolean), default (matching kind), options (required when kind=enum), when (optional predicate object)} entries; malformed shapes refuse with a validation rcfError naming the entry.",
22
+ "testable": true
23
+ },
24
+ {
25
+ "id": "AC-2201-3",
26
+ "description": "The blueprint loader accepts an optional requiresAppliedCapabilities top-level object: when present its capabilities[] property is a non-empty array of lower camelCase strings, allowSkipFlag is a kebab slug matching an apply-verb flag name (allow-no-auth-yet in v1), and refusalMessageId is a non-empty string; malformed shapes refuse with a validation rcfError.",
27
+ "testable": true
28
+ },
29
+ {
30
+ "id": "AC-2201-4",
31
+ "description": "applyBlueprint reads each applied blueprint's source blueprint.json (via the applied record's source field the T-2 core-companions train established) to compute the appliedCapabilities union across the project; when the loaded blueprint declares requiresAppliedCapabilities and the union has no overlap AND the CLI did not pass --allow-no-auth-yet, apply returns an rcfError kind requiresAppliedCapabilities carrying the spec 5.5.1 message body verbatim with the currently-applied blueprints list substituted, and the CLI exits 3 with that message on stderr naming security-auth-*.",
32
+ "testable": true
33
+ },
34
+ {
35
+ "id": "AC-2201-5",
36
+ "description": "When --allow-no-auth-yet is passed on the CLI and the blueprint's allowSkipFlag matches, apply proceeds and the applied-record sidecar rcf/blueprints/${slug}.applied.json is written with allowNoAuthYet: true and a notes string naming the no-auth-yet state; the manifest applied record's schema-closed fields remain untouched.",
37
+ "testable": true
38
+ },
39
+ {
40
+ "id": "AC-2201-6",
41
+ "description": "The elicitation phase reads --answer <id>=<value> repeatable arguments and --answers <file> (a JSON object mapping id to value) at apply time; every elicit entry whose when predicate resolves true against the discovered applied-capability set is prompted (on a TTY) or read from the answer bag (non-interactive) with the declared kind coerced (boolean from y/yes/n/no, enum against options, string trimmed); a missing required answer refuses with a validation rcfError naming the id.",
42
+ "testable": true
43
+ },
44
+ {
45
+ "id": "AC-2201-7",
46
+ "description": "On a clean apply, apply writes rcf/blueprints/${slug}.applied.json containing {slug, version, appliedAt, appliedCapabilities: [...], appliedElicitations: {id: value, ...}, allowNoAuthYet?: bool, notes?: string}; the sidecar is idempotent (re-apply on the same version rewrites the same file) and the manifest.blueprints[] applied record is unchanged in shape.",
47
+ "testable": true
48
+ },
49
+ {
50
+ "id": "AC-2201-8",
51
+ "description": "The four shelf auth blueprints declare capabilities[] in v1.1.0 minor bumps landing in the same PR: security-auth-magic-link 1.0.0 -> 1.1.0 capabilities: [principalDirectory]; security-auth-clerk 1.1.0 -> 1.2.0 capabilities: [principalDirectory, roleModel]; security-auth-oauth2 1.0.0 -> 1.1.0 capabilities: [principalDirectory, roleModel]; security-auth-keycloak 1.0.0 -> 1.1.0 capabilities: [principalDirectory, roleModel]. Each blueprint's CHANGELOG.md carries a new entry naming the capabilities added and citing this train (Baz Q2 default 2026-09-04, spec section 5.5.2). No other change to the four blueprints.",
52
+ "testable": true
53
+ },
54
+ {
55
+ "id": "AC-2201-9",
56
+ "description": "docs/blueprint-authoring.md section 6a extends the roles registry with the capability vocabulary table (principalDirectory, roleModel, tenancy, auditLog with meaning columns and shelf-provider(s) columns) and cross-references capabilities[] and requiresAppliedCapabilities in the loader as sibling fields to providesRoles and suggestedCompanions.",
57
+ "testable": true
58
+ }
59
+ ]
60
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "createdAt": "2026-09-05T01:30:00.000Z",
3
+ "updatedAt": "2026-09-05T01:30:00.000Z",
4
+ "usId": "US-2301",
5
+ "prdId": "PRD-001",
6
+ "reqId": "REQ-023",
7
+ "version": "0.1.0",
8
+ "status": "draft",
9
+ "title": "The application-admin-console blueprint ships on the shelf; its probe pack fires only on applied capabilities and refuses on a broken admin surface",
10
+ "asA": "shelf consumer applying the application-admin-console v1.0.0 blueprint",
11
+ "iWant": "the shipped blueprint files with a users, roles, orgs, audit-log surface set that self-configures from the applied capability declarations, the Playwright probe pack whose four checks each gate their fire on the applied capability, and a sample-app fixture proving the pack passes on a compliant surface, records applicable: false where the capability is absent, and refuses on the three break switches",
12
+ "soThat": "a project consuming rcf-lite gets a vendor-neutral admin console conditional on what identity blueprint is applied, no dead links to unapplied capabilities, the pack that proves the ARIA APG grid pattern on the permission matrix, the request-log ACs on the audit view, and a golden fixture the pack refuses on a surface that loses the grid roles, drops the request-access control, or writes an audit entry missing the correlation id",
13
+ "acceptanceCriteria": [
14
+ {
15
+ "id": "AC-2301-1",
16
+ "description": "The shelf carries blueprints/application-admin-console/blueprint.json declaring slug application-admin-console, version 1.0.0, category application, 23 contributions in the 6 REQ / 9 US / 4 TAC / 4 ADR groups per spec section 5.5; requiresAppliedCapabilities.capabilities is [principalDirectory] with allowSkipFlag: allow-no-auth-yet; elicits[] declares baselineRoles (when roleModel), tenancyShape (when tenancy), inviteTransport, and auditRetentionDays (when auditLog); suggestedCompanions declares logging and errorHandling with reasons from spec section 5.5; providesRoles is absent per spec 5.5.3.",
17
+ "testable": true
18
+ },
19
+ {
20
+ "id": "AC-2301-2",
21
+ "description": "rcf define blueprint add ./blueprints/application-admin-console --allow-no-auth-yet applies the 23 contributions cleanly on a fresh init project with only application-spa applied; rcf define validate reports the tree clean; both rcf audit coverage --strict and rcf audit eval coverage --strict exit 0 on the scratch project; the sidecar rcf/blueprints/application-admin-console.applied.json declares allowNoAuthYet: true and an appliedCapabilities: [] union.",
22
+ "testable": true
23
+ },
24
+ {
25
+ "id": "AC-2301-3",
26
+ "description": "rcf define blueprint add ./blueprints/application-admin-console on a project with only application-spa applied exits 3 with a stderr message beginning 'application-admin-console requires at least one applied security-auth-*' and naming the currently-applied blueprints; nothing is written to disk (no contributions, no sidecar, no manifest entry).",
27
+ "testable": true
28
+ },
29
+ {
30
+ "id": "AC-2301-4",
31
+ "description": "rcf define blueprint add ./blueprints/application-admin-console on a project with security-auth-magic-link 1.1.0 applied applies cleanly; the sidecar's appliedCapabilities reads exactly [principalDirectory] with no roleModel; rcf define blueprint add on a project with security-auth-clerk 1.2.0 + observability-logging applied produces appliedCapabilities [principalDirectory, roleModel, auditLog] (order-agnostic).",
32
+ "testable": true
33
+ },
34
+ {
35
+ "id": "AC-2301-5",
36
+ "description": "The shipped probe pack blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs loads via T-0's pack-loader against a scratch project with the blueprint applied; each of its four check ids (AC-21102-1, AC-21103-1, AC-21104-1, AC-21105-1) resolves to an AC id contributed by the blueprint per T-0 AC-1701-3; every check carries a description field per spec section 9; each check's appliesTo predicate reads manifest.blueprints[]/${slug}.applied.json capabilities and returns false when the required capability is absent so the check records applicable: false; the pack-level appliesTo predicate references BOTH tacIds and route.",
37
+ "testable": true
38
+ },
39
+ {
40
+ "id": "AC-2301-6",
41
+ "description": "The sample-app fixture at packages/rcf-lite/test/fixtures/probe-pack-application-admin-console/ ships a dependency-free Node HTTP server (server.js) with a start script; CAPS env or ?caps= query switch selects which surfaces exist mirroring the applied capability set (principalDirectory, roleModel, tenancy, auditLog, or comma combinations thereof); the console shell nav only links applied surfaces; the users directory table enumerates every row by data-user-id inside the role=table region; the permission matrix renders under role=grid with role=row on every rank, role=rowheader on the leftmost cell of each role rank, role=columnheader on every permission header, role=gridcell on inner cells, and each cell announces the exact permission string on focus via aria-label; the org switcher is present only when tenancy is applied; the audit-log table enumerates every row by data-audit-id and every audit entry carries actor, target, before, after, timestamp, and correlationId in inspectable columns; an access-denied route renders a request-access control routed to a POST /api/request-access endpoint; window.__adminFetches and /__requests mirror every request.",
42
+ "testable": true
43
+ },
44
+ {
45
+ "id": "AC-2301-7",
46
+ "description": "The probe pack refuses ship on each broken fixture: with ?break=matrix-grid the permission matrix drops the role=grid attributes so AC-21103-1 fails at severity block; with ?break=denied the access-denied route drops the request-access control so AC-21102-1's negative branch (a principal without admin scope) fails at severity block; with ?break=audit-fields the audit entries omit the correlationId column so AC-21105-1 fails at severity block."
47
+ ,
48
+ "testable": true
49
+ }
50
+ ]
51
+ }
@@ -40,8 +40,27 @@
40
40
  # `npm install rcf-lite`.
41
41
 
42
42
  feedVersion: 1
43
- latest: "0.19.0"
43
+ latest: "0.21.0"
44
44
  releases:
45
+ - version: "0.21.0"
46
+ date: "2026-09-05"
47
+ breaking: false
48
+ headlines:
49
+ - "rcf-lite 0.21.0 adds five visual-feature blueprints to the shelf (data table, charts, dashboard with packaged design guidance, in-app notifications, admin console) and the mechanism that proves them: a blueprint can now ship a Playwright probe pack that rcf verify runs against your running app in a real browser, and the ship gate refuses while a surface check fails."
50
+ - "The admin console only offers the surfaces your applied auth blueprint can support. Blueprints can now ask you questions at apply time."
51
+ - "The schema floor moves to rcf-schemas 0.6.1."
52
+ minAgentAction: null
53
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
54
+
55
+ - version: "0.20.0"
56
+ date: "2026-09-04"
57
+ breaking: true
58
+ headlines:
59
+ - "rcf-lite 0.20.0 adds an optional evaluation step to the chain for the acceptance criteria whose outcome cannot be checked deterministically. You mark such a criterion when you define it, attach an evaluation with its own pass threshold, and the audit, verify and finalise steps refuse to ship while it is missing, with an explicit opt-out that records its reason."
60
+ - "The schema floor moves to rcf-schemas 0.6.0."
61
+ minAgentAction: "rerun-init"
62
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
63
+
45
64
  - version: "0.19.0"
46
65
  date: "2026-09-04"
47
66
  breaking: false
@@ -20,6 +20,7 @@ import { loadBlueprint } from './loader.js';
20
20
  import { updateManifest } from './manifest-writer.js';
21
21
  import { stampId } from './namespace.js';
22
22
  import { nextResolutionId } from './resolutions.js';
23
+ import { buildRefusalMessage, discoverAppliedCapabilities, runCustomAuthCapabilityElicits, runElicitationPhase, writeSidecar } from './capabilities.js';
23
24
 
24
25
  /**
25
26
  * @typedef {object} ApplyResult
@@ -79,7 +80,7 @@ import { nextResolutionId } from './resolutions.js';
79
80
  * prove the rollback runs. Never used in production.
80
81
  * @returns {Promise<ApplyResult | import('../core/errors/index.js').RcfError>}
81
82
  */
82
- export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, effectiveSlug, libraryPrefix, libraryBands, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
83
+ export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, effectiveSlug, libraryPrefix, libraryBands, resolveDeclarations, allowNoAuthYet = false, elicitAnswers = null, customAuthReadLine = null, now = new Date(), dryRun = false, _copyFileForTest }) {
83
84
  const hintSource = typeof displaySource === 'string' && displaySource.length > 0 ? displaySource : source;
84
85
  const blueprint = await loadBlueprint(source);
85
86
  if (blueprint.kind) return blueprint; // RcfError
@@ -105,6 +106,69 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
105
106
  if (bandErr) return bandErr;
106
107
  }
107
108
 
109
+ // Capability-declaration mechanism (visual round T-5 spec 5.5).
110
+ // Discover the union of applied capabilities across every applied
111
+ // blueprint via source read-back; the applied-blueprint-record
112
+ // schema is closed (rcf-schemas 0.6.0) and does not carry a
113
+ // capabilities field, so the source blueprint.json is the ground
114
+ // truth for what each applied blueprint declares.
115
+ const discovery = await discoverAppliedCapabilities(applied, projectRoot);
116
+ const discoveredCapabilities = discovery.union;
117
+
118
+ // Custom-auth capability elicitation (visual round T-5 spec 5.5
119
+ // "Risks": custom auth elicits per capability). Fires BEFORE the
120
+ // requiresAppliedCapabilities refusal gate: providesCapability
121
+ // elicits let a project with no shelf auth blueprint declare which
122
+ // capabilities its own custom auth carries. Truthy answers fold
123
+ // into the effective applied set; that set is what the refusal gate
124
+ // and the standard elicitation phase see.
125
+ const customAuth = await runCustomAuthCapabilityElicits({
126
+ elicits: blueprint.elicits,
127
+ answers: elicitAnswers ?? {},
128
+ readLine: customAuthReadLine ?? undefined,
129
+ });
130
+ if (customAuth.kind) return customAuth; // RcfError
131
+ const appliedCapabilities = [...new Set([...discoveredCapabilities, ...customAuth.capsProvided])].sort();
132
+ const customAuthElicitations = customAuth.answered;
133
+
134
+ // Refusal gate for consumer blueprints that require at least one
135
+ // applied capability. When the effective set has no overlap AND
136
+ // the CLI did not pass the allow-skip flag AND no custom-auth
137
+ // capability answers were supplied that satisfy the gate, refuse
138
+ // with the templated message (spec 5.5.1 verbatim for admin-console).
139
+ if (blueprint.requiresAppliedCapabilities && !allowNoAuthYet) {
140
+ const required = blueprint.requiresAppliedCapabilities.capabilities;
141
+ const overlap = required.some((c) => appliedCapabilities.includes(c));
142
+ if (!overlap) {
143
+ const message = buildRefusalMessage({
144
+ slug: appliedSlug,
145
+ refusalMessageId: blueprint.requiresAppliedCapabilities.refusalMessageId,
146
+ requiredCapabilities: required,
147
+ appliedRecords: applied,
148
+ allowSkipFlag: blueprint.requiresAppliedCapabilities.allowSkipFlag,
149
+ });
150
+ return rcfError({ kind: 'requiresAppliedCapabilities', message });
151
+ }
152
+ }
153
+
154
+ // Elicitation phase (visual round T-5 spec section 5.5, T-2 gate).
155
+ // Evaluate each declared elicit against the effective capability set
156
+ // (union of applied blueprints and custom-auth answers). Skip
157
+ // providesCapability entries: those were resolved above and their
158
+ // answers already landed in customAuthElicitations. Coerce operator
159
+ // answers per kind. A missing required answer refuses before any
160
+ // write.
161
+ const regularElicits = Array.isArray(blueprint.elicits)
162
+ ? blueprint.elicits.filter((e) => typeof e.providesCapability !== 'string')
163
+ : [];
164
+ const elicitResult = runElicitationPhase({
165
+ elicits: regularElicits,
166
+ appliedCapabilities,
167
+ answers: elicitAnswers ?? {},
168
+ });
169
+ if (elicitResult.kind) return elicitResult; // RcfError
170
+ const appliedElicitations = { ...customAuthElicitations, ...elicitResult.value };
171
+
108
172
  // Pre-detection: fold operator-supplied --resolve declarations into a
109
173
  // WORKING COPY of the manifest so the detector honours them on this
110
174
  // run. The final manifest write later composes the same resolution
@@ -302,11 +366,44 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
302
366
  });
303
367
  if (manifestResult.kind) return manifestResult; // RcfError
304
368
 
369
+ // Sidecar write for the capability-declaration mechanism (visual
370
+ // round T-5 spec 5.5.1). Per-project apply-state that the applied-
371
+ // blueprint-record schema cannot carry today: the discovered
372
+ // appliedCapabilities snapshot, the elicit answers, and (when the
373
+ // gate was skipped) an allowNoAuthYet flag plus a notes string that
374
+ // rcf define validate later reads to flag ungated surfaces. The
375
+ // sidecar is written on ANY apply that carries capabilities-related
376
+ // data (declared capabilities, requiresAppliedCapabilities gate,
377
+ // elicits, or an override) so probe packs and audit tooling have
378
+ // one deterministic file to read. dryRun skips the write.
379
+ const wroteSidecar = !dryRun && (
380
+ blueprint.requiresAppliedCapabilities !== undefined ||
381
+ (Array.isArray(blueprint.elicits) && blueprint.elicits.length > 0) ||
382
+ Array.isArray(blueprint.capabilities) ||
383
+ allowNoAuthYet === true
384
+ );
385
+ let sidecarPath = null;
386
+ if (wroteSidecar) {
387
+ sidecarPath = await writeSidecar({
388
+ projectRoot,
389
+ slug: appliedSlug,
390
+ version: blueprint.version,
391
+ appliedAt: now.toISOString(),
392
+ appliedCapabilities,
393
+ appliedElicitations,
394
+ allowNoAuthYet: allowNoAuthYet === true ? true : undefined,
395
+ notes: allowNoAuthYet === true
396
+ ? `no auth yet: applied under --${blueprint.requiresAppliedCapabilities?.allowSkipFlag ?? 'allow-no-auth-yet'}; surfaces gated on ${(blueprint.requiresAppliedCapabilities?.capabilities ?? []).join(', ')} will refuse at runtime until an auth blueprint is applied.`
397
+ : undefined,
398
+ });
399
+ }
400
+
305
401
  return {
306
402
  applied: true,
307
403
  slug: appliedSlug,
308
404
  version: blueprint.version,
309
405
  contributions: writtenContributions,
406
+ ...(wroteSidecar ? { sidecarPath, appliedCapabilities, appliedElicitations } : {}),
310
407
  // Companion-suggestion mechanism (spec 2.6). Bubble the source
311
408
  // blueprint's `suggestedCompanions[]` up on the result so the CLI
312
409
  // can render the resolved-suggestion block after a successful