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,45 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11102",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-002",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Discovery is fetched at boot from the realm's well-known endpoint; missing endpoints refuse boot",
8
+ "asA": "operator wiring a project against a Keycloak realm",
9
+ "iWant": "the discovery client to read the realm's well-known configuration and populate the endpoint record",
10
+ "soThat": "the project's other TACs read Keycloak endpoints from the realm's own declaration rather than from hardcoded URLs",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11102-1",
14
+ "description": "At boot the discovery client fetches `<issuerBaseUrl>/realms/<realm>/.well-known/openid-configuration` and populates the record's endpoint fields from the response.",
15
+ "given": "a realm-config record with `realmSlug='r1'`, `issuerBaseUrl='http://127.0.0.1:<port>'`, `realmName='example'`, `verificationMode='jwks'` and a local Keycloak container reachable at that base URL",
16
+ "when": "the process boots and the discovery client runs its boot-time fetch",
17
+ "then": "the record has fields `authorizeUrl`, `tokenUrl`, `userinfoUrl`, `jwksUri`, `introspectionEndpoint`, `endSessionEndpoint`, and `issuer` populated from the discovery response; a `keycloak.realm_healthy` audit event is emitted carrying `realmSlug='r1'`",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11102-2",
23
+ "description": "The discovery client refreshes on the record's `discoveryRefreshSeconds` cadence; a refresh failure logs a warning event but does not flip a healthy realm to unhealthy.",
24
+ "given": "a healthy realm from AC-11102-1 with `discoveryRefreshSeconds=60`",
25
+ "when": "the test-injected clock advances 61 seconds and the discovery endpoint is momentarily made to return a 503 for one request",
26
+ "then": "the refresh attempt is observed against the test-injected httpFetch; a `keycloak.discovery_refused` warning-class audit event is emitted; the realm's health stays `healthy` and the previous endpoint record continues to serve; the next successful refresh emits `keycloak.discovery_refreshed`",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11102-3",
32
+ "description": "A realm record whose `verificationMode` requires an endpoint the discovery response does not carry refuses boot with a stable-coded error.",
33
+ "given": "a realm record with `verificationMode='introspection'` pointed at a discovery response whose body omits the `introspection_endpoint` field",
34
+ "when": "the discovery client's boot fetch completes",
35
+ "then": "the process terminates with error code `KEYCLOAK_DISCOVERY_MISSING_ENDPOINT` naming the realmSlug and the missing field `introspection_endpoint`; no listener is left running; the audit log records one `keycloak.discovery_refused` event carrying realmSlug and reason class `missing-endpoint`",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1201-security-auth-keycloak-discovery-client"
42
+ ],
43
+ "createdAt": "2026-08-31T00:00:00Z",
44
+ "updatedAt": "2026-08-31T00:00:00Z"
45
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11103",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "JWT verification against JWKS survives a key rotation the realm publishes",
8
+ "asA": "operator whose realm rotates its signing keys on the realm's own cadence",
9
+ "iWant": "the JWT verifier to recognise a token signed with a new key without a process restart",
10
+ "soThat": "a key rotation is transparent to the running project",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11103-1",
14
+ "description": "A verified token whose signing kid is present in the cached JWKS passes verification without a fresh JWKS fetch.",
15
+ "given": "a warm JWKS cache populated by a prior verification against realmSlug='r1' and a new access token signed under the same kid",
16
+ "when": "the verifier is invoked",
17
+ "then": "the verifier consumes the token successfully; no fresh JWKS fetch is observed against the test-injected httpFetch for the duration of this verification; the audit log records no `keycloak.jwks_refreshed` event",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11103-2",
23
+ "description": "A token whose kid is not in the cached JWKS triggers exactly one JWKS refresh; verification succeeds when the refresh surfaces the kid and refuses with `KEYCLOAK_JWT_KID_UNKNOWN` when it does not.",
24
+ "given": "a warm JWKS cache populated by a prior verification and a new access token signed with a kid the realm has rotated to but the cache does not yet carry",
25
+ "when": "the verifier is invoked twice in the same test: once with the realm's fresh JWKS available on the injected httpFetch, once with the httpFetch instrumented to return a JWKS still missing the kid",
26
+ "then": "the first invocation triggers one JWKS refresh (observed on the injected httpFetch), succeeds verification, emits `keycloak.jwks_refreshed`; the second invocation triggers one JWKS refresh, refuses the token with `KEYCLOAK_JWT_KID_UNKNOWN`, emits one `keycloak.jwt_refused` event carrying realmSlug and reason class `kid-unknown`; a third invocation with the same second-token does NOT trigger a further JWKS refresh within the TTL window",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-1202-security-auth-keycloak-jwt-verifier"
33
+ ],
34
+ "createdAt": "2026-08-31T00:00:00Z",
35
+ "updatedAt": "2026-08-31T00:00:00Z"
36
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11104",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-003",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Expired or forged access tokens are refused with distinct stable-coded reasons",
8
+ "asA": "operator whose project receives an access token that fails one of the standard invariants",
9
+ "iWant": "the JWT verifier to refuse the token before it can lift into a Principal",
10
+ "soThat": "no session is issued and no protected route runs against an unverified identity",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11104-1",
14
+ "description": "A token whose `exp` claim is in the past is refused with `KEYCLOAK_JWT_EXPIRED` and no session is issued.",
15
+ "given": "a JWT verifier warm against the realm's JWKS and an access token whose `exp` claim was minted 60 seconds before the test-injected clock's current time",
16
+ "when": "the verifier is invoked",
17
+ "then": "the response is a 4xx with body error code `KEYCLOAK_JWT_EXPIRED`; no session cookie is set on the response; the audit log records one `keycloak.jwt_refused` event carrying realmSlug and reason class `expired` and no token value",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11104-2",
23
+ "description": "A token signed under a key not published by the realm at any point in the test's window is refused with `KEYCLOAK_JWT_SIGNATURE_INVALID` after exactly one JWKS refresh.",
24
+ "given": "a JWT verifier and a token signed by a key that was never on any JWKS response the realm returned",
25
+ "when": "the verifier is invoked",
26
+ "then": "the verifier observes one JWKS refresh against the injected httpFetch, then refuses the token with `KEYCLOAK_JWT_SIGNATURE_INVALID`; no session cookie is set; the audit log records one `keycloak.jwt_refused` event carrying realmSlug and reason class `signature`; the reason class is `signature`, not `kid-unknown` (the kid appears in JWKS; the signature under that kid does not verify)",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-1202-security-auth-keycloak-jwt-verifier"
33
+ ],
34
+ "createdAt": "2026-08-31T00:00:00Z",
35
+ "updatedAt": "2026-08-31T00:00:00Z"
36
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-004",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Opaque-token introspection verifies against the RFC 7662 endpoint and refuses inactive or errored responses",
8
+ "asA": "operator whose realm client is configured to issue opaque access tokens",
9
+ "iWant": "the introspection client to verify every access token against the realm's introspection endpoint on the RFC 7662 shape",
10
+ "soThat": "the mechanism handles opaque-token clients honestly and reflects realm-side revocations in real time",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11105-1",
14
+ "description": "An opaque access token that the endpoint returns as `active: true` verifies successfully and yields a claim record.",
15
+ "given": "a realm record with `verificationMode='introspection'` and a local stub introspection responder wired to answer `active: true` with a fixed claim record for the presented token",
16
+ "when": "the introspection client is invoked on the token",
17
+ "then": "the client issues a POST to the record's `introspection_endpoint` with body `token=<opaque-value>`, `Content-Type: application/x-www-form-urlencoded`, and `Authorization: Basic <base64(clientId:clientSecret)>`; the response body is parsed as JSON; the claim record from the response is returned to the caller; the audit log records one `keycloak.introspection_verified` event carrying realmSlug and no token value",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11105-2",
23
+ "description": "An opaque access token that the endpoint returns as `active: false` is refused with `KEYCLOAK_INTROSPECTION_INACTIVE`.",
24
+ "given": "the same realm record and a stub responder configured to answer `active: false` for the presented token (a revoked or expired token)",
25
+ "when": "the introspection client is invoked",
26
+ "then": "the response is a 4xx with body error code `KEYCLOAK_INTROSPECTION_INACTIVE`; no session cookie is set; the audit log records one `keycloak.introspection_refused` event carrying realmSlug and reason class `inactive`",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11105-3",
32
+ "description": "A non-2xx response from the introspection endpoint refuses the token with `KEYCLOAK_INTROSPECTION_ENDPOINT_ERROR` naming the HTTP status class.",
33
+ "given": "the same realm record and a stub responder configured to return HTTP 503 for the presented token",
34
+ "when": "the introspection client is invoked",
35
+ "then": "the response is a 4xx with body error code `KEYCLOAK_INTROSPECTION_ENDPOINT_ERROR` and a `detail` field naming the status class as `5xx`; no session cookie is set; the audit log records one `keycloak.introspection_refused` event carrying realmSlug and reason class `endpoint-error`; the mechanism does not fall back to a permissive posture",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1203-security-auth-keycloak-introspection-client"
42
+ ],
43
+ "createdAt": "2026-08-31T00:00:00Z",
44
+ "updatedAt": "2026-08-31T00:00:00Z"
45
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The provider-router seam decides realm per request; unknown realms refuse; the notThisIssuer sentinel hands off",
8
+ "asA": "operator whose deployment routes requests to more than one realm (or hands some requests off to a middleware layer above the mechanism)",
9
+ "iWant": "the provider-router to make the routing decision once, in a legible place, on a pure function I supply",
10
+ "soThat": "the routing is observable at one named seam rather than scattered across handlers",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11106-1",
14
+ "description": "A routeFn that returns `{ realmSlug: 'r2', verificationMode: 'jwks' }` for a request marker causes the mechanism to verify against realm `r2` rather than the default realm.",
15
+ "given": "two realm records `r1` and `r2` and a project-authored routeFn that returns `{ realmSlug: 'r2', verificationMode: 'jwks' }` when the request carries a marker the routeFn is coded to inspect (the marker is the project's own concern; the blueprint does not name it)",
16
+ "when": "a request carrying the marker is dispatched through the mechanism",
17
+ "then": "the verifier resolves against `r2`'s JWKS, not `r1`'s; the reduced Principal's `provider` field equals `'r2'`; the audit log records one `keycloak.route_decided` event carrying `realmSlug='r2'`",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11106-2",
23
+ "description": "A routeFn returning a realmSlug not present in the realm-config list refuses the request with `KEYCLOAK_REALM_UNKNOWN`.",
24
+ "given": "the two-realm configuration from AC-11106-1 and a routeFn that returns `{ realmSlug: 'r99', verificationMode: 'jwks' }`",
25
+ "when": "a request is dispatched",
26
+ "then": "the response is a 4xx with body error code `KEYCLOAK_REALM_UNKNOWN`; no verifier is invoked against any realm; the audit log records one `keycloak.route_decided` event followed by one `keycloak.jwt_refused` (or equivalent) event with reason class `unknown-realm`",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11106-3",
32
+ "description": "A routeFn returning the sentinel `notThisIssuer` returns that sentinel to the caller and does not attempt any verification.",
33
+ "given": "the two-realm configuration and a routeFn that returns the string `'notThisIssuer'`",
34
+ "when": "a request is dispatched through the mechanism",
35
+ "then": "the mechanism returns the sentinel `notThisIssuer` to its caller (the project's own middleware chain); no JWKS fetch, no introspection call, and no session verification is observed; the audit log records one `keycloak.route_decided` event carrying `realmSlug='notThisIssuer'`",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1204-security-auth-keycloak-provider-router",
42
+ "TAC-1202-security-auth-keycloak-jwt-verifier"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Roles lift from the realm's client-roles or realm-roles claim path onto the Principal",
8
+ "asA": "operator whose realm client publishes role assignments on either the per-client or the realm-wide claim path",
9
+ "iWant": "the role adapter to populate the reduced Principal's `roles[]` from the path the realm record declares",
10
+ "soThat": "handler code paths read roles from the Principal without knowing the Keycloak claim shape",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11107-1",
14
+ "description": "A realm record with `roleClaimShape='client-roles'` lifts `resource_access.<clientId>.roles` onto `Principal.roles`.",
15
+ "given": "a verified access token whose payload carries `resource_access: { my-client: { roles: ['admin', 'editor'] } }` and a realm record with `clientId='my-client'` and `roleClaimShape='client-roles'`",
16
+ "when": "the role adapter is invoked on the verified claim record",
17
+ "then": "the resulting reduced Principal's `roles[]` equals `['admin', 'editor']` in insertion order; no other role source is consulted; no `keycloak.roles_refused` event is emitted",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11107-2",
23
+ "description": "A verified token whose expected claim path is absent yields an empty `Principal.roles`, not a refusal.",
24
+ "given": "a verified access token whose payload does not carry a `resource_access.<clientId>.roles` field and a realm record with `roleClaimShape='client-roles'`",
25
+ "when": "the role adapter is invoked",
26
+ "then": "the reduced Principal's `roles[]` equals `[]`; no error class is emitted; the audit log records no `keycloak.roles_refused` event; the mechanism does not decide whether an empty roles set is acceptable - that is the project's authoriser above the Principal",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11107-3",
32
+ "description": "A verified token whose expected claim path is present but not an array of strings is refused with `KEYCLOAK_ROLES_MALFORMED`.",
33
+ "given": "a verified access token whose payload carries `resource_access.my-client.roles = 'admin'` (a string, not an array) and a realm record with `roleClaimShape='client-roles'`",
34
+ "when": "the role adapter is invoked",
35
+ "then": "the response is a 4xx with body error code `KEYCLOAK_ROLES_MALFORMED`; the reduced Principal is not produced; the audit log records one `keycloak.roles_refused` event carrying realmSlug and reason class `malformed`",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1205-security-auth-keycloak-role-adapter"
42
+ ],
43
+ "createdAt": "2026-08-31T00:00:00Z",
44
+ "updatedAt": "2026-08-31T00:00:00Z"
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-007",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Refresh rotates the stored refresh token; realm invalid_grant invalidates the session",
8
+ "asA": "operator whose session has been active long enough for the access token to expire",
9
+ "iWant": "the flow controller to refresh through the realm's token endpoint and honour the realm's rotation model",
10
+ "soThat": "the session continues without a re-sign-in until the realm signals invalidation",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11108-1",
14
+ "description": "A refresh call rotates the stored refresh token: the pre-refresh value is discarded and the realm's new value is stored.",
15
+ "given": "a session issued from US-11101 whose access token has been marked expired by the test-injected clock and whose stored refresh token is `rt-old`",
16
+ "when": "the next protected-route request triggers the flow controller's refresh path against the local realm",
17
+ "then": "the flow controller issues a POST to the realm's `token_endpoint` with `grant_type=refresh_token` and `refresh_token=rt-old`; the realm returns a 2xx carrying a new `access_token` and a new `refresh_token=rt-new`; the session record now stores `rt-new` and no other refresh-token value; the pre-refresh `rt-old` is not present in the session record or the audit log",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11108-2",
23
+ "description": "A 400 `invalid_grant` on refresh invalidates the session handle and emits a `keycloak.refresh_invalidated` audit event.",
24
+ "given": "the same session and a stored refresh token the realm is configured to refuse (a revoked token; the local Keycloak container's realm has revoke-on-refresh-reuse or a reuse-token detection turned on, or the test-injected mock returns 400 invalid_grant for the presented token)",
25
+ "when": "the flow controller invokes the refresh path",
26
+ "then": "the flow controller invalidates the session handle, clears the associated refresh-token chain, and emits one structured audit event `keycloak.refresh_invalidated` carrying realmSlug and session-handle-hash and no token value; the next protected-route request with the original cookie is refused as unauthenticated",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11108-3",
32
+ "description": "A realm configuration that does not return a refresh token is supported; no refresh call is attempted and the session lives out its own project-lifetime.",
33
+ "given": "a realm record whose client configuration is set to omit refresh_token (a bearer-only client, or a client with refresh tokens disabled)",
34
+ "when": "the sign-in from US-11101 completes and the access-token expiry passes on the test-injected clock",
35
+ "then": "the session record's refresh-token slot is empty; the flow controller does not attempt a refresh call; the session's own project-lifetime expiry (per the session-bridge, in opaque-handle mode) is the sole grant duration; a protected-route request past the project-lifetime expiry is refused as unauthenticated",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1202-security-auth-keycloak-jwt-verifier"
42
+ ],
43
+ "createdAt": "2026-08-31T00:00:00Z",
44
+ "updatedAt": "2026-08-31T00:00:00Z"
45
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11109",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-008",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The reduced Principal is what handlers read; provider tokens never surface on request.auth",
8
+ "asA": "operator building a handler behind the mechanism's session-verify middleware",
9
+ "iWant": "request.auth to carry only the reduced Principal, never a Keycloak access token, id_token, or refresh token",
10
+ "soThat": "no handler code path can accidentally reason about the realm's raw token surface",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11109-1",
14
+ "description": "A verified request in opaque-handle mode exposes only the reduced Principal on `request.auth`.",
15
+ "given": "a session issued from US-11101 (opaque-handle mode) and a project route wired behind the session-verify middleware",
16
+ "when": "the request is dispatched and the resolved `request.auth` object is inspected for keys",
17
+ "then": "the object contains exactly `principalId`, `provider`, `email`, `roles`, `organisationIds`; no `accessToken`, `idToken`, `refreshToken`, or raw-claims field is present; `principalId` is a stable string starting with the realmSlug followed by a colon",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11109-2",
23
+ "description": "A verified request in stateless mode exposes only the reduced Principal on `request.auth`; no server-side session record was created.",
24
+ "given": "a realm record with `sessionMode='stateless'` and `bearerSource='authorization-header'` and a request carrying a valid Keycloak-minted JWT in the Authorization header",
25
+ "when": "the request is dispatched",
26
+ "then": "the mechanism verifies the token, populates the reduced Principal, and does not create a session-record entry (the session-record store's `put` port is not invoked); `request.auth` carries only the fields listed in AC-11109-1; no `Set-Cookie` is emitted by the mechanism on this response",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-1202-security-auth-keycloak-jwt-verifier",
33
+ "TAC-1205-security-auth-keycloak-role-adapter"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11110",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-010",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Sign-out invalidates the project session; realm end-session is a per-record option",
8
+ "asA": "operator who has signed in through the project's Keycloak-backed sign-in surface",
9
+ "iWant": "a sign-out request to clear my project session server-side and, when the realm record declares it, redirect to the realm's end-session endpoint",
10
+ "soThat": "the next request from this browser is unauthenticated regardless of what the realm still holds",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11110-1",
14
+ "description": "A POST to the sign-out route invalidates the session handle server-side and clears the session cookie in the browser.",
15
+ "given": "a session issued from US-11101 (opaque-handle mode) and a project route at `POST /auth/sign-out` wired to the flow controller",
16
+ "when": "the browser dispatches the sign-out request",
17
+ "then": "the response clears the session cookie (`Set-Cookie` with the cookie name, empty value, `Max-Age=0`, `HttpOnly`, `Secure`, `SameSite=Lax`); the session-record store no longer holds a record for the pre-signout session handle; the next protected-route request replaying the pre-signout cookie value is refused as unauthenticated",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11110-2",
23
+ "description": "When a realm record sets `providerLogout: 'redirect'` and discovery has `end_session_endpoint`, sign-out returns a 302 to that endpoint.",
24
+ "given": "a realm record whose declaration sets `providerLogout: 'redirect'`, a discovery response carrying `end_session_endpoint`, and a session issued against that realm",
25
+ "when": "the sign-out route is invoked",
26
+ "then": "the response status is 302; the `Location` header equals the discovered `end_session_endpoint` with the configured `post_logout_redirect_uri` and, when the id_token is available on the session record, the `id_token_hint` query parameter carrying the raw id_token; the session cookie is cleared on the same response; the session record is deleted",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11110-3",
32
+ "description": "A realm record with `providerLogout: 'redirect'` whose discovery response omits `end_session_endpoint` refuses boot with `KEYCLOAK_LOGOUT_NOT_DECLARED`.",
33
+ "given": "a realm-config record whose `providerLogout` is `'redirect'` pointed at a discovery document that lacks the `end_session_endpoint` field",
34
+ "when": "the discovery client's boot fetch completes",
35
+ "then": "the process terminates with error code `KEYCLOAK_LOGOUT_NOT_DECLARED` naming the realm slug; no listener is left running; the audit log records one `keycloak.discovery_refused` event carrying realmSlug and reason class `logout-endpoint-missing`",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1201-security-auth-keycloak-discovery-client"
42
+ ],
43
+ "createdAt": "2026-08-31T00:00:00Z",
44
+ "updatedAt": "2026-08-31T00:00:00Z"
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11111",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-011",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Fail-safe boot postures behave per the record's bootPosture field",
8
+ "asA": "operator whose realm may be unreachable at project boot",
9
+ "iWant": "the discovery client to follow the posture the record declares (strict, deferred, standby)",
10
+ "soThat": "my project's boot behaviour reflects a paper-trailed decision rather than a hidden retry constant",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11111-1",
14
+ "description": "Under `bootPosture: strict` a discovery fetch failure terminates the process with `KEYCLOAK_DISCOVERY_UNREACHABLE` and no listener is left running.",
15
+ "given": "a realm record with `bootPosture: 'strict'` pointed at an issuer base URL that returns HTTP connection-refused for the discovery path",
16
+ "when": "the process boots and the discovery client runs its boot-time fetch",
17
+ "then": "the process exits with error code `KEYCLOAK_DISCOVERY_UNREACHABLE` naming the realm slug and the fetch-failure class; no listener is bound; the audit log records one `keycloak.discovery_refused` event with reason class `unreachable`",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11111-2",
23
+ "description": "Under `bootPosture: deferred` the process starts, the realm is marked unhealthy, and a backoff refresh loop populates the record on the first success.",
24
+ "given": "a realm record with `bootPosture: 'deferred'`, `deferredRetryCapSeconds=30`, and an issuer base URL whose discovery path returns 503 for the first three fetch attempts and 200 with a valid discovery response for the fourth",
25
+ "when": "the process boots and the retry loop runs against the test-injected clock and retryScheduler",
26
+ "then": "the process is bound on its listener; requests routed to the realm through the provider-router refuse with `KEYCLOAK_REALM_UNAVAILABLE` while the realm is unhealthy; the audit log records `keycloak.realm_unhealthy` at boot and `keycloak.realm_healthy` on the fourth attempt's success; the retryScheduler observes exponential backoff bounded by the 30-second cap",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-11111-3",
32
+ "description": "Under `bootPosture: standby` the process starts, the realm is unhealthy, and a project-invoked refresh brings it healthy.",
33
+ "given": "a realm record with `bootPosture: 'standby'` and a discovery endpoint that would return 200 if fetched but the standby posture holds the client off",
34
+ "when": "the process boots, then a project-authored admin route invokes `discoveryClient.refresh('r1')` after boot",
35
+ "then": "at boot the realm is `unhealthy` and no refresh loop is running; on the admin-route invocation the discovery client fetches, populates the record, marks the realm `healthy`, and emits `keycloak.realm_healthy`; no `keycloak.discovery_refused` events are emitted for this realm during the standby window before the refresh",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1201-security-auth-keycloak-discovery-client"
42
+ ],
43
+ "createdAt": "2026-08-31T00:00:00Z",
44
+ "updatedAt": "2026-08-31T00:00:00Z"
45
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11112",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-012",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Live cloud-realm smoke ACs are accountBound and skip cleanly when the realm is unreachable",
8
+ "asA": "operator running the project's CI pipeline without live cloud-realm credentials configured",
9
+ "iWant": "the runtime-verify layer to skip the live-realm smoke ACs with a stable-coded reason",
10
+ "soThat": "CI does not fail and the honest coverage state is on the record",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11112-1",
14
+ "description": "Every TC bound to a runtime-verify AC that targets a live cloud-hosted realm carries an `accountBound` flag; the runtime-verify runner honours the flag by skipping and emitting a stable-coded reason.",
15
+ "given": "a project scratch tree with this blueprint applied, one project-authored TC bound to AC-11112-2 flagged `accountBound`, and no live cloud-realm credentials in the runtime environment",
16
+ "when": "`rcf audit coverage --strict` reports the coverage state and the runtime-verify runner is invoked",
17
+ "then": "the coverage report lists the AC as covered by a TC whose latest run outcome is `skipped` with reason `KEYCLOAK_LIVE_REALM_UNREACHABLE`; the pipeline exit code is 0; the audit log records one `keycloak.accountbound_skip` event carrying the AC id and the missing-credential class",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11112-2",
23
+ "description": "A live cloud-hosted-realm smoke against a project-owned Keycloak deployment completes a full authorisation-code + PKCE round-trip and issues a project session whose Principal carries the deployment's realm slug.",
24
+ "given": "live cloud-realm credentials configured in the runtime environment and the project's redirect URI registered at the realm's admin console (operator-authored, out of the blueprint's mechanism reach)",
25
+ "when": "the operator drives a real browser through the sign-in surface at the live realm",
26
+ "then": "the flow completes; a project session cookie is set with the same shape as AC-11101-3; `request.auth.provider` equals the live realm's declared realmSlug; the project-authored TC for this AC records a `pass` outcome",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-1201-security-auth-keycloak-discovery-client",
33
+ "TAC-1202-security-auth-keycloak-jwt-verifier"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "security-auth-keycloak-US-11113",
3
+ "prdId": "PRD-001",
4
+ "reqId": "security-auth-keycloak-REQ-009",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The local Keycloak container stands up under a project harness and the discovery client verifies against it",
8
+ "asA": "operator running the project's runtime-verify pass in CI without any cloud dependency",
9
+ "iWant": "the project harness to bring up a local Keycloak container against the vendor's official image and the discovery client to reach it within a bounded startup window",
10
+ "soThat": "runtime-verify against a real Keycloak realm is free of cloud cost and free of external-account dependency",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-11113-1",
14
+ "description": "A project harness following the local-container asset stands up a Keycloak container against the vendor's official image with placeholder credentials from an operator-controlled environment source; the container is reachable on its published port within `containerStartupTimeoutSeconds` (default 120).",
15
+ "given": "a harness following `assets/local-container/keycloak-bootstrap.md` with the operator-pinned stable tag on `quay.io/keycloak/keycloak` and admin credentials from an operator-controlled environment file that is not committed to the repository",
16
+ "when": "the harness starts the container as part of a runtime-verify session",
17
+ "then": "the container is running within the timeout; a discovery HTTP GET on `<containerBase>/realms/example/.well-known/openid-configuration` returns 200 with a JSON body carrying the standard OIDC endpoints; the placeholder admin credentials never appear in a committed file or in an audit event; the harness's environment file is listed in the project's `.gitignore` shape and the test verifies the file is not tracked by git",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-11113-2",
23
+ "description": "The seeded realm carries only placeholder shapes; no real client id, no real client secret, no real user data, and no realm name matching a project-owned deployment appears in the seed file the harness applies.",
24
+ "given": "the realm seed the harness applies (either via `kc.sh import` or via the admin REST API after startup)",
25
+ "when": "the seed file is inspected on disk before application",
26
+ "then": "the realm name equals the placeholder value declared in the asset (or a project-chosen renamed placeholder); the client id is the seed's placeholder value; the client secret is not present in the seed file (the harness sets it after client creation and stores it in the operator's environment file); user credentials are placeholders; every leakage grep the project runs (real domain names, real client secrets, real realm ids, real user emails) against the seed file returns zero",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-1201-security-auth-keycloak-discovery-client"
33
+ ],
34
+ "createdAt": "2026-08-31T00:00:00Z",
35
+ "updatedAt": "2026-08-31T00:00:00Z"
36
+ }
@@ -0,0 +1,74 @@
1
+ # security-auth-keycloak blueprint coordination vocabulary
2
+
3
+ This file is the security-auth-keycloak half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
4
+
5
+ ## Global ADR topics this blueprint contributes (exact strings)
6
+
7
+ | Topic string | security-auth-keycloak contribution | Composition intent |
8
+ |---|---|---|
9
+ | `authModel` | ADR-1201-security-auth-keycloak-auth-model | Deliberate conflict on the same string minted by `security-auth-magic-link` (ADR-501), `security-auth-clerk` (ADR-1001), `security-auth-oauth2` (ADR-1101), the client half of `application-spa` (ADR-205), and the server half of `application-api-rest` (ADR-302). This blueprint's shape is delegated identity to a Keycloak realm the operator runs, federated through OIDC authorisation-code + PKCE, with per-realm verification mode (JWKS or introspection). A composing blueprint that holds a different opinion on the authentication model contributes its own scope:global ADR on this exact string and lets composition surface the pairing. Expected resolution: one project-level ADR that fixes the project's authentication model for both the client tier and the server tier, with a resolution recorded on `manifest.resolutions[]` or via `--resolve authModel=project:<ADR-id>` on the add |
10
+
11
+ The security-auth-keycloak blueprint claims one global topic. Every other contribution is scope-local (ADR-1202 through ADR-1206 name the verification-mode choice, the provider-routing seam, the session-vs-token contract, the JWKS rotation-cache lifetime, and the refresh-and-sign-out posture without contributing global topics; a composing blueprint that holds a different opinion on any of them authors its own project-level ADR if it wants to override).
12
+
13
+ Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, security-auth-clerk, security-auth-oauth2, persistence-data-sqlite, delivery-ci-workflows, observability-essentials, and security-secrets-management vocabularies, restated as law): lower camelCase, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer. Do not mint variants of existing strings (`auth`, `authentication`, `identityProvider`, `keycloakProvider` are all wrong when `authModel` already exists).
14
+
15
+ ## The deliberate authModel conflict, restated
16
+
17
+ This blueprint is the vendor-committed Keycloak shape of the `authModel` decision. Three other shipped auth-family blueprints hold different shapes on the same topic:
18
+
19
+ - `security-auth-magic-link` (ADR-501): passwordless magic-link with server-issued opaque cookie sessions. Local-first, no third-party identity dependency.
20
+ - `security-auth-clerk` (ADR-1001): hosted identity via Clerk; the vendor owns the sign-in surface, credential storage, MFA, and account recovery; the project owns a middleware boundary against Clerk's session-verification.
21
+ - `security-auth-oauth2` (ADR-1101): delegated identity via OAuth2 authorisation-code + PKCE against any project-configured IdP. Vendor-neutral; the project drops in the provider it wants.
22
+ - `security-auth-keycloak` (ADR-1201, this blueprint): delegated identity to a Keycloak realm the operator runs, federated through OIDC. Vendor-committed; larger ops footprint; full self-hosted control.
23
+
24
+ Composing any two of these on one project raises a `globalAdrTopic` conflict on `authModel` at `rcf define blueprint add`. The four documented resolutions apply: adopt the incoming, keep the existing, author a project-level supersede ADR, or `--resolve authModel=project:<ADR-id>` on the add. The composition-precedent (SPA + REST on `errorEnvelope` and `authModel`) is the same pattern the client half and the server half of the wire contract have already established; the auth-family blueprints follow it.
25
+
26
+ ## Id number bands (registry bootstrap)
27
+
28
+ AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is ratified policy (2026-08-19, extended by round-2 outcomes 2026-08-30 for the four-digit ADR/TAC suffix widening); this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
29
+
30
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
31
+
32
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
33
+ |---|---|---|---|---|
34
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
35
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
36
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
37
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
38
+ | hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
39
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
40
+ | delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
41
+ | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
42
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
43
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
44
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
45
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
46
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
47
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
48
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
49
+
50
+ US 11101-11113 sit at the LOW end of the 11101-11899 band on purpose. A project-side story that mechanically derives from a security-auth-keycloak REQ id into the number `11113` would collide against security-auth-keycloak-US-11113 in this package; the band leaves headroom at the HIGH end (US 11181-11899) so a project's own stories anchored to security-auth-keycloak REQs can allocate without conflict. The watchpost run4 lesson applies here too.
51
+
52
+ The ADR/TAC suffix block 1201-1299 is the third block in the four-digit suffix space; `security-auth-clerk` opened the door at 1001-1099 and `security-auth-oauth2` took 1101-1199. Every shipped blueprint continues to load, validate, and audit against this shape without a schema change: rcf-schemas 0.5.0 `adrId` and `tacId` patterns are `^ADR-\d{3,}(-[a-z0-9]+...)?$` (three-digit minimum, unbounded above); four-digit and higher suffixes validate verbatim. The registry table above records the growth for a downstream author reaching for the next block.
53
+
54
+ ## Provider-aware install-design shape (plain language, no named second issuer)
55
+
56
+ The blueprint is Keycloak-committed. What the install design is AWARE of is that a project may deploy this mechanism in an environment where a receiving system's request stream also carries tokens issued by another OAuth2 or OIDC server. This shape is NOT a claim about the blueprint's mechanism reach - the blueprint verifies against Keycloak realms only, and refuses to name any specific second issuer. The shape lives at the seam where a project's OWN middleware decides which issuer is authoritative for a request:
57
+
58
+ - TAC-1204 (the provider router) contributes the pure-function contract `route(request) -> { realmSlug, verificationMode } | 'notThisIssuer'`. A project with only Keycloak wires it to a constant; a project with two Keycloak realms wires it to inspect a project-chosen request feature; a project with Keycloak alongside a non-Keycloak issuer returns the sentinel and the project's own middleware chain above owns what happens next.
59
+ - REQ-004 (the introspection path) speaks the RFC 7662 shape whether the issuer is Keycloak or another conforming server. The blueprint reaches only for the endpoint declared on the realm's discovery; a project that has chosen to consult a non-Keycloak issuer at introspection is a project-level ADR conversation, not a mechanism change here.
60
+
61
+ The blueprint refuses to encode:
62
+
63
+ - A specific second issuer's name, product, or integration.
64
+ - A specific request marker (a header name, a path prefix, a claim, a subdomain shape) the routing function would inspect.
65
+ - A specific dual-issuer deployment shape (a docker-compose recipe, a Kubernetes topology, a load-balancer rule).
66
+ - A specific standards-suite reference the ratified reshape ruling excluded from this blueprint.
67
+
68
+ A project that has one Keycloak realm inherits the seam at zero cost (constant routeFn). A project that has two Keycloak realms pays one function call per request. A project with an issuer above this blueprint's reach pays one function call per request and owns the routing policy on its own ADR.
69
+
70
+ ## Shared expectations for future composing blueprints
71
+
72
+ - Reuse `authModel` exactly as spelled here when your blueprint holds an opinion on the project's authentication model; contribute your own scope:global ADR on that string and let composition surface the pairing.
73
+ - Verification-mode choice (ADR-1202), provider-routing seam (ADR-1203), session-vs-token contract (ADR-1204), JWKS rotation-cache lifetime (ADR-1205), and refresh-and-sign-out posture (ADR-1206) are scope-local. A composing blueprint that holds an opinion on any of them authors its own project-level ADR; none of them are minted as globals because the space of legitimate variations is smaller than the space of legitimate authentication-model variations.
74
+ - Global topics that plausibly belong to a future blueprint and are NOT claimed by any shipped blueprint: `messageSerialisation` and `deliverySemantics` (a message-consumer blueprint's natural globals), `caching` (unclaimed by every shipped blueprint), `metricsExport` and `tracingProtocol` (natural globals for a metrics or tracing blueprint), `sessionStore` (unclaimed; a future session-persistence-committed blueprint's natural global). Define any of these in your own package's topics doc, in this file's format, and consider whether the band-registry table above needs your slug added.