rcf-lite 0.13.0 → 0.15.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 (166) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/bin/rcf.js +3 -1
  3. package/bin/view-supervisor-child.mjs +0 -0
  4. package/blueprints/application-api-rest/docs/topics.md +1 -1
  5. package/blueprints/application-spa/README.md +3 -3
  6. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
  7. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
  8. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +7 -7
  9. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +7 -7
  10. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +8 -8
  11. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +8 -8
  12. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +8 -8
  13. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +2 -2
  14. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +2 -2
  15. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +2 -2
  16. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +2 -2
  17. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +3 -3
  18. package/blueprints/application-spa/docs/topics.md +1 -1
  19. package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
  20. package/blueprints/delivery-ci-workflows/README.md +61 -0
  21. package/blueprints/delivery-ci-workflows/assets/bootstrap/README.md +26 -0
  22. package/blueprints/delivery-ci-workflows/assets/bootstrap/adr-bootstrap-coverage-supersession.template.json +28 -0
  23. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +61 -0
  24. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +74 -0
  25. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +75 -0
  26. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +65 -0
  27. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
  28. package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/per-gate.json +3 -2
  29. package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
  30. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
  31. 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} +4 -4
  32. 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
  33. 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
  34. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
  35. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
  36. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
  37. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
  38. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
  39. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
  40. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
  41. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-002.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json} +2 -2
  42. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-003.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json} +2 -2
  43. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-004.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json} +2 -2
  44. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-005.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json} +4 -4
  45. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-006.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json} +2 -2
  46. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-007.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json} +2 -2
  47. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-008.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json} +2 -2
  48. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
  49. package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-010.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json} +2 -2
  50. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
  51. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
  52. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
  53. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
  54. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
  55. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
  56. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
  57. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
  58. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
  59. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
  60. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
  61. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
  62. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
  63. 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} +5 -5
  64. 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
  65. 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
  66. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +67 -0
  67. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
  68. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
  69. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. 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
  77. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
  78. 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
  79. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
  80. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
  81. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
  82. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
  83. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
  84. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
  85. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
  86. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
  87. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
  88. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
  89. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
  90. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
  91. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
  92. package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
  93. package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +174 -0
  94. package/blueprints/deploy-cloudflare-workers/docs/topics.md +3 -3
  95. package/blueprints/email-smtp-resend/docs/topics.md +1 -1
  96. package/blueprints/observability-essentials/README.md +2 -2
  97. package/blueprints/observability-essentials/docs/topics.md +5 -5
  98. package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
  99. package/blueprints/persistence-data-d1/README.md +2 -2
  100. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +1 -1
  101. package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +1 -1
  102. package/blueprints/persistence-data-d1/docs/topics.md +2 -2
  103. package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +1 -1
  104. package/blueprints/persistence-data-sqlite/README.md +1 -1
  105. package/blueprints/persistence-data-sqlite/docs/topics.md +1 -1
  106. package/blueprints/security-auth-clerk/README.md +5 -3
  107. package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
  108. package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
  109. package/blueprints/security-auth-clerk/blueprint.json +1 -1
  110. package/blueprints/security-auth-clerk/docs/topics.md +2 -2
  111. package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +9 -0
  112. package/blueprints/security-auth-keycloak/docs/topics.md +2 -2
  113. package/blueprints/security-auth-magic-link/README.md +1 -1
  114. package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
  115. package/blueprints/security-auth-oauth2/README.md +1 -1
  116. package/blueprints/security-auth-oauth2/docs/topics.md +2 -2
  117. package/blueprints/security-secrets-management/README.md +1 -1
  118. package/blueprints/security-secrets-management/docs/topics.md +3 -3
  119. package/guidance/build-cycle-playbook.md +2 -2
  120. package/guidance/document-model.md +1 -1
  121. package/guidance/harness-template.md +13 -0
  122. package/guidance/managed/agent-instructions-block.hash +1 -1
  123. package/guidance/managed/agent-instructions-block.md +13 -0
  124. package/package.json +15 -14
  125. package/rcf/adrs/adr-001.json +1 -1
  126. package/rcf/adrs/adr-009.json +1 -1
  127. package/rcf/build-sequence.json +1 -1
  128. package/rcf/manifest.json +2 -2
  129. package/rcf/prd.json +2 -2
  130. package/releases/releases.yaml +126 -0
  131. package/src/blueprint/apply.js +60 -13
  132. package/src/blueprint/index.js +12 -0
  133. package/src/blueprint/library-loader.js +292 -0
  134. package/src/blueprint/library-registry.js +341 -0
  135. package/src/blueprint/list.js +38 -4
  136. package/src/blueprint/shelf-resolver.js +144 -31
  137. package/src/blueprint/supersede.js +56 -13
  138. package/src/cli/blueprint-library.js +447 -0
  139. package/src/cli/blueprint.js +50 -9
  140. package/src/cli/guidance.js +1 -1
  141. package/src/cli/help.js +27 -1
  142. package/src/cli/version.js +673 -0
  143. package/src/cli/view.js +282 -1
  144. package/src/server/index.js +3 -0
  145. package/src/server/routes.js +15 -1
  146. package/src/server/scope-endpoint.js +105 -0
  147. package/src/view/live-client.js +253 -6
  148. package/src/view/scope.js +231 -0
  149. package/src/view/style.css +42 -0
  150. package/blueprints/ci-pipeline/README.md +0 -49
  151. package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +0 -61
  152. package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +0 -50
  153. package/blueprints/ci-pipeline/blueprint.json +0 -46
  154. package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +0 -25
  155. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +0 -18
  156. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +0 -18
  157. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +0 -37
  158. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +0 -36
  159. package/blueprints/ci-pipeline/docs/topics.md +0 -49
  160. package/blueprints/ci-pipeline/guide/ci-pipeline.md +0 -79
  161. package/rcf/.identity/profile.md +0 -37
  162. package/rcf/knowledge/INDEX.md +0 -12
  163. package/rcf/knowledge/README.md +0 -41
  164. package/rcf/knowledge/docs/.gitkeep +0 -0
  165. package/rcf/knowledge/notes/.gitkeep +0 -0
  166. /package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/pipeline.json +0 -0
@@ -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` field, the optional `trunkPullRequests` sub-field, and the optional substitution-surface fields `defaultBranch` (default `main`), `trunkBranch` (default `main`), and `packageManager` (default `pnpm`; recognised set `pnpm`, `npm`, `yarn`, `bun`) are the complete surface the workflow-materialiser reads. No other field the file carries is interpreted at this version; 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 (including the substitution-surface trio) 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
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6114",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-014",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The feature-branch shape materialises pull-request-checks and default-branch-checks",
8
+ "asA": "operator on a feature-branch project with delivery-ci-workflows v2 applied",
9
+ "iWant": "the workflow-materialiser to produce two workflows (pull-request-checks and default-branch-checks) sharing the same required check set",
10
+ "soThat": "every push to the default branch and every pull request against it is gated identically and my merge policy has one aggregate to bind to",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6114-1",
14
+ "description": "With `workflowShape.branchModel: feature`, the materialiser produces a `pull-request-checks` workflow triggered by pull requests targeting the configured default branch (`workflowShape.defaultBranch`, default `main`). The workflow invokes the Node gate-runner entry point (TAC-701) with the required check set (mandatory tier plus every `checkSet` flag set true).",
15
+ "given": "a `workflowShape` with `branchModel: feature`, `defaultBranch: develop`, and every `checkSet` flag true",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "a `pull-request-checks` workflow file lands at the provider's workflow path, its trigger's branch list names `develop` (the configured default branch, not the placeholder marker and not a hard-coded `main`), and its command line invokes the Node gate-runner entry point with the required check set",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6114-2",
23
+ "description": "With `branchModel: feature`, the materialiser additionally produces a `default-branch-checks` workflow triggered by pushes to the configured default branch. The workflow invokes the same Node gate-runner entry point on the same required check set.",
24
+ "given": "the same `workflowShape` (`branchModel: feature`, `defaultBranch: develop`)",
25
+ "when": "the workflow-materialiser runs",
26
+ "then": "a `default-branch-checks` workflow file lands at the provider's workflow path, its trigger's branch list names `develop`, and its command line invokes the Node gate-runner entry point with the required check set",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-6114-3",
32
+ "description": "The AC contract requires the project to configure default-branch protection (or the platform equivalent) to require the `pull-request-checks` aggregate as a merge-blocking check. The blueprint states the property; the configuration itself lives on the platform surface.",
33
+ "given": "a feature-branch project with the two workflows materialised",
34
+ "when": "a pull request whose most recent `pull-request-checks` aggregate report records `verdict: failed` is submitted for merge",
35
+ "then": "the platform refuses the merge and the refusal reason references the failed `pull-request-checks` required check",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
42
+ "TAC-701-delivery-ci-workflows-gate-runner"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6115",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-015",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The trunk shape materialises default-branch-checks and optionally pull-request-checks",
8
+ "asA": "operator on a trunk-based project with delivery-ci-workflows v2 applied",
9
+ "iWant": "the workflow-materialiser to produce `default-branch-checks` always, plus `pull-request-checks` when I opt into the sub-shape",
10
+ "soThat": "my trunk-based project gates every commit to trunk and only ships a PR workflow when I actually use PRs",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6115-1",
14
+ "description": "With `workflowShape.branchModel: trunk` and `trunkPullRequests` absent or `never`, the materialiser produces `default-branch-checks` only, triggered by pushes to the configured trunk branch (`workflowShape.trunkBranch`, default `main`). The `pull-request-checks` workflow does not ship in this shape.",
15
+ "given": "a `workflowShape` with `branchModel: trunk`, `trunkBranch: trunk`, and no `trunkPullRequests` field",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "a `default-branch-checks` workflow file lands at the provider's workflow path, its trigger's branch list names `trunk` (the configured trunk branch), no `pull-request-checks` workflow file lands, and the merge-policy AC binds to the trunk-branch push-protection property",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6115-2",
23
+ "description": "With `branchModel: trunk` and `trunkPullRequests: sometimes`, the materialiser additionally produces `pull-request-checks` on the same required check set as `default-branch-checks`, both triggered against the configured trunk branch.",
24
+ "given": "a `workflowShape` with `branchModel: trunk`, `trunkBranch: trunk`, and `trunkPullRequests: sometimes`",
25
+ "when": "the workflow-materialiser runs",
26
+ "then": "both workflow files land at the provider's workflow path with their trigger branch lists naming `trunk`, and the merge-policy AC binds to the trunk-branch protection property that admits only PRs whose `pull-request-checks` aggregate passed",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
33
+ "TAC-701-delivery-ci-workflows-gate-runner"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6116",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-016",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The linter check produces a stable-shape lint report and fails non-zero on any lint error",
8
+ "asA": "operator whose project enables the elicited linter check",
9
+ "iWant": "a lint gate whose report shape and exit-code semantic are stable across projects",
10
+ "soThat": "downstream readers (dashboards, merge queues) can consume lint outcomes without per-project scraping",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6116-1",
14
+ "description": "When `checkSet.linter` is true, the gate-runner runs the project-realised linter runner, captures its exit code and streams, and writes the per-gate report to `.rcf/reports/ci/lint.json` with `checkKind: \"linter\"`. A non-zero exit code from the runner flips the gate outcome to `failed`.",
15
+ "given": "a project with `checkSet.linter: true` and a realised linter runner satisfying the runner-contract interface",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/lint.json` is written with `checkKind: \"linter\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6117",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-017",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The formatter check runs in check mode and fails non-zero on any unformatted file",
8
+ "asA": "operator whose project enables the elicited formatter check",
9
+ "iWant": "a formatter gate that CHECKS (not writes) and fails on any file the formatter would rewrite",
10
+ "soThat": "unformatted commits are caught in CI rather than masked by a rewrite step",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6117-1",
14
+ "description": "When `checkSet.formatter` is true, the gate-runner runs the project-realised formatter runner in check mode. A non-zero exit code from the runner (indicating one or more files would be rewritten) flips the gate outcome to `failed`. The per-gate report at `.rcf/reports/ci/format.json` carries `checkKind: \"formatter\"`.",
15
+ "given": "a project with `checkSet.formatter: true` and a realised formatter runner in check mode",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/format.json` is written with `checkKind: \"formatter\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6118",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-018",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The typecheck runs when the project has a typechecker configured and fails non-zero on any type error",
8
+ "asA": "operator whose project uses a typechecked language",
9
+ "iWant": "the typecheck gate to run when my project has a typechecker configured and be off when it does not",
10
+ "soThat": "the default aligns with project shape without me writing an explicit override",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6118-1",
14
+ "description": "When `checkSet.typecheck` is true (or the auto-detect finds a `tsconfig.json` or equivalent tool marker at the project root and the flag is unset), the gate-runner runs the project-realised typecheck runner. A non-zero exit flips the gate outcome to `failed`. The per-gate report at `.rcf/reports/ci/typecheck.json` carries `checkKind: \"typecheck\"`.",
15
+ "given": "a project with `checkSet.typecheck: true` and a realised typecheck runner",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/typecheck.json` is written with `checkKind: \"typecheck\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6118-2",
23
+ "description": "When `checkSet.typecheck` is unset and the project tree contains no `tsconfig.json` or equivalent tool marker, the auto-detect leaves the check off and no `typecheck.json` report file is written.",
24
+ "given": "a project with `checkSet.typecheck` unset and no typechecker marker at the project root",
25
+ "when": "a CI workflow invokes the gate-runner",
26
+ "then": "no `typecheck` gate is included in the aggregate report and no `.rcf/reports/ci/typecheck.json` file is written",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-701-delivery-ci-workflows-gate-runner",
33
+ "TAC-702-delivery-ci-workflows-gate-report"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6119",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-019",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The unit-test check runs the project suite as a gate and fails non-zero on any failing test",
8
+ "asA": "operator whose project has a unit-test suite",
9
+ "iWant": "a unit-test gate whose exit-code and report shape are the same as every other elicited check",
10
+ "soThat": "the aggregate report treats unit tests as one gate among many with the same downstream contract",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6119-1",
14
+ "description": "When `checkSet.unitTest` is true, the gate-runner runs the project-realised unit-test runner. A non-zero exit code flips the gate outcome to `failed`. The per-gate report at `.rcf/reports/ci/test.json` carries `checkKind: \"unitTest\"`.",
15
+ "given": "a project with `checkSet.unitTest: true` and a realised unit-test runner",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/test.json` is written with `checkKind: \"unitTest\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6120",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-020",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The security-scan check fails non-zero on findings at or above the project severity threshold",
8
+ "asA": "operator whose project enables the elicited security-scan check",
9
+ "iWant": "a security-scan gate whose exit code is driven by the project-configured severity threshold, not a build-in choice",
10
+ "soThat": "the gate applies across risk postures without changing the tool or the report shape",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6120-1",
14
+ "description": "When `checkSet.securityScan` is true, the gate-runner runs the project-realised security-scan runner. A non-zero exit code (indicating one or more findings at or above the project-configured severity threshold) flips the gate outcome to `failed`. Findings below the threshold are recorded in the per-gate report without flipping the exit code. The per-gate report at `.rcf/reports/ci/security.json` carries `checkKind: \"securityScan\"`.",
15
+ "given": "a project with `checkSet.securityScan: true` and a realised security-scan runner configured with the project's severity threshold",
16
+ "when": "a CI workflow invokes the gate-runner",
17
+ "then": "a report file at `.rcf/reports/ci/security.json` is written with `checkKind: \"securityScan\"`, and the gate outcome tracks the runner exit code",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ }
21
+ ],
22
+ "tacIds": [
23
+ "TAC-701-delivery-ci-workflows-gate-runner",
24
+ "TAC-702-delivery-ci-workflows-gate-report"
25
+ ],
26
+ "createdAt": "2026-08-31T00:00:00Z",
27
+ "updatedAt": "2026-08-31T00:00:00Z"
28
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6121",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-021",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The release workflow shape scales with the releaseMode dimension",
8
+ "asA": "operator declaring a release path on delivery-ci-workflows v2",
9
+ "iWant": "the release workflow the materialiser produces to scale with what my project has already declared (no release, tag only, tag plus artefact, or handoff to deploy)",
10
+ "soThat": "I choose the maturity level of my release path once and the workflow set follows",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6121-1",
14
+ "description": "When `workflowShape.releaseMode` is `none`, the workflow-materialiser writes no `release` workflow file to the provider's workflow path. A project with no release path does not ship a workflow.",
15
+ "given": "a `workflowShape` with `releaseMode: none`",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "no `release` workflow file is created at the provider's workflow path and no `.rcf/reports/ci/release.json` file is written",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6121-2",
23
+ "description": "When `releaseMode` is `tagOnly`, the release workflow fires on a release trigger and creates a release entity on the CI provider's own release surface. No artefact-publish step ships. When `tagPlusArtefact`, the release workflow additionally runs the project-realised artefact-publish step and uploads its output to the release entity.",
24
+ "given": "a `workflowShape` with `releaseMode: tagPlusArtefact` and a realised artefact-publish step",
25
+ "when": "a release trigger fires",
26
+ "then": "the release workflow creates the release entity, runs the artefact-publish step, uploads the published artefact to the release entity, and records the just-published version identifier in the aggregate report",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-6121-3",
32
+ "description": "The release workflow does not include the required check set. Its aggregate report at `.rcf/reports/ci/release.json` carries the release-flow outcome (tag creation, artefact publish, optional deploy handoff) and not the gate-runner outcome.",
33
+ "given": "a release workflow materialised in any non-`none` mode",
34
+ "when": "the release trigger fires",
35
+ "then": "the release workflow does not invoke the gate-runner entry point and the `pipeline.json` at the same commit remains the record of the check set outcome",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
42
+ "TAC-705-delivery-ci-workflows-release-workflow"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6122",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-022",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The deployHandoff release mode invokes the deploy blueprint's promote workflow and refuses at boot when that blueprint is absent",
8
+ "asA": "operator declaring a paired service on delivery-ci-workflows v2",
9
+ "iWant": "the release workflow to hand off to the named deploy blueprint's promote workflow after the artefact-publish step succeeds",
10
+ "soThat": "the CI-side and deploy-side workflows compose without either duplicating the other's WHAT",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6122-1",
14
+ "description": "When `workflowShape.releaseMode` is `deployHandoff:<slug>` and the named deploy blueprint is present in `manifest.blueprints[]`, the release workflow invokes the deploy blueprint's `promote` workflow via `workflow_dispatch` after the artefact-publish step succeeds. The invocation passes the just-published version identifier as the `versionId` input.",
15
+ "given": "a `workflowShape` with `releaseMode: deployHandoff:deploy-cloudflare-workers`, the named deploy blueprint applied, and an artefact-publish step that succeeded",
16
+ "when": "the release trigger fires",
17
+ "then": "the release workflow dispatches the promote workflow with `versionId` set to the just-published version identifier and waits on the promote workflow's outcome",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6122-2",
23
+ "description": "The release workflow's aggregate outcome is `passed` only when the promote workflow's outcome is `passed`. A failed promote workflow flips the release workflow's aggregate to `failed`.",
24
+ "given": "a release workflow in `deployHandoff` mode whose promote workflow returned a failed outcome",
25
+ "when": "the release workflow aggregates its outcome",
26
+ "then": "the release workflow's aggregate report at `.rcf/reports/ci/release.json` records `verdict: failed` and names the promote workflow's failure in its `gates[]` array",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-6122-3",
32
+ "description": "When `releaseMode` is `deployHandoff:<slug>` and the named deploy blueprint is not present in `manifest.blueprints[]`, the workflow-materialiser boot-check refuses with a stable-coded error naming the missing blueprint slug and pointing at `rcf define blueprint add <deploy-slug>`.",
33
+ "given": "a `workflowShape` with `releaseMode: deployHandoff:deploy-cloudflare-workers` and no such blueprint in the manifest",
34
+ "when": "the workflow-materialiser boots",
35
+ "then": "the materialiser exits non-zero with a stable-coded error naming the missing slug and pointing at the resolution command, and no release workflow file lands on disk",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
42
+ "TAC-705-delivery-ci-workflows-release-workflow"
43
+ ],
44
+ "createdAt": "2026-08-31T00:00:00Z",
45
+ "updatedAt": "2026-08-31T00:00:00Z"
46
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "delivery-ci-workflows-US-6123",
3
+ "prdId": "PRD-001",
4
+ "reqId": "delivery-ci-workflows-REQ-023",
5
+ "version": "2.0.0",
6
+ "status": "approved",
7
+ "title": "The scheduledAudit dimension materialises a cron workflow running the required check set on cadence",
8
+ "asA": "operator wanting to catch dependency drift and secret rotations between merges",
9
+ "iWant": "to opt into a scheduled workflow that runs the same required check set on a cron cadence",
10
+ "soThat": "drift that does not coincide with a merge is caught rather than missed until the next unrelated PR",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-6123-1",
14
+ "description": "When `workflowShape.scheduledAudit` is `true`, the workflow-materialiser produces a `scheduled-audit` workflow triggered by the provider's cron surface, running the same required check set the pull-request and default-branch workflows run. The aggregate report writes to `.rcf/reports/ci/scheduled-audit.json` (distinct from the commit-triggered `pipeline.json`).",
15
+ "given": "a `workflowShape` with `scheduledAudit: true`",
16
+ "when": "the workflow-materialiser runs",
17
+ "then": "a `scheduled-audit` workflow file lands at the provider's workflow path, its trigger set names a cron schedule, and its command line invokes the Node gate-runner entry point with the required check set writing to the distinct report path",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-6123-2",
23
+ "description": "When `scheduledAudit` is `false` or absent, no scheduled workflow ships and no `.rcf/reports/ci/scheduled-audit.json` file path is populated.",
24
+ "given": "a `workflowShape` with `scheduledAudit` absent (default `false`)",
25
+ "when": "the workflow-materialiser runs",
26
+ "then": "no `scheduled-audit` workflow file is created and no `.rcf/reports/ci/scheduled-audit.json` file path is written",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-704-delivery-ci-workflows-workflow-materialiser",
33
+ "TAC-706-delivery-ci-workflows-scheduled-audit"
34
+ ],
35
+ "createdAt": "2026-08-31T00:00:00Z",
36
+ "updatedAt": "2026-08-31T00:00:00Z"
37
+ }
@@ -0,0 +1,61 @@
1
+ # delivery-ci-workflows blueprint coordination vocabulary
2
+
3
+ This file is the delivery-ci-workflows half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.4.4 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
4
+
5
+ ## Global ADR topics this blueprint contributes (exact strings)
6
+
7
+ | Topic string | delivery-ci-workflows contribution | Origin | Composition note |
8
+ |---|---|---|---|
9
+ | `ciGates` | ADR-701-delivery-ci-workflows-ci-gates | Minted at v1 by the ci-pipeline predecessor; broadened at v2.0.0 to name the required check set (mandatory tier plus elicited subset from `workflowShape.checkSet`) | The required check set every commit-triggered workflow runs. Any composing blueprint that ships its own required-check opinion (an adherence-pack blueprint, a browser-verify blueprint, an observability probe blueprint) contributes its own scope:global ADR on this exact string and lets composition surface the pairing. Expected resolution: one project-level ADR that fixes the extended catalogue and states the reasoning |
10
+ | `strictCoverageGate` | ADR-702-delivery-ci-workflows-strict-coverage-gate | Preserved verbatim from v1 | The coverage-mode posture for the required gate (per-AC strict, not shallow-any). A composing blueprint that holds an opinion on coverage-mode policy (a shallow-any-for-early-projects blueprint, a coverage-with-grace-window blueprint) conflicts here by design. Expected resolution: one project-level ADR fixing the coverage posture |
11
+ | `releaseArtefacts` | ADR-709-delivery-ci-workflows-release-artefacts | **Minted at v2.0.0** | The decision area of what the release workflow produces on a release trigger. The delivery-side answer is the four-mode `releaseMode` enumeration (`none`, `tagOnly`, `tagPlusArtefact`, `deployHandoff:<slug>`). A future `security-release-provenance` blueprint (minting a signature-attestation opinion) or a `delivery-release-notes` blueprint (minting a changelog opinion) contributes its own scope:global ADR on this exact string and lets composition surface the pairing. Expected resolution: one project-level ADR that fixes the extended answer |
12
+
13
+ The delivery-ci-workflows blueprint claims three global topics at v2.0.0 (`ciGates` broadened, `strictCoverageGate` preserved, `releaseArtefacts` new). Every other contribution is scope-local; a composing blueprint that holds an opinion on runner language, report shape, elicitation surface, branch model, release workflow shape, provider hint, or scheduled audit authors its own project-level ADR if it wants to override.
14
+
15
+ ### Deliberate conflicts declared
16
+
17
+ Where this blueprint's set overlaps other blueprints' topics, the resolution paths are documented at authoring rather than left to composition-time surprise:
18
+
19
+ - **`ciGates` vs any future adherence-pack or browser-verify blueprint**: expected conflict on the `ciGates` string. Resolution: the project-level ADR names the extended catalogue including the composing blueprint's checks.
20
+ - **`releaseArtefacts` vs any future `security-release-provenance` blueprint**: expected conflict on the `releaseArtefacts` string. Resolution: the project-level ADR fixes the artefact production shape including signatures and provenance blocks.
21
+ - **`releaseArtefacts` vs any future `delivery-release-notes` blueprint**: expected conflict on the `releaseArtefacts` string (release notes are one kind of artefact the release workflow produces). Resolution: the project-level ADR names the release-notes production alongside the artefact publish step.
22
+
23
+ `branchModel` is deliberately NOT minted as a global topic. No shipped or plausible sibling blueprint has a legitimate opinion on branch model choice; minting the string would create a resolution surface for a conflict that would not materialise. If evidence emerges to the contrary, `branchModel` can be minted in a v2.x minor bump.
24
+
25
+ Note on the delineation from the application-api-rest blueprint's `logging` topic and the persistence-data-sqlite blueprint's store event log: `logging` (owned by application-api-rest ADR-304) governs the wire-log shape of the HTTP tier; persistence ADR-603 governs the store-event log shape. This blueprint's report shape (ADR-704) governs the pipeline-run report shape, which is a build-time artefact, not a runtime log. The three surfaces may share a shipper but do not share a topic. A blueprint that contributes a unified telemetry discipline across build-time and runtime surfaces would author its own scope:global ADR and expect to conflict with all three, not just here.
26
+
27
+ Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, and persistence vocabularies, restated as law): lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer. Do not mint variants of existing strings (`ciChecks`, `pipelineGates`, `strictCoverage`, `coverageStrict` are all wrong when `ciGates` and `strictCoverageGate` already exist).
28
+
29
+ ## Id number bands (registry bootstrap)
30
+
31
+ AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is ratified policy (2026-08-19); this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
32
+
33
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
34
+
35
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
36
+ |---|---|---|---|---|
37
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
38
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
39
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
40
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
41
+ | hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
42
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
43
+ | delivery-ci-workflows | 6101-6899 | 7xx | shipped v2.0.0 (renamed from ci-pipeline) | `ciGates`, `strictCoverageGate`, `releaseArtefacts` |
44
+ | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
45
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
46
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
47
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
48
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
49
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
50
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
51
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
52
+
53
+ US 6101-6110 sit at the LOW end of the 6101-6899 band on purpose. A project-side story that mechanically derives from `delivery-ci-workflows-REQ-011` into the number `6111` would collide against delivery-ci-workflows-US-6111 in this package; the band leaves headroom at the HIGH end (US 6181-6899) so a project's own stories anchored to delivery-ci-workflows REQs can allocate without conflict. The watchpost run4 lesson applies here too.
54
+
55
+ ## Shared expectations for future composing blueprints
56
+
57
+ - Reuse `ciGates` exactly as spelled here when your blueprint holds an opinion on the required check set every commit-triggered workflow runs; contribute your own scope:global ADR on that string and let composition surface the pairing. An observability-essentials blueprint that ships health-probe or status-page gates as required will conflict here by design.
58
+ - Reuse `strictCoverageGate` exactly as spelled here when your blueprint holds an opinion on the coverage-mode policy (strict per-AC versus shallow-any versus grace-window); a blueprint that ships a different posture conflicts here.
59
+ - Reuse `releaseArtefacts` exactly as spelled here when your blueprint holds an opinion on what the release workflow produces on a release trigger (an artefact-signing opinion, a provenance-block opinion, a release-notes opinion); contribute your own scope:global ADR on that string and expect a project-level ADR to fix the extended answer.
60
+ - This blueprint's decision at v2.0.0 states the mandatory tier (`validate` and `coverage-strict` in that order) plus the elicited tier (linter, formatter, typecheck, unitTest, securityScan) driven by `workflowShape.checkSet`, the four-mode `releaseMode` enumeration on `releaseArtefacts`, the Node-only entry-point shape (ADR-703), and the report shape (ADR-704 with the v2 `checkKind` addition). Compose compatible adherence packs, browser-verify shipping, or observability probes, or expect the operator to supersede with one project-level ADR per topic.
61
+ - Global topics that plausibly belong to a future blueprint and are NOT claimed by any shipped blueprint: `adherencePack` (an adherence-shipping blueprint's natural global), `mutationSampling` (a mutation-testing blueprint's natural global). Define any of these in your own package's topics doc, in this file's format, and consider whether the band-registry table above needs your slug added.