valent-pipeline 0.19.55 → 0.19.57
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 +1 -1
- package/pipeline/orchestrators/claude-code/sprint.workflow.js +9 -2
- package/pipeline/prompts/pmcp.md +14 -3
- package/pipeline/steps/judge/evidence-review.md +9 -1
- package/pipeline/steps/qa-a/write-spec.md +2 -0
- package/pipeline/templates/pmcp-evidence.template.md +10 -2
- package/pipeline/templates/visual-validation-checklist.template.md +4 -0
- package/src/lib/evidence.js +0 -0
package/package.json
CHANGED
|
@@ -552,6 +552,7 @@ const PMCP_SCHEMA = {
|
|
|
552
552
|
totalCheckpoints: { type: 'integer', minimum: 0 },
|
|
553
553
|
passed: { type: 'integer', minimum: 0 },
|
|
554
554
|
failed: { type: 'integer', minimum: 0 },
|
|
555
|
+
naCheckpoints: { type: 'integer', minimum: 0 },
|
|
555
556
|
files: { type: 'array', items: { type: 'string' } },
|
|
556
557
|
notes: { type: 'string' },
|
|
557
558
|
},
|
|
@@ -2859,7 +2860,12 @@ async function runStory(story) {
|
|
|
2859
2860
|
`• If it IS available (mcpAvailable:true): start the dev server yourself, then for EACH ` +
|
|
2860
2861
|
`checkpoint navigate to its route, establish the required state, wait for the expected state ` +
|
|
2861
2862
|
`(element/network conditions — never hard waits), capture a screenshot into the story output ` +
|
|
2862
|
-
`dir, and evaluate it against the checkpoint's pass criteria (PASS/FAIL). Stop the server when done
|
|
2863
|
+
`dir, and evaluate it against the checkpoint's pass criteria (PASS/FAIL). Stop the server when done.\n` +
|
|
2864
|
+
`• A checkpoint the checklist marks \`N/A (sanction)\` (with a rationale) is one QA-A determined ` +
|
|
2865
|
+
`the browser MCP cannot drive (a persistent-WS event, a mid-session disconnect) — do NOT attempt ` +
|
|
2866
|
+
`it, do NOT mark it FAIL: record it N/A with its rationale and EXCLUDE it from passed/failed ` +
|
|
2867
|
+
`(count it in naCheckpoints). verdict is "pass" if nothing you DID run FAILED — sanctioned na ` +
|
|
2868
|
+
`checkpoints never block. Never invent an na; honor only what the checklist sanctions.`,
|
|
2863
2869
|
completion:
|
|
2864
2870
|
'Write `pmcp-evidence.md` using `.valent-pipeline/templates/pmcp-evidence.template.md` — the ' +
|
|
2865
2871
|
'validation summary counts plus a per-checkpoint row (page/route, status, screenshot path, notes), ' +
|
|
@@ -2870,11 +2876,12 @@ async function runStory(story) {
|
|
|
2870
2876
|
'any checkpoint for it; it gates nothing and JUDGE does not read it.',
|
|
2871
2877
|
returnContract:
|
|
2872
2878
|
'Return ONLY { schema:1, agent:"pmcp", story, verdict:"pass"|"fail"|"na", mcpAvailable:boolean, ' +
|
|
2873
|
-
'totalCheckpoints, passed, failed, files:[evidence + screenshot paths], notes } as JSON.',
|
|
2879
|
+
'totalCheckpoints, passed, failed, naCheckpoints, files:[evidence + screenshot paths], notes } as JSON.',
|
|
2874
2880
|
})
|
|
2875
2881
|
log(
|
|
2876
2882
|
`${sid}/PMCP: visual validation => ${result && result.verdict} ` +
|
|
2877
2883
|
`(${result.passed || 0}/${result.totalCheckpoints || 0} checkpoint(s) passed` +
|
|
2884
|
+
`${result.naCheckpoints ? `, ${result.naCheckpoints} sanctioned na` : ''}` +
|
|
2878
2885
|
`${result.mcpAvailable === false ? `; ${visualBrowserMcp} unavailable [on_missing_mcp:${visualOnMissingMcp}]` : ''})`,
|
|
2879
2886
|
)
|
|
2880
2887
|
return result
|
package/pipeline/prompts/pmcp.md
CHANGED
|
@@ -68,10 +68,21 @@ data, auth, form values), wait for the expected state using element/network cond
|
|
|
68
68
|
waits** — capture a screenshot into `{story_output_dir}` using the checklist's filename convention,
|
|
69
69
|
and evaluate it against the pass criteria. Record PASS or FAIL per checkpoint. Stop the server when done.
|
|
70
70
|
|
|
71
|
+
**Sanctioned `na` checkpoints (per-checkpoint, distinct from the whole-gate `na` in Step 2):** a
|
|
72
|
+
checkpoint the checklist marks **N/A** (field `N/A (sanction)` set, with a rationale naming the
|
|
73
|
+
acceptance/integration test that validates it) is a flow QA-A determined the browser MCP cannot drive
|
|
74
|
+
(e.g. a persistent-WebSocket event like `career.created`, a mid-session disconnect). **Do NOT attempt
|
|
75
|
+
it and do NOT mark it FAIL** — record it `N/A` with its sanction rationale, and EXCLUDE it from the
|
|
76
|
+
passed/failed tally. Count it under `naCheckpoints`. Never invent an `na`: honor only what the
|
|
77
|
+
checklist already sanctions; if a checkpoint you *can* drive fails, it is a FAIL, not an `na`.
|
|
78
|
+
|
|
71
79
|
### Step 4: Write evidence
|
|
72
|
-
Write `{story_output_dir}/pmcp-evidence.md`: the validation summary (total / passed / failed /
|
|
73
|
-
one row per checkpoint (page/route, status
|
|
74
|
-
section (expected vs. observed vs. severity) for any FAIL.
|
|
80
|
+
Write `{story_output_dir}/pmcp-evidence.md`: the validation summary (total / passed / failed /
|
|
81
|
+
**na (sanctioned)** / pass rate), one row per checkpoint (page/route, status incl. `N/A`, screenshot
|
|
82
|
+
path, notes), and a Failed Checkpoints Detail section (expected vs. observed vs. severity) for any FAIL.
|
|
83
|
+
**Set `verdict: pass` if no checkpoint FAILED — sanctioned `na` checkpoints do not block** (they are
|
|
84
|
+
owner-policy-exempt and validated elsewhere; list them with their rationale so JUDGE sees the sanction).
|
|
85
|
+
Set `verdict: fail` only on a real FAIL.
|
|
75
86
|
|
|
76
87
|
### Step 5: Compose the human review artifact (NON-GATING)
|
|
77
88
|
Write `{story_output_dir}/visual-review.md` from `.valent-pipeline/templates/visual-review.template.md` —
|
|
@@ -97,8 +97,16 @@ For each active profile:
|
|
|
97
97
|
explicitly sanctions them.
|
|
98
98
|
|
|
99
99
|
**UI visual sub-check** (when `ui` active), from `pmcp-evidence.md`:
|
|
100
|
-
- Every checklist checkpoint has a screenshot and a pass/fail determination
|
|
100
|
+
- Every checklist checkpoint has a screenshot and a pass/fail determination — **except** a checkpoint
|
|
101
|
+
the checklist sanctioned `N/A (sanction)`, which carries a rationale + a named validating test instead
|
|
102
|
+
of a screenshot (see the per-checkpoint sanction rule below).
|
|
101
103
|
- No checkpoint is marked FAIL
|
|
104
|
+
- **Per-checkpoint sanctioned `N/A`** (distinct from a whole-gate `na` run): a checkpoint QA-A marked
|
|
105
|
+
`N/A (sanction)` is a browser-MCP-untestable flow (a persistent-WS event, a mid-session disconnect)
|
|
106
|
+
that the stateless browser MCP cannot drive. It is a **documented non-blocking N/A** — NOT a missing
|
|
107
|
+
determination and NOT a FAIL — **provided** the `Sanctioned N/A Checkpoints` table names a real
|
|
108
|
+
validating acceptance/integration test for it. If an `na` checkpoint names NO validating test (or the
|
|
109
|
+
named test does not exist in the suite), that is a **coverage hole → blocking FAIL**, not a free pass.
|
|
102
110
|
- `mcpAvailable` is true — a **blocked** visual run (verdict `fail`) is a blocking FAIL; an `na` run
|
|
103
111
|
(project's `visual.on_missing_mcp: na`) is a documented non-blocking N/A.
|
|
104
112
|
- `visual-review.md` (when present) is a **NON-GATING** human-courtesy composition (PUR-001 R-5) —
|
|
@@ -85,6 +85,8 @@ For each NFR-sensitive path: `[NFR-PERF]` response time + load patterns; `[NFR-S
|
|
|
85
85
|
- If `ui` in `{testing_profiles}` → **MANDATORY.** Read `uxa-spec.md`. If `uxa-spec.md` is missing, write `status: blocked` to your frontmatter — do NOT proceed without it. For each page state define: Checkpoint ID (VV-{NNN}), Page/Route, State (Default/Loading/Empty/Error/Success or custom), AC Reference, Area labels in scope, Screenshot filename (`{story_id}_VV-{NNN}_{page}_{state}.png`), Expected visual elements, Setup instructions, Pass criteria. Write to `{story_output_dir}/visual-validation-checklist.md`.
|
|
86
86
|
- If `ui` NOT in `{testing_profiles}` → skip, note "N/A — no UI profile."
|
|
87
87
|
|
|
88
|
+
**Sanctioning a checkpoint `N/A (sanction)` — the visual gate covers browser-testable *static renders* only.** The PMCP visual gate drives a **stateless** browser-automation MCP: it can navigate, snapshot, and assert rendered DOM, but it CANNOT drive a persistent WebSocket event (`career.created`, `career.resumed`), sever a connection mid-session, or catch an in-flight transient. A checkpoint whose pass criteria *require* such a flow will false-FAIL the visual gate even when the feature works. For exactly those checkpoints, set the checklist's **`N/A (sanction)`** field to `yes — <rationale>`, where the rationale (a) states why the browser MCP cannot drive it and (b) **names the acceptance/integration test that DOES validate it** — that test MUST exist; an `na` with no validating test is a coverage hole, not a sanction. PMCP then records the checkpoint N/A (not FAIL) and JUDGE treats it as non-blocking. Keep every browser-testable static render (default/empty/error/success states, element presence, layout) as a normal PASS/FAIL checkpoint — only WS-event-driven / non-render flows are eligible. When in doubt, do NOT sanction: a real render that fails must stay a FAIL.
|
|
89
|
+
|
|
88
90
|
## Step 9b: Test Quality Bar — make every case implementable AND falsifiable
|
|
89
91
|
|
|
90
92
|
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):
|
|
@@ -26,14 +26,22 @@ blockers: []
|
|
|
26
26
|
- **Total checkpoints:** {count}
|
|
27
27
|
- **Passed:** {count}
|
|
28
28
|
- **Failed:** {count}
|
|
29
|
-
- **
|
|
29
|
+
- **N/A (sanctioned):** {count} <!-- browser-MCP-untestable checkpoints the checklist sanctioned; excluded from pass/fail, non-blocking -->
|
|
30
|
+
- **Pass rate:** {percentage, over executed (non-na) checkpoints}
|
|
30
31
|
|
|
31
32
|
## Checkpoint Results -- required
|
|
32
33
|
<!-- Per-checkpoint visual validation result. Checkpoint IDs match those defined in visual-validation-checklist.md. -->
|
|
33
34
|
|
|
34
35
|
| Checkpoint ID | Page/Route | Status | Screenshot Path | Notes |
|
|
35
36
|
|---------------|-----------|--------|----------------|-------|
|
|
36
|
-
| {checkpoint-id} | {page or route validated} | {PASS \| FAIL} | {relative path to screenshot file} | {visual issues observed, or "none"} |
|
|
37
|
+
| {checkpoint-id} | {page or route validated} | {PASS \| FAIL \| N/A} | {relative path to screenshot file, or "—" for N/A} | {visual issues observed, or "none"} |
|
|
38
|
+
|
|
39
|
+
## Sanctioned N/A Checkpoints -- conditional
|
|
40
|
+
<!-- Only include if any checkpoints are N/A (sanction). These are owner-policy-exempt (browser MCP cannot drive them); JUDGE treats them as non-blocking. -->
|
|
41
|
+
|
|
42
|
+
| Checkpoint ID | Why the browser MCP cannot drive it | Validating acceptance/integration test |
|
|
43
|
+
|---------------|-------------------------------------|----------------------------------------|
|
|
44
|
+
| {checkpoint-id} | {e.g. persistent-WS event career.created; stateless browser MCP cannot drive it} | {test ID that DOES validate this flow} |
|
|
37
45
|
|
|
38
46
|
## Failed Checkpoints Detail -- conditional
|
|
39
47
|
<!-- Only include if any checkpoints failed -->
|
|
@@ -27,6 +27,9 @@ blockers: []
|
|
|
27
27
|
- **Total checkpoints:** {count}
|
|
28
28
|
- **Pages covered:** {count}
|
|
29
29
|
- **States covered per page:** {list of state types included}
|
|
30
|
+
- **N/A (sanctioned):** {count} <!-- checkpoints marked browser-MCP-untestable; PMCP skips them, JUDGE treats as non-blocking -->
|
|
31
|
+
|
|
32
|
+
|
|
30
33
|
|
|
31
34
|
## Visual Validation Checkpoints -- required
|
|
32
35
|
<!-- One entry per checkpoint. PMCP navigates to each checkpoint, captures a screenshot, and reports pass/fail. -->
|
|
@@ -41,6 +44,7 @@ blockers: []
|
|
|
41
44
|
| **AC Reference** | {AC-ID from qa-test-spec.md, e.g. AC-1} |
|
|
42
45
|
| **Area Labels in Scope** | {list of area labels from uxa-spec.md that should be visible in this state} |
|
|
43
46
|
| **Screenshot Filename** | `{story-id}_VV-{NNN}_{page}_{state}.png` |
|
|
47
|
+
| **N/A (sanction)** | {omit for normal checkpoints; OR `yes — <rationale: why the browser MCP cannot drive this (e.g. persistent-WS event career.created / mid-session disconnect), and the acceptance/integration test ID that DOES validate it>`} |
|
|
44
48
|
|
|
45
49
|
**Expected Visual Elements:**
|
|
46
50
|
- {element}: {expected appearance, position, or content}
|
package/src/lib/evidence.js
CHANGED
|
Binary file
|