rcf-lite 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/blueprints/application-spa/assets/tc-templates/e2e.md +85 -0
  3. package/blueprints/application-spa/blueprint.json +24 -2
  4. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1134.json +24 -0
  5. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1135.json +24 -0
  6. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +69 -0
  7. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +18 -0
  8. package/blueprints/delivery-ci-workflows/blueprint.json +301 -60
  9. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6124.json +28 -0
  10. package/fixtures/canary-manifest.json +9 -9
  11. package/package.json +13 -1
  12. package/rcf/code-nodes/cn-070.json +12 -0
  13. package/rcf/code-nodes/cn-071.json +12 -0
  14. package/rcf/code-nodes/cn-072.json +12 -0
  15. package/rcf/code-nodes/cn-073.json +12 -0
  16. package/rcf/fbs/fbs-020.json +18 -0
  17. package/rcf/fbs/fbs-021.json +18 -0
  18. package/rcf/fbs/fbs-022.json +18 -0
  19. package/rcf/fbs/fbs-023.json +18 -0
  20. package/rcf/prd.json +3 -2
  21. package/rcf/requirements/req-011.json +22 -0
  22. package/rcf/test-suites/ts-030.json +66 -0
  23. package/rcf/test-suites/ts-031.json +59 -0
  24. package/rcf/test-suites/ts-032.json +50 -0
  25. package/rcf/test-suites/ts-033.json +83 -0
  26. package/rcf/user-stories/us-1101.json +51 -0
  27. package/rcf/user-stories/us-1102.json +60 -0
  28. package/rcf/user-stories/us-1103.json +51 -0
  29. package/rcf/user-stories/us-1104.json +60 -0
  30. package/releases/releases.yaml +11 -1
  31. package/src/blueprint/supersede.js +2 -2
  32. package/src/cli/doctor.js +182 -5
  33. package/src/cli/init.js +166 -0
  34. package/src/setup/playwright-checks.js +426 -0
  35. package/src/verify/cli/run.js +28 -0
  36. package/src/verify/engine/index.js +24 -4
  37. package/src/verify/engine/launcher.js +41 -10
package/rcf/prd.json CHANGED
@@ -18,7 +18,8 @@
18
18
  "SDD build loop: assemble an implementation prompt from a build specification and mark it done on merge",
19
19
  "Local stdio MCP surface exposing query, CRUD, view and build to AI tooling",
20
20
  "Validation of every document against the published schema package at every boundary",
21
- "Deploy-aware, runtime-honest build guidance: a documented local preview as the default build outcome, an early deploy-target question that constrains the stack, and runtime-provenance labels on verification claims"
21
+ "Deploy-aware, runtime-honest build guidance: a documented local preview as the default build outcome, an early deploy-target question that constrains the stack, and runtime-provenance labels on verification claims",
22
+ "End-to-end verification contract: version-pinned Playwright MCP in verify, e2e as a declared test level in the chain (application-spa browserSurface and delivery-ci-workflows e2e CI job), doctor checks for browser-facing projects, and init that writes a Playwright MCP entry only when no scope-visible entry exists"
22
23
  ],
23
24
  "outOfScope": [
24
25
  "The schema package itself, which is the separately published rcf-schemas contract",
@@ -43,5 +44,5 @@
43
44
  "MCP transport is local stdio only"
44
45
  ],
45
46
  "createdAt": "2026-06-25T00:00:00Z",
46
- "updatedAt": "2026-07-20T17:56:57.237Z"
47
+ "updatedAt": "2026-09-03T16:56:00Z"
47
48
  }
@@ -0,0 +1,22 @@
1
+ {
2
+ "reqId": "REQ-011",
3
+ "prdId": "PRD-001",
4
+ "title": "e2e verification contract: pinned Playwright MCP, declared e2e test level, doctor and init behaviour",
5
+ "description": "The rcf-lite verify pass provisions a version-pinned Playwright MCP server instead of @latest, prints the effective pin in preflight, and honours an emergency override. The rcf method exposes e2e as a declared test level: the application-spa blueprint declares a browserSurface, contributes browser-facing acceptance criteria, and cross-links a test-case template to the browser-verify TAC; the delivery-ci-workflows blueprint materialises a distinct e2e CI job when an applied blueprint declares a browserSurface. rcf doctor gains playwright-present, browser-present, playwright-mcp-reachable, and playwright-mcp-redundant checks for browser-facing projects; non-browser projects skip the three with one reason line. rcf init writes a Playwright MCP entry only when a project-scope signature is absent and a user-scope harness probe cannot prove one exists; otherwise it leaves the wiring alone or writes the distinctly named playwright-rcf fallback. All four parts observe the ratified 2026-09-03 e2e contract at projects/rcf-lite-wsd/specs/rcf-lite-e2e-contract-spec-2026-09-03.md.",
6
+ "category": "functional",
7
+ "domain": "verify",
8
+ "priority": "must",
9
+ "rationale": "Verify is the ship gate. A silent runtime change in the browser MCP on the next verify run is the reproducibility hole Baz named on 2026-09-03. Pinning the MCP closes it. Formalising e2e as a declared test level gives browser-facing projects a first-class contract instead of relying on the verify browser stage as a proxy for coverage. Doctor and init together make Playwright the operator's decision, not rcf-lite's ambient inheritance.",
10
+ "tags": [
11
+ "verify",
12
+ "playwright-mcp",
13
+ "e2e",
14
+ "blueprint-library",
15
+ "doctor",
16
+ "init"
17
+ ],
18
+ "version": "0.1.0",
19
+ "status": "draft",
20
+ "createdAt": "2026-09-03T16:56:00Z",
21
+ "updatedAt": "2026-09-03T16:56:00Z"
22
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "id": "TS-030",
3
+ "usId": "US-1101",
4
+ "title": "Verify pins the Playwright MCP version, prints it in preflight, honours the override",
5
+ "purpose": "Cover the four ACs on US-1101: the pinned constant + composed default MCP config, the preflight stderr line, the override notice + non-semver refusal, and the default pin lands on the report as runStats.playwrightMcpVersion.",
6
+ "testLevel": "unit",
7
+ "acIds": [
8
+ "AC-1101-1",
9
+ "AC-1101-2",
10
+ "AC-1101-3",
11
+ "AC-1101-4"
12
+ ],
13
+ "testCases": [
14
+ {
15
+ "id": "TC-030-pin-constant-exported",
16
+ "acId": "AC-1101-1",
17
+ "description": "PLAYWRIGHT_MCP_VERSION is exported as a semver string, not @latest",
18
+ "testPointer": "test/verify/engine/launcher.test.js::PLAYWRIGHT_MCP_VERSION is exported as a semver string and is NOT @latest",
19
+ "status": "pending",
20
+ "scope": "library"
21
+ },
22
+ {
23
+ "id": "TC-030-default-config-uses-pin",
24
+ "acId": "AC-1101-1",
25
+ "description": "DEFAULT_MCP_CONFIG.args composes @playwright/mcp with the pinned version and never @latest",
26
+ "testPointer": "test/verify/engine/launcher.test.js::DEFAULT_MCP_CONFIG composes @playwright/mcp with the pinned version (never @latest)",
27
+ "status": "pending",
28
+ "scope": "library"
29
+ },
30
+ {
31
+ "id": "TC-030-preflight-line",
32
+ "acId": "AC-1101-2",
33
+ "description": "rcf verify run prints one preflight line naming the effective @playwright/mcp pin on stderr",
34
+ "testPointer": "test/verify/cli/run.test.js::run: preflight prints the pinned Playwright MCP version to stderr",
35
+ "status": "pending",
36
+ "scope": "runtime"
37
+ },
38
+ {
39
+ "id": "TC-030-override-notice",
40
+ "acId": "AC-1101-3",
41
+ "description": "--playwright-mcp-version fires the loud stderr override notice and records the effective pin on the report",
42
+ "testPointer": "test/verify/cli/run.test.js::run: --playwright-mcp-version fires the loud override notice AND lands on the report",
43
+ "status": "pending",
44
+ "scope": "runtime"
45
+ },
46
+ {
47
+ "id": "TC-030-override-non-semver-refused",
48
+ "acId": "AC-1101-3",
49
+ "description": "--playwright-mcp-version with a non-semver value refuses exit 2 with the spec-named message",
50
+ "testPointer": "test/verify/cli/run.test.js::run: --playwright-mcp-version with a non-semver value refuses exit 2 with the spec-named message",
51
+ "status": "pending",
52
+ "scope": "runtime"
53
+ },
54
+ {
55
+ "id": "TC-030-default-pin-on-report",
56
+ "acId": "AC-1101-4",
57
+ "description": "Even with no override the report records the default pin as runStats.playwrightMcpVersion",
58
+ "testPointer": "test/verify/cli/run.test.js::run: default pin lands on the report as runStats.playwrightMcpVersion even with no override",
59
+ "status": "pending",
60
+ "scope": "runtime"
61
+ }
62
+ ],
63
+ "status": "draft",
64
+ "createdAt": "2026-09-03T18:30:50Z",
65
+ "updatedAt": "2026-09-03T18:30:50Z"
66
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "id": "TS-031",
3
+ "usId": "US-1102",
4
+ "title": "application-spa v1.4.0 declares browserSurface, delivery-ci-workflows v2.2.0 documents the e2e job",
5
+ "purpose": "Cover the five ACs on US-1102: SPA blueprint at 1.4.0 with browserSurface.declared, the two new e2e user stories plus the e2e.md template, delivery-ci-workflows v2.2.0 US-6124 binding the four e2e-job points, the illustrative GHA workflow + per-provider notes, and the applied manifest validating with no browserSurface on the applied record.",
6
+ "testLevel": "contract",
7
+ "acIds": [
8
+ "AC-1102-1",
9
+ "AC-1102-2",
10
+ "AC-1102-3",
11
+ "AC-1102-4",
12
+ "AC-1102-5"
13
+ ],
14
+ "testCases": [
15
+ {
16
+ "id": "TC-031-spa-version-and-flag",
17
+ "acId": "AC-1102-1",
18
+ "description": "SPA blueprint.json is at version 1.4.0 and browserSurface.declared is true",
19
+ "testPointer": "test/blueprint/apply-spa-v1-4-0-schema.test.js::AC-1102-5: apply application-spa v1.4.0 -> manifest still validates + no browserSurface on the applied record",
20
+ "status": "pending",
21
+ "scope": "library"
22
+ },
23
+ {
24
+ "id": "TC-031-spa-us-and-template",
25
+ "acId": "AC-1102-2",
26
+ "description": "SPA contributes US-1134 and US-1135 as browser-facing e2e stories, and ships assets/tc-templates/e2e.md naming the browser-verify driver seam",
27
+ "testPointer": "test/blueprint/e2e-contract-blueprint-facts.test.js::AC-1102-2: application-spa ships US-1134 and US-1135 as browser-facing (scope: deployed) e2e stories, plus the e2e.md template",
28
+ "status": "pending",
29
+ "scope": "library"
30
+ },
31
+ {
32
+ "id": "TC-031-ci-us-6124",
33
+ "acId": "AC-1102-3",
34
+ "description": "delivery-ci-workflows v2.2.0 contributes US-6124 whose AC-6124-1 names the four e2e-job points",
35
+ "testPointer": "test/blueprint/e2e-contract-blueprint-facts.test.js::AC-1102-3: delivery-ci-workflows v2.2.0 US-6124 binds an AC naming the four e2e-job points",
36
+ "status": "pending",
37
+ "scope": "library"
38
+ },
39
+ {
40
+ "id": "TC-031-illustrative-workflow-and-notes",
41
+ "acId": "AC-1102-4",
42
+ "description": "Illustrative GHA pull-request-checks.yml carries the e2e job block and notes.md translates it per provider",
43
+ "testPointer": "test/blueprint/e2e-contract-blueprint-facts.test.js::AC-1102-4: illustrative GHA pull-request-checks.yml carries the e2e job and notes.md translates the four points per provider",
44
+ "status": "pending",
45
+ "scope": "library"
46
+ },
47
+ {
48
+ "id": "TC-031-manifest-validates",
49
+ "acId": "AC-1102-5",
50
+ "description": "Applying SPA v1.4.0 produces a manifest that still validates against rcf-schemas 0.5.1 and the applied record carries no browserSurface field",
51
+ "testPointer": "test/blueprint/apply-spa-v1-4-0-schema.test.js::AC-1102-5: apply application-spa v1.4.0 -> manifest still validates + no browserSurface on the applied record",
52
+ "status": "pending",
53
+ "scope": "runtime"
54
+ }
55
+ ],
56
+ "status": "draft",
57
+ "createdAt": "2026-09-03T18:30:50Z",
58
+ "updatedAt": "2026-09-03T18:30:50Z"
59
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "id": "TS-032",
3
+ "usId": "US-1103",
4
+ "title": "rcf doctor Playwright + browser checks on browser-facing projects",
5
+ "purpose": "Cover the four ACs on US-1103: peer-dependency declaration for @playwright/mcp and playwright as optional peers, the three doctor checks reporting fix lines on a browser-facing project, the skip line on an API-only project, and the --check override running one of the three checks on demand.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1103-1",
9
+ "AC-1103-2",
10
+ "AC-1103-3",
11
+ "AC-1103-4"
12
+ ],
13
+ "testCases": [
14
+ {
15
+ "id": "TC-032-peer-deps-optional",
16
+ "acId": "AC-1103-1",
17
+ "description": "packages/rcf-lite/package.json declares @playwright/mcp and playwright as optional peer dependencies",
18
+ "testPointer": "test/pkg/peer-deps-playwright.test.js::AC-1103-1: @playwright/mcp and playwright are declared as optional peer dependencies",
19
+ "status": "pending",
20
+ "scope": "library"
21
+ },
22
+ {
23
+ "id": "TC-032-fix-lines",
24
+ "acId": "AC-1103-2",
25
+ "description": "A browser-facing project with the three items missing reports all three fix lines exactly per the spec",
26
+ "testPointer": "test/cli/doctor-playwright.test.js::doctor: browser-facing project with everything missing reports all three fix lines",
27
+ "status": "pending",
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "TC-032-skip-line",
32
+ "acId": "AC-1103-3",
33
+ "description": "An API-only project prints the skip line and does not run the three checks",
34
+ "testPointer": "test/cli/doctor-playwright.test.js::doctor: API-only project prints the skip line and does NOT run the three checks",
35
+ "status": "pending",
36
+ "scope": "runtime"
37
+ },
38
+ {
39
+ "id": "TC-032-check-override",
40
+ "acId": "AC-1103-4",
41
+ "description": "--check playwright-present on an API-only project overrides the skip and runs the check",
42
+ "testPointer": "test/cli/doctor-playwright.test.js::doctor --check playwright-present on an API-only project runs the check anyway (spec 3.5)",
43
+ "status": "pending",
44
+ "scope": "runtime"
45
+ }
46
+ ],
47
+ "status": "draft",
48
+ "createdAt": "2026-09-03T18:30:50Z",
49
+ "updatedAt": "2026-09-03T18:30:50Z"
50
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "id": "TS-033",
3
+ "usId": "US-1104",
4
+ "title": "rcf init Playwright MCP entry write only when no scope-visible entry exists",
5
+ "purpose": "Cover the five ACs on US-1104: signature-based project-scope detection leaves a pre-existing entry alone, the injected probe drives the four downstream branches (none/found/inconclusive/CLI-absent), the distinct 'playwright-rcf' entry has the exact shape, --no-playwright-mcp suppresses the write, and doctor's redundant-entry probe fires only on browser-facing projects.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1104-1",
9
+ "AC-1104-2",
10
+ "AC-1104-3",
11
+ "AC-1104-4",
12
+ "AC-1104-5"
13
+ ],
14
+ "testCases": [
15
+ {
16
+ "id": "TC-033-project-scope-signature-left-alone",
17
+ "acId": "AC-1104-1",
18
+ "description": "A pre-existing project-scope Playwright signature leaves .mcp.json untouched and prints the 'left alone' line",
19
+ "testPointer": "test/cli/init-playwright.test.js::init: existing project-scope Playwright signature -> left alone (spec 4.1)",
20
+ "status": "pending",
21
+ "scope": "runtime"
22
+ },
23
+ {
24
+ "id": "TC-033-probe-none-writes-distinct",
25
+ "acId": "AC-1104-2",
26
+ "description": "Probe returning 'none' drives the distinct playwright-rcf project-scope write branch",
27
+ "testPointer": "test/cli/init-playwright.test.js::init: fresh project + probe=none -> writes distinctly named playwright-rcf entry",
28
+ "status": "pending",
29
+ "scope": "library"
30
+ },
31
+ {
32
+ "id": "TC-033-probe-found-leaves-alone",
33
+ "acId": "AC-1104-2",
34
+ "description": "Probe returning 'found' at user scope leaves .mcp.json alone with the 'already registered ... in Claude Code' line",
35
+ "testPointer": "test/cli/init-playwright.test.js::init: probe=found at user scope -> left alone; no project entry written (spec 4.2)",
36
+ "status": "pending",
37
+ "scope": "library"
38
+ },
39
+ {
40
+ "id": "TC-033-probe-inconclusive-writes-with-notice",
41
+ "acId": "AC-1104-2",
42
+ "description": "Probe returning 'inconclusive' writes the distinct entry and prints the could-not-probe notice (covers both CLI-absent and unparseable branches via the injected probe result)",
43
+ "testPointer": "test/cli/init-playwright.test.js::init: probe=inconclusive -> writes playwright-rcf entry AND prints the could-not-probe notice (spec 4.3)",
44
+ "status": "pending",
45
+ "scope": "library"
46
+ },
47
+ {
48
+ "id": "TC-033-distinct-entry-shape",
49
+ "acId": "AC-1104-3",
50
+ "description": "The written playwright-rcf entry equals { type:'stdio', command:'npx', args:['-y', '@playwright/mcp@<version>'], env:{} }",
51
+ "testPointer": "test/cli/init-playwright.test.js::init: fresh project + probe=none -> writes distinctly named playwright-rcf entry",
52
+ "status": "pending",
53
+ "scope": "runtime"
54
+ },
55
+ {
56
+ "id": "TC-033-no-playwright-mcp-suppresses-write",
57
+ "acId": "AC-1104-4",
58
+ "description": "--no-playwright-mcp suppresses the write; the probe still runs but no Playwright entry is created",
59
+ "testPointer": "test/cli/init-playwright.test.js::init --no-playwright-mcp: probe still runs, but no Playwright entry is written",
60
+ "status": "pending",
61
+ "scope": "runtime"
62
+ },
63
+ {
64
+ "id": "TC-033-redundant-fires-browser-facing",
65
+ "acId": "AC-1104-5",
66
+ "description": "playwright-mcp-redundant fires when project + user both declare Playwright on a browser-facing project",
67
+ "testPointer": "test/cli/doctor-playwright.test.js::doctor: playwright-mcp-redundant fires when project + user both declare Playwright (browser-facing only)",
68
+ "status": "pending",
69
+ "scope": "runtime"
70
+ },
71
+ {
72
+ "id": "TC-033-redundant-quiet-on-api-only",
73
+ "acId": "AC-1104-5",
74
+ "description": "playwright-mcp-redundant does NOT fire on an API-only project",
75
+ "testPointer": "test/cli/doctor-playwright.test.js::doctor: playwright-mcp-redundant does NOT fire on an API-only project (spec 4.5)",
76
+ "status": "pending",
77
+ "scope": "runtime"
78
+ }
79
+ ],
80
+ "status": "draft",
81
+ "createdAt": "2026-09-03T18:30:50Z",
82
+ "updatedAt": "2026-09-03T18:30:50Z"
83
+ }
@@ -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
+ }
@@ -40,8 +40,18 @@
40
40
  # `npm install rcf-lite`.
41
41
 
42
42
  feedVersion: 1
43
- latest: "0.16.0"
43
+ latest: "0.17.0"
44
44
  releases:
45
+ - version: "0.17.0"
46
+ date: "2026-09-04"
47
+ breaking: false
48
+ headlines:
49
+ - "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."
50
+ - "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."
51
+ - "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."
52
+ minAgentAction: null
53
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
54
+
45
55
  - version: "0.16.0"
46
56
  date: "2026-09-03"
47
57
  breaking: false
@@ -26,7 +26,7 @@
26
26
  // the refused-add state; the escalation the worker adapted around was
27
27
  // that AC-1002-5 could not pass as written. The `--incoming` argument
28
28
  // was subsequently fed directly to `loadBlueprint`, which understands
29
- // paths only — a newcomer who intuited the `@stock/<slug>` form from
29
+ // paths only; a newcomer who intuited the `@stock/<slug>` form from
30
30
  // `add`'s help hit a refusal. Persona re-run 2026-08-31 arc-4, H2.
31
31
  //
32
32
  // Two side effects, both governed by dryRun:
@@ -171,7 +171,7 @@ export async function supersedeBlueprintTopic({ projectRoot, tree, topic, incomi
171
171
  // For library-qualified sources the applied identity is rewired
172
172
  // under the library prefix (`<libraryPrefix>-<blueprintSlug>`), so
173
173
  // the supersedes[] entry must reference that effective slug and
174
- // stamp the ADR id under it — matching what `apply.js` writes to
174
+ // stamp the ADR id under it; matching what `apply.js` writes to
175
175
  // `manifest.blueprints[].slug`. For shelf / path sources the
176
176
  // blueprint's own slug applies.
177
177
  const effectiveSlug = resolved.kind === 'library'