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,57 @@
1
+ # Delivery-ci-workflows blueprint (v2.0.0)
2
+
3
+ The `delivery-ci-workflows` blueprint (renamed from `ci-pipeline` at v2.0.0) contributes the full workflow set an rcf-lite project runs on its CI provider: two commit-triggered workflows (pull-request-checks and default-branch-checks), an optional release workflow scaled across four modes, and an optional scheduled-audit workflow. The workflow set is a function of an operator-declared `workflowShape` covering four elicited dimensions plus one optional fifth: branch model (feature or trunk), check set (mandatory tier plus five elicited checks), release mode (none, tagOnly, tagPlusArtefact, or deployHandoff), provider hint (which CI provider's illustrative assets to seed from), and an optional scheduledAudit flag. The v1 RCF-gate suite is preserved verbatim as the mandatory tier inside a broader two-tier check catalogue.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/delivery-ci-workflows
9
+ ```
10
+
11
+ Phase 1 resolves local path sources only; registry and git-ref resolution is a mechanism follow-up. Apply is idempotent; `rcf define blueprint list` shows the applied entry; `rcf define blueprint remove delivery-ci-workflows` cleanly removes an unreferenced application.
12
+
13
+ Projects on the v1 `ci-pipeline` slug follow the migration path in the CHANGELOG: remove `ci-pipeline`, add `delivery-ci-workflows`, populate `.rcf/config/delivery-ci-workflows.json`, re-run the workflow-materialiser.
14
+
15
+ ## Anatomy
16
+
17
+ | Piece | Where | What |
18
+ |---|---|---|
19
+ | Metadata | `blueprint.json` | Slug, version, and the 62 contributions with scope/topic on the three global ADRs |
20
+ | Doc set | `contributions/` | 23 REQs, 23 USs, 6 TACs, 10 ADRs, all schema-valid and namespaced (`delivery-ci-workflows-REQ-NNN` prefix family; `ADR-70N-delivery-ci-workflows-<tail>` suffix family) |
21
+ | GitHub Actions assets | `assets/ci-provider-examples/github-actions/` | One illustrative workflow file per workflow the matrix materialises (`pull-request-checks.yml`, `default-branch-checks.yml`, `release.yml`, `scheduled-audit.yml`) |
22
+ | Alternate-provider notes | `assets/ci-provider-examples/notes.md` | The four-point mapping (job trigger, Node setup, single-line entry-point invocation, artefact upload) applied per workflow for GitLab CI, CircleCI, Buildkite, and Jenkins |
23
+ | Report-shape samples | `assets/report-samples/per-gate.json`, `assets/report-samples/pipeline.json` | Worked examples of a per-gate report (with the v2 `checkKind` field) and an aggregate report at the ratified schemas |
24
+ | Guide | `guide/delivery-ci-workflows.md` | Operator-facing: workflow-shape declaration, elicited-check catalogue, the four release modes, the deploy handoff contract, the scheduled-audit cadence |
25
+ | Coordination vocabulary | `docs/topics.md` | The three global-topic strings this blueprint contributes and the shared id band registry |
26
+
27
+ The doc set is contributions (copied into the project tree by `rcf define blueprint add`); the guide, assets, and docs are package-resident references. Guide rendering into `rcf/knowledge/docs/blueprint-guides/` and asset ingestion are mechanism follow-ups; until they land, the working agent reads them from the applied blueprint's source path recorded in `manifest.blueprints[].source`.
28
+
29
+ ## What it contributes, and what it deliberately does not
30
+
31
+ Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (ratified decision preserved from v1) and no code.
32
+
33
+ No FBS contributions, as a matter of principle (ratified policy 2026-08-19): FBSs are the work of the implementing agent, not the blueprint. The blueprint contributes the WHAT (the workflow-materialiser contract, the gate-runner contract, the release-workflow contract, the scheduled-audit contract, the check-catalogue AC contracts, the report shapes); the implementing agent derives the HOW-tasks in the host project against those contracts.
34
+
35
+ Deliberately not contributed: a matrix of provider-specific configuration files (v2.0.0 ships GHA only; alternate providers wire the same entry points per the guide's four-point mapping applied per workflow); provider-specific pipeline plugins or actions; the linter, formatter, typechecker, unit-test runner, or security scanner (the elicited checks name the kind; the project picks the tool); a code-formatting style guide or a security-scan severity threshold (project decisions); a release-mechanism (no `standard-version` invocation, no `release-please` config, no `changesets` schema; the workflow reacts to a tag or dispatch, does not create it); a merge-queue integration; a coverage-trend dashboard.
36
+
37
+ ## The three global decisions
38
+
39
+ ADR-701-delivery-ci-workflows-ci-gates ships `scope: global` on topic `ciGates`. This is the project's required check set: the two mandatory tier gates (`validate` then `coverage-strict`) plus the elicited subset from `workflowShape.checkSet` (default: every catalogued elicited check on). A composing blueprint that ships its own required-check opinion (adherence packs, browser-verify smokes, observability probes) conflicts here by design and expects a project-level ADR that names the extended set.
40
+
41
+ ADR-702-delivery-ci-workflows-strict-coverage-gate ships `scope: global` on topic `strictCoverageGate`. This is the project's coverage-mode posture: per-AC strict, not shallow-any. Preserved verbatim from v1. A composing blueprint that holds a different coverage posture conflicts here by design.
42
+
43
+ ADR-709-delivery-ci-workflows-release-artefacts ships `scope: global` on topic `releaseArtefacts` (new at v2). This names the decision area of what the release workflow produces on a release trigger; the delivery-side answer is the four `releaseMode` values. A future `security-release-provenance` or `delivery-release-notes` blueprint that opines on the same decision area conflicts here and expects a project-level ADR that fixes the extended answer.
44
+
45
+ See `docs/topics.md` for the exact strings, the expected resolutions, the delineation from the application-api-rest blueprint's `logging` topic, and the AC id band allocation (delivery-ci-workflows owns 6101-6899).
46
+
47
+ ## Quality bar
48
+
49
+ The workflow-materialiser reads `.rcf/config/delivery-ci-workflows.json` and refuses to run when the three required fields are missing or when any field carries an unrecognised value; the required check set runs on every commit-triggered workflow the branch model defines; the mandatory tier runs first in order (`validate` then `coverage-strict`); the elicited tier runs after the mandatory tier in stable but non-load-bearing order; per-gate JSON reports at stable paths carry the v1 fixed key set plus the v2 `checkKind` field; distinct workflows write to distinct aggregate paths (`.rcf/reports/ci/pipeline.json` for commit-triggered, `.rcf/reports/ci/release.json` for release, `.rcf/reports/ci/scheduled-audit.json` for scheduled); a missing required gate report is recorded as `outcome: missing` and flips the aggregate to `failed`; the release workflow shape scales across four discrete modes with the `none` semantic reached either by explicit value or by absent field; the `deployHandoff:<slug>` mode invokes the named deploy blueprint's `promote` workflow with the `versionId` input and refuses at boot when the deploy blueprint is absent; the applied blueprint's source path carries one illustrative GHA workflow file per workflow in the matrix and a notes file mapping four points to alternate providers. Every bar is carried by ACs in the doc set, not by this README.
50
+
51
+ ## Known mechanism-reach gaps
52
+
53
+ None at v2.0.0. Every AC on every story is bound to at least one TAC that the host project must realise, and every AC's `then` clause is runtime-observable in the materialised workflow files, the aggregate report files at their stable paths, and the platform's own branch-protection or push-protection surface. The mechanism-reach principle from the authoring standard section 7 is satisfied at ship. The operational responsibility a project must own is the branch-protection or equivalent merge-policy configuration on the default or trunk branch that binds the aggregate exit to the merge criterion (AC-6101-2, AC-6114-3, AC-6115-1, AC-6115-2); that responsibility is stated as an AC observable on the platform's own configuration surface, not a smuggled runtime probe.
54
+
55
+ ## Verification depth
56
+
57
+ The four illustrative GHA workflow files under `assets/ci-provider-examples/github-actions/` are YAML-shape-valid (parseable, `on:` trigger blocks well-formed, jobs and steps structurally complete) and serve as copy-paste starting points; they are NOT executed as part of this blueprint's ship gate. Every non-mandatory-tier check runner and every workflow behaviour (materialiser boot-check, gate-runner orchestration, release-workflow orchestration, scheduled-audit runner, deploy-handoff dispatch, aggregate-report writing) is project-realised against the TAC contracts (TAC-701..706); end-to-end workflow execution is verified in the consuming project's own CI at apply-time, per the mechanism-reach principle. The v1 mandatory-tier upload+promote path (per the v1 blueprint under the old `ci-pipeline` slug) remains dogfood-proven and is preserved verbatim as the mandatory tier here; the v2 elicited-tier catalogue, the new workflow-materialiser TAC, and the release/scheduled-audit workflows are new AC contracts whose runtime enforcement is the applying project's responsibility.
@@ -0,0 +1,55 @@
1
+ # Illustrative default-branch-checks workflow for the delivery-ci-workflows blueprint.
2
+ # Copy this file into the host project as `.github/workflows/default-branch-checks.yml`
3
+ # and adjust the `node-version`, package-manager setup, and entry-point path
4
+ # to match the project's realised gate runner (TAC-701).
5
+ #
6
+ # Feature-branch shape: pushes to the default branch (which happens on merge).
7
+ # Trunk-based shape: pushes to the trunk branch (every commit). The workflow
8
+ # shape is identical; only the branch name on the `on: push:` block differs.
9
+ #
10
+ # The workflow runs the same required check set as pull-request-checks and
11
+ # writes to the same aggregate report path `.rcf/reports/ci/pipeline.json`.
12
+ #
13
+ # See `guide/delivery-ci-workflows.md` (four-point mapping) for translating
14
+ # this workflow to GitLab CI, CircleCI, Buildkite, or Jenkins.
15
+
16
+ name: default-branch-checks
17
+
18
+ on:
19
+ push:
20
+ branches: [main]
21
+
22
+ jobs:
23
+ check-set:
24
+ runs-on: ubuntu-latest
25
+ permissions:
26
+ contents: read
27
+ steps:
28
+ - name: checkout
29
+ uses: actions/checkout@v4
30
+
31
+ - name: setup pnpm
32
+ uses: pnpm/action-setup@v4
33
+ with:
34
+ version: 9
35
+
36
+ - name: setup node
37
+ uses: actions/setup-node@v4
38
+ with:
39
+ node-version: 24
40
+ cache: pnpm
41
+
42
+ - name: install dependencies
43
+ run: pnpm install --frozen-lockfile
44
+
45
+ - name: run rcf check set
46
+ run: node scripts/rcf-ci.js
47
+
48
+ - name: upload rcf ci reports
49
+ if: always()
50
+ uses: actions/upload-artifact@v4
51
+ with:
52
+ name: default-branch-checks-reports
53
+ path: .rcf/reports/ci/
54
+ if-no-files-found: warn
55
+ retention-days: 30
@@ -0,0 +1,65 @@
1
+ # Illustrative pull-request-checks workflow for the delivery-ci-workflows blueprint.
2
+ # Copy this file into the host project as `.github/workflows/pull-request-checks.yml`
3
+ # and adjust the `node-version`, package-manager setup, and entry-point path
4
+ # to match the project's realised gate runner (TAC-701).
5
+ #
6
+ # The workflow runs one CI-provider-neutral Node entry point that invokes the
7
+ # required check set (the mandatory tier plus the elicited subset the project
8
+ # turned on in workflowShape.checkSet), writes per-gate and aggregate JSON
9
+ # reports under `.rcf/reports/ci/`, and uploads the report directory as a
10
+ # workflow artefact for downstream readers.
11
+ #
12
+ # Feature-branch shape: pull requests targeting the default branch.
13
+ # Trunk-based shape (trunkPullRequests: sometimes): pull requests targeting
14
+ # the trunk branch. Adjust the branch name on the `on: pull_request:` block.
15
+ #
16
+ # See `guide/delivery-ci-workflows.md` (four-point mapping) for translating
17
+ # this workflow to GitLab CI, CircleCI, Buildkite, or Jenkins.
18
+
19
+ name: pull-request-checks
20
+
21
+ on:
22
+ pull_request:
23
+ branches: [main]
24
+
25
+ jobs:
26
+ check-set:
27
+ runs-on: ubuntu-latest
28
+ permissions:
29
+ contents: read
30
+ steps:
31
+ - name: checkout
32
+ uses: actions/checkout@v4
33
+
34
+ - name: setup pnpm
35
+ uses: pnpm/action-setup@v4
36
+ with:
37
+ version: 9
38
+
39
+ - name: setup node
40
+ uses: actions/setup-node@v4
41
+ with:
42
+ node-version: 24
43
+ cache: pnpm
44
+
45
+ - name: install dependencies
46
+ run: pnpm install --frozen-lockfile
47
+
48
+ # Single-line invocation of the project's realised gate runner.
49
+ # The runner spawns the mandatory tier (`rcf define validate` then
50
+ # `rcf audit coverage --strict`) and then every elicited check the
51
+ # project turned on in workflowShape.checkSet, writes
52
+ # `.rcf/reports/ci/<gate>.json` per gate with the `checkKind` field,
53
+ # and writes `.rcf/reports/ci/pipeline.json` as the aggregate. Its
54
+ # exit code is the pipeline's aggregate exit code.
55
+ - name: run rcf check set
56
+ run: node scripts/rcf-ci.js
57
+
58
+ - name: upload rcf ci reports
59
+ if: always()
60
+ uses: actions/upload-artifact@v4
61
+ with:
62
+ name: pull-request-checks-reports
63
+ path: .rcf/reports/ci/
64
+ if-no-files-found: warn
65
+ retention-days: 30
@@ -0,0 +1,71 @@
1
+ # Illustrative release workflow for the delivery-ci-workflows blueprint.
2
+ # Copy this file into the host project as `.github/workflows/release.yml`
3
+ # and adjust the `node-version`, package-manager setup, and release
4
+ # orchestrator path to match the project's realised release runner (TAC-705).
5
+ #
6
+ # This file materialises when workflowShape.releaseMode is `tagOnly`,
7
+ # `tagPlusArtefact`, or `deployHandoff:<slug>`. When releaseMode is `none`
8
+ # or absent, the workflow does not ship at all (Q6-B ratification).
9
+ #
10
+ # The workflow does NOT run the required check set: that already ran on the
11
+ # default-branch-checks workflow at the commit the release points at.
12
+ #
13
+ # See `guide/delivery-ci-workflows.md` for the four release-mode shapes and
14
+ # the deploy handoff invocation contract (AC-6122-1..3).
15
+
16
+ name: release
17
+
18
+ on:
19
+ release:
20
+ types: [created]
21
+ workflow_dispatch:
22
+ inputs:
23
+ versionId:
24
+ description: 'Version identifier to release (optional; omitted defaults to the release event tag)'
25
+ required: false
26
+ type: string
27
+
28
+ jobs:
29
+ release-flow:
30
+ runs-on: ubuntu-latest
31
+ permissions:
32
+ contents: write
33
+ packages: write
34
+ steps:
35
+ - name: checkout
36
+ uses: actions/checkout@v4
37
+
38
+ - name: setup pnpm
39
+ uses: pnpm/action-setup@v4
40
+ with:
41
+ version: 9
42
+
43
+ - name: setup node
44
+ uses: actions/setup-node@v4
45
+ with:
46
+ node-version: 24
47
+ cache: pnpm
48
+
49
+ - name: install dependencies
50
+ run: pnpm install --frozen-lockfile
51
+
52
+ # The release orchestrator reads the releaseMode from its environment
53
+ # (RCF_RELEASE_MODE) and runs the appropriate step sequence:
54
+ # tagOnly: create release entity only
55
+ # tagPlusArtefact: create release entity, run artefact-publish step
56
+ # deployHandoff:<slug>: create release entity, run artefact-publish
57
+ # step, dispatch <slug>'s promote workflow with versionId
58
+ # It writes .rcf/reports/ci/release.json as the aggregate.
59
+ - name: run release orchestrator
60
+ env:
61
+ RCF_RELEASE_MODE: tagPlusArtefact
62
+ run: node scripts/rcf-release.js
63
+
64
+ - name: upload release reports
65
+ if: always()
66
+ uses: actions/upload-artifact@v4
67
+ with:
68
+ name: release-reports
69
+ path: .rcf/reports/ci/
70
+ if-no-files-found: warn
71
+ retention-days: 90
@@ -0,0 +1,61 @@
1
+ # Illustrative scheduled-audit workflow for the delivery-ci-workflows blueprint.
2
+ # Copy this file into the host project as `.github/workflows/scheduled-audit.yml`
3
+ # and adjust the `node-version`, package-manager setup, and scheduled runner
4
+ # path to match the project's realised scheduled-audit runner (TAC-706).
5
+ #
6
+ # This file materialises when workflowShape.scheduledAudit is `true`. When
7
+ # `false` or absent, the workflow does not ship at all.
8
+ #
9
+ # The workflow runs the same required check set as the commit-triggered
10
+ # workflows and writes to a distinct aggregate report path
11
+ # (.rcf/reports/ci/scheduled-audit.json) so scheduled-run outcomes never
12
+ # overwrite the most recent commit-triggered outcome.
13
+ #
14
+ # See `guide/delivery-ci-workflows.md` for the cron cadence discussion and
15
+ # AC-6123-1/AC-6123-2 for the report-path property.
16
+
17
+ name: scheduled-audit
18
+
19
+ on:
20
+ schedule:
21
+ # Every day at 06:00 UTC. Adjust to your project's cadence.
22
+ - cron: '0 6 * * *'
23
+ workflow_dispatch: {}
24
+
25
+ jobs:
26
+ scheduled-check-set:
27
+ runs-on: ubuntu-latest
28
+ permissions:
29
+ contents: read
30
+ steps:
31
+ - name: checkout
32
+ uses: actions/checkout@v4
33
+
34
+ - name: setup pnpm
35
+ uses: pnpm/action-setup@v4
36
+ with:
37
+ version: 9
38
+
39
+ - name: setup node
40
+ uses: actions/setup-node@v4
41
+ with:
42
+ node-version: 24
43
+ cache: pnpm
44
+
45
+ - name: install dependencies
46
+ run: pnpm install --frozen-lockfile
47
+
48
+ # The scheduled runner is a thin wrapper around the gate-runner
49
+ # (TAC-701) that overrides the aggregate report path to the
50
+ # scheduled-audit path and forwards the elicited check set.
51
+ - name: run scheduled audit
52
+ run: node scripts/rcf-scheduled-audit.js --report-path .rcf/reports/ci/scheduled-audit.json
53
+
54
+ - name: upload scheduled audit reports
55
+ if: always()
56
+ uses: actions/upload-artifact@v4
57
+ with:
58
+ name: scheduled-audit-reports
59
+ path: .rcf/reports/ci/
60
+ if-no-files-found: warn
61
+ retention-days: 30
@@ -0,0 +1,61 @@
1
+ # Wiring the workflow set on alternate CI providers
2
+
3
+ The blueprint ships one illustrative provider example (GitHub Actions, four workflow files under `github-actions/`). Every mainstream provider hosts the same workflow set by translating four points per workflow and keeping the Node entry-point invocations unchanged. These notes are read alongside `guide/delivery-ci-workflows.md`, not instead of it.
4
+
5
+ ## The workflow set the matrix materialises
6
+
7
+ Which workflow files exist depends on `workflowShape`:
8
+
9
+ - Always: `default-branch-checks` (pushes to the default or trunk branch).
10
+ - Feature-branch, or trunk-based with `trunkPullRequests: sometimes`: `pull-request-checks` (pull requests targeting the branch).
11
+ - `releaseMode` not `none` and not absent: `release` (release-trigger events; four shapes per mode).
12
+ - `scheduledAudit: true`: `scheduled-audit` (cron cadence).
13
+
14
+ ## The four mapping points (applied per workflow)
15
+
16
+ 1. Job trigger. Fire the workflow's job on the trigger set defined for that workflow (see the corresponding GHA file's `on:` block for the reference shape).
17
+ 2. Node setup. Install Node 24 or later on the runner.
18
+ 3. Package-manager setup and install. Install the project's dependencies with the frozen-lockfile discipline of whichever manager the project uses.
19
+ 4. Node entry-point invocation and artefact upload. Run `node <path>` (or a package-manager script that resolves to the same) for the workflow's entry point (gate-runner for `pull-request-checks` and `default-branch-checks`, release orchestrator for `release`, scheduled-audit runner for `scheduled-audit`); upload the aggregate report directory as a run artefact for downstream readers.
20
+
21
+ The blueprint does not ship provider-specific configuration files for the providers below at v2.0.0. A project hand-authors the first three points in the provider's own runner language and keeps the fourth unchanged per the workflow's entry point.
22
+
23
+ ## GitLab CI (`.gitlab-ci.yml`)
24
+
25
+ - Triggers: for `pull-request-checks` use `rules: { if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" }`; for `default-branch-checks` use `rules: { if: $CI_COMMIT_BRANCH == "main" }`; for `release` use `rules: { if: $CI_COMMIT_TAG }` plus a `workflow_dispatch`-equivalent through GitLab's manual jobs; for `scheduled-audit` use a scheduled pipeline.
26
+ - Node setup: use a `node:24` image or install through the runner's setup hook.
27
+ - Install: `pnpm install --frozen-lockfile` (or equivalent).
28
+ - Invoke: `node scripts/rcf-ci.js` for check-set workflows; `node scripts/rcf-release.js` for release; `node scripts/rcf-scheduled-audit.js --report-path .rcf/reports/ci/scheduled-audit.json` for scheduled-audit.
29
+ - Artefact upload: `artifacts: { when: always, paths: [.rcf/reports/ci/] }`.
30
+
31
+ ## CircleCI (`.circleci/config.yml`)
32
+
33
+ - Triggers: `workflows:` with branch and PR filters for the two check-set workflows; scheduled workflows for `scheduled-audit`; the release workflow fires from tag-triggered pipelines.
34
+ - Node setup: `cimg/node:24.19` or the `node/install` orb command.
35
+ - Install: `pnpm install --frozen-lockfile`.
36
+ - Invoke: as above.
37
+ - Artefact upload: `store_artifacts: { path: .rcf/reports/ci }`.
38
+
39
+ ## Buildkite (`.buildkite/pipeline.yml`)
40
+
41
+ - Triggers: pipeline-level branch conditions or per-step `branches: main` for check-set workflows; separate pipelines for release (tag-triggered) and scheduled-audit (Buildkite scheduled builds).
42
+ - Node setup: install Node 24 in the queue's setup hook or use a Docker plugin (`docker#v5.0.0`).
43
+ - Install: `pnpm install --frozen-lockfile`.
44
+ - Invoke: as above.
45
+ - Artefact upload: `artifact_paths: [".rcf/reports/ci/**"]`.
46
+
47
+ ## Jenkins (declarative pipeline)
48
+
49
+ - Triggers: `triggers { githubPush() }` plus a multibranch pipeline configured to build pull requests against the default branch; a separate tag-triggered pipeline for release; `triggers { cron('H 6 * * *') }` for scheduled-audit.
50
+ - Node setup: install Node 24 via `tools { nodejs '24' }` or provision the agent with Node preinstalled.
51
+ - Install: `sh 'pnpm install --frozen-lockfile'`.
52
+ - Invoke: `sh 'node scripts/rcf-ci.js'` (or the appropriate script per workflow).
53
+ - Artefact upload: `archiveArtifacts artifacts: '.rcf/reports/ci/**', allowEmptyArchive: true`.
54
+
55
+ ## Cross-provider notes
56
+
57
+ - The Node entry-point paths are 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.
58
+ - 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 reports.
59
+ - 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.
60
+ - The release workflow's `deployHandoff:<slug>` mode dispatches the named deploy blueprint's `promote` workflow. On GHA that means a `workflow_dispatch` call to the deploy blueprint's workflow file; on other providers, translate to the equivalent workflow-dispatch primitive (GitLab's pipeline API trigger, CircleCI's trigger-pipeline API, Buildkite's Trigger step, Jenkins parameterised build). The `versionId` input contract is unchanged across providers.
61
+ - Sibling asset packs (a v2.1 candidate) that ship per-provider full asset sets from the same `workflowShape` are the natural way to skip this hand-translation work for projects that live on one provider.
@@ -8,5 +8,6 @@
8
8
  "exitCode": 0,
9
9
  "outcome": "passed",
10
10
  "stdout": "[rcf] validate: 0 issue(s) across 47 document(s)\n",
11
- "stderr": ""
11
+ "stderr": "",
12
+ "checkKind": "validate"
12
13
  }
@@ -0,0 +1,87 @@
1
+ {
2
+ "slug": "delivery-ci-workflows",
3
+ "version": "2.0.0",
4
+ "category": "delivery",
5
+ "contributions": [
6
+ { "id": "delivery-ci-workflows-REQ-001", "kind": "req", "path": "requirements/delivery-ci-workflows-req-001.json" },
7
+ { "id": "delivery-ci-workflows-REQ-002", "kind": "req", "path": "requirements/delivery-ci-workflows-req-002.json" },
8
+ { "id": "delivery-ci-workflows-REQ-003", "kind": "req", "path": "requirements/delivery-ci-workflows-req-003.json" },
9
+ { "id": "delivery-ci-workflows-REQ-004", "kind": "req", "path": "requirements/delivery-ci-workflows-req-004.json" },
10
+ { "id": "delivery-ci-workflows-REQ-005", "kind": "req", "path": "requirements/delivery-ci-workflows-req-005.json" },
11
+ { "id": "delivery-ci-workflows-REQ-006", "kind": "req", "path": "requirements/delivery-ci-workflows-req-006.json" },
12
+ { "id": "delivery-ci-workflows-REQ-007", "kind": "req", "path": "requirements/delivery-ci-workflows-req-007.json" },
13
+ { "id": "delivery-ci-workflows-REQ-008", "kind": "req", "path": "requirements/delivery-ci-workflows-req-008.json" },
14
+ { "id": "delivery-ci-workflows-REQ-009", "kind": "req", "path": "requirements/delivery-ci-workflows-req-009.json" },
15
+ { "id": "delivery-ci-workflows-REQ-010", "kind": "req", "path": "requirements/delivery-ci-workflows-req-010.json" },
16
+ { "id": "delivery-ci-workflows-REQ-011", "kind": "req", "path": "requirements/delivery-ci-workflows-req-011.json" },
17
+ { "id": "delivery-ci-workflows-REQ-012", "kind": "req", "path": "requirements/delivery-ci-workflows-req-012.json" },
18
+ { "id": "delivery-ci-workflows-REQ-013", "kind": "req", "path": "requirements/delivery-ci-workflows-req-013.json" },
19
+ { "id": "delivery-ci-workflows-REQ-014", "kind": "req", "path": "requirements/delivery-ci-workflows-req-014.json" },
20
+ { "id": "delivery-ci-workflows-REQ-015", "kind": "req", "path": "requirements/delivery-ci-workflows-req-015.json" },
21
+ { "id": "delivery-ci-workflows-REQ-016", "kind": "req", "path": "requirements/delivery-ci-workflows-req-016.json" },
22
+ { "id": "delivery-ci-workflows-REQ-017", "kind": "req", "path": "requirements/delivery-ci-workflows-req-017.json" },
23
+ { "id": "delivery-ci-workflows-REQ-018", "kind": "req", "path": "requirements/delivery-ci-workflows-req-018.json" },
24
+ { "id": "delivery-ci-workflows-REQ-019", "kind": "req", "path": "requirements/delivery-ci-workflows-req-019.json" },
25
+ { "id": "delivery-ci-workflows-REQ-020", "kind": "req", "path": "requirements/delivery-ci-workflows-req-020.json" },
26
+ { "id": "delivery-ci-workflows-REQ-021", "kind": "req", "path": "requirements/delivery-ci-workflows-req-021.json" },
27
+ { "id": "delivery-ci-workflows-REQ-022", "kind": "req", "path": "requirements/delivery-ci-workflows-req-022.json" },
28
+ { "id": "delivery-ci-workflows-REQ-023", "kind": "req", "path": "requirements/delivery-ci-workflows-req-023.json" },
29
+ { "id": "delivery-ci-workflows-US-6101", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6101.json" },
30
+ { "id": "delivery-ci-workflows-US-6102", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6102.json" },
31
+ { "id": "delivery-ci-workflows-US-6103", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6103.json" },
32
+ { "id": "delivery-ci-workflows-US-6104", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6104.json" },
33
+ { "id": "delivery-ci-workflows-US-6105", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6105.json" },
34
+ { "id": "delivery-ci-workflows-US-6106", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6106.json" },
35
+ { "id": "delivery-ci-workflows-US-6107", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6107.json" },
36
+ { "id": "delivery-ci-workflows-US-6108", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6108.json" },
37
+ { "id": "delivery-ci-workflows-US-6109", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6109.json" },
38
+ { "id": "delivery-ci-workflows-US-6110", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6110.json" },
39
+ { "id": "delivery-ci-workflows-US-6111", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6111.json" },
40
+ { "id": "delivery-ci-workflows-US-6112", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6112.json" },
41
+ { "id": "delivery-ci-workflows-US-6113", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6113.json" },
42
+ { "id": "delivery-ci-workflows-US-6114", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6114.json" },
43
+ { "id": "delivery-ci-workflows-US-6115", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6115.json" },
44
+ { "id": "delivery-ci-workflows-US-6116", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6116.json" },
45
+ { "id": "delivery-ci-workflows-US-6117", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6117.json" },
46
+ { "id": "delivery-ci-workflows-US-6118", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6118.json" },
47
+ { "id": "delivery-ci-workflows-US-6119", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6119.json" },
48
+ { "id": "delivery-ci-workflows-US-6120", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6120.json" },
49
+ { "id": "delivery-ci-workflows-US-6121", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6121.json" },
50
+ { "id": "delivery-ci-workflows-US-6122", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6122.json" },
51
+ { "id": "delivery-ci-workflows-US-6123", "kind": "us", "path": "user-stories/delivery-ci-workflows-us-6123.json" },
52
+ { "id": "TAC-701-delivery-ci-workflows-gate-runner", "kind": "tac", "path": "tacs/tac-701-delivery-ci-workflows-gate-runner.json" },
53
+ { "id": "TAC-702-delivery-ci-workflows-gate-report", "kind": "tac", "path": "tacs/tac-702-delivery-ci-workflows-gate-report.json" },
54
+ { "id": "TAC-703-delivery-ci-workflows-aggregate-report", "kind": "tac", "path": "tacs/tac-703-delivery-ci-workflows-aggregate-report.json" },
55
+ { "id": "TAC-704-delivery-ci-workflows-workflow-materialiser", "kind": "tac", "path": "tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json" },
56
+ { "id": "TAC-705-delivery-ci-workflows-release-workflow", "kind": "tac", "path": "tacs/tac-705-delivery-ci-workflows-release-workflow.json" },
57
+ { "id": "TAC-706-delivery-ci-workflows-scheduled-audit", "kind": "tac", "path": "tacs/tac-706-delivery-ci-workflows-scheduled-audit.json" },
58
+ {
59
+ "id": "ADR-701-delivery-ci-workflows-ci-gates",
60
+ "kind": "adr",
61
+ "path": "adrs/adr-701-delivery-ci-workflows-ci-gates.json",
62
+ "scope": "global",
63
+ "topic": "ciGates"
64
+ },
65
+ {
66
+ "id": "ADR-702-delivery-ci-workflows-strict-coverage-gate",
67
+ "kind": "adr",
68
+ "path": "adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json",
69
+ "scope": "global",
70
+ "topic": "strictCoverageGate"
71
+ },
72
+ { "id": "ADR-703-delivery-ci-workflows-node-only-runner", "kind": "adr", "path": "adrs/adr-703-delivery-ci-workflows-node-only-runner.json" },
73
+ { "id": "ADR-704-delivery-ci-workflows-report-shape", "kind": "adr", "path": "adrs/adr-704-delivery-ci-workflows-report-shape.json" },
74
+ { "id": "ADR-705-delivery-ci-workflows-elicitation-surface", "kind": "adr", "path": "adrs/adr-705-delivery-ci-workflows-elicitation-surface.json" },
75
+ { "id": "ADR-706-delivery-ci-workflows-branch-model-defaults", "kind": "adr", "path": "adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json" },
76
+ { "id": "ADR-707-delivery-ci-workflows-release-workflow-shape", "kind": "adr", "path": "adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json" },
77
+ { "id": "ADR-708-delivery-ci-workflows-provider-hint-shape", "kind": "adr", "path": "adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json" },
78
+ {
79
+ "id": "ADR-709-delivery-ci-workflows-release-artefacts",
80
+ "kind": "adr",
81
+ "path": "adrs/adr-709-delivery-ci-workflows-release-artefacts.json",
82
+ "scope": "global",
83
+ "topic": "releaseArtefacts"
84
+ },
85
+ { "id": "ADR-710-delivery-ci-workflows-scheduled-audit", "kind": "adr", "path": "adrs/adr-710-delivery-ci-workflows-scheduled-audit.json" }
86
+ ]
87
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "adrId": "ADR-701-delivery-ci-workflows-ci-gates",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "2.0.0",
6
+ "status": "accepted",
7
+ "title": "The project's CI runs a fixed ordered required check set (mandatory tier plus the elicited subset from workflowShape.checkSet) 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 check set: which checks run, in which order, and what does 'the pipeline passed' mean. A project that changes its check set silently loses the property that the pipeline meant the same thing across two runs. Naming the check set as a decision area (not a runtime knob) is what makes the pipeline a stable contract. v2 broadens the answer surface from the fixed v1.0.0 two-gate set to a two-tier catalogue: a mandatory tier (the two v1 gates, preserved verbatim) plus an elicited tier (linter, formatter, typecheck, unitTest, securityScan) the project turns on and off through `workflowShape.checkSet`.",
9
+ "decision": "The project's CI runs a fixed ordered required check set at every workflow that carries one. The mandatory tier runs first, in order, on every check-set workflow: `validate` (running `rcf define validate`) followed by `coverage-strict` (running `rcf audit coverage --strict`). The elicited tier runs after the mandatory tier: the checks the project turned on in `workflowShape.checkSet` (default: every catalogued check on) run in a stable but non-load-bearing order documented in the guide. The pipeline passes if and only if every required check's outcome is `passed`; a `failed` or `missing` outcome on any required check fails the pipeline. Adding a check kind the catalogue does not name (mutation-testing, contract-test, accessibility scan) is a project-level or blueprint-level ADR: a project that wants an extra required check supersedes this ADR with a project-level ADR listing the extended catalogue; a future blueprint that ships a new required check (a browser-verify pack, an observability probe pack) contributes its own scope:global ADR on the `ciGates` topic and lets composition surface the pairing.",
10
+ "consequences": "The pipeline's verdict is stable across runs of the same commit under the same rcf CLI version and the same `workflowShape`. Adding a check is a visible decision (either a `workflowShape.checkSet` flag flip or a project-level ADR); changing the check catalogue itself is a v2.x major bump. A project that wants a check the catalogue does not name owes a project-level ADR that supersedes this one and names the extended catalogue; the aggregate report's `gates[]` array then reflects the extended catalogue on every run. Composing blueprints that hold an opinion on the required-check 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-check set at v2.0.0 (mandatory tier plus every plausible elicited check plus adherence packs plus browser-verify)",
19
+ "summary": "The pipeline runs every check the mechanism offers as required by default, with no elicitation surface.",
20
+ "reasonNotChosen": "The mechanism-reach principle for blueprints (authoring standard, section 7) says a blueprint should not compel a check 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. The mandatory tier plus the five elicited checks the project turns on and off is the right v2.0.0 floor."
21
+ },
22
+ {
23
+ "name": "Keep the v1.0.0 fixed two-gate set at v2",
24
+ "summary": "The check set stays at `validate` + `coverage-strict`; the elicited tier does not ship.",
25
+ "reasonNotChosen": "Lint, formatter, typecheck, unit-test, and security-scan are checks a project engineer expects to find in a general-purpose CI floor; leaving v2 at the v1 two-gate set does not close that gap and leaves every consuming project reinventing the elicited tier as a project-level ADR."
26
+ }
27
+ ],
28
+ "createdAt": "2026-08-24T00:00:00Z",
29
+ "updatedAt": "2026-08-24T00:00:00Z"
30
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
- "adrId": "ADR-702-ci-pipeline-strict-coverage-gate",
2
+ "adrId": "ADR-702-delivery-ci-workflows-strict-coverage-gate",
3
3
  "prdId": "PRD-001",
4
4
  "tadId": "TAD-001",
5
5
  "version": "1.0.0",
6
6
  "status": "accepted",
7
7
  "title": "Coverage runs as per-AC strict; shallow-any is not accepted as a substitute in the required gate set",
8
8
  "context": "The `rcf audit coverage` CLI runs in two modes: the default `shallow-any` (a REQ counts as covered when any AC on any US has any resolving TC) and the opt-in `--strict` (per-AC: every AC on every US must have a resolving TC). Shallow-any is useful for author-time exploration; it is the wrong mode for a merge-blocking gate because it hides the failure mode watchpost run4 caught in categories 5, 6, and 11 (an AC bound but no TC resolves it, and the REQ still reads as covered because some other AC's TC resolved). Choosing which coverage mode the pipeline runs is a policy decision distinct from choosing whether coverage runs at all.",
9
- "decision": "The required-gate coverage invocation is `rcf audit coverage --strict`. Every AC on every US must resolve to a TC whose testPointer points at a real test; a `covered-unresolved` or uncovered AC fails the gate. Shallow-any is not accepted as a substitute in the required-gate set. A project that needs an author-time shallow-any view for exploration runs `rcf audit coverage` locally without `--strict`; the pipeline's gate is unaffected. Composing blueprints that ship a coverage gate hold this topic (`strictCoverageGate`) and conflict here by design: a hypothetical `ci-pipeline-shallow` blueprint or a project that wants the shallow-any mode as its floor supersedes this ADR with a project-level ADR stating the reasoning.",
9
+ "decision": "The required-gate coverage invocation is `rcf audit coverage --strict`. Every AC on every US must resolve to a TC whose testPointer points at a real test; a `covered-unresolved` or uncovered AC fails the gate. Shallow-any is not accepted as a substitute in the required-gate set. A project that needs an author-time shallow-any view for exploration runs `rcf audit coverage` locally without `--strict`; the pipeline's gate is unaffected. Composing blueprints that ship a coverage gate hold this topic (`strictCoverageGate`) and conflict here by design: a hypothetical `delivery-ci-workflows-shallow` blueprint or a project that wants the shallow-any mode as its floor supersedes this ADR with a project-level ADR stating the reasoning.",
10
10
  "consequences": "Every AC the RCF chain contributes must have a TC bound in the project's own build cycle before the pipeline turns green. That is the mechanism-reach discipline the strict mode enforces: shipping an AC without a TC is caught here, not in production. Composing blueprints (this one and any coverage-shipping blueprint the ecosystem grows) conflict on `strictCoverageGate` for one project-level ADR to fix. A project that thoughtfully accepts a shallow-any floor (small project, exploration phase, no operator-facing surface yet) authors that ADR and the pipeline follows.",
11
11
  "alternativesConsidered": [
12
12
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "adrId": "ADR-703-ci-pipeline-node-only-runner",
2
+ "adrId": "ADR-703-delivery-ci-workflows-node-only-runner",
3
3
  "prdId": "PRD-001",
4
4
  "tadId": "TAD-001",
5
5
  "version": "1.0.0",
@@ -1,12 +1,12 @@
1
1
  {
2
- "adrId": "ADR-704-ci-pipeline-report-shape",
2
+ "adrId": "ADR-704-delivery-ci-workflows-report-shape",
3
3
  "prdId": "PRD-001",
4
4
  "tadId": "TAD-001",
5
- "version": "1.0.0",
5
+ "version": "2.0.0",
6
6
  "status": "accepted",
7
7
  "title": "Per-gate and aggregate reports are JSON files at stable paths under a configured report directory; missing reports are never treated as an implicit pass",
8
8
  "context": "A pipeline whose only artefact is the CI provider's own runner-log surface leaves every downstream reader (reviewer, dashboard, audit tool) parsing text or hitting the provider's artefact API. A pipeline whose reports are files at stable paths with stable schemas turns every downstream reader into a JSON reader. The reporting shape is a decision that binds the runner (TAC-701), the per-gate writer (TAC-702), the aggregate writer (TAC-703), and every future consumer.",
9
- "decision": "Every gate the suite runs writes a per-gate JSON report at `<reportDir>/<gate>.json` with a fixed key set (gate, command, toolVersion, startedAt, endedAt, durationMs, exitCode, outcome, stdout, stderr). The suite writes one aggregate JSON report at `<reportDir>/pipeline.json` with a fixed key set (verdict, trigger, startedAt, endedAt, durationMs, runner, gates[]). The default report directory is `.rcf/reports/ci/`. Both schemas are stable within a blueprint major version: additive fields are a minor bump, renamed or removed fields are a major bump. Reports are written atomically (temp file plus rename) so a killed writer leaves either the previous file or no file. A required gate whose per-gate report is missing from disk at end-of-suite is recorded in the aggregate as `outcome: missing` with a reason string, and the aggregate verdict is `failed`. A missing report is never treated as an implicit pass.",
9
+ "decision": "Every gate the suite runs writes a per-gate JSON report at `<reportDir>/<gate>.json` with a fixed key set (gate, command, toolVersion, startedAt, endedAt, durationMs, exitCode, outcome, stdout, stderr, checkKind). The v2 addition `checkKind` records the elicited-check kind (`validate`, `coverage-strict`, `linter`, `formatter`, `typecheck`, `unitTest`, `securityScan`, or `custom:<name>`); the v1 key set is preserved verbatim as a strict subset. The suite writes one aggregate JSON report at `<reportDir>/pipeline.json` with a fixed key set (verdict, trigger, startedAt, endedAt, durationMs, runner, gates[]); v2 preserves this shape unchanged. The default report directory is `.rcf/reports/ci/`. Distinct workflows write to distinct aggregate paths where their outcomes are semantically different (the release workflow writes to `.rcf/reports/ci/release.json`; the scheduled-audit workflow writes to `.rcf/reports/ci/scheduled-audit.json`); the commit-triggered aggregate stays at `.rcf/reports/ci/pipeline.json`. Both schemas are stable within a blueprint major version: additive fields are a minor bump, renamed or removed fields are a major bump. Reports are written atomically (temp file plus rename) so a killed writer leaves either the previous file or no file. A required gate whose per-gate report is missing from disk at end-of-suite is recorded in the aggregate as `outcome: missing` with a reason string, and the aggregate verdict is `failed`. A missing report is never treated as an implicit pass.",
10
10
  "consequences": "Downstream readers pick up per-run outcomes without re-running gates and without scraping the CI provider's log surface. Long-lived tools (a coverage-trend dashboard, an audit log, a merge-queue gate) depend on stable paths and stable schemas; the discipline here is what makes those tools cheap to write. The aggregate report is the single record the reviewer opens first; its `gates[]` array in fixed configured order is the ordering contract. A runner crash mid-suite (the failure mode REQ-008 closes) is visible in the aggregate rather than silently omitted. The atomic-write posture costs one extra file-system syscall per report; the truncation cap on stdout/stderr costs the tail of a very verbose gate.",
11
11
  "alternativesConsidered": [
12
12
  {
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-705-delivery-ci-workflows-elicitation-surface",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "2.0.0",
6
+ "status": "accepted",
7
+ "title": "The workflowShape elicitation surface lives in the in-repo file `.rcf/config/delivery-ci-workflows.json` at v2.0.0",
8
+ "context": "The v2 workflow set scales along four elicited dimensions the project declares once. Two candidate locations for the declaration were considered: an in-repo config file at a stable path, and a manifest-embedded per-blueprint config slot (`manifest.blueprints[<slug>].config`). The manifest slot is the natural mechanism-side home if and when rcf-lite grows a per-blueprint config surface; that facility does not ship at v2.0.0.",
9
+ "decision": "v2.0.0 requires the project to ship the `workflowShape` declaration at the stable path `.rcf/config/delivery-ci-workflows.json`. The path is documented in the blueprint guide and the mechanism does not extend the manifest for it. The workflow-materialiser reads this file on every run and refuses to boot when it is missing or malformed. If and when rcf-lite ships a per-blueprint manifest-embedded config surface, this ADR is superseded by a v2.x ADR that widens the source to accept either the manifest entry or the in-repo file (with the manifest entry taking precedence when both are present).",
10
+ "consequences": "The elicitation surface ships without waiting on a mechanism-side extension. The location is greppable and version-controllable; a project change to the workflow shape is a diff on one file. The workflow-materialiser has a single source of truth. When the manifest-embedded surface lands in the future, the migration is additive and does not break existing v2 projects.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Ship the elicitation surface manifest-embedded from v2.0.0",
14
+ "summary": "The mechanism extends `manifest.blueprints[<slug>]` with a `config` slot; the blueprint's validation runs on apply.",
15
+ "reasonNotChosen": "The mechanism-side extension is a separate rcf-lite work item outside v2.0.0's scope; blocking v2 on it delays a feature-gap fix the strongly-recommended list names as biggest."
16
+ },
17
+ {
18
+ "name": "Ship the elicitation surface as environment variables the CI provider supplies",
19
+ "summary": "The workflow-materialiser reads `RCF_BRANCH_MODEL`, `RCF_CHECK_SET`, etc. from the provider environment.",
20
+ "reasonNotChosen": "Environment variables that gate control flow break the local-parity property REQ-010 (v1) mandates and every AC that binds to the declaration would have to work equally in CI and on a developer machine. A file at a stable path in the project tree is equally available in both."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-31T00:00:00Z",
24
+ "updatedAt": "2026-08-31T00:00:00Z"
25
+ }