rcf-lite 0.21.0 → 0.23.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 (458) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/bin/rcf.js +13 -2
  3. package/blueprints/application-account-settings/CHANGELOG.md +12 -0
  4. package/blueprints/application-account-settings/README.md +114 -0
  5. package/blueprints/application-account-settings/blueprint.json +234 -0
  6. package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
  8. package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
  9. package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
  10. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
  11. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
  12. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
  13. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
  14. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
  15. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
  16. package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
  17. package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
  18. package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
  19. package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
  20. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
  21. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
  22. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
  23. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
  24. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
  25. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
  26. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
  27. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
  28. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
  29. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
  30. package/blueprints/application-account-settings/docs/topics.md +50 -0
  31. package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
  32. package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
  33. package/blueprints/application-admin-console/docs/topics.md +9 -0
  34. package/blueprints/application-api-rest/docs/topics.md +10 -1
  35. package/blueprints/application-charts/docs/topics.md +9 -0
  36. package/blueprints/application-dashboard/docs/topics.md +9 -0
  37. package/blueprints/application-datatable/docs/topics.md +9 -0
  38. package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
  39. package/blueprints/application-empty-error-states/README.md +88 -0
  40. package/blueprints/application-empty-error-states/blueprint.json +119 -0
  41. package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
  42. package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
  43. package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
  44. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
  45. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
  46. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
  47. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
  48. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
  49. package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
  50. package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
  51. package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
  52. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
  53. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
  54. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
  55. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
  56. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
  57. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
  58. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
  59. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
  60. package/blueprints/application-empty-error-states/docs/topics.md +55 -0
  61. package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
  62. package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
  63. package/blueprints/application-error-handling/docs/topics.md +9 -0
  64. package/blueprints/application-file-upload/CHANGELOG.md +9 -0
  65. package/blueprints/application-file-upload/README.md +85 -0
  66. package/blueprints/application-file-upload/blueprint.json +114 -0
  67. package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
  68. package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
  69. package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
  70. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
  71. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
  72. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
  73. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
  74. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
  75. package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
  76. package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
  77. package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
  78. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
  79. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
  80. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
  81. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
  82. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
  83. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
  84. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
  85. package/blueprints/application-file-upload/docs/topics.md +60 -0
  86. package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
  87. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
  88. package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
  89. package/blueprints/application-forms-wizard/README.md +102 -0
  90. package/blueprints/application-forms-wizard/blueprint.json +120 -0
  91. package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
  92. package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
  93. package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
  94. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
  95. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
  96. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
  97. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
  98. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
  99. package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
  100. package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
  101. package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
  102. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
  103. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
  104. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
  105. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
  106. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
  107. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
  108. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
  109. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
  110. package/blueprints/application-forms-wizard/docs/topics.md +51 -0
  111. package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
  112. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
  113. package/blueprints/application-notifications-in-app/docs/topics.md +9 -0
  114. package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
  115. package/blueprints/application-onboarding-tour/README.md +77 -0
  116. package/blueprints/application-onboarding-tour/blueprint.json +164 -0
  117. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
  118. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
  119. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
  120. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
  121. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
  122. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
  123. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
  124. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
  125. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
  126. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
  127. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
  128. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
  129. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
  130. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
  131. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
  132. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
  133. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
  134. package/blueprints/application-onboarding-tour/docs/topics.md +50 -0
  135. package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
  136. package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
  137. package/blueprints/application-spa/docs/topics.md +11 -2
  138. package/blueprints/delivery-ci-workflows/docs/topics.md +10 -1
  139. package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +69 -0
  140. package/blueprints/deploy-cloudflare-workers/README.md +12 -0
  141. package/blueprints/deploy-cloudflare-workers/blueprint.json +234 -36
  142. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +30 -0
  143. package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +207 -0
  144. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +18 -0
  145. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +18 -0
  146. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +36 -0
  147. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +27 -0
  148. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +27 -0
  149. package/blueprints/deploy-cloudflare-workers/docs/topics.md +11 -2
  150. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +25 -0
  151. package/blueprints/email-smtp-resend/docs/topics.md +10 -1
  152. package/blueprints/jobs-background/CHANGELOG.md +16 -0
  153. package/blueprints/jobs-background/README.md +105 -0
  154. package/blueprints/jobs-background/blueprint.json +149 -0
  155. package/blueprints/jobs-background/contributions/adrs/adr-3101-jobs-background-model.json +27 -0
  156. package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +25 -0
  157. package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +25 -0
  158. package/blueprints/jobs-background/contributions/adrs/adr-3104-jobs-background-timeout-floor.json +25 -0
  159. package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +95 -0
  160. package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +82 -0
  161. package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +69 -0
  162. package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +65 -0
  163. package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +91 -0
  164. package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +65 -0
  165. package/blueprints/jobs-background/contributions/probes/run-apply-time-override.mjs +10 -0
  166. package/blueprints/jobs-background/contributions/probes/run-apply-time-refusal.mjs +11 -0
  167. package/blueprints/jobs-background/contributions/probes/run-event-secrecy.mjs +11 -0
  168. package/blueprints/jobs-background/contributions/probes/run-fake-clock-cron.mjs +11 -0
  169. package/blueprints/jobs-background/contributions/probes/run-retry-and-fail.mjs +11 -0
  170. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +18 -0
  171. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +18 -0
  172. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +18 -0
  173. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +18 -0
  174. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +18 -0
  175. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +18 -0
  176. package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +50 -0
  177. package/blueprints/jobs-background/contributions/tacs/tac-3102-jobs-background-scheduler.json +50 -0
  178. package/blueprints/jobs-background/contributions/tacs/tac-3103-jobs-background-run-log.json +49 -0
  179. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +25 -0
  180. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +25 -0
  181. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +25 -0
  182. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +25 -0
  183. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +25 -0
  184. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +25 -0
  185. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +25 -0
  186. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +25 -0
  187. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +25 -0
  188. package/blueprints/jobs-background/docs/topics.md +62 -0
  189. package/blueprints/jobs-background/guide/jobs-background.md +147 -0
  190. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +15 -0
  191. package/blueprints/messaging-queue-cloudflare/README.md +125 -0
  192. package/blueprints/messaging-queue-cloudflare/blueprint.json +67 -0
  193. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +30 -0
  194. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +25 -0
  195. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3003-messaging-queue-cloudflare-max-attempts-floor.json +25 -0
  196. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3004-messaging-queue-cloudflare-batch-defaults.json +25 -0
  197. package/blueprints/messaging-queue-cloudflare/contributions/probes/event-secrecy.mjs +137 -0
  198. package/blueprints/messaging-queue-cloudflare/contributions/probes/probe-utils.mjs +82 -0
  199. package/blueprints/messaging-queue-cloudflare/contributions/probes/producer-facade-ready.mjs +35 -0
  200. package/blueprints/messaging-queue-cloudflare/contributions/probes/publish-to-delivery.mjs +94 -0
  201. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +54 -0
  202. package/blueprints/messaging-queue-cloudflare/contributions/probes/retry-and-dlq.mjs +87 -0
  203. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-event-secrecy.mjs +5 -0
  204. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-producer-facade-ready.mjs +11 -0
  205. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-publish-to-delivery.mjs +5 -0
  206. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-real-account-concurrency-smoke.mjs +5 -0
  207. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-retry-and-dlq.mjs +5 -0
  208. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +18 -0
  209. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +18 -0
  210. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +18 -0
  211. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +18 -0
  212. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +18 -0
  213. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +18 -0
  214. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3001-messaging-queue-cloudflare-producer-facade.json +56 -0
  215. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3002-messaging-queue-cloudflare-consumer-registration.json +40 -0
  216. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3003-messaging-queue-cloudflare-event-sink.json +39 -0
  217. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +34 -0
  218. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +34 -0
  219. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +25 -0
  220. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +25 -0
  221. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +25 -0
  222. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -0
  223. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -0
  224. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +25 -0
  225. package/blueprints/messaging-queue-cloudflare/docs/topics.md +62 -0
  226. package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +110 -0
  227. package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
  228. package/blueprints/object-storage-s3/README.md +108 -0
  229. package/blueprints/object-storage-s3/blueprint.json +72 -0
  230. package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
  231. package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
  232. package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
  233. package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
  234. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
  235. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
  236. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
  237. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
  238. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
  239. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
  240. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
  241. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
  242. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
  243. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
  244. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
  245. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
  246. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
  247. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
  248. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
  249. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
  250. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
  251. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
  252. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
  253. package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
  254. package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
  255. package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
  256. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
  257. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
  258. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
  259. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
  260. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
  261. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
  262. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
  263. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
  264. package/blueprints/object-storage-s3/docs/topics.md +64 -0
  265. package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
  266. package/blueprints/observability-essentials/docs/topics.md +10 -1
  267. package/blueprints/observability-logging/CHANGELOG.md +4 -0
  268. package/blueprints/observability-logging/README.md +3 -0
  269. package/blueprints/observability-logging/blueprint.json +3 -2
  270. package/blueprints/observability-logging/docs/topics.md +9 -0
  271. package/blueprints/observability-probe-endpoints/docs/topics.md +10 -1
  272. package/blueprints/persistence-data-d1/docs/topics.md +10 -1
  273. package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
  274. package/blueprints/persistence-data-postgres/README.md +101 -0
  275. package/blueprints/persistence-data-postgres/blueprint.json +80 -0
  276. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
  277. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
  278. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
  279. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
  280. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
  281. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
  282. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
  283. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
  284. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
  285. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
  286. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
  287. package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
  288. package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
  289. package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
  290. package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
  291. package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
  292. package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
  293. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
  294. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
  295. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
  296. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
  297. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
  298. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
  299. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
  300. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
  301. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
  302. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
  303. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
  304. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
  305. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
  306. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
  307. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
  308. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
  309. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
  310. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
  311. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
  312. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
  313. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
  314. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
  315. package/blueprints/persistence-data-postgres/docs/topics.md +66 -0
  316. package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
  317. package/blueprints/persistence-data-sqlite/docs/topics.md +10 -1
  318. package/blueprints/security-auth-clerk/CHANGELOG.md +4 -0
  319. package/blueprints/security-auth-clerk/README.md +3 -0
  320. package/blueprints/security-auth-clerk/blueprint.json +147 -30
  321. package/blueprints/security-auth-clerk/docs/topics.md +10 -1
  322. package/blueprints/security-auth-keycloak/CHANGELOG.md +4 -0
  323. package/blueprints/security-auth-keycloak/README.md +3 -0
  324. package/blueprints/security-auth-keycloak/blueprint.json +182 -37
  325. package/blueprints/security-auth-keycloak/docs/topics.md +10 -1
  326. package/blueprints/security-auth-magic-link/CHANGELOG.md +4 -0
  327. package/blueprints/security-auth-magic-link/README.md +3 -0
  328. package/blueprints/security-auth-magic-link/blueprint.json +159 -33
  329. package/blueprints/security-auth-magic-link/docs/topics.md +10 -1
  330. package/blueprints/security-auth-oauth2/CHANGELOG.md +4 -0
  331. package/blueprints/security-auth-oauth2/README.md +3 -0
  332. package/blueprints/security-auth-oauth2/blueprint.json +158 -32
  333. package/blueprints/security-auth-oauth2/docs/topics.md +10 -1
  334. package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
  335. package/blueprints/security-secrets-management/blueprint.json +2 -1
  336. package/blueprints/security-secrets-management/docs/topics.md +10 -1
  337. package/fixtures/canary-manifest.json +9 -9
  338. package/package.json +1 -1
  339. package/rcf/code-nodes/cn-134.json +13 -0
  340. package/rcf/code-nodes/cn-135.json +12 -0
  341. package/rcf/code-nodes/cn-136.json +13 -0
  342. package/rcf/code-nodes/cn-137.json +13 -0
  343. package/rcf/code-nodes/cn-138.json +12 -0
  344. package/rcf/code-nodes/cn-139.json +12 -0
  345. package/rcf/code-nodes/cn-140.json +13 -0
  346. package/rcf/code-nodes/cn-141.json +13 -0
  347. package/rcf/code-nodes/cn-142.json +12 -0
  348. package/rcf/code-nodes/cn-143.json +13 -0
  349. package/rcf/code-nodes/cn-144.json +13 -0
  350. package/rcf/code-nodes/cn-145.json +12 -0
  351. package/rcf/code-nodes/cn-146.json +12 -0
  352. package/rcf/code-nodes/cn-147.json +13 -0
  353. package/rcf/code-nodes/cn-148.json +13 -0
  354. package/rcf/code-nodes/cn-149.json +12 -0
  355. package/rcf/code-nodes/cn-150.json +13 -0
  356. package/rcf/code-nodes/cn-151.json +13 -0
  357. package/rcf/code-nodes/cn-152.json +12 -0
  358. package/rcf/code-nodes/cn-153.json +12 -0
  359. package/rcf/code-nodes/cn-154.json +13 -0
  360. package/rcf/code-nodes/cn-155.json +14 -0
  361. package/rcf/code-nodes/cn-156.json +13 -0
  362. package/rcf/code-nodes/cn-157.json +13 -0
  363. package/rcf/code-nodes/cn-158.json +12 -0
  364. package/rcf/code-nodes/cn-159.json +13 -0
  365. package/rcf/code-nodes/cn-160.json +12 -0
  366. package/rcf/code-nodes/cn-161.json +12 -0
  367. package/rcf/code-nodes/cn-162.json +13 -0
  368. package/rcf/code-nodes/cn-163.json +12 -0
  369. package/rcf/code-nodes/cn-164.json +13 -0
  370. package/rcf/code-nodes/cn-165.json +12 -0
  371. package/rcf/code-nodes/cn-166.json +12 -0
  372. package/rcf/code-nodes/cn-167.json +12 -0
  373. package/rcf/code-nodes/cn-168.json +12 -0
  374. package/rcf/code-nodes/cn-169.json +12 -0
  375. package/rcf/code-nodes/cn-170.json +12 -0
  376. package/rcf/code-nodes/cn-171.json +12 -0
  377. package/rcf/code-nodes/cn-172.json +12 -0
  378. package/rcf/code-nodes/cn-173.json +12 -0
  379. package/rcf/code-nodes/cn-174.json +12 -0
  380. package/rcf/code-nodes/cn-175.json +13 -0
  381. package/rcf/code-nodes/cn-176.json +12 -0
  382. package/rcf/code-nodes/cn-177.json +12 -0
  383. package/rcf/code-nodes/cn-178.json +12 -0
  384. package/rcf/code-nodes/cn-179.json +12 -0
  385. package/rcf/code-nodes/cn-180.json +13 -0
  386. package/rcf/code-nodes/cn-181.json +12 -0
  387. package/rcf/code-nodes/cn-182.json +13 -0
  388. package/rcf/code-nodes/cn-183.json +12 -0
  389. package/rcf/code-nodes/cn-184.json +13 -0
  390. package/rcf/code-nodes/cn-185.json +12 -0
  391. package/rcf/code-nodes/cn-186.json +12 -0
  392. package/rcf/code-nodes/cn-200.json +14 -0
  393. package/rcf/code-nodes/cn-201.json +13 -0
  394. package/rcf/code-nodes/cn-202.json +14 -0
  395. package/rcf/code-nodes/cn-203.json +14 -0
  396. package/rcf/code-nodes/cn-204.json +13 -0
  397. package/rcf/code-nodes/cn-205.json +14 -0
  398. package/rcf/code-nodes/cn-206.json +14 -0
  399. package/rcf/code-nodes/cn-207.json +13 -0
  400. package/rcf/code-nodes/cn-208.json +14 -0
  401. package/rcf/code-nodes/cn-209.json +14 -0
  402. package/rcf/code-nodes/cn-210.json +13 -0
  403. package/rcf/code-nodes/cn-211.json +12 -0
  404. package/rcf/code-nodes/cn-212.json +12 -0
  405. package/rcf/code-nodes/cn-213.json +12 -0
  406. package/rcf/code-nodes/cn-214.json +15 -0
  407. package/rcf/code-nodes/cn-215.json +13 -0
  408. package/rcf/code-nodes/cn-216.json +14 -0
  409. package/rcf/code-nodes/cn-217.json +13 -0
  410. package/rcf/fbs/fbs-043.json +23 -0
  411. package/rcf/fbs/fbs-044.json +23 -0
  412. package/rcf/fbs/fbs-045.json +23 -0
  413. package/rcf/fbs/fbs-046.json +24 -0
  414. package/rcf/fbs/fbs-047.json +24 -0
  415. package/rcf/fbs/fbs-060.json +22 -0
  416. package/rcf/fbs/fbs-061.json +20 -0
  417. package/rcf/fbs/fbs-062.json +20 -0
  418. package/rcf/fbs/fbs-063.json +22 -0
  419. package/rcf/fbs/fbs-064.json +23 -0
  420. package/rcf/requirements/req-024.json +69 -0
  421. package/rcf/requirements/req-025.json +59 -0
  422. package/rcf/requirements/req-026.json +154 -0
  423. package/rcf/requirements/req-027.json +33 -0
  424. package/rcf/requirements/req-028.json +13 -0
  425. package/rcf/requirements/req-029.json +57 -0
  426. package/rcf/requirements/req-030.json +67 -0
  427. package/rcf/requirements/req-040.json +13 -0
  428. package/rcf/requirements/req-041.json +125 -0
  429. package/rcf/requirements/req-042.json +59 -0
  430. package/rcf/requirements/req-043.json +39 -0
  431. package/rcf/test-suites/ts-053.json +70 -0
  432. package/rcf/test-suites/ts-054.json +70 -0
  433. package/rcf/test-suites/ts-055.json +77 -0
  434. package/rcf/test-suites/ts-056.json +78 -0
  435. package/rcf/test-suites/ts-057.json +78 -0
  436. package/rcf/test-suites/ts-070.json +62 -0
  437. package/rcf/test-suites/ts-071.json +62 -0
  438. package/rcf/test-suites/ts-072.json +62 -0
  439. package/rcf/test-suites/ts-073.json +38 -0
  440. package/rcf/test-suites/ts-074.json +30 -0
  441. package/rcf/test-suites/ts-075.json +38 -0
  442. package/rcf/test-suites/ts-076.json +70 -0
  443. package/rcf/user-stories/us-2401.json +62 -0
  444. package/rcf/user-stories/us-2501.json +58 -0
  445. package/rcf/user-stories/us-2601.json +51 -0
  446. package/rcf/user-stories/us-2701.json +55 -0
  447. package/rcf/user-stories/us-2801.json +55 -0
  448. package/rcf/user-stories/us-2901.json +45 -0
  449. package/rcf/user-stories/us-2902.json +36 -0
  450. package/rcf/user-stories/us-3001.json +45 -0
  451. package/rcf/user-stories/us-4001.json +69 -0
  452. package/rcf/user-stories/us-4101.json +69 -0
  453. package/rcf/user-stories/us-4201.json +69 -0
  454. package/rcf/user-stories/us-4301.json +78 -0
  455. package/releases/releases.yaml +21 -1
  456. package/src/blueprint/apply.js +13 -1
  457. package/src/blueprint/capabilities.js +66 -2
  458. package/src/cli/blueprint.js +15 -1
@@ -0,0 +1,233 @@
1
+ // application-forms-wizard probe pack (v1.0.0).
2
+ //
3
+ // Four surface-observable checks, one per core contract, anchored
4
+ // to the blueprint's contributed AC ids:
5
+ // AC-24101-1 task-list (per-step state from the GOV.UK vocabulary,
6
+ // ARIA progressbar wrapper)
7
+ // AC-24103-1 error-summary (top-of-page summary, skip links,
8
+ // aria-invalid on the field, focus to summary heading)
9
+ // AC-24104-1 summary-review (summary-list rows, Change links,
10
+ // answer retention across an edit-and-save round-trip)
11
+ // AC-24105-1 save-and-return (server-draft POST/GET round-trip on
12
+ // ?draft-store=server, localStorage write plus sync tick
13
+ // on ?draft-store=local; the ?draft-store=none branch
14
+ // proves the missing-transport refusal on the fixture)
15
+ //
16
+ // Every check drives the real Playwright browser the T-0 runner
17
+ // injects. URLs are composed by the withUrl(runtimeUrl, path)
18
+ // helper per the round 3 T-3 fix train; no bare string
19
+ // concatenation.
20
+ //
21
+ // Sample-app fixture:
22
+ // packages/rcf-lite/test/fixtures/probe-pack-application-forms-wizard/
23
+ // Fixture ships four routes (/task-list, /step/<n>, /summary,
24
+ // /in-progress) plus query switches (?draft-store=server|local|none,
25
+ // ?nav=linear|free, ?step=<n>) and break switches
26
+ // (?break=task-list-vocab, ?break=no-summary, ?break=no-retain,
27
+ // ?break=no-draft) so the negative runs can be driven from a
28
+ // single boot.
29
+
30
+ function withUrl(runtimeUrl, path) {
31
+ return new URL(path, runtimeUrl).toString();
32
+ }
33
+
34
+ // GOV.UK task-list vocabulary (closed enum, v1.0.0). A fifth state
35
+ // is a v1.1.0 minor bump.
36
+ const TASK_LIST_STATES = ['Cannot start yet', 'Not started', 'In progress', 'Completed'];
37
+
38
+ export default {
39
+ packName: 'application-forms-wizard',
40
+ version: '1.0.0',
41
+ blueprintSlug: 'application-forms-wizard',
42
+ // Applies to any FBS that realises the task-list TAC or whose
43
+ // navModel routes name an operator-configured wizard path.
44
+ // References BOTH tacIds AND route per the loader source-scan
45
+ // rule (T-0 AC-1701-3, cross-check with authoring standard 8c).
46
+ appliesTo: ({ fbs }) => {
47
+ const routes = fbs?.designStage?.navModel?.routes ?? [];
48
+ const tacIds = fbs?.contextRequirements?.tacIds ?? [];
49
+ if (tacIds.includes('TAC-2501-application-forms-wizard-task-list')) return true;
50
+ return routes.some((r) => typeof r?.path === 'string' && /\/(?:task-list|step|summary|in-progress|wizard)(\/|$|\?)/.test(r.path));
51
+ },
52
+ boot: { bootCommand: null, waitForUrl: null, waitForSelector: null },
53
+ checks: [
54
+ {
55
+ id: 'AC-24101-1',
56
+ severity: 'block',
57
+ description: 'task-list surface renders every step with a data-step-state from the closed GOV.UK vocabulary {Cannot start yet, Not started, In progress, Completed}, wraps them in an ARIA progressbar with aria-valuenow, aria-valuemax and aria-valuetext, and enumerates the step slugs in the manifest order (per WCAG 2.2 SC 2.4.6 Headings and Labels).',
58
+ run: async ({ browser, runtimeUrl }) => {
59
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
60
+ await browser.goto(withUrl(runtimeUrl, '/task-list'));
61
+ const dom = await browser.evaluate(() => {
62
+ const region = document.querySelector('[data-surface="task-list"]');
63
+ if (!region) return { present: false };
64
+ const progressbar = region.querySelector('[role="progressbar"]');
65
+ const rows = Array.from(region.querySelectorAll('[data-step-slug]'));
66
+ return {
67
+ present: true,
68
+ hasProgressbar: !!progressbar,
69
+ valueNow: progressbar ? progressbar.getAttribute('aria-valuenow') : null,
70
+ valueMax: progressbar ? progressbar.getAttribute('aria-valuemax') : null,
71
+ valueText: progressbar ? progressbar.getAttribute('aria-valuetext') : null,
72
+ rows: rows.map((r) => ({ slug: r.getAttribute('data-step-slug'), state: r.getAttribute('data-step-state') })),
73
+ };
74
+ });
75
+ if (!dom.present) return { verdict: 'fail', detail: 'task-list region [data-surface="task-list"] not found' };
76
+ if (!dom.hasProgressbar) return { verdict: 'fail', detail: 'task-list region missing [role="progressbar"] wrapper' };
77
+ if (!dom.valueNow || !dom.valueMax || !dom.valueText) {
78
+ return { verdict: 'fail', detail: `progressbar missing aria attributes: valuenow=${JSON.stringify(dom.valueNow)} valuemax=${JSON.stringify(dom.valueMax)} valuetext=${JSON.stringify(dom.valueText)}` };
79
+ }
80
+ if (dom.rows.length < 2) return { verdict: 'fail', detail: `task-list rows must number at least 2; got ${dom.rows.length}` };
81
+ const closedStates = ['Cannot start yet', 'Not started', 'In progress', 'Completed'];
82
+ const badRow = dom.rows.find((r) => !r.slug || !closedStates.includes(r.state));
83
+ if (badRow) return { verdict: 'fail', detail: `task-list row outside the closed GOV.UK vocabulary: ${JSON.stringify(badRow)}` };
84
+ return { verdict: 'pass', detail: `rows=${dom.rows.length} progressbar=${JSON.stringify({ now: dom.valueNow, max: dom.valueMax, text: dom.valueText })}` };
85
+ },
86
+ },
87
+ {
88
+ id: 'AC-24103-1',
89
+ severity: 'block',
90
+ description: 'On submit refusal the step renders [data-surface="error-summary"] with a heading, one anchor per failed field whose href points at the field id, every failed field carries aria-invalid="true" and aria-describedby referencing its per-field error message, and focus lands on the summary heading (per WCAG 2.2 SC 3.3.1 Error Identification and SC 3.3.3 Error Suggestion).',
91
+ run: async ({ browser, runtimeUrl }) => {
92
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
93
+ // The fixture step 2 route pre-renders the error summary shape
94
+ // on ?refused=1 so the pack can read the DOM without driving
95
+ // the submit click through the browser transport.
96
+ await browser.goto(withUrl(runtimeUrl, '/step/2?refused=1'));
97
+ const dom = await browser.evaluate(() => {
98
+ const region = document.querySelector('[data-surface="error-summary"]');
99
+ if (!region) return { present: false };
100
+ const heading = region.querySelector('h2, [role="heading"]');
101
+ const anchors = Array.from(region.querySelectorAll('a[href^="#"]'));
102
+ const anchorHrefs = anchors.map((a) => a.getAttribute('href'));
103
+ const invalidFields = Array.from(document.querySelectorAll('[aria-invalid="true"]'));
104
+ const describedFields = invalidFields.map((f) => ({
105
+ id: f.id,
106
+ describedBy: f.getAttribute('aria-describedby'),
107
+ messagePresent: f.getAttribute('aria-describedby')
108
+ ? !!document.getElementById(f.getAttribute('aria-describedby'))
109
+ : false,
110
+ }));
111
+ const activeSelector = document.activeElement
112
+ ? [document.activeElement.tagName.toLowerCase(), document.activeElement.getAttribute('data-role') || document.activeElement.id || ''].filter(Boolean).join('#')
113
+ : null;
114
+ return {
115
+ present: true,
116
+ headingText: heading ? heading.textContent.trim() : null,
117
+ anchorHrefs,
118
+ invalidFields: describedFields,
119
+ activeSelector,
120
+ activeIsHeading: !!(document.activeElement && heading && document.activeElement === heading),
121
+ };
122
+ });
123
+ if (!dom.present) return { verdict: 'fail', detail: 'error-summary region [data-surface="error-summary"] not found' };
124
+ if (!dom.headingText) return { verdict: 'fail', detail: 'error-summary region missing heading' };
125
+ if (dom.anchorHrefs.length < 1) return { verdict: 'fail', detail: 'error-summary region carries no skip links' };
126
+ if (dom.invalidFields.length < 1) return { verdict: 'fail', detail: 'no fields carry aria-invalid="true" on submit refusal' };
127
+ const unbound = dom.invalidFields.find((f) => !f.describedBy || !f.messagePresent);
128
+ if (unbound) return { verdict: 'fail', detail: `field ${JSON.stringify(unbound.id)} missing aria-describedby or its message: ${JSON.stringify(unbound)}` };
129
+ if (!dom.activeIsHeading) return { verdict: 'fail', detail: `focus did not land on the summary heading; activeSelector=${JSON.stringify(dom.activeSelector)}` };
130
+ return { verdict: 'pass', detail: `anchors=${dom.anchorHrefs.length} invalidFields=${dom.invalidFields.length} heading=${JSON.stringify(dom.headingText)}` };
131
+ },
132
+ },
133
+ {
134
+ id: 'AC-24104-1',
135
+ severity: 'block',
136
+ description: 'summary-review surface renders one [data-summary-list-section] per step with a <dl> holding [data-summary-row] entries, every row exposes a [data-recovery="change"] link, and after following one Change link and saving a new value the other rows retain their original values verbatim (per WCAG 2.2 SC 3.3.4 Error Prevention).',
137
+ run: async ({ browser, runtimeUrl }) => {
138
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
139
+ // The fixture seeds three steps of answers on ?seed=complete
140
+ // so /summary renders fully populated for the pack.
141
+ await browser.goto(withUrl(runtimeUrl, '/summary?seed=complete'));
142
+ const before = await browser.evaluate(() => {
143
+ const region = document.querySelector('[data-surface="summary-review"]');
144
+ if (!region) return { present: false };
145
+ const sections = Array.from(region.querySelectorAll('[data-summary-list-section]'));
146
+ const rows = Array.from(region.querySelectorAll('[data-summary-row]'));
147
+ const rowSnapshot = rows.map((r) => {
148
+ const dt = r.querySelector('dt');
149
+ const dd = r.querySelector('dd');
150
+ const change = r.querySelector('[data-recovery="change"]');
151
+ return {
152
+ label: dt ? dt.textContent.trim() : null,
153
+ value: dd ? dd.textContent.trim() : null,
154
+ hasChange: !!change,
155
+ slug: r.getAttribute('data-field-slug') || null,
156
+ };
157
+ });
158
+ return { present: true, sectionCount: sections.length, rows: rowSnapshot };
159
+ });
160
+ if (!before.present) return { verdict: 'fail', detail: 'summary-review region [data-surface="summary-review"] not found' };
161
+ if (before.sectionCount < 1) return { verdict: 'fail', detail: 'summary-review carries zero [data-summary-list-section] blocks' };
162
+ if (before.rows.length < 1) return { verdict: 'fail', detail: 'summary-review carries zero [data-summary-row] entries' };
163
+ const rowMissingChange = before.rows.find((r) => !r.hasChange);
164
+ if (rowMissingChange) return { verdict: 'fail', detail: `summary-review row missing [data-recovery="change"] link: ${JSON.stringify(rowMissingChange)}` };
165
+ // Drive the edit-and-save round-trip via the fixture's
166
+ // synthetic ?edit=<slug>&value=<new> query on /summary so the
167
+ // browser transport does not require a full form submit path.
168
+ const editTarget = before.rows[0];
169
+ if (!editTarget.slug) return { verdict: 'fail', detail: 'first summary row is missing [data-field-slug]; the fixture must expose the slug for the round-trip' };
170
+ const newValue = `edited-value-${Date.now()}`;
171
+ await browser.goto(withUrl(runtimeUrl, `/summary?seed=complete&edit=${encodeURIComponent(editTarget.slug)}&value=${encodeURIComponent(newValue)}`));
172
+ const after = await browser.evaluate(() => {
173
+ const region = document.querySelector('[data-surface="summary-review"]');
174
+ const rows = Array.from(region.querySelectorAll('[data-summary-row]'));
175
+ return rows.map((r) => {
176
+ const dd = r.querySelector('dd');
177
+ return {
178
+ slug: r.getAttribute('data-field-slug') || null,
179
+ value: dd ? dd.textContent.trim() : null,
180
+ };
181
+ });
182
+ });
183
+ const editedAfter = after.find((r) => r.slug === editTarget.slug);
184
+ if (!editedAfter || editedAfter.value !== newValue) {
185
+ return { verdict: 'fail', detail: `edited row did not update to the new value; expected ${JSON.stringify(newValue)}, got ${JSON.stringify(editedAfter && editedAfter.value)}` };
186
+ }
187
+ const drifted = before.rows.filter((r) => r.slug && r.slug !== editTarget.slug).find((r) => {
188
+ const afterRow = after.find((a) => a.slug === r.slug);
189
+ return !afterRow || afterRow.value !== r.value;
190
+ });
191
+ if (drifted) return { verdict: 'fail', detail: `an unedited row changed value across the edit-and-save round-trip: ${JSON.stringify(drifted)}` };
192
+ return { verdict: 'pass', detail: `sections=${before.sectionCount} rows=${before.rows.length} editedSlug=${JSON.stringify(editTarget.slug)}` };
193
+ },
194
+ },
195
+ {
196
+ id: 'AC-24105-1',
197
+ severity: 'block',
198
+ description: 'save-and-return contract ships either the server-side draft table (?draft-store=server issues POST /drafts on advance and GET /drafts returns the persisted answer) or the client-side local buffer (?draft-store=local writes to window.localStorage and renders [data-sync-tick] carrying an ISO-8601 timestamp on every write). The ?draft-store=none branch refuses at severity block (per WCAG 2.2 SC 3.3.7 Redundant Entry).',
199
+ run: async ({ browser, runtimeUrl }) => {
200
+ if (!browser) return { verdict: 'fail', detail: 'no packBrowser wired' };
201
+ // The fixture pre-drives the write on /step/1 boot so the
202
+ // pack can inspect the persisted state without simulating a
203
+ // form submit through the browser transport.
204
+ await browser.goto(withUrl(runtimeUrl, '/step/1?draft-store=server&preseed=1'));
205
+ const server = await browser.evaluate(async () => {
206
+ const res = await fetch('/drafts');
207
+ const body = res.ok ? await res.json() : null;
208
+ return { status: res.status, body };
209
+ });
210
+ if (server.status !== 200 || !server.body || typeof server.body !== 'object') {
211
+ return { verdict: 'fail', detail: `server-draft GET /drafts did not return a JSON body: status=${server.status} body=${JSON.stringify(server.body)}` };
212
+ }
213
+ const persistedFields = server.body.fields;
214
+ if (!persistedFields || Object.keys(persistedFields).length < 1) {
215
+ return { verdict: 'fail', detail: `server-draft body carries no persisted fields: ${JSON.stringify(server.body)}` };
216
+ }
217
+ await browser.goto(withUrl(runtimeUrl, '/step/1?draft-store=local&preseed=1'));
218
+ const local = await browser.evaluate(() => {
219
+ const keys = Object.keys(window.localStorage).filter((k) => k.startsWith('draft:application-forms-wizard:'));
220
+ const tick = document.querySelector('[data-sync-tick]');
221
+ return { keys, tickText: tick ? tick.getAttribute('data-sync-tick') || tick.textContent.trim() : null };
222
+ });
223
+ if (local.keys.length < 1) {
224
+ return { verdict: 'fail', detail: `client-local localStorage did not carry a namespaced draft key: keys=${JSON.stringify(local.keys)}` };
225
+ }
226
+ if (!local.tickText || !/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(local.tickText)) {
227
+ return { verdict: 'fail', detail: `client-local [data-sync-tick] missing or not ISO-8601: ${JSON.stringify(local.tickText)}` };
228
+ }
229
+ return { verdict: 'pass', detail: `serverPersistedFields=${JSON.stringify(Object.keys(persistedFields))} localKeys=${local.keys.length} tick=${JSON.stringify(local.tickText)}` };
230
+ },
231
+ },
232
+ ],
233
+ };
@@ -22,6 +22,15 @@ The `application-notifications-` prefix is reserved for the sibling channel blue
22
22
  | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
23
23
  | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
24
24
  | application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
25
+ | application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
26
+ | application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
27
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
28
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
29
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
30
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
31
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
32
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
33
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
25
34
  | application-notifications-email (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
26
35
  | application-notifications-push (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
27
36
  | application-notifications-webhook (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
@@ -0,0 +1,12 @@
1
+ # application-onboarding-tour CHANGELOG
2
+
3
+ ## 1.0.0 (visual round T-5, spec 2026-09-06 section 5.5)
4
+
5
+ - First shipped version. Introduces the tour step runner (ARIA APG dialog-modal per step, focus lifecycle, `role="dialog"`, `aria-labelledby`, `aria-describedby`, keyboard trap inside the tooltip with Escape as the exit, focus-not-obscured at 1440 and 360 breakpoints via `browser.resize`), the checklist slot (dashboard-top open collapse on `application-dashboard` applied; settings-page closed collapse when not; `<details>` browser-native for keyboard-native keyboard behaviour and screen-reader-native semantics), and the completion-state store contract (three backend shapes selected at apply time from the elicited answer or the Q4 fallback `spa-local-storage` when no persistence blueprint is applied).
6
+ - Ships six elicits: `tour-step-manifest`, `anchor-selectors`, `per-step-content-voice` (all project-owned strings the blueprint contributes the WHAT for), `dismissal-policy` (default `dismiss-permanently`), `completion-state-store` (default `spa-local-storage` per Q4), `checklist-anchor` (default derived at apply time from the applied-blueprint set).
7
+ - Ships a Playwright probe pack under `probe-packs/application-onboarding-tour.pack.mjs` with four surface-observable checks anchored to `AC-26101-1` (step-container focus and Escape), `AC-26102-1` (tooltip-as-dialog contract at two breakpoints), `AC-26103-1` (checklist-slot on both dashboard-top and settings-page anchors), and `AC-26104-1` (completion-state persistence and restart-tour re-open).
8
+ - Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-onboarding-tour/` realising the tour surface honestly across both checklist branches and multiple completion-store shapes, plus four break switches (`?break=no-role`, `?break=focus-escape`, `?break=no-collapse`, `?break=no-persist`) driving the negative runs.
9
+ - Composes on `application-spa` (routing and iconography), `application-dashboard` (dashboard-top anchor slot; settings-page fallback), `application-notifications-in-app` (polite `aria-live` completion announce), `application-account-settings` (restart-tour control home; any settings-shaped surface as fallback), and any `security-auth-*` blueprint (per-principal completion state; per-browser under a bare namespace as fallback).
10
+ - Q4 default: when no persistence blueprint is applied AND the operator does not answer `completion-state-store`, the store defaults to `spa-local-storage`. Rationale in ADR-2702 and the README's Q4 fallback section.
11
+ - Two documented mechanism-reach gaps: `AC-26105-1` first-run detection is fixture-verified via the manual boot line; `AC-26107-1` screen-reader traversal is asserted at the DOM contract level and verified manually via the fixture READMEs VoiceOver smoke. Runner cleanup rides `w-2026-09-04-dave-020`.
12
+ - No new global topics claimed. Extends the section 5 shelf id band registry with `application-onboarding-tour` at 26101 to 26899 (US) and 27xx (ADR/TAC).
@@ -0,0 +1,77 @@
1
+ # Onboarding-tour blueprint (v1.0.0)
2
+
3
+ Vendor-neutral onboarding-tour surface for an rcf-lite application. Composes on the SPA, dashboard, notifications-in-app, account-settings and any auth blueprint the project has applied, without a hard dependency on any of them: where a compose target is present the tour uses it, where it is not the tour uses the documented fallback per Q4. Ships a tour step runner mounted as an ARIA APG dialog-modal per step, a first-run checklist that renders on the dashboard shell when `application-dashboard` is applied and collapses to the settings page when not, a completion-state store with three backend shapes, and a restart-tour affordance on the settings surface. Ships a Playwright probe pack under `probe-packs/application-onboarding-tour.pack.mjs` whose four checks drive the real browser against a dependency-free sample-app fixture.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/application-onboarding-tour
9
+ ```
10
+
11
+ No `requiresAppliedCapabilities`: T-5 has no hard dependency, and the compose targets (SPA, dashboard, notifications-in-app, account-settings, any auth) are all optional. Prompts the elicitation phase for six parameters: the step manifest (3 to 5 steps with per-step anchor and content), the anchor selectors, the per-step content voice, the dismissal policy (default `dismiss-permanently`), the completion-state store shape (default `spa-local-storage`, the Q4 fallback), and the checklist anchor slot (default derived at apply time from what is applied). Writes a sidecar `rcf/blueprints/application-onboarding-tour.applied.json` capturing the answered elicits and the discovered `appliedBlueprints[]` (dashboard, notifications-in-app, account-settings, spa presence). Consumes the `logging` and `errorHandling` companions when they resolve to an applied provider or a registered library.
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version 1.0.0, category `application`, no `requiresAppliedCapabilities`, six elicits, `suggestedCompanions: [logging, errorHandling]`, 17 contributions in the 26xxx / 27xx bands |
18
+ | Doc set | `contributions/` | 4 REQs, 7 USs (7 runtime-observable ACs; two documented mechanism-reach gaps on AC-26105-1 and AC-26107-1), 3 TACs, 3 ADRs |
19
+ | Probe pack | `probe-packs/application-onboarding-tour.pack.mjs` | Four surface-observable browser-verify checks anchored to AC-26101-1 step-container focus, AC-26102-1 tooltip-as-dialog, AC-26103-1 checklist-slot, AC-26104-1 completion-state persistence |
20
+ | Guide | `guide/application-onboarding-tour.md` | Operator-facing: when to reach, when not, mechanism-reach gaps, ARIA APG dialog-modal pattern and WCAG SCs the tour honours |
21
+ | Coordination vocabulary | `docs/topics.md` | Shelf id band registry update; no new global topics claimed; cross-references to `application-dashboard`, `application-notifications-in-app`, `application-account-settings`, `application-spa` |
22
+ | Sample-app fixture | `packages/rcf-lite/test/fixtures/probe-pack-application-onboarding-tour/` | Dependency-free Node HTTP server the pack is probed against on the shelf gate |
23
+
24
+ ## Composition: what the tour reaches when
25
+
26
+ | Applied blueprint | Effect on the tour |
27
+ |---|---|
28
+ | `application-spa` applied | Routing (`/tour`, `/dashboard`, `/settings`), iconography, theming carry through. Absent: the tour still renders but the project supplies the routing shell. |
29
+ | `application-dashboard` applied | Checklist anchor defaults to `dashboard-top` inside a `<details open>` element on the dashboard shell. Absent: checklist anchor defaults to `settings-page` inside a `<details>` (closed) element on the settings surface, per ADR-2703 and AC-26103-1. |
30
+ | `application-notifications-in-app` applied | Tour completion emits a polite `aria-live` announcement through the notifications-in-app live region. Absent: the completion is silent at the announce layer (the step runner still logs one line if a `logging` companion resolves). |
31
+ | `application-account-settings` applied | Restart-tour control lives inside the account settings surface. Absent: the restart-tour control renders on any settings-shaped surface the project supplies (`/settings`, `/account`, `/account/settings`). |
32
+ | Any `security-auth-*` applied | Completion state persists per principal identifier (the sidecar carries the principal namespace at apply). Absent: completion state persists per browser under a bare namespace; the tour behaves as a single-principal experience. |
33
+
34
+ ## Q4 fallback: completion-state store shape
35
+
36
+ Q4 of the ratified spec (section 10) settles the completion-state fallback. When no persistence blueprint is applied AND the operator does not answer `completion-state-store` explicitly, the store defaults to `spa-local-storage`: a per-browser record so a returning principal on the same browser is not re-onboarded, and a different browser is re-onboarded. Rationale: a per-session tour that re-plays on every new session is worse than a one-time tour that persists across sessions on that browser; per the elicit surface, the operator can override to `spa-session-storage` (per-session refresh) or `server-side-per-principal` (cross-device; requires an applied persistence blueprint).
37
+
38
+ ## Standards trace
39
+
40
+ - ARIA APG dialog-modal pattern: `role="dialog"`, `aria-labelledby` on the step heading, `aria-describedby` on the step body, focus moves to the tooltip on open, focus returns to the anchor on close. `AC-26102-1`, `AC-26107-1`.
41
+ - WCAG 2.2 AA 2.1.1 Keyboard: every tour control activatable with the keyboard. `AC-26101-1`.
42
+ - WCAG 2.2 AA 2.1.2 No Keyboard Trap: Escape always exits, focus never permanently trapped. `AC-26101-1`.
43
+ - WCAG 2.2 AA 2.4.3 Focus Order: Tab reaches every tour control in DOM order inside the tooltip. `AC-26101-1`.
44
+ - WCAG 2.2 AA 2.4.11 Focus Not Obscured Minimum: tooltip visible at the 1440 wide and 360 narrow breakpoints (probed via `browser.resize`). `AC-26102-1`.
45
+
46
+ Spec `standardsTrace` empty at the blueprint level; each ADR contribution carries a non-null `standardsTraceClause` per authoring section 8a.4 (the sentinel `generic enterprise practice` used where no SC applies).
47
+
48
+ ## Known mechanism-reach gaps
49
+
50
+ - `AC-26105-1` (first-run detection): the runner cannot fully prove the first-run vs returning-principal branch in one browser session without a persisted state seed; the pack drives the first-run branch via `?first-run=1` and the returning branch is verified by the fixture READMEs manual boot line (walk `/tour` twice, confirm the tour auto-opens on run 1 and does not on run 2).
51
+ - `AC-26107-1` (screen-reader traversal): the pack asserts the DOM contract (`aria-labelledby`, `aria-describedby`) but does not drive a real screen reader in CI. The fixture README names the manual VoiceOver smoke. Runner cleanup rides `w-2026-09-04-dave-020`.
52
+ - `AC-26106-1` (restart-tour clears state and re-opens): fully exercised inside the AC-26104-1 pack check end-to-end (the check clicks restart, then navigates to `/tour` and asserts the tooltip re-appears).
53
+
54
+ ## Elicited parameters
55
+
56
+ - `tour-step-manifest` (string; project-owned): the ordered list of 3 to 5 steps with per-step anchor, heading and body slot.
57
+ - `anchor-selectors` (string; project-owned): the CSS selectors the runner resolves at step-open time.
58
+ - `per-step-content-voice` (string; project-owned): the copy for each step.
59
+ - `dismissal-policy` (enum: `dismiss-permanently` | `dismiss-until-next-major` | `dismiss-until-next-minor`; default `dismiss-permanently`).
60
+ - `completion-state-store` (enum: `spa-local-storage` | `spa-session-storage` | `server-side-per-principal`; default `spa-local-storage` per Q4).
61
+ - `checklist-anchor` (enum: `dashboard-top` | `settings-page` | `custom-anchor`; default derived at apply time from what is applied).
62
+
63
+ ## Suggested companions
64
+
65
+ - `logging`: every step transition and tour completion writes one request-scoped log line with the correlation identifier.
66
+ - `errorHandling`: a completion-state persistence failure constructs an internal error record.
67
+
68
+ ## Probe pack
69
+
70
+ `probe-packs/application-onboarding-tour.pack.mjs` ships four surface-observable checks anchored to blueprint AC ids:
71
+
72
+ - `AC-26101-1` step-container focus lifecycle and Escape.
73
+ - `AC-26102-1` tooltip-as-dialog contract at 1440 and 360 breakpoints (via `browser.resize`).
74
+ - `AC-26103-1` checklist slot on both dashboard-top (open) and settings-page (closed) branches.
75
+ - `AC-26104-1` completion-state persistence and restart-tour re-open.
76
+
77
+ The pack applies to any FBS binding `TAC-2701-application-onboarding-tour-step-runner` or whose `navModel` routes match the operator-configured tour-anchor path glob (`/tour`, `/welcome`, `/getting-started`, `/onboarding`). Every URL string is composed through the `withUrl(runtimeUrl, path)` helper (no bare string concatenation).
@@ -0,0 +1,164 @@
1
+ {
2
+ "slug": "application-onboarding-tour",
3
+ "version": "1.0.0",
4
+ "category": "application",
5
+ "elicits": [
6
+ {
7
+ "id": "tour-step-manifest",
8
+ "prompt": "Tour step manifest: an ordered list of 3 to 5 steps, each with an anchor selector (CSS) and a content voice slot the project fills. Names each step id, anchor, heading and body.",
9
+ "kind": "string",
10
+ "default": ""
11
+ },
12
+ {
13
+ "id": "anchor-selectors",
14
+ "prompt": "Anchor selectors: CSS selectors the runtime resolves at step-open time to place the tooltip. One per manifest step.",
15
+ "kind": "string",
16
+ "default": ""
17
+ },
18
+ {
19
+ "id": "per-step-content-voice",
20
+ "prompt": "Per-step content voice: the project-owned copy for each step (heading and body). The blueprint contributes the WHAT, not the words.",
21
+ "kind": "string",
22
+ "default": ""
23
+ },
24
+ {
25
+ "id": "dismissal-policy",
26
+ "prompt": "Dismissal policy: dismiss-permanently (the tour never re-opens for a returning principal), dismiss-until-next-major (re-opens on a major version bump of the applied blueprint set), or dismiss-until-next-minor (re-opens on a minor bump). Recommended default: dismiss-permanently.",
27
+ "kind": "enum",
28
+ "options": [
29
+ "dismiss-permanently",
30
+ "dismiss-until-next-major",
31
+ "dismiss-until-next-minor"
32
+ ],
33
+ "default": "dismiss-permanently"
34
+ },
35
+ {
36
+ "id": "completion-state-store",
37
+ "prompt": "Completion-state store shape: spa-local-storage (per-browser, the Q4 fallback when no persistence blueprint is applied), spa-session-storage (per-session, re-plays on every new session), or server-side-per-principal (follows the principal across devices; requires an applied persistence blueprint). Recommended default: spa-local-storage.",
38
+ "kind": "enum",
39
+ "options": [
40
+ "spa-local-storage",
41
+ "spa-session-storage",
42
+ "server-side-per-principal"
43
+ ],
44
+ "default": "spa-local-storage"
45
+ },
46
+ {
47
+ "id": "checklist-anchor",
48
+ "prompt": "Checklist anchor slot: dashboard-top (renders on the dashboard shell when application-dashboard is applied), settings-page (renders on the settings surface when application-account-settings is applied or on any settings surface as a fallback), or custom-anchor (the project supplies a CSS selector). Default derived at apply time from what is applied.",
49
+ "kind": "enum",
50
+ "options": [
51
+ "dashboard-top",
52
+ "settings-page",
53
+ "custom-anchor"
54
+ ],
55
+ "default": "dashboard-top"
56
+ }
57
+ ],
58
+ "suggestedCompanions": [
59
+ {
60
+ "role": "logging",
61
+ "reason": "Every step transition and tour completion writes one request-scoped log line with the correlation identifier; a logging companion supplies the factory."
62
+ },
63
+ {
64
+ "role": "errorHandling",
65
+ "reason": "A completion-state persistence failure constructs an internal error record; an error-handling companion supplies the record factory and the boundary."
66
+ }
67
+ ],
68
+ "contributions": [
69
+ {
70
+ "id": "application-onboarding-tour-REQ-001",
71
+ "kind": "req",
72
+ "path": "requirements/application-onboarding-tour-req-001.json"
73
+ },
74
+ {
75
+ "id": "application-onboarding-tour-REQ-002",
76
+ "kind": "req",
77
+ "path": "requirements/application-onboarding-tour-req-002.json"
78
+ },
79
+ {
80
+ "id": "application-onboarding-tour-REQ-003",
81
+ "kind": "req",
82
+ "path": "requirements/application-onboarding-tour-req-003.json"
83
+ },
84
+ {
85
+ "id": "application-onboarding-tour-REQ-004",
86
+ "kind": "req",
87
+ "path": "requirements/application-onboarding-tour-req-004.json"
88
+ },
89
+ {
90
+ "id": "application-onboarding-tour-US-26101",
91
+ "kind": "us",
92
+ "path": "user-stories/application-onboarding-tour-us-26101.json"
93
+ },
94
+ {
95
+ "id": "application-onboarding-tour-US-26102",
96
+ "kind": "us",
97
+ "path": "user-stories/application-onboarding-tour-us-26102.json"
98
+ },
99
+ {
100
+ "id": "application-onboarding-tour-US-26103",
101
+ "kind": "us",
102
+ "path": "user-stories/application-onboarding-tour-us-26103.json"
103
+ },
104
+ {
105
+ "id": "application-onboarding-tour-US-26104",
106
+ "kind": "us",
107
+ "path": "user-stories/application-onboarding-tour-us-26104.json"
108
+ },
109
+ {
110
+ "id": "application-onboarding-tour-US-26105",
111
+ "kind": "us",
112
+ "path": "user-stories/application-onboarding-tour-us-26105.json"
113
+ },
114
+ {
115
+ "id": "application-onboarding-tour-US-26106",
116
+ "kind": "us",
117
+ "path": "user-stories/application-onboarding-tour-us-26106.json"
118
+ },
119
+ {
120
+ "id": "application-onboarding-tour-US-26107",
121
+ "kind": "us",
122
+ "path": "user-stories/application-onboarding-tour-us-26107.json"
123
+ },
124
+ {
125
+ "id": "TAC-2701-application-onboarding-tour-step-runner",
126
+ "kind": "tac",
127
+ "path": "tacs/tac-2701-application-onboarding-tour-step-runner.json"
128
+ },
129
+ {
130
+ "id": "TAC-2702-application-onboarding-tour-checklist-slot",
131
+ "kind": "tac",
132
+ "path": "tacs/tac-2702-application-onboarding-tour-checklist-slot.json"
133
+ },
134
+ {
135
+ "id": "TAC-2703-application-onboarding-tour-completion-store",
136
+ "kind": "tac",
137
+ "path": "tacs/tac-2703-application-onboarding-tour-completion-store.json"
138
+ },
139
+ {
140
+ "id": "ADR-2701-application-onboarding-tour-dismissal-policy",
141
+ "kind": "adr",
142
+ "path": "adrs/adr-2701-application-onboarding-tour-dismissal-policy.json",
143
+ "recommendedDefault": true,
144
+ "elicited": true,
145
+ "standardsTraceClause": "generic enterprise practice"
146
+ },
147
+ {
148
+ "id": "ADR-2702-application-onboarding-tour-completion-store-shape",
149
+ "kind": "adr",
150
+ "path": "adrs/adr-2702-application-onboarding-tour-completion-store-shape.json",
151
+ "recommendedDefault": true,
152
+ "elicited": true,
153
+ "standardsTraceClause": "generic enterprise practice"
154
+ },
155
+ {
156
+ "id": "ADR-2703-application-onboarding-tour-checklist-anchor",
157
+ "kind": "adr",
158
+ "path": "adrs/adr-2703-application-onboarding-tour-checklist-anchor.json",
159
+ "recommendedDefault": true,
160
+ "elicited": true,
161
+ "standardsTraceClause": "generic enterprise practice"
162
+ }
163
+ ]
164
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-2701-application-onboarding-tour-dismissal-policy",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Dismissal policy: dismiss-permanently default, dismiss-until-next-major or dismiss-until-next-minor",
8
+ "context": "A dismissed tour has three legal re-open behaviours. Dismiss-permanently is the least intrusive: a principal who dismissed the tour once never sees it again unless the restart-tour control fires. Dismiss-until-next-major re-opens the tour when the applied blueprint set makes a major-version bump (a new tour surface a returning principal has not seen). Dismiss-until-next-minor re-opens on a minor bump for the same reason at higher frequency. The spec section 5.5 names all three; the recommended default is dismiss-permanently because a returning principal who dismissed the tour deliberately signalled that they do not want re-onboarding, and the restart-tour control on the settings surface remains available.",
9
+ "decision": "dismissal-policy is elicited (enum: dismiss-permanently | dismiss-until-next-major | dismiss-until-next-minor). Recommended default: dismiss-permanently. The step runner honours the answer by comparing the CompletionRecord.blueprintSetVersion against the current applied blueprint set version at principal load: dismiss-permanently never re-opens; dismiss-until-next-major re-opens when the major differs; dismiss-until-next-minor re-opens when the major or the minor differs. A blueprintSetVersion mismatch always renders the checklist on the resolved anchor even when the tour does not auto-open.",
10
+ "consequences": "A returning principal in the dismiss-permanently branch is not re-onboarded on any bump; a project that adds a major surface (a new admin console, a new billing area) can prompt returning principals through a restart-tour affordance on the release note surface rather than an intrusive re-open. A project that opts into dismiss-until-next-major or dismiss-until-next-minor accepts the interruption for the benefit of re-onboarding on shipped changes; the CompletionRecord.stepIds field lets the step runner skip already-seen steps when a re-open fires.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Alternative approach considered",
14
+ "summary": "A time-based re-open (re-open after 30 days) was considered but time-based re-opens do not correlate with actual product changes; a returning principal on a stable product would be re-onboarded on nothing. Version-based re-opens correlate with real surface changes and let the operator choose the frequency.",
15
+ "reasonNotChosen": "See the decision text; the chosen shape composes cleanly with the applied blueprint set the spec section 5.5 names."
16
+ }
17
+ ],
18
+ "createdAt": "2026-09-06T23:15:00Z",
19
+ "updatedAt": "2026-09-06T23:15:00Z"
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-2702-application-onboarding-tour-completion-store-shape",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Completion-state store shape: spa-local-storage default (Q4 fallback), spa-session-storage or server-side-per-principal",
8
+ "context": "The completion state needs a store. Three shapes are legal. spa-local-storage keeps the completion state per browser and per principal identifier; a returning principal on the same browser is not re-onboarded, and a different browser (or a private window) is re-onboarded. spa-session-storage keeps the completion state per session and re-plays the tour on every new session; useful only for a project that deliberately wants a per-session refresher. server-side-per-principal keeps the completion state on the principals record so it follows the user across devices; requires an applied persistence blueprint and the projects own writer adapter. The spec section 5.5 and section 10 Q4 ratify spa-local-storage as the fallback when no persistence blueprint is applied because a per-session tour that re-plays on every new session is worse than a one-time tour that persists across sessions on that browser.",
9
+ "decision": "completion-state-store is elicited (enum: spa-local-storage | spa-session-storage | server-side-per-principal). Recommended default: spa-local-storage. At apply time the elicit surface offers all three; a project that answers server-side-per-principal without an applied persistence blueprint hits a documented refusal (the elicit's when predicate refuses per the mechanism minor T-5 does not extend; the refusal is enforced at the surface load by TAC-2703 which refuses to construct a server-side backend without a resolved persistence adapter and falls back to spa-local-storage with a documented note on the sidecar).",
10
+ "consequences": "A project with no persistence blueprint applied gets the spa-local-storage backend automatically per the Q4 fallback; a project with a persistence blueprint and the server-side-per-principal answer gets a cross-device tour completion; a project answering spa-session-storage accepts a per-session re-onboarding. The dismiss-until-next-major and dismiss-until-next-minor policies (ADR-2701) still work under any of the three shapes because the CompletionRecord.blueprintSetVersion travels with the record.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Alternative approach considered",
14
+ "summary": "spa-session-storage as the default was considered but re-onboarding on every new session is intrusive on a stable product; the Q4 ratification names spa-local-storage as the fallback for that reason.",
15
+ "reasonNotChosen": "See the decision text; the chosen default composes cleanly with the applied blueprint set the spec section 5.5 names."
16
+ }
17
+ ],
18
+ "createdAt": "2026-09-06T23:15:00Z",
19
+ "updatedAt": "2026-09-06T23:15:00Z"
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-2703-application-onboarding-tour-checklist-anchor",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Checklist anchor slot: dashboard-top when application-dashboard is applied, settings-page when not, custom-anchor as escape hatch",
8
+ "context": "The checklist has three legal homes. dashboard-top when application-dashboard is applied because the dashboard shell is the highest-value surface a returning principal reaches. settings-page when application-dashboard is not applied because the settings surface is the next-highest-value reference surface. custom-anchor when the project prefers a bespoke slot (a marketing surface, a landing shell, a home route). The spec section 5.5 ratifies all three and marks the anchor as elicited with a default derived at apply time from what is applied.",
9
+ "decision": "checklist-anchor is elicited (enum: dashboard-top | settings-page | custom-anchor). Recommended default: derived at apply time (dashboard-top when application-dashboard is in the applied set; settings-page when it is not; custom-anchor requires the projects own CSS selector). The collapse contract is a <details open> element on dashboard-top and a <details> (closed) element on settings-page; custom-anchor takes the setting-page default (closed) unless the project supplies an override.",
10
+ "consequences": "A project applying application-dashboard renders the checklist open on the dashboard shell so a new principal sees the outstanding items at a glance; a project not applying application-dashboard renders it closed on the settings surface so it does not intrude; a project with a custom-anchor takes responsibility for the placement. AC-26103-1 probes the collapse contract on the two shipped anchors; custom-anchor is verified by the fixture READMEs manual boot line.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Alternative approach considered",
14
+ "summary": "Auto-selecting always to the dashboard-top slot regardless of the applied set was considered but a project without application-dashboard applied has no dashboard shell to mount into; the checklist would be lost. Deriving the default from the applied set at apply time keeps the anchor honest.",
15
+ "reasonNotChosen": "See the decision text; the chosen shape composes cleanly with the applied blueprint set the spec section 5.5 names."
16
+ }
17
+ ],
18
+ "createdAt": "2026-09-06T23:15:00Z",
19
+ "updatedAt": "2026-09-06T23:15:00Z"
20
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-onboarding-tour-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "Step-manifest contract: 3 to 5 steps per tour with per-step anchor selector and per-step content voice slot",
5
+ "description": "The blueprint contributes a step-manifest contract for a 3 to 5 step onboarding tour. Each step declares a step id, an anchor selector (CSS resolved at step-open time to place the tooltip against a live element in the DOM), a heading and a body slot the project fills with its own voice. The step runner walks the manifest in order and refuses to open a step whose anchor does not resolve to a visible element rather than rendering a floating tooltip. The blueprint contributes the WHAT (the manifest shape and the resolver contract), not the words.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec (2026-09-06) section 5.5, REQ 1 of the onboarding-tour blueprint.",
10
+ "tags": [
11
+ "blueprint:application-onboarding-tour",
12
+ "category:01-step-runner"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T23:15:00Z",
17
+ "updatedAt": "2026-09-06T23:15:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-onboarding-tour-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "Tooltip-as-dialog contract per the ARIA APG dialog-modal pattern",
5
+ "description": "Each step's tooltip carries role=\"dialog\", aria-labelledby to the step heading, aria-describedby to the step body. Focus moves to the tooltip on open, focus returns to the anchor on close. The dialog traps focus between the tour controls (previous, next, dismiss) and refuses to let Tab escape to the underlying surface (WCAG 2.1.2 No Keyboard Trap satisfied because Escape always exits). Escape dismisses the tour. Focus is not obscured on any breakpoint (WCAG 2.4.11 Focus Not Obscured Minimum). Follows the ARIA APG dialog-modal pattern for the tooltip surface.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec (2026-09-06) section 5.5, REQ 2 of the onboarding-tour blueprint.",
10
+ "tags": [
11
+ "blueprint:application-onboarding-tour",
12
+ "category:02-dialog-modal"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T23:15:00Z",
17
+ "updatedAt": "2026-09-06T23:15:00Z"
18
+ }