valent-pipeline 0.19.60 → 0.19.62
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/package.json
CHANGED
package/pipeline/prompts/pmcp.md
CHANGED
|
@@ -63,7 +63,25 @@ Follow the on-missing-MCP behavior the orchestrator passed in your trigger:
|
|
|
63
63
|
`mcpAvailable: false`, and return — the story proceeds without visual evidence.
|
|
64
64
|
|
|
65
65
|
### Step 3: Execute checkpoints (MCP available)
|
|
66
|
-
Start the dev server.
|
|
66
|
+
Start the dev server.
|
|
67
|
+
|
|
68
|
+
**Pre-flight — assert an INTEGER `devicePixelRatio` before driving any interaction.** Once the server
|
|
69
|
+
is up and you have navigated to the app, evaluate `window.devicePixelRatio`. If it is NOT an integer
|
|
70
|
+
(commonly `1.5` when the host display runs Windows/macOS scaling at 150%), the browser's
|
|
71
|
+
coordinate-based `click()`/`fill()` land OFF-TARGET: Playwright reports the click succeeded but the
|
|
72
|
+
app's `onClick`/`onInput` handlers never fire, so you can screenshot STATIC renders yet can NEVER
|
|
73
|
+
drive an interaction or a multi-step / WS flow. **Do NOT misread this as "the browser MCP cannot drive
|
|
74
|
+
WS events," and do NOT FAIL or `na` the interaction checkpoints** — it is an infrastructure config
|
|
75
|
+
bug, not an app or reachability defect (the e2e test runner pins the scale factor, which is why an
|
|
76
|
+
acceptance e2e can drive the same flow the MCP cannot). STOP and record an **infrastructure blocker**
|
|
77
|
+
in `pmcp-evidence.md` (`verdict: fail`, `mcpAvailable: true`) naming the cause and the fix: the
|
|
78
|
+
browser MCP must launch with **`deviceScaleFactor: 1`** (passing a fixed `--viewport-size` defaults
|
|
79
|
+
the scale factor to 1), a project `.mcp.json` / browser-MCP-config change that needs an MCP/session
|
|
80
|
+
**RESTART** to take effect. Static render-only checkpoints may still be captured; mark every
|
|
81
|
+
interaction-dependent checkpoint blocked-by-DPR, not FAIL. A non-integer DPR is the single most common
|
|
82
|
+
cause of "PMCP can render but can't drive."
|
|
83
|
+
|
|
84
|
+
For each checkpoint: navigate to its route, establish the required state (seed
|
|
67
85
|
data, auth, form values), wait for the expected state using element/network conditions — **never hard
|
|
68
86
|
waits** — capture a screenshot into `{story_output_dir}` using the checklist's filename convention,
|
|
69
87
|
and evaluate it against the pass criteria. Record PASS or FAIL per checkpoint. Stop the server when done.
|
|
@@ -89,6 +89,10 @@ For each NFR-sensitive path: `[NFR-PERF]` response time + load patterns; `[NFR-S
|
|
|
89
89
|
|
|
90
90
|
**The validating test a WS-driven sanction names MUST be a true end-to-end reachability case — never a service-layer test that bypasses the live event path.** When the UXA spec carries a Step 6b reachability contract for a WS-driven screen, author a REQUIRED `e2e` acceptance case that **drives the real triggering event over the actual connection** (register/login → issue the WS command → assert the screen leaves loading and renders), then sanction the matching visual checkpoint to it. A test that calls the service/handler layer directly (e.g. asserts `POST /api/careers` or the service method) can pass green while the **live WS command path is structurally broken** — a missing initial-state push, or a bootstrap command that violates a pre-event invariant (writing an FK row keyed on an id that does not exist until the event lands). That gap stays invisible until the visual gate a full attempt later. The reachability case is what forces the live path; the service-layer test is necessary but NOT sufficient to back a sanction.
|
|
91
91
|
|
|
92
|
+
**`na` is for genuinely browser-UNDRIVABLE events — NOT a fallback for a screen the MCP merely failed to reach.** Eligible: a WS event NO browser action can trigger on a correctly-built app — a server-INITIATED push (a phase that advances on a timer, a cross-session/another-player event, a connection severed mid-session). NOT eligible: a WS event a USER ACTION triggers — clicking "Start Career" → `career.create` → the in-career screen mounts — is browser-drivable and MUST be verified for real (a real screenshot), never sanctioned. If the MCP "can't drive" such a user-triggered flow, the cause is almost always the APP, not the gate — an unstyled / zero-layout / zero-CSS shell where clicks and fills don't land on the handlers (class-presence passing is not pixel-rendering). The fix is to make the app render and be drivable (a styling/build story), then verify for real — not to `na` the checkpoint away and permanently forfeit its pixel verification. When in doubt between "undrivable" and "app is broken", assume app-is-broken and do NOT sanction.
|
|
93
|
+
|
|
94
|
+
**Sanction a shared prerequisite as a SET — never a subset.** When several checkpoints depend on the SAME genuinely-undrivable WS prerequisite (e.g. every in-career VV checkpoint needs the same `career.created` push), sanction them ALL `N/A (sanction)`, each naming its validating e2e case — or sanction NONE. A partial sanction (some `na`, some left BLOCKED under the identical prerequisite) is itself the defect: the gate runs, the un-sanctioned siblings come back BLOCKED, and JUDGE rejects on them while the `na` ones pass. The Step 6b reachability contract (UXA) enumerates exactly which VV-IDs a prerequisite blocks — sanction precisely that set.
|
|
95
|
+
|
|
92
96
|
## Step 9b: Test Quality Bar — make every case implementable AND falsifiable
|
|
93
97
|
|
|
94
98
|
The dev agents implement exactly what you specify, and CRITIC rejects tests that are weak, unfalsifiable, or bound to the wrong artifact. Spec the bar IN so it is built right the first time (each rule below traces to a real rework cycle):
|
|
@@ -49,8 +49,10 @@ For EACH WS-driven screen, document its **reachability contract**:
|
|
|
49
49
|
| **Initial-state-push payload** | The exact state fields the event MUST push so the screen's loading state resolves to active — name them (e.g. `school_name`, `season`, `current_phase`); "sends state" is not enough |
|
|
50
50
|
| **Pre-event session state** | What exists BEFORE the event (e.g. session keyed on a player/user id, no record yet) — flags bootstrap commands that must NOT assume post-event invariants (FK rows, ids that do not exist until the event lands) |
|
|
51
51
|
| **Unreachable-if** | The concrete failure: which screen hangs in which state if the push (or the bootstrap command) is missing/broken |
|
|
52
|
+
| **Trigger kind** | USER-ACTION (a click/submit sends the WS command, e.g. "Start Career" → `career.create`) or SERVER-INITIATED (a timed phase advance, a cross-session/another-player event, a mid-session disconnect). Decides visual coverage below |
|
|
53
|
+
| **Blocked visual checkpoints** | The exact VV-IDs whose setup needs this prerequisite — so QA-A sanctions precisely that SET, never a subset (Step 9) |
|
|
52
54
|
|
|
53
|
-
Each contract becomes a REQUIRED end-to-end reachability acceptance case in QA-A (drive the real event → assert the screen renders),
|
|
55
|
+
Each contract becomes a REQUIRED end-to-end reachability acceptance case in QA-A (drive the real event → assert the screen renders). **Visual coverage depends on Trigger kind, NOT on "it's WS":** a USER-ACTION-triggered screen IS browser-drivable (the MCP performs the click/fill that sends the command) and MUST be visually verified FOR REAL — do NOT sanction it `N/A`; if the MCP can't drive it the cause is usually an unstyled/zero-layout app, which is a styling/build fix, not a sanction. Only a SERVER-INITIATED event the browser genuinely cannot trigger is `N/A`-eligible (QA-A Step 9), and then the whole blocked-VV set is sanctioned together, each naming its e2e case. A screen reachable via a plain HTTP load only is out of scope — this is for event-driven reachability.
|
|
54
56
|
|
|
55
57
|
## Step 7: Accessibility Checklist (WCAG AA)
|
|
56
58
|
|