chore(release): 6.5.0 — Three skills for brief, criteria and review, English labels, and three trial-5 fixes

Wave 3 (voyage:reviewing-adversarially, voyage:writing-criteria,
voyage:interviewing), decision 56 (English labels) and decision 59 (trial-5
findings 1, 4 and 7), each with its line under ### Doors. Known issues: the
eleven other trial-5 findings grouped by consequence, and the release
review's 13 MAJOR and 1 MINOR (WARN, no BLOCKER; decision 52).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-10-18 20:40:46 +02:00
commit 1b613421eb
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
5 changed files with 204 additions and 5 deletions

View file

@ -1,7 +1,7 @@
{
"name": "voyage",
"description": "Voyage — brief, research, plan, execute, review, continue. Contract-driven Claude Code pipeline. /trekbrief, /trekplan, and /trekreview each end by building a self-contained operator-annotation HTML (scripts/annotate.mjs, pencil-toggle annotation pattern): select text or click any element, pick intent (Fix/Change/Question), write comment, copy structured prompt, paste back, Claude revises the .md.",
"version": "6.4.0",
"version": "6.5.0",
"author": {
"name": "Kjell Tore Guttormsen"
},

View file

@ -4,6 +4,205 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## v6.5.0 — 2026-10-18 — Three skills for brief, criteria and review, English labels, and three trial-5 fixes
Wave 3 adds three skills, each one source for a discipline that was copied
or missing before: `voyage:interviewing` for the brief's question round,
`voyage:writing-criteria` for criteria that can run and go red, and
`voyage:reviewing-adversarially` for every reviewer's stance. The test repo's
trial 5 ran all three end to end. The product now shows English where it
showed Norwegian (decision 56), and three findings from trial 5 are fixed
(decision 59), each with a test that failed on the code before it. Suite
2659 (2657 pass, 0 fail, 2 skipped), measured by `npm test` on `main` at
`849b242`, the tree this release review covered.
Nothing here asks anything of users. No brief, plan or review format changes.
### Doors
- two-way: skill reviewing-adversarially and its skills: lines (order 7d) — revert f906ec9; the review contract (JSON, verdict) is unchanged.
- two-way: skill writing-criteria and its pointers (order 7c) — revert 837e925; the criteria runner and the validators are unchanged.
- two-way: skill interviewing and the /trekbrief Phase 3 pointer (order 7e) — revert f6e18a1 restores the inline Phase 3 text; no brief format change (Handover 1 untouched).
- two-way: English UI labels (decision 56) — the stored annotation keys are unchanged, so a revert brings back the Norwegian labels and every saved annotation loads either way.
- two-way: the brief validator warns on a criterion whose first backticked span is not a command while a later one is (trial-5 finding 1) — a warning, never an error; a revert stops the warning.
- two-way: a re-planned step's earlier new files are parked before the fresh build (trial-5 finding 4) — a revert leaves them in the work tree again; files already parked stay in the git directory, never deleted.
- two-way: one reviewer's two findings on one file+line+rule keep a row each (trial-5 finding 7) — a revert merges them again; earlier review.md files are not re-read.
### Added
- **Skill `voyage:reviewing-adversarially`** (order 7d). One stance for
every reviewer: no praise, a source for every finding (`file:line` or a
quote), no downgrade without a reason, a Declined to Judge list, claims
checked against the diff and not the report. Preloaded by the three
`/trekreview` agents and scope-guardian, and named by `/trekreview` at
spawn; it replaces the copied "Interaction Awareness" block. Each
reviewer's Declined to Judge lines now reach `review.md`.
- **Skill `voyage:writing-criteria`** (order 7c). One source for how a
success criterion or a `Verify:`, `Regression:` or `End-to-end:` line is
written so the criteria runner can run it and it can go red; anything more
is `bash tests/<name>.sh`. Preloaded by brief-reviewer and plan-critic,
named by `/trekplan`. Baseline: 24 of 27 lines refused by the runner
without the skill, 0 of 27 with it.
- **Skill `voyage:interviewing`** (order 7e). `/trekbrief` Phase 3 asks for
the interview form by name instead of carrying it: at most four questions
per call, one decision each, the recommended answer first, facts looked up
and never asked, the rest written down, and a hollow answer or unasked
scope never written in as the person's decision. Measured with helpers:
round-1 size 10–11 → 4, questions without a recommendation 15/31 → 0/12,
a hollow answer kept as a decision 2/3 → 0/3.
- **Eval cases for the three skills** (`evals/skill-interviewing-*`,
`evals/skill-writing-criteria-*`, `evals/skill-reviewing-adversarially-*`:
three that should fire, two that should stay quiet, one effect case each).
Written, not run.
### Fixed
- **English where the product showed Norwegian** (decision 56). The
annotation page's intent buttons, sidebar badges and copied prompt read
Fix / Change / Question; the stored keys stay `fiks` / `endre` /
`spørsmål`, so annotations saved earlier still load. `/trekreview`'s
project-memory approval offers "Add the line" / "Not now". README,
CLAUDE.md, `docs/architecture.md`, `package.json` and `plugin.json`
describe what the product shows. The Norwegian hollow-answer list in
`approval-log.mjs` and `/trekbrief` stays: it matches what a user types.
- **The brief validator sees a criterion the runner cannot run** (trial-5
finding 1). When a success criterion's first backticked span is not a
command but a later span is, the validator now warns
`BRIEF_SC_NOT_RUNNABLE`, as the criteria runner already reported it
unrunnable. A criterion that only names a flag or a path stays prose and
unflagged (Handover 1 says so).
- **A re-planned step no longer builds on its earlier attempt's files**
(trial-5 finding 4). `On failure: revert` leaves a step's new files on
disk; `--resume` after a new plan now runs
`lib/util/park-attempt-files.mjs` before the fresh build helper. It moves
every still-untracked file the attempt created into the git directory
(`voyage/parked/step-N-attempt-k`), never deletes one, never overwrites a
parked file, and exits 1 while a file the attempt made is still in the
tree.
- **One reviewer's two findings on one triplet keep a row each** (trial-5
finding 7). Pass 1 merged two different `/code-review` findings on the same
file, line and rule key, and the second lost its row and its action. A
reviewer is never merged with itself: its second finding under another
title stays its own row, with the id over `rule_key#2`, counted over the
final list — also in `--workflow`, engine-findings and fidelity-diff. The
decision-23 put-back stays one copy per triplet.
### Known issues
The findings from the test repo's trial 5 that are not fixed in 6.5.0
(decision 59), grouped by consequence.
**Too lax — can let through what should be stopped**
- **Core code outside the deep-review patterns is never deep-reviewed**
(trial-5 finding 9). `/trekreview` triage makes every file outside the
deep-review patterns (for example `bin/` and `tests/`) summary-only, so
code-correctness-reviewer gives no verdict on a CLI's core code;
brief-conformance-reviewer still reads the whole diff. Planned for the
fix round before v7 (decisions 57 and 58).
**Too strict — can stop what should go on**
- **A controller finding on a locked test line the plan gave has no way
forward in the fix ladder** (finding 2). Fix rounds may not change a locked
test (the one exception is a test not red at base), so rounds 1–3 repeat
the same diff before the step goes up to the plan.
- **The stop guard holds the session while it waits for the fix helper**
(finding 3). Sub-step F sets the test lock to `pending` before a fix round;
the `green` exception (operator decision 2026-10-08) covers only the wait
for the controller.
- **Phase 7.5 counts a re-approval of the plan as a stray commit**
(finding 5). After the upward path the plan is approved again, but 7.5
lists only approvals from the review loop as process commits; read
strictly, the run becomes partial and the merge into main stays closed.
- **Plan dedup misses one finding reported by both plan reviewers when they
cite it differently** (finding 6): an absolute and a relative path, another
rule key, or overlapping line ranges, so one major is counted twice.
- **`done-line.mjs --check --commit` with a short sha answers "no DONE line"**
(finding 10), exit 1, though the line holds the full sha; Sub-step G only
says `--commit {hash}`.
**Inaccurate — wrong or unclear, nothing stopped or let through**
- **Line numbers in review findings can be off** (finding 8). An engine
finding cited the line after the code; `FINDING_LINE_OUT_OF_RANGE` catches
only a line past the end of the file, and a patch line number written in a
reviewer's prose, or `:135` with no file name, is not caught.
- **With `--plugin-dir`, statistics go to the installed plugin's data
directory** (finding 11): `stats-append` and `event-emit` write to
`~/.claude/plugins/data/voyage-…`, so a development copy's statistics mix
with the installed version's.
- **`/trekplan` Phase 9 points the plan reviewers at their schema in
`agents/plan-critic.md` and `agents/scope-guardian.md`** (finding 12), a
path in Voyage outside the repo, in the same prompt that tells them to read
only inside it.
- **`/trekbrief`'s bounded budget is unclear** (finding 13): "8, the three
fixed ones included" does not say whether the Phase 3.5 tier question
counts, and Phase 3.5 puts the heuristic's proposal first as "(default)"
even when the operator's own rule is to go up in doubt.
- **`/security-review` diffs against the remote's default branch, not the
review's range** (finding 14), so it can review more files than the review.
In this release's review the opposite happened: the remote's `main` was
ahead of `v6.4.0`, so the built-in diff missed the decision-56 commits, and
its standard prompt was run over the whole range instead.
The release review of 6.5.0 (`/trekreview` over `v6.4.0..main`, WARN: 0
BLOCKER, 13 MAJOR, 1 MINOR) found the following. None is a BLOCKER, so none
opens a fix round before this release (decision 52). "Confirmed" means the
release session reproduced it; "read" means it was traced in the code and not
run.
**Too lax — can let through what should be stopped**
- **The park step can leave the earlier attempt's files in the tree and
still exit 0** (the trial-5 finding-4 fix, `lib/util/park-attempt-files.mjs`).
Confirmed: a file still registered with `git add --intent-to-add` (the
revert was refused by the guard or declined) is read as "tracked since the
attempt" and left in place; and an upward diff written under
`color.ui=always` has no header the tool can read, so nothing is parked.
Read: from a subdirectory the diff's paths are resolved against the wrong
directory, and the tool's two `git` calls never check their exit status.
- **On the opt-in `--workflow` path, the severity floor and the put-back read
one row per file, line and rule key** (`scripts/trekreview-armB.workflow.mjs`),
while the trial-5 finding-7 fix can now give two. Read: a finding can then be
floored against the wrong row, or take an engine row's one legal lowering,
and an engine row the coordinator did not return is not put back when its
sibling was; a WARN can become ALLOW. The default path is not affected.
- **Which row a finding joins can depend on the order the reviewers'
payloads are read** (`lib/review/coordinator-contract.mjs`). Read: the same
findings in another order can give other rows, severities and verdict.
- **The coordinator dropped four engine findings as refuted because their
line numbers lay past the end of the file.** The engine had cited positions
in the diff; only the citation was checked, never the claim, and two of the
four were confirmed true (the intent-to-add hole above and the brief
warning below). Same class as trial-5 finding 8.
- **No test holds a reviewer's Declined to Judge lines reaching
`review.md`.** The copy-through in `/trekreview` and the coordinator is
prose only; deleting it leaves the suite green.
**Too strict — can stop what should go on**
- **The brief validator's new `BRIEF_SC_NOT_RUNNABLE` warning fires on
prose** (the trial-5 finding-1 fix). Confirmed: any bare word in a later
backticked span counts as a command, so "`--verbose` prints the `login`
field" is told to put `login` first. A warning, never an error.
**Inaccurate — wrong or unclear, nothing stopped or let through**
- **A finding's `#k` id depends on arrival order** (`lib/parsers/finding-id.mjs`),
so the same finding can get another id in a second review; and a kept row
can take the plain id that a set-aside row on the same triplet already
carries. Read, not run.
- **`/trekplan` tells the session to load `voyage:writing-criteria` by name
but does not list the `Skill` tool in `allowed-tools`**, as `/trekbrief`
now does. Whether Claude Code treats that list as a limit is not verified.
- **The bake-off's arm A still merges each triplet to one row**
(`scripts/bakeoff-armA-merge.mjs`, not changed in this release), so a
fidelity measurement now shows an artificial gap; the grouping rule lives in
three copies.
- **A new eval scaffold has a non-ASCII character**
(`evals/skill-writing-criteria-effect/scaffold.sh:42`, an em dash).
## v6.4.0 — 2026-10-17 — plan_version 1.9, the trial-4 findings, session-clean tests, the converging critic loop
A new plan version, 1.9, in which every path in a step's `Files:` and on its

View file

@ -2,7 +2,7 @@
Contract-driven Claude Code pipeline: brief, research, plan, execute, review. Agent swarms, research triangulation, adversarial review, multi-session resumption.
![Version](https://img.shields.io/badge/version-6.4.0-blue)
![Version](https://img.shields.io/badge/version-6.5.0-blue)
![License](https://img.shields.io/badge/license-MIT-green)
![Platform](https://img.shields.io/badge/platform-Claude%20Code-purple)

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "voyage",
"version": "6.4.0",
"version": "6.5.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "voyage",
"version": "6.4.0",
"version": "6.5.0",
"license": "MIT",
"engines": {
"node": ">=18"

View file

@ -1,6 +1,6 @@
{
"name": "voyage",
"version": "6.4.0",
"version": "6.5.0",
"private": true,
"description": "Voyage — brief, research, plan, execute, review, continue. Contract-driven Claude Code pipeline. /trekbrief, /trekplan, and /trekreview each end by building a self-contained operator-annotation HTML (scripts/annotate.mjs, pencil-toggle annotation pattern): select text or click any heading/paragraph/list-item, pick intent (Fix/Change/Question), write comment, copy structured prompt, paste back, Claude revises the .md.",
"type": "module",