rcf-lite 0.16.0 → 0.18.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 +36 -0
- package/blueprints/application-api-rest/README.md +5 -1
- package/blueprints/application-api-rest/blueprint.json +1 -1
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +4 -4
- package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +9 -8
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +3 -3
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +27 -27
- package/blueprints/application-api-rest/docs/topics.md +2 -2
- package/blueprints/application-api-rest/guide/application-api-rest.md +5 -1
- package/blueprints/application-spa/assets/tc-templates/e2e.md +85 -0
- package/blueprints/application-spa/blueprint.json +24 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1134.json +24 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1135.json +24 -0
- package/blueprints/application-spa/docs/topics.md +2 -2
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +69 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +18 -0
- package/blueprints/delivery-ci-workflows/blueprint.json +301 -60
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6124.json +28 -0
- package/blueprints/delivery-ci-workflows/docs/topics.md +2 -2
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
- package/blueprints/email-smtp-resend/docs/topics.md +2 -2
- package/blueprints/observability-essentials/README.md +6 -2
- package/blueprints/observability-essentials/blueprint.json +133 -33
- package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +4 -4
- package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +4 -4
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +4 -4
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +4 -4
- package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +10 -9
- package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +17 -11
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +12 -3
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +12 -3
- package/blueprints/observability-essentials/docs/topics.md +15 -8
- package/blueprints/observability-essentials/guide/observability-essentials.md +9 -3
- package/blueprints/observability-probe-endpoints/README.md +5 -1
- package/blueprints/observability-probe-endpoints/blueprint.json +116 -24
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +5 -5
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +11 -2
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +11 -2
- package/blueprints/observability-probe-endpoints/docs/topics.md +6 -6
- package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +10 -0
- package/blueprints/persistence-data-d1/docs/topics.md +2 -2
- package/blueprints/persistence-data-sqlite/docs/topics.md +2 -2
- package/blueprints/security-auth-clerk/docs/topics.md +2 -2
- package/blueprints/security-auth-keycloak/docs/topics.md +2 -2
- package/blueprints/security-auth-magic-link/docs/topics.md +2 -2
- package/blueprints/security-auth-oauth2/docs/topics.md +2 -2
- package/blueprints/security-secrets-management/docs/topics.md +2 -2
- package/fixtures/canary-manifest.json +9 -9
- package/package.json +13 -1
- package/rcf/code-nodes/cn-070.json +12 -0
- package/rcf/code-nodes/cn-071.json +12 -0
- package/rcf/code-nodes/cn-072.json +12 -0
- package/rcf/code-nodes/cn-073.json +12 -0
- package/rcf/code-nodes/cn-074.json +19 -0
- package/rcf/code-nodes/cn-075.json +15 -0
- package/rcf/code-nodes/cn-076.json +14 -0
- package/rcf/fbs/fbs-020.json +18 -0
- package/rcf/fbs/fbs-021.json +18 -0
- package/rcf/fbs/fbs-022.json +18 -0
- package/rcf/fbs/fbs-023.json +18 -0
- package/rcf/fbs/fbs-024.json +24 -0
- package/rcf/fbs/fbs-025.json +25 -0
- package/rcf/fbs/fbs-026.json +27 -0
- package/rcf/fbs/fbs-027.json +25 -0
- package/rcf/prd.json +3 -2
- package/rcf/requirements/req-011.json +22 -0
- package/rcf/requirements/req-012.json +22 -0
- package/rcf/test-suites/ts-030.json +66 -0
- package/rcf/test-suites/ts-031.json +59 -0
- package/rcf/test-suites/ts-032.json +50 -0
- package/rcf/test-suites/ts-033.json +83 -0
- package/rcf/test-suites/ts-034.json +32 -0
- package/rcf/test-suites/ts-035.json +23 -0
- package/rcf/test-suites/ts-036.json +65 -0
- package/rcf/test-suites/ts-037.json +55 -0
- package/rcf/user-stories/us-1101.json +51 -0
- package/rcf/user-stories/us-1102.json +60 -0
- package/rcf/user-stories/us-1103.json +51 -0
- package/rcf/user-stories/us-1104.json +60 -0
- package/rcf/user-stories/us-1201.json +34 -0
- package/rcf/user-stories/us-1202.json +25 -0
- package/rcf/user-stories/us-1203.json +43 -0
- package/rcf/user-stories/us-1204.json +25 -0
- package/releases/releases.yaml +21 -1
- package/src/blueprint/index.js +1 -0
- package/src/blueprint/remove-resolution.js +104 -0
- package/src/blueprint/supersede.js +2 -2
- package/src/cli/blueprint.js +41 -0
- package/src/cli/doctor.js +257 -5
- package/src/cli/init.js +166 -0
- package/src/setup/playwright-checks.js +426 -0
- package/src/verify/cli/run.js +28 -0
- package/src/verify/engine/index.js +24 -4
- package/src/verify/engine/launcher.js +41 -10
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-035",
|
|
3
|
+
"usId": "US-1202",
|
|
4
|
+
"title": "Applied tree carries no literal /healthz or /readyz path outside probe-endpoints prose",
|
|
5
|
+
"purpose": "Cover the one AC on US-1202: greppable proof that /healthz, /readyz, /healthz/live, /healthz/ready and /healthz/startup do not appear in the applied rcf/ contribution JSON tree after re-applying all three amended blueprints.",
|
|
6
|
+
"testLevel": "integration",
|
|
7
|
+
"acIds": [
|
|
8
|
+
"AC-1202-1"
|
|
9
|
+
],
|
|
10
|
+
"testCases": [
|
|
11
|
+
{
|
|
12
|
+
"id": "TC-035-no-literal-path-in-applied-tree",
|
|
13
|
+
"acId": "AC-1202-1",
|
|
14
|
+
"description": "Applying all three amended blueprints and grepping the applied rcf/ tree for the five literal path strings returns zero matches",
|
|
15
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 3: no literal probe path outside probe-endpoints prose or Historical ADRs in applied tree",
|
|
16
|
+
"status": "pending",
|
|
17
|
+
"scope": "library"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"status": "draft",
|
|
21
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
22
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
23
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-036",
|
|
3
|
+
"usId": "US-1203",
|
|
4
|
+
"title": "Each amended blueprint carries the ratified alignment facts (probe-endpoints, essentials, api-rest)",
|
|
5
|
+
"purpose": "Cover the three ACs on US-1203: probe-endpoints has the optional startup ACs and composing section; essentials has path-neutral REQs/TACs and boot-refusal ACs; api-rest defers all probe paths to the resolved set.",
|
|
6
|
+
"testLevel": "integration",
|
|
7
|
+
"acIds": [
|
|
8
|
+
"AC-1203-1",
|
|
9
|
+
"AC-1203-2",
|
|
10
|
+
"AC-1203-3"
|
|
11
|
+
],
|
|
12
|
+
"testCases": [
|
|
13
|
+
{
|
|
14
|
+
"id": "TC-036-probe-endpoints-optional-startup",
|
|
15
|
+
"acId": "AC-1203-1",
|
|
16
|
+
"description": "probe-endpoints v1.1.0 declares the optional startup path across ADR-1503, US-14102 AC-14102-4, US-14107 AC-14107-4, and the guide composing section",
|
|
17
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 4: bare compose default declares /live and /ready; optional /startup; loadBalancer /health",
|
|
18
|
+
"status": "pending",
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "TC-036-essentials-path-neutral-and-refusal",
|
|
23
|
+
"acId": "AC-1203-2",
|
|
24
|
+
"description": "essentials v2.0.0 restates REQ-001/002 path-neutral, marks TAC-801/802 path as REQUIRED with no default, and adds AC-7101-4/AC-7102-4 for the PROBE_INTERFACE_PATHS_MISSING boot refusal",
|
|
25
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 5: essentials-alone declares required probeInterface.paths and refuses boot when absent",
|
|
26
|
+
"status": "pending",
|
|
27
|
+
"scope": "library"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "TC-036-essentials-no-shipped-default",
|
|
31
|
+
"acId": "AC-1203-2",
|
|
32
|
+
"description": "TAC-801/802 interfaces carry no literal /healthz or /readyz path defaults and mark the path parameter as REQUIRED",
|
|
33
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 7: essentials-alone shape gates on required probeInterface.paths, TACs carry no shipped default",
|
|
34
|
+
"status": "pending",
|
|
35
|
+
"scope": "library"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "TC-036-essentials-no-dual-handler",
|
|
39
|
+
"acId": "AC-1203-2",
|
|
40
|
+
"description": "essentials TAC-801/802 responsibilities name the no-dual-handler semantics when probe-endpoints is composed",
|
|
41
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 9: essentials TAC-801/802 promise no dual handler registration when probe-endpoints is composed",
|
|
42
|
+
"status": "pending",
|
|
43
|
+
"scope": "library"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "TC-036-api-rest-auth-exempt-list",
|
|
47
|
+
"acId": "AC-1203-3",
|
|
48
|
+
"description": "api-rest US-2108 AC-2108-5 binds the auth-exempt assertion to the resolved probe path set naming getExemptPathSet, and TAC-306 responsibilities carry the same binding",
|
|
49
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 6: api-rest auth-exempt list equals the probe-endpoints resolved path set",
|
|
50
|
+
"status": "pending",
|
|
51
|
+
"scope": "library"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "TC-036-api-rest-startup-consumption",
|
|
55
|
+
"acId": "AC-1203-3",
|
|
56
|
+
"description": "api-rest US-2108 AC-2108-4 binds the startup semantics to the resolved startup path and names the startup.enabled flag or probeInterface.paths.startup as the enablement source",
|
|
57
|
+
"testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 8: startup binding when enabled is declared on probe-endpoints and consumed by api-rest",
|
|
58
|
+
"status": "pending",
|
|
59
|
+
"scope": "library"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"status": "draft",
|
|
63
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
64
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
65
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-037",
|
|
3
|
+
"usId": "US-1204",
|
|
4
|
+
"title": "`rcf define blueprint remove-resolution <adr-id>` verb: remove + idempotent + refuse behaviours",
|
|
5
|
+
"purpose": "Cover the single AC on US-1204: the ratified three-behaviour surface (remove entry, idempotent re-run, refuse-exit-2 on malformed or unknown id) end-to-end through the CLI, plus the help block advertising the verb.",
|
|
6
|
+
"testLevel": "integration",
|
|
7
|
+
"acIds": [
|
|
8
|
+
"AC-1204-1"
|
|
9
|
+
],
|
|
10
|
+
"testCases": [
|
|
11
|
+
{
|
|
12
|
+
"id": "TC-037-remove-drops-entry-and-prints-line",
|
|
13
|
+
"acId": "AC-1204-1",
|
|
14
|
+
"description": "One resolutions[] entry seeded with resolvedByAdrId 'ADR-011-health-probes'; the verb prints the removal line naming the id, topic 'healthProbes' and resolution id, exits 0, drops the single entry from manifest.resolutions[], and leaves every other manifest section and the ruling ADR file on disk unchanged.",
|
|
15
|
+
"testPointer": "test/blueprint/cli.test.js::rcf blueprint remove-resolution drops the resolutions[] entry and prints one result line (spec A2)",
|
|
16
|
+
"status": "pending",
|
|
17
|
+
"scope": "library"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "TC-037-idempotent-second-run",
|
|
21
|
+
"acId": "AC-1204-1",
|
|
22
|
+
"description": "After a successful remove, a second run of the same command exits 0 and prints the 'nothing to remove' line without writing the manifest.",
|
|
23
|
+
"testPointer": "test/blueprint/cli.test.js::rcf blueprint remove-resolution is idempotent on re-run when the ruling ADR still exists on the tree",
|
|
24
|
+
"status": "pending",
|
|
25
|
+
"scope": "library"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "TC-037-refuse-malformed-adr-id",
|
|
29
|
+
"acId": "AC-1204-1",
|
|
30
|
+
"description": "A malformed id 'not-an-adr' exits 2 with the well-formed-ADR-id error on stderr.",
|
|
31
|
+
"testPointer": "test/blueprint/cli.test.js::rcf blueprint remove-resolution refuses exit 2 on a malformed <adr-id>",
|
|
32
|
+
"status": "pending",
|
|
33
|
+
"scope": "library"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "TC-037-refuse-unknown-adr-id",
|
|
37
|
+
"acId": "AC-1204-1",
|
|
38
|
+
"description": "A well-formed id ('ADR-999-nowhere') that names no ADR on the tree and no resolutions[] entry exits 2 with the 'is not a resolution entry' error on stderr.",
|
|
39
|
+
"testPointer": "test/blueprint/cli.test.js::rcf blueprint remove-resolution refuses exit 2 when <adr-id> is well-formed but names no ADR anywhere on the tree",
|
|
40
|
+
"status": "pending",
|
|
41
|
+
"scope": "library"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "TC-037-help-lists-verb",
|
|
45
|
+
"acId": "AC-1204-1",
|
|
46
|
+
"description": "`rcf help define blueprint` output contains the `remove-resolution <adr-id>` verb block including the idempotent-on-re-run line.",
|
|
47
|
+
"testPointer": "test/blueprint/cli.test.js::rcf help define blueprint prints the remove-resolution verb",
|
|
48
|
+
"status": "pending",
|
|
49
|
+
"scope": "library"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"status": "draft",
|
|
53
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
54
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
55
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-011",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Verify pins the Playwright MCP version and prints it in preflight",
|
|
8
|
+
"asA": "operator running rcf verify as the ship gate",
|
|
9
|
+
"iWant": "the verify launcher to provision a version-pinned @playwright/mcp instead of @latest, print the effective pin in preflight, record it in the report, and honour an emergency override with a loud stderr notice",
|
|
10
|
+
"soThat": "a newly published Playwright MCP release cannot become a silent runtime change on the next verify run, and every report artefact carries the exact browser tooling version the pass ran against",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1101-1",
|
|
14
|
+
"description": "packages/rcf-lite/src/verify/engine/launcher.js exports a PLAYWRIGHT_MCP_VERSION constant, and DEFAULT_MCP_CONFIG.args composes @playwright/mcp@<PLAYWRIGHT_MCP_VERSION> instead of @playwright/mcp@latest.",
|
|
15
|
+
"given": "the rcf-lite source at HEAD",
|
|
16
|
+
"when": "the launcher module is imported",
|
|
17
|
+
"then": "PLAYWRIGHT_MCP_VERSION resolves to a semver string and DEFAULT_MCP_CONFIG.mcpServers.playwright.args contains the exact-pinned @playwright/mcp@<version> token, with no @latest anywhere in the module",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-1101-2",
|
|
23
|
+
"description": "rcf verify run prints one preflight line naming the effective @playwright/mcp pin on stderr; the line is not suppressed by --quiet.",
|
|
24
|
+
"given": "a browser-facing fixture project and a stubbed verify launcher",
|
|
25
|
+
"when": "rcf verify run is invoked with valid required flags",
|
|
26
|
+
"then": "stderr contains one line matching /^Playwright MCP: pinned to @playwright\\/mcp@/ carrying the effective pin",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-1101-3",
|
|
32
|
+
"description": "rcf verify run --playwright-mcp-version <semver> overrides the pinned constant for one run, prints a loud stderr override notice, and records the effective pin on the report as runStats.playwrightMcpVersion. A non-semver value refuses with exit 2.",
|
|
33
|
+
"given": "the same fixture, run with --playwright-mcp-version 0.0.99",
|
|
34
|
+
"when": "the run completes",
|
|
35
|
+
"then": "stderr carries one line matching /^Playwright MCP: OVERRIDE @playwright\\/mcp@0\\.0\\.99/, the report's run.runStats.playwrightMcpVersion equals 0.0.99, and rerunning with --playwright-mcp-version notasemver exits 2 with a semver-shape error",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "AC-1101-4",
|
|
41
|
+
"description": "Even when no override fires, the report records the effective (default) pin as run.runStats.playwrightMcpVersion so a report re-render tells the operator what browser tooling the pass ran against.",
|
|
42
|
+
"given": "a completed verify run with no override",
|
|
43
|
+
"when": "the report JSON is inspected",
|
|
44
|
+
"then": "report.run.runStats.playwrightMcpVersion equals PLAYWRIGHT_MCP_VERSION",
|
|
45
|
+
"testable": true,
|
|
46
|
+
"scope": "runtime"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"createdAt": "2026-09-03T16:56:00Z",
|
|
50
|
+
"updatedAt": "2026-09-03T16:56:00Z"
|
|
51
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-011",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Application-spa declares browserSurface and delivery-ci-workflows materialises an e2e CI job",
|
|
8
|
+
"asA": "operator applying the application-spa and delivery-ci-workflows blueprints",
|
|
9
|
+
"iWant": "the SPA blueprint's manifest to declare a browserSurface field, its browser-facing acceptance criteria and e2e test-case template to ship, and the delivery-ci-workflows materialiser to wire a distinct e2e CI job when at least one applied blueprint carries a browserSurface",
|
|
10
|
+
"soThat": "e2e is a first-class declared test level in the chain, and browser-facing projects get a distinct pull-request-checks e2e job while API-only projects keep the existing workflow shape verbatim",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1102-1",
|
|
14
|
+
"description": "blueprints/application-spa/blueprint.json is at version 1.4.0 and carries a top-level browserSurface object with declared: true; the object also carries routes[] and themes[] as reference hint arrays.",
|
|
15
|
+
"given": "the SPA blueprint at HEAD",
|
|
16
|
+
"when": "blueprint.json is inspected",
|
|
17
|
+
"then": "version equals 1.4.0 and .browserSurface.declared is true",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-1102-2",
|
|
23
|
+
"description": "The SPA blueprint contributes two new browser-facing acceptance criteria in the 1101 to 1899 band (existing 1131 and 1132 are already occupied by unrelated 1.3.x contributions): US-1134 binds an e2e AC on application-spa-REQ-011 (iconography), US-1135 binds an e2e AC on application-spa-REQ-009 (user arrival and auth surfaces); a paste-in assets/tc-templates/e2e.md test-case template ships and names the browser-verify TAC as its driver seam.",
|
|
24
|
+
"given": "the SPA blueprint at HEAD",
|
|
25
|
+
"when": "blueprints/application-spa/contributions/user-stories/ and blueprints/application-spa/assets/tc-templates/ are inspected",
|
|
26
|
+
"then": "application-spa-us-1134.json and application-spa-us-1135.json exist, each binds one AC whose scope is deployed and whose description names an e2e observable at a rendered browser surface; assets/tc-templates/e2e.md exists and references TAC-208",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-1102-3",
|
|
32
|
+
"description": "blueprints/delivery-ci-workflows/blueprint.json is at version 2.2.0 and contributes a new US-6124 whose AC binds the elicited e2e check to a distinct e2e CI job that runs project testLevel: e2e cases against a local preview or --parity-env runtime, uploads browser artefacts, and reports a distinct row in the aggregate pipeline report.",
|
|
33
|
+
"given": "the delivery-ci-workflows blueprint at HEAD",
|
|
34
|
+
"when": "blueprint.json and contributions/user-stories/delivery-ci-workflows-us-6124.json are inspected",
|
|
35
|
+
"then": "version equals 2.2.0 and the US-6124 record binds an AC-6124-1 whose description names the four points above",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "library"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "AC-1102-4",
|
|
41
|
+
"description": "The illustrative GHA workflow at blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml carries a documented e2e job, and the alternate-provider notes file at ../notes.md carries one line per provider translating the same four points.",
|
|
42
|
+
"given": "the delivery-ci-workflows blueprint at HEAD",
|
|
43
|
+
"when": "the illustrative workflow file is inspected",
|
|
44
|
+
"then": "the workflow declares an e2e job as an example, and notes.md contains one line per provider (GitLab CI, CircleCI, Buildkite, Jenkins) naming the four points",
|
|
45
|
+
"testable": true,
|
|
46
|
+
"scope": "library"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "AC-1102-5",
|
|
50
|
+
"description": "Applying application-spa v1.4.0 to a scratch project produces a manifest that still validates against rcf-schemas 0.5.1; the applied blueprint record carries no new field, and doctor and the delivery-ci-workflows materialiser both read browserSurface from the applied record's source blueprint.json via the existing manifest.blueprints[].source reference.",
|
|
51
|
+
"given": "a scratch project created by rcf init with application-spa v1.4.0 applied",
|
|
52
|
+
"when": "the resulting rcf/manifest.json is validated against the shipped schemas",
|
|
53
|
+
"then": "validation passes and no browserSurface key appears on the applied blueprint record itself",
|
|
54
|
+
"testable": true,
|
|
55
|
+
"scope": "runtime"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"createdAt": "2026-09-03T16:56:00Z",
|
|
59
|
+
"updatedAt": "2026-09-03T16:56:00Z"
|
|
60
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-011",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "rcf doctor checks Playwright and a browser on browser-facing projects and skips them otherwise",
|
|
8
|
+
"asA": "operator running rcf doctor on either a browser-facing or an API-only project",
|
|
9
|
+
"iWant": "doctor to run playwright-present, browser-present, and playwright-mcp-reachable checks when at least one applied blueprint declares a browserSurface, and to skip all three with one printed reason line otherwise",
|
|
10
|
+
"soThat": "browser-facing projects surface missing Playwright, missing browser, or an unreachable @playwright/mcp with actionable fix lines, while API-only projects are not asked to install a browser stack they will never use",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1103-1",
|
|
14
|
+
"description": "packages/rcf-lite/package.json declares @playwright/mcp and playwright as optional peer dependencies (peerDependenciesMeta.<pkg>.optional: true). npm and pnpm do not fail install when the peers are absent.",
|
|
15
|
+
"given": "packages/rcf-lite at HEAD",
|
|
16
|
+
"when": "package.json is inspected",
|
|
17
|
+
"then": ".peerDependencies['@playwright/mcp'] and .peerDependencies.playwright are declared and .peerDependenciesMeta.<pkg>.optional is true for both",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-1103-2",
|
|
23
|
+
"description": "On a browser-facing fixture project (application-spa v1.4.0 applied), rcf doctor runs playwright-present, browser-present, and playwright-mcp-reachable; each check emits at most one fix line naming the exact remedy per the spec's fix-line table.",
|
|
24
|
+
"given": "a browser-facing fixture with no @playwright/mcp installed",
|
|
25
|
+
"when": "rcf doctor is run",
|
|
26
|
+
"then": "the three checks appear in the drift output and their fix lines match the spec's fix-line strings",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-1103-3",
|
|
32
|
+
"description": "On an API-only fixture project (application-api-rest applied, no browser-facing blueprint), rcf doctor prints one line naming the three skipped checks and their skip reason. The line is not suppressed by --quiet.",
|
|
33
|
+
"given": "an API-only fixture project",
|
|
34
|
+
"when": "rcf doctor is run",
|
|
35
|
+
"then": "stdout contains exactly one line 'rcf doctor: skipping playwright-present, browser-present, playwright-mcp-reachable (no applied blueprint declares a browser surface).'",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "AC-1103-4",
|
|
41
|
+
"description": "The three checks are legal values of --check <check>[,check]; passing one explicitly on a non-browser project overrides the skip and runs it.",
|
|
42
|
+
"given": "an API-only fixture project",
|
|
43
|
+
"when": "rcf doctor --check playwright-present is run",
|
|
44
|
+
"then": "the playwright-present check runs and reports its result rather than being skipped",
|
|
45
|
+
"testable": true,
|
|
46
|
+
"scope": "runtime"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"createdAt": "2026-09-03T16:56:00Z",
|
|
50
|
+
"updatedAt": "2026-09-03T16:56:00Z"
|
|
51
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-011",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "rcf init writes a Playwright MCP entry only when no scope-visible entry exists",
|
|
8
|
+
"asA": "operator running rcf init on a project with or without an ambient Playwright MCP entry",
|
|
9
|
+
"iWant": "init to detect a project-scope Playwright signature by command-tail matching, probe user scope via claude mcp list where the Claude Code harness is on PATH, write a distinctly named playwright-rcf project-scope entry only when it cannot prove any Playwright entry exists at any scope, and honour --no-playwright-mcp",
|
|
10
|
+
"soThat": "an operator with a user-scope Playwright MCP entry in Claude Code keeps it (init never shadows it) and an operator with none gets a working project-scope entry that shadows nothing at any scope by naming convention",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1104-1",
|
|
14
|
+
"description": "When the project-scope .mcp.json carries a Playwright signature (any entry key whose args contain a string matching /^@playwright\\/mcp(@|$)/), rcf init writes no Playwright entry and prints the 'left alone' line naming the key.",
|
|
15
|
+
"given": "a fixture project with a pre-existing mcpServers entry whose args include @playwright/mcp",
|
|
16
|
+
"when": "rcf init is run",
|
|
17
|
+
"then": "the .mcp.json keys are unchanged and stdout carries the line 'Playwright MCP: already registered in .mcp.json under key '<name>' at project scope, left alone.'",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-1104-2",
|
|
23
|
+
"description": "When the project-scope .mcp.json carries no Playwright signature, init probes the harness via an injectable seam (default: claude mcp list; 5 second timeout; text output parsed for the signature). Probe results 'entry found at user scope', 'no entry anywhere', 'CLI absent or non-zero', and 'output unparseable' each drive the correct downstream branch.",
|
|
24
|
+
"given": "a fixture project and a stubbed probe returning each of the four probe results in turn",
|
|
25
|
+
"when": "rcf init runs against each probe result",
|
|
26
|
+
"then": "'entry found' leaves .mcp.json untouched and prints the 'already registered at <scope> scope in Claude Code' line; 'no entry anywhere' writes the distinct playwright-rcf project-scope entry; both 'CLI absent or non-zero' and 'output unparseable' treat the probe as inconclusive and write the distinct playwright-rcf entry with the 'could not probe' notice",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-1104-3",
|
|
32
|
+
"description": "The playwright-rcf entry, when written, has key 'playwright-rcf' distinct from 'playwright', command 'npx', args ['-y', '@playwright/mcp@<PLAYWRIGHT_MCP_VERSION>'] and empty env.",
|
|
33
|
+
"given": "a fixture project with no ambient Playwright entry anywhere",
|
|
34
|
+
"when": "rcf init runs with the probe stubbed inconclusive",
|
|
35
|
+
"then": ".mcp.json.mcpServers['playwright-rcf'] equals { type: 'stdio', command: 'npx', args: ['-y', '@playwright/mcp@<version>'], env: {} }",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "AC-1104-4",
|
|
41
|
+
"description": "rcf init --no-playwright-mcp suppresses the write step for the Playwright entry entirely; the probe still runs so the print-out remains honest, but no .mcp.json Playwright entry is created and no existing one is touched.",
|
|
42
|
+
"given": "a fixture project with no ambient Playwright entry anywhere",
|
|
43
|
+
"when": "rcf init --no-playwright-mcp is run",
|
|
44
|
+
"then": ".mcp.json.mcpServers contains no key matching a Playwright signature",
|
|
45
|
+
"testable": true,
|
|
46
|
+
"scope": "runtime"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "AC-1104-5",
|
|
50
|
+
"description": "rcf doctor's playwright-mcp-redundant check fires only on browser-facing projects; when the project-scope .mcp.json carries a Playwright signature AND the probe reports a Playwright signature at user scope, doctor reports drift with the removal line naming --no-playwright-mcp and the hand-edit path. --fix does not repair this drift.",
|
|
51
|
+
"given": "a browser-facing fixture with a project-scope playwright entry and a stubbed probe reporting user-scope",
|
|
52
|
+
"when": "rcf doctor is run",
|
|
53
|
+
"then": "the drift output contains one 'playwright-mcp-redundant' entry naming the two remedies and no --fix action is applied",
|
|
54
|
+
"testable": true,
|
|
55
|
+
"scope": "runtime"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"createdAt": "2026-09-03T16:56:00Z",
|
|
59
|
+
"updatedAt": "2026-09-03T16:56:00Z"
|
|
60
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1201",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-012",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "observability-essentials + observability-probe-endpoints + application-api-rest compose cleanly in every ordering with no globalAdrTopic conflict on healthProbes or readinessSemantics",
|
|
8
|
+
"asA": "operator applying the three post-alignment observability + api-rest blueprints on one project in any order",
|
|
9
|
+
"iWant": "the three amended blueprints (essentials v2.0.0, probe-endpoints v1.1.0, api-rest v2.0.0) to apply cleanly in every ordering, with observability-probe-endpoints as the sole scope:global claimant of healthProbes and readinessSemantics in the resulting manifest",
|
|
10
|
+
"soThat": "a project that reaches for all three shipped blueprints inherits a single-owner probe-path surface without an operator-side supersede ADR or a manifest-editing follow-up",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1201-1",
|
|
14
|
+
"description": "Applying the three blueprints in every ordering (six permutations) into a freshly initialised project tree succeeds with no `globalAdrTopic` conflict on `healthProbes` or `readinessSemantics`; the resulting `rcf/manifest.json` carries all three blueprint records.",
|
|
15
|
+
"given": "a freshly initialised rcf-lite project tree and the three shipped blueprints at essentials v2.0.0, probe-endpoints v1.1.0, api-rest v2.0.0",
|
|
16
|
+
"when": "for each of the six permutations of the three blueprints, applyBlueprint runs three times in that order against a fresh project tree",
|
|
17
|
+
"then": "no ordering returns a `globalAdrTopic` conflict on healthProbes or readinessSemantics, and every ordering ends with manifest.blueprints containing observability-essentials, observability-probe-endpoints, and application-api-rest",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-1201-2",
|
|
23
|
+
"description": "In the applied manifest, exactly one blueprint declares `scope: global` with `topic: healthProbes` (observability-probe-endpoints ADR-1501) and exactly one declares `scope: global` with `topic: readinessSemantics` (observability-probe-endpoints ADR-1502); zero from essentials, zero from api-rest.",
|
|
24
|
+
"given": "a project with all three amended blueprints applied",
|
|
25
|
+
"when": "manifest.blueprints[].contributions[] is walked for scope:global ADRs on the two topics",
|
|
26
|
+
"then": "the claimant list for healthProbes equals [\"observability-probe-endpoints\"] and the claimant list for readinessSemantics equals [\"observability-probe-endpoints\"]",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": [],
|
|
32
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
33
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1202",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-012",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "The applied tree carries no literal probe path (/healthz, /readyz, /healthz/*) outside observability-probe-endpoints prose",
|
|
8
|
+
"asA": "operator or reviewer grepping an applied project tree for literal probe paths after re-applying the three amended blueprints",
|
|
9
|
+
"iWant": "zero matches for /healthz, /readyz, /healthz/live, /healthz/ready or /healthz/startup in the applied `rcf/` tree, so the shelf ships one probe-path opinion (the resolved one) and no rogue literals",
|
|
10
|
+
"soThat": "a project that composes the three shipped blueprints never inherits a stale literal path binding that disagrees with the resolved probe path set",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1202-1",
|
|
14
|
+
"description": "Grepping the applied `rcf/` tree of a project that has re-applied observability-essentials v2.0.0 + observability-probe-endpoints v1.1.0 + application-api-rest v2.0.0 for the strings `/healthz/live`, `/healthz/ready`, `/healthz/startup`, `/healthz`, and `/readyz` returns zero matches across all contribution JSON files.",
|
|
15
|
+
"given": "a project with all three amended blueprints applied",
|
|
16
|
+
"when": "the applied `rcf/` tree is grepped for the five literal probe-path strings above",
|
|
17
|
+
"then": "the match count is zero (matches remain only in the source blueprint READMEs and guides for observability-probe-endpoints, never in the applied contribution JSON)",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": [],
|
|
23
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1203",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-012",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Each amended blueprint carries the ratified alignment facts: probe-endpoints optional startup + composing section; essentials path-neutral REQs/TACs and PROBE_INTERFACE_PATHS_MISSING; api-rest defers all probe paths",
|
|
8
|
+
"asA": "reviewer walking the three amended blueprint source directories after the alignment lands",
|
|
9
|
+
"iWant": "each blueprint to carry the shape the spec ratified: observability-probe-endpoints v1.1.0 adds the optional startup path and a composing section; observability-essentials v2.0.0 restates REQ-001/002 and TAC-801/802 path-neutral and names the PROBE_INTERFACE_PATHS_MISSING boot refusal; application-api-rest v2.0.0 defers probe paths to the resolved set with a matching AC on the auth-exempt list and a startup AC that consumes the optional path",
|
|
10
|
+
"soThat": "a downstream project (or a gate reviewer walking the shelf) reads the ratified alignment off the source blueprints directly, without needing to reconstruct the intent from the spec",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1203-1",
|
|
14
|
+
"description": "observability-probe-endpoints/blueprint.json declares version 1.1.0. US-14102 carries a new AC-14102-4 naming the three-path resolution (/live, /ready, /startup) and the startup handler when `probeInterface.options.kubernetes.startup.enabled: true`. US-14107 carries a new AC-14107-4 naming the three-entry auth-exempt list when startup is enabled. ADR-1503 decision text names the startup.enabled flag, the same body shape, and the fused topology by default. `guide/observability-probe-endpoints.md` carries a \"Composing with observability-essentials and application-api-rest\" section naming the deferral pattern and the compose test at `packages/rcf-lite/test/blueprint/probe-path-alignment.test.js` as the ratified truth.",
|
|
15
|
+
"given": "the shipped observability-probe-endpoints blueprint source directory at HEAD",
|
|
16
|
+
"when": "blueprint.json, US-14102, US-14107, ADR-1503, and the guide are read",
|
|
17
|
+
"then": "blueprint.json version equals 1.1.0; AC-14102-4 and AC-14107-4 exist and name the startup path; ADR-1503 decision names startup.enabled; the guide carries the composing section naming the compose test path",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-1203-2",
|
|
23
|
+
"description": "observability-essentials/blueprint.json declares version 2.0.0; the ADR-801 and ADR-802 contribution entries no longer carry `scope: \"global\"` or `topic`. REQ-001 and REQ-002 restate path-neutral and name `probeInterface.paths.liveness` / `probeInterface.paths.readiness` as the required configuration key. TAC-801 and TAC-802 mark the path as REQUIRED with no shipped default and name the `PROBE_INTERFACE_PATHS_MISSING` stable-coded boot refusal on the responsibilities list. US-7101 gains AC-7101-4 and US-7102 gains AC-7102-4 covering the boot-refusal-on-missing-config semantics. `docs/topics.md` shrinks the global-topics table to `statusPageContract` alone and records `healthProbes` and `readinessSemantics` in a \"Historical global topics (dropped in v2.0.0)\" section.",
|
|
24
|
+
"given": "the shipped observability-essentials blueprint source directory at HEAD",
|
|
25
|
+
"when": "blueprint.json, ADR-801, ADR-802, REQ-001, REQ-002, TAC-801, TAC-802, US-7101, US-7102, and docs/topics.md are read",
|
|
26
|
+
"then": "blueprint.json version equals 2.0.0; ADR-801/802 contribution entries carry no scope or topic field; REQ-001/002 name probeInterface.paths and refuses-boot; TAC-801/802 mark path as REQUIRED and name PROBE_INTERFACE_PATHS_MISSING; AC-7101-4 and AC-7102-4 exist; topics.md carries the Historical global topics section",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "library"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-1203-3",
|
|
32
|
+
"description": "application-api-rest/blueprint.json declares version 2.0.0. REQ-006 restates path-neutral naming observability-probe-endpoints as the probe-path owner and probeInterface.paths as the essentials-alone fallback. US-2108 all eight ACs bind to \"the resolved liveness path\", \"the resolved readiness path\", or \"the resolved startup path\"; AC-2108-5 binds the auth-exempt assertion to the resolved probe path set (naming `getExemptPathSet` from TAC-1501). TAC-306 responsibilities restate the three probe surfaces at their resolved paths, drop the literal path strings, and name the auth-exempt consumption of the resolved set. US-2103 versioning-exemption AC no longer carries the literal `/healthz/*` and names the resolved probe paths instead.",
|
|
33
|
+
"given": "the shipped application-api-rest blueprint source directory at HEAD",
|
|
34
|
+
"when": "blueprint.json, REQ-006, US-2108 (all eight ACs), TAC-306, and US-2103 are read",
|
|
35
|
+
"then": "blueprint.json version equals 2.0.0; REQ-006 names probe-endpoints and probeInterface.paths as the two path-resolution sources; every US-2108 AC contains \"resolved\" and none contains a literal /healthz/* prefix; TAC-306 responsibilities name the resolved probe path set and getExemptPathSet or probeInterface.paths; US-2103 no longer contains /healthz/*",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "library"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": [],
|
|
41
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
42
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
43
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-1204",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-012",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Operator running `rcf define blueprint remove-resolution <adr-id>` drops a redundant historical resolutions[] entry cleanly (spec section 9 remedy)",
|
|
8
|
+
"asA": "operator running `rcf doctor --check probe-path-owner` on a project that upgraded to observability-essentials v2.0.0 + observability-probe-endpoints v1.1.0 and now sees a redundant-<topic>-resolution drift line",
|
|
9
|
+
"iWant": "the `rcf define blueprint remove-resolution <adr-id>` verb the drift line and section 9 name to actually exist, drop the named manifest.resolutions[] entry (and nothing else), refuse exit 2 when the id is not a resolution entry, and be idempotent on a second run",
|
|
10
|
+
"soThat": "the section 9 migration remedy printed by the doctor is executable verbatim, and re-running the same command after a successful pass is a no-op rather than a refusal",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-1204-1",
|
|
14
|
+
"description": "The `rcf define blueprint remove-resolution <adr-id>` verb exists on the blueprint CLI (advertised in `rcf help define blueprint`), matches the `<adr-id>` argument against `manifest.resolutions[].resolvedByAdrId`, and exhibits three ratified behaviours: (a) when an entry matches, drop that entry and only that entry from `manifest.resolutions[]` (every other manifest section byte-identical, and the project-level ADR file at `rcf/adrs/<adr-id>.json` untouched), print one result line naming the id, the topic, and the dropped resolution id, and exit 0; (b) when the `<adr-id>` is a well-formed ADR id that still names an ADR present on the project tree but is no longer on any `resolutions[]` entry, print `[blueprint] nothing to remove: '<adr-id>' is not on manifest.resolutions[]` and exit 0 (idempotent on re-run of the same operation); (c) when the `<adr-id>` is malformed against the ADR id grammar, or is well-formed but names no ADR on the tree and no resolutions[] entry, print `[error] blueprint remove-resolution: ...` on stderr and exit 2.",
|
|
15
|
+
"given": "a project whose manifest.resolutions[] carries one globalAdrTopic entry on healthProbes with resolvedByAdrId = 'ADR-011-health-probes' and the ADR file present at rcf/adrs/adr-011-health-probes.json",
|
|
16
|
+
"when": "the operator runs `rcf define blueprint remove-resolution ADR-011-health-probes` once, then a second time, then with 'not-an-adr' and with 'ADR-999-nowhere'",
|
|
17
|
+
"then": "the first run exits 0 with the removal line and drops the single resolutions[] entry (project-ADR file untouched, every other manifest section byte-identical); the second run exits 0 with the 'nothing to remove' line and does not write; 'not-an-adr' exits 2 with 'is not a well-formed ADR id'; 'ADR-999-nowhere' exits 2 with 'is not a resolution entry on this manifest'; and `rcf help define blueprint` output contains the `remove-resolution <adr-id>` verb block",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "library"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": [],
|
|
23
|
+
"createdAt": "2026-09-04T00:00:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T00:00:00Z"
|
|
25
|
+
}
|
package/releases/releases.yaml
CHANGED
|
@@ -40,8 +40,28 @@
|
|
|
40
40
|
# `npm install rcf-lite`.
|
|
41
41
|
|
|
42
42
|
feedVersion: 1
|
|
43
|
-
latest: "0.
|
|
43
|
+
latest: "0.18.0"
|
|
44
44
|
releases:
|
|
45
|
+
- version: "0.18.0"
|
|
46
|
+
date: "2026-09-04"
|
|
47
|
+
breaking: true
|
|
48
|
+
headlines:
|
|
49
|
+
- "The rcf-lite blueprint shelf now names a single owner for probe paths across the observability, API and Kubernetes surfaces, so a project that composes more than one of these blueprints no longer has to reconcile duplicate claims by hand."
|
|
50
|
+
- "observability-essentials v2.0.0 and application-api-rest v2.0.0 drop their shipped literal /healthz and /readyz path defaults and defer to the resolved path set from observability-probe-endpoints v1.1.0, which also adds an optional Kubernetes /startup path (off by default, on per project via probeInterface.options.kubernetes.startup.enabled)."
|
|
51
|
+
- "rcf doctor grows a probe-path-owner check that flags a project applying more than one blueprint on the probe-path topic; rcf define blueprint remove-resolution <adr-id> is the paired remedy verb that drops a single manifest resolutions entry. Migration: a project on essentials v1.x alone needs one probeInterface.paths line per environment on re-apply unless it also composes probe-endpoints v1.1.0 or later; a project that applied both essentials v1.x and probe-endpoints v1.0.0 with a superseding project-level ADR will see the new doctor check flag those resolutions as redundant with the remove-resolution verb as the hint."
|
|
52
|
+
minAgentAction: null
|
|
53
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
54
|
+
|
|
55
|
+
- version: "0.17.0"
|
|
56
|
+
date: "2026-09-04"
|
|
57
|
+
breaking: false
|
|
58
|
+
headlines:
|
|
59
|
+
- "rcf verify now pins the Playwright MCP browser tooling to a specific version, prints the effective pin on preflight and lands it on the run report, and takes a one-run override for emergency use."
|
|
60
|
+
- "rcf doctor grows four checks for browser-facing projects (Playwright installed, a browser available, the Playwright MCP reachable, and no shadowed duplicate entry), routed by an applied blueprint declaring a browser surface; API-only projects see one skip line."
|
|
61
|
+
- "rcf init writes a Playwright MCP entry only when no scope-visible one exists; when it cannot prove absence it writes a distinctly named playwright-rcf project-scope entry, and --no-playwright-mcp opts out entirely. application-spa v1.4.0 and delivery-ci-workflows v2.2.0 ship the paired browser stories and the illustrative e2e job as a documentation contract."
|
|
62
|
+
minAgentAction: null
|
|
63
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
64
|
+
|
|
45
65
|
- version: "0.16.0"
|
|
46
66
|
date: "2026-09-03"
|
|
47
67
|
breaking: false
|
package/src/blueprint/index.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
export { applyBlueprint } from './apply.js';
|
|
4
4
|
export { listBlueprints, enrichRowsWithCategories, groupRowsByCategory } from './list.js';
|
|
5
5
|
export { removeBlueprint } from './remove.js';
|
|
6
|
+
export { removeResolution } from './remove-resolution.js';
|
|
6
7
|
export { loadBlueprint } from './loader.js';
|
|
7
8
|
export { detectGlobalAdrConflicts, detectCrossBlueprintClaims, renderConflictReport, conflictReportJson } from './conflicts.js';
|
|
8
9
|
export { stampId, parseIdParts, namespaceStyleFor, isNamespacedFor } from './namespace.js';
|