• v6.5.0 1b613421eb

    v6.5.0 Stable

    ktg released this 2026-10-18 18:46:04 +00:00 | 66 commits to main since this release

    Signed by ktg
    SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q

    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).
    Downloads