voyage/tests/validators
Kjell Tore Guttormsen 98171d7d3b
feat(gate): the brief's threat model on the plan side (decision 164, 218, 220)
plan-gate.mjs --record --brief <brief.md> (a known flag; its value is kept
out of the positional arguments, a missing value is a usage error) applies
the brief's threat model to the deduped findings before countRound when
threat-model.mjs usable() says it may: a backed finding (Voyage's own
security finding whose threat_model_ref equals an Outside: line's text)
leaves the counted set and the stop rule and goes to the new optional
verdict field known_outside ({id, rule_key, text, line}), carried to later
rounds until a reviewer marks it resolved or it is reported again under its
id. The verdict stores brief_path (carried when a later round has none).
The --record line adds known_outside (a count) and threat_model
({applied, why}): a threat model that is not usable backs nothing, every
security finding counts, and the output says why. extractVerdict
shape-checks both new fields.

The bare gate re-reads the brief at brief_path each run: an entry still
backed is a warning, PLAN_GATE_KNOWN_OUTSIDE; one no longer backed (line
gone, approval stale or not logged, brief unreadable, no brief_path, or not
a Voyage security finding) stops the plan, PLAN_GATE_OUTSIDE_NOT_BACKED: it
counts in full. gatePlan takes an optional threatModel for tests.

plan-review-dedup keeps threat_model_ref on a merge only when every merged
copy carries the same one; the S160 known issue is fixed: a null in a
reviewer's findings list is skipped instead of crashing the CLI.

plan-critic and scope-guardian: a security finding needs a concrete attack
path and high confidence (Claude Code's threshold, 167), uses
SECURITY_INJECTION or SECURITY_RISK, and quotes the Outside: line's text in
threat_model_ref when one applies; the json template carries the field.
/trekplan Phase 9 passes the brief path to plan-critic and --brief to
--record. Handover 4 names the two fields, the two codes and the flag.

Part 2, step 2.4 of the E plan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 09:04:08 +01:00
..
architecture-discovery.test.mjs feat(voyage)!: bulk content rewrite ultra -> voyage/trek prose [skip-docs] 2026-05-05 15:08:20 +02:00
brief-ceremony.test.mjs chore(cleanup): R-b R3 — profiles, phase signals and the effort dialog removed, one fixed path per command 2026-11-07 21:12:57 +01:00
brief-gate-coverage.test.mjs feat(brief): optional threat model in the brief (decision 164, 218) 2026-11-08 08:47:51 +01:00
brief-review-stamp-order.test.mjs fix(trekbrief): the review stamp covers only text the reviewer saw 2026-10-12 20:03:26 +02:00
brief-review-stamp.test.mjs fix(plan): every exploration agent runs; the brief is reviewed again only when it changed 2026-10-08 07:01:44 +02:00
brief-threat-model.test.mjs feat(brief): optional threat model in the brief (decision 164, 218) 2026-11-08 08:47:51 +01:00
brief-validator.test.mjs refactor(cleanup): simplify pass on R-b 2026-11-07 21:26:25 +01:00
intent-approval.test.mjs refactor(cleanup): simplify pass on R-b 2026-11-07 21:26:25 +01:00
plan-gate-diff-mode.test.mjs feat(gate): stop rule in the plan gate (decision 217, 220) 2026-11-08 07:04:48 +01:00
plan-gate-open-major.test.mjs feat(gate): stop rule in the plan gate (decision 217, 220) 2026-11-08 07:04:48 +01:00
plan-gate-stop-rule.test.mjs fix(gate): part 1 verifier findings — stop-rule wording, guard tests, unreadable round 2026-11-08 07:39:00 +01:00
plan-gate-threat-model.test.mjs feat(gate): the brief's threat model on the plan side (decision 164, 218, 220) 2026-11-08 09:04:08 +01:00
plan-gate.test.mjs feat(gate): stop rule in the plan gate (decision 217, 220) 2026-11-08 07:04:48 +01:00
plan-validator-parse-once.test.mjs refactor(plan): the plan validator parses each step once 2026-10-13 14:47:33 +02:00
plan-validator-v18.test.mjs fix(validate): a check that can never run is caught when the brief or plan is written 2026-10-08 06:42:33 +02:00
plan-validator.test.mjs test(r8): move the live tests out of the round files 2026-11-07 10:19:49 +01:00
plan-version-1-9.test.mjs fix(plan): a 1.9 wrapped line keeps its paths only after a comma or in an empty entry 2026-10-14 10:29:35 +02:00
progress-validator.test.mjs fix(validators): the progress validator knows stopped and blocked 2026-10-05 17:32:54 +02:00
query-privacy-gate.test.mjs fix(validators): hard-block the token formats the run-length patterns missed 2026-08-12 22:03:43 +02:00
research-validator.test.mjs feat(voyage)!: rename type discriminators across validators + fixtures [skip-docs] 2026-05-05 14:40:25 +02:00
review-validator.test.mjs fix(review): close the gate's fail-open paths an independent review found 2026-10-06 20:03:16 +02:00
runnable-checks.test.mjs chore(cleanup): R-b R3 — profiles, phase signals and the effort dialog removed, one fixed path per command 2026-11-07 21:12:57 +01:00
session-state-validator.test.mjs feat(voyage)!: bulk content rewrite ultra -> voyage/trek prose [skip-docs] 2026-05-05 15:08:20 +02:00