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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valent-pipeline",
3
- "version": "0.19.55",
3
+ "version": "0.19.57",
4
4
  "description": "v3 multi-agent AI pipeline for software development lifecycle",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
@@ -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 / pass rate),
73
- one row per checkpoint (page/route, status, screenshot path, notes), and a Failed Checkpoints Detail
74
- section (expected vs. observed vs. severity) for any FAIL. Set `verdict: pass` only if no checkpoint failed.
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
- - **Pass rate:** {percentage}
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}
Binary file