rcf-lite 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/bin/rcf.js +3 -1
  3. package/blueprints/application-api-rest/docs/topics.md +1 -1
  4. package/blueprints/application-spa/README.md +3 -3
  5. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
  6. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
  7. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +7 -7
  8. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +7 -7
  9. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +8 -8
  10. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +8 -8
  11. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +8 -8
  12. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +2 -2
  13. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +2 -2
  14. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +2 -2
  15. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +2 -2
  16. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +3 -3
  17. package/blueprints/application-spa/docs/topics.md +1 -1
  18. package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
  19. package/blueprints/delivery-ci-workflows/README.md +57 -0
  20. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +55 -0
  21. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +65 -0
  22. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +71 -0
  23. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +61 -0
  24. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
  25. package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/per-gate.json +2 -1
  26. package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
  27. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
  28. package/blueprints/{ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json → delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json} +2 -2
  29. package/blueprints/{ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json → delivery-ci-workflows/contributions/adrs/adr-703-delivery-ci-workflows-node-only-runner.json} +1 -1
  30. package/blueprints/{ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json → delivery-ci-workflows/contributions/adrs/adr-704-delivery-ci-workflows-report-shape.json} +3 -3
  31. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
  32. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
  33. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
  34. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
  35. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
  36. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
  37. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
  38. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-002.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json} +2 -2
  39. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-003.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json} +2 -2
  40. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-004.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json} +2 -2
  41. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-005.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json} +4 -4
  42. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-006.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json} +2 -2
  43. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-007.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json} +2 -2
  44. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-008.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json} +2 -2
  45. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
  46. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-010.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json} +2 -2
  47. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
  48. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
  49. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
  50. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
  51. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
  52. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
  53. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
  54. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
  55. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
  56. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
  57. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
  58. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
  59. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
  60. package/blueprints/{ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json → delivery-ci-workflows/contributions/tacs/tac-701-delivery-ci-workflows-gate-runner.json} +3 -3
  61. package/blueprints/{ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json → delivery-ci-workflows/contributions/tacs/tac-702-delivery-ci-workflows-gate-report.json} +1 -1
  62. package/blueprints/{ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json → delivery-ci-workflows/contributions/tacs/tac-703-delivery-ci-workflows-aggregate-report.json} +2 -2
  63. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +64 -0
  64. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
  65. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
  66. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
  67. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json} +3 -3
  68. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json} +4 -4
  69. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json} +4 -4
  70. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json} +6 -6
  71. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json} +3 -3
  72. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json} +5 -5
  73. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json} +4 -4
  74. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
  75. package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json} +3 -3
  76. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
  77. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
  78. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
  79. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
  80. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
  81. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
  82. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
  83. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
  84. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
  85. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
  86. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
  87. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
  88. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
  89. package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
  90. package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +136 -0
  91. package/blueprints/deploy-cloudflare-workers/docs/topics.md +3 -3
  92. package/blueprints/email-smtp-resend/docs/topics.md +1 -1
  93. package/blueprints/observability-essentials/README.md +2 -2
  94. package/blueprints/observability-essentials/docs/topics.md +5 -5
  95. package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
  96. package/blueprints/persistence-data-d1/README.md +2 -2
  97. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +1 -1
  98. package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +1 -1
  99. package/blueprints/persistence-data-d1/docs/topics.md +2 -2
  100. package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +1 -1
  101. package/blueprints/persistence-data-sqlite/README.md +1 -1
  102. package/blueprints/persistence-data-sqlite/docs/topics.md +1 -1
  103. package/blueprints/security-auth-clerk/README.md +5 -3
  104. package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
  105. package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
  106. package/blueprints/security-auth-clerk/blueprint.json +1 -1
  107. package/blueprints/security-auth-clerk/docs/topics.md +2 -2
  108. package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +9 -0
  109. package/blueprints/security-auth-keycloak/docs/topics.md +2 -2
  110. package/blueprints/security-auth-magic-link/README.md +1 -1
  111. package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
  112. package/blueprints/security-auth-oauth2/README.md +1 -1
  113. package/blueprints/security-auth-oauth2/docs/topics.md +2 -2
  114. package/blueprints/security-secrets-management/README.md +1 -1
  115. package/blueprints/security-secrets-management/docs/topics.md +3 -3
  116. package/guidance/build-cycle-playbook.md +2 -2
  117. package/guidance/document-model.md +1 -1
  118. package/guidance/harness-template.md +13 -0
  119. package/guidance/managed/agent-instructions-block.hash +1 -1
  120. package/guidance/managed/agent-instructions-block.md +13 -0
  121. package/package.json +5 -2
  122. package/rcf/adrs/adr-001.json +1 -1
  123. package/rcf/adrs/adr-009.json +1 -1
  124. package/rcf/build-sequence.json +1 -1
  125. package/rcf/manifest.json +2 -2
  126. package/rcf/prd.json +2 -2
  127. package/releases/releases.yaml +116 -0
  128. package/src/blueprint/apply.js +51 -13
  129. package/src/blueprint/index.js +12 -0
  130. package/src/blueprint/library-loader.js +271 -0
  131. package/src/blueprint/library-registry.js +341 -0
  132. package/src/blueprint/list.js +38 -4
  133. package/src/blueprint/shelf-resolver.js +144 -31
  134. package/src/cli/blueprint-library.js +419 -0
  135. package/src/cli/blueprint.js +46 -9
  136. package/src/cli/guidance.js +1 -1
  137. package/src/cli/help.js +27 -1
  138. package/src/cli/version.js +673 -0
  139. package/src/cli/view.js +282 -1
  140. package/src/server/index.js +3 -0
  141. package/src/server/routes.js +15 -1
  142. package/src/server/scope-endpoint.js +105 -0
  143. package/src/view/live-client.js +253 -6
  144. package/src/view/scope.js +231 -0
  145. package/src/view/style.css +42 -0
  146. package/blueprints/ci-pipeline/README.md +0 -49
  147. package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +0 -61
  148. package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +0 -50
  149. package/blueprints/ci-pipeline/blueprint.json +0 -46
  150. package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +0 -25
  151. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +0 -18
  152. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +0 -18
  153. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +0 -37
  154. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +0 -36
  155. package/blueprints/ci-pipeline/docs/topics.md +0 -49
  156. package/blueprints/ci-pipeline/guide/ci-pipeline.md +0 -79
  157. package/rcf/.identity/profile.md +0 -37
  158. package/rcf/knowledge/INDEX.md +0 -12
  159. package/rcf/knowledge/README.md +0 -41
  160. package/rcf/knowledge/docs/.gitkeep +0 -0
  161. package/rcf/knowledge/notes/.gitkeep +0 -0
  162. /package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/pipeline.json +0 -0
@@ -26,7 +26,7 @@ One page per document type, the reference rule that keeps the tree drift-proof,
26
26
 
27
27
  **TC (Test Case).** One test: which AC it verifies, where the executable test lives (its test pointer), and its status.
28
28
 
29
- **CN (Code Node).** The spec-to-code bridge: a working-tree source path, optionally `#symbol`-suffixed, that implements one or more acceptance criteria (`implementsAcIds`, which may be empty - an orphan CN is a legitimate state for utilities and glue code). `rcf define validate` checks every CN's path/symbol against the working tree, so a rename or deletion that leaves the pointer dangling is caught the same way a broken spec-side reference is. Author CNs during Stage 2 of the build cycle (see below), not after: `rcf build mark <fbs-id> complete` refuses when an in-scope acceptance criterion has none. Full detail, including the honest limits, is `docs/code-nodes.md` in the rcf-build-lite repo.
29
+ **CN (Code Node).** The spec-to-code bridge: a working-tree source path, optionally `#symbol`-suffixed, that implements one or more acceptance criteria (`implementsAcIds`, which may be empty - an orphan CN is a legitimate state for utilities and glue code). `rcf define validate` checks every CN's path/symbol against the working tree, so a rename or deletion that leaves the pointer dangling is caught the same way a broken spec-side reference is. Author CNs during Stage 2 of the build cycle (see below), not after: `rcf build mark <fbs-id> complete` refuses when an in-scope acceptance criterion has none. Full detail, including the honest limits, is `docs/code-nodes.md` in the rcf-lite repo.
30
30
 
31
31
  ## Edges live on the child
32
32
 
@@ -222,6 +222,19 @@ ask for. A failure the operator has to point out is a failure you did
222
222
  not check for. The depth for each stage's self-check lives in the
223
223
  build-cycle playbook.
224
224
 
225
+ ### RULE 14: Check freshness at session start; offer, never install.
226
+
227
+ At the start of a new session on this project, run `rcf version --check`
228
+ (one call, silent on network trouble) and note the result. If a newer
229
+ release is available, tell the operator in one line what changed and
230
+ OFFER the upgrade. The exact command to run depends on how rcf-lite is
231
+ installed here (global npm, per-repo dep, npx pin); propose the command
232
+ that matches this repo's setup and wait for the operator's yes before
233
+ running it. If the check reports `status: "unknown"` (offline, cache
234
+ miss, feed unreachable) say nothing to the operator; freshness is a
235
+ convenience, not a gate. Never run the upgrade without the operator's
236
+ explicit go.
237
+
225
238
  ### Session start
226
239
 
227
240
  Run `rcf define validate`. A broken tree is fixed or reported before anything
@@ -1 +1 @@
1
- 70e0048d6160f15191dfbcf43588b0ba4cd24349b7ee8098671f121110677348
1
+ a36dfe0d47c57bafa2ace121e7390fac95c7fff70ee362e864adf75c07be190a
@@ -209,6 +209,19 @@ ask for. A failure the operator has to point out is a failure you did
209
209
  not check for. The depth for each stage's self-check lives in the
210
210
  build-cycle playbook.
211
211
 
212
+ ### RULE 14: Check freshness at session start; offer, never install.
213
+
214
+ At the start of a new session on this project, run `rcf version --check`
215
+ (one call, silent on network trouble) and note the result. If a newer
216
+ release is available, tell the operator in one line what changed and
217
+ OFFER the upgrade. The exact command to run depends on how rcf-lite is
218
+ installed here (global npm, per-repo dep, npx pin); propose the command
219
+ that matches this repo's setup and wait for the operator's yes before
220
+ running it. If the check reports `status: "unknown"` (offline, cache
221
+ miss, feed unreachable) say nothing to the operator; freshness is a
222
+ convenience, not a gate. Never run the upgrade without the operator's
223
+ explicit go.
224
+
212
225
  ### Session start
213
226
 
214
227
  Run `rcf define validate`. A broken tree is fixed or reported before anything
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rcf-lite",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "type": "module",
5
5
  "description": "One-install tooling for the Requirements Confidence Framework (RCF): the unified `rcf` CLI grouped into the five RCF tool groups (discover, define, build, verify, audit) plus a small core set (init, doctor, guidance, mcp), an MCP server, the live tree viewer and the fresh-context adversarial ship-gate verifier. Consumes @stravica-ai/rcf-schemas.",
6
6
  "license": "Apache-2.0",
@@ -27,6 +27,7 @@
27
27
  "src",
28
28
  "guidance",
29
29
  "rcf",
30
+ "releases",
30
31
  "fixtures",
31
32
  "blueprints",
32
33
  "scripts/preinstall-node-check.mjs",
@@ -43,10 +44,11 @@
43
44
  "vendor": "node scripts/vendor-mermaid.mjs",
44
45
  "build:managed": "node scripts/gen-managed-artefacts.mjs",
45
46
  "canary:register": "node scripts/canary-register.mjs",
47
+ "validate:releases": "node scripts/validate-releases.mjs",
46
48
  "stage:blueprints": "node scripts/stage-blueprint-shelf.mjs",
47
49
  "preinstall": "node scripts/preinstall-node-check.mjs",
48
50
  "prepack": "node scripts/stage-blueprint-shelf.mjs",
49
- "prepublishOnly": "node scripts/gen-managed-artefacts.mjs && node scripts/stage-blueprint-shelf.mjs",
51
+ "prepublishOnly": "node scripts/gen-managed-artefacts.mjs && node scripts/stage-blueprint-shelf.mjs && node scripts/validate-releases.mjs",
50
52
  "rcf": "node bin/rcf.js"
51
53
  },
52
54
  "repository": {
@@ -76,6 +78,7 @@
76
78
  },
77
79
  "devDependencies": {
78
80
  "@modelcontextprotocol/sdk": "^1.29.0",
81
+ "js-yaml": "^4.1.0",
79
82
  "mermaid": "11.6.0"
80
83
  }
81
84
  }
@@ -5,7 +5,7 @@
5
5
  "version": "0.1.0",
6
6
  "status": "accepted",
7
7
  "title": "Local filesystem is the single source of truth",
8
- "context": "RCF Build Lite must guarantee that a project's RCF documents live in the source repository, beside the code. v1 tooling operated over the GitHub API rather than the local repo, which broke the in-repository differentiator and tied the tool to a network surface.",
8
+ "context": "RCF Lite must guarantee that a project's RCF documents live in the source repository, beside the code. v1 tooling operated over the GitHub API rather than the local repo, which broke the in-repository differentiator and tied the tool to a network surface.",
9
9
  "decision": "Every read and write targets the local rcf tree directly. No external service, cache or database mirrors the documents. The CLI, the MCP server and the build loop all reach the filesystem only through the document store.",
10
10
  "consequences": "The tool works offline and stays harness-agnostic. There is no sync problem and no second source to drift. The cost is that any multi-user or hosted scenario is out of scope by construction, which matches the product boundaries.",
11
11
  "alternativesConsidered": [
@@ -12,7 +12,7 @@
12
12
  },
13
13
  {
14
14
  "name": "Build an independent-gate subsystem now",
15
- "summary": "Solve the independent-verification problem inside rcf-build-lite immediately.",
15
+ "summary": "Solve the independent-verification problem inside rcf-lite immediately.",
16
16
  "reasonNotChosen": "That is a separate product being scoped at HQ; duplicating it here pre-empts a repo reshape and over-builds the lite tier. The Tier-1 scope is guidance, not a gate."
17
17
  }
18
18
  ],
@@ -3,7 +3,7 @@
3
3
  "prdId": "PRD-001",
4
4
  "version": "0.1.0",
5
5
  "status": "draft",
6
- "title": "RCF Build Lite initial delivery",
6
+ "title": "RCF Lite initial delivery",
7
7
  "buildPhilosophy": "Dependency-first. Build the document store, then the read-only view surface, then mutating CRUD, then the query layer, then the build loop, then the MCP surface over everything below. Each layer is usable on its own before the next is added.",
8
8
  "generationStrategy": "dependencyFirst",
9
9
  "createdAt": "2026-06-25T00:00:00Z",
package/rcf/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "2.0.0",
3
- "projectName": "RCF Build Lite",
4
- "description": "RCF tree for the RCF Build Lite product. Manifest declares the three root documents; every other document is discovered by walking from the roots.",
3
+ "projectName": "RCF Lite",
4
+ "description": "RCF tree for the RCF Lite product. Manifest declares the three root documents; every other document is discovered by walking from the roots.",
5
5
  "prd": {
6
6
  "id": "PRD-001",
7
7
  "path": "prd.json"
package/rcf/prd.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "prdId": "PRD-001",
3
- "productName": "RCF Build Lite",
3
+ "productName": "RCF Lite",
4
4
  "version": "0.1.0",
5
5
  "status": "draft",
6
- "executiveSummary": "RCF Build Lite is the tooling product of the RCF suite. It runs the full Requirements Confidence Framework over a project whose RCF documents live in the source repository, alongside the code. It gives a non-engineering product owner deterministic create, read, update and delete operations on every RCF document type, a visual review surface, traceability and query, a build loop that turns build specifications into implementation prompts, and a local MCP surface that exposes all of this to AI tooling.",
6
+ "executiveSummary": "RCF Lite is the tooling product of the RCF suite. It runs the full Requirements Confidence Framework over a project whose RCF documents live in the source repository, alongside the code. It gives a non-engineering product owner deterministic create, read, update and delete operations on every RCF document type, a visual review surface, traceability and query, a build loop that turns build specifications into implementation prompts, and a local MCP surface that exposes all of this to AI tooling.",
7
7
  "problemStatement": "Power vibe-coders build real applications without engineering teams. They cannot read code, so they cannot judge whether what an AI tool produces is trustworthy. The full RCF chain makes output trustworthy without reading code, but authoring that chain by hand is the very effort these users lack the time and discipline for. There is no tool that runs the full RCF method over in-repository documents and surfaces it through structured, deterministic operations.",
8
8
  "targetUsers": [
9
9
  "Power vibe-coders: product owners, founders and business voices building applications without engineering teams",
@@ -0,0 +1,116 @@
1
+ # rcf-lite release feed source of truth.
2
+ #
3
+ # This file is the single source that the docs site (stravica.ai) reads
4
+ # at build time to publish the machine-readable feed at
5
+ # https://stravica.ai/docs/rcf/releases.json
6
+ # and that the rcf-lite package's prepublishOnly step validates against
7
+ # `package.json:version` so a release cannot ship without its own entry.
8
+ #
9
+ # Contract lives in
10
+ # projects/rcf-lite-wsd/specs/update-awareness-spec-2026-08-28.md
11
+ # section 1 (ratified 2026-08-30).
12
+ #
13
+ # Editing rules at release time:
14
+ # 1. Add the new release as the top entry under `releases:` (newest
15
+ # first).
16
+ # 2. Update `latest:` to match the new top entry's `version`.
17
+ # 3. Keep `headlines[]` operator-facing: one to three sentences, plain
18
+ # language, sentence case, terminal period, no method vocabulary
19
+ # shortcuts.
20
+ # 4. Set `breaking: true` only when the release is a semver-breaking
21
+ # change per the pre-1.0 breaking-is-minor convention (see
22
+ # CHANGELOG.md preamble).
23
+ # 5. `minAgentAction` names the extra work the agent needs to do beyond
24
+ # running the install command. `null` means no extra action. The
25
+ # enumerated values are listed in the spec section 1.5:
26
+ # - rewrite-shell-invocations
27
+ # - rerun-init
28
+ # - regenerate-chain
29
+ # - schema-migration
30
+ # 6. `notesUrl` is optional. It currently points at the top of the
31
+ # human changelog; per-release deep links are a follow-up once the
32
+ # docs pipeline gives /docs/ headings stable anchor ids.
33
+ # 7. Do not delete or rewrite historical entries; the feed is append-only.
34
+ #
35
+ # Every published release under the `rcf-lite` npm name is listed here.
36
+ # The pre-rename history (packages published under
37
+ # `@stravica-ai/rcf-build-lite`, `@stravica-ai/rcf-lite-core`, and
38
+ # `@stravica-ai/rcf-verify-lite`) lives in CHANGELOG.md but is not part of
39
+ # this feed; the feed is scoped to what an operator can install today as
40
+ # `npm install rcf-lite`.
41
+
42
+ feedVersion: 1
43
+ latest: "0.14.0"
44
+ releases:
45
+ - version: "0.14.0"
46
+ date: "2026-08-31"
47
+ breaking: true
48
+ headlines:
49
+ - "The ci-pipeline blueprint is renamed to delivery-ci-workflows and gains a broader set of CI workflows and optional checks."
50
+ - "A new rcf version command reports the installed version, with --check comparing against the release feed."
51
+ - "Rerun rcf init to refresh the agent guidance block with the new session-start freshness check."
52
+ minAgentAction: "rerun-init"
53
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
54
+
55
+ - version: "0.13.0"
56
+ date: "2026-08-31"
57
+ breaking: false
58
+ headlines:
59
+ - "The 14 first-party blueprints now ship inside the installed package, so any doc pointing at a blueprint slug works on a fresh install."
60
+ - "rcf define blueprint add resolves bare slugs and @stock slugs against the packaged shelf, matching how the docs write the commands."
61
+ - "Installing on Node earlier than 24 now refuses outright instead of silently resolving an old placeholder release."
62
+ minAgentAction: null
63
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
64
+
65
+ - version: "0.12.0"
66
+ date: "2026-08-28"
67
+ breaking: true
68
+ headlines:
69
+ - "Tests that claim to pass or fail must now point at a real test file, enforced by the shared schema."
70
+ - "Tests marked pending or skipped no longer need a pointer, matching how in-progress coverage really looks."
71
+ minAgentAction: "schema-migration"
72
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
73
+
74
+ - version: "0.11.0"
75
+ date: "2026-08-27"
76
+ breaking: false
77
+ headlines:
78
+ - "The shipped agent guidance gained three new rules for how the agent drives the method loop."
79
+ - "Re-run rcf init to refresh the managed block in your project's agent instructions file."
80
+ minAgentAction: "rerun-init"
81
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
82
+
83
+ - version: "0.10.0"
84
+ date: "2026-08-26"
85
+ breaking: true
86
+ headlines:
87
+ - "The command-line interface is reorganised: every command now sits under one of five groups."
88
+ - "Old flat command forms fail with a message that names the new form."
89
+ minAgentAction: "rewrite-shell-invocations"
90
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
91
+
92
+ - version: "0.9.0"
93
+ date: "2026-08-25"
94
+ breaking: false
95
+ headlines:
96
+ - "Blueprints landed: compose pre-built implementation patterns onto your project instead of inventing them from a blank page."
97
+ - "Six starter blueprints ship in the same release, covering web app, REST API, auth, persistence, CI pipeline and observability."
98
+ minAgentAction: null
99
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
100
+
101
+ - version: "0.8.0"
102
+ date: "2026-08-12"
103
+ breaking: false
104
+ headlines:
105
+ - "A shared standards ruleset ships bundled with the package and now feeds refuse-first admissibility checks on the chain."
106
+ - "The verifier catches a subtle dishonesty: a test that is narrower in scope than the check it claims to prove."
107
+ minAgentAction: null
108
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
109
+
110
+ - version: "0.7.1"
111
+ date: "2026-08-12"
112
+ breaking: false
113
+ headlines:
114
+ - "The first release under the unified rcf-lite name, bringing the previously separate tools together as one package on the public npm registry."
115
+ minAgentAction: null
116
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
@@ -15,6 +15,7 @@ import { readFile } from 'node:fs/promises';
15
15
  import { rcfError } from '../core/errors/index.js';
16
16
  import { subdirFor } from '#core/store';
17
17
  import { detectCrossBlueprintClaims, detectGlobalAdrConflicts } from './conflicts.js';
18
+ import { detectContributionsOutOfBand } from './library-registry.js';
18
19
  import { loadBlueprint } from './loader.js';
19
20
  import { updateManifest } from './manifest-writer.js';
20
21
  import { stampId } from './namespace.js';
@@ -40,6 +41,19 @@ import { nextResolutionId } from './resolutions.js';
40
41
  * string the operator can copy back. Defaults to `source` when omitted (so
41
42
  * existing callers keep today's byte-for-byte behaviour).
42
43
  * @param {string} [args.namespaceOverride] - non-default namespace slug
44
+ * @param {string} [args.effectiveSlug] - override for the blueprint's own slug
45
+ * when applied through an external-library qualified reference (spec §5.3):
46
+ * `<libraryPrefix>-<blueprintSlug>`. When set, this becomes BOTH the
47
+ * stamping namespace (so contributions inherit the library prefix) AND
48
+ * the value written into `manifest.blueprints[].slug` on the applied
49
+ * record, so `rcf define blueprint remove wsd-auth-oauth2` reads back
50
+ * cleanly. `namespaceOverride` still wins over `effectiveSlug` if both
51
+ * are set (operator explicitly chose a different namespace).
52
+ * @param {{ ac: { start: number, end: number }, suffixBlocks?: Array<{ kind: string, start: number, end: number }> }} [args.libraryBands]
53
+ * Declared bands from the resolved library. When set, every stamped
54
+ * contribution is band-gated before write; a contribution whose numeric
55
+ * portion falls outside the library's bands refuses at apply-time (spec
56
+ * §8.3, open question 9.9 ratified as "add both").
43
57
  * @param {Array<{ topic: string, resolvedByAdrId: string }>} [args.resolveDeclarations]
44
58
  * Operator-supplied conflict resolutions declared on the add
45
59
  * itself. One entry per resolved topic. For each, the resolution
@@ -58,25 +72,38 @@ import { nextResolutionId } from './resolutions.js';
58
72
  * prove the rollback runs. Never used in production.
59
73
  * @returns {Promise<ApplyResult | import('../core/errors/index.js').RcfError>}
60
74
  */
61
- export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
75
+ export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, effectiveSlug, libraryBands, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
62
76
  const hintSource = typeof displaySource === 'string' && displaySource.length > 0 ? displaySource : source;
63
77
  const blueprint = await loadBlueprint(source);
64
78
  if (blueprint.kind) return blueprint; // RcfError
65
- const namespace = namespaceOverride ?? blueprint.slug;
79
+ // Effective slug rewires the blueprint's identity under a library
80
+ // prefix (spec §5.3). It becomes both the stamping namespace and the
81
+ // slug written into `manifest.blueprints[].slug`. `namespaceOverride`
82
+ // still wins over `effectiveSlug` (operator's explicit --namespace on
83
+ // the CLI). When neither is set the blueprint's own slug applies.
84
+ const appliedSlug = typeof effectiveSlug === 'string' && effectiveSlug.length > 0
85
+ ? effectiveSlug
86
+ : blueprint.slug;
87
+ const namespace = namespaceOverride ?? appliedSlug;
66
88
 
67
89
  const applied = tree.manifest?.blueprints ?? [];
68
- const existing = applied.find((b) => b.slug === blueprint.slug);
90
+ const existing = applied.find((b) => b.slug === appliedSlug);
69
91
  const stamped = stampContributions(blueprint.contributions, namespace);
70
92
  if (stamped.error) {
71
93
  return rcfError({ kind: 'validation', message: stamped.error });
72
94
  }
95
+ // Apply-time band gate for external-library blueprints.
96
+ if (libraryBands) {
97
+ const bandErr = detectContributionsOutOfBand(stamped.contributions, libraryBands);
98
+ if (bandErr) return bandErr;
99
+ }
73
100
 
74
101
  // Pre-detection: fold operator-supplied --resolve declarations into a
75
102
  // WORKING COPY of the manifest so the detector honours them on this
76
103
  // run. The final manifest write later composes the same resolution
77
104
  // records into the persisted manifest, so the in-memory copy and the
78
105
  // on-disk write agree.
79
- const incomingForConflicts = { slug: blueprint.slug, contributions: stamped.contributions };
106
+ const incomingForConflicts = { slug: appliedSlug, contributions: stamped.contributions };
80
107
  const declResult = composeDeclaredResolutions({
81
108
  manifest: tree.manifest,
82
109
  applied,
@@ -109,7 +136,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
109
136
  ...detectCrossBlueprintClaims(applied, incomingForConflicts),
110
137
  ];
111
138
  if (conflicts.length > 0) {
112
- return { applied: false, slug: blueprint.slug, version: blueprint.version, contributions: [], conflicts };
139
+ return { applied: false, slug: appliedSlug, version: blueprint.version, contributions: [], conflicts };
113
140
  }
114
141
 
115
142
  // Ownership set for the overwrite guard below. On a re-apply, the
@@ -122,7 +149,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
122
149
  if (existing && existing.version === blueprint.version) {
123
150
  return {
124
151
  applied: false, alreadyApplied: true,
125
- slug: blueprint.slug, version: blueprint.version,
152
+ slug: appliedSlug, version: blueprint.version,
126
153
  contributions: stamped.contributions,
127
154
  ...(duplicateResolveTopics.length > 0 ? { warnings: [{ kind: 'duplicateResolveTopic', topics: duplicateResolveTopics }] } : {}),
128
155
  };
@@ -151,7 +178,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
151
178
  writtenContributions.push(preserveScope({ id: c.id, kind: c.kind, path: relDest }, c));
152
179
  }
153
180
  } else {
154
- const tmpSuffix = `.rcf-tmp-${blueprint.slug}-${now.getTime()}`;
181
+ const tmpSuffix = `.rcf-tmp-${appliedSlug}-${now.getTime()}`;
155
182
  const stagedWrites = []; // { tmpAbs, absDest, relDest, id, kind, c }
156
183
  const rollback = async (err) => {
157
184
  for (const w of stagedWrites) {
@@ -184,7 +211,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
184
211
  for (const w of stagedWrites) await unlink(w.tmpAbs).catch(() => {});
185
212
  return rcfError({
186
213
  kind: 'duplicateId',
187
- message: `blueprint apply: contribution ${c.id} would overwrite an existing file at ${relDest} that is not recorded as owned by blueprint '${blueprint.slug}'.`,
214
+ message: `blueprint apply: contribution ${c.id} would overwrite an existing file at ${relDest} that is not recorded as owned by blueprint '${appliedSlug}'.`,
188
215
  filePath: relDest,
189
216
  });
190
217
  }
@@ -225,12 +252,23 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
225
252
  }
226
253
  }
227
254
 
228
- // Update manifest.blueprints[].
255
+ // Update manifest.blueprints[]. The applied record's `source` field
256
+ // carries the qualified typed ref for library-resolved blueprints
257
+ // (`wsd:auth-oauth2`) so `rcf define blueprint upgrade` reads back
258
+ // cleanly (spec §5.3); local-path applies carry the absolute path as
259
+ // today. The optional `libraryPrefix` field named in spec §5.3 is a
260
+ // schema-additive change on `appliedBlueprintRecord` (the record's
261
+ // schema is `additionalProperties: false`); it is deferred and
262
+ // tracked in the PR description as a follow-up so the shape lands as
263
+ // a coordinated schemas + rcf-lite bump.
264
+ const recordSource = typeof displaySource === 'string' && displaySource.length > 0 && displaySource !== source
265
+ ? displaySource
266
+ : source;
229
267
  const nextEntry = {
230
- slug: blueprint.slug,
268
+ slug: appliedSlug,
231
269
  version: blueprint.version,
232
270
  appliedAt: now.toISOString(),
233
- source,
271
+ source: recordSource,
234
272
  ...(namespaceOverride ? { namespace: namespaceOverride } : {}),
235
273
  ...(writtenContributions.length > 0 ? { contributions: writtenContributions } : {}),
236
274
  };
@@ -239,7 +277,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
239
277
  manifest: tree.manifest,
240
278
  mutate: (next) => {
241
279
  const list = Array.isArray(next.blueprints) ? next.blueprints : [];
242
- const filtered = list.filter((b) => b.slug !== blueprint.slug);
280
+ const filtered = list.filter((b) => b.slug !== appliedSlug);
243
281
  filtered.push(nextEntry);
244
282
  next.blueprints = filtered;
245
283
  // Fold any --resolve declarations recorded on this add into the
@@ -257,7 +295,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
257
295
 
258
296
  return {
259
297
  applied: true,
260
- slug: blueprint.slug,
298
+ slug: appliedSlug,
261
299
  version: blueprint.version,
262
300
  contributions: writtenContributions,
263
301
  ...(duplicateResolveTopics.length > 0 ? { warnings: [{ kind: 'duplicateResolveTopic', topics: duplicateResolveTopics }] } : {}),
@@ -11,3 +11,15 @@ export { nextResolutionId, matchingResolution } from './resolutions.js';
11
11
  export { supersedeBlueprintTopic } from './supersede.js';
12
12
  export { diffBlueprintTopic, renderDiff } from './diff.js';
13
13
  export { resolveBlueprintSource, knownShelfSlugs, packagedShelfPath } from './shelf-resolver.js';
14
+ export { loadLibrary } from './library-loader.js';
15
+ export {
16
+ REGISTRY_PATH,
17
+ REGISTRY_VERSION,
18
+ readLibraryRegistry,
19
+ writeLibraryRegistry,
20
+ findLibrary,
21
+ loadCoreBandReservations,
22
+ detectBandOverlap,
23
+ detectContributionsOutOfBand,
24
+ detectPrefixCollision,
25
+ } from './library-registry.js';