rcf-lite 0.12.0 → 0.14.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 (686) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +2 -0
  3. package/bin/rcf.js +3 -1
  4. package/bin/view-supervisor-child.mjs +0 -0
  5. package/blueprints/application-api-rest/README.md +40 -0
  6. package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
  7. package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
  8. package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
  9. package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
  10. package/blueprints/application-api-rest/blueprint.json +265 -0
  11. package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
  12. package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
  13. package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
  14. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
  15. package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
  16. package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
  17. package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
  18. package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
  19. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
  20. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
  21. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
  22. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
  23. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
  24. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
  25. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
  26. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
  27. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
  28. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
  29. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
  30. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
  31. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
  32. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
  33. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
  34. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
  35. package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
  36. package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
  37. package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
  38. package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
  39. package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
  40. package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
  41. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
  42. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
  43. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
  44. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
  45. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
  46. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
  47. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
  48. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
  49. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
  50. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
  51. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
  52. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
  53. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
  54. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
  55. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
  56. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
  57. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
  58. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
  59. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
  60. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
  61. package/blueprints/application-api-rest/docs/topics.md +46 -0
  62. package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
  63. package/blueprints/application-spa/README.md +90 -0
  64. package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
  65. package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
  66. package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
  67. package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
  68. package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
  69. package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
  70. package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
  71. package/blueprints/application-spa/assets/tokens/theme.css +169 -0
  72. package/blueprints/application-spa/assets/viewports.md +18 -0
  73. package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
  74. package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
  75. package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
  76. package/blueprints/application-spa/assets/wireframes/error.md +46 -0
  77. package/blueprints/application-spa/assets/wireframes/form.md +50 -0
  78. package/blueprints/application-spa/assets/wireframes/list.md +45 -0
  79. package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
  80. package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
  81. package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
  82. package/blueprints/application-spa/blueprint.json +387 -0
  83. package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
  84. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
  85. package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
  86. package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
  87. package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
  88. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
  89. package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
  90. package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
  91. package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
  92. package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
  93. package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
  94. package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
  95. package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
  96. package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
  97. package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
  98. package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
  99. package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
  100. package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
  101. package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
  102. package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
  103. package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
  104. package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
  105. package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
  106. package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
  107. package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
  108. package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
  109. package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
  110. package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
  111. package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
  112. package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
  113. package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
  114. package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
  115. package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
  116. package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
  117. package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
  118. package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
  119. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
  120. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
  121. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
  122. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
  123. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
  124. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
  125. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
  126. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
  127. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
  128. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
  129. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
  130. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
  131. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
  132. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
  133. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
  134. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
  135. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
  136. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
  137. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
  138. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
  139. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
  140. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
  141. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
  142. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
  143. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
  144. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
  145. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
  146. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
  147. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
  148. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
  149. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
  150. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
  151. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
  152. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
  153. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
  154. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
  155. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
  156. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
  157. package/blueprints/application-spa/docs/topics.md +57 -0
  158. package/blueprints/application-spa/guide/application-spa.md +40 -0
  159. package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
  160. package/blueprints/delivery-ci-workflows/README.md +57 -0
  161. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +55 -0
  162. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +65 -0
  163. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +71 -0
  164. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +61 -0
  165. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
  166. package/blueprints/delivery-ci-workflows/assets/report-samples/per-gate.json +13 -0
  167. package/blueprints/delivery-ci-workflows/assets/report-samples/pipeline.json +28 -0
  168. package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
  169. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
  170. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +25 -0
  171. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-703-delivery-ci-workflows-node-only-runner.json +25 -0
  172. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-704-delivery-ci-workflows-report-shape.json +25 -0
  173. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
  174. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
  175. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
  176. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
  177. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
  178. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
  179. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
  180. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json +18 -0
  181. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json +18 -0
  182. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +18 -0
  183. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json +18 -0
  184. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json +18 -0
  185. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json +18 -0
  186. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json +18 -0
  187. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
  188. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json +18 -0
  189. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
  190. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
  191. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
  192. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
  193. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
  194. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
  195. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
  196. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
  197. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
  198. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
  199. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
  200. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
  201. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
  202. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-701-delivery-ci-workflows-gate-runner.json +59 -0
  203. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-702-delivery-ci-workflows-gate-report.json +32 -0
  204. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-703-delivery-ci-workflows-aggregate-report.json +41 -0
  205. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +64 -0
  206. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
  207. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
  208. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
  209. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json +36 -0
  210. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json +37 -0
  211. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json +37 -0
  212. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json +36 -0
  213. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json +36 -0
  214. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json +37 -0
  215. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json +37 -0
  216. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
  217. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json +36 -0
  218. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
  219. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
  220. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
  221. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
  222. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
  223. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
  224. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
  225. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
  226. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
  227. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
  228. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
  229. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
  230. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
  231. package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
  232. package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +136 -0
  233. package/blueprints/deploy-cloudflare-workers/README.md +63 -0
  234. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
  235. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
  236. package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
  237. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
  238. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
  239. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
  240. package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
  241. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
  242. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
  243. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
  244. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
  245. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
  246. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
  247. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
  248. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
  249. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
  250. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
  251. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
  252. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
  253. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
  254. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
  255. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
  256. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
  257. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
  258. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
  259. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
  260. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
  261. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
  262. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
  263. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
  264. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
  265. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
  266. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
  267. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
  268. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
  269. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
  270. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
  271. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
  272. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
  273. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
  274. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
  275. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
  276. package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
  277. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
  278. package/blueprints/email-smtp-resend/README.md +45 -0
  279. package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
  280. package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
  281. package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
  282. package/blueprints/email-smtp-resend/blueprint.json +23 -0
  283. package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
  284. package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
  285. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
  286. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
  287. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
  288. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
  289. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
  290. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
  291. package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
  292. package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
  293. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
  294. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
  295. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
  296. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
  297. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
  298. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
  299. package/blueprints/email-smtp-resend/docs/topics.md +44 -0
  300. package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
  301. package/blueprints/observability-essentials/README.md +53 -0
  302. package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
  303. package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
  304. package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
  305. package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
  306. package/blueprints/observability-essentials/blueprint.json +54 -0
  307. package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
  308. package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
  309. package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
  310. package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
  311. package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
  312. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
  313. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
  314. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
  315. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
  316. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
  317. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
  318. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
  319. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
  320. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
  321. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
  322. package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
  323. package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
  324. package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
  325. package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
  326. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
  327. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
  328. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
  329. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
  330. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
  331. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
  332. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
  333. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
  334. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
  335. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
  336. package/blueprints/observability-essentials/docs/topics.md +57 -0
  337. package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
  338. package/blueprints/observability-probe-endpoints/README.md +53 -0
  339. package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
  340. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
  341. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
  342. package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
  343. package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
  344. package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
  345. package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
  346. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
  347. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
  348. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
  349. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
  350. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
  351. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
  352. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
  353. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
  354. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
  355. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
  356. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
  357. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
  358. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
  359. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
  360. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
  361. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
  362. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
  363. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
  364. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
  365. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
  366. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
  367. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
  368. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
  369. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
  370. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
  371. package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
  372. package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
  373. package/blueprints/persistence-data-d1/README.md +50 -0
  374. package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
  375. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
  376. package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
  377. package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
  378. package/blueprints/persistence-data-d1/blueprint.json +42 -0
  379. package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
  380. package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
  381. package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
  382. package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
  383. package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
  384. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
  385. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
  386. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
  387. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
  388. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
  389. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
  390. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
  391. package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
  392. package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
  393. package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
  394. package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
  395. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
  396. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
  397. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
  398. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
  399. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
  400. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
  401. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
  402. package/blueprints/persistence-data-d1/docs/topics.md +59 -0
  403. package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
  404. package/blueprints/persistence-data-sqlite/README.md +50 -0
  405. package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
  406. package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
  407. package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
  408. package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
  409. package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
  410. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
  411. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
  412. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
  413. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
  414. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
  415. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
  416. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
  417. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
  418. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
  419. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
  420. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
  421. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
  422. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
  423. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
  424. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
  425. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
  426. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
  427. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
  428. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
  429. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
  430. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
  431. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
  432. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
  433. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
  434. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
  435. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
  436. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
  437. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
  438. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
  439. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
  440. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
  441. package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
  442. package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
  443. package/blueprints/security-auth-clerk/README.md +52 -0
  444. package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
  445. package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
  446. package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
  447. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
  448. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
  449. package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
  450. package/blueprints/security-auth-clerk/blueprint.json +42 -0
  451. package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
  452. package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
  453. package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
  454. package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
  455. package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
  456. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
  457. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
  458. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
  459. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
  460. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
  461. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
  462. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
  463. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
  464. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
  465. package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
  466. package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
  467. package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
  468. package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
  469. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
  470. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
  471. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
  472. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
  473. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
  474. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
  475. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
  476. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
  477. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
  478. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
  479. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
  480. package/blueprints/security-auth-clerk/docs/topics.md +56 -0
  481. package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +80 -0
  482. package/blueprints/security-auth-keycloak/README.md +56 -0
  483. package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
  484. package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
  485. package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
  486. package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
  487. package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
  488. package/blueprints/security-auth-keycloak/blueprint.json +49 -0
  489. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
  490. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
  491. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
  492. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
  493. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
  494. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
  495. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
  496. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
  497. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
  498. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
  499. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
  500. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
  501. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
  502. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
  503. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
  504. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
  505. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
  506. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
  507. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
  508. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
  509. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
  510. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
  511. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
  512. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
  513. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
  514. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
  515. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
  516. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
  517. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
  518. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
  519. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
  520. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
  521. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
  522. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
  523. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
  524. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
  525. package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
  526. package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
  527. package/blueprints/security-auth-magic-link/README.md +46 -0
  528. package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
  529. package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
  530. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
  531. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
  532. package/blueprints/security-auth-magic-link/blueprint.json +45 -0
  533. package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
  534. package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
  535. package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
  536. package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
  537. package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
  538. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
  539. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
  540. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
  541. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
  542. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
  543. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
  544. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
  545. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
  546. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
  547. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
  548. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
  549. package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
  550. package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
  551. package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
  552. package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
  553. package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
  554. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
  555. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
  556. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
  557. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
  558. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
  559. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
  560. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
  561. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
  562. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
  563. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
  564. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
  565. package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
  566. package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
  567. package/blueprints/security-auth-oauth2/README.md +50 -0
  568. package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
  569. package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
  570. package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
  571. package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
  572. package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
  573. package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
  574. package/blueprints/security-auth-oauth2/blueprint.json +44 -0
  575. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
  576. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
  577. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
  578. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
  579. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
  580. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
  581. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
  582. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
  583. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
  584. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
  585. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
  586. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
  587. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
  588. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
  589. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
  590. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
  591. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
  592. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
  593. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
  594. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
  595. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
  596. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
  597. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
  598. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
  599. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
  600. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
  601. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
  602. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
  603. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
  604. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
  605. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
  606. package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
  607. package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
  608. package/blueprints/security-secrets-management/README.md +48 -0
  609. package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
  610. package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
  611. package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
  612. package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
  613. package/blueprints/security-secrets-management/blueprint.json +43 -0
  614. package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
  615. package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
  616. package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
  617. package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
  618. package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
  619. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
  620. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
  621. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
  622. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
  623. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
  624. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
  625. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
  626. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
  627. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
  628. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
  629. package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
  630. package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
  631. package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
  632. package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
  633. package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
  634. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
  635. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
  636. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
  637. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
  638. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
  639. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
  640. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
  641. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
  642. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
  643. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
  644. package/blueprints/security-secrets-management/docs/topics.md +46 -0
  645. package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
  646. package/fixtures/canary-manifest.json +1 -101
  647. package/guidance/build-cycle-playbook.md +2 -2
  648. package/guidance/document-model.md +1 -1
  649. package/guidance/harness-template.md +13 -0
  650. package/guidance/managed/agent-instructions-block.hash +1 -1
  651. package/guidance/managed/agent-instructions-block.md +13 -0
  652. package/package.json +18 -9
  653. package/rcf/adrs/adr-001.json +1 -1
  654. package/rcf/adrs/adr-009.json +1 -1
  655. package/rcf/build-sequence.json +1 -1
  656. package/rcf/manifest.json +2 -2
  657. package/rcf/prd.json +2 -2
  658. package/releases/releases.yaml +116 -0
  659. package/scripts/preinstall-node-check.mjs +61 -0
  660. package/src/blueprint/apply.js +62 -18
  661. package/src/blueprint/conflicts.js +8 -8
  662. package/src/blueprint/index.js +14 -1
  663. package/src/blueprint/library-loader.js +271 -0
  664. package/src/blueprint/library-registry.js +341 -0
  665. package/src/blueprint/list.js +94 -0
  666. package/src/blueprint/loader.js +26 -1
  667. package/src/blueprint/namespace.js +20 -16
  668. package/src/blueprint/shelf-resolver.js +286 -0
  669. package/src/blueprint/supersede.js +3 -2
  670. package/src/browser-verify/invariants.js +40 -0
  671. package/src/browser-verify/runner.js +2 -0
  672. package/src/cli/blueprint-library.js +419 -0
  673. package/src/cli/blueprint.js +91 -10
  674. package/src/cli/guidance.js +1 -1
  675. package/src/cli/help.js +27 -1
  676. package/src/cli/init.js +2 -0
  677. package/src/cli/version.js +673 -0
  678. package/src/cli/view.js +282 -1
  679. package/src/core/store/writer.js +64 -2
  680. package/src/server/index.js +3 -0
  681. package/src/server/routes.js +15 -1
  682. package/src/server/scope-endpoint.js +105 -0
  683. package/src/setup/agent-setup.js +28 -10
  684. package/src/view/live-client.js +253 -6
  685. package/src/view/scope.js +231 -0
  686. package/src/view/style.css +42 -0
@@ -0,0 +1,76 @@
1
+ # Migration entry shape
2
+
3
+ Every entry in the migration catalog (TAC-603) has this exact shape:
4
+
5
+ ```
6
+ {
7
+ version: <integer>, // monotonic, starts at 1, no gaps
8
+ description: <string>, // human-readable; ships in the migration-failed error
9
+ statements: [<string>, ...] // one or more engine-native DDL/data statements
10
+ }
11
+ ```
12
+
13
+ The `statements` list executes inside one transaction opened by the migration runner (TAC-602); the version bookkeeping row inserts inside the same transaction. On any failure, the transaction rolls back and the on-disk version reflects the last successfully committed migration.
14
+
15
+ ## Worked example
16
+
17
+ A four-migration catalog starting with an eleven-table initial schema, followed by a soft-delete column, a boot marker, and a notifier-schema expansion. Statements are SQLite dialect at the default engine (ADR-601); the shape is identical under any alternate engine ADR-601 is superseded to.
18
+
19
+ ```javascript
20
+ export const MIGRATIONS = [
21
+ {
22
+ version: 1,
23
+ description: 'initial schema, eleven entities',
24
+ statements: [
25
+ `CREATE TABLE schemaVersion (
26
+ version INTEGER PRIMARY KEY,
27
+ appliedAt TEXT NOT NULL
28
+ )`,
29
+ `CREATE TABLE entityA (
30
+ id TEXT PRIMARY KEY,
31
+ name TEXT NOT NULL UNIQUE,
32
+ createdAt TEXT NOT NULL,
33
+ updatedAt TEXT NOT NULL
34
+ )`,
35
+ // ... nine more CREATE TABLE statements per the initial schema
36
+ ],
37
+ },
38
+ {
39
+ version: 2,
40
+ description: 'soft-delete: entityA.removedAt column for file-lane removal without eager history loss',
41
+ statements: [
42
+ `ALTER TABLE entityA ADD COLUMN removedAt TEXT`,
43
+ ],
44
+ },
45
+ {
46
+ version: 3,
47
+ description: 'boot markers: audit trail of process starts for honest-gap accounting',
48
+ statements: [
49
+ `CREATE TABLE bootMarker (
50
+ bootAt TEXT PRIMARY KEY
51
+ )`,
52
+ ],
53
+ },
54
+ {
55
+ version: 4,
56
+ description: 'notifier: per-entity channel routes and pending-delivery resume queue',
57
+ statements: [
58
+ `CREATE TABLE entityChannelRoute (
59
+ entityId TEXT NOT NULL,
60
+ channelId TEXT NOT NULL,
61
+ PRIMARY KEY (entityId, channelId)
62
+ )`,
63
+ `ALTER TABLE channel ADD COLUMN isDefault INTEGER NOT NULL DEFAULT 0`,
64
+ ],
65
+ },
66
+ ];
67
+
68
+ export const CURRENT_VERSION = MIGRATIONS[MIGRATIONS.length - 1].version;
69
+ ```
70
+
71
+ ## Rules a project must not break
72
+
73
+ - **Version integers are monotonic and start at 1 with no gaps.** A missing version between shipped entries breaks the ordering guarantee the runner relies on. Two contributors landing overlapping versions is a merge conflict, not a runtime bug.
74
+ - **A shipped migration is never edited.** Adding a statement to an already-shipped entry is a silent schema divergence between production stores at different open cycles. Fixes ship as new numbered migrations.
75
+ - **The statements list is engine-native.** Dialect matches the engine selected in ADR-601 (or its superseding project ADR). Statements are strings, not query builders; the runner does not interpret them.
76
+ - **The bookkeeping insert is the runner's responsibility, not the migration's.** A migration whose statements include an `INSERT INTO schemaVersion` corrupts the runner's ordering; the runner already handles that insert inside the same transaction.
@@ -0,0 +1,50 @@
1
+ {
2
+ "slug": "persistence-data-sqlite",
3
+ "version": "1.0.0",
4
+ "category": "persistence",
5
+ "contributions": [
6
+ { "id": "persistence-data-sqlite-REQ-001", "kind": "req", "path": "requirements/persistence-data-sqlite-req-001.json" },
7
+ { "id": "persistence-data-sqlite-REQ-002", "kind": "req", "path": "requirements/persistence-data-sqlite-req-002.json" },
8
+ { "id": "persistence-data-sqlite-REQ-003", "kind": "req", "path": "requirements/persistence-data-sqlite-req-003.json" },
9
+ { "id": "persistence-data-sqlite-REQ-004", "kind": "req", "path": "requirements/persistence-data-sqlite-req-004.json" },
10
+ { "id": "persistence-data-sqlite-REQ-005", "kind": "req", "path": "requirements/persistence-data-sqlite-req-005.json" },
11
+ { "id": "persistence-data-sqlite-REQ-006", "kind": "req", "path": "requirements/persistence-data-sqlite-req-006.json" },
12
+ { "id": "persistence-data-sqlite-REQ-007", "kind": "req", "path": "requirements/persistence-data-sqlite-req-007.json" },
13
+ { "id": "persistence-data-sqlite-REQ-008", "kind": "req", "path": "requirements/persistence-data-sqlite-req-008.json" },
14
+ { "id": "persistence-data-sqlite-REQ-009", "kind": "req", "path": "requirements/persistence-data-sqlite-req-009.json" },
15
+ { "id": "persistence-data-sqlite-REQ-010", "kind": "req", "path": "requirements/persistence-data-sqlite-req-010.json" },
16
+ { "id": "persistence-data-sqlite-REQ-011", "kind": "req", "path": "requirements/persistence-data-sqlite-req-011.json" },
17
+ { "id": "persistence-data-sqlite-US-5101", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5101.json" },
18
+ { "id": "persistence-data-sqlite-US-5102", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5102.json" },
19
+ { "id": "persistence-data-sqlite-US-5103", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5103.json" },
20
+ { "id": "persistence-data-sqlite-US-5104", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5104.json" },
21
+ { "id": "persistence-data-sqlite-US-5105", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5105.json" },
22
+ { "id": "persistence-data-sqlite-US-5106", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5106.json" },
23
+ { "id": "persistence-data-sqlite-US-5107", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5107.json" },
24
+ { "id": "persistence-data-sqlite-US-5108", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5108.json" },
25
+ { "id": "persistence-data-sqlite-US-5109", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5109.json" },
26
+ { "id": "persistence-data-sqlite-US-5110", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5110.json" },
27
+ { "id": "persistence-data-sqlite-US-5111", "kind": "us", "path": "user-stories/persistence-data-sqlite-us-5111.json" },
28
+ { "id": "TAC-601-persistence-data-sqlite-store", "kind": "tac", "path": "tacs/tac-601-persistence-data-sqlite-store.json" },
29
+ { "id": "TAC-602-persistence-data-sqlite-migration-runner", "kind": "tac", "path": "tacs/tac-602-persistence-data-sqlite-migration-runner.json" },
30
+ { "id": "TAC-603-persistence-data-sqlite-migration-catalog", "kind": "tac", "path": "tacs/tac-603-persistence-data-sqlite-migration-catalog.json" },
31
+ { "id": "TAC-604-persistence-data-sqlite-backup-runner", "kind": "tac", "path": "tacs/tac-604-persistence-data-sqlite-backup-runner.json" },
32
+ {
33
+ "id": "ADR-601-persistence-data-sqlite-store-model",
34
+ "kind": "adr",
35
+ "path": "adrs/adr-601-persistence-data-sqlite-store-model.json",
36
+ "scope": "global",
37
+ "topic": "persistenceStore"
38
+ },
39
+ {
40
+ "id": "ADR-602-persistence-data-sqlite-migration-discipline",
41
+ "kind": "adr",
42
+ "path": "adrs/adr-602-persistence-data-sqlite-migration-discipline.json",
43
+ "scope": "global",
44
+ "topic": "migrationDiscipline"
45
+ },
46
+ { "id": "ADR-603-persistence-data-sqlite-event-secrecy", "kind": "adr", "path": "adrs/adr-603-persistence-data-sqlite-event-secrecy.json" },
47
+ { "id": "ADR-604-persistence-data-sqlite-store-boundary", "kind": "adr", "path": "adrs/adr-604-persistence-data-sqlite-store-boundary.json" },
48
+ { "id": "ADR-605-persistence-data-sqlite-backup-model", "kind": "adr", "path": "adrs/adr-605-persistence-data-sqlite-backup-model.json" }
49
+ ]
50
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "adrId": "ADR-601-persistence-data-sqlite-store-model",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Single SQLite file with WAL-mode crash safety as the project's default durable store; Postgres as a documented future variant",
8
+ "context": "A project has one primary durable store: the substrate every domain entity lives in and every domain query resolves against. Choice of engine sets the crash-safety story, the backup story, the deploy story, the ops footprint, and the scale ceiling. The rcf-lite tier this blueprint targets is small single-deployable greenfield: one team, one host or one small container fleet, no ops team standing by. That tier has a natural answer.",
9
+ "decision": "The default primary durable store is a single SQLite file opened in WAL journal mode with synchronous=NORMAL, foreign_keys=ON, accessed through the store facade (TAC-601) which is the only module that imports the SQLite binding. One file per deployed instance; the file path is a configuration input to the open entry point; backups are file-level snapshots taken through the backup runner (TAC-604) without downtime; migrations are numbered forward-only entries in the in-tree catalog (TAC-603) applied at open by the runner (TAC-602). Postgres is a documented future variant behind the same facade: a project that outgrows SQLite supersedes this ADR with a project-level ADR selecting the alternate engine, replaces the facade's engine binding, and rewrites the migration catalog into the alternate dialect. The blueprint mechanism does not ship a Postgres variant as an alternate contribution at v1.0.0 because the mechanism has no variant/profile selector: two engine TACs contributed together would both need realising or both leave dangling references. One default plus a documented promotion path is the shape that fits the mechanism today.",
10
+ "consequences": "The project inherits zero-infrastructure persistence: no database server, no connection pool, no network round trip; the store is a file on the same host the process runs on. Backups are file copies. Deploys move the file with the container image or with the volume mount. Kill-9 tolerance is a WAL property, not a hand-rolled invariant. The scale ceiling is a single-writer envelope: multi-writer workloads and cross-host replication are out of reach without switching engines, and the promotion signal is real (see guide 'when it does not fit'). Composing blueprints that hold an opinion on the store engine conflict on the persistenceStore topic; the expected resolution is one project-level ADR that fixes the engine and states the reasoning for the tier, superseding this ADR and any composing blueprint's contribution.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Ship Postgres as a co-contributed alternate engine TAC alongside SQLite in v1.0.0",
14
+ "summary": "The blueprint contributes TAC-601-sqlite-store and TAC-601-postgres-store side by side; the project picks one at apply time.",
15
+ "reasonNotChosen": "The rcf-lite blueprint mechanism (Phase 1) has no variant/profile selector. Two TACs contributed together are both applied, and both leave dangling tacIds references on their user stories if the project only realises one. Adding a mechanism-level variant concept is a v1.1 investment; deferring the second engine to a superseding project-level ADR keeps v1.0.0 shippable and mirrors the security-auth-magic-link blueprint's keycloak-local deferral (see the auth guide 'when it does not fit')."
16
+ },
17
+ {
18
+ "name": "Postgres-first with SQLite as a test-only shim",
19
+ "summary": "Default to Postgres for production and offer SQLite as an ephemeral engine for tests.",
20
+ "reasonNotChosen": "Wrong shape for the tier. A single-deployable rcf-lite project should not carry a database server as a hard dependency at v1. Test-only in-memory doubles satisfy the test story more cheaply than a schema-mirrored SQLite for a Postgres deployment, at the cost of test fidelity that projects can trade explicitly."
21
+ },
22
+ {
23
+ "name": "Schema-agnostic KV store (RocksDB, LMDB)",
24
+ "summary": "Drop the relational shape and use a byte-oriented KV store as the substrate.",
25
+ "reasonNotChosen": "The relational shape is what makes the query story sane for the domain the rcf-lite tier typically ships. A KV substrate pushes the query problem into application code and gives up the constraint-checking safety net that SQLite provides for free. Projects whose domain is genuinely KV-shaped (opaque blob storage, event streams) supersede this ADR."
26
+ }
27
+ ],
28
+ "createdAt": "2026-08-21T00:00:00Z",
29
+ "updatedAt": "2026-08-21T00:00:00Z"
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "adrId": "ADR-602-persistence-data-sqlite-migration-discipline",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Forward-only numbered migrations applied atomically at open; refuse to boot against a store newer than the build",
8
+ "context": "Schema evolution in a running system has three failure modes: silent drift (the deployed schema does not match the code's assumptions), half-application (a migration ran partway and left the store in an undefined shape), and reverse-compatibility hazard (an older build opens a newer store and reads through unknown columns). The migration story has to close all three at the substrate level; asking every future contributor to hand-implement the discipline is the shape that produces the incident.",
9
+ "decision": "Schema evolution is a forward-only numbered migration catalog. Each migration entry carries a monotonic version integer, a description string, and one or more DDL/data statements. The migration runner (TAC-602) applies pending entries in ascending order at store open; each entry runs inside one transaction whose scope covers every statement plus the version bookkeeping insert. A per-migration failure rolls back the transaction, throws a migration-failed error naming the failing version, and does not attempt later entries. When the on-disk highest version is strictly greater than the catalog's max, the runner throws a refuse-newer error with a stable code and does not open the store. There are no down migrations: a rollback to an older schema is a redeploy against the older build, and the newer store refuses to open under the older build (that refusal is the safety property).",
10
+ "consequences": "Deploys are reproducible from a git ref because the catalog and the code that opens the store ship in one commit. Half-migrations are structurally impossible: a mid-migration crash rolls back the transaction and the on-disk version remains the last successfully committed one. Reverse-compatibility incidents fail loudly at boot instead of silently at the first read. The cost is that a botched schema change is a code fix and a redeploy, not a schema-side undo: projects that need to revert a migration in-place cannot, and must instead ship a compensating forward migration under a new version. Composing blueprints that hold their own opinion on migration discipline (event-sourced projections, dual-write patterns, tenant-per-schema) conflict on the migrationDiscipline topic; the expected resolution is one project-level ADR that fixes the discipline for the project.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Bidirectional up/down migrations",
14
+ "summary": "Every migration ships an up statement set and a down statement set; the runner supports rolling back to an older version by executing the down statements in reverse order.",
15
+ "reasonNotChosen": "Down migrations are notoriously wrong (contributors write them from imagination, not from testing, and the first time they run in anger is when they are needed). The refuse-newer property gives the safety a down migration is supposed to give (older code cannot damage a newer store), without the maintenance cost of a shipping-and-testing down path that is exercised approximately never."
16
+ },
17
+ {
18
+ "name": "Best-effort tolerant reads under an older build",
19
+ "summary": "The older build opens the newer store, ignores unknown columns, and serves reads it can express.",
20
+ "reasonNotChosen": "The failure mode is silent data damage on writes: an INSERT that does not name a NOT NULL column added in the newer schema fails at the engine, and an UPDATE that overwrites structured data with the older shape corrupts the newer data. Refuse-at-boot is the only reliable posture; the operator sees the error at deploy time rather than at 03:00 when a customer notices."
21
+ },
22
+ {
23
+ "name": "Migrations run through an external tool (e.g. Flyway, Alembic) invoked out-of-band at deploy",
24
+ "summary": "The store code assumes the schema is already at the right version; a deploy step external to the process runs the migrations.",
25
+ "reasonNotChosen": "Adds a moving part to the deploy pipeline and to the ops runbook, decouples the migration-run success signal from the process-start success signal, and introduces the possibility of a process starting against a store the migrations have not been run on. Running migrations at open ties the two success signals together and makes the process refuse to start on any deploy that skipped the migration step."
26
+ }
27
+ ],
28
+ "createdAt": "2026-08-21T00:00:00Z",
29
+ "updatedAt": "2026-08-21T00:00:00Z"
30
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-603-persistence-data-sqlite-event-secrecy",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Store event fields are restricted to store metadata; no domain-row values reach the event sink",
8
+ "context": "The store's event log describes the store's own lifecycle (opened, migrated, backupCheckpoint, closed). The store also holds the domain's most sensitive material: session handles, token secrets, credential material, private keys, whatever the project stores. Conflating the two produces a log stream that a downstream observability provider cannot be trusted with, and that a log-store breach turns into a domain-data breach. The store's log shape is distinct from the application-api-rest tier's wire-log shape (topic 'logging', owned by the application-api-rest blueprint's ADR-304): this ADR governs the store event surface only.",
9
+ "decision": "Every field on every store event is restricted to store metadata: the event name string, an ISO-8601 timestamp, the store identifier (path or connection string), schema version integers, migration version integers, migration description strings, applied-version arrays, and backup artifact paths. No event field is populated with a value read from a domain row; no event field is populated with a value derived from a domain-row column marked as secret. The discipline is enforced at emit time inside the store facade (TAC-601) and the backup runner (TAC-604); the sink is treated as though it ships every field to a third-party observability provider by default. Downstream redaction is not relied on.",
10
+ "consequences": "The store's event log is safe to ship to any observability provider the operator picks; no per-provider redaction rule is negotiated. A log-store breach exposes lifecycle metadata (when did the store open, what version did it migrate through, when did the last snapshot land) but no domain data. Operators who need per-request correlation between the store's events and the domain surface derive a correlation id from something other than a row value (the request id is the intended surface). The REST tier's own log shape (ADR-304, wire logs) governs its own field set; the two logs may share a shipper but do not share this ADR's rules.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Emit domain-row values inside store events under a downstream redaction rule",
14
+ "summary": "Ship rich events with domain context and rely on a log-shipper redactor to strip secret fields.",
15
+ "reasonNotChosen": "Redactors miss cases (new field, misspelled field, escaped value in a nested structure), and the log is already on disk on the emitting host by the time the redactor runs. Not-emitting-at-source is the only reliable posture."
16
+ },
17
+ {
18
+ "name": "Hashed domain values in event fields",
19
+ "summary": "Emit a stable hash of the value so investigations can correlate without exposing the plaintext.",
20
+ "reasonNotChosen": "A hashed handle still lets an attacker with log access confirm 'this handle is the handle for that principal', which is enough for correlation attacks. The request id already provides the correlation surface without leaking anything, and no store-lifecycle event has a use case for domain-row correlation."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-21T00:00:00Z",
24
+ "updatedAt": "2026-08-21T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-604-persistence-data-sqlite-store-boundary",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "The store facade is the only module that imports the engine binding; consumers use named domain verbs, not raw queries",
8
+ "context": "A persistence boundary that leaks (the domain code imports the engine binding, or the facade exposes a general-purpose raw-query passthrough) is a boundary the swap-out story does not work through, the test-double story does not work through, and the reasoning-about-persistence-code-paths story does not work through. Every one of those benefits depends on the boundary being narrow at the point of consumption, not merely intended to be narrow.",
9
+ "decision": "One module (the store facade, TAC-601) imports the engine binding for the engine chosen in ADR-601. Every other module in the source tree that touches persistence imports the store facade and calls its named verbs. The facade's public surface exposes named domain verbs (insertX, findX, updateX, deleteX and the domain equivalents) with typed parameters; it does not expose a general-purpose query method whose parameter is a raw SQL string or an engine-native query object supplied by consumer code. When a consumer needs a query the facade does not currently express, the fix is to add a named verb to the facade, not to bypass the facade with a raw query.",
10
+ "consequences": "The engine choice is swappable because there is exactly one place that changes. Domain tests run against an in-memory double that implements the same verb surface, without importing the engine binding at any point in the test's call path. Every persistence code path is discoverable by grepping for the facade's exports. Consumers pay a small cost when they need a new query shape (a facade edit and a consumer edit, in one commit); the size of that cost is the mechanism enforcing the boundary. Composing blueprints that contribute persistence-adjacent components (a cache, an outbox, a projection) contribute their own facade modules on the same discipline; every one of them imports the store facade for its persistence needs, not the engine binding.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "General-purpose raw-query passthrough on the facade",
14
+ "summary": "The facade exposes execute(sql, params) that consumers use for ad-hoc queries the facade does not otherwise express.",
15
+ "reasonNotChosen": "Any raw-query passthrough migrates over time from 'occasional escape hatch' to 'the way consumers write queries'. Every such call site is a code path that has to be re-audited on an engine swap, a code path that cannot be tested against an in-memory double, and a code path where the reasoning about the store's shape lives in string literals scattered across the codebase. The escape hatch is not worth the boundary erosion."
16
+ },
17
+ {
18
+ "name": "Domain-code direct engine imports for hot-path queries",
19
+ "summary": "Performance-sensitive queries import the engine binding directly and skip the facade.",
20
+ "reasonNotChosen": "Performance is not a defensible reason to erode the boundary at the rcf-lite tier: the facade adds no measurable overhead over the engine binding, and hot-path queries that genuinely need it are a rare-enough case to justify a specialised facade verb rather than an import-graph shortcut. Projects that outgrow the tier and need a different posture do so by superseding this ADR with reasoning."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-21T00:00:00Z",
24
+ "updatedAt": "2026-08-21T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-605-persistence-data-sqlite-backup-model",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Backup is a file-level snapshot of the store artifact taken without downtime",
8
+ "context": "A backup story has three axes: what the artifact is (a file, a logical dump, a stream), when it can run (with the application quiesced, with the application live), and how it recovers (point a build at the artifact, run a restore tool). For the rcf-lite tier with the SQLite default engine and the store-facade boundary, the file-level snapshot is the natural answer: the engine already writes the store as one file, the WAL posture already tolerates concurrent snapshot, and recovery is 'point a compatible build at the file'.",
9
+ "decision": "The backup runner (TAC-604) snapshots the store to a portable artifact while the application keeps serving reads and writes. Under the SQLite default engine, the runner uses the online-backup API or a WAL-checkpoint-then-file-copy; the writer connection stays available. The artifact is engine-native: a SQLite file, not a schema-agnostic dump. Recovery is opening the artifact through the same store facade against a compatible build. A backupCheckpoint event fires on completion carrying the artifact path and the ISO-8601 completion timestamp. Cross-engine migration (a SQLite backup restored into Postgres) is out of scope for this blueprint; projects that need it author a project-side logical-dump runner beside this one, and the file-level runner remains the primary recovery path.",
10
+ "consequences": "The backup story is cheap to run and cheap to test: a scheduler invokes store.backup(outputPath) on a cron, the operator inspects the backupCheckpoint event stream for freshness, and a recovery exercise is opening a copied file with the same build. No maintenance window is planned; no ops-side backup daemon is deployed. The cost is that the artifact is engine-native: switching engines is not restore-and-go, and a project that needs a portable dump does so on top of the file-level story. Projects that need cross-region replication supersede this ADR with an engine-native replication decision (SQLite Litestream, Postgres physical replication, or the engine promoted by ADR-601).",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Logical schema-aware dump as the primary backup",
14
+ "summary": "The backup runner produces a SQL script that recreates the schema and the rows; recovery replays the script.",
15
+ "reasonNotChosen": "Logical dumps are portable but slow on the write path (encoding every value as SQL) and slow on the recovery path (replaying every statement). For the rcf-lite tier the size and frequency of backups make the portability trade uneconomic. Projects that need portability author a logical dump runner beside the file-level one, kept in sync by the schema catalog."
16
+ },
17
+ {
18
+ "name": "Quiesce-and-copy (planned downtime for backup)",
19
+ "summary": "The application takes a maintenance window; the backup runner copies the file with no writers active.",
20
+ "reasonNotChosen": "Any backup story that requires downtime is a backup story the operator skips. The engine's online-backup posture makes the downtime unnecessary; the cost of the online path is a small pause on the writer during the final page copy, which is invisible at the request timescale."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-21T00:00:00Z",
24
+ "updatedAt": "2026-08-21T00:00:00Z"
25
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "Every persistent entity lives in a single durable store opened via one boot-time entry point",
5
+ "description": "The application persists every stateful entity (session records, work items, audit trail, whatever the project's domain model requires) in a single durable store. The store is opened exactly once at process boot through a single entry point that other components import; nothing else in the process opens the underlying database file or connection. When the entry point returns, migrations have run and the store is ready to serve consumer calls.",
6
+ "category": "functional",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "Multiple entry points into the same durable substrate is the shape that produces stale caches, dueling migrations, and lock contention. One entry point at boot means one migration pass, one connection posture, one place to test and one place to fix. Consumers that need a persistence surface import the facade, not the engine.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:01-store-facade"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "The store schema is versioned; every schema change is a numbered forward-only migration committed in-tree",
5
+ "description": "Schema evolution is expressed as an ordered catalog of numbered migrations. Each migration carries a monotonic version integer, a human description, and one or more DDL/data statements. The catalog lives in-tree next to the store code and is the sole source of schema truth; the store's current version is a fact recorded in a bookkeeping row inside the store itself and updated only by the migration runner.",
6
+ "category": "technical",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "A schema catalog committed in-tree makes deploys reproducible: the code that opens the store and the migrations it expects ship together in one commit. Numbered forward-only migrations avoid the two failure modes of ad-hoc schema drift (undocumented change, incompatible rollback). Bookkeeping inside the store means the fact of a version cannot desync from the tables the version describes.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:02-migration-catalog"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "The store refuses to open when the on-disk schema version is newer than the build's max known version",
5
+ "description": "At open time, the migration runner reads the on-disk schema version from the bookkeeping table and compares it against the build's max known migration version. When the on-disk version is strictly greater than the build's max, the runner throws a specific error with a stable code and a message naming both versions; the process fails to start. The store makes no writes on this path.",
6
+ "category": "technical",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "Deploying an older build against a newer store is not a safe operation: the older build does not know about the schema shape the newer build wrote, and reads and writes against unknown columns are the shape that corrupts data silently. Refusing at open is the only place the check is cheap; once a request has been served, the damage is done.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:03-refuse-newer"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "Migrations apply in order, each inside a single transaction; a mid-migration crash leaves the store on the previous version",
5
+ "description": "The migration runner iterates pending migrations in ascending version order. For each migration, the runner opens a transaction, executes every statement in the migration, writes the version row into the bookkeeping table, and commits. A failure at any step aborts the transaction and rolls back; the on-disk version reflects the last successfully committed migration. The runner surfaces the failure with a specific error code naming the version that failed.",
6
+ "category": "technical",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "Half-applied migrations are the shape that turns a schema evolution into a hand-recovery incident. Wrapping each migration in one transaction with its version bump means the store is always at a version the code knows how to interpret. Naming the failing version in the error means the operator can inspect the exact statement set that failed.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:04-atomic-migration"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "The store survives ungraceful process termination without corrupting on-disk state",
5
+ "description": "An abrupt SIGKILL, host power loss, or container OOM-kill of the running process leaves the on-disk store openable on the next boot with every committed write intact and every in-flight transaction rolled back. The store's durability posture (write-ahead log with a synchronous commit floor, or the engine-native equivalent) is set at open time and is not a caller concern.",
6
+ "category": "nonFunctional",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "A store that corrupts on an ungraceful shutdown is a store that will corrupt in production sooner or later: hosts die, containers get killed, the OOM killer picks the process at 03:00. Making crash safety a store-side default rather than a per-call ceremony means every consumer inherits it without having to remember.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:05-crash-safety"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-006",
3
+ "prdId": "PRD-001",
4
+ "title": "A structured event log records store lifecycle events with defined fields",
5
+ "description": "The store emits structured events at four defined moments: opened (at successful open), migrated (once per migration run that applied at least one migration, carrying the version transition and the list of versions applied), backupCheckpoint (on each snapshot completion), and closed (on graceful shutdown). Every event carries an event name, an ISO-8601 timestamp, and the fields defined for that event class. Consumers subscribe via a single sink function injected at open time.",
6
+ "category": "functional",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "Silent stores are stores that surprise the operator. A structured event log makes 'when did the store come up, what version did it migrate through, when did the last snapshot land' answerable from the log stream without a database query. The four events are the minimum viable surface: opened proves boot, migrated proves schema state, backupCheckpoint proves the recovery story is live, closed proves a clean shutdown.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:06-event-log"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-007",
3
+ "prdId": "PRD-001",
4
+ "title": "The store facade is the only module that talks to the underlying engine; consumers use narrow verbs, not raw queries",
5
+ "description": "One module (the store facade) imports the engine binding and holds the connection or file handle. Every other module in the process talks to persistence exclusively through named verbs exposed by the facade (insertX, findX, updateX, deleteX and their domain equivalents). No consumer imports the engine binding directly; no consumer constructs raw SQL or engine-native query objects and hands them to the facade for execution.",
6
+ "category": "technical",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "A single boundary between the domain and the engine is what makes swapping the engine possible, what makes testing the domain against an in-memory double possible, and what makes reasoning about which code paths touch persistence tractable. Raw-query passthrough defeats every one of those benefits without adding capability the facade cannot express.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:07-module-boundary"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-008",
3
+ "prdId": "PRD-001",
4
+ "title": "A backup is a file-level snapshot of the store artifact taken without downtime",
5
+ "description": "The backup procedure produces a self-contained artifact (a copy of the SQLite file, an engine-native snapshot, or the equivalent) that, when opened by a compatible build, boots to the same schema version and holds the same committed rows as the source store at the snapshot moment. The procedure runs against a live store: no request quiescence, no consumer freeze, no application shutdown. The backup runner emits a backupCheckpoint event on the store's event log with the artifact path and the ISO-8601 completion timestamp.",
6
+ "category": "nonFunctional",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "A backup story that requires downtime is a backup story the operator will skip until it is too late. A file-level snapshot inherits the durability posture of the underlying engine (WAL checkpointing for SQLite, replication slots for Postgres) and turns 'do we have a recent backup' into a stat call on the artifact path. The event on completion is what makes 'when did the last snapshot land' answerable from the log without a filesystem walk.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:08-backup"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-009",
3
+ "prdId": "PRD-001",
4
+ "title": "A failed migration surfaces a specific error code and leaves the on-disk store unchanged",
5
+ "description": "When a migration statement or its version bookkeeping row fails, the migration runner rolls back the transaction, throws an error with a stable code and a message naming the failing version and the description of that migration, and does not attempt further migrations. The on-disk schema version reflects the last successfully committed migration, not the failed one. The store facade propagates the failure to the caller of the open entry point.",
6
+ "category": "technical",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "Silent partial migrations are the shape that produces the worst production incidents: the store is in a state no code knows how to interpret and the operator has no error to search on. A stable error code that names the failing version turns the diagnostic loop into a one-step operation (open the migration, read the statement, fix, redeploy).",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:09-migration-failure"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-010",
3
+ "prdId": "PRD-001",
4
+ "title": "The store event log holds no secret material",
5
+ "description": "No field on any store event (opened, migrated, backupCheckpoint, closed) carries user data, credential material, session handles, token secrets, private keys, or the values of any column marked as secret in the domain schema. Event fields are limited to store metadata: the store path or identifier, ISO-8601 timestamps, schema version numbers, migration version numbers, migration descriptions, applied-version arrays, backup artifact paths.",
6
+ "category": "security",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "A store event log is safe to ship to a third-party observability provider only if it holds no secret material. Store events describe the store's own lifecycle, not the domain data it holds; conflating the two produces a log stream that becomes a session-takeover breach the moment it leaks. The discipline has to be enforced at emit time; downstream redaction misses cases.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:10-log-secrecy"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "persistence-data-sqlite-REQ-011",
3
+ "prdId": "PRD-001",
4
+ "title": "Opening a store already at the target schema version is a no-op that emits no migrated event",
5
+ "description": "When the on-disk schema version equals the build's max known migration version, the migration runner applies no migrations and returns a result whose applied-versions array is empty. The store facade emits the opened event as usual but does NOT emit a migrated event on this path. Consumers that key off the migrated event to fire post-migration bookkeeping do not fire spuriously on a routine boot.",
6
+ "category": "nonFunctional",
7
+ "domain": "persistence",
8
+ "priority": "must",
9
+ "rationale": "A store that emits a migrated event on every boot destroys the signal that migration-adjacent bookkeeping (cache warmup, index rebuild, replica reseeding) needs to fire. Idempotent open is what makes routine boots cheap and rare boots observable; conflating them costs both signals.",
10
+ "tags": [
11
+ "blueprint:persistence-data-sqlite",
12
+ "category:11-idempotent-open"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-21T00:00:00Z",
17
+ "updatedAt": "2026-08-21T00:00:00Z"
18
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "tacId": "TAC-601-persistence-data-sqlite-store",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Store facade",
8
+ "purpose": "The single module that opens the underlying engine, holds the connection or file handle for the process lifetime, runs the migration runner at open, and exposes narrow named verbs to consumer code. Consumers never import the engine binding directly; the facade is the one place the engine choice lives.",
9
+ "responsibilities": [
10
+ "Open the underlying engine against a configured store identifier (path or connection string), set the crash-safety posture the engine needs for kill-9 tolerance, and hold the handle exclusively for the process lifetime (AC-5101-1, AC-5101-2, AC-5105-3).",
11
+ "Invoke the migration runner (TAC-602) at open, propagating its outcome to the caller: refuse-newer errors and migration-failed errors are thrown up unwrapped or wrapped with the original code preserved (AC-5101-3, AC-5103-1, AC-5109-2).",
12
+ "Expose a schemaVersion read operation whose return value equals the highest applied migration version recorded in the bookkeeping table (AC-5102-2).",
13
+ "Expose the domain CRUD verbs as named exports with typed parameters; refuse a general-purpose raw-query passthrough on the public surface (AC-5107-2).",
14
+ "Emit structured events (opened, migrated, backupCheckpoint, closed) on the injected onEvent sink; carry only store-metadata fields; never carry values read from domain rows (AC-5106-1, AC-5106-3, AC-5110-1)."
15
+ ],
16
+ "internalStructure": "One module that exports an openStore({ path, onEvent }) entry point returning a facade object whose methods are the named CRUD verbs plus schemaVersion, backup, and close. The engine binding import is scoped to this module; the migration runner (TAC-602) is imported here and invoked before the facade returns. Consumers destructure the verbs they need at their top level and hold the facade reference for the process lifetime.",
17
+ "interfaces": [
18
+ {
19
+ "name": "openStore",
20
+ "kind": "factory",
21
+ "description": "openStore({ path, onEvent }) -> Store; the sole entry point the boot sequence calls. Returns a Store facade with the migration runner already run and the crash-safety posture already set."
22
+ },
23
+ {
24
+ "name": "onEvent",
25
+ "kind": "callback",
26
+ "description": "Structured-event sink invoked with { event, ts, ... } for opened, migrated, backupCheckpoint, and closed events. Never invoked with domain-row values."
27
+ },
28
+ {
29
+ "name": "store.verbs",
30
+ "kind": "read-write-api",
31
+ "description": "The named domain CRUD verbs the facade exposes. Each verb has typed parameters; no verb accepts a raw query string or engine-native query object from consumer code."
32
+ }
33
+ ],
34
+ "dependencies": [
35
+ {
36
+ "name": "Migration runner",
37
+ "kind": "tac",
38
+ "tacId": "TAC-602-persistence-data-sqlite-migration-runner",
39
+ "description": "Invoked at open with the loaded migration catalog and the open engine handle; its result feeds the opened/migrated events."
40
+ },
41
+ {
42
+ "name": "Migration catalog",
43
+ "kind": "tac",
44
+ "tacId": "TAC-603-persistence-data-sqlite-migration-catalog",
45
+ "description": "Loaded at open and handed to the migration runner. The catalog's max version anchors the schemaVersion contract."
46
+ },
47
+ {
48
+ "name": "Backup runner",
49
+ "kind": "tac",
50
+ "tacId": "TAC-604-persistence-data-sqlite-backup-runner",
51
+ "description": "Exposed as store.backup(outputPath); emits the backupCheckpoint event on completion through the same event sink."
52
+ }
53
+ ],
54
+ "tradeoffs": "The facade owns the engine handle for the process lifetime; consumer code cannot pool or share handles across the boundary. That cost buys the one-boundary invariant every other AC on this blueprint depends on. Projects that need a per-request connection pool (a shape more natural to Postgres than to SQLite) wire the pool inside this module and preserve the facade's outward interface unchanged.",
55
+ "createdAt": "2026-08-21T00:00:00Z",
56
+ "updatedAt": "2026-08-21T00:00:00Z"
57
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "tacId": "TAC-602-persistence-data-sqlite-migration-runner",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Migration runner",
8
+ "purpose": "Owns the forward-only migration semantics. Reads the on-disk schema version, compares against the build's max known version, applies pending migrations in order inside one transaction each, and returns the version transition. Refuses to run when the on-disk version is newer than the build knows about. Rolls back and reports on any per-migration failure without attempting later migrations.",
9
+ "responsibilities": [
10
+ "Ensure the bookkeeping table (schemaVersion with version PRIMARY KEY and appliedAt timestamp) exists idempotently before reading the on-disk version. This is the only DDL statement outside a versioned migration (AC-5102-3).",
11
+ "Read the on-disk highest version from the bookkeeping table. Compare against the max version in the loaded catalog. Throw a refuse-newer error with a stable code and a message naming both versions when the on-disk version is strictly greater (AC-5103-1, AC-5103-2).",
12
+ "For each pending migration in ascending order, open a transaction, execute every statement in the migration's statements list, insert the version bookkeeping row, and commit. On any failure, roll back and throw a migration-failed error naming the failing version and description; do not attempt later migrations (AC-5104-1, AC-5104-2, AC-5104-3, AC-5109-1).",
13
+ "Return a { from, to, applied } result carrying the pre-run highest version, the post-run highest version, and the array of versions applied during this run (empty on a no-op at target version) (AC-5106-2, AC-5111-1)."
14
+ ],
15
+ "internalStructure": "One migrate(engineHandle, catalog) function that reads the on-disk version, filters the catalog to pending entries, iterates them in order, and returns the transition record. Idempotent bookkeeping-table DDL runs once at entry. The transaction boundary is expressed in whatever primitive the engine binding provides (BEGIN IMMEDIATE / COMMIT / ROLLBACK for SQLite; BEGIN / COMMIT / ROLLBACK for Postgres). No state is retained between invocations.",
16
+ "interfaces": [
17
+ {
18
+ "name": "migrate",
19
+ "kind": "function",
20
+ "description": "migrate(engineHandle, catalog) -> { from, to, applied }; the sole entry point the store facade calls at open. Throws refuse-newer or migration-failed errors with stable codes on the failure paths."
21
+ }
22
+ ],
23
+ "dependencies": [
24
+ {
25
+ "name": "Migration catalog",
26
+ "kind": "tac",
27
+ "tacId": "TAC-603-persistence-data-sqlite-migration-catalog",
28
+ "description": "Consumed as the ordered list of pending migrations to apply. The catalog's max version anchors the refuse-newer comparison."
29
+ }
30
+ ],
31
+ "tradeoffs": "Forward-only means no down migrations; a rollback to an older schema is a redeploy against the older code with the older catalog, and the newer store artifact refuses to open under the older build. That refusal is the safety property (see ADR-602); the cost is that a botched schema change is a code fix and a redeploy, not a schema-side undo. The runner holds no state, which means every open re-checks the on-disk version against the catalog and re-applies pending work idempotently on retry.",
32
+ "createdAt": "2026-08-21T00:00:00Z",
33
+ "updatedAt": "2026-08-21T00:00:00Z"
34
+ }