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
@@ -1,61 +0,0 @@
1
- # Illustrative GitHub Actions workflow for the ci-pipeline blueprint.
2
- # Copy this file into the host project as `.github/workflows/rcf-ci.yml`
3
- # and adjust the `node-version`, package-manager setup, and entry-point
4
- # path to match the project's realised gate runner (TAC-701).
5
- #
6
- # The workflow runs one CI-provider-neutral Node entry point that
7
- # invokes `rcf define validate` and `rcf audit coverage --strict`,
8
- # writes per-gate and aggregate JSON reports under `.rcf/reports/ci/`,
9
- # and uploads the report directory as a workflow artefact for
10
- # downstream readers.
11
- #
12
- # See `guide/ci-pipeline.md` (four-point mapping) for translating
13
- # this workflow to GitLab CI, CircleCI, Buildkite, or Jenkins.
14
-
15
- name: rcf-ci
16
-
17
- on:
18
- push:
19
- branches: [main]
20
- pull_request:
21
- branches: [main]
22
-
23
- jobs:
24
- rcf-gates:
25
- runs-on: ubuntu-latest
26
- permissions:
27
- contents: read
28
- steps:
29
- - name: checkout
30
- uses: actions/checkout@v4
31
-
32
- - name: setup pnpm
33
- uses: pnpm/action-setup@v4
34
- with:
35
- version: 9
36
-
37
- - name: setup node
38
- uses: actions/setup-node@v4
39
- with:
40
- node-version: 24
41
- cache: pnpm
42
-
43
- - name: install dependencies
44
- run: pnpm install --frozen-lockfile
45
-
46
- # Single-line invocation of the project's realised gate runner.
47
- # The runner spawns `rcf define validate` then `rcf audit coverage --strict`,
48
- # writes `.rcf/reports/ci/<gate>.json` per gate, and writes
49
- # `.rcf/reports/ci/pipeline.json` as the aggregate. Its exit code
50
- # is the pipeline's aggregate exit code.
51
- - name: run rcf ci gates
52
- run: node scripts/rcf-ci.js
53
-
54
- - name: upload rcf ci reports
55
- if: always()
56
- uses: actions/upload-artifact@v4
57
- with:
58
- name: rcf-ci-reports
59
- path: .rcf/reports/ci/
60
- if-no-files-found: warn
61
- retention-days: 30
@@ -1,50 +0,0 @@
1
- # Wiring the gate runner on alternate CI providers
2
-
3
- The blueprint ships one illustrative provider example (GitHub Actions, `github-actions.yml`). Every mainstream provider hosts the same pipeline by translating four points and keeping the Node entry-point invocation unchanged. These notes are read alongside `guide/ci-pipeline.md`, not instead of it.
4
-
5
- ## The four mapping points
6
-
7
- 1. Job trigger. Fire the job on a push to the default branch AND on every pull request opened, synchronised, or reopened against the default branch.
8
- 2. Node setup. Install Node 24 or later on the runner.
9
- 3. Package-manager setup and install. Install the project's dependencies with the frozen-lockfile discipline of whichever manager the project uses.
10
- 4. Node entry-point invocation and artefact upload. Run `node <path>` (or a package-manager script that resolves to the same); upload the configured report directory as a run artefact for downstream readers.
11
-
12
- The blueprint does not ship provider-specific configuration files for the providers below at v1.0.0. A project hand-authors the first three points in the provider's own runner language and keeps the fourth unchanged.
13
-
14
- ## GitLab CI (`.gitlab-ci.yml`)
15
-
16
- - Trigger: `rules:` with `if: $CI_COMMIT_BRANCH == "main"` for the push half, `if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"` for the merge-request half.
17
- - Node setup: use a `node:24` image or install through the runner's setup hook.
18
- - Install: `pnpm install --frozen-lockfile` (or equivalent).
19
- - Invoke: `node scripts/rcf-ci.js`.
20
- - Artefact upload: `artifacts: { when: always, paths: [.rcf/reports/ci/] }`.
21
-
22
- ## CircleCI (`.circleci/config.yml`)
23
-
24
- - Trigger: `workflows:` with `filters: { branches: { only: [main] } }` for the push half; pull-request contexts are handled through CircleCI's GitHub integration or via the `pull_request_number` pipeline parameter.
25
- - Node setup: `cimg/node:24.19` or the `node/install` orb command.
26
- - Install: `pnpm install --frozen-lockfile`.
27
- - Invoke: `node scripts/rcf-ci.js`.
28
- - Artefact upload: `store_artifacts: { path: .rcf/reports/ci }`.
29
-
30
- ## Buildkite (`.buildkite/pipeline.yml`)
31
-
32
- - Trigger: pipeline-level branch conditions or per-step `branches: main` with additional pull-request-only steps triggered through Buildkite's GitHub integration.
33
- - Node setup: install Node 24 in the queue's setup hook or use a Docker plugin (`docker#v5.0.0`).
34
- - Install: `pnpm install --frozen-lockfile`.
35
- - Invoke: `node scripts/rcf-ci.js`.
36
- - Artefact upload: `artifact_paths: [".rcf/reports/ci/**"]`.
37
-
38
- ## Jenkins (declarative pipeline)
39
-
40
- - Trigger: `triggers { githubPush() }` plus a multibranch pipeline configured to build pull requests against the default branch.
41
- - Node setup: install Node 24 via `tools { nodejs '24' }` or provision the agent with Node preinstalled.
42
- - Install: `sh 'pnpm install --frozen-lockfile'`.
43
- - Invoke: `sh 'node scripts/rcf-ci.js'`.
44
- - Artefact upload: `archiveArtifacts artifacts: '.rcf/reports/ci/**', allowEmptyArchive: true`.
45
-
46
- ## Cross-provider notes
47
-
48
- - The Node entry-point path is the same on every provider. A project that changes providers rewrites its trigger, setup, install, and artefact-upload steps; the entry-point step is unchanged.
49
- - The report directory (default `.rcf/reports/ci/`) is the same on every provider. Downstream readers do not need per-provider knowledge to pick up the aggregate report.
50
- - The tool-version pin (which `rcf` version to run) is the project's decision. The runner records the installed version on every per-gate report's `toolVersion` field; a mismatch across two runs is visible in the reports without re-running the gate.
@@ -1,46 +0,0 @@
1
- {
2
- "slug": "ci-pipeline",
3
- "version": "1.0.0",
4
- "category": "delivery",
5
- "contributions": [
6
- { "id": "ci-pipeline-REQ-001", "kind": "req", "path": "requirements/ci-pipeline-req-001.json" },
7
- { "id": "ci-pipeline-REQ-002", "kind": "req", "path": "requirements/ci-pipeline-req-002.json" },
8
- { "id": "ci-pipeline-REQ-003", "kind": "req", "path": "requirements/ci-pipeline-req-003.json" },
9
- { "id": "ci-pipeline-REQ-004", "kind": "req", "path": "requirements/ci-pipeline-req-004.json" },
10
- { "id": "ci-pipeline-REQ-005", "kind": "req", "path": "requirements/ci-pipeline-req-005.json" },
11
- { "id": "ci-pipeline-REQ-006", "kind": "req", "path": "requirements/ci-pipeline-req-006.json" },
12
- { "id": "ci-pipeline-REQ-007", "kind": "req", "path": "requirements/ci-pipeline-req-007.json" },
13
- { "id": "ci-pipeline-REQ-008", "kind": "req", "path": "requirements/ci-pipeline-req-008.json" },
14
- { "id": "ci-pipeline-REQ-009", "kind": "req", "path": "requirements/ci-pipeline-req-009.json" },
15
- { "id": "ci-pipeline-REQ-010", "kind": "req", "path": "requirements/ci-pipeline-req-010.json" },
16
- { "id": "ci-pipeline-US-6101", "kind": "us", "path": "user-stories/ci-pipeline-us-6101.json" },
17
- { "id": "ci-pipeline-US-6102", "kind": "us", "path": "user-stories/ci-pipeline-us-6102.json" },
18
- { "id": "ci-pipeline-US-6103", "kind": "us", "path": "user-stories/ci-pipeline-us-6103.json" },
19
- { "id": "ci-pipeline-US-6104", "kind": "us", "path": "user-stories/ci-pipeline-us-6104.json" },
20
- { "id": "ci-pipeline-US-6105", "kind": "us", "path": "user-stories/ci-pipeline-us-6105.json" },
21
- { "id": "ci-pipeline-US-6106", "kind": "us", "path": "user-stories/ci-pipeline-us-6106.json" },
22
- { "id": "ci-pipeline-US-6107", "kind": "us", "path": "user-stories/ci-pipeline-us-6107.json" },
23
- { "id": "ci-pipeline-US-6108", "kind": "us", "path": "user-stories/ci-pipeline-us-6108.json" },
24
- { "id": "ci-pipeline-US-6109", "kind": "us", "path": "user-stories/ci-pipeline-us-6109.json" },
25
- { "id": "ci-pipeline-US-6110", "kind": "us", "path": "user-stories/ci-pipeline-us-6110.json" },
26
- { "id": "TAC-701-ci-pipeline-gate-runner", "kind": "tac", "path": "tacs/tac-701-ci-pipeline-gate-runner.json" },
27
- { "id": "TAC-702-ci-pipeline-gate-report", "kind": "tac", "path": "tacs/tac-702-ci-pipeline-gate-report.json" },
28
- { "id": "TAC-703-ci-pipeline-aggregate-report", "kind": "tac", "path": "tacs/tac-703-ci-pipeline-aggregate-report.json" },
29
- {
30
- "id": "ADR-701-ci-pipeline-ci-gates",
31
- "kind": "adr",
32
- "path": "adrs/adr-701-ci-pipeline-ci-gates.json",
33
- "scope": "global",
34
- "topic": "ciGates"
35
- },
36
- {
37
- "id": "ADR-702-ci-pipeline-strict-coverage-gate",
38
- "kind": "adr",
39
- "path": "adrs/adr-702-ci-pipeline-strict-coverage-gate.json",
40
- "scope": "global",
41
- "topic": "strictCoverageGate"
42
- },
43
- { "id": "ADR-703-ci-pipeline-node-only-runner", "kind": "adr", "path": "adrs/adr-703-ci-pipeline-node-only-runner.json" },
44
- { "id": "ADR-704-ci-pipeline-report-shape", "kind": "adr", "path": "adrs/adr-704-ci-pipeline-report-shape.json" }
45
- ]
46
- }
@@ -1,25 +0,0 @@
1
- {
2
- "adrId": "ADR-701-ci-pipeline-ci-gates",
3
- "prdId": "PRD-001",
4
- "tadId": "TAD-001",
5
- "version": "1.0.0",
6
- "status": "accepted",
7
- "title": "The project's CI runs a fixed ordered required-gate set (validate then coverage-strict at v1.0.0) whose completeness is the merge criterion",
8
- "context": "Continuous integration surfaces are a matrix of trigger events, runner definitions, and gates. The interesting decision area is not the runner or the trigger (a small dial with obvious answers) but the gate set: which gates run, in which order, and what does 'the pipeline passed' mean. A project that changes its gate set silently loses the property that the pipeline meant the same thing across two runs. The rcf-lite tier this blueprint targets is small greenfield: one tree, one default branch, one merge policy. Naming the gate set as a decision area (not a runtime knob) is what makes the pipeline a stable contract.",
9
- "decision": "The project's CI runs a fixed ordered required-gate set. At v1.0.0 the set is exactly two gates in order: `validate` (running `rcf define validate`) followed by `coverage-strict` (running `rcf audit coverage --strict`). The pipeline passes if and only if every required gate's outcome is `passed`; a `failed` or `missing` outcome on any required gate fails the pipeline. Adding a required gate is a project-level or blueprint-level ADR: a project that wants an extra required gate (a linter, a unit-test runner, an adherence pack) supersedes this ADR with a project-level ADR listing the extended set; a future blueprint that ships a new required gate (an observability probe pack) is a blueprint version bump on this ADR's topic. The set is deliberately kept small at v1.0.0: two gates that speak to the RCF chain and its coverage. Every additional gate is a decision the project owes an ADR for.",
10
- "consequences": "The pipeline's verdict is stable across runs of the same commit under the same rcf CLI version. Adding a gate is a visible decision, not a diff to a job file. A project that wants a hotter set of gates (adherence packs, browser-verify smokes, style linters) owes a project-level ADR that supersedes this one and lists the extended set; the aggregate report's `gates[]` array then reflects the extended set on every run. Composing blueprints that hold an opinion on the required-gate set conflict on the `ciGates` topic: an observability-essentials blueprint that ships health-probe gates as required conflicts here by design and expects a project-level ADR to resolve the pairing (or the operator adopts one of the two blueprints).",
11
- "alternativesConsidered": [
12
- {
13
- "name": "Ship the gate set as a runtime configuration knob rather than as an ADR",
14
- "summary": "The runner reads the gate set from a config file or environment variable, and any project reconfigures without a decision record.",
15
- "reasonNotChosen": "A gate set that can silently change is one whose meaning drifts. The value of the aggregate report as a stable contract collapses if two runs of the same commit can have different gate sets. Making the gate set an ADR forces the reasoning to be recorded and forces a composing blueprint to conflict explicitly."
16
- },
17
- {
18
- "name": "Ship a maximal required-gate set at v1.0.0 (validate + coverage-strict + adherence packs + browser-verify)",
19
- "summary": "The pipeline runs every gate the mechanism offers as required by default.",
20
- "reasonNotChosen": "The mechanism-reach principle for blueprints (authoring standard, section 7) says a blueprint should not compel a gate the project has no reasonable path to satisfy. Adherence packs and browser-verify probes belong in future blueprints that ship the surface they enforce; requiring them here would leave every fresh project failing its pipeline until it realises those surfaces. Two gates the mechanism already ships and every project can satisfy is the right v1.0.0 floor."
21
- }
22
- ],
23
- "createdAt": "2026-08-24T00:00:00Z",
24
- "updatedAt": "2026-08-24T00:00:00Z"
25
- }
@@ -1,18 +0,0 @@
1
- {
2
- "reqId": "ci-pipeline-REQ-001",
3
- "prdId": "PRD-001",
4
- "title": "Every push and pull request into the default branch runs the RCF gate suite as a required check",
5
- "description": "The project's continuous integration pipeline runs the RCF gate suite on every push to the default branch and on every pull request that targets the default branch. The suite's aggregate exit status is the merge criterion: the branch protection or equivalent policy refuses to merge a pull request whose most recent suite run did not exit zero. No manual override path bypasses the suite; a hotfix that skips the suite requires a documented ADR trail.",
6
- "category": "functional",
7
- "domain": "continuous-integration",
8
- "priority": "must",
9
- "rationale": "Gates that run sometimes are gates that fail sometimes. Wiring the suite as a required check on every push and pull request into the default branch turns the RCF chain from a habit into a build property, and removes the class of drift where a chain-authoring seat's fix passes locally but the tree ships already broken.",
10
- "tags": [
11
- "blueprint:ci-pipeline",
12
- "category:01-required-check"
13
- ],
14
- "version": "1.0.0",
15
- "status": "approved",
16
- "createdAt": "2026-08-24T00:00:00Z",
17
- "updatedAt": "2026-08-24T00:00:00Z"
18
- }
@@ -1,18 +0,0 @@
1
- {
2
- "reqId": "ci-pipeline-REQ-009",
3
- "prdId": "PRD-001",
4
- "title": "The blueprint documents one illustrative GitHub Actions workflow; alternate providers wire the same entry point per their own runner language",
5
- "description": "The blueprint's package resources include one illustrative GitHub Actions workflow file (`assets/ci-provider-examples/github-actions.yml`) that names the required repository events (push to default branch, pull_request into default branch), sets up Node and the package manager, installs dependencies, invokes the Node gate entry point, and uploads the report directory as a workflow artefact. The blueprint's guide names GitLab CI, CircleCI, Buildkite, and Jenkins as equally supported providers, calls out the mapping (job trigger, Node setup, single-line entry-point invocation, artefact upload), and states that the blueprint does not ship provider-specific configuration for those runners.",
6
- "category": "functional",
7
- "domain": "continuous-integration",
8
- "priority": "must",
9
- "rationale": "One worked example spelled in one runner language is more useful to the reader than a matrix of half-specified examples. GitHub Actions is the illustrative pick because it is the most widely deployed among rcf-lite candidate projects, not because it is privileged. The mapping to other providers is small enough that a paragraph of guide prose plus the one worked example is the right cost.",
10
- "tags": [
11
- "blueprint:ci-pipeline",
12
- "category:09-provider-example"
13
- ],
14
- "version": "1.0.0",
15
- "status": "approved",
16
- "createdAt": "2026-08-24T00:00:00Z",
17
- "updatedAt": "2026-08-24T00:00:00Z"
18
- }
@@ -1,37 +0,0 @@
1
- {
2
- "usId": "ci-pipeline-US-6101",
3
- "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-001",
5
- "version": "1.0.0",
6
- "status": "approved",
7
- "title": "Every push and pull request into the default branch runs the RCF gate suite as a required check",
8
- "asA": "operator merging changes to the default branch of an rcf-lite project",
9
- "iWant": "the RCF gate suite to run automatically on every push to the default branch and every pull request into it, and its outcome to be the merge criterion",
10
- "soThat": "no change lands on the default branch without the chain and its coverage having been verified against the tree at the head commit",
11
- "acceptanceCriteria": [
12
- {
13
- "id": "AC-6101-1",
14
- "description": "The CI provider's job for the pipeline is triggered by a push to the default branch and by every pull request opened, synchronised, or reopened against the default branch. The trigger configuration is committed under source control, not set through a provider UI.",
15
- "given": "the project's CI configuration and repository state at the head commit",
16
- "when": "a push lands on the default branch or a pull request is opened, synchronised, or reopened against the default branch",
17
- "then": "the aggregate pipeline report at the configured stable path (default `.rcf/reports/ci/pipeline.json`) is written by the resulting CI job, and its `trigger` field records the event kind",
18
- "testable": true,
19
- "scope": "runtime"
20
- },
21
- {
22
- "id": "AC-6101-2",
23
- "description": "The pull-request merge policy blocks a merge whose most recent pipeline run did not exit zero. The block is enforced by the repository's branch protection or equivalent policy configured for the default branch.",
24
- "given": "a pull request whose most recent pipeline run's aggregate report records `verdict: failed`",
25
- "when": "the operator or an automated merge tool attempts to merge the pull request through the standard merge path",
26
- "then": "the merge is refused by the platform's branch-protection surface, and the refusal reason references the failed required check that corresponds to the pipeline job",
27
- "testable": true,
28
- "scope": "runtime"
29
- }
30
- ],
31
- "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner",
33
- "TAC-703-ci-pipeline-aggregate-report"
34
- ],
35
- "createdAt": "2026-08-24T00:00:00Z",
36
- "updatedAt": "2026-08-24T00:00:00Z"
37
- }
@@ -1,36 +0,0 @@
1
- {
2
- "usId": "ci-pipeline-US-6109",
3
- "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-009",
5
- "version": "1.0.0",
6
- "status": "approved",
7
- "title": "The blueprint provides one illustrative GitHub Actions example; alternate providers wire the same entry point",
8
- "asA": "operator setting up CI on an rcf-lite project for the first time",
9
- "iWant": "one worked example that shows the entire trigger, setup, invoke, and artefact-upload shape",
10
- "soThat": "I have a copy-paste starting point regardless of which provider I use",
11
- "acceptanceCriteria": [
12
- {
13
- "id": "AC-6109-1",
14
- "description": "The applied blueprint's source path (recorded on `manifest.blueprints[ci-pipeline].source`) contains an illustrative GitHub Actions workflow at `assets/ci-provider-examples/github-actions.yml`. The workflow defines the required triggers (push to the default branch and pull_request into it), sets up Node and the package manager, installs dependencies, invokes the Node entry point as a single command line, and uploads the report directory as a workflow artefact.",
15
- "given": "an rcf-lite project that has applied this blueprint",
16
- "when": "the operator opens the blueprint's source path and reads `assets/ci-provider-examples/github-actions.yml`",
17
- "then": "the workflow file exists at that path, its `on:` block names `push` on the default branch and `pull_request`, its steps include a Node setup and a package-manager setup, one step invokes the gate entry point as a single `node <path>` line (or a package-manager script that resolves to the same), and a final step uploads the configured report directory as a workflow artefact",
18
- "testable": true,
19
- "scope": "runtime"
20
- },
21
- {
22
- "id": "AC-6109-2",
23
- "description": "The applied blueprint's guide names GitLab CI, CircleCI, Buildkite, and Jenkins as equally supported providers, states the mapping (job trigger, Node setup, single-line entry-point invocation, artefact upload), and states that the blueprint does not ship provider-specific configuration for those runners.",
24
- "given": "an rcf-lite project that has applied this blueprint",
25
- "when": "the operator opens `guide/ci-pipeline.md` from the blueprint's source path",
26
- "then": "the guide's `when to reach for it` or an adjacent section names GitLab CI, CircleCI, Buildkite, and Jenkins by name, describes the four mapping points, and states that no provider-specific configuration file for those runners is shipped by the blueprint at v1.0.0",
27
- "testable": true,
28
- "scope": "runtime"
29
- }
30
- ],
31
- "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner"
33
- ],
34
- "createdAt": "2026-08-24T00:00:00Z",
35
- "updatedAt": "2026-08-24T00:00:00Z"
36
- }
@@ -1,49 +0,0 @@
1
- # ci-pipeline blueprint coordination vocabulary
2
-
3
- This file is the ci-pipeline half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
4
-
5
- ## Global ADR topics this blueprint contributes (exact strings)
6
-
7
- | Topic string | ci-pipeline contribution | Origin | Composition note |
8
- |---|---|---|---|
9
- | `ciGates` | ADR-701-ci-pipeline-ci-gates | Minted here; pre-cleared as unclaimed against application-spa (`clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel`), application-api-rest (`errorEnvelope`, `authModel`, `apiVersioning`, `logging`), security-auth-magic-link (`authModel`), persistence-data-sqlite (`persistenceStore`, `migrationDiscipline`), and the hello-panel walkthrough exemplar (`operatorPanel`) | The fixed ordered required-gate set the pipeline runs. Any composing blueprint that ships its own required-gate opinion (an adherence-pack blueprint, a browser-verify blueprint, an observability probe blueprint) contributes its own scope:global ADR on this exact string and lets composition surface the pairing. Expected resolution: one project-level ADR that fixes the extended set and states the reasoning |
10
- | `strictCoverageGate` | ADR-702-ci-pipeline-strict-coverage-gate | Minted here; pre-cleared as unclaimed against application-spa, application-api-rest, security-auth-magic-link, persistence-data-sqlite, and hello-panel | The coverage-mode posture for the required gate (per-AC strict, not shallow-any). A composing blueprint that holds an opinion on coverage-mode policy (a shallow-any-for-early-projects blueprint, a coverage-with-grace-window blueprint) conflicts here by design. Expected resolution: one project-level ADR fixing the coverage posture |
11
-
12
- The ci-pipeline blueprint claims two global topics. Every other contribution is scope-local (ADR-703 on node-only runner shape and ADR-704 on report shape do not contribute global topics; a composing blueprint that holds an opinion on runner language or report shape authors its own project-level ADR if it wants to override).
13
-
14
- Note on the delineation from the application-api-rest blueprint's `logging` topic and the persistence-data-sqlite blueprint's store event log: `logging` (owned by application-api-rest ADR-304) governs the wire-log shape of the HTTP tier; persistence ADR-603 governs the store-event log shape. This blueprint's report shape (ADR-704) governs the pipeline-run report shape, which is a build-time artefact, not a runtime log. The three surfaces may share a shipper but do not share a topic. A blueprint that contributes a unified telemetry discipline across build-time and runtime surfaces would author its own scope:global ADR and expect to conflict with all three, not just here.
15
-
16
- Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, and persistence vocabularies, restated as law): lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer. Do not mint variants of existing strings (`ciChecks`, `pipelineGates`, `strictCoverage`, `coverageStrict` are all wrong when `ciGates` and `strictCoverageGate` already exist).
17
-
18
- ## Id number bands (registry bootstrap)
19
-
20
- AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is ratified policy (2026-08-19); this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
21
-
22
- This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
23
-
24
- | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
25
- |---|---|---|---|---|
26
- | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
27
- | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
28
- | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
29
- | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
30
- | hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
31
- | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
32
- | ci-pipeline | 6101-6899 | 7xx | shipped v1.0.0 | `ciGates`, `strictCoverageGate` |
33
- | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
34
- | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
35
- | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
36
- | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
37
- | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
38
- | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
39
- | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
40
- | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
41
-
42
- US 6101-6110 sit at the LOW end of the 6101-6899 band on purpose. A project-side story that mechanically derives from `ci-pipeline-REQ-011` into the number `6111` would collide against ci-pipeline-US-6111 in this package; the band leaves headroom at the HIGH end (US 6181-6899) so a project's own stories anchored to ci-pipeline REQs can allocate without conflict. The watchpost run4 lesson applies here too.
43
-
44
- ## Shared expectations for future composing blueprints
45
-
46
- - Reuse `ciGates` exactly as spelled here when your blueprint holds an opinion on the required-gate set the pipeline runs; contribute your own scope:global ADR on that string and let composition surface the pairing. An observability-essentials blueprint that ships health-probe or status-page gates as required will conflict here by design.
47
- - Reuse `strictCoverageGate` exactly as spelled here when your blueprint holds an opinion on the coverage-mode policy (strict per-AC versus shallow-any versus grace-window); a blueprint that ships a different posture conflicts here.
48
- - This blueprint's decision states the two required gates at v1.0.0 (`validate` and `coverage-strict` in that order) and the Node-only entry-point shape. Compose compatible adherence packs, browser-verify shipping, or observability probes, or expect the operator to supersede with one project-level ADR per topic.
49
- - Global topics that plausibly belong to a future blueprint and are NOT claimed by any shipped blueprint: `healthProbes`, `statusPageContract`, and `readinessSemantics` (an observability-essentials blueprint's natural globals), `adherencePack` (an adherence-shipping blueprint's natural global), and `mutationSampling` (a mutation-testing blueprint's natural global). Define any of these in your own package's topics doc, in this file's format, and consider whether the band-registry table above needs your slug added.
@@ -1,79 +0,0 @@
1
- # Ci-pipeline blueprint guide
2
-
3
- ## What it is
4
-
5
- A default CI floor for rcf-lite projects. The blueprint contributes the WHAT of a pipeline pattern: which gates run, in which order, what constitutes a passed run, what report files land on disk after every run, and how a failing run surfaces the failing gate in the operator's own log tail. The pipeline is a single Node entry-point script the CI job invokes with one line, and the gate set at v1.0.0 is exactly two required gates: `rcf define validate` followed by `rcf audit coverage --strict`.
6
-
7
- Concretely, the blueprint ships ten requirements, ten user stories (twenty acceptance criteria), three architecture components, and four architecture decision records. Two ADRs are `scope: global` on the topics `ciGates` (the fixed required-gate set) and `strictCoverageGate` (the per-AC strict coverage posture); the other two are scope-local (the Node-only runner shape and the JSON report shape) that a composing blueprint does not conflict with by default.
8
-
9
- ## What it is not
10
-
11
- Not a matrix of provider-specific configuration files. One illustrative GitHub Actions workflow ships under `assets/ci-provider-examples/github-actions.yml` as a copy-paste starting point. Alternate providers (GitLab CI, CircleCI, Buildkite, Jenkins) wire the same Node entry point per the four-point mapping named below; the blueprint does not carry a per-provider configuration file for those runners at v1.0.0.
12
-
13
- Not a source-code contribution. The blueprint contributes the gate-runner contract, the per-gate report writer contract, the aggregate report writer contract, and the discipline that binds them. The project realises the Node entry point against those contracts in its own build cycle; the blueprint does not ship the entry-point source.
14
-
15
- Not a linter, formatter, or unit-test gate. The v1.0.0 required-gate set is two gates that speak to the RCF chain and its coverage. A project that wants to add a linter or a unit-test gate authors a project-level ADR superseding ADR-701 and lists the extended gate set; the runner set is a decision area, not a runtime knob.
16
-
17
- Not a merge-queue integration. A project that wants a merge queue reads the aggregate report from the queue tool of its choice; the blueprint owns the aggregate report shape and stability, not the queue tool wiring.
18
-
19
- Not a coverage-trend dashboard. A project that wants one reads the aggregate reports over time and layers the dashboard on top; the blueprint owns the per-run reports, not the trend view.
20
-
21
- Not a branch-protection or merge-policy configuration. AC-6101-2 states the property the project owes on the platform's own configuration surface (branch protection, required checks, or the equivalent), but the blueprint does not ship that configuration file.
22
-
23
- ## When to reach for it
24
-
25
- Reach for the ci-pipeline blueprint when:
26
-
27
- - The project is an rcf-lite deployment with an RCF chain and a default branch merged into through pull requests.
28
- - The project's CI provider can run Node 24 or later on its runner (every mainstream provider can: GitHub Actions, GitLab CI, CircleCI, Buildkite, Jenkins).
29
- - The project wants the RCF chain and its per-AC strict coverage to be a merge-blocking property, not an author-time habit.
30
- - The project wants a stable per-run report artefact any downstream reader (dashboard, audit tool, merge queue) can pick up without scraping the CI provider's log surface.
31
- - The project wants the same command line to reproduce a CI failure on a developer's machine.
32
-
33
- ## When it does not fit
34
-
35
- Do not reach for the ci-pipeline blueprint when:
36
-
37
- - The project does not use RCF (no `rcf/` tree, no `rcf define validate` invocation makes sense). A project without an RCF chain does not need this blueprint; its pipeline is a different shape entirely.
38
- - The project runs on a CI provider whose runners cannot execute Node 24 or later (a legacy internal Jenkins pool locked to Node 12, an embedded hardware CI). Upgrade the runner or supersede ADR-703 with a project-level ADR selecting a different runner shape.
39
- - The project's default branch model is trunk-based with no pull requests. The `push to default branch` half of the trigger still applies, but the pull-request half of AC-6101-1 does not; a project on trunk-based development authors a project-level ADR narrowing the trigger set.
40
- - The project wants a coverage-mode grace window on newly introduced ACs. Supersede ADR-702 with a project-level ADR stating the grace window and the reasoning.
41
- - The project wants the pipeline to include gates that are not shipped by any rcf-lite blueprint (a linter, a mutation-testing gate, a stack-specific unit-test runner). Supersede ADR-701 with a project-level ADR listing the extended set; the runner then invokes the added gates alongside the two required ones.
42
-
43
- ## What a good outcome looks like
44
-
45
- A project applies the ci-pipeline blueprint on a fresh tree, realises the three TACs in project-authored FBSes, wires a CI job per the illustrative GitHub Actions workflow (or per the four-point mapping for its own provider), configures its branch protection to require the pipeline job as a merge-blocking check, and lands on a deployed pipeline where:
46
-
47
- - Every push to the default branch and every pull request into it fires the CI job automatically; the job's aggregate report at `.rcf/reports/ci/pipeline.json` records the trigger event, the timing, and the ordered gate outcomes.
48
- - A pull request whose head commit fails `rcf define validate` sees `validate` outcome as `failed` in the aggregate, sees the specific schema or reference issue in the per-gate report, and cannot be merged through the platform's standard merge path.
49
- - A pull request whose head commit passes `rcf define validate` but leaves an AC without a resolving TC sees `coverage-strict` outcome as `failed`, sees the specific `covered-unresolved` AC in the per-gate report, and cannot be merged.
50
- - A pull request whose head commit passes both gates sees `verdict: passed` in the aggregate, sees green on the platform's required-check surface, and can be merged.
51
- - A runner crash mid-suite (a killed Node child, a report write failure) produces an aggregate with `outcome: missing` for the affected gate and `verdict: failed`; the crash is not silently indistinguishable from a pass.
52
- - A developer reproducing a CI failure on their machine runs the same one-line invocation the CI job's step recorded and sees the same per-gate outcomes at the same report paths.
53
- - A downstream reader (a coverage-trend dashboard the project may add later) picks up successive aggregate reports over time without any scraping or provider-API integration.
54
-
55
- ## Wiring alternate CI providers (four-point mapping)
56
-
57
- Every mainstream CI provider ships the same four ingredients under a different runner language. The blueprint's Node entry point is the fourth ingredient; the other three are provider-specific. The illustrative GitHub Actions workflow shows all four; alternate providers translate the first three and keep the fourth unchanged:
58
-
59
- 1. Job trigger. GitHub Actions uses `on: push` and `on: pull_request` YAML; GitLab CI uses `rules:` with `if:` predicates on `$CI_COMMIT_BRANCH` and `$CI_MERGE_REQUEST_TARGET_BRANCH_NAME`; CircleCI uses `workflows:` with `filters:` on branches; Buildkite uses pipeline conditions on the branch name; Jenkins declarative pipelines use `when { branch }` blocks.
60
- 2. Node setup. GitHub Actions uses `actions/setup-node@vX`; GitLab CI images typically pre-install Node or use a Docker image; CircleCI uses `cimg/node` orbs; Buildkite installs Node in the queue's setup hook; Jenkins agents install Node through a tool config.
61
- 3. Package-manager setup and install. Whichever manager the project uses (pnpm, npm, yarn, bun); the same `install --frozen-lockfile` (or equivalent) pattern applies everywhere.
62
- 4. Node entry-point invocation and artefact upload. `node <path>` (or a package-manager script that resolves to the same); every provider ships an artefact-upload primitive that reads the configured report directory.
63
-
64
- The blueprint does not ship provider-specific configuration files for GitLab CI, CircleCI, Buildkite, or Jenkins at v1.0.0. A project on one of those providers hand-authors the trigger, setup, install, and artefact-upload steps in that provider's runner language and invokes the Node entry point unchanged.
65
-
66
- ## Operator decisions that remain open after apply
67
-
68
- - Report directory path (default `.rcf/reports/ci/`; a project that wants a different location changes the configuration input to the runner). Blueprint owns the schema and the file names; project owns the path.
69
- - Gate set beyond the two required ones. Blueprint owns the required set (`validate` then `coverage-strict`); project supersedes ADR-701 with a project-level ADR to add gates.
70
- - Coverage-mode posture. Blueprint owns strict per-AC as the required posture; project supersedes ADR-702 with a project-level ADR if a different posture (shallow-any, grace-window) is thoughtfully accepted.
71
- - CI provider choice. Blueprint owns the Node entry-point shape and one illustrative provider example; project picks the provider and wires the trigger, setup, install, and artefact-upload steps.
72
- - Branch protection and merge-policy configuration on the default branch. Blueprint states the property (AC-6101-2); project configures the platform surface.
73
- - Artefact upload retention and destination. Blueprint owns the report directory and its stable paths; project owns how long the CI provider keeps the artefact and where a downstream reader picks it up.
74
- - Merge-queue integration, if any. Blueprint owns the aggregate report as the single-record verdict; project wires the merge-queue tool to read it.
75
- - Coverage-trend dashboard or audit-log integration, if any. Blueprint owns the aggregate schema stability; project owns the reader.
76
-
77
- ## Cost-honesty paragraph
78
-
79
- Shipping this doc set costs the project the following. Every push and every pull request into the default branch runs both gates every time; on a small tree that is seconds, on a large tree with a deep chain it can be tens of seconds of pipeline wall time per run. The strict-coverage posture makes every new AC a two-file edit (author the AC and author the TC that resolves it); a project that skips the TC hits the strict-coverage gate on the pull request rather than at merge time. Adding a gate is a project-level ADR and a code change to the entry-point runner, not a knob-flip in a config file, which is the intended shape but does cost the ADR. The illustrative GitHub Actions workflow is a starting point; a project on another provider owes the translation of the first three of the four mapping points. Branch-protection configuration is not shipped by the blueprint; a project that forgets to configure it satisfies every AC on the doc set and still ships a pipeline that does not block merges. The report directory grows one per-gate file per gate per run; a project that runs the pipeline against a very short-lived branch may accumulate reports until the CI provider's artefact retention rolls them off. The atomic-write posture for report files costs one extra file-system syscall per report; the 256KB truncation cap on stdout and stderr costs the tail of a very verbose gate on runaway output.
@@ -1,37 +0,0 @@
1
- # Operator profile
2
-
3
- This file describes you (the operator) to any agent working on this
4
- repo. It lives in `rcf/.identity/` and is gitignored by default, so
5
- it is per-clone: another developer's clone of the same repo has their
6
- own profile, not yours.
7
-
8
- Fill in what is useful. Leave the rest. Freeform prose is fine; a
9
- bulleted list is fine. Nothing here is enforced by tooling.
10
-
11
- ## Name
12
-
13
- _(who you are; how you want the agent to address you)_
14
-
15
- ## Role
16
-
17
- _(what you do; what perspective you bring to this project)_
18
-
19
- ## Working preferences
20
-
21
- _(how you like to work: casual or formal register, verbose or terse
22
- responses, willingness to be pushed back on, anything the agent should
23
- know before choosing its default posture)_
24
-
25
- ## Project-scoped notes
26
-
27
- _(anything specific to this project that would be useful for the agent
28
- to know but does not belong in the shared requirements tree: a local
29
- dev workflow quirk, an in-flight side-experiment, a "do not touch this
30
- directory yet" flag)_
31
-
32
- ---
33
-
34
- If you want to share your profile with the team, remove the
35
- `rcf/.identity/` line from the managed block in `.gitignore` (or `git
36
- add -f rcf/.identity/profile.md` for one-off sharing). The default is
37
- per-clone. Sharing is deliberate.
@@ -1,12 +0,0 @@
1
- # Knowledge index
2
-
3
- The human table of contents for `rcf/knowledge/`. Add a bullet when you
4
- add a file. Keep it grouped by area if it grows.
5
-
6
- ## Notes
7
-
8
- _(none yet)_
9
-
10
- ## Docs
11
-
12
- _(none yet)_
@@ -1,41 +0,0 @@
1
- # Knowledge
2
-
3
- This directory is the project's memory. Everything an agent working on
4
- this repo should not have to relearn from scratch belongs here.
5
-
6
- ## The convention
7
-
8
- - **`notes/`**: internal facts. Decisions, gotchas, runtime facts,
9
- the small things that always cost time to rediscover ("the CI matrix
10
- uses Node 22 not 24", "the pnpm store path on this machine is
11
- non-default", "the local Postgres is on port 5433 not 5432"). Written
12
- for future agents and future you, not for public readers.
13
- - **`docs/`**: user-facing prose the project might surface elsewhere.
14
- Design notes the operator wants tidy, sections that might land in a
15
- README or a spec, prose intended for a wider audience.
16
-
17
- ## The rules
18
-
19
- 1. **One topic per file.** The filename is the topic
20
- (`notes/ci-node-version.md`, not `notes/general.md`). One paragraph
21
- is enough. An empty file that only carries a pointer to somewhere
22
- else is fine. A file called `misc.md` or `general.md` is not.
23
- 2. **Write on learn.** If this session established a fact the next
24
- session should not have to rediscover, write it here before the
25
- session ends.
26
- 3. **Grep before asking.** Before asking the stakeholder a question,
27
- `rg -n '<topic>' rcf/knowledge/` to see whether the answer is
28
- already here.
29
-
30
- ## `INDEX.md`
31
-
32
- `INDEX.md` is a human table of contents. Add a bullet when you add a
33
- file. Keep it grouped by area if it grows. Nobody scans it
34
- programmatically in v1; it is for the person landing on the repo cold.
35
-
36
- ## What this is not
37
-
38
- This is not a knowledge graph. There is no CLI verb, no indexer, no
39
- vector search. If a project needs one, that is a v2 decision, not a v1
40
- default. The convention above is deliberately cheap. The value is in
41
- the discipline of using it.
File without changes
File without changes