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.
Files changed (94) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/blueprints/application-api-rest/README.md +5 -1
  3. package/blueprints/application-api-rest/blueprint.json +1 -1
  4. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +4 -4
  5. package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +9 -8
  6. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +3 -3
  7. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +27 -27
  8. package/blueprints/application-api-rest/docs/topics.md +2 -2
  9. package/blueprints/application-api-rest/guide/application-api-rest.md +5 -1
  10. package/blueprints/application-spa/assets/tc-templates/e2e.md +85 -0
  11. package/blueprints/application-spa/blueprint.json +24 -2
  12. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1134.json +24 -0
  13. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1135.json +24 -0
  14. package/blueprints/application-spa/docs/topics.md +2 -2
  15. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +69 -0
  16. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +18 -0
  17. package/blueprints/delivery-ci-workflows/blueprint.json +301 -60
  18. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6124.json +28 -0
  19. package/blueprints/delivery-ci-workflows/docs/topics.md +2 -2
  20. package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
  21. package/blueprints/email-smtp-resend/docs/topics.md +2 -2
  22. package/blueprints/observability-essentials/README.md +6 -2
  23. package/blueprints/observability-essentials/blueprint.json +133 -33
  24. package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +4 -4
  25. package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +4 -4
  26. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +4 -4
  27. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +4 -4
  28. package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +10 -9
  29. package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +17 -11
  30. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +12 -3
  31. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +12 -3
  32. package/blueprints/observability-essentials/docs/topics.md +15 -8
  33. package/blueprints/observability-essentials/guide/observability-essentials.md +9 -3
  34. package/blueprints/observability-probe-endpoints/README.md +5 -1
  35. package/blueprints/observability-probe-endpoints/blueprint.json +116 -24
  36. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +5 -5
  37. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +11 -2
  38. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +11 -2
  39. package/blueprints/observability-probe-endpoints/docs/topics.md +6 -6
  40. package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +10 -0
  41. package/blueprints/persistence-data-d1/docs/topics.md +2 -2
  42. package/blueprints/persistence-data-sqlite/docs/topics.md +2 -2
  43. package/blueprints/security-auth-clerk/docs/topics.md +2 -2
  44. package/blueprints/security-auth-keycloak/docs/topics.md +2 -2
  45. package/blueprints/security-auth-magic-link/docs/topics.md +2 -2
  46. package/blueprints/security-auth-oauth2/docs/topics.md +2 -2
  47. package/blueprints/security-secrets-management/docs/topics.md +2 -2
  48. package/fixtures/canary-manifest.json +9 -9
  49. package/package.json +13 -1
  50. package/rcf/code-nodes/cn-070.json +12 -0
  51. package/rcf/code-nodes/cn-071.json +12 -0
  52. package/rcf/code-nodes/cn-072.json +12 -0
  53. package/rcf/code-nodes/cn-073.json +12 -0
  54. package/rcf/code-nodes/cn-074.json +19 -0
  55. package/rcf/code-nodes/cn-075.json +15 -0
  56. package/rcf/code-nodes/cn-076.json +14 -0
  57. package/rcf/fbs/fbs-020.json +18 -0
  58. package/rcf/fbs/fbs-021.json +18 -0
  59. package/rcf/fbs/fbs-022.json +18 -0
  60. package/rcf/fbs/fbs-023.json +18 -0
  61. package/rcf/fbs/fbs-024.json +24 -0
  62. package/rcf/fbs/fbs-025.json +25 -0
  63. package/rcf/fbs/fbs-026.json +27 -0
  64. package/rcf/fbs/fbs-027.json +25 -0
  65. package/rcf/prd.json +3 -2
  66. package/rcf/requirements/req-011.json +22 -0
  67. package/rcf/requirements/req-012.json +22 -0
  68. package/rcf/test-suites/ts-030.json +66 -0
  69. package/rcf/test-suites/ts-031.json +59 -0
  70. package/rcf/test-suites/ts-032.json +50 -0
  71. package/rcf/test-suites/ts-033.json +83 -0
  72. package/rcf/test-suites/ts-034.json +32 -0
  73. package/rcf/test-suites/ts-035.json +23 -0
  74. package/rcf/test-suites/ts-036.json +65 -0
  75. package/rcf/test-suites/ts-037.json +55 -0
  76. package/rcf/user-stories/us-1101.json +51 -0
  77. package/rcf/user-stories/us-1102.json +60 -0
  78. package/rcf/user-stories/us-1103.json +51 -0
  79. package/rcf/user-stories/us-1104.json +60 -0
  80. package/rcf/user-stories/us-1201.json +34 -0
  81. package/rcf/user-stories/us-1202.json +25 -0
  82. package/rcf/user-stories/us-1203.json +43 -0
  83. package/rcf/user-stories/us-1204.json +25 -0
  84. package/releases/releases.yaml +21 -1
  85. package/src/blueprint/index.js +1 -0
  86. package/src/blueprint/remove-resolution.js +104 -0
  87. package/src/blueprint/supersede.js +2 -2
  88. package/src/cli/blueprint.js +41 -0
  89. package/src/cli/doctor.js +257 -5
  90. package/src/cli/init.js +166 -0
  91. package/src/setup/playwright-checks.js +426 -0
  92. package/src/verify/cli/run.js +28 -0
  93. package/src/verify/engine/index.js +24 -4
  94. package/src/verify/engine/launcher.js +41 -10
@@ -0,0 +1,12 @@
1
+ {
2
+ "cnId": "CN-073",
3
+ "path": "src/cli/init.js#runPlaywrightMcpPass",
4
+ "title": "Init's Playwright MCP pass + probeClaudeCodeMcp seam + redundant-entry check",
5
+ "description": "runPlaywrightMcpPass in src/cli/init.js implements the four-branch decision tree: project-scope Playwright signature detected -> left alone; probe found at any scope in Claude Code -> left alone; probe none -> write distinctly-named playwright-rcf entry; probe inconclusive -> write with the 'could not probe' notice. --no-playwright-mcp suppresses the write step entirely; the probe still runs so the print-out remains honest. probeClaudeCodeMcp in src/setup/playwright-checks.js shells out to `claude mcp list` (5s timeout) plus `claude mcp get <name>` for the scope; parseClaudeMcpListOutput and parseClaudeMcpGetScope carry the parsing logic. Doctor's playwright-mcp-redundant check (runPlaywrightMcpRedundantCheck in src/cli/doctor.js) fires only on browser-facing projects when both project and user scopes carry a Playwright signature; --fix does not repair the drift (deliberate operator choice per spec 4.5).",
6
+ "implementsAcIds": ["AC-1104-1", "AC-1104-2", "AC-1104-3", "AC-1104-4", "AC-1104-5"],
7
+ "dependencies": [],
8
+ "version": "0.1.0",
9
+ "status": "draft",
10
+ "createdAt": "2026-09-03T17:00:00Z",
11
+ "updatedAt": "2026-09-03T17:00:00Z"
12
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "cnId": "CN-074",
3
+ "path": "test/blueprint/probe-path-alignment.test.js",
4
+ "title": "Three-way probe-path compose test (nine assertions across essentials v2.0.0, probe-endpoints v1.1.0, api-rest v2.0.0)",
5
+ "description": "The compose test file covers the nine assertions ratified in spec section 7 as document-level mechanism invariants over the shipped blueprint contributions and the applied rcf/ tree. Six static-named permutation tests for assertion 1 (the AC-1201-1 test pointer resolves to the first permutation), then one assertion each for one-owner-per-topic in the manifest, no-literal-path in the applied tree with Historical-ADR skip, bare compose defaults + optional startup + loadBalancer /health, essentials-alone required-config + PROBE_INTERFACE_PATHS_MISSING, auth-exempt-list agreement, TAC path-required-no-default, startup binding when enabled, and no dual handler registration. Runs in one process under the shipped node --test runner.",
6
+ "implementsAcIds": [
7
+ "AC-1201-1",
8
+ "AC-1201-2",
9
+ "AC-1202-1",
10
+ "AC-1203-1",
11
+ "AC-1203-2",
12
+ "AC-1203-3"
13
+ ],
14
+ "dependencies": [],
15
+ "version": "0.1.0",
16
+ "status": "draft",
17
+ "createdAt": "2026-09-04T00:00:00Z",
18
+ "updatedAt": "2026-09-04T00:00:00Z"
19
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "cnId": "CN-075",
3
+ "path": "src/cli/doctor.js#runProbePathOwnerCheck",
4
+ "title": "probe-path-owner doctor check",
5
+ "description": "Reads rcf/manifest.json, counts scope:global claimants on healthProbes and readinessSemantics; drift on more than one claimant per topic (names the applied blueprints and the remedy line naming the one that would have to drop its opinion, spec section 9). Also flags redundant historical resolutions[] entries on either topic when the current claimant count is <= 1 (a project that resolved the v1.x designed-in conflicts and re-applied to essentials v2.0.0 sees the resolution flagged as redundant, with the rcf define blueprint remove-resolution hint). Added to KNOWN_CHECKS; help text lists the new check. Not gated on browser-facing.",
6
+ "implementsAcIds": [
7
+ "AC-1203-2",
8
+ "AC-1203-3"
9
+ ],
10
+ "dependencies": [],
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "createdAt": "2026-09-04T00:00:00Z",
14
+ "updatedAt": "2026-09-04T00:00:00Z"
15
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-076",
3
+ "path": "src/blueprint/remove-resolution.js#removeResolution",
4
+ "title": "`rcf define blueprint remove-resolution` verb implementation",
5
+ "description": "removeResolution({ projectRoot, tree, resolvedByAdrId }) matches the argument against tree.manifest.resolutions[].resolvedByAdrId and drops the single matching entry via updateManifest (validates + tmp-write + rename); no other section of the manifest is touched, and the project-level ADR file at rcf/adrs/<adr-id>.json is left in place as historical context. Refuses with a usage rcfError (mapped to exit 2 at the CLI edge) when the id is malformed against ^ADR-\\d{3,}(-<kebab-tail>)?$ or when it is well-formed but names no ADR on tree.byId and is not on resolutions[]. When the id is well-formed and names an ADR present on the tree but is not on resolutions[], returns `{ removed: false, alreadyAbsent: true }` so the CLI edge prints the 'nothing to remove' line and exits 0 (the second-pass idempotency semantics ratified in spec A2). The verb is dispatched from src/cli/blueprint.js's main() and advertised in the HELP block; the doctor's probe-path-owner check names it verbatim as the remedy line for a redundant historical resolution.",
6
+ "implementsAcIds": [
7
+ "AC-1204-1"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-04T00:00:00Z",
13
+ "updatedAt": "2026-09-04T00:00:00Z"
14
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "fbsId": "FBS-020",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 20,
6
+ "executionStatus": "verified",
7
+ "title": "Verify pins the Playwright MCP version",
8
+ "summary": "Extend packages/rcf-lite/src/verify/engine/launcher.js with an exported PLAYWRIGHT_MCP_VERSION constant and a playwrightMcpConfig(version) composer; DEFAULT_MCP_CONFIG composes @playwright/mcp@<version> not @latest. Extend the CLI (src/verify/cli/run.js) with a --playwright-mcp-version override, a loud stderr override notice, and preflight-print of the pinned default. Stamp the effective pin on report.run.runStats.playwrightMcpVersion.",
9
+ "acIds": ["AC-1101-1","AC-1101-2","AC-1101-3","AC-1101-4"],
10
+ "dependsOnFbsIds": [],
11
+ "contextRequirements": { "tacIds": [], "adrIds": [] },
12
+ "domain": "verify",
13
+ "estimatedSize": "small",
14
+ "riskLevel": "low",
15
+ "notes": "Landed in the ratified 2026-09-03 e2e-contract train. Covers US-1101 on REQ-011.",
16
+ "createdAt": "2026-09-03T17:00:00Z",
17
+ "updatedAt": "2026-09-03T17:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "fbsId": "FBS-021",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 21,
6
+ "executionStatus": "verified",
7
+ "title": "Blueprints amend for e2e as a declared test level",
8
+ "summary": "Bump application-spa to 1.4.0, add top-level browserSurface object, add US-1134 (icon) and US-1135 (auth) as new browser-facing acceptance criteria, and ship assets/tc-templates/e2e.md as the paste-in template. Bump delivery-ci-workflows to 2.2.0, add US-6124 with AC-6124-1 for the elicited e2e check, add the illustrative e2e job in pull-request-checks.yml, and add the alternate-provider notes for the e2e job. Prove the applied SPA v1.4.0 manifest validates against rcf-schemas 0.5.1 with no browserSurface field on the applied blueprint record.",
9
+ "acIds": ["AC-1102-1","AC-1102-2","AC-1102-3","AC-1102-4","AC-1102-5"],
10
+ "dependsOnFbsIds": [],
11
+ "contextRequirements": { "tacIds": [], "adrIds": [] },
12
+ "domain": "verify",
13
+ "estimatedSize": "small",
14
+ "riskLevel": "low",
15
+ "notes": "Landed in the ratified 2026-09-03 e2e-contract train. Covers US-1102 on REQ-011.",
16
+ "createdAt": "2026-09-03T17:00:00Z",
17
+ "updatedAt": "2026-09-03T17:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "fbsId": "FBS-022",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 22,
6
+ "executionStatus": "verified",
7
+ "title": "Doctor: playwright-present, browser-present, playwright-mcp-reachable, playwright-mcp-redundant",
8
+ "summary": "Declare @playwright/mcp and playwright as optional peer dependencies. Add src/setup/playwright-checks.js with the four checks and the loadBrowserFacingSources projection over manifest.blueprints. Wire the four checks into src/cli/doctor.js: run the three probes iff at least one applied blueprint declares a browserSurface OR the operator explicitly asks by --check; print the skip line otherwise; playwright-mcp-redundant fires only on browser-facing projects.",
9
+ "acIds": ["AC-1103-1","AC-1103-2","AC-1103-3","AC-1103-4"],
10
+ "dependsOnFbsIds": [],
11
+ "contextRequirements": { "tacIds": [], "adrIds": [] },
12
+ "domain": "verify",
13
+ "estimatedSize": "small",
14
+ "riskLevel": "low",
15
+ "notes": "Landed in the ratified 2026-09-03 e2e-contract train. Covers US-1103 on REQ-011.",
16
+ "createdAt": "2026-09-03T17:00:00Z",
17
+ "updatedAt": "2026-09-03T17:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "fbsId": "FBS-023",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 23,
6
+ "executionStatus": "verified",
7
+ "title": "Init: Playwright MCP entry only when no scope-visible entry exists",
8
+ "summary": "Add a --no-playwright-mcp flag. After the rcf mcp entry write, detect a project-scope Playwright signature (any args string matching /^@playwright\/mcp(@|$)/) and leave it alone if present. Otherwise probe the harness (claude mcp list + claude mcp get <name>) and, on 'none' or 'inconclusive', write a distinctly named playwright-rcf project-scope entry. --no-playwright-mcp suppresses the write step entirely; the probe still runs so the print-out remains honest.",
9
+ "acIds": ["AC-1104-1","AC-1104-2","AC-1104-3","AC-1104-4","AC-1104-5"],
10
+ "dependsOnFbsIds": [],
11
+ "contextRequirements": { "tacIds": [], "adrIds": [] },
12
+ "domain": "verify",
13
+ "estimatedSize": "small",
14
+ "riskLevel": "low",
15
+ "notes": "Landed in the ratified 2026-09-03 e2e-contract train. Covers US-1104 on REQ-011.",
16
+ "createdAt": "2026-09-03T17:00:00Z",
17
+ "updatedAt": "2026-09-03T17:00:00Z"
18
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "fbsId": "FBS-024",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 24,
6
+ "executionStatus": "verified",
7
+ "title": "Three-way compose test asserting no globalAdrTopic conflict on healthProbes or readinessSemantics across every ordering",
8
+ "summary": "Add packages/rcf-lite/test/blueprint/probe-path-alignment.test.js: six per-permutation tests (assertion 1) covering AC-1201-1 and one applied-manifest walker (assertion 2) covering AC-1201-2. Uses the shipped applyBlueprint + walkTree + initProject seams; runs in one process under the shipped node --test runner.",
9
+ "acIds": [
10
+ "AC-1201-1",
11
+ "AC-1201-2"
12
+ ],
13
+ "dependsOnFbsIds": [],
14
+ "contextRequirements": {
15
+ "tacIds": [],
16
+ "adrIds": []
17
+ },
18
+ "domain": "blueprints",
19
+ "estimatedSize": "small",
20
+ "riskLevel": "low",
21
+ "notes": "Part of the ratified 2026-09-04 probe-path alignment train (w-2026-09-03-dave-021). Covers US-1201 on REQ-012.",
22
+ "createdAt": "2026-09-04T00:00:00Z",
23
+ "updatedAt": "2026-09-04T00:00:00Z"
24
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "fbsId": "FBS-025",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 25,
6
+ "executionStatus": "verified",
7
+ "title": "Compose test assertion 3: greppable no-literal-path invariant on the applied rcf/ tree",
8
+ "summary": "Add the assertion 3 block to packages/rcf-lite/test/blueprint/probe-path-alignment.test.js: applies the three amended blueprints, walks the resulting rcf/ tree, greps for the five literal probe-path strings, and skips ADR contribution files whose title begins \"Historical:\" (per spec section 4) or whose adrId names probe-secrecy (context-only ADR).",
9
+ "acIds": [
10
+ "AC-1202-1"
11
+ ],
12
+ "dependsOnFbsIds": [
13
+ "FBS-024"
14
+ ],
15
+ "contextRequirements": {
16
+ "tacIds": [],
17
+ "adrIds": []
18
+ },
19
+ "domain": "blueprints",
20
+ "estimatedSize": "small",
21
+ "riskLevel": "low",
22
+ "notes": "Part of the ratified 2026-09-04 probe-path alignment train (w-2026-09-03-dave-021). Covers US-1202 on REQ-012.",
23
+ "createdAt": "2026-09-04T00:00:00Z",
24
+ "updatedAt": "2026-09-04T00:00:00Z"
25
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-026",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 26,
6
+ "executionStatus": "verified",
7
+ "title": "Compose test assertions 4-9 covering the per-blueprint ratified alignment facts and the probe-path-owner doctor check",
8
+ "summary": "Add the assertion 4-9 block to packages/rcf-lite/test/blueprint/probe-path-alignment.test.js covering probe-endpoints optional startup + composing section (assertion 4, 8), essentials PROBE_INTERFACE_PATHS_MISSING refuse-boot + no-shipped-default TACs + no-dual-handler (assertions 5, 7, 9), api-rest deferral of the probe paths and auth-exempt-list binding (assertion 6). Add the probe-path-owner check to KNOWN_CHECKS in packages/rcf-lite/src/cli/doctor.js with the runProbePathOwnerCheck implementation reading manifest.blueprints[].contributions[] for scope:global topic multi-claim drift and manifest.resolutions[] for redundant resolutions on healthProbes/readinessSemantics after the alignment.",
9
+ "acIds": [
10
+ "AC-1203-1",
11
+ "AC-1203-2",
12
+ "AC-1203-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-025"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "medium",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the ratified 2026-09-04 probe-path alignment train (w-2026-09-03-dave-021). Covers US-1203 on REQ-012.",
25
+ "createdAt": "2026-09-04T00:00:00Z",
26
+ "updatedAt": "2026-09-04T00:00:00Z"
27
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "fbsId": "FBS-027",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 27,
6
+ "executionStatus": "verified",
7
+ "title": "`rcf define blueprint remove-resolution <adr-id>` verb (drops one manifest.resolutions[] entry; idempotent; refuses exit 2 on malformed or unknown id)",
8
+ "summary": "Add packages/rcf-lite/src/blueprint/remove-resolution.js implementing removeResolution({ projectRoot, tree, resolvedByAdrId }) with the three ratified behaviours (remove + idempotent + refuse), export it from packages/rcf-lite/src/blueprint/index.js, wire the `remove-resolution` verb into packages/rcf-lite/src/cli/blueprint.js's HELP block and dispatch, and cover the surface with packages/rcf-lite/test/blueprint/remove-resolution.test.js (module) and remove-resolution cases appended to packages/rcf-lite/test/blueprint/cli.test.js (CLI edge). No changes to the doctor hint text (it names the verb already); no changes to project ADR files (the verb is scoped to manifest.resolutions[]).",
9
+ "acIds": [
10
+ "AC-1204-1"
11
+ ],
12
+ "dependsOnFbsIds": [
13
+ "FBS-026"
14
+ ],
15
+ "contextRequirements": {
16
+ "tacIds": [],
17
+ "adrIds": []
18
+ },
19
+ "domain": "blueprints",
20
+ "estimatedSize": "small",
21
+ "riskLevel": "low",
22
+ "notes": "Part of the ratified 2026-09-04 probe-path alignment train (w-2026-09-03-dave-021). Covers US-1204 on REQ-012. Spec amendment A2, added under the envelope 2026-09-04 after gate d-2026-09-04-016 finding 1 (the doctor and spec section 9 named the verb before it existed).",
23
+ "createdAt": "2026-09-04T00:00:00Z",
24
+ "updatedAt": "2026-09-04T00:00:00Z"
25
+ }
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,22 @@
1
+ {
2
+ "reqId": "REQ-012",
3
+ "prdId": "PRD-001",
4
+ "title": "Core shelf: probe-path binding has one owner (observability-probe-endpoints), essentials and api-rest defer",
5
+ "description": "The shipped observability-essentials, observability-probe-endpoints, and application-api-rest blueprints compose on one project without a `globalAdrTopic` conflict on the `healthProbes` or `readinessSemantics` topics; observability-probe-endpoints is the sole shelf-wide `scope: global` claimant on both topics. observability-essentials v2.0.0 drops those claims and restates its two probe REQs and TACs path-neutral, refusing boot with the stable-coded error `PROBE_INTERFACE_PATHS_MISSING` when `probeInterface.paths.liveness` or `probeInterface.paths.readiness` is absent and probe-endpoints is not composed. application-api-rest v2.0.0 drops the literal `/healthz/live`, `/healthz/ready`, and `/healthz/startup` bindings from REQ-006, US-2108 (all eight ACs), TAC-306 and US-2103, deferring to the resolved probe path set (probe-endpoints Kubernetes profile default `/live` and `/ready`, optional `/startup`; loadBalancer profile `/health`; or project-supplied `probeInterface.paths` in the essentials-alone case). observability-probe-endpoints v1.1.0 adds the optional third Kubernetes-profile path `startup` (default `/startup`), off by default and enabled by `probeInterface.options.kubernetes.startup.enabled: true`, with paired ACs on US-14102 and US-14107 and a composing section in its guide. The three-way alignment is verified by the compose test at `packages/rcf-lite/test/blueprint/probe-path-alignment.test.js` and is the ratified truth for the shelf.",
6
+ "category": "functional",
7
+ "domain": "blueprints",
8
+ "priority": "must",
9
+ "rationale": "The shipped shelf carried three literal probe-path opinions before this alignment (essentials /healthz + /readyz, probe-endpoints /live + /ready, api-rest /healthz/live + /healthz/ready + /healthz/startup). Composing any two of the three on one project either fired a designed-in `globalAdrTopic` conflict on healthProbes/readinessSemantics or silently shipped three disagreeing probe bindings. WSD-012 mandates /live and /ready, which is the probe-endpoints Kubernetes default; Dex's A4 wsd-service-anatomy binds those two paths as a parameter and required this item as its dependency. Aligning ownership to one blueprint (probe-endpoints) and making the other two defer is the smallest change that closes both the conflict-by-design surface and the silent-disagreement surface without inventing a new composer primitive. Ratified spec: `projects/rcf-lite-wsd/specs/rcf-lite-probe-path-alignment-spec-2026-09-04.md` (sections 1 through 11).",
10
+ "tags": [
11
+ "blueprints",
12
+ "observability",
13
+ "probe-endpoints",
14
+ "essentials",
15
+ "api-rest",
16
+ "alignment"
17
+ ],
18
+ "version": "0.1.0",
19
+ "status": "draft",
20
+ "createdAt": "2026-09-04T00:00:00Z",
21
+ "updatedAt": "2026-09-04T00:00: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,32 @@
1
+ {
2
+ "id": "TS-034",
3
+ "usId": "US-1201",
4
+ "title": "Three amended blueprints apply cleanly in every ordering with one-owner-per-topic in the manifest",
5
+ "purpose": "Cover the two ACs on US-1201: no globalAdrTopic conflict on healthProbes/readinessSemantics during apply in any of the six permutations, and one-and-only-one probe-endpoints scope:global claimant per topic in the resulting manifest.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1201-1",
9
+ "AC-1201-2"
10
+ ],
11
+ "testCases": [
12
+ {
13
+ "id": "TC-034-permutations-no-globaladr-conflict",
14
+ "acId": "AC-1201-1",
15
+ "description": "The first of six orderings (essentials -> probe-endpoints -> api-rest) is exercised here as the resolved test-point representative of the parameterised assertion; the other five permutations run in the same suite file (assertion 1 (apply cleanly in every ordering): ...) and share this AC.",
16
+ "testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 1 (apply cleanly in every ordering): observability-essentials -> observability-probe-endpoints -> application-api-rest",
17
+ "status": "pending",
18
+ "scope": "library"
19
+ },
20
+ {
21
+ "id": "TC-034-one-owner-per-topic",
22
+ "acId": "AC-1201-2",
23
+ "description": "After applying all three blueprints into a fresh project tree, exactly one scope:global ADR on healthProbes and one on readinessSemantics are present in the manifest, both owned by observability-probe-endpoints",
24
+ "testPointer": "test/blueprint/probe-path-alignment.test.js::assertion 2: one owner per topic across the applied manifest",
25
+ "status": "pending",
26
+ "scope": "library"
27
+ }
28
+ ],
29
+ "status": "draft",
30
+ "createdAt": "2026-09-04T00:00:00Z",
31
+ "updatedAt": "2026-09-04T00:00:00Z"
32
+ }