rcf-lite 0.12.0 → 0.13.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 (625) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +2 -0
  3. package/bin/view-supervisor-child.mjs +0 -0
  4. package/blueprints/application-api-rest/README.md +40 -0
  5. package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
  6. package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
  7. package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
  8. package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
  9. package/blueprints/application-api-rest/blueprint.json +265 -0
  10. package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
  11. package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
  12. package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
  13. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
  14. package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
  15. package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
  16. package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
  17. package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
  18. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
  19. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
  20. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
  21. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
  22. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
  23. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
  24. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
  25. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
  26. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
  27. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
  28. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
  29. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
  30. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
  31. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
  32. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
  33. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
  34. package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
  35. package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
  36. package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
  37. package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
  38. package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
  39. package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
  40. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
  41. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
  42. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
  43. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
  44. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
  45. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
  46. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
  47. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
  48. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
  49. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
  50. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
  51. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
  52. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
  53. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
  54. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
  55. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
  56. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
  57. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
  58. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
  59. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
  60. package/blueprints/application-api-rest/docs/topics.md +46 -0
  61. package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
  62. package/blueprints/application-spa/README.md +90 -0
  63. package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
  64. package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
  65. package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
  66. package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
  67. package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
  68. package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
  69. package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
  70. package/blueprints/application-spa/assets/tokens/theme.css +169 -0
  71. package/blueprints/application-spa/assets/viewports.md +18 -0
  72. package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
  73. package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
  74. package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
  75. package/blueprints/application-spa/assets/wireframes/error.md +46 -0
  76. package/blueprints/application-spa/assets/wireframes/form.md +50 -0
  77. package/blueprints/application-spa/assets/wireframes/list.md +45 -0
  78. package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
  79. package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
  80. package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
  81. package/blueprints/application-spa/blueprint.json +387 -0
  82. package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
  83. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
  84. package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
  85. package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
  86. package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
  87. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
  88. package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
  89. package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
  90. package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
  91. package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
  92. package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
  93. package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
  94. package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
  95. package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
  96. package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
  97. package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
  98. package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
  99. package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
  100. package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
  101. package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
  102. package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
  103. package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
  104. package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
  105. package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
  106. package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
  107. package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
  108. package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
  109. package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
  110. package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
  111. package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
  112. package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
  113. package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
  114. package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
  115. package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
  116. package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
  117. package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
  118. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
  119. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
  120. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
  121. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
  122. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
  123. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
  124. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
  125. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
  126. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
  127. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
  128. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
  129. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
  130. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
  131. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
  132. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
  133. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
  134. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
  135. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
  136. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
  137. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
  138. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
  139. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
  140. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
  141. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
  142. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
  143. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
  144. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
  145. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
  146. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
  147. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
  148. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
  149. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
  150. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
  151. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
  152. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
  153. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
  154. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
  155. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
  156. package/blueprints/application-spa/docs/topics.md +57 -0
  157. package/blueprints/application-spa/guide/application-spa.md +40 -0
  158. package/blueprints/ci-pipeline/README.md +49 -0
  159. package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +61 -0
  160. package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +50 -0
  161. package/blueprints/ci-pipeline/assets/report-samples/per-gate.json +12 -0
  162. package/blueprints/ci-pipeline/assets/report-samples/pipeline.json +28 -0
  163. package/blueprints/ci-pipeline/blueprint.json +46 -0
  164. package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +25 -0
  165. package/blueprints/ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json +25 -0
  166. package/blueprints/ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json +25 -0
  167. package/blueprints/ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json +25 -0
  168. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +18 -0
  169. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-002.json +18 -0
  170. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-003.json +18 -0
  171. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-004.json +18 -0
  172. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-005.json +18 -0
  173. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-006.json +18 -0
  174. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-007.json +18 -0
  175. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-008.json +18 -0
  176. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +18 -0
  177. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-010.json +18 -0
  178. package/blueprints/ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json +59 -0
  179. package/blueprints/ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json +32 -0
  180. package/blueprints/ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json +41 -0
  181. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +37 -0
  182. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json +36 -0
  183. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json +37 -0
  184. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json +37 -0
  185. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json +36 -0
  186. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json +36 -0
  187. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json +37 -0
  188. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json +37 -0
  189. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +36 -0
  190. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json +36 -0
  191. package/blueprints/ci-pipeline/docs/topics.md +49 -0
  192. package/blueprints/ci-pipeline/guide/ci-pipeline.md +79 -0
  193. package/blueprints/deploy-cloudflare-workers/README.md +63 -0
  194. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
  195. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
  196. package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
  197. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
  198. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
  199. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
  200. package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
  201. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
  202. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
  203. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
  204. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
  205. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
  206. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
  207. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
  208. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
  209. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
  210. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
  211. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
  212. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
  213. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
  214. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
  215. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
  216. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
  217. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
  218. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
  219. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
  220. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
  221. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
  222. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
  223. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
  224. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
  225. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
  226. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
  227. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
  228. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
  229. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
  230. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
  231. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
  232. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
  233. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
  234. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
  235. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
  236. package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
  237. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
  238. package/blueprints/email-smtp-resend/README.md +45 -0
  239. package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
  240. package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
  241. package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
  242. package/blueprints/email-smtp-resend/blueprint.json +23 -0
  243. package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
  244. package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
  245. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
  246. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
  247. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
  248. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
  249. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
  250. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
  251. package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
  252. package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
  253. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
  254. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
  255. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
  256. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
  257. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
  258. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
  259. package/blueprints/email-smtp-resend/docs/topics.md +44 -0
  260. package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
  261. package/blueprints/observability-essentials/README.md +53 -0
  262. package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
  263. package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
  264. package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
  265. package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
  266. package/blueprints/observability-essentials/blueprint.json +54 -0
  267. package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
  268. package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
  269. package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
  270. package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
  271. package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
  272. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
  273. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
  274. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
  275. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
  276. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
  277. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
  278. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
  279. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
  280. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
  281. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
  282. package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
  283. package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
  284. package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
  285. package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
  286. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
  287. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
  288. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
  289. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
  290. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
  291. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
  292. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
  293. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
  294. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
  295. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
  296. package/blueprints/observability-essentials/docs/topics.md +57 -0
  297. package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
  298. package/blueprints/observability-probe-endpoints/README.md +53 -0
  299. package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
  300. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
  301. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
  302. package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
  303. package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
  304. package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
  305. package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
  306. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
  307. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
  308. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
  309. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
  310. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
  311. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
  312. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
  313. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
  314. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
  315. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
  316. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
  317. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
  318. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
  319. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
  320. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
  321. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
  322. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
  323. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
  324. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
  325. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
  326. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
  327. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
  328. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
  329. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
  330. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
  331. package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
  332. package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
  333. package/blueprints/persistence-data-d1/README.md +50 -0
  334. package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
  335. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
  336. package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
  337. package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
  338. package/blueprints/persistence-data-d1/blueprint.json +42 -0
  339. package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
  340. package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
  341. package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
  342. package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
  343. package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
  344. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
  345. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
  346. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
  347. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
  348. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
  349. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
  350. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
  351. package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
  352. package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
  353. package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
  354. package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
  355. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
  356. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
  357. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
  358. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
  359. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
  360. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
  361. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
  362. package/blueprints/persistence-data-d1/docs/topics.md +59 -0
  363. package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
  364. package/blueprints/persistence-data-sqlite/README.md +50 -0
  365. package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
  366. package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
  367. package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
  368. package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
  369. package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
  370. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
  371. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
  372. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
  373. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
  374. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
  375. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
  376. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
  377. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
  378. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
  379. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
  380. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
  381. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
  382. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
  383. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
  384. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
  385. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
  386. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
  387. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
  388. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
  389. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
  390. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
  391. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
  392. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
  393. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
  394. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
  395. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
  396. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
  397. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
  398. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
  399. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
  400. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
  401. package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
  402. package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
  403. package/blueprints/security-auth-clerk/README.md +50 -0
  404. package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
  405. package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
  406. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
  407. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
  408. package/blueprints/security-auth-clerk/blueprint.json +42 -0
  409. package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
  410. package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
  411. package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
  412. package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
  413. package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
  414. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
  415. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
  416. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
  417. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
  418. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
  419. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
  420. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
  421. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
  422. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
  423. package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
  424. package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
  425. package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
  426. package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
  427. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
  428. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
  429. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
  430. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
  431. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
  432. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
  433. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
  434. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
  435. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
  436. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
  437. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
  438. package/blueprints/security-auth-clerk/docs/topics.md +56 -0
  439. package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +71 -0
  440. package/blueprints/security-auth-keycloak/README.md +56 -0
  441. package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
  442. package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
  443. package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
  444. package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
  445. package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
  446. package/blueprints/security-auth-keycloak/blueprint.json +49 -0
  447. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
  448. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
  449. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
  450. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
  451. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
  452. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
  453. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
  454. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
  455. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
  456. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
  457. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
  458. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
  459. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
  460. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
  461. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
  462. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
  463. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
  464. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
  465. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
  466. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
  467. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
  468. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
  469. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
  470. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
  471. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
  472. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
  473. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
  474. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
  475. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
  476. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
  477. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
  478. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
  479. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
  480. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
  481. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
  482. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
  483. package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
  484. package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
  485. package/blueprints/security-auth-magic-link/README.md +46 -0
  486. package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
  487. package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
  488. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
  489. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
  490. package/blueprints/security-auth-magic-link/blueprint.json +45 -0
  491. package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
  492. package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
  493. package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
  494. package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
  495. package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
  496. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
  497. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
  498. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
  499. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
  500. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
  501. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
  502. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
  503. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
  504. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
  505. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
  506. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
  507. package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
  508. package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
  509. package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
  510. package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
  511. package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
  512. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
  513. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
  514. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
  515. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
  516. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
  517. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
  518. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
  519. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
  520. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
  521. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
  522. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
  523. package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
  524. package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
  525. package/blueprints/security-auth-oauth2/README.md +50 -0
  526. package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
  527. package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
  528. package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
  529. package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
  530. package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
  531. package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
  532. package/blueprints/security-auth-oauth2/blueprint.json +44 -0
  533. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
  534. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
  535. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
  536. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
  537. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
  538. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
  539. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
  540. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
  541. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
  542. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
  543. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
  544. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
  545. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
  546. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
  547. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
  548. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
  549. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
  550. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
  551. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
  552. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
  553. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
  554. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
  555. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
  556. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
  557. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
  558. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
  559. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
  560. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
  561. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
  562. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
  563. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
  564. package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
  565. package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
  566. package/blueprints/security-secrets-management/README.md +48 -0
  567. package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
  568. package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
  569. package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
  570. package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
  571. package/blueprints/security-secrets-management/blueprint.json +43 -0
  572. package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
  573. package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
  574. package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
  575. package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
  576. package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
  577. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
  578. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
  579. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
  580. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
  581. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
  582. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
  583. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
  584. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
  585. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
  586. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
  587. package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
  588. package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
  589. package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
  590. package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
  591. package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
  592. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
  593. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
  594. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
  595. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
  596. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
  597. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
  598. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
  599. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
  600. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
  601. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
  602. package/blueprints/security-secrets-management/docs/topics.md +46 -0
  603. package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
  604. package/fixtures/canary-manifest.json +1 -101
  605. package/package.json +15 -9
  606. package/rcf/.identity/profile.md +37 -0
  607. package/rcf/knowledge/INDEX.md +12 -0
  608. package/rcf/knowledge/README.md +41 -0
  609. package/rcf/knowledge/docs/.gitkeep +0 -0
  610. package/rcf/knowledge/notes/.gitkeep +0 -0
  611. package/scripts/preinstall-node-check.mjs +61 -0
  612. package/src/blueprint/apply.js +12 -6
  613. package/src/blueprint/conflicts.js +8 -8
  614. package/src/blueprint/index.js +2 -1
  615. package/src/blueprint/list.js +60 -0
  616. package/src/blueprint/loader.js +26 -1
  617. package/src/blueprint/namespace.js +20 -16
  618. package/src/blueprint/shelf-resolver.js +173 -0
  619. package/src/blueprint/supersede.js +3 -2
  620. package/src/browser-verify/invariants.js +40 -0
  621. package/src/browser-verify/runner.js +2 -0
  622. package/src/cli/blueprint.js +53 -9
  623. package/src/cli/init.js +2 -0
  624. package/src/core/store/writer.js +64 -2
  625. package/src/setup/agent-setup.js +28 -10
@@ -12,12 +12,14 @@
12
12
  //
13
13
  // - Prefix families (REQ, US, PRD, BS, TAD, TS): the blueprint slug is
14
14
  // attached as a lowercase kebab-slug PREFIX joined by `-` to the
15
- // family prefix. `REQ-001` under blueprint `spa` becomes `spa-REQ-001`.
15
+ // family prefix. `REQ-001` under blueprint `application-spa` becomes
16
+ // `application-spa-REQ-001`.
16
17
  //
17
18
  // - Suffix families (ADR, TAC, FBS, CN): the blueprint slug is attached
18
19
  // as a lowercase kebab-slug SUFFIX joined by `-` to the numeric tail.
19
- // `ADR-005` under blueprint `spa` becomes `ADR-005-spa`; a longer slug
20
- // segment (`spa-theme`) becomes `ADR-005-spa-theme`.
20
+ // `ADR-005` under blueprint `application-spa` becomes
21
+ // `ADR-005-application-spa`; a longer slug (`application-spa-theme`)
22
+ // becomes `ADR-005-application-spa-theme`.
21
23
  //
22
24
  // - AC and TC: not namespaced. AC ids are anchored to their parent US
23
25
  // (whose id is prefix-namespaced) and TC ids are anchored to their
@@ -70,21 +72,22 @@ export function namespaceStyleFor(id) {
70
72
  * - Ids that already carry a slug segment are accepted VERBATIM: the
71
73
  * blueprint author's declared contribution list is the truth for
72
74
  * what that blueprint owns. String grammar does not veto (`stampId`
73
- * used to refuse `ADR-201-spa-theme` under slug `spa` on the basis
74
- * that `spa-theme` != `spa`, which broke every blueprint whose
75
- * suffix-family ids carried a semantic tail after the slug).
75
+ * used to refuse `ADR-201-application-spa-theme` under slug
76
+ * `application-spa` on the basis that `application-spa-theme` !=
77
+ * `application-spa`, which broke every blueprint whose suffix-family
78
+ * ids carried a semantic tail after the slug).
76
79
  * - AC and TC pass through unchanged (no namespacing family).
77
80
  * - An id that matches no family pattern, or a slug that is not a
78
81
  * valid kebab, is refused.
79
82
  *
80
- * Cross-blueprint claims (`spa-theme-REQ-001` declared under blueprint
81
- * `spa` where `spa-theme` is also applied) are caught by the manifest-
82
- * record consulted at write time (`apply.js` overwrite guard +
83
- * cross-claim detector). String parsing here is deliberately not a
84
- * trust surface.
83
+ * Cross-blueprint claims (`application-spa-theme-REQ-001` declared
84
+ * under blueprint `application-spa` where `application-spa-theme` is
85
+ * also applied) are caught by the manifest-record consulted at write
86
+ * time (`apply.js` overwrite guard + cross-claim detector). String
87
+ * parsing here is deliberately not a trust surface.
85
88
  *
86
89
  * @param {string} id - canonical id (either bare `REQ-001` or already
87
- * namespaced `spa-REQ-001` / `ADR-201-spa-theme`)
90
+ * namespaced `application-spa-REQ-001` / `ADR-201-application-spa-theme`)
88
91
  * @param {string} slug - blueprint slug (must be well-formed kebab)
89
92
  * @returns {{ id: string } | { error: string }}
90
93
  */
@@ -119,10 +122,11 @@ export function stampId(id, slug) {
119
122
  * scan). `isNamespacedFor` retains exact-slug grammar semantics for
120
123
  * external consumers (docs generators, id-audit tooling) but must NOT
121
124
  * be used to authorise a write or a delete -- for slug+tail ids like
122
- * `ADR-201-spa-theme` the parsed suffix is `spa-theme`, which returns
123
- * false for a legitimate `spa`-owned contribution whose author put a
124
- * semantic tail after the slug. That misread is the exact reason the
125
- * ownership call-sites were routed off this predicate.
125
+ * `ADR-201-application-spa-theme` the parsed suffix is
126
+ * `application-spa-theme`, which returns false for a legitimate
127
+ * `application-spa`-owned contribution whose author put a semantic tail
128
+ * after the slug. That misread is the exact reason the ownership
129
+ * call-sites were routed off this predicate.
126
130
  *
127
131
  * @param {string} id
128
132
  * @param {string} slug
@@ -0,0 +1,173 @@
1
+ // Resolve a `rcf define blueprint add <source>` argument to an absolute
2
+ // blueprint directory.
3
+ //
4
+ // Resolution order (Phase 1; the phase-2 external-library registry
5
+ // layers on top of this without reworking the CLI):
6
+ //
7
+ // 1. Any argument that names a filesystem location - starts with `./`,
8
+ // `../`, `/`, or `~`, or contains a path separator, or names an
9
+ // existing directory - is treated as a PATH and returned unchanged.
10
+ // This preserves the existing local / relative-path semantic every
11
+ // test and existing operator invocation relies on.
12
+ // 2. `@stock/<slug>` is reserved for the packaged shelf. The `@stock/`
13
+ // qualifier strips off and the bare slug resolves against the
14
+ // packaged shelf. This is the recommended long-form.
15
+ // 3. Any other bare kebab slug (`deploy-cloudflare-workers`,
16
+ // `application-spa`) resolves against the packaged shelf. This is
17
+ // the sugar the persona reviews asked for; it means the docs and
18
+ // the CLI say the same thing.
19
+ // 4. A slug qualifier that names a KNOWN external-library alias other
20
+ // than `@stock` is rejected with a clear message pointing the
21
+ // operator at the current phase-1 capabilities. This reservation
22
+ // keeps the phase-2 external-libraries mechanism free to land the
23
+ // registry surface later without a breaking rename.
24
+ //
25
+ // The packaged shelf lives at `<packageRoot>/blueprints/<slug>/` - the
26
+ // tarball is built with `files: [ "blueprints" ]` and a `prepack`
27
+ // script that copies the repo-root shelf into the package directory
28
+ // before pack runs.
29
+
30
+ import { existsSync } from 'node:fs';
31
+ import { stat } from 'node:fs/promises';
32
+ import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
33
+ import { fileURLToPath } from 'node:url';
34
+
35
+ import { rcfError } from '../core/errors/index.js';
36
+
37
+ const here = dirname(fileURLToPath(import.meta.url));
38
+ // packages/rcf-lite/src/blueprint -> packages/rcf-lite
39
+ const PACKAGE_ROOT = resolve(here, '..', '..');
40
+ const PACKAGED_SHELF = join(PACKAGE_ROOT, 'blueprints');
41
+
42
+ const KEBAB_SLUG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
43
+ const QUALIFIED = /^@([a-z][a-z0-9-]*)\/([a-z][a-z0-9]*(?:-[a-z0-9]+)*)$/;
44
+
45
+ const PATH_HINT = /[\\/]|^~|^\./;
46
+
47
+ /**
48
+ * @typedef {object} ResolvedSource
49
+ * @property {'path' | 'shelf'} kind
50
+ * `path` if the argument was treated as a filesystem path (unchanged);
51
+ * `shelf` if a bare slug or `@stock/<slug>` was resolved against the
52
+ * packaged shelf. The apply.js layer treats both the same once resolved -
53
+ * both are absolute directory paths - but the kind is exposed for the
54
+ * CLI's future diagnostics (`--dry-run` labelling, etc.).
55
+ * @property {string} resolved Absolute path suitable for `applyBlueprint({ source })`.
56
+ * @property {string} original The argument the operator typed, preserved for
57
+ * diagnostics and the conflict-renderer's supersede hint.
58
+ * @property {string} [slug] The bare slug when resolution went through the shelf.
59
+ */
60
+
61
+ /**
62
+ * @param {string} source - argument as typed by the operator
63
+ * @param {object} [opts]
64
+ * @param {string} [opts.packagedShelf] - override for tests
65
+ * @returns {Promise<ResolvedSource | import('../core/errors/index.js').RcfError>}
66
+ */
67
+ export async function resolveBlueprintSource(source, opts = {}) {
68
+ if (typeof source !== 'string' || source.length === 0) {
69
+ return rcfError({ kind: 'usage', message: 'blueprint source is required' });
70
+ }
71
+ const packagedShelf = opts.packagedShelf ?? PACKAGED_SHELF;
72
+
73
+ // Rule 2 / 4 FIRST: qualified `@lib/slug` forms carry a `/` that
74
+ // would otherwise trip the path-hint check below. `@stock/<slug>`
75
+ // resolves to the packaged shelf; any other library qualifier is
76
+ // reserved for the phase-2 external-libraries mechanism and refuses
77
+ // with a clear message.
78
+ const qualified = QUALIFIED.exec(source);
79
+ if (qualified) {
80
+ const [, library, slug] = qualified;
81
+ if (library === 'stock') {
82
+ return resolveShelfSlug(slug, source, packagedShelf);
83
+ }
84
+ return rcfError({
85
+ kind: 'usage',
86
+ message: (
87
+ `blueprint source '${source}' names external library '@${library}', which is reserved for the phase-2 external-libraries mechanism and not resolvable yet. `
88
+ + 'Use `@stock/<slug>` for the packaged shelf, a local path (`./path/to/blueprint`), or wait for the external-library registry.'
89
+ ),
90
+ });
91
+ }
92
+
93
+ // Rule 1: path-looking arguments are passed through unchanged. We look
94
+ // at the SHAPE only (does it contain a separator, does it start with a
95
+ // relative-path marker, is it absolute), so an existing operator with a
96
+ // `./blueprints/foo` invocation keeps the current behaviour byte-for-byte.
97
+ if (isAbsolute(source) || PATH_HINT.test(source)) {
98
+ return { kind: 'path', resolved: resolve(source), original: source };
99
+ }
100
+
101
+ // Rule 3: any other bare kebab token is a shelf slug.
102
+ if (KEBAB_SLUG.test(source)) {
103
+ return resolveShelfSlug(source, source, packagedShelf);
104
+ }
105
+
106
+ // Anything that has slipped through here is neither a path, nor a
107
+ // qualified library slug, nor a bare kebab slug. Treat it as a path so
108
+ // the loader emits the familiar "no blueprint.json found" error against
109
+ // the exact string the operator typed; that keeps the failure locus
110
+ // close to what they wrote rather than adding a resolver-specific class.
111
+ return { kind: 'path', resolved: resolve(source), original: source };
112
+ }
113
+
114
+ async function resolveShelfSlug(slug, original, packagedShelf) {
115
+ const candidate = join(packagedShelf, slug);
116
+ if (!existsSync(candidate)) {
117
+ const known = await knownShelfSlugs(packagedShelf);
118
+ const suggestion = known.length > 0
119
+ ? ` Known shelf slugs: ${known.join(', ')}.`
120
+ : ' The packaged shelf appears empty; reinstall rcf-lite to restore it.';
121
+ return rcfError({
122
+ kind: 'usage',
123
+ message: `blueprint source '${original}' did not match a packaged shelf entry at ${candidate}.${suggestion}`,
124
+ filePath: candidate,
125
+ });
126
+ }
127
+ try {
128
+ const s = await stat(candidate);
129
+ if (!s.isDirectory()) {
130
+ return rcfError({
131
+ kind: 'usage',
132
+ message: `blueprint source '${original}' resolved to ${candidate} but that path is not a directory.`,
133
+ filePath: candidate,
134
+ });
135
+ }
136
+ } catch (err) {
137
+ return rcfError({
138
+ kind: 'ioFailure',
139
+ message: `blueprint source '${original}' resolution failed: ${err.message}`,
140
+ filePath: candidate,
141
+ });
142
+ }
143
+ return { kind: 'shelf', resolved: candidate, original, slug };
144
+ }
145
+
146
+ /**
147
+ * Enumerate the packaged shelf's slugs (top-level directories). Empty
148
+ * array on a missing shelf. Used to render a helpful "did you mean"
149
+ * hint on a resolver miss.
150
+ *
151
+ * @param {string} [packagedShelf]
152
+ * @returns {Promise<string[]>}
153
+ */
154
+ export async function knownShelfSlugs(packagedShelf = PACKAGED_SHELF) {
155
+ try {
156
+ const { readdir } = await import('node:fs/promises');
157
+ const entries = await readdir(packagedShelf, { withFileTypes: true });
158
+ return entries
159
+ .filter((e) => e.isDirectory())
160
+ .map((e) => e.name)
161
+ .sort();
162
+ } catch {
163
+ return [];
164
+ }
165
+ }
166
+
167
+ /** Absolute path of the packaged shelf. Test-visible. */
168
+ export function packagedShelfPath() {
169
+ return PACKAGED_SHELF;
170
+ }
171
+
172
+ /** Placeholder to keep unused-import linters happy in bundles that only pull the constant. */
173
+ export const PATH_SEPARATOR = sep;
@@ -85,12 +85,13 @@ export async function supersedeBlueprintTopic({ projectRoot, tree, topic, incomi
85
85
  if (typeof topic !== 'string' || topic.trim().length === 0) {
86
86
  // Schema minLength:1 accepts whitespace-only; the writer refuses
87
87
  // it up-front so a whitespace-only topic never lands on disk.
88
- return rcfError({ kind: 'usage', message: `topic is required (e.g. rcf define blueprint supersede errorEnvelope --incoming ./blueprints/rest)` });
88
+ return rcfError({ kind: 'usage', message: `topic is required (e.g. rcf define blueprint supersede errorEnvelope --incoming ./blueprints/application-api-rest)` });
89
89
  }
90
90
  // Topic is a LOOKUP KEY into applied ADR topics, not a slug (ADR-010).
91
91
  // Schema is minLength:1 with no character constraint and the schema
92
92
  // docs explicitly cite camelCase examples ('errorEnvelope'). The
93
- // shipped SPA + REST blueprints declare camelCase topics; we accept
93
+ // shipped application-spa + application-api-rest blueprints declare
94
+ // camelCase topics; we accept
94
95
  // any topic string that exact-matches an applied or incoming ADR
95
96
  // topic below, and kebab-ify only when projecting into the
96
97
  // scaffolded project-ADR id slug tail (adrId grammar requires
@@ -34,6 +34,7 @@
34
34
  * @property {object} [uiBaseline] the manifest uiBaseline record (defaults + opt-outs)
35
35
  * @property {string} dom the response HTML for the route
36
36
  * @property {boolean} [authenticated] whether the request carried the auth cookie
37
+ * @property {string} [landedPath] the pathname the browser's final URL resolved to after any redirect chain; when the driver reports it, `authenticatedLandsOnRequestedPath` compares it against `routePath` (AC-1131-3 landed-path refusal)
37
38
  */
38
39
 
39
40
  const OPT_OUT_FIELDS = new Set([
@@ -91,6 +92,12 @@ const V1_INVARIANTS = [
91
92
  perThemeOnly: false,
92
93
  run: checkNoInlineStyleBlocks,
93
94
  },
95
+ {
96
+ name: 'authenticatedLandsOnRequestedPath',
97
+ severity: 'block',
98
+ perThemeOnly: false,
99
+ run: checkAuthenticatedLandsOnRequestedPath,
100
+ },
94
101
  ];
95
102
 
96
103
  /** Versioned constant, module-encoded per §12 O-6. */
@@ -326,6 +333,39 @@ function checkNoInlineStyleBlocks(ctx) {
326
333
  };
327
334
  }
328
335
 
336
+ /**
337
+ * AC-1131-3 landed-path refusal: when the driver reports the browser's
338
+ * final URL path after any redirect chain resolves, and the request was
339
+ * for an authenticated route, the landed path MUST equal the requested
340
+ * route path. Cures the class of harness where a broken session lane
341
+ * silently caused every authenticated-route assertion to run against a
342
+ * styled /login (Playwright's page.goto follows redirects by default,
343
+ * so the resolved response is 200 from the redirect target and the
344
+ * downstream styled/CSP assertions pass against the wrong surface).
345
+ * Watchpost partial-acceptance w-2026-08-24-003 / AC-1601-14; ported
346
+ * into the SPA blueprint TAC-209 v1.0.1.
347
+ *
348
+ * The invariant is opt-in: when the driver does NOT populate
349
+ * `ctx.landedPath` the invariant passes (older drivers keep working).
350
+ * Once the SPA-blueprint drivers report `landedPath` this becomes a
351
+ * hard block-severity refusal.
352
+ */
353
+ function checkAuthenticatedLandsOnRequestedPath(ctx) {
354
+ if (typeof ctx.landedPath !== 'string' || ctx.landedPath.length === 0) return { verdict: 'pass' };
355
+ if (ctx.authenticated === false) return { verdict: 'pass' };
356
+ const routes = ctx.fbs?.designStage?.navModel?.routes ?? [];
357
+ const routeSpec = routes.find((r) => r.path === ctx.routePath);
358
+ // If the FBS enumerates the route and marks it authRequired=false, the
359
+ // landed-path refusal does not fire (a public route is allowed to
360
+ // redirect to any other public surface by design).
361
+ if (routeSpec && routeSpec.authRequired === false && ctx.authenticated !== true) return { verdict: 'pass' };
362
+ if (ctx.landedPath === ctx.routePath) return { verdict: 'pass' };
363
+ return {
364
+ verdict: 'fail',
365
+ detail: `authenticated navigation landed on '${ctx.landedPath}' (requested '${ctx.routePath}'); a silent redirect chain to another surface (e.g. a session-broken 302 to /login) validated the redirect target's styled state instead of the requested route (AC-1131-3 pathMismatch; watchpost AC-1601-14, w-2026-08-24-003).`,
366
+ };
367
+ }
368
+
329
369
  function topLevelChildTagSequence(dom) {
330
370
  // Extract the tag-name sequence of direct children of <body>. Cheap
331
371
  // regex-based; deliberately conservative (misses nested body-siblings
@@ -28,6 +28,7 @@ import { composeBrowserVerificationRecord } from './manifest-writer.js';
28
28
  * @property {string} dom
29
29
  * @property {string} screenshotPath
30
30
  * @property {boolean} [authenticated]
31
+ * @property {string} [landedPath] the pathname of the browser's final URL after any redirect chain resolved (`new URL(page.url()).pathname`); when the driver reports it, the `authenticatedLandsOnRequestedPath` invariant fires (AC-1131-3 landed-path refusal, watchpost AC-1601-14 port)
31
32
  */
32
33
 
33
34
  /**
@@ -78,6 +79,7 @@ export async function runAgentScreenshotCritique({
78
79
  uiBaseline: tree.manifest?.uiBaseline,
79
80
  dom: cap.dom,
80
81
  authenticated: cap.authenticated,
82
+ landedPath: cap.landedPath,
81
83
  });
82
84
  perCapture.push({ routePath: cap.routePath, themeApplied: cap.themeApplied, results });
83
85
  routesChecked.push({ path: cap.routePath, screenshotPath: cap.screenshotPath, themeApplied: cap.themeApplied });
@@ -16,9 +16,12 @@ import { findProjectRoot } from '../view/index.js';
16
16
  import {
17
17
  applyBlueprint,
18
18
  diffBlueprintTopic,
19
+ enrichRowsWithCategories,
20
+ groupRowsByCategory,
19
21
  listBlueprints,
20
22
  removeBlueprint,
21
23
  renderDiff,
24
+ resolveBlueprintSource,
22
25
  supersedeBlueprintTopic,
23
26
  } from '../blueprint/index.js';
24
27
  import { conflictReportJson, renderConflictReport } from '../blueprint/conflicts.js';
@@ -26,13 +29,23 @@ import { conflictReportJson, renderConflictReport } from '../blueprint/conflicts
26
29
  export const HELP = `Usage: rcf define blueprint <verb> [options]
27
30
 
28
31
  Verbs:
29
- add <source> Apply a blueprint from a source directory
30
- (Phase 1: local path; the registry / git-ref
31
- resolver is a Phase 2 concern). Writes an entry
32
- to manifest.blueprints[] and copies namespaced
33
- contributions into the tree.
32
+ add <source> Apply a blueprint from a source directory.
33
+ <source> resolves in this order:
34
+ - a path (./foo, /abs, has a slash) is used as-is;
35
+ - @stock/<slug> resolves to the packaged shelf that
36
+ ships with rcf-lite (recommended long form);
37
+ - a bare kebab slug (deploy-cloudflare-workers,
38
+ application-spa) resolves to the same shelf;
39
+ - any other @<library>/<slug> is reserved for the
40
+ phase-2 external-libraries mechanism and refuses.
41
+ Writes an entry to manifest.blueprints[] and copies
42
+ namespaced contributions into the tree.
34
43
  list List every applied blueprint (slug, version,
35
- appliedAt, contributionCount).
44
+ appliedAt, contributionCount), grouped by the
45
+ \`category\` declared on each blueprint's own
46
+ \`blueprint.json\`. Blueprints whose source no
47
+ longer resolves, or whose source declares no
48
+ category, appear under \`uncategorised\`.
36
49
  remove <slug> Remove an applied blueprint. Refuses when any
37
50
  project-authored doc references a contribution
38
51
  id; prints the referring docs and exits 3.
@@ -142,7 +155,22 @@ export async function main(argv, deps = {}) {
142
155
  stderr.write('[error] blueprint add: missing <source>\n');
143
156
  return 2;
144
157
  }
145
- const source = rest[0];
158
+ const rawSource = rest[0];
159
+ const resolved = await resolveBlueprintSource(rawSource);
160
+ if (isRcfError(resolved)) {
161
+ if (parsed.values.json) {
162
+ stderr.write(`${JSON.stringify({ refused: true, error: { kind: resolved.kind, message: resolved.message } })}\n`);
163
+ } else {
164
+ stderr.write(`[error] blueprint add: ${resolved.message}\n`);
165
+ }
166
+ return 2;
167
+ }
168
+ // Feed the resolved absolute path to the applier; keep the original
169
+ // typed source on the CLI for the supersede hint the conflict
170
+ // renderer prints, so the operator sees exactly the string they can
171
+ // copy back into a fresh shell.
172
+ const source = resolved.resolved;
173
+ const displaySource = resolved.original;
146
174
  const resolveDeclarations = parseResolveOptions(parsed.values.resolve, parsed.values.reason);
147
175
  if (resolveDeclarations.error) {
148
176
  stderr.write(`[error] blueprint add: ${resolveDeclarations.error}\n`);
@@ -150,6 +178,7 @@ export async function main(argv, deps = {}) {
150
178
  }
151
179
  const result = await applyBlueprint({
152
180
  projectRoot, tree, source,
181
+ displaySource,
153
182
  namespaceOverride: parsed.values.namespace,
154
183
  resolveDeclarations: resolveDeclarations.value,
155
184
  now,
@@ -211,8 +240,23 @@ export async function main(argv, deps = {}) {
211
240
  if (!parsed.values.quiet) stdout.write('[blueprint] no blueprints applied on this project.\n');
212
241
  return 0;
213
242
  }
214
- for (const row of rows) {
215
- stdout.write(`${row.slug}\t${row.version}\t${row.appliedAt}\t${row.contributionCount} contribution(s)\n`);
243
+ // Enrich with category from each applied blueprint's source. The
244
+ // manifest schema does not carry category (additionalProperties:
245
+ // false on appliedBlueprintRecord), so the enricher re-loads each
246
+ // source's blueprint.json at list time; a source that no longer
247
+ // resolves surfaces under the `uncategorised` group rather than
248
+ // being dropped.
249
+ const enriched = await enrichRowsWithCategories(rows);
250
+ const groups = groupRowsByCategory(enriched);
251
+ let first = true;
252
+ for (const group of groups) {
253
+ const label = group.category ?? 'uncategorised';
254
+ if (!first) stdout.write('\n');
255
+ first = false;
256
+ stdout.write(`# ${label}\n`);
257
+ for (const row of group.rows) {
258
+ stdout.write(`${row.slug}\t${row.version}\t${row.appliedAt}\t${row.contributionCount} contribution(s)\n`);
259
+ }
216
260
  }
217
261
  return 0;
218
262
  }
package/src/cli/init.js CHANGED
@@ -219,6 +219,8 @@ export async function main(argv, deps = {}) {
219
219
  stdout.write(` Gitignore ${gitignoreVerbAndTarget(gitignoreResult)}.\n`);
220
220
  stdout.write('\nNext: start your agent session in this directory and tell it what you want to build. '
221
221
  + 'It elicits the requirements and drives the build from there - you do not fill in the document chain by hand.\n');
222
+ stdout.write('\nRun `rcf doctor` to confirm the wiring stays clean over time '
223
+ + '(it also checks whether managed blocks have drifted from the shipped canon).\n');
222
224
  }
223
225
  return 0;
224
226
  }
@@ -824,12 +824,30 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
824
824
  field: 'parent',
825
825
  });
826
826
  }
827
+ // Phantom-AC replacement (G5). A freshly-created US carries a single
828
+ // seeded AC-N-1 whose description equals the exact seed sentinel below;
829
+ // the schema requires acceptanceCriteria minItems:1, so we cannot ship
830
+ // the US without one. On the operator's FIRST `create ac --parent US-N`
831
+ // (no explicit --id given, and the existing single AC is unmistakably
832
+ // the seed), we REPLACE that phantom instead of appending after it -
833
+ // so the operator's first real AC lands at -1 and audit coverage /
834
+ // trace no longer count the seed as an unmet criterion. Any operator
835
+ // edit to the seed (custom given/when/then/scope/provenance, different
836
+ // description, testable=false) disqualifies it from replacement and
837
+ // the append path runs as before.
838
+ const currentAcs = Array.isArray(us.acceptanceCriteria) ? us.acceptanceCriteria : [];
839
+ const seedIndex = detectSeededPhantomAcIndex(currentAcs, parentUsId);
840
+ const replacingPhantom = seedIndex !== -1 && !options.id;
841
+
827
842
  let acId = options.id;
828
843
  if (acId) {
829
- const existing = (us.acceptanceCriteria ?? []).some((ac) => ac.id === acId);
844
+ const existing = currentAcs.some((ac) => ac.id === acId);
830
845
  if (existing) {
831
846
  return rcfError({ kind: 'usage', message: `create ac: id ${acId} already exists on ${parentUsId}`, documentId: acId });
832
847
  }
848
+ } else if (replacingPhantom) {
849
+ // Reuse the seed's id (AC-<us>-1) so the operator's first AC is -1.
850
+ acId = currentAcs[seedIndex].id;
833
851
  } else {
834
852
  try {
835
853
  acId = nextIdForKind(tree, 'ac', { parentId: parentUsId });
@@ -845,9 +863,12 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
845
863
  ...(body?.when !== undefined ? { when: body.when } : {}),
846
864
  ...(body?.then !== undefined ? { then: body.then } : {}),
847
865
  };
866
+ const nextAcs = replacingPhantom
867
+ ? currentAcs.map((ac, i) => (i === seedIndex ? acEntry : ac))
868
+ : [...currentAcs, acEntry];
848
869
  const nextUs = {
849
870
  ...us,
850
- acceptanceCriteria: [...(us.acceptanceCriteria ?? []), acEntry],
871
+ acceptanceCriteria: nextAcs,
851
872
  updatedAt: nowIso(),
852
873
  };
853
874
  const relPath = `rcf/user-stories/${parentUsId.toLowerCase()}.json`;
@@ -871,6 +892,47 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
871
892
  return { id: acId, filePath: relPath, parentId: parentUsId, body: acEntry };
872
893
  }
873
894
 
895
+ /**
896
+ * A newly-created user story ships one seeded acceptance criterion
897
+ * (schema demands acceptanceCriteria minItems:1). The seed's description
898
+ * is the exact sentinel below, and no user-authored fields are attached.
899
+ * This detector returns the index of that seed AC when it is the ONLY AC
900
+ * on the US and is byte-for-byte unmodified from what the writer / init
901
+ * placed there; otherwise -1. Used by createInlineAc to REPLACE the seed
902
+ * on the operator's first `create ac`, so their first real AC lands at
903
+ * AC-<us>-1 rather than AC-<us>-2.
904
+ *
905
+ * Kept in sync with the two seed emitters:
906
+ * - src/core/store/writer.js assembleBody 'userStory' -> 'TODO: first acceptance criterion'
907
+ * - src/core/store/init.js userStoryTemplate -> 'TODO: describe the first acceptance criterion'
908
+ *
909
+ * @param {Array<{id:string, description:string, testable?:boolean}>} acs
910
+ * @param {string} parentUsId
911
+ * @returns {number}
912
+ */
913
+ function detectSeededPhantomAcIndex(acs, parentUsId) {
914
+ if (!Array.isArray(acs) || acs.length !== 1) return -1;
915
+ const [ac] = acs;
916
+ if (!ac || typeof ac !== 'object') return -1;
917
+ const mUs = /^US-(\d+)$/.exec(parentUsId);
918
+ if (!mUs) return -1;
919
+ const expectedId = `AC-${mUs[1]}-1`;
920
+ if (ac.id !== expectedId) return -1;
921
+ if (ac.testable !== true) return -1;
922
+ const seedDescriptions = new Set([
923
+ 'TODO: first acceptance criterion',
924
+ 'TODO: describe the first acceptance criterion',
925
+ ]);
926
+ if (!seedDescriptions.has(ac.description)) return -1;
927
+ // Any operator-authored optional field disqualifies replacement.
928
+ if (ac.given !== undefined) return -1;
929
+ if (ac.when !== undefined) return -1;
930
+ if (ac.then !== undefined) return -1;
931
+ if (ac.scope !== undefined) return -1;
932
+ if (ac.provenance !== undefined) return -1;
933
+ return 0;
934
+ }
935
+
874
936
  /**
875
937
  * Create an inline TC under a parent TS.
876
938
  */
@@ -184,17 +184,25 @@ export async function loadHarnessFragment({ templatePath } = {}) {
184
184
  }
185
185
 
186
186
  /**
187
- * Write or merge the project-root .mcp.json with the rcf server entry
188
- * (the exact registration shape docs/install.md documents). MERGE
189
- * discipline: other servers and unknown top-level keys are preserved
187
+ * Write or merge the project-root .mcp.json with the rcf server entry.
188
+ * MERGE discipline: other servers and unknown top-level keys are preserved
190
189
  * verbatim; an existing `rcf` entry is left alone.
191
190
  *
191
+ * The default entry invokes the CLI via `npx rcf-lite mcp` rather than an
192
+ * absolute `node <binPath>` path so the config stays portable across
193
+ * machines and CI checkouts (a project imported on a teammate's machine
194
+ * or moved to a different install location keeps working without a
195
+ * re-init). Callers wiring the config from tests can still pass an
196
+ * absolute `binPath` to force the legacy `node <binPath> mcp` shape.
197
+ *
192
198
  * @param {object} args
193
199
  * @param {string} args.projectRoot
194
- * @param {string} [args.binPath] - test override
200
+ * @param {string} [args.binPath] - if provided, use `{ command: 'node',
201
+ * args: [binPath, 'mcp'] }` instead of `npx rcf-lite mcp`. Test
202
+ * override / opt-out for pinned deployments.
195
203
  * @returns {Promise<{ file: string, action: 'created'|'merged'|'kept' } | import('#core/errors').RcfError>}
196
204
  */
197
- export async function writeMcpConfig({ projectRoot, binPath = rcfBinPath() }) {
205
+ export async function writeMcpConfig({ projectRoot, binPath } = {}) {
198
206
  const file = join(projectRoot, '.mcp.json');
199
207
  const raw = await readIfExists(file);
200
208
  let config = {};
@@ -224,11 +232,14 @@ export async function writeMcpConfig({ projectRoot, binPath = rcfBinPath() }) {
224
232
  if (servers.rcf) {
225
233
  return { file: '.mcp.json', action: 'kept' };
226
234
  }
235
+ const rcfEntry = typeof binPath === 'string' && binPath.length > 0
236
+ ? { command: 'node', args: [binPath, 'mcp'] }
237
+ : { command: 'npx', args: ['rcf-lite', 'mcp'] };
227
238
  const next = {
228
239
  ...config,
229
240
  mcpServers: {
230
241
  ...servers,
231
- rcf: { command: 'node', args: [binPath, 'mcp'] },
242
+ rcf: rcfEntry,
232
243
  },
233
244
  };
234
245
  await writeFile(file, `${JSON.stringify(next, null, 2)}\n`, 'utf8');
@@ -345,15 +356,22 @@ export const SETUP_FUNNEL_INSTRUCTION = 'Setup incomplete. Run `npx rcf init` to
345
356
  /**
346
357
  * Manual instructions printed by `rcf init --no-agent-setup`.
347
358
  *
348
- * @param {string} [binPath]
359
+ * @param {string} [binPath] - when omitted (the default), the manual
360
+ * registration snippet uses `npx rcf-lite mcp` for portability across
361
+ * machines and checkouts. Pass a specific absolute path only when the
362
+ * caller wants to pin to a particular install (test fixtures, or a
363
+ * deployment that has deliberately vendored the CLI).
349
364
  * @returns {string}
350
365
  */
351
- export function manualSetupInstructions(binPath = rcfBinPath()) {
366
+ export function manualSetupInstructions(binPath) {
367
+ const useNpx = typeof binPath !== 'string' || binPath.length === 0;
368
+ const registration = useNpx
369
+ ? ' { "mcpServers": { "rcf": { "command": "npx", "args": ["rcf-lite", "mcp"] } } }'
370
+ : ` { "mcpServers": { "rcf": { "command": "node", "args": ["${binPath}", "mcp"] } } }`;
352
371
  return [
353
372
  'Agent setup skipped (--no-agent-setup). To wire the harness manually:',
354
373
  ' 1. Register the MCP server in your project-root .mcp.json:',
355
- ' { "mcpServers": { "rcf": { "command": "node",',
356
- ` "args": ["${binPath}", "mcp"] } } }`,
374
+ registration,
357
375
  ' 2. Paste the fragment from `rcf guidance harness-template` (the',
358
376
  ' first ```markdown fence) into your project\'s CLAUDE.md or',
359
377
  ' AGENTS.md.',