• v5.10.1 1ca48e0cd0

    v5.10.1 Stable

    ktg released this 2026-09-03 18:29:53 +00:00 | 311 commits to main since this release

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

    Removed

    • gemini-bridge is dropped from the pipeline (operator directive). The
      agent file is deleted and every live surface that could still steer a run
      toward it is cleared: commands/trekresearch.md (the Bridge-agent launch
      block, the --local help text, the high-effort always-on pair, the stats
      record, the graceful-degradation list), commands/trekplan.md,
      commands/trekbrief.md, agents/research-orchestrator.md (mode table,
      agent table, prompting block, summary line), README.md (feature prose, mode
      table, agent prose, the mermaid EXTERNAL node, the * = conditional legend,
      the optional-MCP requirement, the --local section), CLAUDE.md,
      settings.json (the whole trekresearch.geminiBridge block),
      templates/research-brief-template.md (the Gemini Second Opinion section
      and the sources-table gemini type), templates/trekbrief-template.md,
      docs/architecture.md, docs/command-modes.md.
    • /trekplan high-effort Adversarial Pass 2 degrades explicitly. It now
      emits a ## Adversarial Pass 2 (v5.1.1 high-effort) section whose status
      reads "unavailable, skipped", rather than failing or vanishing: a
      high-effort plan carrying no Pass 2 marker is indistinguishable from one whose
      Pass 2 crashed. /trekresearch high effort forces only contrarian-researcher
      always-on, which remains the complete adversarial coverage.
    • Not removed: gemini_used survives as a vestigial /trekresearch stats
      field pinned to false. Dropping it would break the observability export
      schema for existing consumers, and no consumer asked for that.
    • Agent inventory: 24 → 23 files (20 spawnable + 3 orchestrator reference
      docs; synthesis-agent still dormant). Counts reconciled in README.md and
      CLAUDE.md; the <example>-block floor in
      tests/lib/agent-frontmatter.test.mjs moves 34 → 32 because an agent
      legitimately left the inventory — not because examples went missing from a
      surviving one.
    • Pinned by 5 new tests in tests/lib/doc-consistency.test.mjs, including a
      known-positive control asserting the historical records still do carry
      gemini references — so the empty result on live surfaces is a measurement and
      not a broken query. CHANGELOG entries and measurement/decision docs keep their
      references deliberately: they record what a past version did.

    Fixed

    • /trekreview verdicts are fail-closed. A finding removed by Pass 2 or
      Pass 3, and a reviewer whose payload was thrown away or never arrived, were
      arithmetically identical to a finding that never existed — all three pushed
      the verdict toward ALLOW. Measured before the fix: a BLOCKER with a
      101-character title → ALLOW; a payload carrying one ad-hoc rule_key was
      skipped whole at ingest, taking a valid BLOCKER sibling with it → ALLOW.
      lib/review/coordinator-contract.mjs now splits every removal two ways —
      dropped when the test refuted the finding as a claim about this codebase,
      unverified otherwise — and a non-empty unverified bucket, or a reviewer
      in expectedReviewers that did not report, forbids ALLOW (verdict WARN,
      with allow_blocked_by naming why). The rule never raises a verdict: the
      severity catalogue and the BLOCKER/MAJOR thresholds are untouched. New
      exports: classifySuppression, REFUTING_REASONS, UNVERIFIED_REASONS;
      runContract gains unverified, missing_reviewers,
      unattributable_payloads and allow_blocked_by (suppressed stays the
      union, so existing consumers keep their meaning). A payload that fails schema
      without carrying a reviewer name is counted as unattributable rather than
      reported as a reviewer called "unnamed reviewer" — naming one would invent an
      agent nobody launched and double-count with expectedReviewers.
      Mirrored in agents/review-coordinator.md (Pass 2/3 fate columns, the new
      §Suppression is two-valued, Pass 4 threshold table) and
      commands/trekreview.md (Phase 5 reviewer accounting → STOP; Phase 6).
      Driven test-first: 11 new tests in tests/lib/coordinator-contract.test.mjs,
      incl. a known-positive control proving ALLOW is still reachable.

    Docs

    • T1 §6 PoC status corrected — it was already run and declined.
      docs/T1-cc26-delegated-orchestration.md §8 item 3 still claimed both the §6
      synthesis-agent PoC and the §5 full bake-off were "designed but unbuilt". That
      was written in S7 and falsified the same afternoon by S12, which ran the §6
      PoC and recorded Δ main-context (faithful flow) = 0.0%, NEGATIVE
      (docs/T1-synthesis-poc-results.md; reproduce with
      node scripts/synthesis-measure.mjs). The stale wording caused the settled
      PoC to be re-ordered as new work on 2026-09-02, so it is struck rather than
      deleted and §6 gained an explicit RUN AND DECLINED status block. The
      finding is structural, not stochastic: /trekplan Phase 5 spawns the
      exploration swarm foreground (commands/trekplan.md:158,338-341), so the
      6–10 outputs are already resident in main before Phase 7 begins — delegating
      only the Phase-7 digest returns on top of them and evicts nothing. A saving
      needs the Phase-5 delivery moved off-main, which is §5.

    • §5's environment premise updated (measured 2026-09-03, CC 2.1.259). S12
      recorded the live bake-off as blocked for want of an ANTHROPIC_API_KEY;
      claude -p --output-format stream-json in fact runs on subscription auth with
      no API key and now emits a subagent_stats block (spawned / max_depth /
      refused) that did not exist in June — a ready-made classifier-interference
      counter for §5's feasibility guard. S12's other blocker (the installed plugin
      is the cache copy, so a repo-local agent is invisible to claude -p) stands
      unmeasured. This changes nothing about the §6 verdict; it lowers the cost of §5.

    • /trekresearch --engine deep-research: document the real version window.
      Claude Code 2.1.218 changed /deep-research to start only when the operator
      invokes it; from there the Skill tool refuses a model invocation outright with
      disable-model-invocation (measured in a real --engine deep-research run on
      2026-09-01 — the SC3 fallback to swarm held). The engine was built against
      2.1.196 and the prose still promised a path Claude Code has removed
      ("requires Claude Code 2.1.154+"). commands/trekresearch.md (flag bullet +
      pre-gate + fallback reason tokens), docs/command-modes.md and README.md now
      state the closed window 2.1.154 <= CC < 2.1.218 and name
      disable-model-invocation as the expected fallback reason on any current CC.
      The pre-gate gained an upper ceiling (still a numeric comparison, not a string
      one). The flag is kept as an additive opt-in that never hard-fails; no
      lib/ change, no adapter-contract change, no default change, no version bump.
      Pinned by tests/lib/doc-consistency.test.mjs.

    Downloads
  • v5.10.0 692a4a526c

    v5.10.0 Stable

    ktg released this 2026-08-18 14:49:21 +00:00 | 322 commits to main since this release

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

    v5.10.0 — 2026-08-18 — STORM bounded research loop (default-off) + the Agent-tool name spawn defect

    Additive. Every new research mechanism ships inert: VOYAGE_STORM_ENABLED is
    unset by default, and with it unset both new /trekresearch phases are no-ops.
    The one change that affects consumers regardless of flags is the spawn rule under
    Fixed — it changes how any repo should call the Agent tool.

    STORM bounded loop — shipped, default-off, behind a pre-registered adoption gate

    • /trekresearch Phase 4.5 (dimension discovery, under the existing
      maxDimensions: 8 ceiling) and Phase 5 (bounded multi-turn follow-up,
      replacing the single follow-up pass) run only at effort: high and only
      when VOYAGE_STORM_ENABLED=1. Unset, Phase 5 is inert because
      lib/util/research-loop-cap.mjs grants a budget of 0, and Phase 4.5 is inert
      because its skip-guard reads the flag directly (it never calls the cap) — two
      independent off-switches, so a bug in one does not silently activate the other.
    • TREKRESEARCH_MAX_CONV_TURNS (default 3; invalid values fall back to 3)
      sets turns per dimension. The total budget is that value × maxDimensions.
    • New lib/util/research-loop-cap.mjs: an append-only ledger the cap counts its
      own turns from. Each turn slot is claimed with O_EXCL, so the bound survives
      concurrent turns; an unreadable ledger fails closed in both modules; and
      the enforcement boundary is a denial tombstone rather than the turn count, so
      a crash mid-turn cannot hand back a free turn.
    • New hooks/scripts/pre-agent-cap.mjs, registered as a PreToolUse hook on
      WebSearch|WebFetch|Task: the budget is enforced by the harness, not by prose
      in a command file. VOYAGE_DISABLE_CAP_HOOK=1 switches it off.
      docs/spike-pretooluse-subagent-reach.md records the measured reach of
      PreToolUse into sub-agent tool calls — including where the gap is.
    • Five measurement fields (unique_sources, dimensions_baseline, conv_turns,
      empty_turns, dimensions_baseline_preserved) are emitted to
      trekresearch-stats.jsonl and allowlisted in lib/exporters/field-allowlist.mjs.
      All five are counters or booleans — none carry prose or paths.
    • scripts/storm-measure.mjs + docs/storm-measurement.md: the adoption gate,
      with thresholds registered before the first measurement by design.
      ≥ 30 % improvement on either metric → adopt; < 15 % → decline; an empty arm is
      insufficient-data, not a decline. Decline is a no-op — the mechanism simply
      stays default-off; adopt is one constant. No measurement has been run yet.

    Added — outbound query privacy gate

    • lib/validators/query-privacy-gate.mjs inspects a research query before it
      leaves the machine, in the same two-tier shape as the existing SSRF gate: a
      WARN tier (absolute filesystem paths, repo-internal identifiers) that
      --soft / VOYAGE_QUERY_PRIVACY_ALLOW=1 can override, and a HARD-BLOCK tier
      (secret-shaped tokens) that nothing overrides. Called only from the two new
      high-effort steps; the existing single-pass path is unchanged.

    Fixed — the Agent tool's name parameter silently breaks a subagent's return channel

    • Consumers of this pipeline should read docs/agent-return-channel-defect.md.
      Passing name to the Agent tool does not label a subagent — it changes what is
      spawned: taskKind: "in_process_teammate" / spawnDepth: 0 instead of a real
      subagent (spawnDepth: 1). A teammate's final text is not a return value; it
      reaches the parent only if the teammate itself calls SendMessage(to: "main").
      Voyage's reviewer agents carry tools: [Read, Glob, Grep] — no SendMessage —
      so when named they are structurally unable to answer. No error, no warning.
      Measured numerators (66-line target): named without explicit SendMessage
      0/5 returned · named + explicit SendMessage 1/1 · unnamed 3/3 ·
      work actually performed while named 5/5 — only delivery fails, and the
      output is recoverable from
      ~/.claude/projects/<project>/<session>/subagents/agent-*.jsonl.
      Independently confirmed at 3730 lines / 277 KB by akashic-intelligence
      (4/4 correct final text on disk); the returning arm above 66 lines remains
      inferred rather than observed, and the doc says so.
    • The four spawning commands (trekbrief, trekplan, trekresearch,
      trekreview) now state the rule at their spawn sites and name the mechanism.
      trekexecute spawns nothing and is excluded. The doc-consistency test
      derives the spawning set from the command files, so the pin cannot go
      vacuous when a command starts or stops spawning.

    Fixed — hook and validator hardening

    • The destructive-command rule anchored on command position rather than any
      substring (a path containing a blocked word no longer trips it), and the
      bypasses that anchoring itself opened are closed.
    • The secret-detection validator hard-blocks token formats the run-length
      patterns missed.
    • The exporter allowlist covers /trekresearch's engine field, with the JSONL
      schema fixture pinned to agree — a new stats field is otherwise dropped
      silently at export.

    Docs

    • README: first screen aligned with the org repo standard, complete AI
      disclosure, and the Gemini MCP tool contract described inline instead of via a
      dead cookbook link. Governance keeps one canonical file, not a local copy.
    • /trekresearch: STORM mechanisms documented across four surfaces; the
      Independence crossing's two risks split, each naming its own control.
    • docs/*.pdf is gitignored — origin is a public mirror and must never carry
      operator PDFs.

    Tests

    • Suite baseline 832 (830 pass / 0 fail / 2 skip) → 1013 (1011 / 0 / 2).
      New coverage: research-loop-cap (including the concurrency and fail-closed
      paths), the cap hook's crash-time marker branches, the query privacy gate, the
      measurement harness's decision rule, and the spawn-rule doc pin.
    Downloads
  • v5.9.1 8d39e1d4a5

    v5.9.1 Stable

    ktg released this 2026-07-02 23:11:25 +00:00 | 361 commits to main since this release

    Patch, no functional additions.

    Fixed

    • /trekendsession was unusable in every invocation: two of its three !`...` eager-exec blocks (Phase 3 atomic-write, Phase 4 validator call) contained unresolved runtime placeholders (<project-dir> etc.). The harness executes eager-exec blocks at command LOAD time, so zsh parsed <project-dir> as input redirection and the command aborted before the model saw a single instruction. Both blocks are now plain runtime Bash fences with the {curly} placeholder convention (shell-inert), matching trekplan.md/trekresearch.md. The Phase 1 discovery block (self-contained) keeps its legitimate eager-exec prefix; trekcontinue.md's discovery block was runtime-verified unaffected.
    • Latent secondary bug in the same blocks: cwd-relative plugin paths (lib/validators/..., ./lib/util/atomic-write.mjs) would have failed with ERR_MODULE_NOT_FOUND even after substitution, since the Bash cwd is the user's repo. Both now use absolute ${CLAUDE_PLUGIN_ROOT} paths per the existing command convention (Node ESM accepts absolute-path import specifiers — verified on Node 18+).

    Added

    • Regression guard tests/commands/trekendsession.test.mjs: scans every !`-block in commands/*.md for unresolved <angle>/{curly} placeholders (this bug class is silent until first invocation), plus structure tests pinning Phase 3/4 as runtime Bash with ${CLAUDE_PLUGIN_ROOT} paths and exactly one surviving eager block. Suite baseline 828 → 832 (830 pass / 0 fail / 2 skip).
    Downloads