rcf-lite 0.21.0 → 0.22.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 (342) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/blueprints/application-account-settings/CHANGELOG.md +12 -0
  3. package/blueprints/application-account-settings/README.md +114 -0
  4. package/blueprints/application-account-settings/blueprint.json +234 -0
  5. package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +20 -0
  6. package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +20 -0
  7. package/blueprints/application-account-settings/contributions/adrs/adr-2603-application-account-settings-theme-persistence.json +20 -0
  8. package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +20 -0
  9. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +18 -0
  10. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +18 -0
  11. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +18 -0
  12. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +18 -0
  13. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +18 -0
  14. package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +18 -0
  15. package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +41 -0
  16. package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +28 -0
  17. package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +35 -0
  18. package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +40 -0
  19. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +34 -0
  20. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -0
  21. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +27 -0
  22. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +27 -0
  23. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +33 -0
  24. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +27 -0
  25. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +27 -0
  26. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -0
  27. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +33 -0
  28. package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +27 -0
  29. package/blueprints/application-account-settings/docs/topics.md +48 -0
  30. package/blueprints/application-account-settings/guide/application-account-settings.md +30 -0
  31. package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +246 -0
  32. package/blueprints/application-admin-console/docs/topics.md +7 -0
  33. package/blueprints/application-api-rest/docs/topics.md +8 -1
  34. package/blueprints/application-charts/docs/topics.md +7 -0
  35. package/blueprints/application-dashboard/docs/topics.md +7 -0
  36. package/blueprints/application-datatable/docs/topics.md +7 -0
  37. package/blueprints/application-empty-error-states/CHANGELOG.md +9 -0
  38. package/blueprints/application-empty-error-states/README.md +88 -0
  39. package/blueprints/application-empty-error-states/blueprint.json +119 -0
  40. package/blueprints/application-empty-error-states/contributions/adrs/adr-2301-application-empty-error-states-status-contract.json +25 -0
  41. package/blueprints/application-empty-error-states/contributions/adrs/adr-2302-application-empty-error-states-stack-trace-visibility.json +25 -0
  42. package/blueprints/application-empty-error-states/contributions/adrs/adr-2303-application-empty-error-states-offline-strategy.json +25 -0
  43. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +18 -0
  44. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +18 -0
  45. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +18 -0
  46. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +18 -0
  47. package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +18 -0
  48. package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +46 -0
  49. package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +36 -0
  50. package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +40 -0
  51. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +29 -0
  52. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +29 -0
  53. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +29 -0
  54. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +29 -0
  55. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +29 -0
  56. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +29 -0
  57. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +29 -0
  58. package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +29 -0
  59. package/blueprints/application-empty-error-states/docs/topics.md +53 -0
  60. package/blueprints/application-empty-error-states/guide/application-empty-error-states.md +50 -0
  61. package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +284 -0
  62. package/blueprints/application-error-handling/docs/topics.md +7 -0
  63. package/blueprints/application-file-upload/CHANGELOG.md +9 -0
  64. package/blueprints/application-file-upload/README.md +85 -0
  65. package/blueprints/application-file-upload/blueprint.json +114 -0
  66. package/blueprints/application-file-upload/contributions/adrs/adr-2401-application-file-upload-transport.json +25 -0
  67. package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +25 -0
  68. package/blueprints/application-file-upload/contributions/adrs/adr-2403-application-file-upload-virus-scan.json +25 -0
  69. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +18 -0
  70. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +18 -0
  71. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +18 -0
  72. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +18 -0
  73. package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +18 -0
  74. package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +46 -0
  75. package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +47 -0
  76. package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +46 -0
  77. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +28 -0
  78. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +28 -0
  79. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +29 -0
  80. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +28 -0
  81. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +29 -0
  82. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +28 -0
  83. package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +28 -0
  84. package/blueprints/application-file-upload/docs/topics.md +58 -0
  85. package/blueprints/application-file-upload/guide/application-file-upload.md +48 -0
  86. package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +238 -0
  87. package/blueprints/application-forms-wizard/CHANGELOG.md +9 -0
  88. package/blueprints/application-forms-wizard/README.md +102 -0
  89. package/blueprints/application-forms-wizard/blueprint.json +120 -0
  90. package/blueprints/application-forms-wizard/contributions/adrs/adr-2501-application-forms-wizard-navigation.json +25 -0
  91. package/blueprints/application-forms-wizard/contributions/adrs/adr-2502-application-forms-wizard-save-and-return.json +25 -0
  92. package/blueprints/application-forms-wizard/contributions/adrs/adr-2503-application-forms-wizard-step-indicator.json +25 -0
  93. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +18 -0
  94. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +18 -0
  95. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +18 -0
  96. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +18 -0
  97. package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +18 -0
  98. package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +46 -0
  99. package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +40 -0
  100. package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +40 -0
  101. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +28 -0
  102. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +29 -0
  103. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +28 -0
  104. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +29 -0
  105. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +28 -0
  106. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +28 -0
  107. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +28 -0
  108. package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +29 -0
  109. package/blueprints/application-forms-wizard/docs/topics.md +49 -0
  110. package/blueprints/application-forms-wizard/guide/application-forms-wizard.md +48 -0
  111. package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +233 -0
  112. package/blueprints/application-notifications-in-app/docs/topics.md +7 -0
  113. package/blueprints/application-onboarding-tour/CHANGELOG.md +12 -0
  114. package/blueprints/application-onboarding-tour/README.md +77 -0
  115. package/blueprints/application-onboarding-tour/blueprint.json +164 -0
  116. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2701-application-onboarding-tour-dismissal-policy.json +20 -0
  117. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +20 -0
  118. package/blueprints/application-onboarding-tour/contributions/adrs/adr-2703-application-onboarding-tour-checklist-anchor.json +20 -0
  119. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +18 -0
  120. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +18 -0
  121. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +18 -0
  122. package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +18 -0
  123. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +41 -0
  124. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +35 -0
  125. package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +34 -0
  126. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +27 -0
  127. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +27 -0
  128. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +27 -0
  129. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +27 -0
  130. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +27 -0
  131. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +27 -0
  132. package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +27 -0
  133. package/blueprints/application-onboarding-tour/docs/topics.md +48 -0
  134. package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +59 -0
  135. package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +231 -0
  136. package/blueprints/application-spa/docs/topics.md +8 -1
  137. package/blueprints/delivery-ci-workflows/docs/topics.md +8 -1
  138. package/blueprints/deploy-cloudflare-workers/docs/topics.md +8 -1
  139. package/blueprints/email-smtp-resend/docs/topics.md +8 -1
  140. package/blueprints/object-storage-s3/CHANGELOG.md +13 -0
  141. package/blueprints/object-storage-s3/README.md +108 -0
  142. package/blueprints/object-storage-s3/blueprint.json +72 -0
  143. package/blueprints/object-storage-s3/contributions/adrs/adr-2901-object-storage-s3-adapter.json +30 -0
  144. package/blueprints/object-storage-s3/contributions/adrs/adr-2902-object-storage-s3-presigned-ttl-floor.json +25 -0
  145. package/blueprints/object-storage-s3/contributions/adrs/adr-2903-object-storage-s3-multipart-threshold.json +25 -0
  146. package/blueprints/object-storage-s3/contributions/adrs/adr-2904-object-storage-s3-contract.json +25 -0
  147. package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +103 -0
  148. package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +43 -0
  149. package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +84 -0
  150. package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +101 -0
  151. package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +85 -0
  152. package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +84 -0
  153. package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +64 -0
  154. package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +4 -0
  155. package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +10 -0
  156. package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +4 -0
  157. package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +4 -0
  158. package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +7 -0
  159. package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +4 -0
  160. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +18 -0
  161. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +18 -0
  162. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +18 -0
  163. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +18 -0
  164. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +18 -0
  165. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +18 -0
  166. package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +57 -0
  167. package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +36 -0
  168. package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +36 -0
  169. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +34 -0
  170. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +43 -0
  171. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +25 -0
  172. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +34 -0
  173. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -0
  174. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +34 -0
  175. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +34 -0
  176. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +34 -0
  177. package/blueprints/object-storage-s3/docs/topics.md +62 -0
  178. package/blueprints/object-storage-s3/guide/object-storage-s3.md +207 -0
  179. package/blueprints/observability-essentials/docs/topics.md +8 -1
  180. package/blueprints/observability-logging/CHANGELOG.md +4 -0
  181. package/blueprints/observability-logging/README.md +3 -0
  182. package/blueprints/observability-logging/blueprint.json +3 -2
  183. package/blueprints/observability-logging/docs/topics.md +7 -0
  184. package/blueprints/observability-probe-endpoints/docs/topics.md +8 -1
  185. package/blueprints/persistence-data-d1/docs/topics.md +8 -1
  186. package/blueprints/persistence-data-postgres/CHANGELOG.md +12 -0
  187. package/blueprints/persistence-data-postgres/README.md +101 -0
  188. package/blueprints/persistence-data-postgres/blueprint.json +80 -0
  189. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +30 -0
  190. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2802-persistence-data-postgres-migration-shape.json +25 -0
  191. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2803-persistence-data-postgres-runner-mode.json +25 -0
  192. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2804-persistence-data-postgres-recovery.json +25 -0
  193. package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.json +25 -0
  194. package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +56 -0
  195. package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +75 -0
  196. package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +56 -0
  197. package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +186 -0
  198. package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +76 -0
  199. package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +173 -0
  200. package/blueprints/persistence-data-postgres/contributions/probes/run-facade-round-trip.mjs +10 -0
  201. package/blueprints/persistence-data-postgres/contributions/probes/run-migration-apply.mjs +10 -0
  202. package/blueprints/persistence-data-postgres/contributions/probes/run-pool-posture-smoke.mjs +9 -0
  203. package/blueprints/persistence-data-postgres/contributions/probes/run-prepared-statement-scan.mjs +10 -0
  204. package/blueprints/persistence-data-postgres/contributions/probes/run-recovery-restore-round-trip.mjs +9 -0
  205. package/blueprints/persistence-data-postgres/contributions/probes/run-transaction-atomicity.mjs +10 -0
  206. package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +79 -0
  207. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +18 -0
  208. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +18 -0
  209. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +18 -0
  210. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +18 -0
  211. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +18 -0
  212. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +18 -0
  213. package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +18 -0
  214. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +58 -0
  215. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +40 -0
  216. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +35 -0
  217. package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +40 -0
  218. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +34 -0
  219. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +25 -0
  220. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +25 -0
  221. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +25 -0
  222. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +25 -0
  223. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +25 -0
  224. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +25 -0
  225. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +25 -0
  226. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +25 -0
  227. package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +25 -0
  228. package/blueprints/persistence-data-postgres/docs/topics.md +64 -0
  229. package/blueprints/persistence-data-postgres/guide/persistence-data-postgres.md +172 -0
  230. package/blueprints/persistence-data-sqlite/docs/topics.md +8 -1
  231. package/blueprints/security-auth-clerk/CHANGELOG.md +4 -0
  232. package/blueprints/security-auth-clerk/README.md +3 -0
  233. package/blueprints/security-auth-clerk/blueprint.json +147 -30
  234. package/blueprints/security-auth-clerk/docs/topics.md +8 -1
  235. package/blueprints/security-auth-keycloak/CHANGELOG.md +4 -0
  236. package/blueprints/security-auth-keycloak/README.md +3 -0
  237. package/blueprints/security-auth-keycloak/blueprint.json +182 -37
  238. package/blueprints/security-auth-keycloak/docs/topics.md +8 -1
  239. package/blueprints/security-auth-magic-link/CHANGELOG.md +4 -0
  240. package/blueprints/security-auth-magic-link/README.md +3 -0
  241. package/blueprints/security-auth-magic-link/blueprint.json +159 -33
  242. package/blueprints/security-auth-magic-link/docs/topics.md +8 -1
  243. package/blueprints/security-auth-oauth2/CHANGELOG.md +4 -0
  244. package/blueprints/security-auth-oauth2/README.md +3 -0
  245. package/blueprints/security-auth-oauth2/blueprint.json +158 -32
  246. package/blueprints/security-auth-oauth2/docs/topics.md +8 -1
  247. package/blueprints/security-secrets-management/CHANGELOG.md +11 -0
  248. package/blueprints/security-secrets-management/blueprint.json +2 -1
  249. package/blueprints/security-secrets-management/docs/topics.md +8 -1
  250. package/fixtures/canary-manifest.json +9 -9
  251. package/package.json +1 -1
  252. package/rcf/code-nodes/cn-134.json +13 -0
  253. package/rcf/code-nodes/cn-135.json +12 -0
  254. package/rcf/code-nodes/cn-136.json +13 -0
  255. package/rcf/code-nodes/cn-137.json +13 -0
  256. package/rcf/code-nodes/cn-138.json +12 -0
  257. package/rcf/code-nodes/cn-139.json +12 -0
  258. package/rcf/code-nodes/cn-140.json +13 -0
  259. package/rcf/code-nodes/cn-141.json +13 -0
  260. package/rcf/code-nodes/cn-142.json +12 -0
  261. package/rcf/code-nodes/cn-143.json +13 -0
  262. package/rcf/code-nodes/cn-144.json +13 -0
  263. package/rcf/code-nodes/cn-145.json +12 -0
  264. package/rcf/code-nodes/cn-146.json +12 -0
  265. package/rcf/code-nodes/cn-147.json +13 -0
  266. package/rcf/code-nodes/cn-148.json +13 -0
  267. package/rcf/code-nodes/cn-149.json +12 -0
  268. package/rcf/code-nodes/cn-150.json +13 -0
  269. package/rcf/code-nodes/cn-151.json +13 -0
  270. package/rcf/code-nodes/cn-152.json +12 -0
  271. package/rcf/code-nodes/cn-153.json +12 -0
  272. package/rcf/code-nodes/cn-154.json +13 -0
  273. package/rcf/code-nodes/cn-155.json +14 -0
  274. package/rcf/code-nodes/cn-156.json +13 -0
  275. package/rcf/code-nodes/cn-157.json +13 -0
  276. package/rcf/code-nodes/cn-158.json +12 -0
  277. package/rcf/code-nodes/cn-159.json +13 -0
  278. package/rcf/code-nodes/cn-160.json +12 -0
  279. package/rcf/code-nodes/cn-161.json +12 -0
  280. package/rcf/code-nodes/cn-162.json +13 -0
  281. package/rcf/code-nodes/cn-163.json +12 -0
  282. package/rcf/code-nodes/cn-164.json +13 -0
  283. package/rcf/code-nodes/cn-165.json +12 -0
  284. package/rcf/code-nodes/cn-166.json +12 -0
  285. package/rcf/code-nodes/cn-167.json +12 -0
  286. package/rcf/code-nodes/cn-168.json +12 -0
  287. package/rcf/code-nodes/cn-169.json +12 -0
  288. package/rcf/code-nodes/cn-170.json +12 -0
  289. package/rcf/code-nodes/cn-171.json +12 -0
  290. package/rcf/code-nodes/cn-172.json +12 -0
  291. package/rcf/code-nodes/cn-173.json +12 -0
  292. package/rcf/code-nodes/cn-174.json +12 -0
  293. package/rcf/code-nodes/cn-175.json +13 -0
  294. package/rcf/code-nodes/cn-176.json +12 -0
  295. package/rcf/code-nodes/cn-177.json +12 -0
  296. package/rcf/code-nodes/cn-178.json +12 -0
  297. package/rcf/code-nodes/cn-179.json +12 -0
  298. package/rcf/code-nodes/cn-180.json +13 -0
  299. package/rcf/code-nodes/cn-181.json +12 -0
  300. package/rcf/code-nodes/cn-182.json +13 -0
  301. package/rcf/code-nodes/cn-183.json +12 -0
  302. package/rcf/code-nodes/cn-184.json +13 -0
  303. package/rcf/code-nodes/cn-185.json +12 -0
  304. package/rcf/code-nodes/cn-186.json +12 -0
  305. package/rcf/code-nodes/cn-200.json +14 -0
  306. package/rcf/code-nodes/cn-201.json +13 -0
  307. package/rcf/code-nodes/cn-202.json +14 -0
  308. package/rcf/code-nodes/cn-203.json +14 -0
  309. package/rcf/code-nodes/cn-204.json +13 -0
  310. package/rcf/code-nodes/cn-205.json +14 -0
  311. package/rcf/fbs/fbs-043.json +23 -0
  312. package/rcf/fbs/fbs-044.json +23 -0
  313. package/rcf/fbs/fbs-045.json +23 -0
  314. package/rcf/fbs/fbs-046.json +24 -0
  315. package/rcf/fbs/fbs-047.json +24 -0
  316. package/rcf/fbs/fbs-060.json +22 -0
  317. package/rcf/fbs/fbs-061.json +20 -0
  318. package/rcf/requirements/req-024.json +69 -0
  319. package/rcf/requirements/req-025.json +59 -0
  320. package/rcf/requirements/req-026.json +154 -0
  321. package/rcf/requirements/req-027.json +33 -0
  322. package/rcf/requirements/req-028.json +13 -0
  323. package/rcf/requirements/req-040.json +13 -0
  324. package/rcf/requirements/req-041.json +125 -0
  325. package/rcf/test-suites/ts-053.json +70 -0
  326. package/rcf/test-suites/ts-054.json +70 -0
  327. package/rcf/test-suites/ts-055.json +77 -0
  328. package/rcf/test-suites/ts-056.json +78 -0
  329. package/rcf/test-suites/ts-057.json +78 -0
  330. package/rcf/test-suites/ts-070.json +62 -0
  331. package/rcf/test-suites/ts-071.json +62 -0
  332. package/rcf/user-stories/us-2401.json +62 -0
  333. package/rcf/user-stories/us-2501.json +58 -0
  334. package/rcf/user-stories/us-2601.json +51 -0
  335. package/rcf/user-stories/us-2701.json +55 -0
  336. package/rcf/user-stories/us-2801.json +55 -0
  337. package/rcf/user-stories/us-4001.json +69 -0
  338. package/rcf/user-stories/us-4101.json +69 -0
  339. package/releases/releases.yaml +11 -1
  340. package/src/blueprint/apply.js +10 -1
  341. package/src/blueprint/capabilities.js +41 -2
  342. package/src/cli/blueprint.js +8 -1
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-2303-application-empty-error-states-offline-strategy",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Offline strategy is write-buffer by default with elicited alternatives for read-only-banner and refuse-writes",
8
+ "context": "Applications differ on what they want to do while offline. A note-taking application wants a write-buffer so the operator keeps working. A financial application wants to refuse writes altogether because a queued write against stale server state is worse than a hard fail. A dashboard application wants a read-only banner and refuses writes silently. There is no single sensible default; the shelf blueprint commits to one and elicits the two alternatives.",
9
+ "decision": "Default is write-buffer per TAC-2303: writes queue to IndexedDB with an idempotency token and flush on reconnection with server-side dedupe. Elicited alternatives are read-only-banner (the surface renders a banner and every write control disables) and refuse-writes (every write attempt fails locally with a clear message; nothing queues). The elicited answer lives on the applied-blueprint sidecar and the state machine reads it on offline entry. elicited is true; recommendedDefault stays false because the choice is genuinely per-project.",
10
+ "consequences": "Projects that want the write-buffer get the default with no configuration; the pack drives an offline probe and asserts window.__offlineBuffer is populated. Projects electing read-only-banner get a simpler UI at the cost of losing the operator's in-flight writes. Projects electing refuse-writes get the strictest posture with the clearest failure mode. All three shapes render the offline region and the polite reconnection announcement per REQ-005; the difference is only whether writes queue, disable or refuse.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Force refuse-writes as the default",
14
+ "summary": "Refuse every offline write locally; no buffer; no queue.",
15
+ "reasonNotChosen": "Loses the operator's in-flight work every time the network drops for a few seconds; the most common failure mode (transient loss) becomes the most painful."
16
+ },
17
+ {
18
+ "name": "Server-side sync engine",
19
+ "summary": "Ship a CRDT or event-sourced sync engine as part of this blueprint.",
20
+ "reasonNotChosen": "Outside the shelf blueprint's scope (this is a UI-state blueprint, not a persistence blueprint); belongs to a future persistence-sync-engine blueprint if the shelf grows one."
21
+ }
22
+ ],
23
+ "createdAt": "2026-09-06T15:40:00Z",
24
+ "updatedAt": "2026-09-06T15:40:00Z"
25
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-empty-error-states-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "State catalogue: the eight named empty and error states, each with a machine-readable status and a distinct visual",
5
+ "description": "The application realises eight named empty and error states, one contract per state: not-found (HTTP 404 on an unknown resource), forbidden (HTTP 403 on an authenticated principal without scope), server-error (HTTP 5xx on an internal failure), offline (navigator.onLine false), permission-denied (HTTP 403 with a per-resource cause), empty-list (a listing endpoint returned an empty array), no-search-results (a search or filter yielded zero rows), error-boundary (a client-side render exception caught by the SPA boundary). Each state carries a machine-readable status (statusCode for HTTP-triggered states, a well-known token for client-triggered states) and a distinct visual so a screenshot review reader can tell them apart at a glance. Vendor-neutral: the blueprint contributes WHAT surfaces under WHAT condition, not the visual design.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.1, REQ 1.",
10
+ "tags": [
11
+ "blueprint:application-empty-error-states",
12
+ "category:01-state-catalogue"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T15:40:00Z",
17
+ "updatedAt": "2026-09-06T15:40:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-empty-error-states-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "Recovery-action contract per state: parent-surface link, search entry, request-access flow, retry hook",
5
+ "description": "Every rendered state carries at least one recovery action. The recovery-action router maps each named state to one of a fixed four action shapes: parent-surface (a link back up the resource hierarchy, used by not-found and empty-list), search (a search entry, used by not-found and no-search-results), request-access (a POST to a well-known request-access endpoint the applied notification centre can surface, used by forbidden and permission-denied), retry (a client-side re-issue of the failed operation, used by server-error and offline). The router refuses to render a state without a recovery action; a state whose applied surface has no legitimate recovery renders an explicit no-recovery notice with the reason.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.1, REQ 2.",
10
+ "tags": [
11
+ "blueprint:application-empty-error-states",
12
+ "category:02-recovery-router"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T15:40:00Z",
17
+ "updatedAt": "2026-09-06T15:40:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-empty-error-states-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "Announcement contract: role region per state, aria-live polite for progress and reconnection, screen-reader traversal order",
5
+ "description": "Every rendered state region carries role=\"region\" with an accessible name naming the state (WCAG 2.4.6 Headings and Labels). Progress announcements (retry attempt, reconnection to server) fire through an aria-live=\"polite\" live-region wrapper (WCAG 4.1.3 Status Messages). Screen-reader traversal order is: state heading first, then the recovery action, then any secondary detail; keyboard focus lands on the recovery control on state entry so a keyboard user reaches recovery in one tab. The error-boundary state announces via role=\"alert\" (assertive) rather than polite because the client render failed and the operator has no context.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.1, REQ 3.",
10
+ "tags": [
11
+ "blueprint:application-empty-error-states",
12
+ "category:03-announcement"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T15:40:00Z",
17
+ "updatedAt": "2026-09-06T15:40:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-empty-error-states-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "Server-error surface: no stack trace in production, no resource-id leak on forbidden per least-privilege posture",
5
+ "description": "The server-error (5xx) state renders in production mode without a stack trace, without a source file path, without any environment-variable key shape (VARNAME=value or process.env.NAME references), and without any framework internal frame prefix. The pack refuses when any word in a bundled sensitive-pattern list matches the rendered surface (path-shape strings, backtrace-frame prefixes, environment-variable key shape). The forbidden (403) and permission-denied (403 with cause) states render without the resource id, without the resource name and without the server-side path so a principal without scope cannot infer resource existence from the error surface. A staging environment override is available via ADR-2302 elicitation.",
6
+ "category": "security",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.1, REQ 4. Second risk clause in the round-4 spec calls for a CSP-shape enforcement on the 500 surface.",
10
+ "tags": [
11
+ "blueprint:application-empty-error-states",
12
+ "category:04-least-privilege"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T15:40:00Z",
17
+ "updatedAt": "2026-09-06T15:40:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "application-empty-error-states-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "Offline state: write-buffer contract, navigator.onLine reconnection announcement, per-write reconciliation semantics",
5
+ "description": "When navigator.onLine reports false the offline state renders with a read-only banner naming the offline mode. Queued writes buffer to an applied local buffer (IndexedDB by default, an elicited alternative per ADR-2303) with an idempotency token per write, a serialised payload, and a monotonically increasing sequence. On reconnection (navigator.onLine true) the offline state announces through the polite live-region wrapper the applied notifications-in-app blueprint has preseeded; queued writes flush in sequence, each with the same idempotency token so a server-side dedupe rejects a re-issue. Per-write reconciliation semantics: on flush success the surface clears the buffer entry; on flush failure the entry is retained with a retry counter and the surface renders a per-write error banner.",
6
+ "category": "functional",
7
+ "domain": "application",
8
+ "priority": "must",
9
+ "rationale": "Per visual round 4 spec section 5.1, REQ 5.",
10
+ "tags": [
11
+ "blueprint:application-empty-error-states",
12
+ "category:05-offline"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-09-06T15:40:00Z",
17
+ "updatedAt": "2026-09-06T15:40:00Z"
18
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "tacId": "TAC-2301-application-empty-error-states-state-machine",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Empty and error state machine",
8
+ "purpose": "Owns the mapping from an FBS surface render (a routed page, a listing surface, a search surface, a client-side render) to the eight named empty and error states and from each state to a recovery-action shape. Reads the runtime signals (HTTP status code, response body shape, navigator.onLine, caught render exception) and dispatches the correct state region plus the correct recovery shape. Every AC in this blueprint anchors on this TAC.",
9
+ "responsibilities": [
10
+ "Map HTTP 404 to not-found, 403 to forbidden or permission-denied (see internalStructure), 5xx to server-error, and empty-array response bodies to empty-list or no-search-results (see internalStructure) (AC-22101-1 through AC-22104-1, AC-22106-1, AC-22107-1).",
11
+ "Map navigator.onLine false to offline and the reconnect signal to the polite reconnection announcement (AC-22105-1).",
12
+ "Map a caught client-side render exception to error-boundary announced through role=\"alert\" (AC-22108-1).",
13
+ "Delegate every recovery action to the recovery-action router (TAC-2302) and every offline buffer operation to the offline-buffer TAC (TAC-2303)."
14
+ ],
15
+ "internalStructure": "One state-machine module the shell mounts on route entry. On response, the machine reads the HTTP status code plus the response body shape: a 403 with a per-resource cause routes to permission-denied, a bare 403 routes to forbidden; a 200 with an empty array on a search endpoint (route carries a q query parameter) routes to no-search-results, a 200 with an empty array on a listing endpoint routes to empty-list. On navigator.onLine transitions the machine dispatches offline entry and reconnection through the polite live-region wrapper. On a caught render exception (the SPA error boundary) the machine dispatches error-boundary through the assertive alert wrapper. Every dispatch writes the state name into the rendered region as an accessible name and delegates the recovery action to the recovery router. The framework is not prescribed; the machines interfaces are what the project realises against React, Vue, Svelte or vanilla DOM.",
16
+ "interfaces": [
17
+ {
18
+ "name": "renderState",
19
+ "kind": "factory",
20
+ "description": "renderState({ statusCode, responseBody, route, onLine, caughtException }) -> { stateName, recoveryShape, regionProps }. The project supplies the runtime signals; the machine returns the state name, the recovery shape the router will realise, and the region props (role, aria-live level, accessible name)."
21
+ },
22
+ {
23
+ "name": "statesEnum",
24
+ "kind": "shape",
25
+ "description": "The eight named states are the closed enum { not-found, forbidden, server-error, offline, permission-denied, empty-list, no-search-results, error-boundary }. A ninth state is a blueprint minor bump (see CHANGELOG)."
26
+ }
27
+ ],
28
+ "dependencies": [
29
+ {
30
+ "name": "Recovery-action router",
31
+ "kind": "tac",
32
+ "tacId": "TAC-2302-application-empty-error-states-recovery-router",
33
+ "description": "The state machine hands every rendered state's recovery shape to the router."
34
+ },
35
+ {
36
+ "name": "Offline write-buffer",
37
+ "kind": "tac",
38
+ "tacId": "TAC-2303-application-empty-error-states-offline-buffer",
39
+ "description": "The offline entry dispatches through the write-buffer TAC."
40
+ }
41
+ ],
42
+ "tradeoffs": "One state-machine module keeps the mapping deterministic and lint-checkable but ties every state to a runtime signal the project must expose. Projects that route through a framework's own boundary primitive (React error boundary, Vue errorCaptured) wire the machine into that primitive rather than replacing it. Known mechanism-reach gap: the machine cannot prove keyboard focus lands on the recovery control in every framework's rendering; the pack asserts the control is reachable, project-side smoke tests supplement.",
43
+ "notes": "See README Known mechanism-reach gaps for the full list.",
44
+ "createdAt": "2026-09-06T15:40:00Z",
45
+ "updatedAt": "2026-09-06T15:40:00Z"
46
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "tacId": "TAC-2302-application-empty-error-states-recovery-router",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Recovery-action router",
8
+ "purpose": "Owns the mapping from a state's recovery shape (parent-surface, search, request-access, retry, create, clear-filters) to a concrete rendered control on the state region. The router is the second layer under the state machine; every state that renders passes its recovery shape through the router.",
9
+ "responsibilities": [
10
+ "Realise the parent-surface shape as a link with data-recovery=\"parent-surface\" whose href points to the FBS-declared parent path (AC-22101-1, AC-22106-1 when the empty-list has a parent).",
11
+ "Realise the search shape as a search entry with data-recovery=\"search\" (AC-22101-1, AC-22107-1).",
12
+ "Realise the request-access shape as a button with data-action=\"request-access\" that POSTs to the FBS-configured request-access endpoint (AC-22102-1, AC-22104-1).",
13
+ "Realise the retry shape as a button with data-recovery=\"retry\" that re-issues the failed operation (AC-22103-1, AC-22105-1, AC-22108-1).",
14
+ "Realise the create shape as a link or button with data-recovery=\"create\" (AC-22106-1) and the clear-filters shape as a button with data-recovery=\"clear-filters\" (AC-22107-1)."
15
+ ],
16
+ "internalStructure": "One router module the state machine hands each state's recovery shape. The router reads the FBS-configured parent path, request-access endpoint and clear-filters callback and constructs the rendered control. Refuses to render a state without a legitimate recovery shape (an authored no-recovery notice is a legitimate shape; a bare state region without any recovery is a build defect).",
17
+ "interfaces": [
18
+ {
19
+ "name": "renderRecovery",
20
+ "kind": "factory",
21
+ "description": "renderRecovery({ shape, config }) -> { element, dataRecoveryAttr, dataActionAttr }. shape is one of parent-surface, search, request-access, retry, create, clear-filters, no-recovery. config carries the FBS-declared paths and callbacks the router needs."
22
+ }
23
+ ],
24
+ "dependencies": [
25
+ {
26
+ "name": "State machine",
27
+ "kind": "tac",
28
+ "tacId": "TAC-2301-application-empty-error-states-state-machine",
29
+ "description": "The router runs downstream of the state machine's dispatch."
30
+ }
31
+ ],
32
+ "tradeoffs": "A closed set of recovery shapes keeps the state matrix testable but constrains projects that want a bespoke recovery flow to compose a wider shape as no-recovery with a project-side custom region. A future v1.1.0 minor bump can add a request-access-inline shape (inline form rather than a POST) when demand warrants.",
33
+ "notes": "The recovery-shape enum is closed at v1: parent-surface, search, request-access, retry, create, clear-filters, no-recovery. A new shape is a blueprint minor bump.",
34
+ "createdAt": "2026-09-06T15:40:00Z",
35
+ "updatedAt": "2026-09-06T15:40:00Z"
36
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "tacId": "TAC-2303-application-empty-error-states-offline-buffer",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Offline write-buffer",
8
+ "purpose": "Owns the buffering and reconciliation contract for writes attempted while navigator.onLine is false. Every buffered write carries an idempotency token, a serialised payload and a monotonic sequence; on reconnection the buffer flushes in sequence and the server dedupes on the idempotency token.",
9
+ "responsibilities": [
10
+ "Persist every buffered write to the applied local buffer (IndexedDB by default per ADR-2303, an elicited alternative for projects that need it) with an idempotency token, serialised payload and sequence (AC-22105-1).",
11
+ "Expose window.__offlineBuffer as a read-only enumeration for the pack and for project-side smoke tests (AC-22105-1).",
12
+ "Announce buffered-write count changes through the polite live-region wrapper on entry and on reconnection (AC-22105-1 via TAC-2301).",
13
+ "On reconnection, flush the buffer in sequence, retain the entry on flush failure with a retry counter, and clear the entry on flush success."
14
+ ],
15
+ "internalStructure": "One buffer module the state machine invokes on offline entry and exit. The buffer wraps the applied storage engine (default IndexedDB via a small adapter interface, elicited alternatives per ADR-2303) with a serialise/deserialise pair and a monotonic counter. The reconciliation loop is idempotent: replaying the flush against the same buffer produces the same server-side effect.",
16
+ "interfaces": [
17
+ {
18
+ "name": "bufferWrite",
19
+ "kind": "factory",
20
+ "description": "bufferWrite({ payload, idempotencyToken }) -> { sequence }. Persists the write, returns the sequence assigned. The idempotency token is caller-supplied so the server-side dedupe key is stable across retries."
21
+ },
22
+ {
23
+ "name": "flushBuffer",
24
+ "kind": "factory",
25
+ "description": "flushBuffer({ onSuccess, onFailure }) -> { flushed, retained }. Called on reconnection; iterates the buffer in sequence, calling onSuccess or onFailure per entry."
26
+ }
27
+ ],
28
+ "dependencies": [
29
+ {
30
+ "name": "State machine",
31
+ "kind": "tac",
32
+ "tacId": "TAC-2301-application-empty-error-states-state-machine",
33
+ "description": "The state machine dispatches offline entry and reconnection into this buffer."
34
+ }
35
+ ],
36
+ "tradeoffs": "IndexedDB by default is available in every modern browser but requires the applied surface to run in a browser context (not a WebView with a locked-down storage policy). Projects on a stripped WebView elicit an alternative via ADR-2303. Retention semantics on flush failure are per-write; a global give-up threshold is a project-side concern and not part of the v1 contract.",
37
+ "notes": "The buffer is a runtime-observable contract; the pack drives an offline probe with a synthetic write and asserts window.__offlineBuffer is populated.",
38
+ "createdAt": "2026-09-06T15:40:00Z",
39
+ "updatedAt": "2026-09-06T15:40:00Z"
40
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The not-found state renders with a naming heading, a parent-surface recovery link, a search entry and a tab title carrying the state name",
8
+ "asA": "operator following a stale or mistyped link into the application",
9
+ "iWant": "the not-found state to render with a heading naming the missing resource kind, a recovery link back up to the parent surface and a search entry, and a tab title reading Not found - <app>",
10
+ "soThat": "I can name the resource I asked for, walk back up the resource hierarchy or search for the right one, and my browser tab distinguishes this state from the loaded surface",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22101-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a 404 response on a route the SPA declares, the not-found state renders inside a role=\"region\" with an accessible name naming the missing resource kind, a keyboard-reachable recovery link to the parent surface with data-recovery=\"parent-surface\", a search entry with data-recovery=\"search\", and the browser tab title matches /^Not found - .+/. The pack drives the real browser to /probe/not-found and reads all four surface tokens."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:not-found"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The forbidden state renders with a request-access control and refuses to surface a resource id, resource name or path shape",
8
+ "asA": "authenticated operator without scope on a resource",
9
+ "iWant": "the forbidden state to render with a request-access control routing to the applied notification centre and no resource-identifying content on the rendered surface",
10
+ "soThat": "I have a legitimate recovery path and I cannot infer the existence of a resource I am not authorised to see",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22102-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a 403 response, the forbidden state renders inside role=\"region\" with a keyboard-reachable [data-action=\"request-access\"] control that POSTs to /api/request-access. The rendered surface does NOT contain any word matching the sensitive-pattern list (resource id shape, resource name shape, path-shape strings starting with /). The pack drives /probe/forbidden and reads the region, the control, and the full document text for pattern hits."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:forbidden"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The server-error state renders in production without a stack trace, without a source path and without an environment-variable key shape",
8
+ "asA": "operator hitting an internal failure",
9
+ "iWant": "the 5xx state to render a plain summary with a retry recovery hook and no server implementation detail",
10
+ "soThat": "I get a legible failure without a leak that would help an attacker probe the server",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22103-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a mocked 500 response, the server-error state renders inside role=\"region\" with a keyboard-reachable [data-recovery=\"retry\"] control; the rendered surface does NOT contain any word matching the sensitive-pattern list (backtrace-frame prefix like \"at \" plus function name plus file colon line, a source path starting with / or ./ or ../, an environment-variable key shape NAME= or process.env.NAME, or a framework-internal frame prefix). The pack drives /probe/server-error and greps the document text against the pattern list."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:server-error"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The permission-denied state names a class-level cause and never the per-resource id",
8
+ "asA": "authenticated operator hitting a 403 with a per-resource cause",
9
+ "iWant": "the permission-denied state to render a class-level cause string (for example \"admin scope required\") not the resource id",
10
+ "soThat": "I get an actionable class-level explanation and no resource identifier leaks into the surface",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22104-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a mocked 403 response with a per-resource cause, the permission-denied state renders inside role=\"region\" with a class-level cause string (matches /^[A-Za-z][A-Za-z0-9 ]+$/ with no digits-run of four or more) and a [data-action=\"request-access\"] control. The pack drives /probe/permission-denied, reads the cause string, and refuses when the string contains a resource-id shape (four or more consecutive digits, or a UUID pattern, or a slug-shape id preceded by resource identifiers like \"resource=\" or \"id=\")."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:permission-denied"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The offline state renders on navigator.onLine false, buffers a synthetic write, and announces reconnection through a polite live-region wrapper",
8
+ "asA": "operator whose network drops mid-session",
9
+ "iWant": "the offline state to render with a read-only banner, my writes to buffer locally with an idempotency token, and a polite reconnection announcement when the network comes back",
10
+ "soThat": "I keep working through a network drop and my writes flush cleanly with no duplicates when the network returns",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22105-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given navigator.onLine simulated false via the runtime seam (page.setOffline(true) on the project route, an offline endpoint on the sample-app route the pack uses instead), the offline state renders inside role=\"region\" with a read-only banner naming offline mode. A synthetic write buffers to window.__offlineBuffer with an idempotency token and a monotonic sequence. On the reconnect signal (navigator.onLine true or the sample-app /probe/offline?reconnect route) the polite live-region wrapper with data-live-region=\"polite\" carries a reconnection announcement. The pack drives /probe/offline, reads the banner, the buffer entry and the polite wrapper text."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2303-application-empty-error-states-offline-buffer"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:offline"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The empty-list state renders with a distinct visual and a creation-affordance recovery control",
8
+ "asA": "operator opening a listing surface that has no rows",
9
+ "iWant": "the empty-list state to render with a distinct visual and a creation-affordance recovery control",
10
+ "soThat": "I know the surface loaded successfully and my next action is to create the first row, not to reload",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22106-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a listing endpoint returning an empty array, the empty-list state renders inside role=\"region\" with a data-visual=\"empty-list\" wrapper (distinct from data-visual=\"loading\" and data-visual=\"loaded\") and a keyboard-reachable [data-recovery=\"create\"] control. The pack drives /probe/empty-list, reads the region and the wrapper attribute, and asserts the recovery control exists and carries an accessible name."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:empty-list"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The no-search-results state renders with a distinct visual and a clear-filters recovery control",
8
+ "asA": "operator running a search or filter that yields zero rows",
9
+ "iWant": "the no-search-results state to render with a distinct visual and a clear-filters recovery control",
10
+ "soThat": "I distinguish this state from empty-list and my next action is to widen the query, not to create a row",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22107-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a search or filter yielding zero rows, the no-search-results state renders inside role=\"region\" with a data-visual=\"no-search-results\" wrapper distinct from empty-list, echoing the query terms verbatim inside a data-query wrapper, and a keyboard-reachable [data-recovery=\"clear-filters\"] control that removes the search parameters on click. The pack drives /probe/search?q=needle, reads the region, the wrapper attribute, the echoed query and the recovery control."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:no-search-results"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "usId": "application-empty-error-states-US-22108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "application-empty-error-states-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The error-boundary state renders on a client-side render failure with a role=alert announcement",
8
+ "asA": "operator hitting a client-side render exception",
9
+ "iWant": "the error-boundary state to render inside role=\"alert\" with a retry recovery hook and no stack detail",
10
+ "soThat": "the assistive tech announces the failure immediately (assertive, not polite) and I have an escape from a broken render",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-22108-1",
14
+ "testable": true,
15
+ "scope": "runtime",
16
+ "description": "Given a synthetic client-side render exception thrown via page.evaluate (or the sample-app /probe/error-boundary?crash=1 route), the error-boundary state renders inside role=\"alert\" with a keyboard-reachable [data-recovery=\"retry\"] control, a plain summary line and no stack-frame content matching the sensitive-pattern list. The pack drives /probe/error-boundary?crash=1, reads the region, the retry control and the document text for pattern hits."
17
+ }
18
+ ],
19
+ "tacIds": [
20
+ "TAC-2301-application-empty-error-states-state-machine",
21
+ "TAC-2302-application-empty-error-states-recovery-router"
22
+ ],
23
+ "tags": [
24
+ "blueprint:application-empty-error-states",
25
+ "state:error-boundary"
26
+ ],
27
+ "createdAt": "2026-09-06T15:40:00Z",
28
+ "updatedAt": "2026-09-06T15:40:00Z"
29
+ }
@@ -0,0 +1,53 @@
1
+ # application-empty-error-states: coordination vocabulary
2
+
3
+ ## Global topics
4
+
5
+ The blueprint claims no new global topics at v1.0.0. Every ADR (HTTP status contract, stack-trace visibility, offline strategy) is non-global.
6
+
7
+ ## Deliberately unclaimed topics
8
+
9
+ - `errorEnvelope` (the shape of a server error response body). Reserved for the applied API blueprint (`application-api-rest` claims it today); this blueprint reads the HTTP status code, not the envelope body shape, so no claim collides.
10
+ - `sensitivePatternsRegistry` (the tokeniser vocabulary the 500 surface refuses on). Reserved for a future v1.1.0 minor bump if three or more consumer blueprints start elicitizing the same extensions. Held here as an unclaimed topic so a composing author sees the reservation.
11
+ - `stateVisualTokens` (the palette, spacing and typography per state). Reserved for `application-spa` which owns the visual tokens; this blueprint owns the state list and the recovery-action router.
12
+
13
+ ## Shelf id band and suffix block
14
+
15
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
16
+ |---|---|---|---|---|
17
+ | application-datatable | 17101-17899 | 18xx | shipped v1.0.0 | none |
18
+ | application-charts | 18101-18899 | 19xx | shipped v1.0.0 | none |
19
+ | application-dashboard | 19101-19899 | 20xx | shipped v1.0.0 | none |
20
+ | application-notifications-in-app | 20101-20899 | 21xx | shipped v1.0.0 | none |
21
+ | application-admin-console | 21101-21899 | 22xx | shipped v1.0.0 | none |
22
+ | application-empty-error-states | 22101-22899 | 23xx | shipped v1.0.0 | none |
23
+ | application-file-upload | 23101-23899 | 24xx | shipped v1.0.0 | none |
24
+ | application-forms-wizard | 24101-24899 | 25xx | shipped v1.0.0 | none |
25
+ | application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
26
+ | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
27
+ | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
28
+ | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
29
+
30
+ The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
31
+
32
+ ## Composition with application-spa
33
+
34
+ `application-spa` REQ-006 ships empty, loading, error, banner and alert components as part of its component library. Applying this blueprint alongside `application-spa` composes cleanly: SPA holds the tab-title convention and the state-visual tokens; this blueprint holds the state list, the recovery-action router and the runtime enforcement pack. No `scope: "global"` ADR conflict.
35
+
36
+ ## Composition with application-notifications-in-app
37
+
38
+ The `forbidden` and `permission-denied` states POST request-access submissions to the applied notification centre. When `application-notifications-in-app` is applied, the pack asserts the applied notification centre receives the submission (a v1.1.0 mechanism-reach gap today; the current pack asserts the control's shape only). No global-topic overlap.
39
+
40
+ ## Probe pack
41
+
42
+ `probe-packs/application-empty-error-states.pack.mjs` ships eight surface-observable checks anchored to blueprint AC ids, one per named state:
43
+
44
+ - `AC-22101-1` not-found (heading, parent-surface link, search entry, tab title)
45
+ - `AC-22102-1` forbidden (request-access control, no resource-id leak)
46
+ - `AC-22103-1` server-error (retry, no stack trace, no path shape, no env-key shape)
47
+ - `AC-22104-1` permission-denied (class-level cause, no resource id)
48
+ - `AC-22105-1` offline (banner, buffered synthetic write, polite reconnection announcement)
49
+ - `AC-22106-1` empty-list (distinct visual wrapper, creation-affordance recovery)
50
+ - `AC-22107-1` no-search-results (distinct visual wrapper, echoed query, clear-filters recovery)
51
+ - `AC-22108-1` error-boundary (role=alert, retry control, no stack detail)
52
+
53
+ The pack applies to any FBS binding `TAC-2301-application-empty-error-states-state-machine` or whose navModel routes name an operator-configured error-shell path (matching `/probe/(not-found|forbidden|server-error|permission-denied|offline|empty-list|search|error-boundary)`). See `packages/rcf-lite/docs/blueprint-authoring.md` section 8c for the pack authoring rules.
@@ -0,0 +1,50 @@
1
+ # application-empty-error-states: operator guide
2
+
3
+ ## When to reach for it
4
+
5
+ Your project renders any surface whose input can be empty, whose network call can fail, whose user can lack scope, or whose client can crash mid-render. That covers every SPA that hits an API and every routed page that can dereference an id. You want one contract for the eight named states, one recovery-action router per state, one polite live-region for progress announcements, and a runtime pack that refuses ship on a stack-trace leak, a resource-id leak, a missing recovery affordance, or a dropped live-region wrapper.
6
+
7
+ ## The eight named states
8
+
9
+ The blueprint enumerates the eight states in the ratified order below. Every README, guide, pack `checks[]` and `docs/topics.md` row across the family names the same eight slugs.
10
+
11
+ - `not-found`: routed page dereferences an id that has been removed or was never there.
12
+ - `forbidden`: caller is authenticated but the target resource refuses; the surface offers a request-access affordance.
13
+ - `server-error`: a 500-class failure the client cannot recover from without a retry.
14
+ - `offline`: the client has lost the network; the surface announces the transition and, on reconnection, replays it through the polite live-region wrapper.
15
+ - `permission-denied`: the caller lacks a scope the target resource requires; the surface names the missing scope in the cause without leaking the resource id.
16
+ - `empty-list`: a collection surface has zero rows and offers the recovery-action router entry (create, clear filters, or invite, per project wiring).
17
+ - `no-search-results`: a query returned an empty set; the surface echoes the query verbatim and suggests broadening it.
18
+ - `error-boundary`: a client-side render exception was caught; the surface renders under `role="alert"` and offers a route-level recovery.
19
+
20
+ ## When NOT to reach for it
21
+
22
+ Your product is a marketing site or a static content surface with no dynamic state. The eight states model a live workspace; a static site has no offline mode, no per-resource forbidden state, no client-side render boundary, and forcing the model on a static site adds mechanism without payoff.
23
+
24
+ Your product has already committed to an opinionated single-vendor state library (Sentry with a bespoke boundary, a framework-specific error module) whose contract is materially different from the eight-state catalogue. Adopt this blueprint only when the vendor library composes with the state-machine TAC rather than replacing it.
25
+
26
+ ## What stays your call
27
+
28
+ - The visual design of each state region. The blueprint contributes WHAT surfaces under WHAT condition; the palette, spacing and typography are your project's design system's call.
29
+ - Whether the 500 surface hides the stack trace in staging (ADR-2302 elicited toggle) or hides it everywhere (the recommended default).
30
+ - The offline strategy: write-buffer (the default), read-only-banner, or refuse-writes (ADR-2303 elicited enum).
31
+ - The request-access endpoint the forbidden and permission-denied surfaces POST to. The blueprint declares the shape (`POST /api/request-access` with a JSON body); the endpoint's server-side handling is your call.
32
+ - The parent-surface path and clear-filters callback the recovery-action router wires into the rendered controls.
33
+
34
+ ## What a good outcome looks like
35
+
36
+ The pack fires on every FBS whose surface renders a routed page or a listing, and every check returns `pass` on the honest render and `fail` on the corresponding break switch. Your CI runs the fixture round-trip on every PR that touches a state region. Your operator sees eight distinct visuals in a screenshot review and can pick out which state a screenshot represents without reading the copy. Your accessibility audit's live-region check on the polite wrapper passes because the wrapper preseeded at page render, not on state entry. Your production 500 surface never leaks a source path, an environment variable, or a backtrace frame.
37
+
38
+ ## Mechanism-reach gaps
39
+
40
+ The blueprint's README lists the runtime-observable ACs the pack does NOT bind directly. Every gap is a candidate for a v1.1.0 minor bump extending the pack. Combine with `application-notifications-in-app` to route request-access submissions through the shipped notification centre and with `application-spa` to inherit the tab-title convention and the state-visual tokens.
41
+
42
+ ## Promotion signals
43
+
44
+ - Three or more consumer blueprints (forms-wizard, account-settings, dashboard, admin-console) start elicitizing the same sensitive-pattern extension for the 500 surface. Candidate: a `sensitivePatternsRegistry` global topic in a v1.1.0 minor.
45
+ - The offline-buffer TAC needs a shared engine across a persistence blueprint and this UI blueprint. Candidate: a dedicated `application-offline-sync` blueprint absorbing the write-buffer.
46
+ - The recovery-shape enum needs a request-access-inline shape (inline form rather than a POST). Candidate: a v1.1.0 minor bump extending TAC-2302's recovery-shape closed set.
47
+
48
+ ## Costs to be honest about
49
+
50
+ Realising all eight states honestly in a client is a chunk of code even after adopting the TACs; project-side wiring per framework is at least an afternoon per state. The pack is Playwright-first, so a project without a running dev server at gate time cannot fire it. The offline TAC assumes IndexedDB by default; a WebView with a locked-down storage policy elicits an alternative per ADR-2303 and takes a small amount of adapter code.