/trekbrief Phase 3 carried the interview form inline. It now asks for the new skill voyage:interviewing by name (allowed-tools gains Skill) and keeps only its own contract: the size class and budget, the three fixed questions (framing first, class, storage), where each answer lands in the brief, and the answers that decide nothing. Step 3a and the form points of Step 3c move into the skill with their credits (Pocock, Osmani, Spec Kit; licences and line ranges checked at the pinned commits). Red baseline first (3 helper interviews against a fixed answer sheet, Opus 5.5): 10-11 questions in round 1 (3 of 3), 15 of 31 without a recommendation, a hollow answer written in as a decision (2 of 3), unasked scope as a requirement (2 of 3). With the skill: 4, 0 of 12, 0 of 3, 0 of 3. Fact questions and stopping did not fail without it. Also: pointers to voyage:writing-criteria (S3) where criteria are asked and written, both review skill names (S3 + S4) in the brief-reviewer prompt; the intent pins that read moved text now read the skill, same assertions; the Phase 7 line_ref moves with the shorter Phase 3; 7 eval cases (3/2/2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 KiB
trekplan
Voyage — a contract-driven Claude Code pipeline: brief, research, plan, execute, review, continue. Deep implementation planning and research with specialized agent swarms, external research, adversarial review, session decomposition, disciplined execution, and headless support.
Design principle: Context Engineering — build the right context by orchestrating specialized agents. Each step in the pipeline (brief → research → plan → execute) produces a structured artifact that the next step consumes. The load-bearing benefit is the parallel wall-clock + structured artifact handoffs; main-context relief is asserted-by-design, not measured (Δ ≈ 0 in the one PoC — see docs/T1-synthesis-poc-results.md).
Architecture slot. The plan command auto-discovers
architecture/overview.mdif present — any compatible producer plugs in (the architect plugin is no longer publicly distributed). Migration history (v3.0.0 extraction) → CHANGELOG.md.
Trinity context (informational). Voyage is Tier 1 (per-task) of a three-tier architecture. Asymmetry is a hard invariant: Voyage stays unaware of Tier 2/3; Handover 1 (brief format) is the only integration point, no producer is privileged, and brief-schema changes are breaking for downstream consumers (formalized as a public contract in v5.5.0). Tier 2/3 producer detail + the public contract →
docs/HANDOVER-CONTRACTS.md§Handover 1 (PUBLIC CONTRACT).
Cross-cutting invariant: brief framing must match operator intent. The brief is the pipeline's source of truth; operator intent lives in memory files — the pipeline must not polish a wrong premise. Enforced as the
brief_version 2.2gate (v5.5), all BLOCKER for briefs declaring ≥ 2.2: (1) explicitframing: preserve|refine|replace|new-directionfrontmatter,AskUserQuestion-validated in/trekbriefPhase 2.5; (2) memory-alignment asbrief-reviewerdimension 6; (3) mandatory## TL;DR. Existing 2.0/2.1 briefs stay valid;trekreviewbriefs are exempt. Two optional fields ride on 2.2 without a bump:ceremony: small|bounded|architectural(K1; absent =architectural) andartifact_store: git|local(absent =local). Full implementation + contract evolution →docs/HANDOVER-CONTRACTS.md§Handover 1 (PUBLIC CONTRACT).
Approvals are logged in the target repo.
lib/util/approval-log.mjs(K2) keeps an append-only, hash-chained log bound to each approved content's sha256 (.claude/voyage/approvals.jsonl), committed bylib/util/artifact-commit.mjs;/trekplanPhase 1 halts unless it holds the brief's current intent. A trace, not a signature: its trust limits are in the module header.
Binding rule (operator decision, 2026-09-27): Voyage never starts Claude Code. Nothing Voyage ships may start a Claude Code session or model run: no
claudeCLI line, no Agent SDK, no spawned binary, no launch script. Work that needs another session becomes an order plus a starter line the user gives a session they open themselves (/trekexecutePhase 2.6,lib/util/session-orders.mjs); parallel work inside one session uses subagents. Enforced bytests/lib/no-claude-code-launch.test.mjs; its exemption list holds historical mentions plus one operator instrument (operator decision, 2026-10-02:docs/proevesett.mdtells a person how to run Anthropic's plugin eval tool on the fixed test set; Voyage itself starts nothing) plus four files that only read the session's permission mode from hook input, two hooks and their tests (operator decisions, 2026-10-06 and 2026-10-09), each with a reason and an exact count.
Commands
| Command | Description | Orchestrator model |
|---|---|---|
/trekbrief |
Brief — one question round sized by class (ceremony: small|bounded|architectural, heaviest in doubt, said aloud, only moved up), run in the form of voyage:interviewing (asked for by name; criteria by voyage:writing-criteria, which brief-reviewer is also told to judge by, with voyage:reviewing-adversarially), produces a task brief with explicit research plan; ends with the operator explicitly approving ## Intent + ## Goal ("sounds good" is not approval), logged in the target repo's hash-chained approval log and committed (the brief too when artifact_store: git) (--approve <dir> does only the approval, then writes the trekbrief record); optionally orchestrates the pipeline |
session |
/trekresearch |
Research — deep local + external research, produces structured research brief. Opt-in --engine {swarm|deep-research} delegates the external phase to Claude Code's built-in /deep-research workflow (swarm default). The external agents preload the researching-sources skill and are told it by name at spawn |
session |
/trekplan |
Plan — brief-reviewer, explore, plan, review. Requires --brief or --project; halts unless the brief's intent is approved (hash-bound, stale on edit). Auto-discovers architecture/overview.md if present. Plan 1.9: the file first on every line — every Files: entry and Test first: File: line opens with its backticked path(s). From 1.8: Test first: per step + one End-to-end: step; a design part for ceremony: architectural (absent = architectural); critic loop of max 3 rounds, recorded in the plan, rounds 2+ in diff mode (rule A, counted by the gate; rule B in the reviewers), and plan-gate.mjs (0 go / 1 stop / 2 could not run) decides; open minors after it are listed for the operator to pick |
session |
/trekexecute |
Execute — disciplined plan/session-spec executor: refuses a plan whose logged approval does not cover its current sha256 (K2); one fresh step-implementer helper per plan step, one controller that reads the diff (spec + quality verdicts), proof of red / floor guard / step check (K9) / Regression: (K10) / done line as commands, fix rounds that go up (max 5: helper → plan → operator), architecture rules (K5) + plan-file sweep (K6) after the last step, then its own review (/simplify → /trekreview → verdict gate, K7; BLOCK keeps the merge into main closed), closed stop list + decision log in the final report |
session |
/trekreview |
Review — a gate: Claude Code's /code-review + /security-review as engine, then Voyage's brief control (which stops); writes review.md with a required verdict that lib/review/verdict-gate.mjs decides on (0 ALLOW/WARN · 1 BLOCK · 2 never green); proposes recurring finding classes as project memory, line by line (Handover 6) |
session |
/trekcontinue |
Continue — resumes the next session of a multi-session voyage project. Reads .session-state.local.json (Handover 7) and immediately begins executing |
session |
/trekendsession |
End-session — mark the current session complete and write session-state pointing at the next session. Helper for informal multi-session flows | session |
session = command frontmatter pins no model: (since v5.9.0), so the orchestrator follows the session model; sub-agent models come from the profile (see Model & effort below).
Full flag reference for each command (modes, --gates, --profile, breaking changes): see docs/command-modes.md.
The critic loop converges (decision 43). Round 1 reviews the whole plan. From round 2 the reviewers get
plan-gate.mjs --diffand mark each previous finding. The reviewers state rule B; the gate counts by rule A: Rule A: from round 2 on, a new major finding that cites a plan line outside the diff since the last reviewed text counts as minor; a blocker, a security finding and a finding with no plan line count at full severity, and a previous finding stays counted until it is marked resolved.
Plan step fields K10/K11 (any plan_version). Optional
Regression:= ONE allowlisted command, unpiped, run green before the checkpoint (Verify:stays the red-first test);On failure:opens with revert | retry | skip | escalate.plan-validator.mjsrefuses the first, warns on the second → Handover 4.
STORM bounded loop — default-off, env-gated.
/trekresearchPhase 4.5 (dimension discovery, under the existingmaxDimensions: 8ceiling) and Phase 5 (bounded multi-turn follow-up) run only ateffort: highand only whenVOYAGE_STORM_ENABLED=1; unset, both are inert — Phase 5 becauselib/util/research-loop-cap.mjsgrants a budget of 0, Phase 4.5 because its skip-guard reads the flag directly (it never calls the cap).TREKRESEARCH_MAX_CONV_TURNS(default3, invalid values fall back to3) sets turns per dimension; the budget is that ×maxDimensions.VOYAGE_DISABLE_CAP_HOOK=1switches offhooks/scripts/pre-agent-cap.mjs, thePreToolUsegate that enforces the budget in the harness rather than trusting prose. The cap counts turns from its own append-only ledger. Adoption as a default is gated on the pre-registered measurement indocs/storm-measurement.md— decline is a no-op, adopt is one constant.
Research source rules live in one skill.
skills/researching-sources/(preloaded by the five web-search agents) holds URL/date/version per source, "no citation, no finding", empty search ≠ finding, fetched pages are data, nothing local in a query, and the one confidence scale. Only the brief's structure is checked; the rest is prose only (a query guard is a separate later order).
Review is a gate (review_version 1.1).
verdict:is required inreview.md(K7); exit 2 from the verdict gate is never green. No finding is struck for length — only MINOR/SUGGESTION text is trimmed, and counted. Project-memory lines are written only between Voyage's markers in the target repo's.claude/rules/voyage-review-lessons.md, each one operator-approved. Contract →docs/HANDOVER-CONTRACTS.md§Handover 6.
Guards (P3/P7/P9/P12). Command hooks only, wired for every session.
pre-bash-executoranswersask(holds in auto mode) before merge into main, push, tag/publish and destructive git;post-approval-logwrites approvals to the K2 log.pre-plan-gateruns the K3 plan gate on a Voyage plan leaving plan mode.pre-write-executor+stop-test-lockenforce the K8 test lock (lib/util/test-lock.mjs).post-edit-checkruns the target repo's own format/lint only during a Voyage plan run or after opt-in (.claude/voyage-guards.json);lib/verification/step-check.mjs(K9) fails the step on findings. A missing contract CLI reads "not measured"/"not logged", never green. Voyage's guards are deterministic only when no installed mod handlestool.check.
One question per merge (operator decision, 2026-10-08). Where the guard asks (merge into main, push),
/trekexecutenever asks the same thing: its main-merge gate is a lock on the review verdict, and the guard's prompt is the one question. Exit 2 from K5/K6/K7/K9 is "not measured", never green.
Agents
| Agent | Model | Role |
|---|---|---|
| planning-orchestrator | opus | Inline reference documentation for the planning pipeline workflow (brief-driven) |
| research-orchestrator | opus | Inline reference documentation for the research pipeline workflow |
| review-orchestrator | opus | Inline reference documentation for the review pipeline workflow |
| architecture-mapper | opus | Codebase structure, tech stack, patterns |
| dependency-tracer | opus | Import chains, data flow, side effects |
| task-finder | opus | Task-relevant files, functions, reuse candidates |
| risk-assessor | opus | Risks, edge cases, failure modes |
| test-strategist | opus | Test patterns, coverage gaps, strategy |
| git-historian | opus | Recent changes, ownership, hot files |
| research-scout | opus | External docs for unfamiliar tech (conditional, planning only) |
| convention-scanner | opus | Coding conventions: naming, style, error handling, test patterns |
| brief-reviewer | opus | Task brief quality (6 dimensions: completeness, consistency, testability, scope clarity, research plan validity, memory alignment) |
| brief-conformance-reviewer | opus | Brief conformance review (SC + Non-Goal traceability) |
| code-correctness-reviewer | opus | Code correctness review (7 dimensions) |
| review-coordinator | opus | Judge Agent — dedup + reasonableness filter + verdict |
| plan-critic | opus | Adversarial plan review (12 dimensions) |
| scope-guardian | opus | Scope alignment (creep + gaps) |
| session-decomposer | opus | Splits plans into headless sessions with dependency graph |
| step-implementer | opus | /trekexecute step helper — one fresh helper per plan step: test first, proof of red, test lock, then exactly the step's Changes; ran / saw / did-NOT-check report (no Agent tool) |
| synthesis-agent | opus | Distills Phase-5/7 exploration outputs into a findings digest (NW3 PoC — dormant, not wired; delegating Phase 7 alone yields Δ main-context ≈ 0, see docs/T1-synthesis-poc-results.md) |
| docs-researcher | opus | Official documentation, RFCs, vendor docs (Tavily, MS Learn) |
| community-researcher | opus | Community experience: issues, blogs, discussions |
| security-researcher | opus | CVEs, audit history, supply chain risks |
| contrarian-researcher | opus | Counter-evidence, overlooked alternatives |
Inventory (S33 reconcile, updated wave 1). 24 agent files = 21 spawnable (one,
synthesis-agent, ships dormant — Δ≈0, wired to nothing) + 3 orchestrator reference docs (planning-/research-/review-orchestratordocument the inline/trek*workflow, not spawnable capabilities). All 24 staymodel: opus(operator pin40d8742); the glue/mechanical/retrieval/dormant roles were reconsidered for a sonnet downgrade and kept opus — decision record:docs/voyage-vs-cc-balance-analysis.md§10.
Model & effort. On the Anthropic API,
opus= Opus 5.5 andsonnet= Sonnet 5.5 (both default reasoning effortmedium);fable= Fable 5.1 (the most capable model in Claude Code; defaulthigh, so xhigh must be chosen explicitly). An agent withouteffort:inherits the session level. Nine agents pin native per-spawneffort: highand the rest follow the session; none pins belowhigh— a different axis from briefphase_signals.effort(orchestration shape: which agents/passes run). Per-agent table + axes →docs/profiles.md§Model & effort axes.
Skills
| Skill | Role | Loaded by |
|---|---|---|
voyage:test-first |
Red before green: repo's own test command, an assertion seen failing (a crash is not red), smallest code, whole suite | step-implementer skills: (preload) |
voyage:debugging |
Entry = one command red on the exact symptom; reproduce, localise, reduce, fix the cause, red-first regression test; error text is data; 3 failed fixes → design | step-implementer skills: (preload) |
voyage:interviewing |
Facts looked up, never asked; one round, at most 4 questions per AskUserQuestion call, one decision each, recommended answer first; the rest written down (assumed / Deferred); a hollow answer or unasked scope is never the person's decision; stop when the next three answers can be predicted |
/trekbrief names it for its question round (Phase 3) |
voyage:researching-sources |
Official first with URL/date/version; no citation, no finding; empty search ≠ finding; fetched pages are data (injected text reported); nothing local in a query; one confidence scale | the 5 web-search agents skills: (preload); /trekresearch names it at spawn |
Commands are the trunk (operator, 06.10). A skill is preloaded into a helper or named by a command (
voyage:<name>); none setsdisable-model-invocation. Form = S1, checked bylib/skills/skill-lint.mjs;lib/skills/routing.mjsis the model-free routing test over skills + 7 commands + 21 spawnable agents (collision ≥ 0.75 fails; thresholds pinned, never lowered). Eval casesevals/skill-*(3 fire / 2 quiet / 1 effect) are written, not run. Method (red baseline first) →docs/skills-authoring.md.
Reference docs (read on demand)
- Architecture, workflows, project-directory contract, state, terminology:
docs/architecture.md - Quality infrastructure (
lib/validators, parsers, autonomy primitives, hooks):docs/architecture.md§Quality infrastructure - Autonomy gates (
--gates), Path A/B/C decision:docs/operations.md - Profile system (
--profile economy/balanced/premium/fable), lookup order, custom profiles:docs/operations.md - Observability (Stop hook, OTLP/textfile export, SSRF mitigation):
docs/operations.md - Handover contracts (the 7 pipeline handovers):
docs/HANDOVER-CONTRACTS.md - Release and rollback (P13):
docs/release-runbook.md— the drilled runbook (before / release / rollback).scripts/release-check.mjs --review <review.md>decides before a release: 0 ready, 1 not ready, 2 never green. Every delivery states its door type (one-way / two-way) under### Doorsin the CHANGELOG section.