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
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6114",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-014",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The feature-branch shape materialises pull-request-checks and default-branch-checks",
8
+ "asA": "operator on a feature-branch project with delivery-ci-workflows v2 applied",
9
+ "iWant": "the workflow-materialiser to produce two workflows (pull-request-checks and default-branch-checks) sharing the same required check set",
10
+ "soThat": "every push to the default branch and every pull request against it is gated identically and my merge policy has one aggregate to bind to",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6114-1",
14
+ "description": "With `workflowShape.branchModel: feature`, the materialiser produces a `pull-request-checks` workflow triggered by pull requests targeting the default branch. The workflow invokes the Node gate-runner entry point (TAC-701) with the required check set (mandatory tier plus every `checkSet` flag set true).",
15
+ "given": "a `workflowShape` with `branchModel: feature` and every `checkSet` flag true",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "a `pull-request-checks` workflow file lands at the provider's workflow path, its trigger set names pull requests against the default branch, and its command line invokes the Node gate-runner entry point with the required check set",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6114-2",
23
+ "description": "With `branchModel: feature`, the materialiser additionally produces a `default-branch-checks` workflow triggered by pushes to the default branch. The workflow invokes the same Node gate-runner entry point on the same required check set.",
24
+ "given": "the same `workflowShape`",
25
+ "when": "the workflow-materialiser runs",
26
+ "then": "a `default-branch-checks` workflow file lands at the provider's workflow path, its trigger set names pushes to the default branch, and its command line invokes the Node gate-runner entry point with the required check set",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-6114-3",
32
+ "description": "The AC contract requires the project to configure default-branch protection (or the platform equivalent) to require the `pull-request-checks` aggregate as a merge-blocking check. The blueprint states the property; the configuration itself lives on the platform surface.",
33
+ "given": "a feature-branch project with the two workflows materialised",
34
+ "when": "a pull request whose most recent `pull-request-checks` aggregate report records `verdict: failed` is submitted for merge",
35
+ "then": "the platform refuses the merge and the refusal reason references the failed `pull-request-checks` required check",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
42
+ "TAC-701-delivery-ci-workflows-gate-runner"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6115",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-015",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The trunk shape materialises default-branch-checks and optionally pull-request-checks",
8
+ "asA": "operator on a trunk-based project with delivery-ci-workflows v2 applied",
9
+ "iWant": "the workflow-materialiser to produce `default-branch-checks` always, plus `pull-request-checks` when I opt into the sub-shape",
10
+ "soThat": "my trunk-based project gates every commit to trunk and only ships a PR workflow when I actually use PRs",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6115-1",
14
+ "description": "With `workflowShape.branchModel: trunk` and `trunkPullRequests` absent or `never`, the materialiser produces `default-branch-checks` only. The `pull-request-checks` workflow does not ship in this shape.",
15
+ "given": "a `workflowShape` with `branchModel: trunk` and no `trunkPullRequests` field",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "a `default-branch-checks` workflow file lands at the provider's workflow path, no `pull-request-checks` workflow file lands, and the merge-policy AC binds to the trunk-branch push-protection property",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6115-2",
23
+ "description": "With `branchModel: trunk` and `trunkPullRequests: sometimes`, the materialiser additionally produces `pull-request-checks` on the same required check set as `default-branch-checks`.",
24
+ "given": "a `workflowShape` with `branchModel: trunk` and `trunkPullRequests: sometimes`",
25
+ "when": "the workflow-materialiser runs",
26
+ "then": "both workflow files land at the provider's workflow path, and the merge-policy AC binds to the default-branch-protection property that admits only PRs whose `pull-request-checks` aggregate passed",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
33
+ "TAC-701-delivery-ci-workflows-gate-runner"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6116",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-016",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The linter check produces a stable-shape lint report and fails non-zero on any lint error",
8
+ "asA": "operator whose project enables the elicited linter check",
9
+ "iWant": "a lint gate whose report shape and exit-code semantic are stable across projects",
10
+ "soThat": "downstream readers (dashboards, merge queues) can consume lint outcomes without per-project scraping",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6116-1",
14
+ "description": "When `checkSet.linter` is true, the gate-runner runs the project-realised linter runner, captures its exit code and streams, and writes the per-gate report to `.rcf/reports/ci/lint.json` with `checkKind: \"linter\"`. A non-zero exit code from the runner flips the gate outcome to `failed`.",
15
+ "given": "a project with `checkSet.linter: true` and a realised linter runner satisfying the runner-contract interface",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/lint.json` is written with `checkKind: \"linter\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6117",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-017",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The formatter check runs in check mode and fails non-zero on any unformatted file",
8
+ "asA": "operator whose project enables the elicited formatter check",
9
+ "iWant": "a formatter gate that CHECKS (not writes) and fails on any file the formatter would rewrite",
10
+ "soThat": "unformatted commits are caught in CI rather than masked by a rewrite step",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6117-1",
14
+ "description": "When `checkSet.formatter` is true, the gate-runner runs the project-realised formatter runner in check mode. A non-zero exit code from the runner (indicating one or more files would be rewritten) flips the gate outcome to `failed`. The per-gate report at `.rcf/reports/ci/format.json` carries `checkKind: \"formatter\"`.",
15
+ "given": "a project with `checkSet.formatter: true` and a realised formatter runner in check mode",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/format.json` is written with `checkKind: \"formatter\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6118",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-018",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The typecheck runs when the project has a typechecker configured and fails non-zero on any type error",
8
+ "asA": "operator whose project uses a typechecked language",
9
+ "iWant": "the typecheck gate to run when my project has a typechecker configured and be off when it does not",
10
+ "soThat": "the default aligns with project shape without me writing an explicit override",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6118-1",
14
+ "description": "When `checkSet.typecheck` is true (or the auto-detect finds a `tsconfig.json` or equivalent tool marker at the project root and the flag is unset), the gate-runner runs the project-realised typecheck runner. A non-zero exit flips the gate outcome to `failed`. The per-gate report at `.rcf/reports/ci/typecheck.json` carries `checkKind: \"typecheck\"`.",
15
+ "given": "a project with `checkSet.typecheck: true` and a realised typecheck runner",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/typecheck.json` is written with `checkKind: \"typecheck\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6118-2",
23
+ "description": "When `checkSet.typecheck` is unset and the project tree contains no `tsconfig.json` or equivalent tool marker, the auto-detect leaves the check off and no `typecheck.json` report file is written.",
24
+ "given": "a project with `checkSet.typecheck` unset and no typechecker marker at the project root",
25
+ "when": "a CI workflow invokes the gate-runner",
26
+ "then": "no `typecheck` gate is included in the aggregate report and no `.rcf/reports/ci/typecheck.json` file is written",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-702-delivery-ci-workflows-gate-report"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6119",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-019",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The unit-test check runs the project suite as a gate and fails non-zero on any failing test",
8
+ "asA": "operator whose project has a unit-test suite",
9
+ "iWant": "a unit-test gate whose exit-code and report shape are the same as every other elicited check",
10
+ "soThat": "the aggregate report treats unit tests as one gate among many with the same downstream contract",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6119-1",
14
+ "description": "When `checkSet.unitTest` is true, the gate-runner runs the project-realised unit-test runner. A non-zero exit code flips the gate outcome to `failed`. The per-gate report at `.rcf/reports/ci/test.json` carries `checkKind: \"unitTest\"`.",
15
+ "given": "a project with `checkSet.unitTest: true` and a realised unit-test runner",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/test.json` is written with `checkKind: \"unitTest\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6120",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-020",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The security-scan check fails non-zero on findings at or above the project severity threshold",
8
+ "asA": "operator whose project enables the elicited security-scan check",
9
+ "iWant": "a security-scan gate whose exit code is driven by the project-configured severity threshold, not a build-in choice",
10
+ "soThat": "the gate applies across risk postures without changing the tool or the report shape",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6120-1",
14
+ "description": "When `checkSet.securityScan` is true, the gate-runner runs the project-realised security-scan runner. A non-zero exit code (indicating one or more findings at or above the project-configured severity threshold) flips the gate outcome to `failed`. Findings below the threshold are recorded in the per-gate report without flipping the exit code. The per-gate report at `.rcf/reports/ci/security.json` carries `checkKind: \"securityScan\"`.",
15
+ "given": "a project with `checkSet.securityScan: true` and a realised security-scan runner configured with the project's severity threshold",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/security.json` is written with `checkKind: \"securityScan\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6121",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-021",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The release workflow shape scales with the releaseMode dimension",
8
+ "asA": "operator declaring a release path on delivery-ci-workflows v2",
9
+ "iWant": "the release workflow the materialiser produces to scale with what my project has already declared (no release, tag only, tag plus artefact, or handoff to deploy)",
10
+ "soThat": "I choose the maturity level of my release path once and the workflow set follows",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6121-1",
14
+ "description": "When `workflowShape.releaseMode` is `none`, the workflow-materialiser writes no `release` workflow file to the provider's workflow path. A project with no release path does not ship a workflow.",
15
+ "given": "a `workflowShape` with `releaseMode: none`",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "no `release` workflow file is created at the provider's workflow path and no `.rcf/reports/ci/release.json` file is written",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6121-2",
23
+ "description": "When `releaseMode` is `tagOnly`, the release workflow fires on a release trigger and creates a release entity on the CI provider's own release surface. No artefact-publish step ships. When `tagPlusArtefact`, the release workflow additionally runs the project-realised artefact-publish step and uploads its output to the release entity.",
24
+ "given": "a `workflowShape` with `releaseMode: tagPlusArtefact` and a realised artefact-publish step",
25
+ "when": "a release trigger fires",
26
+ "then": "the release workflow creates the release entity, runs the artefact-publish step, uploads the published artefact to the release entity, and records the just-published version identifier in the aggregate report",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-6121-3",
32
+ "description": "The release workflow does not include the required check set. Its aggregate report at `.rcf/reports/ci/release.json` carries the release-flow outcome (tag creation, artefact publish, optional deploy handoff) and not the gate-runner outcome.",
33
+ "given": "a release workflow materialised in any non-`none` mode",
34
+ "when": "the release trigger fires",
35
+ "then": "the release workflow does not invoke the gate-runner entry point and the `pipeline.json` at the same commit remains the record of the check set outcome",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
42
+ "TAC-705-delivery-ci-workflows-release-workflow"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6122",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-022",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The deployHandoff release mode invokes the deploy blueprint's promote workflow and refuses at boot when that blueprint is absent",
8
+ "asA": "operator declaring a paired service on delivery-ci-workflows v2",
9
+ "iWant": "the release workflow to hand off to the named deploy blueprint's promote workflow after the artefact-publish step succeeds",
10
+ "soThat": "the CI-side and deploy-side workflows compose without either duplicating the other's WHAT",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6122-1",
14
+ "description": "When `workflowShape.releaseMode` is `deployHandoff:<slug>` and the named deploy blueprint is present in `manifest.blueprints[]`, the release workflow invokes the deploy blueprint's `promote` workflow via `workflow_dispatch` after the artefact-publish step succeeds. The invocation passes the just-published version identifier as the `versionId` input.",
15
+ "given": "a `workflowShape` with `releaseMode: deployHandoff:deploy-cloudflare-workers`, the named deploy blueprint applied, and an artefact-publish step that succeeded",
16
+ "when": "the release trigger fires",
17
+ "then": "the release workflow dispatches the promote workflow with `versionId` set to the just-published version identifier and waits on the promote workflow's outcome",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6122-2",
23
+ "description": "The release workflow's aggregate outcome is `passed` only when the promote workflow's outcome is `passed`. A failed promote workflow flips the release workflow's aggregate to `failed`.",
24
+ "given": "a release workflow in `deployHandoff` mode whose promote workflow returned a failed outcome",
25
+ "when": "the release workflow aggregates its outcome",
26
+ "then": "the release workflow's aggregate report at `.rcf/reports/ci/release.json` records `verdict: failed` and names the promote workflow's failure in its `gates[]` array",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-6122-3",
32
+ "description": "When `releaseMode` is `deployHandoff:<slug>` and the named deploy blueprint is not present in `manifest.blueprints[]`, the workflow-materialiser boot-check refuses with a stable-coded error naming the missing blueprint slug and pointing at `rcf define blueprint add <deploy-slug>`.",
33
+ "given": "a `workflowShape` with `releaseMode: deployHandoff:deploy-cloudflare-workers` and no such blueprint in the manifest",
34
+ "when": "the workflow-materialiser boots",
35
+ "then": "the materialiser exits non-zero with a stable-coded error naming the missing slug and pointing at the resolution command, and no release workflow file lands on disk",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
42
+ "TAC-705-delivery-ci-workflows-release-workflow"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6123",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-023",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The scheduledAudit dimension materialises a cron workflow running the required check set on cadence",
8
+ "asA": "operator wanting to catch dependency drift and secret rotations between merges",
9
+ "iWant": "to opt into a scheduled workflow that runs the same required check set on a cron cadence",
10
+ "soThat": "drift that does not coincide with a merge is caught rather than missed until the next unrelated PR",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6123-1",
14
+ "description": "When `workflowShape.scheduledAudit` is `true`, the workflow-materialiser produces a `scheduled-audit` workflow triggered by the provider's cron surface, running the same required check set the pull-request and default-branch workflows run. The aggregate report writes to `.rcf/reports/ci/scheduled-audit.json` (distinct from the commit-triggered `pipeline.json`).",
15
+ "given": "a `workflowShape` with `scheduledAudit: true`",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "a `scheduled-audit` workflow file lands at the provider's workflow path, its trigger set names a cron schedule, and its command line invokes the Node gate-runner entry point with the required check set writing to the distinct report path",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6123-2",
23
+ "description": "When `scheduledAudit` is `false` or absent, no scheduled workflow ships and no `.rcf/reports/ci/scheduled-audit.json` file path is populated.",
24
+ "given": "a `workflowShape` with `scheduledAudit` absent (default `false`)",
25
+ "when": "the workflow-materialiser runs",
26
+ "then": "no `scheduled-audit` workflow file is created and no `.rcf/reports/ci/scheduled-audit.json` file path is written",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
33
+ "TAC-706-delivery-ci-workflows-scheduled-audit"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,61 @@
1
+ # delivery-ci-workflows blueprint coordination vocabulary
2
+
3
+ This file is the delivery-ci-workflows 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 | delivery-ci-workflows contribution | Origin | Composition note |
8
+ |---|---|---|---|
9
+ | `ciGates` | ADR-701-delivery-ci-workflows-ci-gates | Minted at v1 by the ci-pipeline predecessor; broadened at v2.0.0 to name the required check set (mandatory tier plus elicited subset from `workflowShape.checkSet`) | The required check set every commit-triggered workflow runs. Any composing blueprint that ships its own required-check 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 catalogue and states the reasoning |
10
+ | `strictCoverageGate` | ADR-702-delivery-ci-workflows-strict-coverage-gate | Preserved verbatim from v1 | 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
+ | `releaseArtefacts` | ADR-709-delivery-ci-workflows-release-artefacts | **Minted at v2.0.0** | The decision area of what the release workflow produces on a release trigger. The delivery-side answer is the four-mode `releaseMode` enumeration (`none`, `tagOnly`, `tagPlusArtefact`, `deployHandoff:<slug>`). A future `security-release-provenance` blueprint (minting a signature-attestation opinion) or a `delivery-release-notes` blueprint (minting a changelog opinion) 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 answer |
12
+
13
+ The delivery-ci-workflows blueprint claims three global topics at v2.0.0 (`ciGates` broadened, `strictCoverageGate` preserved, `releaseArtefacts` new). Every other contribution is scope-local; a composing blueprint that holds an opinion on runner language, report shape, elicitation surface, branch model, release workflow shape, provider hint, or scheduled audit authors its own project-level ADR if it wants to override.
14
+
15
+ ### Deliberate conflicts declared
16
+
17
+ Where this blueprint's set overlaps other blueprints' topics, the resolution paths are documented at authoring rather than left to composition-time surprise:
18
+
19
+ - **`ciGates` vs any future adherence-pack or browser-verify blueprint**: expected conflict on the `ciGates` string. Resolution: the project-level ADR names the extended catalogue including the composing blueprint's checks.
20
+ - **`releaseArtefacts` vs any future `security-release-provenance` blueprint**: expected conflict on the `releaseArtefacts` string. Resolution: the project-level ADR fixes the artefact production shape including signatures and provenance blocks.
21
+ - **`releaseArtefacts` vs any future `delivery-release-notes` blueprint**: expected conflict on the `releaseArtefacts` string (release notes are one kind of artefact the release workflow produces). Resolution: the project-level ADR names the release-notes production alongside the artefact publish step.
22
+
23
+ `branchModel` is deliberately NOT minted as a global topic. No shipped or plausible sibling blueprint has a legitimate opinion on branch model choice; minting the string would create a resolution surface for a conflict that would not materialise. If evidence emerges to the contrary, `branchModel` can be minted in a v2.x minor bump.
24
+
25
+ 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.
26
+
27
+ 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).
28
+
29
+ ## Id number bands (registry bootstrap)
30
+
31
+ 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).
32
+
33
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
34
+
35
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
36
+ |---|---|---|---|---|
37
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
38
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
39
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
40
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
41
+ | 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` |
42
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
43
+ | delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
44
+ | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
45
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
46
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
47
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
48
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
49
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
50
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
51
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
52
+
53
+ US 6101-6110 sit at the LOW end of the 6101-6899 band on purpose. A project-side story that mechanically derives from `delivery-ci-workflows-REQ-011` into the number `6111` would collide against delivery-ci-workflows-US-6111 in this package; the band leaves headroom at the HIGH end (US 6181-6899) so a project's own stories anchored to delivery-ci-workflows REQs can allocate without conflict. The watchpost run4 lesson applies here too.
54
+
55
+ ## Shared expectations for future composing blueprints
56
+
57
+ - Reuse `ciGates` exactly as spelled here when your blueprint holds an opinion on the required check set every commit-triggered workflow 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.
58
+ - 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.
59
+ - Reuse `releaseArtefacts` exactly as spelled here when your blueprint holds an opinion on what the release workflow produces on a release trigger (an artefact-signing opinion, a provenance-block opinion, a release-notes opinion); contribute your own scope:global ADR on that string and expect a project-level ADR to fix the extended answer.
60
+ - This blueprint's decision at v2.0.0 states the mandatory tier (`validate` and `coverage-strict` in that order) plus the elicited tier (linter, formatter, typecheck, unitTest, securityScan) driven by `workflowShape.checkSet`, the four-mode `releaseMode` enumeration on `releaseArtefacts`, the Node-only entry-point shape (ADR-703), and the report shape (ADR-704 with the v2 `checkKind` addition). Compose compatible adherence packs, browser-verify shipping, or observability probes, or expect the operator to supersede with one project-level ADR per topic.
61
+ - Global topics that plausibly belong to a future blueprint and are NOT claimed by any shipped blueprint: `adherencePack` (an adherence-shipping blueprint's natural global), `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.
@@ -0,0 +1,136 @@
1
+ # delivery-ci-workflows blueprint guide
2
+
3
+ ## What it is
4
+
5
+ The default CI floor for rcf-lite projects, expressed as a workflow SET the operator declares once and the workflow-materialiser produces from that declaration. The blueprint contributes the WHAT of the workflow set: which workflows exist per branch model, which required check set every check-set workflow runs, what the release workflow does per release mode, what the scheduled-audit workflow does when enabled, and what report files land on disk after every run. Each workflow is a single Node entry point the CI job invokes with one line; the elicitation surface is the four required plus two optional fields of `workflowShape` in `.rcf/config/delivery-ci-workflows.json` on the project tree.
6
+
7
+ Concretely, the blueprint ships 23 requirements, 23 user stories (roughly 50 acceptance criteria), 6 architecture components, and 10 architecture decision records. Three ADRs are `scope: global` on the topics `ciGates` (the required check set every commit-triggered workflow runs), `strictCoverageGate` (the per-AC strict coverage posture), and `releaseArtefacts` (the four-mode release workflow shape); the other seven ADRs are scope-local.
8
+
9
+ ## What it is not
10
+
11
+ Not a matrix of provider-specific configuration files. v2.0.0 ships one illustrative GitHub Actions workflow file per workflow the matrix materialises under `assets/ci-provider-examples/github-actions/` (`pull-request-checks.yml`, `default-branch-checks.yml`, `release.yml`, `scheduled-audit.yml`) as copy-paste starting points. Alternate providers (GitLab CI, CircleCI, Buildkite, Jenkins) wire the same Node entry points per the four-point mapping named below applied to each workflow; the blueprint does not carry per-provider configuration files for those runners at v2.0.0.
12
+
13
+ Not a source-code contribution. The blueprint contributes the workflow-materialiser contract, the gate-runner contract, the release-workflow contract, the scheduled-audit contract, the per-gate report writer contract, the aggregate report writer contract, and the discipline that binds them. The project realises the Node entry points against those contracts in its own build cycle; the blueprint does not ship the entry-point source.
14
+
15
+ Not a choice of linter, formatter, typechecker, test runner, or security scanner. The elicited check catalogue names the check kinds; the project picks the tools that satisfy the runner-contract interfaces. A code-formatting style guide, a security-scan severity threshold, and the linter rule set are all project decisions the blueprint does not opine on.
16
+
17
+ Not a release-mechanism. The release workflow reacts to a tag or a `workflow_dispatch`; the project creates the tag through its own release mechanism (a `standard-version` invocation, a manual git tag, a release-please bot). The blueprint does not ship a tag-creation workflow, a changelog generator, or a version-bump tool.
18
+
19
+ Not a merge-queue integration or a coverage-trend dashboard. A project that wants either reads the aggregate reports from the queue tool or the dashboard of its choice; the blueprint owns the aggregate report shapes and stability, not the reader wiring.
20
+
21
+ Not a branch-protection or merge-policy configuration. AC-6101-2, AC-6114-3, AC-6115-1, and AC-6115-2 state the property the project owes on the platform's own configuration surface per branch model; the blueprint does not ship the configuration file.
22
+
23
+ ## When to reach for it
24
+
25
+ Reach for the `delivery-ci-workflows` blueprint when:
26
+
27
+ - The project is an rcf-lite deployment with an RCF chain and a default or trunk branch.
28
+ - The project's CI provider can run Node 24 or later on its runner (every mainstream provider can).
29
+ - The project wants the required check set (RCF chain plus enabled elicited checks) 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 a release workflow that scales with what the project has already declared (from `none` for internal packages up to `deployHandoff:<slug>` for paired services).
32
+
33
+ ## When it does not fit
34
+
35
+ Do not reach for the `delivery-ci-workflows` blueprint when:
36
+
37
+ - The project does not use RCF (no `rcf/` tree, no `rcf define validate` invocation makes sense).
38
+ - The project runs on a CI provider whose runners cannot execute Node 24 or later.
39
+ - The project wants a coverage-mode grace window on newly introduced ACs (supersede ADR-702 with a project-level ADR stating the grace window).
40
+ - The project wants required checks that are not in the catalogue and not naturally cross-blueprint (a mutation-testing gate, an accessibility scan). Supersede ADR-701 with a project-level ADR listing the extended catalogue and register the check under `custom:<name>`.
41
+
42
+ ## What a good outcome looks like
43
+
44
+ A project applies the `delivery-ci-workflows` blueprint on a fresh tree, populates `.rcf/config/delivery-ci-workflows.json` with its `workflowShape` (four required fields plus any optional ones), realises the six TACs in project-authored FBSes, and lands on a deployed workflow set where:
45
+
46
+ - Every commit-triggered event fires the appropriate workflow (per branch model). The workflow's aggregate report at `.rcf/reports/ci/pipeline.json` records the trigger, the timing, and the ordered gate outcomes including the `checkKind` per gate.
47
+ - A pull request whose head commit fails any required check sees the failed check in the aggregate, sees the specific issue in the per-gate report, and cannot be merged through the platform's standard merge path.
48
+ - A pull request whose head commit passes every required check sees `verdict: passed` in the aggregate, sees green on the platform's required-check surface, and can be merged.
49
+ - A release trigger fires the release workflow per `releaseMode`: `none` means no workflow at all; `tagOnly` creates a release entity; `tagPlusArtefact` also publishes an artefact; `deployHandoff:<slug>` also invokes the named deploy blueprint's promote workflow with the `versionId` input.
50
+ - When `scheduledAudit: true`, the scheduled-audit workflow fires on a cron cadence and writes to `.rcf/reports/ci/scheduled-audit.json`, distinct from commit-triggered `pipeline.json`.
51
+ - 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.
52
+
53
+ ## The workflowShape declaration (four dimensions plus two optional)
54
+
55
+ The project ships `.rcf/config/delivery-ci-workflows.json` at the project root. The declaration has three required fields, one optional field with defined default semantics, and two optional dimensions.
56
+
57
+ ```json
58
+ {
59
+ "workflowShape": {
60
+ "branchModel": "feature",
61
+ "checkSet": {
62
+ "linter": true,
63
+ "formatter": true,
64
+ "typecheck": true,
65
+ "unitTest": true,
66
+ "securityScan": true
67
+ },
68
+ "releaseMode": "tagPlusArtefact",
69
+ "providerHint": "githubActions",
70
+ "scheduledAudit": false
71
+ }
72
+ }
73
+ ```
74
+
75
+ - `branchModel` (required): `feature` or `trunk`.
76
+ - `checkSet` (required): object of booleans keyed by elicited-check name.
77
+ - `providerHint` (required): `githubActions`, `gitlabCi`, `circleCi`, `buildkite`, or `jenkins`.
78
+ - `releaseMode` (OPTIONAL, Q6-B ratification): `none`, `tagOnly`, `tagPlusArtefact`, or `deployHandoff:<slug>`. An absent field is treated the same as `none` (no release workflow ships). Not having a release path yet is a common scenario when starting a project; the ratification chose ergonomics over an explicit `none`.
79
+ - `scheduledAudit` (optional): boolean; default `false`.
80
+ - `trunkPullRequests` (optional; qualifies `branchModel: trunk`): `never` or `sometimes`; default `never`.
81
+
82
+ ### Profile aliases
83
+
84
+ Named profile aliases (`smallLibrary`, `smallService`, `internalPackage`, `trunkLibrary`) compose the four-field form. The materialiser expands the alias to the four-field form at boot; every AC binds to the four-field form. Adding an alias is a minor bump; renaming or removing an alias is a minor bump.
85
+
86
+ ## The check catalogue
87
+
88
+ Two tiers:
89
+
90
+ - **Mandatory tier** (preserved from v1): `validate` (running `rcf define validate`) then `coverage-strict` (running `rcf audit coverage --strict`), in that order.
91
+ - **Elicited tier** (v2 additions): `linter`, `formatter`, `typecheck`, `unitTest`, `securityScan`. Default: every catalogued check on. Per-check auto-detection may adjust the default (typecheck defaults on when the project tree contains a `tsconfig.json` or equivalent tool marker).
92
+
93
+ Each elicited check ships an AC contract stating what its runner must produce: a non-zero exit code on any blocking finding, a per-gate report at the check's stable path, and a `checkKind` field naming the check kind. The blueprint does NOT ship the linter, formatter, typechecker, test runner, or scanner; the project picks the tools.
94
+
95
+ Custom checks (`custom:<name>`) supersede this ADR at the project level and register alongside the catalogued checks in the aggregate.
96
+
97
+ ## The four release modes
98
+
99
+ `releaseMode` scales what the release workflow does:
100
+
101
+ - `none` (or absent, per Q6-B ratification): no release workflow ships.
102
+ - `tagOnly`: on a release trigger, creates a release entity on the provider's release surface (a GitHub Release, a GitLab release).
103
+ - `tagPlusArtefact`: on a release trigger, creates the release entity and runs the project-realised artefact-publish step, uploading the artefact to the release entity.
104
+ - `deployHandoff:<slug>`: on a release trigger, runs the tagPlusArtefact flow and then dispatches the named deploy blueprint's `promote` workflow via `workflow_dispatch` with the just-published version identifier as the `versionId` input.
105
+
106
+ The release workflow does NOT invoke the required check set: that already ran on the `default-branch-checks` workflow at the commit the release points at.
107
+
108
+ The `deployHandoff:<slug>` mode has a manifest boot-check: the materialiser refuses when the named deploy blueprint is absent from `manifest.blueprints[]`.
109
+
110
+ ## Wiring alternate CI providers (four-point mapping applied per workflow)
111
+
112
+ Every mainstream CI provider ships the same four ingredients under a different runner language. The blueprint's Node entry points are the fourth ingredient (one per workflow); the other three are provider-specific. The illustrative GitHub Actions workflow files show all four applied per workflow; alternate providers translate the first three and keep the fourth unchanged per workflow:
113
+
114
+ 1. Job trigger. The trigger set per workflow (pull_request into the target branch for `pull-request-checks`; push to the target branch for `default-branch-checks`; release event or workflow_dispatch for `release`; cron schedule for `scheduled-audit`).
115
+ 2. Node setup.
116
+ 3. Package-manager setup and install.
117
+ 4. Node entry-point invocation and artefact upload per workflow.
118
+
119
+ See `assets/ci-provider-examples/notes.md` for the per-provider translation.
120
+
121
+ ## Operator decisions that remain open after apply
122
+
123
+ - The workflow shape declaration (`.rcf/config/delivery-ci-workflows.json` populated).
124
+ - Report directory path (default `.rcf/reports/ci/`).
125
+ - Tool choices for elicited checks (linter, formatter, typechecker, unit-test runner, security scanner).
126
+ - Security-scan severity threshold.
127
+ - Coverage-mode posture (supersede ADR-702 with a project-level ADR if a different posture is wanted).
128
+ - CI provider choice and the trigger/setup/install steps per workflow.
129
+ - Branch-protection or push-protection configuration on the default or trunk branch per branch model.
130
+ - Artefact-upload retention and destination.
131
+ - Merge-queue integration and coverage-trend dashboard wiring.
132
+ - Release-mechanism (how tags get created).
133
+
134
+ ## Cost-honesty paragraph
135
+
136
+ Shipping this doc set costs the project the following. Every commit-triggered event runs the required check set every time; the elicited tier lengthens wall time in proportion to the number of enabled checks. The strict-coverage posture makes every new AC a two-file edit (author the AC and author the TC that resolves it). Adding a check kind outside the catalogue is a project-level ADR plus a runner realisation, not a knob-flip. The illustrative GHA assets are a starting point; a project on another provider owes the translation of the first three of the four mapping points per workflow (extending v1's per-workflow cost to a per-workflow-set cost). 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 workflow set that does not block merges. The report directory grows one per-gate file per gate per run plus one aggregate per workflow per run; a project that runs many workflows against short-lived branches accumulates reports until the CI provider's artefact retention rolls them off.
@@ -6,11 +6,11 @@ This file is the deploy-cloudflare-workers half of the cross-blueprint contract.
6
6
 
7
7
  | Topic string | deploy-cloudflare-workers contribution | Origin | Composition note |
8
8
  |---|---|---|---|
9
- | `deploymentTarget` | ADR-1301-deploy-cloudflare-workers-deployment-target | 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`), ci-pipeline (`ciGates`, `strictCoverageGate`), observability-essentials (`healthProbes`, `readinessSemantics`, `statusPageContract`), security-secrets-management (`secretsSource`), and the hello-panel walkthrough exemplar (`operatorPanel`) | The one project-wide model for how bits reach a running target: an artefact-upload + explicit-promote model, versions addressable at stable preview URLs, one adapter as the sole vendor caller, one served-surface verifier on every promote. A composing blueprint that holds a different opinion on the deployment shape (a container-image-per-commit + rolling-deploy blueprint, a coupled-merge-to-production blueprint, a serverless-function-per-endpoint 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 deployment shape and the vendor selection |
9
+ | `deploymentTarget` | ADR-1301-deploy-cloudflare-workers-deployment-target | 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`), delivery-ci-workflows (`ciGates`, `strictCoverageGate`), observability-essentials (`healthProbes`, `readinessSemantics`, `statusPageContract`), security-secrets-management (`secretsSource`), and the hello-panel walkthrough exemplar (`operatorPanel`) | The one project-wide model for how bits reach a running target: an artefact-upload + explicit-promote model, versions addressable at stable preview URLs, one adapter as the sole vendor caller, one served-surface verifier on every promote. A composing blueprint that holds a different opinion on the deployment shape (a container-image-per-commit + rolling-deploy blueprint, a coupled-merge-to-production blueprint, a serverless-function-per-endpoint 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 deployment shape and the vendor selection |
10
10
 
11
11
  The deploy-cloudflare-workers blueprint claims one global topic. Every other contribution is scope-local (ADR-1302 through ADR-1305 name the default vendor, the preview-vs-production URL model, the rollback-is-promote posture, and the dev-mode drift posture without contributing global topics; a composing blueprint that holds a different opinion on any of them authors its own project-level ADR if it wants to override).
12
12
 
13
- Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, persistence-data-sqlite, ci-pipeline, observability-essentials, and security-secrets-management 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 (`deploy`, `deployVendor`, `deployPipeline`, `shipTarget` are all wrong when `deploymentTarget` already exists).
13
+ Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, persistence-data-sqlite, delivery-ci-workflows, observability-essentials, and security-secrets-management 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 (`deploy`, `deployVendor`, `deployPipeline`, `shipTarget` are all wrong when `deploymentTarget` already exists).
14
14
 
15
15
  ## Id number bands (registry bootstrap)
16
16
 
@@ -26,7 +26,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
26
26
  | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
27
27
  | 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` |
28
28
  | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
29
- | ci-pipeline | 6101-6899 | 7xx | shipped v1.0.0 | `ciGates`, `strictCoverageGate` |
29
+ | delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
30
30
  | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
31
31
  | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
32
32
  | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |