• 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
  • v6.4.0 a3fa5de42a

    v6.4.0 Stable

    ktg released this 2026-10-16 22:25:08 +00:00 | 85 commits to main since this release

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

    A new plan version, 1.9, in which every path in a step's Files: and on its
    Test first: File: line stands first, in backticks, so the reader no longer
    guesses paths from prose (decision 16). The same delivery closes the six
    findings from the test repo's trial 4 and stops npm test from pointing a live
    session's stop guard at a temp-repo lock. Every fix began with a test that
    failed on the code before it. Suite 2517 (2515 pass, 0 fail, 2 skipped),
    measured by npm test on the third remediation's Step 2 commit
    (829da48), the commit before this section.

    The converging critic loop came after that measurement (decisions 43 and
    44). From round 2 the plan gate counts a critic round by rule A, and both
    reviewers state rule B. Suite 2602 (2600 pass, 0 fail, 2 skipped), measured
    by npm test on main at 4e28dc5, the tree this release review covered.

    Nothing here asks anything of users. Older plans warn, they do not fail: a plan
    below 1.9 is read as in 6.3.1, apart from the fixes under Fixed, and gets one
    warning per step whose Files: names a path that is not backticked.

    Doors

    • two-way: plan_version 1.9 — a 1.9 plan read by 6.3.1 gets PLAN_VERSION_MISMATCH as a warning and the 6.3.1 reader, so a revert rewrites no plan.
    • two-way: Files reader (three 6.3.0 answers restored) — a revert brings back 6.3.1's answers; no file format changes.
    • two-way: the test files on the Test first File line are the backticked paths right after File: (operator decision 20) — a revert reads every path-shaped span again.
    • two-way: red proof checks --tests against the plan — a revert accepts any list again.
    • two-way: brief-conflict mark on review findings — an older verdict gate ignores the field.
    • two-way: review Pass 1 ranks by catalogue tier and a dropped duplicate never lowers its group — a revert restores the asserted-severity ranking.
    • two-way: the workflow review puts back every engine finding the coordinator did not return (operator decision 23) — opt-in path only; a revert restores the old floor.
    • two-way: approval commits require a Co-Authored-By trailer — only Voyage's own commands call the CLI, and they pass it.
    • two-way: explorer prompts, stamp order, test env — prose and test-side only.
    • two-way: a 1.9 wrapped line keeps its paths only after a comma (operator decision 29), and a File: line with nothing after it takes its first wrapped line — a revert joins every wrapped line again.
    • two-way: below 1.9 a test file after a note in brackets, and, plus or + is read when it is clearly a test (operator decision 28 and operator decision 31) — a revert reads only the run right after File: again.
    • two-way: red proof reads the step's test files from the plan, prints them, and refuses a plan it cannot read (operator decision 30) — the older prose that passes --tests still runs against it.
    • two-way: original_severity names what the kept finding asserted — only tests read the field.
    • two-way: the workflow review fails closed when its coordinator returns nothing, and names every reviewer that did not run in allow_blocked_by — opt-in path only.
    • two-way: below 1.8, when the plan names no test file, the helper and the executor give red proof the files the helper wrote (operator decision 41) — a revert leaves such a step unproven and unlocked.
    • two-way: rule A in the plan gate (decision 43) — an older gate ignores the new verdict fields, and a revert counts every round fully.
    • two-way: rule B and the security key in the reviewers (decision 43) — prose only; a revert restores the old rating.
    • two-way: plan dedup passes the reviewers' marks and rule-B fields through, and its two fixes — a revert drops the fields and brings back the line-0 collapse and the crash.
    • two-way: the post-compact hook test's timeout (decision 44) — test-side only.
    • two-way: the critic-loop matcher needs overlapping texts, and a new finding never takes an old id (operator decision 48) — a revert matches by id or line alone again.
    • two-way: plan dedup keeps a lowered_from that is not a severity (operator decision 48) — a revert counts it as no lowering again.
    • two-way: plan dedup ranks a merged pair by what rule B counts (operator decision 48) — a revert brings back the order-dependent merge.

    Added

    • plan_version 1.9: the file first on every line. Each entry of Files:
      and each Test first: File: line opens with its backticked path or paths;
      everything from the first other text on is description and is never read.
      A 1.9 plan that breaks this gets PLAN_STEP_PATH_NOT_FIRST or
      PLAN_STEP_PATH_NOT_A_PATH (errors under --strict, warnings without). The
      parser, the validator, the tests-only check, the plan-file sweep (K6) and red
      proof read a 1.9 plan by this grammar. 1.9 is the current target: Handover
      4, the plan template, /trekplan, the planning orchestrator and CLAUDE.md
      say so, and the rules introduced at 1.8 say "1.8 or later".
    • A warning for older plans. Below 1.9, a path in Files: that is not
      backticked gets the warning PLAN_STEP_PATH_UNTICKED, under --strict too.
    • The brief-conflict mark. A /code-review finding at the MAJOR tier whose
      recommended action goes against a brief Non-Goal or another stated choice
      drops to MINOR, marked contradicts_brief and brief_lowered_from: MAJOR;
      any other engine finding only gets the mark, and a BLOCKER is never lowered.
      /trekreview passes the brief's choices to the coordinator, which writes the
      mark into review.md; the opt-in workflow review applies the same rule and
      floors an illegal lowering. On an ALLOW or WARN review the verdict gate
      answers exit 2 for a finding lowered or marked outside that one shape:
      brief_lowered_from on any other finding, a mark on a reviewer finding, a
      mark or an engine finding below its catalogue tier, or a mark with a missing
      or unknown rule key.
    • The critic loop converges by rule A, counted by the plan gate
      (decision 43). Round 1 is unchanged. From round 2 on,
      plan-gate.mjs --diff prints what changed since the text the last round
      reviewed. Both reviewers get it and mark each previous finding by id. Then
      --record counts the round: a new major that cites a plan line outside
      that diff counts as minor. A blocker, a security finding and a finding
      with no plan line count at full severity. A previous finding stays counted
      until it is marked resolved. The gate keeps each recorded round's text in
      the git directory, so a snapshot is never committed. A plan outside any git
      repository keeps none, and its next round counts fully. Every new verdict
      field is optional, and absent means round-1 behaviour, so an older verdict
      block gives the same exit codes. Phase 9, Handover 4, the planning
      orchestrator, CLAUDE.md and the README say so.
    • Rule B in both reviewers (decision 43). plan-critic and scope-guardian
      state it: a major that a named test, Regression: command or gate in the
      plan will fail on during execution is minor, never a blocker and never a
      security finding. The gate records each such lowering from round 1 on.
      Plan dedup passes the reviewers' marks and rule-B fields through. The
      operator answered three questions on 2026-10-15: rule B applies from round
      1 and rule A from round 2; both reviewers tag a security finding with the
      review catalogue's security key; a lowered finding that is re-reported as
      major stays minor, and only a re-report as blocker counts as blocker.

    Fixed

    • The suite no longer hands the session id to the lock CLI. npm test
      preloads a helper that removes CLAUDE_CODE_SESSION_ID for the whole run,
      and every test that spreads the process environment into a child uses a
      shared helper without it. A live session's stop guard is no longer pointed
      at a temp-repo lock. A test file run on its own with node --test still
      passes the id to a child it starts without an env (release review).
    • The three Files: regressions from 6.3.1's Known issues give 6.3.0's
      answer again: a source file after a described test is kept, a path that a
      description only mentions is not read as a file, and a backticked bare name
      such as LICENSE alone on a following line is read as a file.
    • The test files on the Test first: File: line are the backticked
      paths that stand right after File:, separated only by commas or spaces,
      and below plan_version 1.9 also each further path after a note in brackets
      ((new), *(new)*, (existing …)) or after and, plus or +, as long
      as it is clearly a test (operator decision 28, 13.10, and
      operator decision 31, 14.10; review bd2520b0). Every one of them is read,
      locked and copied for red proof, not only the first. A path in the
      description after them is no test file, at every plan_version
      (operator decision 20, 12.10; review 6c31212c), so a step whose File:
      line names its source in the description is no longer read as tests-only.
    • A 1.9 Test first: names its test only on a line that opens with
      File:
      , the way the executor, K6 and red proof read it. Below 1.9 the
      check reads as before.
    • Engine provenance in the review. Ingest takes engine from the payload,
      never from a field a reviewer wrote on its own finding, and dedup ranks by
      catalogue tier, so a reviewer-agent finding is kept over an engine finding,
      and the kept finding carries the group's highest severity, in the
      coordinator's Pass 1 and in the workflow dedup. A brief-conflict mark can no
      longer lower a reviewer's MAJOR (operator decision 2026-10-12). On the
      workflow path, floor (b) and the put-back of every engine finding the
      coordinator did not return (both below) hold the same line after the
      coordinator answers.
    • Explorers and reviewers stay in the repo. /trekplan tells its
      brief-reviewer, the eight Phase 5 explorers, the Phase 6 deep-dives, the
      plan-critic and the scope-guardian to read local files only inside the repo
      under exploration plus the paths their prompt gives, and every explorer gets
      the brief.
    • The brief review stamp covers only text the reviewer saw. For a small
      brief, the reviewer's gaps are written after the stamp, so the stamp reads
      stale and /trekplan reviews the brief once more.
    • Approval commits carry the caller's Co-Authored-By trailer.
      artifact-commit.mjs takes --trailer and refuses (exit 1, before anything
      is staged or committed) a missing, multi-line or malformed trailer, an unfilled {model}, and
      one that names a session link. /trekbrief, /trekplan and /trekexecute
      pass it; /trekexecute prints the reason and goes on when the approval is
      logged but not committed.
    • A list joiner no longer ends the read of a plain path below 1.9. In
      Files:, a +, &, and or or between backticked paths is no word of
      description, so a plain path after them is read as a file again, as 6.3.1
      read it, and a step of two tests joined by + and a plain source is not
      tests-only (review 182ceb93).
    • A 1.9 entry keeps the paths of a line wrapped after a comma, and a
      numbered File: line names its test.
      A line that is no list item keeps
      its paths only after a comma, when the entry so far ends with one
      (operator decision 29, 14.10; reviews d21ff81e, eaeb398e), so a
      Files: list wrapped after a comma names every file: the step is not
      tests-only, and K6 plans the second file too. Otherwise that line, and
      every later wrapped line of the entry, is description and never read. A
      File: line with nothing after it takes its first wrapped line. The
      Test first: File: line may open with -, *, +, 1. or 1), and
      any list item ends it (reviews b4fa1927, 4b6460e5).
    • A 1.9 plan refuses placeholders and mixed-case bare names as files
      (operator decision 22, 13.10; review 33f37f53). A leading backticked span
      that is a placeholder (none, TBD, TODO, TBA, N/A, NA, ..., in
      any case) or a bare name that is neither in capitals nor a build file, such
      as the mixed-case Parser, is PLAN_STEP_PATH_NOT_A_PATH, and its hint
      says to write ./Name for such a file. LICENSE, README and Makefile
      stay files; below 1.9 nothing changes.
    • The engine of a payload is read from an own property. Ingest no longer
      gives the findings of a payload whose reviewer is named toString,
      constructor, __proto__ or another name Object.prototype carries an
      engine (it gave them a function or an object), and toReviewerPayload
      refuses an engine named toString with its "engine must be one of" error
      (review 3799ea6c).
    • Pass 1 ranks by catalogue tier, and a duplicate never lowers its group.
      Of findings with the same (file, line, rule_key), the coordinator's Pass 1
      and dedupByTriplet keep the one with the higher catalogue tier, then a
      reviewer-agent finding over an engine finding, then the higher asserted
      severity, then the brief-conformance-reviewer finding, then the first
      seen, and write the kept finding at the highest severity its group asserted.
      Before, a marked code-review MAJOR beat a reviewer's MINOR on the same
      triplet and the review came out ALLOW; now it is WARN (review bc7f4e23;
      the coordinator's prose, operator decision 24).
    • The workflow review puts back every engine finding the coordinator did not
      return
      (operator decision 23, 13.10; reviews ab1b5d9f, bc7f4e23). On
      the opt-in workflow path, dedup ranks as Pass 1 does, and every engine
      finding with no returned finding at its exact (file, line, rule_key) is
      put back at its own severity, one per triplet (the higher-severity copy when
      two share it), so dropping, moving or relabelling an engine finding no
      longer lowers the verdict. Beside it, floor (b): a returned finding is never
      below the lower of its reviewer counterpart's severity and its catalogue
      tier (for a key outside the catalogue, the counterpart's severity). The
      workflow path is now stricter than the default path (see Known issues).
    • An approval trailer with a blank or padded name is refused.
      artifact-commit.mjs refuses a trailer whose name is empty or only spaces,
      or that holds two spaces in a row, so an empty {model} ("Claude" and two
      spaces) fails as the module header promises. A name with a parenthesis,
      such as "Claude Opus 5.5 (1M context)", is still accepted (review
      8420915b).
    • The plan validator parses each step once. validatePlanContent reads a
      step's fields once and every check, --steps-from included, reads them from
      there; its errors and warnings are unchanged (review 93382464).
    • Red proof reads the step's test files from the plan and prints them, and
      the executor defines them once
      (review cf241526;
      operator decision 30, 14.10; reviews 793fc1aa, 09ae46d8, d01df508,
      11ee78c5). With --plan and --step, red-proof.mjs reads the step's
      test files from the plan as decision 20 and, below 1.9, decision 31 set
      them, and prints the list it ran as tests (a tests: line in text mode).
      The helper and the executor pass no --tests, and the lock's --files is
      that printed list. A --tests that names another set is exit 2 with a
      reason that starts tests-mismatch and the plan's list in plan_tests; a
      plan or step it cannot read is exit 2 with a reason that starts
      plan-unreadable, and the executor corrects its own call; a step whose
      plan names no test file reads as before. commands/trekexecute.md defines
      the step's test files in one sentence the other places point to.
    • The /trekbrief pass branch names no ## Brief Quality, and the stats
      rows span their blocks
      (operator decision 21, 12.10). That section belongs
      to the exhausted and force-stopped branches only. In
      tests/fixtures/jsonl-schemas.md the line_ref of the trekbrief, trekplan
      and trekreview stats rows runs from the phase heading to the closing fence of
      its stats-append block, and a test pins all four command rows (trekexecute's
      too) by exact equality.
    • original_severity names what the kept finding asserted (review
      08deae68). When Pass 1 raises a finding to its duplicate group's
      severity, Pass 3 writes original_severity from the finding's own
      severity, and only when that differs from its catalogue tier; the carrier
      field pass1_raised_from never leaves the contract.
    • The workflow review fails closed when its coordinator returns nothing
      (review edf2ec56). A coordinator that returns no verdict and findings
      counts as a missing reviewer: the merged findings are read at their
      catalogue tier or higher (never lowered), the verdict starts at WARN (a
      BLOCK stays BLOCK), and every reviewer, engine and coordinator that did not
      deliver is named in allow_blocked_by as missing-reviewer:<name>, so the
      verdict gate exits 2 on such a WARN.
    • K6 keeps its own normaliser and LIST_ITEM is one literal again
      (operator decision 27, 13.10; review 7961a700). The two /simplify edits
      that crossed the first remediation's fence around K6 are reverted.
    • The control-run test leaves headroom over a slow start (review
      703d87e1). Under full-suite load the start-point run of red proof's
      control-run test was killed at its 2 s timeout. The test now gives red proof
      a 15 s timeout and starts every run but the control slowly on purpose, so a
      timeout without headroom fails on demand; the numbers live in
      tests/helpers/timing.mjs.
    • Below 1.8 a plan that names no test file gets the files the helper
      wrote
      (review 7b3b59ed; operator decision 41, 14.10). A File: line
      below 1.8 may name its test without backticks, so red proof reads no test
      file from the plan and answers no test files given. The helper then runs
      the same red proof again with --tests naming the files it wrote, and the
      executor gives red proof that same list, so such a step is proven and locked.
    • The post-compact hook test survives a slow start (decision 44). Its
      hook child had a fixed 5 s timeout and was killed under full-suite load.
      The timeout now comes from tests/helpers/timing.mjs, and a killed hook
      child reads as a failure instead of exit 0.
    • Plan dedup keeps distinct file-level findings apart, and no longer
      crashes on a bad field
      (decision 43). Findings of one rule key on line 0
      or with no line no longer collapse into one. An empty file or a line
      that is not a whole number no longer crashes the finding id; the line
      becomes null and the finding stands.
    • The critic loop no longer folds a new finding into an old one by its id
      or line alone
      (reviews 4ab24b07, d03835c4; operator decision 48,
      16.10).
      • What happened: an equal id or the old finding's line was enough. The new
        text was lost, and a new file-level major could count as an old rule-B
        minor.
      • Now the texts must overlap, a finding with a plan line is never matched
        by id, and a new finding never takes an old finding's id.
    • A lowered_from that is not a severity now counts as blocker (reviews
      8782602b, ebe164e2; operator decision 48, 16.10). It was read as no
      lowering. A blank one is still no lowering.
    • Plan dedup no longer lets reviewer order lower a blocker (review
      69c9cebd; operator decision 48, 16.10).
      • A merge keeps the copy rule B counts highest, on the merged keys.
      • This also covers a blocker claim merged into a plain major, found during
        this round.

    Known issues

    • The session split reads a 1.9 plan as an older plan (operator answer 3).
    • Marked MINOR findings still feed recurrence / project-memory proposals.
    • The default review path's verdict gate does not compare review.md with the
      engine payloads, so only the opt-in workflow path puts an engine finding the
      coordinator did not return back (operator decision 23). The operator made
      that check a separate delivery later (operator decision 25, 13.10).
    • Below 1.9 the plan-file sweep (K6) keeps its own wider reader of the File:
      line (operator 2026-10-11): it plans every backticked path on that line, also
      one in the description that decision 20 no longer counts as a test file.
    • Red proof accepts a --tests that matches the plan's list and prints it in
      the spelling it was given, not the plan's (review 2d624b54; deferred by
      operator decision 42, 14.10).
    • ingest keeps a pass1_raised_from and an original_severity that a
      payload wrote on its own finding (reviews c06d5385, e031a480; deferred
      by operator decision 42, 14.10).
    • When its coordinator returns nothing, the workflow review raises the merged
      findings in place; this has no effect on its output today (review
      6ff82e75; deferred by operator decision 42, 14.10).
    • A whitespace-only line ends a 1.9 Test first: File: entry but not a
      Files: entry, to be skipped in both by operator decision 40 (review
      4b6460e5; deferred by operator decision 42, 14.10). The same id stands
      in a Fixed bullet above, which fixed the list-item case of that review; the
      whitespace-only case came back open.
    • A 1.9 wrapped line read as description is dropped without a warning, even
      when it opens with a backticked path, to be warned on by
      operator decision 39 (review 4e1607cb; deferred by
      operator decision 42, 14.10).
    • Handover 4's Files: bullet words its empty-entry rule as for a File:
      line (review 4f22b101; deferred by operator decision 42, 14.10).
    • Accepted deviation: the 1.9 File: selector repeats the list-marker set of
      LIST_ITEM (review 4dce7c74; operator decision 38, 14.10, decision 27
      stands).
    • The line diff's LCS table has no size bound. A rewritten gap of tens of
      thousands of lines takes seconds to minutes and gigabytes, and can end
      outside exit 0/1/2. Real plans measure about 1,200 lines (review
      8a9b5a17; deferred by operator decision 48, 16.10).
    • A previous finding re-reported on its own edited line is counted twice.
      Such a re-report of a lowered finding counts at its full severity (review
      8004ea85; deferred by operator decision 48, 16.10).
    • A line sent as a numeric string ("42") is read as no line and counted
      at full severity. The agent templates give line as a number (review
      c257625e; deferred by operator decision 48, 16.10).
    • npm test does not run tests/e2e-critic-diff-mode.sh. It runs under
      ## Verification and in /trekreview's success-criteria check (review
      818b1346; deferred by operator decision 48, 16.10).
    • The matcher's residual (review 4ab24b07; operator decision 50, 16.10): a
      previous finding marked resolved by every raiser and re-reported in other
      words (content overlap below 0.7) on an unchanged line is a new finding,
      which rule A can lower to minor. The same holds for a re-report in the same
      short words (fewer than 6 content words) away from the previous finding's
      place.
    • A short new finding at a previous finding's place is matched to it when
      all its content words appear in the old text: the overlap is measured
      against the shorter text, and the place clause has no word floor. The new
      text is lost, and the old finding's severity is counted, a rule-B minor
      included (review ea8c1752; deferred by operator decision 51, 16.10).
    • In a merge of three or more copies, a copy's rule-B claim that ties on the
      keys merged so far is dropped. When the security key arrives with a later
      copy, reviewer order still decides between minor and major (reviews
      436ade33, f9ba85e1; deferred by operator decision 51, 16.10).
    • A lowered_from such as "none", "n/a", false or 0 counts as
      blocker, by design (fail-closed). A reviewer that writes one on a finding
      it did not lower turns a minor into a BLOCK (review 79d1dc97; deferred by
      operator decision 51, 16.10).
    • The rule that a blank lowered_from is no lowering lives only in plan
      dedup. A --record input that bypasses dedup with lowered_from: "" counts
      as blocker (review 2e7afd61; deferred by operator decision 51, 16.10).
    • When the plan has not changed since the previous round, the gate counts
      the round fully, and a previous finding that no reviewer reports again
      leaves the count without being marked resolved. This predates the critic
      loop's diff mode (review 4c340d4a; deferred by operator decision 51,
      16.10).
    • A near-duplicate merge in plan dedup keeps only the survivor's place, so
      rule A can lower a new major in the changed text to minor when its partner
      cites an unchanged line, and the round can record PASS. 6.3.1 counted that
      merge major (review ef1633b6; deferred by operator decision 52, 16.10).
    • Below 1.9, regression A's restored reading also takes a plain slash path
      that a description only mentions after a comma (`tests/a.test.mjs` — covers the parser, lib/parse.mjs stays as is). 6.3.1 read only the test
      file; now the step is no longer tests-only, and the validator warns
      PLAN_STEP_PATH_UNTICKED on the mentioned path (review 38a8ad34;
      deferred by operator decision 52, 16.10).
    • The verdict gate's brief-lowering check compares severities in upper case
      only, so an engine finding written "severity": "major" reads as an
      illegal lowering and the gate exits 2 (fail-closed) (review 20b626e2;
      deferred by operator decision 52, 16.10).
    • The opt-in workflow review's floor raises an illegally lowered or marked
      reviewer finding but keeps its brief_lowered_from and contradicts_brief,
      so the verdict gate still exits 2 on that review (fail-closed) (review
      c614baad; deferred by operator decision 52, 16.10).
    Downloads
  • v6.3.1 a97efb6989

    v6.3.1 Stable

    ktg released this 2026-10-11 16:05:57 +00:00 | 151 commits to main since this release

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

    Rounds 7 to 10 of the release review of 6.3.0. Round 7 is the WARN 6.3.0 was
    released with, round 8 was BLOCK (1 BLOCKER), rounds 9 and 10 were WARN. Every
    fix began with a test that failed on the code before it. Suite 2236 (2234
    pass, 0 fail, 2 skipped).

    Nothing here asks anything of users. Measured against 6.3.0 over the
    marketplace and the test repo: the plan validator reports the same errors and
    warnings for all 233 plan files, the verdict gate gives the same exit for all
    123 review files, and tests-only reads the same for all 1408 plan steps.

    Doors

    • two-way: tests-only is decided by the plan's Files: alone, and red proof no longer reads the step's diff (operator decision 2026-10-11) — a revert brings the diff check back; plans stay valid.
    • two-way: the Files: reader keeps a plain file beside a backticked path, reads numbered entries, and keeps a description together across commas and lines — it feeds only the PLAN_STEP_TESTS_ONLY warning and red proof's tests_only; a revert restores the 6.3.0 reading.
    • two-way: a trailing # comment is dropped from a backticked check too, so such a check now runs; one whose comment holds a double quote, $, a backtick or a backslash is refused out loud — 6.3.0 refused every backticked check with a comment, so nothing that ran stops running.
    • two-way: the verdict gate reads the last fenced block once and answers exit 2 unless its info string is exactly json, or when it is never closed; a ~~~ fence is a fence — a review written by /trekreview reads as before; a revert reopens the two holes under Fixed.
    • two-way: stops and timeouts, the release check's --review, isMain in every CLI, the test lock's command comparison, one fence reader, and cleanups — fixes; a revert restores the old behaviour.

    Fixed

    • Two verdict-gate holes, present in 6.3.0. A review that ended with a
      clean json block and then a block holding a BLOCK verdict, written as
      ~~~json or opened with more text after json on its line, passed with
      exit 0: the gate did not see the second block. Both are exit 2 now.
    • Tests-only steps. The plan's Files: alone decides, and red proof,
      /trekexecute, step-implementer and the handover contract say so. A change
      already in the tree when the step began no longer counts against it, and a
      plan outside .claude/ reads the same.
    • The Files: reader keeps a plain file beside a backticked path
      (", Dockerfile", "and Makefile"), reads a numbered entry (1. or 1)) as an
      entry, keeps a description together past a comma and onto the next line, and
      starts a description at a plain file followed by a colon. Lowercase
      makefile, rakefile and justfile are build files.
    • Checks with a comment. A trailing # comment is dropped in a backticked
      check and in a command passed as written, so the words screened are the
      words run. A comment with a double quote, $, a backtick or a backslash is
      refused instead, because the executor hands the Verify: span to red proof,
      the test lock and the done line inside double quotes. Every reader refuses it
      out loud (PLAN_VERIFICATION_NOT_RUNNABLE, BRIEF_SC_NOT_RUNNABLE). A span
      that is only a comment is not-a-command.
    • Stops. Red proof reports a command killed by its timeout as killed after
      the timeout, not "could not start". The release check tells a timeout from
      output past its buffer and from another signal. One reading of a stop
      (stoppedBy) serves red proof, the criteria runner, the test lock, the done
      line and the release check.
    • Release check. A relative --review is read in --repo, or from the
      current directory when only that one exists. Two different files are exit 2,
      never guessed, and one file reached through a symlinked --repo is one file.
    • Every CLI uses one isMain helper. Before, some did nothing and exited 0
      when run through a symlink or a path with a space.
    • Test lock. It compares --cmd by its words and without its trailing
      comment.
    • One fence reader for the gate and every reader of a trailing json block.
      A fence closes only on a run at least as long as its opener, as in Markdown,
      and CRLF and an indented fence read alike everywhere. A fence indented four
      spaces or more still counts, on purpose: Markdown's rule made a BLOCKER block
      inside a list item invisible.
    • Cleanups. The 15-minute timeout is defined once, the findings check reads
      each cited file once per validation, and the guard writes its no-one-to-ask
      refusal once.

    Known issues

    Round 11 of the release review (0f400d3..10ac9c5) is WARN: 0 BLOCKER, 10
    MAJOR, 0 MINOR. All ten come from Claude Code's /code-review, which gives no
    category, so each enters as MAJOR. Voyage's two reviewers and
    /security-review found none. The operator chose to release 6.3.1 with it
    (2026-10-11). None of the ten lets a gate pass. The regressions below were
    checked by running them against 6.3.0. None of them occurs in the 1408 plan
    steps measured above.

    • The Files: reader still guesses paths from prose and misreads in both
      directions. Two misreads are regressions from 6.3.0:

      • A source file after a described test is dropped
        ("tests/a.test.mjs - new test, src/a.mjs - the fix"). The step that
        builds code then reads as tests-only and goes to the plan.
      • A path that a description only mentions is read as a file ("covers the
        parser in src/parse.mjs"). A step of only tests is then not caught and
        goes through fix rounds (at most five, then the operator).

      Red proof has no diff check behind the reader. The structural fix is to
      require every path in Files: to be backticked. It changes the plan
      contract and is left for a planned release.

    • A json block closed on the same line as its JSON is no longer read (a
      regression from 6.3.0). The gate answers exit 2, and a reviewer is asked
      again. An opener with a blank before json is not json either, as in 6.3.0.

    • A trailing comment with a double quote, $, a backtick or a backslash is
      refused in every backticked check. That includes checks that never reach a
      shell: a ## Verification bullet, Regression:, End-to-end: and a brief
      criterion. 6.3.0 refused these too.

    • Cleanups: a dead branch for a span that is only a comment, the comment
      dropped up to four times per command, a re-export of the timeout that
      nothing imports, and a test helper that copies a PATH lookup.

    • An engine run that was stopped and not counted in the verdict reported three
      more, each checked by running:

      • A backticked bare name such as LICENSE, alone on a line after a
        description, is no longer read as a file. 6.3.0 read it.
      • One unclosed fence earlier in a review hides the review's own json block
        from the review validator. 6.3.0 found the block, and the gate answers
        exit 2 there.
      • An indented json example after a review's own block is read as the last
        block, as in 6.3.0.
    • The example plan's steps 1-2 keep their tests-only warning (operator
      decision 2026-10-09).

    Downloads
  • v6.3.0 0f400d3461

    v6.3.0 Stable

    ktg released this 2026-10-11 06:33:07 +00:00 | 157 commits to main since this release

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

    Wave 2 of the practice build (five orders, merged 2026-10-09) and the fix round
    after it, which closes finding 1 of the test repo's third trial: a step of only
    tests can never be proven red. Every fix began with a test that failed on the
    old code. Suite 2194 (2192 pass, 0 fail, 2 skipped).

    Two changes ask something of users (see Doors): /trekexecute now refuses a
    plan that has no logged approval for its current content, and a check in a
    brief or plan runs with no shell, as plain words with a runner's read-only
    options. Plan 1.7/1.8, brief
    2.0–2.2 and review 1.0/1.1 files still validate; the new step fields are
    optional.

    Doors

    • one-way: /trekexecute refuses a plan whose logged approval does not cover its current sha256 (K2) — a plan written before 6.2.0, written by hand, or edited after its approval stops at Phase 1; run /trekplan --project <dir> and answer "Approve" (from 6.3.0).
    • two-way: /trekexecute reviews by itself in the closing run (/simplify → /trekreview → verdict gate, K7) and keeps the main merge closed on BLOCK or an undecided verdict; step check (K9), Regression: (K10), architecture rules (K5) and plan-file sweep (K6) run at step end and after the last step — a revert restores the old executor; nothing to do for users.
    • two-way: the approval guard refuses a merge into main, a push, a tag or publish and destructive git in the permission mode that shows no prompts — a revert lets them through again; nothing to migrate.
    • two-way: progress-validator rejects the runner's exitCode in plan_verification.failed_criteria (C15) — the executor's own prose always wrote exit_code.
    • two-way: skills workshop — form check, model-free routing test, test-first and debugging preloaded into step-implementer — new files and one skills: line; a revert removes them.
    • two-way: researching-sources skill, preloaded by the five web-search agents and named by /trekresearch — the agents' copied rule text moved into the skill; a revert puts it back.
    • two-way: Regression: (K10) and On failure: action words (K11) — an optional field and a warning; plans without them validate as before.
    • two-way: trial 2's minor fixes (B8, B11, B12, C13, C14, C16, C17) — checks, prose and agent text; a revert restores the old behaviour.
    • two-way: release check and runbook — new files; a revert removes them, and nothing else reads them.
    • two-way: tests-only steps (PLAN_STEP_TESTS_ONLY, red-proof --plan/--step → tests_only, which also reads the step's own diff, executor routes them to the plan) — a warning and an optional flag; a revert removes them, plans stay valid.
    • two-way: timing tests under load (hook helper kill limit 30 s, SC #14 fastest of three against 800 ms) — test-only.
    • two-way: example plan On failure: lines open with a K11 word, and its verbose-content test moves into the step that wires the output (6 steps, progress.json follows) — text in an example.
    • two-way: /trekreview saves the reviewer's whole answer for the findings check and names FINDING_PROSE_LINE_OUT_OF_RANGE — command text.
    • two-way: the criteria runner's commands run without NODE_TEST_CONTEXT — a false green under node --test is now red; nothing to do for users.
    • two-way: the fixes from the release review of 6.3.0 (rounds 1-6) — checks and prose; progress.json may now say simplify: "revert-refused" (an optional value); a revert restores the old behaviour.
    • one-way: a check in a brief or plan (criteria, Regression:, proof of red, the done line, the test lock) runs with no shell: its words reach the runner as written, so only plain words run (no quote, backslash, $, brace, or ~/@ at a word's start; a glob only for node --test on Node 21 and later; no path that climbs out with .. or starts at /, git included; a trailing # comment in a shell fence is dropped) with a short list of read-only options per runner — git without --output or --no-index, node --test with a built-in --test-reporter only, nothing after make test, only paths after npm test --; an option that writes a file or loads code is refused — a criterion that used one (git log --grep="x", pytest -k foo, pytest tests/test_*.py, jest --coverage, go test -timeout 30s) is now NOT RUN at review and not runnable on a 1.8 plan; wrap it in bash tests/<script>.sh (from 6.3.0).
    • two-way: the phase-model resolver text says effort comes only from the brief's phase signal — prose only, no code change.

    Added

    • /trekexecute is coupled to the gates (order 6).
      • Plan approval (K2): approval-log.mjs verify --kind plan before step 1;
        not-logged, mismatch, expired, broken and diverged halt with what
        to do. Exit 2 is never a pass.
      • Step end: the step check (K9; exit 2 is "not measured") and the step's
        Regression: command (K10, new lib/verification/regression-check.mjs
        through the criteria runner) run green before the checkpoint.
      • After the last step: architecture rules (K5) and the plan-file sweep
        (K6); a violation or a file no step names turns completed into
        partial.
      • The closing run reviews by itself (Phase 7.2): run the thing,
        /simplify, /trekreview, verdict gate. A BLOCK adds the review's
        remediation steps after the plan validator accepts them and the operator
        re-approves the plan, at most TREKEXECUTE_MAX_REVIEW_ROUNDS (3) times.
      • The main-merge gate is a lock on the verdict, and where the guard asks,
        the executor does not ask again (one question per merge).
      • progress.json gains optional coupling fields (Handover 5).
    • Skills (orders 7a and 7b), the first three: voyage:test-first and
      voyage:debugging, preloaded by step-implementer, and
      voyage:researching-sources, preloaded by the five web-search agents and
      named by /trekresearch at spawn. lib/skills/skill-lint.mjs checks the
      form; lib/skills/routing.mjs is a model-free routing test over the
      skills, the 7 commands and the 21 spawnable agents (collision at 0.75 fails;
      thresholds pinned). Eval cases evals/skill-* are written, not run.
      Authoring method: docs/skills-authoring.md.
    • Release and rollback (order 8). docs/release-runbook.md (before, the
      release, both rollback paths drilled in a sandbox) and
      scripts/release-check.mjs: clean tree, npm test at HEAD, review verdict
      not BLOCK and covering HEAD, a ### Doors list. 0 ready, 1 not ready, 2
      could not run.
    • Plan step rules (order 9). Regression: — one allowlisted command,
      unpiped (PLAN_STEP_REGRESSION_NOT_RUNNABLE); On failure: opens with
      revert | retry | skip | escalate, or PLAN_STEP_ON_FAILURE_UNKNOWN warns.
      Minors open after the last critic round are listed for the operator, and
      --extra-round records the round they pick.
    • Tests-only steps (order 10). PLAN_STEP_TESTS_ONLY warns on a step
      whose files are all tests; red-proof --plan/--step reports tests_only,
      and /trekexecute sends such a step to the plan instead of into fix rounds
      that cannot succeed. /trekplan, the plan template and plan-critic say
      the test belongs in the step that builds the behaviour.

    Fixed

    • The approval guard refused only a merge into main and a push in the
      permission mode that shows no prompts; a tag, a publish and destructive git
      went through unattended. Now every call it would ask about is refused there.
    • Plan-review dedup merges two findings on the same file:line with the same
      content; the Jaccard threshold for every other pair is unchanged.
    • /trekbrief Step 4c says the brief reviewer runs in the background and is
      waited for.
    • The Phase 4 size count includes .mjs, .cjs, .mts, .cts.
    • criteria-runner --evidence shows the first output line on PASS rows.
    • The findings schema checks path:line citations in finding prose against
      the file; /trekreview checks the reviewer's whole answer and names
      FINDING_PROSE_LINE_OUT_OF_RANGE.
    • git-historian never proposes changing a file the brief froze, and names
      the remote from git remote -v.
    • The criteria runner's commands run without NODE_TEST_CONTEXT, so a test
      run inside node --test can no longer pass falsely.
    • Timing tests tolerate load (fastest of three; hook helper kill limit 30 s),
      and the K2 hook tests use unique session ids per run.
    • The example plan's On failure: lines use the K11 words, and its
      verbose-content test moves into the step that wires the output. Steps 1-2
      (golden capture, stability harness) keep their tests-only warning; a step
      type for them is a later question, and step 2's heading no longer says it
      must fail.
    • The resolver text in four commands says effort comes only from the
      brief's phase signal.
    • Release review of 6.3.0 (seven rounds; rounds 1-3 BLOCK, rounds 4-7 WARN;
      every finding of rounds 1-6 fixed with a test that failed first, round 7's
      under Known issues): the guard refuses where
      no one can be asked also when its rules will not load; review steps appended
      by /trekexecute are held to the step rules on any plan version and need a
      Verify: (plan-validator --steps-from); a restore the guard refuses is
      recorded as revert-refused and stops the run before review, never as
      reverted; every check Voyage runs runs with no shell (round 5, the
      operator's structural fix after the patching of the shell screen did not
      converge), as plain words and each runner's read-only options; the release
      check compares version files without their version, lets the README change
      only in the badge's version, reads scope_sha_end as a commit sha, sees a
      file moved after the review, ignores Voyage's own artifacts committed after
      the review, runs the cheap checks first, stops a suite that never ends,
      works for a plugin in a subdirectory and never reports a crash as "not
      ready"; the plan-file sweep reads Files: as v6.2.0 did, and the
      tests-only check has its own reader, and red proof also reads the step's
      diff (see Known issues); skill frontmatter and routing read YAML values, comments and tags
      as YAML does; regression-check prints the progress.json status and runs
      through the criteria runner itself. /trekexecute says plainly that review
      steps in the template's own form stop with a re-plan.

    Known issues — for 6.3.1

    The seventh round of the release review is WARN: 0 BLOCKER, 12 MAJOR, 0
    MINOR. The operator chose to release 6.3.0 with it (2026-10-11); the findings
    go into 6.3.1.

    • Tests-only steps: when red proof decides, the step's diff in the documented
      flow holds only the test, so it cannot overrule the plan's Files: reading;
      a change already in the working tree when the step started counts against
      tests-only; an unbackticked file next to a backticked path in Files: is
      not read.
    • Red proof reports a command killed by its timeout as "could not start". The
      release check calls a suite killed for too much output a timeout, and reads
      --review from the current directory instead of --repo.
    • A trailing # comment is dropped in a fenced check but not in a backticked
      one.
    • The example plan's steps 1-2 keep their tests-only warning (operator
      decision 2026-10-09; a step type for them is a later question).
    • Four cleanups: the 15-minute timeout defined in three places, a line count
      read once per citation, isMain copied into five more CLIs, and a
      roundabout condition in the guard.
    • Found while writing the review, and present in 6.2.0 too: the findings check
      ends a reviewer's json block at the first triple backtick, even one inside a
      JSON string.
    Downloads
  • v6.2.0 4ee711a6ac

    v6.2.0 Stable

    ktg released this 2026-10-08 18:53:31 +00:00 | 188 commits to main since this release

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

    Wave 1 of the practice build (five parallel orders, merged 2026-10-06), the
    fixes from two end-to-end trials in a separate test repo, and the defects an
    independent reader found in those fixes. Every fix began with a test that
    failed on the old code. Suite 1972 (1970 pass, 0 fail, 2 skipped).

    Nothing that was valid becomes invalid: plan 1.7, brief 2.0–2.2 and review 1.0
    files still validate. The new fields are optional, and the new rules apply only
    from plan 1.8 and review 1.1.

    Added

    • Intent (/trekbrief). A size class
      (ceremony: small|bounded|architectural; absent = architectural) sets the
      question budget, and the brief asks one round of questions with the
      recommendation first. "høres bra ut", "gjør som du vil" and an empty answer
      are not approval. lib/util/approval-log.mjs keeps an append-only,
      hash-chained approval log in the target repo, bound to the approved
      content's sha256. lib/util/artifact-commit.mjs commits it.
      /trekplan Phase 1 halts on a broken, missing or mismatched entry.
    • Plan 1.8 and the plan gate (/trekplan).
      • Plan 1.8 requires Test first: on every step and one End-to-end: step.
        New optional fields: Interface in:, Interface out:, Review focus:.
      • An architectural plan gets a ## Design part.
      • The critic loop has at most 3 rounds, and the plan records them.
        lib/validators/plan-gate.mjs decides: 0 go, 1 stop, 2 could not run.
        An open MAJOR stops the plan, and after the last round the operator
        decides.
      • plan-critic now checks 12 dimensions.
      • New lib/verification/arch-rules.mjs runs the target repo's own
        dependency-cruiser or import-linter.
      • New lib/verification/plan-scope-sweep.mjs lists changed files that no
        step names.
    • Step helpers and proof by command (/trekexecute).
      • One fresh step-implementer helper per plan step (new agent: opus, effort
        high, no Agent tool).
      • One controller reads the diff and gives two verdicts: does the step meet
        the plan, and does it hold the quality.
      • Fix rounds go up, at most 5: helper, then plan, then operator.
      • New lib/verification/red-proof.mjs: the step's test must fail at the
        start point and pass at the result.
      • New lib/verification/test-integrity.mjs (the floor guard) catches
        removed asserts, skipped tests, stubs and loosened thresholds.
      • New lib/verification/done-line.mjs writes the done line only when the
        test command exits 0.
      • A closed stop list and a decision log appear in the final report.
    • Guards (command hooks only, none runs a model).
      • pre-bash-executor answers "ask" before a merge into main, a push, a
        tag or publish, and destructive git. post-approval-log records the
        answer.
      • pre-plan-gate runs the plan gate when a Voyage plan leaves plan mode.
      • The test lock (lib/util/test-lock.mjs, pre-write-executor,
        stop-test-lock) refuses edits to a locked test file, and refuses "done"
        until the step's own test command is seen green.
      • post-edit-check runs the target repo's own formatter or linter. It runs
        only during a Voyage plan run or after opt-in.
      • New lib/verification/step-check.mjs checks each step when it ends.
    • The review is a gate (/trekreview, review 1.1).
      • verdict: ALLOW | WARN | BLOCK is required.
        lib/review/verdict-gate.mjs reads it: 0 ALLOW/WARN, 1 BLOCK, 2 could not
        decide (never green). A control that did not run gives exit 2.
      • Claude Code's /code-review and /security-review run as the engine.
        Their findings enter through lib/review/engine-findings.mjs under three
        rule keys. CODE_REVIEW_IMPROVEMENT (MINOR) covers simplification,
        efficiency, reuse, style and readability. The rule catalogue now has 15
        keys.
      • No finding is struck for length. Only MINOR and SUGGESTION text is
        trimmed, and the trims are counted.
      • The coordinator lists what it declined to judge.
      • Every BLOCKER becomes a numbered remediation step.
      • A finding class seen in two reviews is proposed as a project-memory line
        (lib/review/recurrence.mjs). The operator approves each line.
    • Checks when a brief or plan is written. A success criterion or Verify
      line that the criteria runner could never run is caught when the brief or
      plan is written, not when the review runs. The brief validator warns
      (BRIEF_SC_NOT_RUNNABLE, BRIEF_SC_SUBPOINTS, BRIEF_SC_BASH_NOT_PINNED).
      For a 1.8 plan, the plan validator reports PLAN_VERIFICATION_NOT_RUNNABLE,
      PLAN_STEP_VERIFY_NOT_RUNNABLE, PLAN_END_TO_END_NOT_RUNNABLE and
      PLAN_END_TO_END_NOT_VERIFIED: as errors under --strict, otherwise as
      warnings.

    Fixed

    • The write guard covers Edit and NotebookEdit, not only Write, and
      fails closed.
    • The review keeps findings that are right:
      • an engine finding is never set aside for Actionability;
      • recommended_action is the engine's own fix, or otherwise a test-first
        step, never the failure scenario;
      • a cited line past the end of a file is caught;
      • finding ids are computed, not typed by a model.
    • A MINOR /code-review finding outside the reviewed range no longer holds
      ALLOW back. A MAJOR one still does.
    • The plan template's checkpoint stages the step's files
      (git add … && git commit). The pre-compact hook reads that form.
    • The brief template's examples are commands the runner accepts.
      /trekcontinue and /trekexecute call lib/ through the plugin root.
    • Manifest must_contain uses grep -E -e … --, so a pattern such as
      --sep is not read as an option.
    • /trekreview, /trekresearch and /trekcontinue write stats through
      stats-append and report a failed write.
    • annotate prints an absolute path.
    • A test lock marked green may stop while it waits for its controller.
    • /trekplan runs every exploration agent, and reviews the brief again only
      when it has changed since /trekbrief reviewed it.
    Downloads
  • v6.1.1 8f707aab0f

    v6.1.1 Stable

    ktg released this 2026-10-05 16:43:28 +00:00 | 215 commits to main since this release

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

    A patch release. /trekexecute no longer loses its telemetry when the harness
    does not export CLAUDE_PLUGIN_DATA, its progress-file prose now matches its
    own validator, and no agent is pinned below reasoning effort high.

    Fixed

    • lib/stats/event-emit.mjs falls back to the same data directory as
      stats-append and the yardstick when CLAUDE_PLUGIN_DATA is unset, instead
      of skipping silently. Every written:false (failed write, usage error,
      payload-not-json) exits 1 with a reason. The CLI also runs when it is
      invoked through a symlink or a path with a space.
    • main-merge-approved, main-merge-declined and gates_mode_flag_override
      are known events.
    • /trekexecute Phase 8, Phase 9 and the gates_mode_flag_override record all
      write through a writer that resolves the directory. A failed write is printed
      in one line and the run continues.
    • Phase 8 passes each event payload on stdin through a quoted heredoc
      (event-emit.mjs --payload -), so the shell expands nothing in it. Before,
      the plan path went into a single-quoted argument: a path with a quote
      character broke the shell parse, and a quoted pair could run a command
      substitution.
    • The progress-file schema and status rules in /trekexecute use the
      validator's vocabulary (in_progress, completed, plan_version).
      progress-validator now accepts the run status stopped and the step
      status blocked, both of which the command writes. A legacy passed step
      is still treated as completed on resume.
    • architecture-mapper, dependency-tracer, git-historian and task-finder
      pin effort: high (was medium). No agent is pinned below high; the rest
      follow the session.
    Downloads
  • v6.1.0 5680591ddf

    v6.1.0 Stable

    ktg released this 2026-10-05 10:43:29 +00:00 | 222 commits to main since this release

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

    The use row in scripts/yardstick.mjs now counts an order as used only when
    a Voyage record names the order's id. Counting itself stays off
    (USE_COUNTING_SINCE = null) until the operator declares the work done; the
    tool ships first, the measurement comes after.

    Added

    • lib/stats/claimed-order.mjs finds the one coord-queue order the session
      has claimed (repo-mailbox's claim contract, read-only). Exactly one claimed
      order is an attribution; zero or several is null plus a reason, never a
      guess.
    • /trekbrief stats records carry order_id, order_claimed_at and
      order_reason, added by the writer (stats-append), never typed by the
      model. The fields are on all five stats surfaces and are not exported.
    • facts.ordersNamedByARecord in the yardstick output: a known-positive
      diagnostic for the use row.

    Changed

    • Yardstick use: the slug join is replaced by an order-id join. YES = a
      trekbrief record names the order's id; declared NO = the order's own
      arbeidsform: ordre line; no record = not measured, never a no.
    • /trekbrief --approve now runs Phase 7 after a successful stamp, so the
      approval leaves a trekbrief record (mode: "approve").

    Fixed

    • The CLI main-guard in stats-append and yardstick compares real paths,
      so it no longer silently does nothing under a symlink or a space in the
      path.
    Downloads
  • v6.0.0 7439dac927

    v6.0.0 Stable

    ktg released this 2026-10-02 17:54:22 +00:00 | 239 commits to main since this release

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

    Operator decision 2026-09-27: nothing Voyage ships starts a Claude Code
    session. Work that needs another session becomes an order plus a starter
    line that the user runs in a session they open themselves; parallel work
    inside one session uses subagents. This is a breaking change for anyone who
    relied on Voyage launching sessions.

    Changed (breaking)

    • /trekexecute multi-session path (Phase 2.6) no longer launches child
      sessions and no longer finishes in one call. It prepares one wave at a
      time: a worktree per session, one session order per session
      (.claude/trekplan-sessions/{slug}/orders/, written by the new
      lib/util/session-orders.mjs) with a /trekexecute --session N <plan>
      starter, and stops. Running the same command again reads each session's
      progress file, merges the wave sequentially and prepares the next one. A
      plan with W waves takes W + 1 parent runs plus one session per order.
      New Hard rule 21: never start Claude Code.
    • Sessions now run under the user's own permission mode and tool set: the
      per-session tool allowlist and the permission-bypass mode are gone, and
      brief.md / architecture/overview.md are no longer injected as an
      appended system prompt.
    • Phase 7.6 recovery writes a bounded recovery order for a session you open,
      and the run stops as partial; nothing dispatches it automatically.
    • /trekplan --decompose (and its alias --export headless): the
      session-decomposer writes orders.md instead of a launch.sh, and the
      "launch" reply is gone.
    • /trekresearch --engine deep-research: the pre-gate no longer runs the
      Claude Code binary to read its version; the post-hoc check decides. The
      version-below-floor reason token is gone (that case now reports
      no-cited-report).
    • No {session-dir}/logs/session-N.log is written any more; progress files
      are the source of truth, and each wave's progress files are archived to
      orders/wave-W-session-N.progress.json before its worktrees are removed.
    • --dry-run no longer prints a billing line.

    Removed

    • The ANTHROPIC_API_KEY billing check, the hooks-fire version precheck, the
      headless safety preamble and the per-child tool, turn and budget flags —
      they existed only for launched children. The TREKEXECUTE_MAX_TURNS and
      TREKEXECUTE_MAX_BUDGET_USD environment variables are ignored.
    • templates/headless-launch-template.md and
      scripts/q3-cache-prefix-experiment.mjs (a finished experiment that
      started the binary; its results stay in docs/).
    • README: the billing-safety and headless MCP-tuning sections, and the
      fourth security layer (scoped per-child tool access), which went with the
      launched children.

    Fixed

    • Every VOYAGE_ROOT resolution in /trekexecute (multi-session Step 0 and
      plan verification), /trekreview and /trekresearch now finds the
      installed plugin: the literal ${CLAUDE_PLUGIN_ROOT} that Claude Code
      substitutes, else the highest installed version in the plugin cache. Before,
      these blocks always exited 2.
    • The multi-session path never force-deletes. Worktrees are removed only
      when git agrees they are clean and session branches are deleted only once
      merged; anything git refuses is kept and listed in the report with what to
      do. Before, a failed session, a merge conflict or a refused merge deleted
      every trek/{slug}/* branch of the wave, finished work included.
    • Collecting a wave never tears down a session that is still running (an
      unknown status counts as running); it stops when the main checkout has
      uncommitted changes or has switched branch, and tells a refused merge from
      a real conflict. The parent run must start in the main checkout, never in a
      session's worktree or a subdirectory's view of it.
    • A merged-waves record, bound to the plan's path and content hash, keeps a
      re-run from preparing an already merged wave again; a different plan or an
      edited plan is refused with the way out named. The record is cleared only
      when the final merge is confirmed.

    Added

    • tests/lib/no-claude-code-launch.test.mjs: fails when any tracked file
      outside a reasoned, exact-count exemption list carries a way to start
      Claude Code; proven on a known-positive fixture for every pattern. The one
      operator-run exception is the fixed test set (docs/proevesett.md).
    • tests/lib/session-orders.test.mjs: runs the order writer on a fixture
      plan and proves the orders land, statuses classify, progress is archived,
      merged waves are remembered, and nothing is started.
    • tests/lib/plugin-root-resolution.test.mjs: runs every VOYAGE_ROOT
      block, substituted and unsubstituted.
    Downloads
  • v5.11.1 57e620b028

    v5.11.1 Stable

    ktg released this 2026-09-23 11:47:52 +00:00 | 257 commits to main since this release

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

    Changed

    • The annotation surface's provenance is described as the pattern it follows
      (pencil toggle, intent buttons, popover form, structured export) instead of
      by naming a repository that no longer exists: .claude-plugin/plugin.json
      and package.json descriptions, README.md, docs/architecture.md, the
      v5.0.3 entry below, and two comments in scripts/annotate.mjs and
      tests/scripts/annotate.test.mjs. No behavior change.

    Added

    • tests/lib/retired-references.test.mjs fails when any tracked text file or
      path contains a term from the gitignored local list
      tests/.excluded-terms.local.txt. The scanner is validated against a planted
      known-positive, an empty scan fails closed, and the named exemption list is
      empty and rot-checked. Without the local list the scan is skipped with an
      explicit message.
    Downloads
  • v5.11.0 0be152ad29

    v5.11.0 Stable

    ktg released this 2026-09-23 10:33:44 +00:00 | 260 commits to main since this release

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

    Added

    • Intent approval gate. /trekplan (both --brief and --project, also
      --quick, no override flag) runs lib/validators/intent-approval.mjs --check
      before it reads the brief. It halts on BRIEF_INTENT_NOT_APPROVED,
      BRIEF_INTENT_APPROVAL_STALE or BRIEF_INTENT_APPROVAL_INVALID, and an
      approval check that cannot run halts too. The marker is intent_approved_hash
      (sha256 over the normalized ## Intent + ## Goal) plus intent_approved_at.
      Editing either section after approval makes it stale. /trekbrief Phase 4h
      shows Intent and Goal verbatim and stamps only on "Approve".
      /trekbrief --approve <project-dir | brief-file> does that step alone for a brief
      from any producer. A ## line inside a code block or HTML comment is not a
      heading, and each section must appear exactly once. The marker is a trace that the
      step ran against this text, not a signature: any session on the same machine can
      stamp.
    • scripts/yardstick.mjs prints Voyage's three numbers (use, trust,
      interrupts) with the denominator and the source each one was read from. It
      exits non-zero while any number cannot be counted, and today it is RED.
    • scripts/end-state-gate.mjs counts the distance to "Voyage is finished"
      (defects, experiments, dormant agents, open decisions). It is fail-closed: an
      entry whose check cannot run counts as open.
    • Plugin eval suite (evals/, docs/proevesett.md): eight cases run as
      real claude -p children with only Voyage loaded, deterministic graders,
      and each expectation committed before its first run. Measured stability: every
      case 5 of 5 over three full runs, and the sequencing-gate case 15 of 15.
    • lib/stats/stats-append.mjs: /trekbrief and /trekplan stats records
      land in the data dir the yardstick reads when CLAUDE_PLUGIN_DATA is empty,
      and a failed write is reported, not skipped silently. intent_approved
      reaches the OTel field allowlist.

    Changed

    • Handover 1 (PUBLIC CONTRACT): a brief from any producer now stops at
      /trekplan until its intent is approved.
      The schema change is additive (two
      optional fields, no brief_version bump). The requirement sits in the
      consumer. See docs/HANDOVER-CONTRACTS.md §Handover 1.
    • The arg parser has a CLI. /trekreview runs it with $ARGUMENTS and relays
      Error: --project <dir> is required. from code (it passed "$@", which the
      Bash tool never has, so the parser never ran).

    Fixed

    • /trekexecute runs the plan's ## Verification on the single-session path
      too (D-03), and /trekreview runs the brief's success-criteria commands and
      gives the reviewer the result (D-04), through lib/verification/criteria-runner.mjs.
    • The criteria runner screens with an allowlist of test runners, not a
      denylist, and refuses writes a brief may not perform. A backticked span runs only
      when it is a command, and the runner reads the repo's own plan format.
    • The end-state gate can no longer be turned green by editing its own ledger,
      and a behaviour probe must fell a stub, not just name a test.
    • The review gold-scorer key separator is written as an escape, not a raw
      NUL byte. The /trekresearch swarm engine points only at the External agents block.
    • Docs no longer claim an opus orchestrator: the commands follow the session model.

    Removed

    • /trekplan's "execute with team" path: Claude Code 2.1.178 removed
      TeamCreate/TeamDelete, so it always fell back to sequential execution.
    • TaskCreate/TaskUpdate from /trekplan's tool lists. Claude Code 2.1.233
      stopped offering them on current models, and no prose called them.
    Downloads