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.
- package/CHANGELOG.md +48 -1
- package/bin/rcf.js +3 -1
- package/bin/view-supervisor-child.mjs +0 -0
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-spa/README.md +3 -3
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +7 -7
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +7 -7
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +8 -8
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +8 -8
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +8 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +3 -3
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
- package/blueprints/delivery-ci-workflows/README.md +61 -0
- package/blueprints/delivery-ci-workflows/assets/bootstrap/README.md +26 -0
- package/blueprints/delivery-ci-workflows/assets/bootstrap/adr-bootstrap-coverage-supersession.template.json +28 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +61 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +74 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +75 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +65 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
- package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/per-gate.json +3 -2
- package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
- 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
- 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
- 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
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-002.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-003.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-004.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-005.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json} +4 -4
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-006.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-007.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-008.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json} +2 -2
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-010.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json} +2 -2
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
- 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
- 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
- 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
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +67 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
- 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
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
- package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
- package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +174 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +3 -3
- package/blueprints/email-smtp-resend/docs/topics.md +1 -1
- package/blueprints/observability-essentials/README.md +2 -2
- package/blueprints/observability-essentials/docs/topics.md +5 -5
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/README.md +2 -2
- package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +1 -1
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +1 -1
- package/blueprints/persistence-data-d1/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +1 -1
- package/blueprints/persistence-data-sqlite/README.md +1 -1
- package/blueprints/persistence-data-sqlite/docs/topics.md +1 -1
- package/blueprints/security-auth-clerk/README.md +5 -3
- package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
- package/blueprints/security-auth-clerk/blueprint.json +1 -1
- package/blueprints/security-auth-clerk/docs/topics.md +2 -2
- package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +9 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +2 -2
- package/blueprints/security-auth-magic-link/README.md +1 -1
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-oauth2/README.md +1 -1
- package/blueprints/security-auth-oauth2/docs/topics.md +2 -2
- package/blueprints/security-secrets-management/README.md +1 -1
- package/blueprints/security-secrets-management/docs/topics.md +3 -3
- package/guidance/build-cycle-playbook.md +2 -2
- package/guidance/document-model.md +1 -1
- package/guidance/harness-template.md +13 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +13 -0
- package/package.json +15 -14
- package/rcf/adrs/adr-001.json +1 -1
- package/rcf/adrs/adr-009.json +1 -1
- package/rcf/build-sequence.json +1 -1
- package/rcf/manifest.json +2 -2
- package/rcf/prd.json +2 -2
- package/releases/releases.yaml +126 -0
- package/src/blueprint/apply.js +60 -13
- package/src/blueprint/index.js +12 -0
- package/src/blueprint/library-loader.js +292 -0
- package/src/blueprint/library-registry.js +341 -0
- package/src/blueprint/list.js +38 -4
- package/src/blueprint/shelf-resolver.js +144 -31
- package/src/blueprint/supersede.js +56 -13
- package/src/cli/blueprint-library.js +447 -0
- package/src/cli/blueprint.js +50 -9
- package/src/cli/guidance.js +1 -1
- package/src/cli/help.js +27 -1
- package/src/cli/version.js +673 -0
- package/src/cli/view.js +282 -1
- package/src/server/index.js +3 -0
- package/src/server/routes.js +15 -1
- package/src/server/scope-endpoint.js +105 -0
- package/src/view/live-client.js +253 -6
- package/src/view/scope.js +231 -0
- package/src/view/style.css +42 -0
- package/blueprints/ci-pipeline/README.md +0 -49
- package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +0 -61
- package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +0 -50
- package/blueprints/ci-pipeline/blueprint.json +0 -46
- package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +0 -25
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +0 -18
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +0 -18
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +0 -37
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +0 -36
- package/blueprints/ci-pipeline/docs/topics.md +0 -49
- package/blueprints/ci-pipeline/guide/ci-pipeline.md +0 -79
- package/rcf/.identity/profile.md +0 -37
- package/rcf/knowledge/INDEX.md +0 -12
- package/rcf/knowledge/README.md +0 -41
- package/rcf/knowledge/docs/.gitkeep +0 -0
- package/rcf/knowledge/notes/.gitkeep +0 -0
- /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-019",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "A unit-test check the project realises produces a stable-shape test report and fails non-zero on any failing test",
|
|
5
|
+
"description": "The elicited `unitTest` check, when the project enables it in `workflowShape.checkSet.unitTest`, runs the project unit-test suite as a gate that exits non-zero on any failing test. The gate writes its per-gate report to `.rcf/reports/ci/test.json` in the shared per-gate report shape (with `checkKind: \"unitTest\"`). The blueprint does not pick the test runner; the project realises the runner and satisfies the runner-contract interface. A missing runner (an empty test suite before the project has any tests) is recorded in the per-gate report and does not by itself fail the gate.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "continuous-integration",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A unit-test gate is table stakes for any greenfield project; naming it in the elicited catalogue keeps the default set aligned with what a project engineer expects to find in a CI floor. Preserving the tool choice at the project layer is what keeps the blueprint neutral across test frameworks.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:delivery-ci-workflows",
|
|
12
|
+
"category:19-check-unit-test"
|
|
13
|
+
],
|
|
14
|
+
"version": "2.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-31T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-31T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "delivery-ci-workflows-REQ-020",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "A security-scan check the project realises produces a stable-shape scan report and fails non-zero on findings above the project threshold",
|
|
5
|
+
"description": "The elicited `securityScan` check, when the project enables it in `workflowShape.checkSet.securityScan`, runs a dependency-and-secret scan gate that exits non-zero when the scan finds any advisory at or above the project-configured severity threshold. The gate writes its per-gate report to `.rcf/reports/ci/security.json` in the shared per-gate report shape (with `checkKind: \"securityScan\"`). Findings below the threshold are reported in the per-gate report without flipping the exit code. The severity threshold is a project decision; the blueprint does not opine on the threshold.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "continuous-integration",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "A security scan whose severity threshold is a build-in choice punishes projects whose risk posture is different from the blueprint author's; a threshold the project owns keeps the gate applicable across risk postures. Binding the exit-code semantic and the report shape as an AC contract preserves the stable surface downstream readers depend on.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:delivery-ci-workflows",
|
|
12
|
+
"category:20-check-security-scan"
|
|
13
|
+
],
|
|
14
|
+
"version": "2.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-31T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-31T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "delivery-ci-workflows-REQ-021",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The release workflow shape scales with the releaseMode dimension across four discrete modes",
|
|
5
|
+
"description": "When `workflowShape.releaseMode` is `none`, no release workflow ships. When `tagOnly`, a release workflow fires on the project-declared release trigger (a `release` event, a `workflow_dispatch`, or both) and creates a release entity on the CI provider's own release surface (a GitHub Release, a GitLab release, whatever the provider ships). When `tagPlusArtefact`, the release workflow also runs the project-realised artefact-publish step and uploads its output to the release entity; the AC contract requires the artefact-publish step to produce a verified artefact reachable at a stable identifier. When `deployHandoff:<slug>`, the release workflow additionally invokes the named deploy blueprint's promote workflow per REQ-022. The release workflow does not run the required check set; the check set already ran on the default-branch-checks workflow at the commit the release points at.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "continuous-integration",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Release workflow shape scales with project maturity: an internal package has no release path (mode `none`); a documented release stamps a tag (`tagOnly`); a published library adds an artefact (`tagPlusArtefact`); a paired service hands off to deploy (`deployHandoff`). Four discrete modes cover the maturity range without inventing intermediate states the operator has to reason about. Excluding the check set from the release workflow avoids the redundant run-and-lengthen pattern.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:delivery-ci-workflows",
|
|
12
|
+
"category:21-release-mode"
|
|
13
|
+
],
|
|
14
|
+
"version": "2.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-31T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-31T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "delivery-ci-workflows-REQ-022",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "The deployHandoff release mode invokes the named deploy blueprint's promote workflow and refuses at boot when that blueprint is absent",
|
|
5
|
+
"description": "When `workflowShape.releaseMode` is `deployHandoff:<slug>`, the release workflow invokes the named deploy blueprint's `promote` workflow via that blueprint's declared invocation contract (a `workflow_dispatch` event carrying the just-published version identifier as the `versionId` input). The release workflow's aggregate outcome is `passed` only when the promote workflow's outcome is `passed`. The workflow-materialiser performs a boot-check that refuses the value when the named deploy blueprint is absent from `manifest.blueprints[]`; the error names the missing blueprint by slug and points at `rcf define blueprint add <deploy-slug>` as the resolution.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "continuous-integration",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Cross-blueprint composition works when the composing blueprint reaches for a stated invocation contract on the composed side, not when it duplicates the composed side's implementation. The `versionId`-optional-input contract on the deploy blueprint's promote workflow is already ratified; the release workflow calls it and inherits the promote workflow's outcome. The manifest boot-check catches the misconfiguration case (a project declaring a handoff to a target it has not applied) before the release workflow lands on disk.",
|
|
10
|
+
"tags": [
|
|
11
|
+
"blueprint:delivery-ci-workflows",
|
|
12
|
+
"category:22-deploy-handoff"
|
|
13
|
+
],
|
|
14
|
+
"version": "2.0.0",
|
|
15
|
+
"status": "approved",
|
|
16
|
+
"createdAt": "2026-08-31T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-31T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -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-
|
|
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",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{
|
|
27
27
|
"name": "gate-descriptor",
|
|
28
28
|
"kind": "value",
|
|
29
|
-
"description": "{ name: string, command: string[] } where `command[0]` is the executable (typically `rcf`) and the rest are argv. The
|
|
29
|
+
"description": "{ name: string, command: string[] } where `command[0]` is the executable (typically `rcf`) and the rest are argv. The rcf CLI groups verbs by RCF stage; the mandatory tier for v1.0.0 uses the grouped forms this TAC's responsibilities section names: `[{ name: 'validate', command: ['rcf', 'define', 'validate'] }, { name: 'coverage-strict', command: ['rcf', 'audit', 'coverage', '--strict'] }]`. A descriptor whose `command` array omits the group (`['rcf', 'validate']`, `['rcf', 'coverage', '--strict']`) does not resolve on any shipped rcf CLI and refuses at gate spawn; the gate-runner does not paper over the difference."
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"name": "entry-point CLI",
|
|
@@ -38,13 +38,13 @@
|
|
|
38
38
|
{
|
|
39
39
|
"name": "Per-gate report writer",
|
|
40
40
|
"kind": "tac",
|
|
41
|
-
"tacId": "TAC-702-ci-
|
|
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-
|
|
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
|
{
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
],
|
|
56
56
|
"tradeoffs": "Running every gate as a separate child process costs Node startup for each; that cost buys a stable exit-code contract and a stable stream capture surface that a library-mode invocation would obscure. Continuing past a failing gate costs a slightly longer pipeline; that cost buys the reviewer seeing every failure on one run instead of chasing them one at a time. The runner does not run gates in parallel: gate ordering is a stable property the aggregate report depends on, and the small gate count at v1.0.0 does not motivate a parallel-and-serialise design.",
|
|
57
57
|
"createdAt": "2026-08-24T00:00:00Z",
|
|
58
|
-
"updatedAt": "2026-08-
|
|
58
|
+
"updatedAt": "2026-08-31T00:00:00Z"
|
|
59
59
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"tacId": "TAC-703-ci-
|
|
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-
|
|
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,67 @@
|
|
|
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
|
+
"Read the applied blueprint source from `rcf/manifest.json`'s `blueprints[].source` field (the path recorded when `rcf define blueprint add` ran) and resolve the provider asset directory as `<source>/assets/ci-provider-examples/<providerHint>/`; do not hard-code the source path against `node_modules/` or any other convention.",
|
|
15
|
+
"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.",
|
|
16
|
+
"Substitute the trigger branch name into the produced commit-triggered workflows: on `branchModel: feature`, the `pull-request-checks` and `default-branch-checks` triggers name `workflowShape.defaultBranch` (default `main`); on `branchModel: trunk`, they name `workflowShape.trunkBranch` (default `main`). The substitution is applied against the `# @@RCF-SUB-BRANCH-NAME@@` marker that the illustrative assets carry immediately above their `branches:` line; the marker's next line (the `branches: [...]` list) is rewritten to name the configured branch, so the property AC-6114/6115 binds to (the branch model determines which branch triggers the workflow) is observable in the materialised output rather than being masked by a hard-coded `main`.",
|
|
17
|
+
"Substitute the package-manager setup and install steps into every produced workflow: read `workflowShape.packageManager` (default `pnpm`; recognised values `pnpm`, `npm`, `yarn`, `bun`); replace every line fenced between `# @@RCF-SUB-PKG-MGR-SETUP-BEGIN@@` and `# @@RCF-SUB-PKG-MGR-SETUP-END@@` (exclusive) with the per-manager setup block, and every line fenced between `# @@RCF-SUB-PKG-MGR-INSTALL-BEGIN@@` and `# @@RCF-SUB-PKG-MGR-INSTALL-END@@` (exclusive) with the per-manager install block, per the substitution table in `guide/delivery-ci-workflows.md`. Refuse an unrecognised `packageManager` with the same boot-check error path the enumerated fields use.",
|
|
18
|
+
"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).",
|
|
19
|
+
"Emit a materialiser-run summary to stdout naming the workflow files produced, the elicited-check set they carry, and the substituted branch name and package manager."
|
|
20
|
+
],
|
|
21
|
+
"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.",
|
|
22
|
+
"interfaces": [
|
|
23
|
+
{
|
|
24
|
+
"name": "materialise",
|
|
25
|
+
"kind": "factory",
|
|
26
|
+
"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."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "workflow-shape",
|
|
30
|
+
"kind": "value",
|
|
31
|
+
"description": "The parsed and composed `workflowShape`: `{ branchModel, checkSet, releaseMode, providerHint, scheduledAudit, trunkPullRequests, defaultBranch, trunkBranch, packageManager }` with alias expansion applied, `releaseMode` defaulted to `none` when absent, `defaultBranch` and `trunkBranch` defaulted to `main` when absent, and `packageManager` defaulted to `pnpm` when absent."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "entry-point CLI",
|
|
35
|
+
"kind": "cli",
|
|
36
|
+
"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."
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"dependencies": [
|
|
40
|
+
{
|
|
41
|
+
"name": "Gate runner",
|
|
42
|
+
"kind": "tac",
|
|
43
|
+
"tacId": "TAC-701-delivery-ci-workflows-gate-runner",
|
|
44
|
+
"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."
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"name": "Release workflow",
|
|
48
|
+
"kind": "tac",
|
|
49
|
+
"tacId": "TAC-705-delivery-ci-workflows-release-workflow",
|
|
50
|
+
"description": "The materialiser produces the release workflow file whose steps satisfy the release-workflow TAC per the elicited `releaseMode`."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "Scheduled audit",
|
|
54
|
+
"kind": "tac",
|
|
55
|
+
"tacId": "TAC-706-delivery-ci-workflows-scheduled-audit",
|
|
56
|
+
"description": "The materialiser produces the scheduled-audit workflow file whose cron trigger satisfies the scheduled-audit TAC when `scheduledAudit: true`."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "Manifest reader",
|
|
60
|
+
"kind": "external",
|
|
61
|
+
"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."
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"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.",
|
|
65
|
+
"createdAt": "2026-08-31T00:00:00Z",
|
|
66
|
+
"updatedAt": "2026-08-31T12:00:00Z"
|
|
67
|
+
}
|
|
@@ -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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6102",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6103",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
33
|
-
"TAC-702-ci-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6104",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
33
|
-
"TAC-702-ci-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6105",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
5
|
-
"version": "
|
|
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-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6106",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6107",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
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-
|
|
33
|
-
"TAC-703-ci-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6108",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
33
|
-
"TAC-703-ci-
|
|
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-
|
|
2
|
+
"usId": "delivery-ci-workflows-US-6110",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
|
-
"reqId": "ci-
|
|
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-
|
|
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"
|