release(v5.10.1): drop gemini-bridge from the pipeline; correct the T1 §6 PoC status
gemini-bridge is dropped by operator directive (three repetitions). The drop is permanent, not a wait-for-SDK-upgrade state, so the change clears every LIVE surface that could still steer a run toward the agent and leaves the historical record alone. Live surfaces cleared: agents/gemini-bridge.md deleted; trekresearch (bridge launch block, --local help, high-effort always-on pair, stats record, degradation list), trekplan, trekbrief, research-orchestrator (mode table, agent table, prompting block, summary line), README (feature prose, mode table, agent prose, mermaid EXTERNAL node, conditional legend, optional-MCP requirement, --local section), CLAUDE.md, settings.json (the whole trekresearch.geminiBridge block), both templates, architecture.md, command-modes.md. trekplan high-effort Adversarial Pass 2 now degrades EXPLICITLY: it emits its section with status "unavailable, skipped" instead of failing or vanishing. A high-effort plan carrying no Pass 2 marker is indistinguishable from one whose Pass 2 crashed, which is the failure mode this wording exists to prevent. gemini_used is deliberately KEPT as a vestigial trekresearch stats field pinned to false. Removing it would break the observability export schema for existing consumers, and the directive was about the agent, not the field. Not touched: CHANGELOG history and the measurement/decision docs keep their gemini references. They record what a past version did or what was measured then; rewriting them is the same defect class as bumping a version string inside a measurement doc. Driven test-first. Five new pins in tests/lib/doc-consistency.test.mjs, verified RED before the edits, 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 (Verifiseringsloven ansikt 4). Agent inventory 24 -> 23 (20 spawnable + 3 orchestrator reference docs); the <example>-block floor moves 34 -> 32 because an agent legitimately left the inventory, not because examples went missing from a surviving one. Docs: docs/T1-cc26-delegated-orchestration.md §8 item 3 claimed both the §6 synthesis-agent PoC and the §5 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. The stale wording is what 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 a RUN AND DECLINED status block. The finding is structural, not stochastic: Phase 5 spawns the exploration swarm foreground (trekplan.md:158,338-341), so the outputs are already resident in main before Phase 7 — delegating only the Phase-7 digest evicts nothing. Also measured 2026-09-03 (CC 2.1.259): claude -p --output-format stream-json runs on subscription auth with no ANTHROPIC_API_KEY and now emits a subagent_stats block, so S12's environment-block premise is half stale. Recorded in §8 item 4. It lowers the cost of §5; it changes nothing about §6. Suite 1041 (1039/0/2), up from 1036 by exactly the five tests added. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
20cdc22803
commit
1ca48e0cd0
19 changed files with 261 additions and 249 deletions
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "voyage",
|
||||
"description": "Voyage — brief, research, plan, execute, review, continue. Contract-driven Claude Code pipeline. /trekbrief, /trekplan, and /trekreview each end by building a self-contained operator-annotation HTML (scripts/annotate.mjs, modelled on claude-code-100x): select text or click any element, pick intent (Fiks/Endre/Spørsmål), write comment, copy structured prompt, paste back, Claude revises the .md.",
|
||||
"version": "5.10.0",
|
||||
"version": "5.10.1",
|
||||
"author": {
|
||||
"name": "Kjell Tore Guttormsen"
|
||||
},
|
||||
|
|
|
|||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -48,3 +48,6 @@ NEXT-SESSION-PROMPT*.local.md
|
|||
# broad `git add -A docs`, which needed a history rewrite to undo. Ignoring the
|
||||
# type is cheaper than remembering not to stage it.
|
||||
docs/*.pdf
|
||||
# Page renders of those same documents (SLDC-AI-1_1.png etc). Narrow on purpose:
|
||||
# legitimate plugin assets may still be .png under docs/.
|
||||
docs/SLDC-AI*.png
|
||||
|
|
|
|||
61
CHANGELOG.md
61
CHANGELOG.md
|
|
@ -4,7 +4,43 @@ All notable changes to this project will be documented in this file.
|
|||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
|
||||
## Unreleased
|
||||
## v5.10.1 — 2026-09-03 — gemini-bridge dropped; fail-closed review verdicts
|
||||
|
||||
### 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
|
||||
|
||||
|
|
@ -35,6 +71,29 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|||
|
||||
### 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
|
||||
|
|
|
|||
|
|
@ -65,9 +65,8 @@ Full flag reference for each command (modes, `--gates`, `--profile`, breaking ch
|
|||
| community-researcher | opus | Community experience: issues, blogs, discussions |
|
||||
| security-researcher | opus | CVEs, audit history, supply chain risks |
|
||||
| contrarian-researcher | opus | Counter-evidence, overlooked alternatives |
|
||||
| gemini-bridge | opus | Gemini Deep Research second opinion (conditional) |
|
||||
|
||||
> **Inventory (S33 reconcile).** 24 agent files = **21 spawnable** (one, `synthesis-agent`, ships **dormant** — Δ≈0, wired to nothing) **+ 3 orchestrator reference docs** (`planning-/research-/review-orchestrator` document the inline `/trek*` workflow, not spawnable capabilities). All 24 stay `model: opus` (operator pin `40d8742`); 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.
|
||||
> **Inventory (S33 reconcile, updated v5.10.1).** 23 agent files = **20 spawnable** (one, `synthesis-agent`, ships **dormant** — Δ≈0, wired to nothing) **+ 3 orchestrator reference docs** (`planning-/research-/review-orchestrator` document the inline `/trek*` workflow, not spawnable capabilities). All 23 stay `model: opus` (operator pin `40d8742`); 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.** `opus` = Opus 4.8 (default reasoning effort `high`); `sonnet` = Sonnet 4.6; `fable` = Fable 5 (Mythos-class, above Opus — reasoning effort inherits from the session; xhigh requires a session-level setting). Select agents carry native per-spawn `effort:` (retrieval → `medium`, adversarial-reasoning → `high`) — a different axis from brief `phase_signals.effort` (orchestration shape: which agents/passes run). Per-agent table + axes → `docs/profiles.md` §Model & effort axes.
|
||||
|
||||
|
|
|
|||
23
README.md
23
README.md
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Contract-driven Claude Code pipeline: brief, research, plan, execute, review. Agent swarms, research triangulation, adversarial review, multi-session resumption.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
|
@ -195,7 +195,7 @@ If you say "stop" or "enough" during Phase 4, the current review findings are su
|
|||
|
||||
Deep, multi-phase research that combines local codebase analysis with external knowledge. Uses specialized agent swarms to investigate multiple dimensions in parallel, then triangulates findings.
|
||||
|
||||
A parallel swarm of up to 5 local + 4 external agents investigates 3–8 research dimensions, with optional Gemini Deep Research as an independent second opinion. Findings are triangulated (local vs. external, confidence per dimension, contradictions flagged) and synthesized into a structured research brief.
|
||||
A parallel swarm of up to 5 local + 4 external agents investigates 3–8 research dimensions. Findings are triangulated (local vs. external, confidence per dimension, contradictions flagged) and synthesized into a structured research brief.
|
||||
|
||||
Output:
|
||||
- With `--project <dir>`: `{dir}/research/{NN}-{slug}.md` (auto-incremented index)
|
||||
|
|
@ -205,10 +205,10 @@ Output:
|
|||
|
||||
| Mode | Usage | Behavior |
|
||||
|------|-------|----------|
|
||||
| **Default** | `/trekresearch <question>` | Interview + research swarm (local + external + Gemini), foreground |
|
||||
| **Default** | `/trekresearch <question>` | Interview + research swarm (local + external), foreground |
|
||||
| **Project** | `/trekresearch --project <dir> <question>` | Write brief into `{dir}/research/NN-slug.md` |
|
||||
| **Quick** | `/trekresearch --quick <question>` | Interview (short) + inline research, no agent swarm |
|
||||
| **Local** | `/trekresearch --local <question>` | Only codebase analysis agents (skip external + Gemini) |
|
||||
| **Local** | `/trekresearch --local <question>` | Only codebase analysis agents (skip external research) |
|
||||
| **External** | `/trekresearch --external <question>` | Only external research agents (skip codebase analysis) |
|
||||
| **Foreground** | `/trekresearch --fg <question>` | No-op alias (foreground is default since v2.4.0) |
|
||||
| **Profile** | `/trekresearch --profile <name> <question>` | (v4.1.0) Pin model profile for the research phase. See [Profile system](#profile-system-v410). |
|
||||
|
|
@ -234,7 +234,7 @@ how many turns it has used. Whether the loop becomes the default is decided by a
|
|||
pre-registered measurement, not by preference: see
|
||||
[`docs/storm-measurement.md`](docs/storm-measurement.md).
|
||||
|
||||
Research uses up to 5 local agents (architecture-mapper, dependency-tracer, task-finder, git-historian, convention-scanner) and 4 external agents (docs-researcher, community-researcher, security-researcher, contrarian-researcher) plus the optional Gemini bridge for an independent second opinion. Per-agent details in [`agents/`](agents/).
|
||||
Research uses up to 5 local agents (architecture-mapper, dependency-tracer, task-finder, git-historian, convention-scanner) and 4 external agents (docs-researcher, community-researcher, security-researcher, contrarian-researcher). Per-agent details in [`agents/`](agents/).
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -657,7 +657,7 @@ flowchart TB
|
|||
end
|
||||
subgraph RES["/trekresearch · Phase 4 — parallel"]
|
||||
RL["LOCAL: architecture-mapper · dependency-tracer<br/>task-finder · git-historian · convention-scanner*"]
|
||||
RE["EXTERNAL: docs-researcher · community-researcher<br/>security-researcher* · contrarian-researcher* · gemini-bridge*"]
|
||||
RE["EXTERNAL: docs-researcher · community-researcher<br/>security-researcher* · contrarian-researcher*"]
|
||||
end
|
||||
subgraph PL["/trekplan"]
|
||||
PLG["Phase 4b · brief-reviewer (gate)"]
|
||||
|
|
@ -676,7 +676,7 @@ flowchart TB
|
|||
BR --> RES --> PL --> EX --> RV
|
||||
```
|
||||
|
||||
`* = conditional`: convention-scanner / test-strategist on medium+ codebases (50+ files); research-scout for unknown external tech; security-/contrarian-researcher + gemini-bridge when a leading recommendation forms (or always at `effort=high`); brief-conformance-reviewer skipped under `--quick`.
|
||||
`* = conditional`: convention-scanner / test-strategist on medium+ codebases (50+ files); research-scout for unknown external tech; security-/contrarian-researcher when a leading recommendation forms (or always at `effort=high`); brief-conformance-reviewer skipped under `--quick`.
|
||||
|
||||
> **Which Claude Code primitive each phase uses — and the alternatives considered (Workflow substrate, delegated orchestrator, dormant synthesis-agent)** → see [docs/architecture.md §Primitives per step](docs/architecture.md#primitives-per-step-decision-matrix).
|
||||
|
||||
|
|
@ -837,7 +837,6 @@ For per-profile cost estimates, see [`docs/profiles.md`](docs/profiles.md).
|
|||
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (CLI, desktop app, or web app)
|
||||
- Claude subscription with Opus access (Max plan recommended)
|
||||
- Optional: [Tavily MCP server](https://github.com/tavily-ai/tavily-mcp) for enhanced external research
|
||||
- Optional: a Gemini Deep Research MCP server exposing `gemini_deep_research`, `gemini_get_research_status`, `gemini_get_research_result`, `gemini_research_followup` for an independent second opinion (voyage calls these tools; any server implementing them works)
|
||||
|
||||
## Architecture
|
||||
|
||||
|
|
@ -845,8 +844,8 @@ Top-level layout:
|
|||
|
||||
```
|
||||
trekplan/
|
||||
├── agents/ 24 specialized agents (all `model: opus`-pinned; per-phase model set by `--profile`)
|
||||
│ └ 21 spawnable (1 dormant: synthesis-agent, Δ≈0) + 3 orchestrator reference docs (not spawned)
|
||||
├── agents/ 23 specialized agents (all `model: opus`-pinned; per-phase model set by `--profile`)
|
||||
│ └ 20 spawnable (1 dormant: synthesis-agent, Δ≈0) + 3 orchestrator reference docs (not spawned)
|
||||
├── commands/ 6 slash commands (trekbrief, trekresearch, trekplan, trekexecute, trekreview, trekcontinue) + trekendsession helper
|
||||
├── templates/ Frontmatter templates for brief, research, plan, session, launch
|
||||
├── hooks/ 8 hooks (pre-bash, pre-write, pre-agent-cap, session-title, post-bash-stats, pre-compact-flush, post-compact-flush, otel-export)
|
||||
|
|
@ -905,8 +904,8 @@ just run `--profile economy`, to put the whole pipeline on Sonnet.
|
|||
|
||||
### Disable external research
|
||||
|
||||
`/trekresearch --local` skips Tavily, Microsoft Learn, and the
|
||||
Gemini bridge. To make `--local` the default, edit the front of
|
||||
`/trekresearch --local` skips Tavily and Microsoft Learn. To make
|
||||
`--local` the default, edit the front of
|
||||
`commands/trekresearch.md` Phase 1 and flip the default branch
|
||||
of the `--local` argument check. Or just always pass `--local` and
|
||||
document it in your team's CLAUDE.md.
|
||||
|
|
|
|||
|
|
@ -1,151 +0,0 @@
|
|||
---
|
||||
name: gemini-bridge
|
||||
description: |
|
||||
Use this agent when an independent second opinion from Gemini Deep Research is
|
||||
needed on a technology choice, architectural question, or complex research topic.
|
||||
Provides triangulation value by running a completely independent research path
|
||||
that can confirm or challenge findings from other agents.
|
||||
model: opus
|
||||
color: magenta
|
||||
tools: ["mcp__gemini-mcp__gemini_deep_research", "mcp__gemini-mcp__gemini_get_research_status", "mcp__gemini-mcp__gemini_get_research_result", "mcp__gemini-mcp__gemini_research_followup"]
|
||||
---
|
||||
|
||||
You are a bridge to Google Gemini Deep Research. Your role is to obtain an independent,
|
||||
thorough research result that provides triangulation value — a completely independent
|
||||
research path that can confirm or challenge findings from other agents.
|
||||
|
||||
The value of this agent is INDEPENDENCE. Do not pre-bias Gemini with conclusions from
|
||||
other agents. Submit the research question cleanly so Gemini's findings stand on their
|
||||
own merits.
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Check availability
|
||||
|
||||
Attempt to call gemini_deep_research. If the tool is not available (MCP server not
|
||||
connected), return IMMEDIATELY with:
|
||||
|
||||
```
|
||||
## Gemini Bridge Result
|
||||
**Status:** Unavailable
|
||||
**Reason:** Gemini MCP server not connected. Proceeding without second opinion.
|
||||
```
|
||||
|
||||
Do NOT error, block, or retry. Unavailability is an expected operational state.
|
||||
|
||||
### 2. Formulate query
|
||||
|
||||
Take the research question and reformulate it for Gemini to maximize result quality:
|
||||
|
||||
- Add context about what dimensions to cover (trade-offs, maturity, ecosystem, operational
|
||||
concerns, known failure modes, community consensus)
|
||||
- Use format_instructions to request structured output with clear sections, source citations,
|
||||
and explicit confidence levels per claim
|
||||
- Set parameters:
|
||||
- `research_mode`: "custom"
|
||||
- `source_tier`: 2
|
||||
- `research_window_days`: 90
|
||||
|
||||
Example format_instructions to include:
|
||||
> "Structure your response with: Executive Summary, Key Findings (bullet points),
|
||||
> Trade-offs, Known Issues and Gotchas, Community Consensus, and Sources. For each
|
||||
> major claim, indicate your confidence level (high/medium/low) and cite the source."
|
||||
|
||||
### 3. Submit research
|
||||
|
||||
Call `gemini_deep_research` with the reformulated query and parameters.
|
||||
|
||||
### 4. Poll for completion
|
||||
|
||||
Call `gemini_get_research_status` repeatedly until the research completes:
|
||||
|
||||
- Call the status tool, then call it again after it returns — repeat until done
|
||||
- Do not use bash or sleep commands — use repeated tool calls to simulate waiting
|
||||
- Continue polling until status is `"completed"` or `"failed"`
|
||||
- If `"failed"`: report the failure reason and return gracefully — do not retry
|
||||
- Timeout: if still running after 40 polls (~20 minutes of equivalent wait), report
|
||||
timeout and return whatever partial result is available
|
||||
|
||||
### 5. Retrieve result
|
||||
|
||||
Call `gemini_get_research_result` with `include_citations: true`.
|
||||
|
||||
### 6. Optional follow-up
|
||||
|
||||
If the result has clear gaps on specific dimensions that are directly relevant to the
|
||||
research question, call `gemini_research_followup` with a targeted follow-up question.
|
||||
|
||||
Rules for follow-up:
|
||||
- Maximum 1 follow-up call
|
||||
- Only if there is a genuine gap — do not follow up out of habit
|
||||
- Make the follow-up question narrow and specific, not a re-statement of the original
|
||||
|
||||
### 7. Format output
|
||||
|
||||
Structure the final result as:
|
||||
|
||||
```
|
||||
## Gemini Bridge Result
|
||||
**Status:** Completed
|
||||
**Research duration:** {time taken}
|
||||
**Sources cited:** {count}
|
||||
|
||||
### Key Findings
|
||||
- {finding 1}
|
||||
- {finding 2}
|
||||
- {finding 3}
|
||||
|
||||
### Trade-offs and Known Issues
|
||||
- {trade-off or issue 1}
|
||||
- {trade-off or issue 2}
|
||||
|
||||
### Sources
|
||||
| # | Source | Relevance |
|
||||
|---|--------|-----------|
|
||||
| 1 | {URL} | {one-line relevance} |
|
||||
|
||||
### Areas for Triangulation
|
||||
*Claims that should be cross-checked against local codebase analysis
|
||||
and other external agents:*
|
||||
- {claim 1 — check against local architecture}
|
||||
- {claim 2 — verify with community experience}
|
||||
- {claim 3 — validate against codebase constraints}
|
||||
```
|
||||
|
||||
## Rules
|
||||
|
||||
- **Never block the research pipeline.** If Gemini is slow or unavailable, return what
|
||||
you have with a clear status note.
|
||||
- **Do not interpret or editorialize.** Report Gemini's findings as-is, formatted for
|
||||
integration. Your job is formatting and delivery, not analysis.
|
||||
- **Flag "Areas for Triangulation"** — claims that the research-orchestrator or other
|
||||
agents should cross-check against local codebase analysis, team experience, or other
|
||||
external sources.
|
||||
- **Independence is the point.** Do not include findings from other agents in your query
|
||||
to Gemini. The value of a second opinion is that it is uninfluenced by the first.
|
||||
- **Cite everything.** Every major claim in the output must trace to a source in the
|
||||
Sources table. Remove claims that Gemini did not support with a source.
|
||||
- **Graceful degradation at every step.** Unavailable tool, failed research, timeout —
|
||||
all are handled with a clear status message and immediate return. Never leave the
|
||||
pipeline hanging.
|
||||
|
||||
## When to use — examples
|
||||
|
||||
<example>
|
||||
Context: trekresearch launches gemini-bridge for an independent second opinion on a technology choice
|
||||
user: "/trekplan Should we use Kafka or NATS for our event streaming layer?"
|
||||
assistant: "Launching gemini-bridge for an independent second opinion on Kafka vs NATS."
|
||||
<commentary>
|
||||
Technology choice with significant architectural implications triggers gemini-bridge
|
||||
to provide an independent research path alongside local exploration agents.
|
||||
</commentary>
|
||||
</example>
|
||||
|
||||
<example>
|
||||
Context: user wants deep research via Gemini on a complex architectural question
|
||||
user: "Get me a Gemini deep research on event sourcing patterns for distributed systems"
|
||||
assistant: "I'll use the gemini-bridge agent to run a deep research on event sourcing patterns."
|
||||
<commentary>
|
||||
Direct request for Gemini research on a complex architectural question triggers the agent.
|
||||
</commentary>
|
||||
</example>
|
||||
|
|
@ -61,13 +61,16 @@ Execute these phases in order. Do not skip phases.
|
|||
|
||||
Based on the mode, determine which agent groups to launch:
|
||||
|
||||
| Mode | Local agents | External agents | Gemini bridge |
|
||||
|------|-------------|-----------------|---------------|
|
||||
| `default` | Yes | Yes | Yes (if enabled in settings) |
|
||||
| `local` | Yes | No | No |
|
||||
| `external` | No | Yes | Yes (if enabled) |
|
||||
| Mode | Local agents | External agents |
|
||||
|------|-------------|-----------------|
|
||||
| `default` | Yes | Yes |
|
||||
| `local` | Yes | No |
|
||||
| `external` | No | Yes |
|
||||
| `quick` | N/A — handled inline by the command, not the orchestrator |
|
||||
|
||||
> **No bridge agent (v5.10.1).** The third-party second-opinion bridge was dropped
|
||||
> by operator directive; there is no bridge column to select.
|
||||
|
||||
**Local agents** (reuse existing plugin agents with research-focused prompts):
|
||||
|
||||
| Agent | Purpose in research context |
|
||||
|
|
@ -87,12 +90,6 @@ Based on the mode, determine which agent groups to launch:
|
|||
| `security-researcher` | CVEs, audit history, supply chain risks |
|
||||
| `contrarian-researcher` | Counter-evidence, overlooked alternatives, reasons to reconsider |
|
||||
|
||||
**Bridge agent:**
|
||||
|
||||
| Agent | Purpose |
|
||||
|-------|---------|
|
||||
| `gemini-bridge` | Independent second opinion via Gemini Deep Research |
|
||||
|
||||
### Phase 2 — Parallel research
|
||||
|
||||
Launch ALL selected agents **in parallel** using the Agent tool — one message,
|
||||
|
|
@ -127,11 +124,6 @@ Examples:
|
|||
Pass the research question, specific dimensions to investigate, and any context from
|
||||
the interview about what the user already knows or cares about.
|
||||
|
||||
**Prompting gemini-bridge:**
|
||||
|
||||
Pass the research question as-is. Do NOT pre-bias with findings from other agents —
|
||||
the value of Gemini is independence.
|
||||
|
||||
### Phase 3 — Targeted follow-ups
|
||||
|
||||
Review all agent results. Identify knowledge gaps — areas where findings are thin,
|
||||
|
|
@ -195,7 +187,7 @@ When done, your output message should contain:
|
|||
**Brief:** {brief path}
|
||||
**Confidence:** {overall confidence 0.0-1.0}
|
||||
**Dimensions:** {N} researched
|
||||
**Agents:** {N} local + {N} external + {gemini status}
|
||||
**Agents:** {N} local + {N} external
|
||||
|
||||
### Key Findings
|
||||
- {Finding 1}
|
||||
|
|
@ -226,7 +218,7 @@ You can:
|
|||
- **Sources:** Every claim in the brief must cite a source (URL or file path).
|
||||
Never invent findings.
|
||||
- **Honesty:** If a question is trivially answerable, say so. Don't inflate research.
|
||||
- **Graceful degradation:** If MCP tools are unavailable (Tavily, Gemini), proceed
|
||||
- **Graceful degradation:** If MCP tools are unavailable (Tavily, MS Learn), proceed
|
||||
with available tools and note the limitation in the brief metadata.
|
||||
- **Independence:** Do not pre-bias external agents with local findings or vice versa.
|
||||
The value is in independent perspectives that are THEN triangulated.
|
||||
|
|
|
|||
|
|
@ -386,8 +386,8 @@ The mapping table is canonical:
|
|||
- `high → {effort: high, model: opus}` (force opus for the high-confidence path)
|
||||
- `fable → {effort: high, model: fable}` (force Fable 5 for the max-quality path)
|
||||
|
||||
The fable tier reuses `effort: high` semantics — full swarm, contrarian +
|
||||
gemini always-on; `EFFORT_LEVELS` is unchanged (Voyage effort is orchestration
|
||||
The fable tier reuses `effort: high` semantics — full swarm, contrarian
|
||||
always-on; `EFFORT_LEVELS` is unchanged (Voyage effort is orchestration
|
||||
shape, not model reasoning effort). Model reasoning effort is inherited from
|
||||
the session: Fable 5's default effort is `high`, NOT xhigh. To run xhigh, the
|
||||
operator sets it at session level via `/effort xhigh`, the `effortLevel`
|
||||
|
|
@ -825,7 +825,7 @@ topic.
|
|||
> background orchestrator-agents could not spawn the research swarm —
|
||||
> before Claude Code 2.1.172 the harness did not expose the Agent tool to
|
||||
> sub-agents, so a background run silently degraded to single-context
|
||||
> reasoning without WebSearch / Tavily / WebFetch / Gemini (see v2.4.0
|
||||
> reasoning without WebSearch / Tavily / WebFetch (see v2.4.0
|
||||
> release notes). As of CC 2.1.172 sub-agents can spawn sub-agents (up to 5
|
||||
> levels deep), so a delegated redesign is under evaluation (see
|
||||
> `docs/cc-upgrade-2.1.181-decision-matrix.md`, W1/CC-26). Until then,
|
||||
|
|
|
|||
|
|
@ -898,22 +898,33 @@ validator-only; this surface just makes the friendly hint readable.
|
|||
|
||||
### High-effort behavior (v5.1.1)
|
||||
|
||||
When `phase_signal_result.effort == 'high'` for the `plan` phase, after
|
||||
Phase 9 (plan-critic + scope-guardian dedup pass) runs to completion on
|
||||
the post-revision plan, run an ADDITIONAL `gemini-bridge` plan-review
|
||||
pass on the post-revision plan. Surface its findings as a separate
|
||||
`## Adversarial Pass 2 (gemini-bridge, v5.1.1 high-effort)` section
|
||||
appended to plan.md before the trailing JSON block.
|
||||
When `phase_signal_result.effort == 'high'` for the `plan` phase, the
|
||||
additional adversarial Pass 2 on the post-revision plan is
|
||||
**unavailable, skipped**. Append the section header to plan.md before
|
||||
the trailing JSON block with exactly that status, so a reader can tell
|
||||
a deliberately dropped pass from one that failed:
|
||||
|
||||
Rationale (per risk-assessor finding + Decision B substitution
|
||||
2026-05-14): the originally-considered "extra plan-critic-iterasjon"
|
||||
risked a revision-loop because plan-critic dedup keys on
|
||||
`(file, line, rule_key)` triplets and post-revision line numbers shift.
|
||||
The gemini-bridge pass is independent (different agent, different
|
||||
perspective) and does not re-tread the same dedup space — it surfaces
|
||||
genuinely new findings rather than re-emitting closed ones.
|
||||
```
|
||||
## Adversarial Pass 2 (v5.1.1 high-effort)
|
||||
|
||||
Standard and low effort: do NOT run the additional pass.
|
||||
**Status:** unavailable, skipped — the third-party bridge agent that
|
||||
ran this pass was dropped in v5.10.1 by operator directive. No
|
||||
substitute is wired. Phase 9 (plan-critic + scope-guardian) is the
|
||||
complete adversarial coverage for this plan.
|
||||
```
|
||||
|
||||
Do NOT fail, retry, or silently omit the section: a high-effort plan
|
||||
that carries no Pass 2 marker is indistinguishable from one whose Pass
|
||||
2 crashed.
|
||||
|
||||
History (why the slot exists): Decision B, 2026-05-14, substituted a
|
||||
bridge pass for an "extra plan-critic-iterasjon" because plan-critic
|
||||
dedup keys on `(file, line, rule_key)` triplets and post-revision line
|
||||
numbers shift, risking a revision-loop. Dropping the bridge does not
|
||||
revive that option — re-running plan-critic carries the same loop risk
|
||||
it always did.
|
||||
|
||||
Standard and low effort: do NOT emit the section at all.
|
||||
|
||||
## Hard rules
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ Supported flags:
|
|||
1. `--quick` — lightweight research, no agent swarm. The command itself does
|
||||
3-5 targeted searches inline. Set **mode = quick**.
|
||||
|
||||
2. `--local` — only codebase research. Skip external agents and gemini bridge.
|
||||
2. `--local` — only codebase research. Skip external research agents.
|
||||
Set **scope = local**.
|
||||
|
||||
3. `--external` — only external research. Skip codebase analysis agents.
|
||||
|
|
@ -121,7 +121,7 @@ Usage: /trekresearch <research question>
|
|||
Modes:
|
||||
default Interview → foreground research (local + external) → brief
|
||||
--quick Interview (short) → inline research (no agent swarm)
|
||||
--local Only codebase analysis agents (skip external + Gemini)
|
||||
--local Only codebase analysis agents (skip external research)
|
||||
--external Only external research agents (skip codebase analysis)
|
||||
--fg No-op alias (foreground is the only mode as of v2.4.0)
|
||||
--project Write brief into an trekbrief project folder (auto-indexed)
|
||||
|
|
@ -240,8 +240,8 @@ Then continue to the next phase inline.
|
|||
> did not expose the Agent tool to sub-agents, so an orchestrator launched
|
||||
> with `run_in_background: true` could not spawn the documented research
|
||||
> swarm (`docs-researcher`, `community-researcher`, etc.) and silently
|
||||
> degraded to single-context reasoning without WebSearch / Tavily / WebFetch
|
||||
> / Gemini. As of CC 2.1.172 sub-agents can spawn sub-agents (up to 5 levels
|
||||
> degraded to single-context reasoning without WebSearch / Tavily / WebFetch.
|
||||
> As of CC 2.1.172 sub-agents can spawn sub-agents (up to 5 levels
|
||||
> deep), so that block no longer holds — a delegated redesign is under
|
||||
> evaluation (see `docs/cc-upgrade-2.1.181-decision-matrix.md`, W1/CC-26).
|
||||
> Until then, running the phases inline in main context keeps the swarm
|
||||
|
|
@ -391,11 +391,6 @@ Launch the new research-specialized agents:
|
|||
For each external agent, pass: the research question, specific dimensions to
|
||||
investigate, and any context from the interview.
|
||||
|
||||
### Bridge agent (scope = both or external, if enabled)
|
||||
|
||||
Launch `gemini-bridge` with the research question. Do NOT include findings from
|
||||
other agents — the value of Gemini is independence.
|
||||
|
||||
### Launch rules
|
||||
|
||||
- Launch ALL selected agents **in parallel** in a single message
|
||||
|
|
@ -756,7 +751,7 @@ Present a summary to the user:
|
|||
**Engine (effective):** {swarm | deep-research}{, with fallback reason if it fell back}
|
||||
**Confidence:** {overall confidence 0.0-1.0}
|
||||
**Dimensions:** {N} researched
|
||||
**Agents:** {N} local + {N} external + {gemini: used | unavailable | skipped}
|
||||
**Agents:** {N} local + {N} external
|
||||
|
||||
### Key Findings
|
||||
- {Finding 1}
|
||||
|
|
@ -801,7 +796,7 @@ Record format (one JSON line):
|
|||
"unique_sources": {N},
|
||||
"agents_local": {N},
|
||||
"agents_external": {N},
|
||||
"gemini_used": {true|false},
|
||||
"gemini_used": false,
|
||||
"confidence": {0.0-1.0},
|
||||
"contradictions": {N},
|
||||
"open_questions": {N}
|
||||
|
|
@ -892,15 +887,16 @@ commands surface, don't re-enforce.
|
|||
|
||||
When `phase_signal_result.effort == 'high'` for the `research` phase,
|
||||
run the FULL swarm regardless of normal triggering rules: 5 local
|
||||
agents + 4 external agents + 1 bridge agent, AND force
|
||||
`contrarian-researcher` AND `gemini-bridge` to always-on. Normally
|
||||
`contrarian-researcher` triggers conditionally when a leading
|
||||
recommendation is emerging from initial agents; in high-effort mode it
|
||||
runs unconditionally so the final brief always carries an adversarial
|
||||
counter-evidence pass. Similarly, `gemini-bridge` normally activates on
|
||||
significant architectural questions or when triangulation value is
|
||||
high; in high-effort mode it runs unconditionally to provide an
|
||||
independent second opinion.
|
||||
agents + 4 external agents, AND force `contrarian-researcher` to
|
||||
always-on. Normally `contrarian-researcher` triggers conditionally when
|
||||
a leading recommendation is emerging from initial agents; in
|
||||
high-effort mode it runs unconditionally so the final brief always
|
||||
carries an adversarial counter-evidence pass.
|
||||
|
||||
The former third-party second-opinion bridge pass is **unavailable,
|
||||
skipped** (dropped in v5.10.1 by operator directive). High effort no
|
||||
longer has a bridge arm; `gemini_used` is a vestigial stats field
|
||||
pinned to `false`.
|
||||
|
||||
High effort additionally arms the Phase 5 bounded follow-up loop (max 3
|
||||
turns per under-illuminated dimension, budgeted by
|
||||
|
|
@ -947,7 +943,7 @@ Low effort: inline research only, no agent swarm (existing
|
|||
local finding from steering an external agent's question. Attributing the bias
|
||||
risk to it left that risk with no control while the text read as though it had
|
||||
one.
|
||||
- **Graceful degradation:** If MCP tools are unavailable (Tavily, Gemini, MS Learn),
|
||||
- **Graceful degradation:** If MCP tools are unavailable (Tavily, MS Learn),
|
||||
proceed with available tools and note limitations in brief metadata.
|
||||
- **Cost:** Model resolution at Agent-spawn sites is a three-layer fallback:
|
||||
brief `phase_signals[<phase>].model` > `profile.phase_models[<phase>]` >
|
||||
|
|
|
|||
|
|
@ -135,6 +135,17 @@ reused.
|
|||
|
||||
## 6. Cheaper PoC (audit-recommended, preferred over the full bake-off)
|
||||
|
||||
> **STATUS: RUN AND DECLINED (S12, 2026-06-18) — do not re-order as new work.**
|
||||
> Result: **Δ main-context (faithful flow) = 0.0%**, NEGATIVE against the 15% keep-floor.
|
||||
> Full method, fixtures and BASE-sweep: `docs/T1-synthesis-poc-results.md`;
|
||||
> reproduce with `node scripts/synthesis-measure.mjs`.
|
||||
> The finding is **structural, not stochastic**, so re-running it cannot change the number:
|
||||
> Phase 5 spawns the exploration swarm **foreground** (`commands/trekplan.md:158,338-341` —
|
||||
> "foreground is the only mode as of v2.4.0"), 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 is reachable only by also moving Phase-5 delivery off-main —
|
||||
> which is §5, not §6. `agents/synthesis-agent.md` therefore ships **dormant**.
|
||||
|
||||
Per `subagent-delegation-audit.md` §Recommendation, the lowest-risk way to test the delegation
|
||||
*premise* is **not** a wholesale orchestrator rewrite but **one narrow synthesis-agent**
|
||||
(intervention #1/#3): delegate only trekplan Phase 7 synthesis (the heaviest single inline read —
|
||||
|
|
@ -169,5 +180,17 @@ promising orchestration-substrate question and is untouched by this.
|
|||
only matters if a future nested pipeline approaches 5.
|
||||
2. Classifier behaviour for a *purposeful* swarm under `auto`/`bypassPermissions` is unverified
|
||||
(F4) — must be in the §5/§6 test matrix before any delegated spawn ships to a headless path.
|
||||
3. The §6 synthesis-agent PoC and the §5 full bake-off are both **designed but unbuilt** — ready
|
||||
to run if CC-26 is greenlit toward delegation.
|
||||
3. ~~The §6 synthesis-agent PoC and the §5 full bake-off are both designed but unbuilt.~~
|
||||
**CORRECTED 2026-09-03 (S95).** This item was written in S7 and falsified the same afternoon
|
||||
by S12: the **§6 PoC was RUN and DECLINED** (`docs/T1-synthesis-poc-results.md` — Δ_faithful
|
||||
= 0.0%, NEGATIVE). Only the **§5 full bake-off** remains unbuilt. The stale wording is what
|
||||
caused the §6 PoC to be re-ordered as new work on 2026-09-02; it is struck rather than
|
||||
deleted so the re-order has a traceable cause.
|
||||
4. **Environment premise updated (measured 2026-09-03, CC 2.1.259).** S12 recorded the live run
|
||||
as environment-blocked for want of an `ANTHROPIC_API_KEY`. That half no longer holds:
|
||||
`claude -p --output-format stream-json` runs on subscription auth with no API key and emits
|
||||
per-turn `usage` plus 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 stands unmeasured: the installed plugin is the cache copy, so a
|
||||
repo-local agent is invisible to `claude -p`. This changes nothing about the §6 verdict,
|
||||
which is structural (see §6 status), and only lowers the cost of §5.
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ Which native Claude Code primitive each pipeline step runs on today, and the alt
|
|||
| **continue** | Inline reads `.session-state.local.json` → zero-confirm resume | CC `--resume` (transcript replay, not typed work-state → insufficient) |
|
||||
| **cross-cutting** | 8 hook scripts: `pre-bash` + `pre-write` guards, `pre-agent-cap` loop-bound enforcement, `post-bash` stats, `session-title`, `pre-`/`post-compact` flush, **`Stop`→OTEL** export | — |
|
||||
|
||||
¹ MCP per research agent: `docs-researcher` → Microsoft Learn + Tavily · `community-`/`security-`/`contrarian-researcher` → Tavily (+ WebSearch/WebFetch) · `gemini-bridge` → Gemini Deep Research MCP. Graceful degradation when an MCP server is absent.
|
||||
¹ MCP per research agent: `docs-researcher` → Microsoft Learn + Tavily · `community-`/`security-`/`contrarian-researcher` → Tavily (+ WebSearch/WebFetch). Graceful degradation when an MCP server is absent.
|
||||
|
||||
**Legend:** *production* = wired and active · *dormant* = shipped but wired to nothing (`synthesis-agent`) · *opt-in* = behind a flag (`--workflow`) · *not wired* = considered, deferred (delegated orchestrator, the `AskUserQuestion` brief engine).
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Always interactive. Phase 3 is a section-driven completeness loop (no hard cap o
|
|||
| _(default)_ | Interview + research (local + external) + synthesis + brief (foreground) |
|
||||
| `--project <dir>` | Write brief to `{dir}/research/{NN}-{slug}.md` (auto-incremented) |
|
||||
| `--quick` | Interview (short) + inline research (no agent swarm) |
|
||||
| `--local` | Only codebase analysis agents (skip external + Gemini) |
|
||||
| `--local` | Only codebase analysis agents (skip external research) |
|
||||
| `--external` | Only external research agents (skip codebase analysis) |
|
||||
| `--fg` | No-op alias (foreground is default since v2.4.0) |
|
||||
| `--gates {true\|false}` | (v3.4.0) Boolean autonomy-gate flag; present → gating on. Policy (`gates_mode`) detailed under `## Autonomy mode` in `docs/operations.md`. |
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "voyage",
|
||||
"version": "5.10.0",
|
||||
"version": "5.10.1",
|
||||
"private": true,
|
||||
"description": "Voyage — brief, research, plan, execute, review, continue. Contract-driven Claude Code pipeline. /trekbrief, /trekplan, and /trekreview each end by building a self-contained operator-annotation HTML (scripts/annotate.mjs, modelled on claude-code-100x): select text or click any heading/paragraph/list-item, pick intent (Fiks/Endre/Spørsmål), write comment, copy structured prompt, paste back, Claude revises the .md.",
|
||||
"type": "module",
|
||||
|
|
|
|||
|
|
@ -14,11 +14,6 @@
|
|||
"trekresearch": {
|
||||
"defaultMode": "default",
|
||||
"maxDimensions": 8,
|
||||
"geminiBridge": {
|
||||
"enabled": true,
|
||||
"pollIntervalSeconds": 30,
|
||||
"timeoutMinutes": 25
|
||||
},
|
||||
"interview": {
|
||||
"maxQuestions": 4,
|
||||
"typicalQuestions": 3
|
||||
|
|
|
|||
|
|
@ -74,15 +74,6 @@ findings exist.*
|
|||
### Known Issues
|
||||
{Common pitfalls, gotchas, real-world problems from community-researcher}
|
||||
|
||||
## Gemini Second Opinion
|
||||
|
||||
*Independent research result from Gemini Deep Research. Provides a second
|
||||
perspective for triangulation. Omit this section if gemini-bridge was not used
|
||||
or was unavailable.*
|
||||
|
||||
{Gemini findings reformatted into key findings, sources cited, and areas of
|
||||
agreement/disagreement with other agents.}
|
||||
|
||||
## Synthesis
|
||||
|
||||
*Cross-cutting insights that emerge from combining local and external knowledge.
|
||||
|
|
@ -114,7 +105,7 @@ this section entirely.*
|
|||
|
||||
| # | Source | Type | Quality | Used in |
|
||||
|---|--------|------|---------|---------|
|
||||
| 1 | {URL or codebase path} | {official / community / codebase / gemini} | {high / medium / low} | {dimension name} |
|
||||
| 1 | {URL or codebase path} | {official / community / codebase} | {high / medium / low} | {dimension name} |
|
||||
|
||||
*Quality assessment:*
|
||||
- **high** — official documentation, verified codebase analysis, peer-reviewed
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ the codebase and this brief contain sufficient context for planning."}
|
|||
- **Required for plan steps:** {which kinds of steps will consume this — e.g.,
|
||||
"migration strategy", "library selection", "threat model"}
|
||||
- **Confidence needed:** {high | medium | low}
|
||||
- **Estimated cost:** {quick — inline research | standard — agent swarm | deep — with contrarian + gemini}
|
||||
- **Estimated cost:** {quick — inline research | standard — agent swarm | deep — with contrarian}
|
||||
- **Scope hint:** {local | external | both}
|
||||
|
||||
### Topic 2: {Short title}
|
||||
|
|
|
|||
|
|
@ -152,14 +152,18 @@ test('no agents/*.md frontmatter contains an <example> block (M4: examples live
|
|||
}
|
||||
});
|
||||
|
||||
test('agent bodies retain at least 34 <example> blocks (M4: relocation moves, never deletes)', () => {
|
||||
// Floor lowered 34 -> 32 in v5.10.1: `gemini-bridge` (2 examples) was DELETED as an
|
||||
// agent by operator directive, not relocated. The pin guards M4's "relocation moves,
|
||||
// never deletes" invariant, so it must move only when an agent legitimately leaves the
|
||||
// inventory — never to absorb examples that went missing from a surviving agent.
|
||||
test('agent bodies retain at least 32 <example> blocks (M4: relocation moves, never deletes)', () => {
|
||||
let total = 0;
|
||||
for (const f of agentFiles) {
|
||||
total += (bodyOf(read(`agents/${f}`)).match(/<example>/g) || []).length;
|
||||
}
|
||||
assert.ok(
|
||||
total >= 34,
|
||||
`expected >= 34 <example> blocks across agent bodies (17 agents x 2), got ${total} ` +
|
||||
total >= 32,
|
||||
`expected >= 32 <example> blocks across agent bodies (16 agents x 2), got ${total} ` +
|
||||
`— examples may have been deleted instead of relocated (M4)`,
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1702,3 +1702,94 @@ test('v5.9: no commands/*.md frontmatter carries a model: key (session inheritan
|
|||
assert.deepEqual(offenders, [],
|
||||
`command frontmatter must omit model: (orchestrator follows the session model); offenders: ${offenders.join(', ')}`);
|
||||
});
|
||||
|
||||
// --- S95 (③): gemini-bridge is DROPPED from the pipeline (operator directive) ---
|
||||
//
|
||||
// Operator directive, three repetitions: gemini-mcp and voyage:gemini-bridge are
|
||||
// never to be used. The drop is permanent, not a wait-for-upgrade — so the pin is
|
||||
// on the LIVE pipeline surfaces only. Historical records (CHANGELOG entries,
|
||||
// measurement/decision docs) must KEEP their references: they say what a past
|
||||
// version did or what was measured then, and rewriting them is the same defect
|
||||
// class as bumping a version string inside a measurement doc.
|
||||
//
|
||||
// `gemini_used` is deliberately NOT banned. It is a vestigial trekresearch stats
|
||||
// field, pinned to false by the drop and kept so the observability export schema
|
||||
// does not break for existing consumers (see TREKRESEARCH_ALLOWED).
|
||||
|
||||
// Live = anything that can still steer a run. Explicit, so a new file forces a decision.
|
||||
const GEMINI_LIVE_SURFACES = [
|
||||
'README.md',
|
||||
'CLAUDE.md',
|
||||
'settings.json',
|
||||
'docs/architecture.md',
|
||||
'docs/command-modes.md',
|
||||
'templates/research-brief-template.md',
|
||||
'templates/trekbrief-template.md',
|
||||
'tests/fixtures/jsonl-schemas.md',
|
||||
...listMd('commands').map((f) => `commands/${f}`),
|
||||
...listMd('agents').map((f) => `agents/${f}`),
|
||||
];
|
||||
|
||||
// Historical/measurement records that MUST keep their gemini references.
|
||||
const GEMINI_HISTORICAL = [
|
||||
'CHANGELOG.md',
|
||||
'docs/cc-upgrade-2.1.181-decision-matrix.md',
|
||||
'docs/voyage-vs-cc-balance-analysis.md',
|
||||
'docs/BRIEF-vurdering-v2.md',
|
||||
'docs/balance-backlog-plan.md',
|
||||
'docs/agent-description-token-trim-brief.md',
|
||||
'docs/S22-happy-path-dogfood.md',
|
||||
'docs/deep-research-engine-brief.md',
|
||||
'examples/02-real-cli/REGENERATED.md',
|
||||
];
|
||||
|
||||
test('S95: agents/gemini-bridge.md is removed from the agent inventory', () => {
|
||||
assert.ok(
|
||||
!listMd('agents').includes('gemini-bridge.md'),
|
||||
'gemini-bridge is dropped by operator directive — agents/gemini-bridge.md must not exist',
|
||||
);
|
||||
});
|
||||
|
||||
test('S95: no live pipeline surface still names the gemini-bridge agent', () => {
|
||||
const offenders = [];
|
||||
for (const rel of GEMINI_LIVE_SURFACES) {
|
||||
// Everything gemini EXCEPT the vestigial gemini_used stats field.
|
||||
const hits = (read(rel).match(/gemini[\w-]*/gi) || []).filter(
|
||||
(m) => m.toLowerCase() !== 'gemini_used',
|
||||
);
|
||||
if (hits.length) offenders.push(`${rel} (${[...new Set(hits)].join(', ')})`);
|
||||
}
|
||||
assert.deepEqual(
|
||||
offenders, [],
|
||||
`gemini-bridge is dropped — these live surfaces still reference it: ${offenders.join(' · ')}`,
|
||||
);
|
||||
});
|
||||
|
||||
test('S95: known-positive control — the historical records still DO carry gemini references', () => {
|
||||
// Verifiseringsloven ansikt 4: a scanner that finds nothing anywhere proves
|
||||
// nothing. This pins that the same query CAN find, so the empty result above
|
||||
// is a measurement and not a broken query.
|
||||
const silent = GEMINI_HISTORICAL.filter((rel) => !/gemini/i.test(read(rel)));
|
||||
assert.deepEqual(
|
||||
silent, [],
|
||||
`these historical records lost their gemini references — history must not be rewritten: ${silent.join(', ')}`,
|
||||
);
|
||||
});
|
||||
|
||||
test('S95: trekplan high-effort Pass 2 degrades explicitly instead of failing', () => {
|
||||
const t = read('commands/trekplan.md');
|
||||
const section = t.split('\n### High-effort behavior (v5.1.1)\n')[1];
|
||||
assert.ok(section, 'trekplan.md must still carry the High-effort behavior sub-section');
|
||||
const head = section.split('\n## ')[0];
|
||||
assert.match(
|
||||
head, /unavailable, skipped/,
|
||||
'the dropped Pass 2 must read "unavailable, skipped" explicitly — a removed pass that is silent is indistinguishable from one that failed',
|
||||
);
|
||||
});
|
||||
|
||||
test('S95: gemini_used survives as a vestigial stats field (export schema unbroken)', () => {
|
||||
assert.ok(
|
||||
TREKRESEARCH_ALLOWED.has('gemini_used'),
|
||||
'gemini_used stays in the trekresearch export allowlist — the agent is dropped, the field is pinned false, and removing it would break existing consumers',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue