-
v6.5.0 Stable
released this
2026-10-18 18:46:04 +00:00 | 66 commits to main since this releaseWave 3 adds three skills, each one source for a discipline that was copied
or missing before:voyage:interviewingfor the brief's question round,
voyage:writing-criteriafor criteria that can run and go red, and
voyage:reviewing-adversariallyfor 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 bynpm testonmainat
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
f6e18a1restores 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:lineor 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
/trekreviewagents and scope-guardian, and named by/trekreviewat
spawn; it replaces the copied "Interaction Awareness" block. Each
reviewer's Declined to Judge lines now reachreview.md. - Skill
voyage:writing-criteria(order 7c). One source for how a
success criterion or aVerify:,Regression:orEnd-to-end:line is
written so the criteria runner can run it and it can go red; anything more
isbash 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)./trekbriefPhase 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 stayfiks/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.jsonandplugin.json
describe what the product shows. The Norwegian hollow-answer list in
approval-log.mjsand/trekbriefstays: 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: revertleaves a step's new files on
disk;--resumeafter a new plan now runs
lib/util/park-attempt-files.mjsbefore 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-reviewfindings 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 overrule_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)./trekreviewtriage makes every file outside the
deep-review patterns (for examplebin/andtests/) 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 topendingbefore a fix round;
thegreenexception (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 --commitwith 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_RANGEcatches
only a line past the end of the file, and a patch line number written in a
reviewer's prose, or:135with no file name, is not caught. - With
--plugin-dir, statistics go to the installed plugin's data
directory (finding 11):stats-appendandevent-emitwrite to
~/.claude/plugins/data/voyage-…, so a development copy's statistics mix
with the installed version's. /trekplanPhase 9 points the plan reviewers at their schema in
agents/plan-critic.mdandagents/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-reviewdiffs 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'smainwas
ahead ofv6.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 (
/trekreviewoverv6.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 withgit 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=alwayshas 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 twogitcalls never check their exit status. - On the opt-in
--workflowpath, 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/trekreviewand 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_RUNNABLEwarning fires on
prose (the trial-5 finding-1 fix). Confirmed: any bare word in a later
backticked span counts as a command, so "--verboseprints thelogin
field" is told to putloginfirst. A warning, never an error.
Inaccurate — wrong or unclear, nothing stopped or let through
- A finding's
#kid 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. /trekplantells the session to loadvoyage:writing-criteriaby name
but does not list theSkilltool inallowed-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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
1 download
- two-way: skill reviewing-adversarially and its skills: lines (order 7d) — revert
-
v6.4.0 Stable
released this
2026-10-16 22:25:08 +00:00 | 85 commits to main since this releaseA 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 stopsnpm testfrom 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 bynpm teston 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
bynpm testonmainat4e28dc5, 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 whoseFiles: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 eachTest 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 getsPLAN_STEP_PATH_NOT_FIRSTor
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 warningPLAN_STEP_PATH_UNTICKED, under--stricttoo. - The brief-conflict mark. A
/code-reviewfinding at the MAJOR tier whose
recommended action goes against a brief Non-Goal or another stated choice
drops to MINOR, markedcontradicts_briefandbrief_lowered_from: MAJOR;
any other engine finding only gets the mark, and a BLOCKER is never lowered.
/trekreviewpasses the brief's choices to the coordinator, which writes the
mark intoreview.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_fromon 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 --diffprints what changed since the text the last round
reviewed. Both reviewers get it and mark each previous finding by id. Then
--recordcounts 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 removesCLAUDE_CODE_SESSION_IDfor 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 withnode --teststill
passes the id to a child it starts without anenv(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 asLICENSEalone 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 afterFile:, 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 afterand,plusor+, as long
as it is clearly a test (operator decision 28, 13.10, and
operator decision 31, 14.10; reviewbd2520b0). 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; review6c31212c), so a step whoseFile:
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
enginefrom 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.
/trekplantells 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/trekplanreviews the brief once more. - Approval commits carry the caller's Co-Authored-By trailer.
artifact-commit.mjstakes--trailerand 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,/trekplanand/trekexecute
pass it;/trekexecuteprints 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+,&,andororbetween 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 (review182ceb93). - A 1.9 entry keeps the paths of a line wrapped after a comma, and a
numberedFile: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; reviewsd21ff81e,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.or1), and
any list item ends it (reviewsb4fa1927,4b6460e5). - A 1.9 plan refuses placeholders and mixed-case bare names as files
(operator decision 22, 13.10; review33f37f53). 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-caseParser, isPLAN_STEP_PATH_NOT_A_PATH, and its hint
says to write./Namefor such a file.LICENSE,READMEandMakefile
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 namedtoString,
constructor,__proto__or another nameObject.prototypecarries an
engine(it gave them a function or an object), andtoReviewerPayload
refuses an engine namedtoStringwith its "engine must be one of" error
(review3799ea6c). - 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
anddedupByTripletkeep the one with the higher catalogue tier, then a
reviewer-agent finding over an engine finding, then the higher asserted
severity, then thebrief-conformance-reviewerfinding, 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 (reviewbc7f4e23;
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; reviewsab1b5d9f,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.mjsrefuses 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.
validatePlanContentreads a
step's fields once and every check,--steps-fromincluded, reads them from
there; its errors and warnings are unchanged (review93382464). - Red proof reads the step's test files from the plan and prints them, and
the executor defines them once (reviewcf241526;
operator decision 30, 14.10; reviews793fc1aa,09ae46d8,d01df508,
11ee78c5). With--planand--step,red-proof.mjsreads 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 astests(atests:line in text mode).
The helper and the executor pass no--tests, and the lock's--filesis
that printed list. A--teststhat names another set is exit 2 with a
reason that startstests-mismatchand the plan's list inplan_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.mddefines
the step's test files in one sentence the other places point to. - The
/trekbriefpass 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.mdtheline_refof 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_severitynames what the kept finding asserted (review
08deae68). When Pass 1 raises a finding to its duplicate group's
severity, Pass 3 writesoriginal_severityfrom the finding's own
severity, and only when that differs from its catalogue tier; the carrier
fieldpass1_raised_fromnever leaves the contract.- The workflow review fails closed when its coordinator returns nothing
(reviewedf2ec56). 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 inallow_blocked_byasmissing-reviewer:<name>, so the
verdict gate exits 2 on such a WARN. - K6 keeps its own normaliser and
LIST_ITEMis one literal again
(operator decision 27, 13.10; review7961a700). The two/simplifyedits
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 (review7b3b59ed; operator decision 41, 14.10). AFile:line
below 1.8 may name its test without backticks, so red proof reads no test
file from the plan and answersno test files given. The helper then runs
the same red proof again with--testsnaming 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 fromtests/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 emptyfileor aline
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 (reviews4ab24b07,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.
- What happened: an equal id or the old finding's line was enough. The new
- A
lowered_fromthat 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.mdwith 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
--teststhat matches the plan's list and prints it in
the spelling it was given, not the plan's (review2d624b54; deferred by
operator decision 42, 14.10). ingestkeeps apass1_raised_fromand anoriginal_severitythat a
payload wrote on its own finding (reviewsc06d5385,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 (review4e1607cb; deferred by
operator decision 42, 14.10). - Handover 4's
Files:bullet words its empty-entry rule as for aFile:
line (review4f22b101; deferred by operator decision 42, 14.10). - Accepted deviation: the 1.9
File:selector repeats the list-marker set of
LIST_ITEM(review4dce7c74; 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
linesent as a numeric string ("42") is read as no line and counted
at full severity. The agent templates givelineas a number (review
c257625e; deferred by operator decision 48, 16.10). npm testdoes not runtests/e2e-critic-diff-mode.sh. It runs under
## Verificationand 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 (reviewea8c1752; 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_fromsuch as"none","n/a",falseor0counts as
blocker, by design (fail-closed). A reviewer that writes one on a finding
it did not lower turns a minor into a BLOCK (review79d1dc97; deferred by
operator decision 51, 16.10). - The rule that a blank
lowered_fromis no lowering lives only in plan
dedup. A--recordinput that bypasses dedup withlowered_from: ""counts
as blocker (review2e7afd61; 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 (review4c340d4a; 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 (reviewef1633b6; 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_UNTICKEDon the mentioned path (review38a8ad34;
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) (review20b626e2;
deferred by operator decision 52, 16.10). - The opt-in workflow review's floor raises an illegally lowered or marked
reviewer finding but keeps itsbrief_lowered_fromandcontradicts_brief,
so the verdict gate still exits 2 on that review (fail-closed) (review
c614baad; deferred by operator decision 52, 16.10).
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
v6.3.1 Stable
released this
2026-10-11 16:05:57 +00:00 | 151 commits to main since this releaseRounds 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 thePLAN_STEP_TESTS_ONLYwarning and red proof'stests_only; a revert restores the 6.3.0 reading. - two-way: a trailing
# commentis 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/trekreviewreads as before; a revert reopens the two holes under Fixed. - two-way: stops and timeouts, the release check's
--review,isMainin 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
~~~jsonor opened with more text afterjsonon 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-implementerand 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.or1)) 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,rakefileandjustfileare build files. - Checks with a comment. A trailing
# commentis 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 theVerify: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
--reviewis 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--repois one file. - Every CLI uses one
isMainhelper. Before, some did nothing and exited 0
when run through a symlink or a path with a space. - Test lock. It compares
--cmdby 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-reviewfound 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 inFiles:to be backticked. It changes the plan
contract and is left for a planned release. - A source file after a described test is dropped
-
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 beforejsonis 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## Verificationbullet,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.
- A backticked bare name such as
-
The example plan's steps 1-2 keep their tests-only warning (operator
decision 2026-10-09).
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
2 downloads
- two-way: tests-only is decided by the plan's
-
v6.3.0 Stable
released this
2026-10-11 06:33:07 +00:00 | 157 commits to main since this releaseWave 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):
/trekexecutenow 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:
/trekexecuterefuses 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:
/trekexecutereviews 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-validatorrejects the runner'sexitCodeinplan_verification.failed_criteria(C15) — the executor's own prose always wroteexit_code. - two-way: skills workshop — form check, model-free routing test,
test-firstanddebuggingpreloaded intostep-implementer— new files and oneskills:line; a revert removes them. - two-way:
researching-sourcesskill, 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) andOn 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:
/trekreviewsaves the reviewer's whole answer for the findings check and namesFINDING_PROSE_LINE_OUT_OF_RANGE— command text. - two-way: the criteria runner's commands run without
NODE_TEST_CONTEXT— a false green undernode --testis 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.jsonmay now saysimplify: "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 fornode --teston Node 21 and later; no path that climbs out with..or starts at/, git included; a trailing# commentin a shell fence is dropped) with a short list of read-only options per runner — git without--outputor--no-index,node --testwith a built-in--test-reporteronly, nothing aftermake test, only paths afternpm 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 inbash tests/<script>.sh(from 6.3.0). - two-way: the phase-model resolver text says
effortcomes only from the brief's phase signal — prose only, no code change.
Added
/trekexecuteis coupled to the gates (order 6).- Plan approval (K2):
approval-log.mjs verify --kind planbefore step 1;
not-logged,mismatch,expired,brokenanddivergedhalt 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, newlib/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 turnscompletedinto
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 mostTREKEXECUTE_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.jsongains optional coupling fields (Handover 5).
- Plan approval (K2):
- Skills (orders 7a and 7b), the first three:
voyage:test-firstand
voyage:debugging, preloaded bystep-implementer, and
voyage:researching-sources, preloaded by the five web-search agents and
named by/trekresearchat spawn.lib/skills/skill-lint.mjschecks the
form;lib/skills/routing.mjsis a model-free routing test over the
skills, the 7 commands and the 21 spawnable agents (collision at 0.75 fails;
thresholds pinned). Eval casesevals/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 testat HEAD, review verdict
not BLOCK and covering HEAD, a### Doorslist. 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, orPLAN_STEP_ON_FAILURE_UNKNOWNwarns.
Minors open after the last critic round are listed for the operator, and
--extra-roundrecords the round they pick. - Tests-only steps (order 10).
PLAN_STEP_TESTS_ONLYwarns on a step
whose files are all tests;red-proof --plan/--stepreportstests_only,
and/trekexecutesends such a step to the plan instead of into fix rounds
that cannot succeed./trekplan, the plan template andplan-criticsay
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. /trekbriefStep 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 --evidenceshows the first output line on PASS rows.- The findings schema checks
path:linecitations in finding prose against
the file;/trekreviewchecks the reviewer's whole answer and names
FINDING_PROSE_LINE_OUT_OF_RANGE. git-historiannever proposes changing a file the brief froze, and names
the remote fromgit remote -v.- The criteria runner's commands run without
NODE_TEST_CONTEXT, so a test
run insidenode --testcan 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
effortcomes 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/trekexecuteare held to the step rules on any plan version and need a
Verify:(plan-validator --steps-from); a restore the guard refuses is
recorded asrevert-refusedand 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, readsscope_sha_endas 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 readsFiles: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-checkprints the progress.json status and runs
through the criteria runner itself./trekexecutesays 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'sFiles:reading;
a change already in the working tree when the step started counts against
tests-only; an unbackticked file next to a backticked path inFiles: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
--reviewfrom the current directory instead of--repo. - A trailing
# commentis 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,isMaincopied 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
3 downloads
- one-way:
-
v6.2.0 Stable
released this
2026-10-08 18:53:31 +00:00 | 188 commits to main since this releaseWave 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.mjskeeps an append-only,
hash-chained approval log in the target repo, bound to the approved
content's sha256.lib/util/artifact-commit.mjscommits it.
/trekplanPhase 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 oneEnd-to-end:step.
New optional fields:Interface in:,Interface out:,Review focus:. - An architectural plan gets a
## Designpart. - The critic loop has at most 3 rounds, and the plan records them.
lib/validators/plan-gate.mjsdecides: 0 go, 1 stop, 2 could not run.
An open MAJOR stops the plan, and after the last round the operator
decides. plan-criticnow checks 12 dimensions.- New
lib/verification/arch-rules.mjsruns the target repo's own
dependency-cruiser or import-linter. - New
lib/verification/plan-scope-sweep.mjslists changed files that no
step names.
- Plan 1.8 requires
- Step helpers and proof by command (
/trekexecute).- One fresh
step-implementerhelper 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.mjswrites the done line only when the
test command exits 0. - A closed stop list and a decision log appear in the final report.
- One fresh
- Guards (command hooks only, none runs a model).
pre-bash-executoranswers "ask" before a merge into main, a push, a
tag or publish, and destructive git.post-approval-logrecords the
answer.pre-plan-gateruns 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-checkruns 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.mjschecks each step when it ends.
- The review is a gate (
/trekreview, review 1.1).verdict: ALLOW | WARN | BLOCKis required.
lib/review/verdict-gate.mjsreads 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-reviewand/security-reviewrun as the engine.
Their findings enter throughlib/review/engine-findings.mjsunder 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 reportsPLAN_VERIFICATION_NOT_RUNNABLE,
PLAN_STEP_VERIFY_NOT_RUNNABLE,PLAN_END_TO_END_NOT_RUNNABLEand
PLAN_END_TO_END_NOT_VERIFIED: as errors under--strict, otherwise as
warnings.
Fixed
- The write guard covers
EditandNotebookEdit, not onlyWrite, and
fails closed. - The review keeps findings that are right:
- an engine finding is never set aside for Actionability;
recommended_actionis 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-reviewfinding 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.
/trekcontinueand/trekexecutecalllib/through the plugin root. - Manifest
must_containusesgrep -E -e … --, so a pattern such as
--sepis not read as an option. /trekreview,/trekresearchand/trekcontinuewrite stats through
stats-appendand report a failed write.annotateprints an absolute path.- A test lock marked green may stop while it waits for its controller.
/trekplanruns every exploration agent, and reviews the brief again only
when it has changed since/trekbriefreviewed it.
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
- Intent (
-
v6.1.1 Stable
released this
2026-10-05 16:43:28 +00:00 | 215 commits to main since this releaseA patch release.
/trekexecuteno longer loses its telemetry when the harness
does not exportCLAUDE_PLUGIN_DATA, its progress-file prose now matches its
own validator, and no agent is pinned below reasoning efforthigh.Fixed
lib/stats/event-emit.mjsfalls back to the same data directory as
stats-appendand the yardstick whenCLAUDE_PLUGIN_DATAis unset, instead
of skipping silently. Everywritten: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-declinedandgates_mode_flag_override
are known events./trekexecutePhase 8, Phase 9 and thegates_mode_flag_overriderecord 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
/trekexecuteuse the
validator's vocabulary (in_progress,completed,plan_version).
progress-validatornow accepts the run statusstoppedand the step
statusblocked, both of which the command writes. A legacypassedstep
is still treated ascompletedon resume. architecture-mapper,dependency-tracer,git-historianandtask-finder
pineffort: high(wasmedium). No agent is pinned belowhigh; the rest
follow the session.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
3 downloads
-
v6.1.0 Stable
released this
2026-10-05 10:43:29 +00:00 | 222 commits to main since this releaseThe use row in
scripts/yardstick.mjsnow 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.mjsfinds 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 isnullplus a reason, never a
guess./trekbriefstats records carryorder_id,order_claimed_atand
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.ordersNamedByARecordin 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: ordreline; no record = not measured, never a no. /trekbrief --approvenow runs Phase 7 after a successful stamp, so the
approval leaves a trekbrief record (mode: "approve").
Fixed
- The CLI main-guard in
stats-appendandyardstickcompares real paths,
so it no longer silently does nothing under a symlink or a space in the
path.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
5 downloads
-
v6.0.0 Stable
released this
2026-10-02 17:54:22 +00:00 | 239 commits to main since this releaseOperator 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)
/trekexecutemulti-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.mdare 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 aspartial; nothing dispatches it automatically. /trekplan --decompose(and its alias--export headless): the
session-decomposer writesorders.mdinstead of alaunch.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-floorreason token is gone (that case now reports
no-cited-report).- No
{session-dir}/logs/session-N.logis 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.jsonbefore its worktrees are removed. --dry-runno longer prints a billing line.
Removed
- The
ANTHROPIC_API_KEYbilling 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. TheTREKEXECUTE_MAX_TURNSand
TREKEXECUTE_MAX_BUDGET_USDenvironment variables are ignored. templates/headless-launch-template.mdand
scripts/q3-cache-prefix-experiment.mjs(a finished experiment that
started the binary; its results stay indocs/).- 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_ROOTresolution in/trekexecute(multi-session Step 0 and
plan verification),/trekreviewand/trekresearchnow 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
everytrek/{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 everyVOYAGE_ROOT
block, substituted and unsubstituted.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
5 downloads
-
v5.11.1 Stable
released this
2026-09-23 11:47:52 +00:00 | 257 commits to main since this releaseChanged
- 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
andpackage.jsondescriptions,README.md,docs/architecture.md, the
v5.0.3 entry below, and two comments inscripts/annotate.mjsand
tests/scripts/annotate.test.mjs. No behavior change.
Added
tests/lib/retired-references.test.mjsfails 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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
4 downloads
- The annotation surface's provenance is described as the pattern it follows
-
v5.11.0 Stable
released this
2026-09-23 10:33:44 +00:00 | 260 commits to main since this releaseAdded
- Intent approval gate.
/trekplan(both--briefand--project, also
--quick, no override flag) runslib/validators/intent-approval.mjs --check
before it reads the brief. It halts onBRIEF_INTENT_NOT_APPROVED,
BRIEF_INTENT_APPROVAL_STALEorBRIEF_INTENT_APPROVAL_INVALID, and an
approval check that cannot run halts too. The marker isintent_approved_hash
(sha256 over the normalized## Intent+## Goal) plusintent_approved_at.
Editing either section after approval makes it stale./trekbriefPhase 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.mjsprints 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.mjscounts 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
realclaude -pchildren 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:/trekbriefand/trekplanstats records
land in the data dir the yardstick reads whenCLAUDE_PLUGIN_DATAis 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
/trekplanuntil its intent is approved. The schema change is additive (two
optional fields, nobrief_versionbump). The requirement sits in the
consumer. Seedocs/HANDOVER-CONTRACTS.md§Handover 1. - The arg parser has a CLI.
/trekreviewruns it with$ARGUMENTSand relays
Error: --project <dir> is required.from code (it passed"$@", which the
Bash tool never has, so the parser never ran).
Fixed
/trekexecuteruns the plan's## Verificationon the single-session path
too (D-03), and/trekreviewruns the brief's success-criteria commands and
gives the reviewer the result (D-04), throughlib/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/trekresearchswarm 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/TaskUpdatefrom/trekplan's tool lists. Claude Code 2.1.233
stopped offering them on current models, and no prose called them.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
4 downloads
- Intent approval gate.