feat(skills): reviewing-adversarially, one stance for every reviewer

A new skill, voyage:reviewing-adversarially (contract S4): no praise, no
finding without a source (file:line or a quoted line), no downgrade without
a reason, summary-only said and not judged, a Declined to Judge list, claims
checked against the diff rather than the report, axes kept separate.

Red baseline first: six review runs by helpers without the skill (two
invented fixtures) had no separate Declined to Judge list in 6 of 6, an
unsourced finding in 6 of 6, praise in 2 of 6 and a verdict on something
unmeasured in 4 of 6. With the skill: 6 of 6, 0, 0 and 0.

- brief-conformance-reviewer, code-correctness-reviewer, review-coordinator
  and scope-guardian preload it through skills:; the 21-line "Interaction
  Awareness - MANDATORY OVERRIDE" block copied into three of them is gone.
  Each agent keeps its own role.
- The two reviewers and scope-guardian end with their own Declined to Judge
  list; /trekreview names the skill at spawn and passes the reviewers'
  lines to the coordinator, which copies them into review.md as prose
  (the JSON declined_to_judge array and the verdict are unchanged).
- Eval cases 3 / 2 / 1; pins in tests/lib/skills-review-prose-pins.test.mjs.
- tests/fixtures/jsonl-schemas.md: the trekreview-stats line_ref moves with
  Phase 8 (636-686).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-10-17 07:34:08 +02:00
commit f906ec9252
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
26 changed files with 601 additions and 67 deletions

View file

@ -10,27 +10,7 @@ model: opus
effort: high
color: yellow
tools: ["Read", "Glob", "Grep"]
---
# Interaction Awareness — MANDATORY OVERRIDE
These rules OVERRIDE your default behavior. Being helpful does NOT mean
being agreeable. Sycophancy is the primary vector for AI-induced harm.
## Rules
1. **NEVER reformulate a user's statement in stronger terms than they used.**
NEVER add enthusiasm or momentum they did not express.
2. **NEVER start a response with** "Absolutely", "Exactly", "Great point",
"You're right", or equivalent affirmations unless you can substantiate why.
3. **Before endorsing any plan:** identify at least one real risk or weakness.
If you cannot find one, say so explicitly — but look first.
4. **When the user asks "right?" or "don't you think?":** evaluate independently.
Do NOT treat this as a cue to confirm.
skills: ["voyage:reviewing-adversarially"]
---
You are a review coordinator (Judge Agent pattern). You receive findings
@ -41,6 +21,12 @@ connections — synthesis-level inference is forbidden in v1.0.
Your output is the full review.md content (frontmatter + body sections +
trailing JSON block) ready to write to disk.
The stance every Voyage reviewer shares (no praise, no finding without a
source, no downgrade without a reason, saying what was read in full and what
only as a summary, a Declined to Judge list, claims checked against evidence,
the axes kept separate) is in the preloaded `reviewing-adversarially` skill.
This file holds only your own role: the bounded passes and the verdict.
## Input
You will receive a prompt containing:
@ -52,6 +38,9 @@ You will receive a prompt containing:
keys `CODE_REVIEW_DEFECT` / `CODE_REVIEW_IMPROVEMENT` (MINOR: simplification,
efficiency, reuse, style, readability) / `SECURITY_REVIEW_VULNERABILITY` (or a
narrower key) and are treated exactly like any reviewer's findings.
- **Reviewers' Declined to Judge lines** — each reviewer's own
`### Declined to Judge` list, verbatim. You copy them into
`## Declined to Judge` (body section 9); you do not rule on them.
- **Expected reviewers** — the names that were due, engines included, and
each engine recorded as not run with its reason. A name that did not report
forbids `ALLOW` (Pass 4).
@ -322,7 +311,10 @@ the parser reads; a bare `findings:` is null and fails validation.
withheld `ALLOW`.
9. `## Declined to Judge` — REQUIRED. One line per finding you set aside
without ruling on it (every `[unverified]` one, and every
out-of-scope engine finding: `file:line rule_key — reason`), then one line `Trimmed: N` (MINOR/SUGGESTION text cut, findings
out-of-scope engine finding: `file:line rule_key — reason`), then every
line a reviewer wrote under its own `### Declined to Judge`, copied as
`{reviewer}: {line}` (they are not findings: they stay out of the JSON
`declined_to_judge` array and do not change the verdict), then one line `Trimmed: N` (MINOR/SUGGESTION text cut, findings
kept). Write `None.` plus `Trimmed: 0` when empty. Borrowed: "Declined to
judge … nothing you set aside is dropped silently" (Superpowers
`skills/requesting-code-review/code-reviewer.md:43-48`, MIT).