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,18 @@
1
+ {
2
+ "reqId": "delivery-ci-workflows-REQ-023",
3
+ "prdId": "PRD-001",
4
+ "title": "An optional scheduledAudit dimension materialises a cron-triggered workflow running the required check set on cadence",
5
+ "description": "When `workflowShape.scheduledAudit` is `true`, the workflow-materialiser produces a `scheduled-audit` workflow that fires on a cron schedule (the provider's own schedule surface) and runs the same required check set the pull-request and default-branch workflows run. When the field is `false` (default), no scheduled workflow ships. The scheduled-audit workflow writes its aggregate report to a distinct stable path (`.rcf/reports/ci/scheduled-audit.json`) so a scheduled-run outcome never overwrites the most recent commit-triggered outcome downstream readers depend on.",
6
+ "category": "functional",
7
+ "domain": "continuous-integration",
8
+ "priority": "must",
9
+ "rationale": "Dependency updates and secret rotations do not always coincide with a merge; a scheduled cadence catches drift the commit-triggered workflows would miss. Making the dimension explicit (a top-level fifth field) rather than folding it under a specific check's cadence keeps the axis general: a future need for scheduled cadence on other checks generalises to `scheduledCadence: string` without displacing the fifth dimension.",
10
+ "tags": [
11
+ "blueprint:delivery-ci-workflows",
12
+ "category:23-scheduled-audit"
13
+ ],
14
+ "version": "2.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-31T00:00:00Z",
17
+ "updatedAt": "2026-08-31T00:00:00Z"
18
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "tacId": "TAC-701-ci-pipeline-gate-runner",
2
+ "tacId": "TAC-701-delivery-ci-workflows-gate-runner",
3
3
  "prdId": "PRD-001",
4
4
  "tadId": "TAD-001",
5
5
  "version": "1.0.0",
@@ -38,13 +38,13 @@
38
38
  {
39
39
  "name": "Per-gate report writer",
40
40
  "kind": "tac",
41
- "tacId": "TAC-702-ci-pipeline-gate-report",
41
+ "tacId": "TAC-702-delivery-ci-workflows-gate-report",
42
42
  "description": "Called once per gate with the captured fields; writes the per-gate JSON report and returns the file path the aggregate writer records."
43
43
  },
44
44
  {
45
45
  "name": "Aggregate report writer",
46
46
  "kind": "tac",
47
- "tacId": "TAC-703-ci-pipeline-aggregate-report",
47
+ "tacId": "TAC-703-delivery-ci-workflows-aggregate-report",
48
48
  "description": "Called once at end-of-suite with the ordered gate records; writes the aggregate JSON report and returns the verdict and its exit code."
49
49
  },
50
50
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "tacId": "TAC-702-ci-pipeline-gate-report",
2
+ "tacId": "TAC-702-delivery-ci-workflows-gate-report",
3
3
  "prdId": "PRD-001",
4
4
  "tadId": "TAD-001",
5
5
  "version": "1.0.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "tacId": "TAC-703-ci-pipeline-aggregate-report",
2
+ "tacId": "TAC-703-delivery-ci-workflows-aggregate-report",
3
3
  "prdId": "PRD-001",
4
4
  "tadId": "TAD-001",
5
5
  "version": "1.0.0",
@@ -31,7 +31,7 @@
31
31
  {
32
32
  "name": "Per-gate report writer",
33
33
  "kind": "tac",
34
- "tacId": "TAC-702-ci-pipeline-gate-report",
34
+ "tacId": "TAC-702-delivery-ci-workflows-gate-report",
35
35
  "description": "The per-gate reports the aggregate writer reads back to confirm each report's existence and to record its relative path in the aggregate."
36
36
  }
37
37
  ],
@@ -0,0 +1,64 @@
1
+ {
2
+ "tacId": "TAC-704-delivery-ci-workflows-workflow-materialiser",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "name": "Workflow materialiser (Node reader + writer)",
8
+ "purpose": "The Node module the project realises to READ the `workflowShape` declaration from `.rcf/config/delivery-ci-workflows.json` and WRITE the provider-specific workflow files that make up the workflow set. One materialiser per project; the same code path runs locally and in CI. The materialiser is not a runtime CI job; it is a build-time authoring step the project runs when its shape changes.",
9
+ "responsibilities": [
10
+ "Read `.rcf/config/delivery-ci-workflows.json` at project root and parse it as JSON (AC-6111-1, AC-6111-2).",
11
+ "Perform the boot-check: refuse missing required fields (`branchModel`, `checkSet`, `providerHint`), refuse unrecognised values on any field, refuse `deployHandoff:<slug>` when the deploy blueprint is absent from the manifest; exit non-zero with a stable-coded error naming the offending field (AC-6112-1, AC-6112-2, AC-6122-3).",
12
+ "Expand a profile alias to the four-field composed form before any downstream reads it; refuse an unrecognised alias (AC-6113-1, AC-6113-2).",
13
+ "Compute the workflow set from `workflowShape` per the matrix in the spec (§3.2): the two commit-triggered workflows per branch model, the release workflow per `releaseMode`, the scheduled-audit workflow per `scheduledAudit` (AC-6114-1, AC-6114-2, AC-6115-1, AC-6115-2, AC-6121-1, AC-6121-2, AC-6123-1, AC-6123-2).",
14
+ "Seed the provider-specific asset directory (v2.0.0: `assets/ci-provider-examples/github-actions/`) and write one workflow file per workflow in the set to the provider's workflow path (v2.0.0: `.github/workflows/` for GHA); alternate providers translate per the four-point mapping doc.",
15
+ "Materialisation is idempotent: re-running with the same `workflowShape` writes the same files byte-for-byte; changing the shape overwrites the workflow files atomically (temp file + rename).",
16
+ "Emit a materialiser-run summary to stdout naming the workflow files produced and the elicited-check set they carry."
17
+ ],
18
+ "internalStructure": "One Node module exporting `materialise({ configPath, providerAssetDir, workflowOutDir })` and a shebang entry point invocable as `node <path>` with no required argv. The reader parses the config; the boot-check module validates each field against the recognised enumeration; the matrix module computes the workflow set from the composed shape; the writer module reads the provider asset templates, substitutes the required check set into the gate-runner invocation line, and writes the workflow files atomically.",
19
+ "interfaces": [
20
+ {
21
+ "name": "materialise",
22
+ "kind": "factory",
23
+ "description": "materialise({ configPath, providerAssetDir, workflowOutDir }) -> Promise<{ workflowsWritten: string[], summary: object }>; the sole callable the entry point invokes. Reads the config, runs the boot-check, computes the matrix, writes the workflows."
24
+ },
25
+ {
26
+ "name": "workflow-shape",
27
+ "kind": "value",
28
+ "description": "The parsed and composed `workflowShape`: `{ branchModel, checkSet, releaseMode, providerHint, scheduledAudit, trunkPullRequests }` with alias expansion applied and `releaseMode` defaulted to `none` when absent."
29
+ },
30
+ {
31
+ "name": "entry-point CLI",
32
+ "kind": "cli",
33
+ "description": "`node <entryPointPath>` with no required argv. Optional flag `--config <path>` overrides the default config path; `--out <path>` overrides the default workflow output directory. Exit code is 0 on success and non-zero (with the boot-check error code) on any refused input."
34
+ }
35
+ ],
36
+ "dependencies": [
37
+ {
38
+ "name": "Gate runner",
39
+ "kind": "tac",
40
+ "tacId": "TAC-701-delivery-ci-workflows-gate-runner",
41
+ "description": "The materialiser writes workflow files whose command line invokes the gate-runner Node entry point with the elicited check set. The materialiser does not import the runner; it invokes the runner as a separate Node process at CI time."
42
+ },
43
+ {
44
+ "name": "Release workflow",
45
+ "kind": "tac",
46
+ "tacId": "TAC-705-delivery-ci-workflows-release-workflow",
47
+ "description": "The materialiser produces the release workflow file whose steps satisfy the release-workflow TAC per the elicited `releaseMode`."
48
+ },
49
+ {
50
+ "name": "Scheduled audit",
51
+ "kind": "tac",
52
+ "tacId": "TAC-706-delivery-ci-workflows-scheduled-audit",
53
+ "description": "The materialiser produces the scheduled-audit workflow file whose cron trigger satisfies the scheduled-audit TAC when `scheduledAudit: true`."
54
+ },
55
+ {
56
+ "name": "Manifest reader",
57
+ "kind": "external",
58
+ "description": "The materialiser reads `rcf/manifest.json` to perform the `deployHandoff` manifest boot-check (AC-6122-3); refusal names the missing slug and the resolution command."
59
+ }
60
+ ],
61
+ "tradeoffs": "A build-time materialiser costs an extra step in the project's onboarding (running `node <entryPointPath>` after editing the config) but buys byte-identical workflow files across two runs of the same shape, which is the property downstream tools (a diff-review, a CI-config-verifier) depend on. Writing to the provider workflow path (not a `dist/` directory) means the workflow files are committed and reviewable; the shape declaration and the materialised output are both under source control.",
62
+ "createdAt": "2026-08-31T00:00:00Z",
63
+ "updatedAt": "2026-08-31T00:00:00Z"
64
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "tacId": "TAC-705-delivery-ci-workflows-release-workflow",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "name": "Release workflow (Node step orchestrator)",
8
+ "purpose": "The Node-side orchestrator the release workflow file invokes to run the release-flow steps per the elicited `releaseMode`. Owns the sequence: create release entity (all modes except `none`), run artefact-publish (from `tagPlusArtefact`), dispatch deploy promote workflow (`deployHandoff` only), aggregate the outcome into `.rcf/reports/ci/release.json`.",
9
+ "responsibilities": [
10
+ "Read the elicited `releaseMode` from the release workflow environment (the workflow file passes it in as an argument or an env var; the orchestrator does not read the config file at CI time).",
11
+ "When `releaseMode` is `tagOnly`, `tagPlusArtefact`, or `deployHandoff:<slug>`, create the release entity on the CI provider's release surface (AC-6121-2 the first sentence).",
12
+ "When `releaseMode` is `tagPlusArtefact` or `deployHandoff:<slug>`, invoke the project-realised artefact-publish step and capture the just-published version identifier (AC-6121-2 the second sentence).",
13
+ "When `releaseMode` is `deployHandoff:<slug>`, dispatch the named deploy blueprint's `promote` workflow via `workflow_dispatch`, passing the just-published version identifier as the `versionId` input; wait on the promote workflow's outcome (AC-6122-1).",
14
+ "Aggregate the outcome into `.rcf/reports/ci/release.json`: the release workflow's aggregate outcome is `passed` only when every step (tag creation, artefact publish where applicable, promote workflow outcome where applicable) is `passed` (AC-6122-2, AC-6121-3).",
15
+ "The release workflow does NOT invoke the gate-runner entry point; the check set already ran on the default-branch-checks workflow at the commit the release points at (AC-6121-3)."
16
+ ],
17
+ "internalStructure": "One Node module exporting `runRelease({ releaseMode, deployTarget, artefactStep })` and a shebang entry point invocable as `node <path>` with argv naming the release mode. The orchestrator sequences the steps as a fixed pipeline: `create-release-entity`, `publish-artefact` (conditional), `dispatch-promote` (conditional), `aggregate-report`. Each step writes its own per-step JSON record to `.rcf/reports/ci/release/<step>.json`; the aggregator gathers them into `.rcf/reports/ci/release.json`.",
18
+ "interfaces": [
19
+ {
20
+ "name": "runRelease",
21
+ "kind": "factory",
22
+ "description": "runRelease({ releaseMode, deployTarget, artefactStep }) -> Promise<{ verdict, versionId, releaseReportPath }>; the sole callable the release workflow file invokes."
23
+ },
24
+ {
25
+ "name": "release-mode",
26
+ "kind": "value",
27
+ "description": "One of `tagOnly`, `tagPlusArtefact`, `deployHandoff:<slug>`. The `none` mode never reaches the orchestrator because the release workflow itself is not materialised."
28
+ },
29
+ {
30
+ "name": "entry-point CLI",
31
+ "kind": "cli",
32
+ "description": "`node <entryPointPath> --mode <releaseMode>` with the release mode as required argv. Exit code is 0 on `verdict: passed` and non-zero on `verdict: failed`."
33
+ }
34
+ ],
35
+ "dependencies": [
36
+ {
37
+ "name": "Deploy promote workflow",
38
+ "kind": "external",
39
+ "description": "For `deployHandoff:<slug>`, the deploy blueprint's `promote` workflow exposed via `workflow_dispatch` with a `versionId` input. The release orchestrator does not import the deploy blueprint; it dispatches the workflow through the CI provider's workflow-dispatch API."
40
+ },
41
+ {
42
+ "name": "Aggregate report writer",
43
+ "kind": "tac",
44
+ "tacId": "TAC-703-delivery-ci-workflows-aggregate-report",
45
+ "description": "The release workflow aggregate reuses the aggregate-report writer shape with the release-flow gate list in place of the check-set gate list."
46
+ }
47
+ ],
48
+ "tradeoffs": "Splitting the release workflow orchestrator from the commit-triggered gate-runner means two Node entry points, not one. The alternative (one runner that switches on trigger kind) conflates two distinct control flows: the commit-triggered gate set is a fixed check catalogue; the release-triggered flow is a variable pipeline whose step set depends on `releaseMode`. Keeping them separate makes each one's AC contract legible.",
49
+ "createdAt": "2026-08-31T00:00:00Z",
50
+ "updatedAt": "2026-08-31T00:00:00Z"
51
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "tacId": "TAC-706-delivery-ci-workflows-scheduled-audit",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "name": "Scheduled audit runner (cron-triggered gate invocation)",
8
+ "purpose": "The Node-side entry point the scheduled-audit workflow file invokes on a cron schedule. Runs the same required check set the commit-triggered workflows run, writes the aggregate report to a distinct stable path (`.rcf/reports/ci/scheduled-audit.json`) so scheduled-run outcomes never overwrite commit-triggered outcomes.",
9
+ "responsibilities": [
10
+ "Invoke the gate-runner entry point (TAC-701) with the required check set the project has elicited in `workflowShape.checkSet`, plus the mandatory tier (AC-6123-1).",
11
+ "Override the aggregate report path so the aggregate lands at `.rcf/reports/ci/scheduled-audit.json`, distinct from the commit-triggered `.rcf/reports/ci/pipeline.json` (AC-6123-1).",
12
+ "Do not ship when `workflowShape.scheduledAudit` is `false` or absent (the workflow-materialiser refuses to write the workflow file; the runner is not invoked because the workflow does not exist) (AC-6123-2)."
13
+ ],
14
+ "internalStructure": "A thin Node wrapper around the gate-runner entry point that overrides the aggregate report path and forwards the elicited check set. The wrapper is a shebang entry point invocable as `node <path>` with no required argv; the workflow file passes `--report-path .rcf/reports/ci/scheduled-audit.json` as its optional argument.",
15
+ "interfaces": [
16
+ {
17
+ "name": "runScheduledAudit",
18
+ "kind": "factory",
19
+ "description": "runScheduledAudit({ checkSet, reportPath }) -> Promise<{ verdict, exitCode, aggregateReportPath }>; the sole callable the entry point invokes."
20
+ },
21
+ {
22
+ "name": "entry-point CLI",
23
+ "kind": "cli",
24
+ "description": "`node <entryPointPath> --check-set <checkSet> --report-path <path>` with the elicited check set as required argv and the report path as an optional override. Exit code is the aggregate exit code."
25
+ }
26
+ ],
27
+ "dependencies": [
28
+ {
29
+ "name": "Gate runner",
30
+ "kind": "tac",
31
+ "tacId": "TAC-701-delivery-ci-workflows-gate-runner",
32
+ "description": "The scheduled runner invokes the gate-runner Node entry point with the required check set; the check-set contract and the report shape are shared."
33
+ }
34
+ ],
35
+ "tradeoffs": "A distinct report path for the scheduled-audit workflow costs one extra path in the downstream reader's ingest logic; that cost buys the property that a scheduled-run outcome never overwrites the record of the most recent commit-triggered outcome. The alternative (writing to the same path) would collapse two distinct concerns into one file whose meaning shifts based on which workflow wrote it last.",
36
+ "createdAt": "2026-08-31T00:00:00Z",
37
+ "updatedAt": "2026-08-31T00:00:00Z"
38
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6101",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-001",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The commit-triggered workflows run the required check set on every branch-model-defined trigger event",
8
+ "asA": "operator on an rcf-lite project with delivery-ci-workflows v2 applied",
9
+ "iWant": "the commit-triggered workflows the materialiser produced (pull-request-checks and default-branch-checks per the elicited branch model) to run the required check set on every trigger event that branch model defines",
10
+ "soThat": "no change reaches the default or trunk branch without the RCF chain, its coverage, and every enabled elicited check having been verified against the tree at the head commit",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6101-1",
14
+ "description": "The CI provider's jobs for the commit-triggered workflows are triggered by the trigger events the branch model defines: for feature-branch, pushes to the default branch and pull requests opened, synchronised, or reopened against the default branch; for trunk-based, pushes to the trunk branch and (in the `trunkPullRequests: sometimes` sub-shape) pull requests targeting the trunk branch. The trigger configuration is committed under source control, not set through a provider UI.",
15
+ "given": "the project's materialised workflow files and repository state at the head commit",
16
+ "when": "a trigger event fires that the elicited branch model names",
17
+ "then": "the aggregate pipeline report at the configured stable path (default `.rcf/reports/ci/pipeline.json`) is written by the resulting CI job, and its `trigger` field records the event kind and the workflow that ran",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6101-2",
23
+ "description": "The merge policy blocks a merge whose most recent aggregate pipeline run did not exit zero. The block is enforced by the repository's branch protection or the equivalent platform policy per the branch-model AC binding (AC-6114-3 for feature-branch; AC-6115-1 or AC-6115-2 for trunk-based).",
24
+ "given": "a change (a pull request in feature-branch or the with-PR trunk sub-shape, or a direct push in the trunk without-PR sub-shape) whose most recent aggregate pipeline run's report records `verdict: failed`",
25
+ "when": "the operator or an automated merge tool attempts to admit the change through the standard merge or push path",
26
+ "then": "the platform refuses the change, and the refusal reason references the failed required check that corresponds to the workflow that ran",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-703-delivery-ci-workflows-aggregate-report"
34
+ ],
35
+ "createdAt": "2026-08-24T00:00:00Z",
36
+ "updatedAt": "2026-08-24T00:00:00Z"
37
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6102",
2
+ "usId": "delivery-ci-workflows-US-6102",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-002",
4
+ "reqId": "delivery-ci-workflows-REQ-002",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "The gate suite is invoked as one Node entry point that any CI provider can run",
@@ -29,7 +29,7 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner"
32
+ "TAC-701-delivery-ci-workflows-gate-runner"
33
33
  ],
34
34
  "createdAt": "2026-08-24T00:00:00Z",
35
35
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6103",
2
+ "usId": "delivery-ci-workflows-US-6103",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-003",
4
+ "reqId": "delivery-ci-workflows-REQ-003",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "The suite runs the validate gate and fails the pipeline on any non-zero exit",
@@ -29,8 +29,8 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner",
33
- "TAC-702-ci-pipeline-gate-report"
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-702-delivery-ci-workflows-gate-report"
34
34
  ],
35
35
  "createdAt": "2026-08-24T00:00:00Z",
36
36
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6104",
2
+ "usId": "delivery-ci-workflows-US-6104",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-004",
4
+ "reqId": "delivery-ci-workflows-REQ-004",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "The suite runs per-AC strict coverage and fails the pipeline on any gap",
@@ -29,8 +29,8 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner",
33
- "TAC-702-ci-pipeline-gate-report"
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-702-delivery-ci-workflows-gate-report"
34
34
  ],
35
35
  "createdAt": "2026-08-24T00:00:00Z",
36
36
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -1,8 +1,8 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6105",
2
+ "usId": "delivery-ci-workflows-US-6105",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-005",
5
- "version": "1.0.0",
4
+ "reqId": "delivery-ci-workflows-REQ-005",
5
+ "version": "2.0.0",
6
6
  "status": "approved",
7
7
  "title": "Every gate leaves a machine-readable JSON report at a stable path",
8
8
  "asA": "downstream reader of the pipeline (a reviewer, a dashboard, an audit tool)",
@@ -11,10 +11,10 @@
11
11
  "acceptanceCriteria": [
12
12
  {
13
13
  "id": "AC-6105-1",
14
- "description": "Every gate the suite runs writes a JSON report file at `<reportDir>/<gate>.json` whether the gate passed or failed. The report carries a fixed set of fields: `gate`, `command`, `toolVersion`, `startedAt`, `endedAt`, `durationMs`, `exitCode`, `outcome`, `stdout`, `stderr`.",
14
+ "description": "Every gate the suite runs writes a JSON report file at `<reportDir>/<gate>.json` whether the gate passed or failed. The report carries a fixed set of fields: `gate`, `command`, `toolVersion`, `startedAt`, `endedAt`, `durationMs`, `exitCode`, `outcome`, `stdout`, `stderr`, and (v2 addition) `checkKind`.",
15
15
  "given": "the suite has run against any tree",
16
16
  "when": "the reviewer inspects the configured report directory after the run",
17
- "then": "for every gate named in the aggregate report's `gates[]` array, a file at `<reportDir>/<gate>.json` exists whose top-level keys are exactly the fixed set above, and the value types match the stable schema (`startedAt` and `endedAt` are ISO-8601 strings, `durationMs` is an integer, `exitCode` is an integer, `outcome` is one of `passed` or `failed`)",
17
+ "then": "for every gate named in the aggregate report's `gates[]` array, a file at `<reportDir>/<gate>.json` exists whose top-level keys are exactly the fixed set above, and the value types match the stable schema (`startedAt` and `endedAt` are ISO-8601 strings, `durationMs` is an integer, `exitCode` is an integer, `outcome` is one of `passed` or `failed`, `checkKind` is one of `validate`, `coverage-strict`, `linter`, `formatter`, `typecheck`, `unitTest`, `securityScan`, or a `custom:<name>` string)",
18
18
  "testable": true,
19
19
  "scope": "runtime"
20
20
  },
@@ -29,7 +29,7 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-702-ci-pipeline-gate-report"
32
+ "TAC-702-delivery-ci-workflows-gate-report"
33
33
  ],
34
34
  "createdAt": "2026-08-24T00:00:00Z",
35
35
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6106",
2
+ "usId": "delivery-ci-workflows-US-6106",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-006",
4
+ "reqId": "delivery-ci-workflows-REQ-006",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "The suite emits an aggregate pipeline report at a stable path",
@@ -29,7 +29,7 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-703-ci-pipeline-aggregate-report"
32
+ "TAC-703-delivery-ci-workflows-aggregate-report"
33
33
  ],
34
34
  "createdAt": "2026-08-24T00:00:00Z",
35
35
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6107",
2
+ "usId": "delivery-ci-workflows-US-6107",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-007",
4
+ "reqId": "delivery-ci-workflows-REQ-007",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "A gate failure surfaces the failing gate and its report path in the operator-visible output",
@@ -14,7 +14,7 @@
14
14
  "description": "On any gate failure, the Node entry point writes an operator-readable failure summary to its own stderr naming the failing gate, its exit code, and the relative path to the per-gate report file.",
15
15
  "given": "an invocation of the suite whose `validate` (or any) gate fails",
16
16
  "when": "the reviewer reads the runner-log tail (the Node process's own stderr)",
17
- "then": "the tail contains a single-line summary matching the shape `[ci-pipeline] gate '<gate>' failed (exit <n>); report: <reportDir>/<gate>.json`, and the reference report file exists at the named path",
17
+ "then": "the tail contains a single-line summary matching the shape `[delivery-ci-workflows] gate '<gate>' failed (exit <n>); report: <reportDir>/<gate>.json`, and the reference report file exists at the named path",
18
18
  "testable": true,
19
19
  "scope": "runtime"
20
20
  },
@@ -29,8 +29,8 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner",
33
- "TAC-703-ci-pipeline-aggregate-report"
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-703-delivery-ci-workflows-aggregate-report"
34
34
  ],
35
35
  "createdAt": "2026-08-24T00:00:00Z",
36
36
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6108",
2
+ "usId": "delivery-ci-workflows-US-6108",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-008",
4
+ "reqId": "delivery-ci-workflows-REQ-008",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "A missing gate report is never treated as an implicit pass",
@@ -29,8 +29,8 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner",
33
- "TAC-703-ci-pipeline-aggregate-report"
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-703-delivery-ci-workflows-aggregate-report"
34
34
  ],
35
35
  "createdAt": "2026-08-24T00:00:00Z",
36
36
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6109",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-009",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The blueprint ships one illustrative GitHub Actions workflow file per workflow the matrix materialises; alternate providers wire the same entry points",
8
+ "asA": "operator setting up CI on an rcf-lite project for the first time",
9
+ "iWant": "one worked example per workflow the matrix materialises so I have a copy-paste starting point for every trigger, setup, invoke, and artefact-upload shape",
10
+ "soThat": "I get a working workflow set on GHA out of the box and a stable mapping to other providers",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6109-1",
14
+ "description": "The applied blueprint's source path (recorded on `manifest.blueprints[delivery-ci-workflows].source`) contains one illustrative GitHub Actions workflow file per workflow in the matrix under `assets/ci-provider-examples/github-actions/`. At the widest shape the files are `pull-request-checks.yml`, `default-branch-checks.yml`, `release.yml`, and `scheduled-audit.yml`. Each workflow defines the required trigger set for its workflow, sets up Node and the package manager, installs dependencies, invokes the corresponding Node entry point as a single command line, and uploads the corresponding report directory or file as a workflow artefact.",
15
+ "given": "an rcf-lite project that has applied this blueprint",
16
+ "when": "the operator opens the blueprint's source path and reads the files under `assets/ci-provider-examples/github-actions/`",
17
+ "then": "the four workflow files exist at that path, each file's `on:` block names the trigger set corresponding to its workflow, each file's steps include a Node setup and a package-manager setup, one step per file invokes the appropriate Node entry point as a single `node <path>` line (or a package-manager script that resolves to the same), and a final step uploads the corresponding report path as a workflow artefact",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6109-2",
23
+ "description": "The applied blueprint's guide names GitLab CI, CircleCI, Buildkite, and Jenkins as equally supported providers, states the mapping (job trigger, Node setup, single-line entry-point invocation, artefact upload) applied to each workflow in the matrix, and states that the blueprint does not ship provider-specific configuration for those runners in v2.0.0.",
24
+ "given": "an rcf-lite project that has applied this blueprint",
25
+ "when": "the operator opens `guide/delivery-ci-workflows.md` from the blueprint's source path",
26
+ "then": "the guide's `when to reach for it` or an adjacent section names GitLab CI, CircleCI, Buildkite, and Jenkins by name, describes the four mapping points applied to each workflow the matrix materialises, and states that no provider-specific configuration file for those runners is shipped by the blueprint at v2.0.0",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-701-delivery-ci-workflows-gate-runner"
33
+ ],
34
+ "createdAt": "2026-08-24T00:00:00Z",
35
+ "updatedAt": "2026-08-24T00:00:00Z"
36
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
- "usId": "ci-pipeline-US-6110",
2
+ "usId": "delivery-ci-workflows-US-6110",
3
3
  "prdId": "PRD-001",
4
- "reqId": "ci-pipeline-REQ-010",
4
+ "reqId": "delivery-ci-workflows-REQ-010",
5
5
  "version": "1.0.0",
6
6
  "status": "approved",
7
7
  "title": "The gate suite entry point runs the same code path locally as in CI",
@@ -29,7 +29,7 @@
29
29
  }
30
30
  ],
31
31
  "tacIds": [
32
- "TAC-701-ci-pipeline-gate-runner"
32
+ "TAC-701-delivery-ci-workflows-gate-runner"
33
33
  ],
34
34
  "createdAt": "2026-08-24T00:00:00Z",
35
35
  "updatedAt": "2026-08-24T00:00:00Z"
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6111",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-011",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The project declares its workflow shape in a stable in-repo file the materialiser reads",
8
+ "asA": "operator standing up an rcf-lite project with the delivery-ci-workflows blueprint applied",
9
+ "iWant": "to declare my project's CI workflow shape once in a stable in-repo configuration file that the workflow-materialiser reads on every run",
10
+ "soThat": "the workflow set my project produces is a function of a checked-in declaration, not a hidden default or an operator's memory",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6111-1",
14
+ "description": "The workflow-materialiser reads its input `workflowShape` from the stable path `.rcf/config/delivery-ci-workflows.json` on the project tree. The reader path is documented in the blueprint guide and does not vary with CI provider.",
15
+ "given": "a project that has applied delivery-ci-workflows v2 and populated `.rcf/config/delivery-ci-workflows.json`",
16
+ "when": "the workflow-materialiser runs (locally or in CI)",
17
+ "then": "the materialiser reads the file at the documented path and treats its `workflowShape` as authoritative",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6111-2",
23
+ "description": "The three required fields (`branchModel`, `checkSet`, `providerHint`), the optional `releaseMode` field (absent has the same effect as `releaseMode: none`, per Q6-B ratification), the optional `scheduledAudit` fifth field, and the optional `trunkPullRequests` sub-field are the complete surface the materialiser reads. No other field the file carries is interpreted by v2.0.0; unknown fields are ignored (forward-compatibility).",
24
+ "given": "a `workflowShape` declaration carrying the three required fields, the optional fields, and additional unknown fields",
25
+ "when": "the workflow-materialiser reads the file",
26
+ "then": "the materialiser processes the recognised fields and ignores the unknown fields without failing the boot-check",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser"
33
+ ],
34
+ "createdAt": "2026-08-31T00:00:00Z",
35
+ "updatedAt": "2026-08-31T00:00:00Z"
36
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6112",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-012",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "A missing or unrecognised workflowShape field fails fast with a stable-coded error",
8
+ "asA": "operator maintaining a project on delivery-ci-workflows v2",
9
+ "iWant": "the workflow-materialiser to refuse to run when its input `workflowShape` is missing a required field or carries an unrecognised value",
10
+ "soThat": "a misconfiguration is caught at boot with a message I can match on, not by a subtly wrong-shaped workflow set landing on disk",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6112-1",
14
+ "description": "A `workflowShape` missing any of the three required fields (`branchModel`, `checkSet`, `providerHint`) causes the workflow-materialiser to exit non-zero with a stable error code and a message naming the missing field. `releaseMode` being absent does NOT fail the boot-check (per Q6-B ratification): the materialiser treats absent `releaseMode` as `releaseMode: none` and ships no release workflow. No workflow file is written when the boot-check does fail.",
15
+ "given": "a `workflowShape` declaration whose `providerHint` field is absent (or any of the three required fields)",
16
+ "when": "the workflow-materialiser boots",
17
+ "then": "the materialiser exits non-zero, prints an error naming the missing field with a stable code, and leaves the provider's workflow directory unchanged",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6112-2",
23
+ "description": "A required field whose value is not in the recognised enumeration for that field causes the same failure shape: non-zero exit, stable-coded error, no workflow file written.",
24
+ "given": "a `workflowShape` carrying `branchModel: hybrid` (a value the enumeration does not include)",
25
+ "when": "the workflow-materialiser boots",
26
+ "then": "the materialiser exits non-zero, prints an error naming the field, the value received, and the recognised set, with a stable code",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser"
33
+ ],
34
+ "createdAt": "2026-08-31T00:00:00Z",
35
+ "updatedAt": "2026-08-31T00:00:00Z"
36
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6113",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-013",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "A named profile alias expands to the four-field workflowShape before any consumer reads it",
8
+ "asA": "operator standing up a small library project on delivery-ci-workflows v2",
9
+ "iWant": "to declare my workflow shape as a named profile alias (`smallLibrary`, `smallService`, `internalPackage`, `trunkLibrary`) rather than filling four fields explicitly",
10
+ "soThat": "the common cases stay short while every downstream still sees one authoritative representation",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6113-1",
14
+ "description": "A `workflowShape` declared as `{ \"alias\": \"smallLibrary\" }` is expanded at boot to the four-field form (`branchModel: feature`, `checkSet: <all-true>`, `releaseMode: tagPlusArtefact`, `providerHint: githubActions`). Every downstream in this blueprint binds to the four-field form.",
15
+ "given": "a `workflowShape` declaration carrying only the alias field with value `smallLibrary`",
16
+ "when": "the workflow-materialiser boots",
17
+ "then": "the materialiser expands the alias to the four-field composition, records the expansion in its own log, and treats the four-field form as authoritative for materialisation",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6113-2",
23
+ "description": "An alias name that the shipped set does not include causes a boot-check failure with a stable-coded error naming the alias and listing the shipped set. A project that wants a shape the aliases do not cover uses the four-field form directly.",
24
+ "given": "a `workflowShape` declared as `{ \"alias\": \"microservice\" }`",
25
+ "when": "the workflow-materialiser boots",
26
+ "then": "the materialiser exits non-zero with a stable-coded error naming the alias, the shipped-set list, and the four-field form as the fallback",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser"
33
+ ],
34
+ "createdAt": "2026-08-31T00:00:00Z",
35
+ "updatedAt": "2026-08-31T00:00:00Z"
36
+ }