Skip to content

v0.3.2: model refresh, runner isolation and run outcome metrics - #21

Merged
sergeyfast merged 7 commits into
masterfrom
feat/v0.3.2
Sep 24, 2026
Merged

sergeyfast merged 7 commits into
masterfrom
feat/v0.3.2

Conversation

@sergeyfast

Copy link
Copy Markdown
Member

Summary

  • Models: add Opus 5.5, Fable 5.1, GPT-6 and deepseek-flash to price tables and model lists; remap retired model ids in runner profiles (docs/patches/2026-09-23-retired-models.sql, data-only; profiles with their own apiBaseURL are left alone).
  • OpenAI Responses API provider for GPT-6 in the direct runner (provider: openai); custom base URLs (Azure, LiteLLM) keep chat completions. DeepSeek gets reasoning effort and a 128K output cap.
  • codex runner: effort, per-call usage on resume, --codex-sandbox / REVIEW_CODEX_SANDBOX for containers where bubblewrap can't start.
  • Runner isolation from the reviewed checkout: claude loads user settings only, no MCP servers, auto-memory off; opencode runs without project config, formatters and LSP, refuses a checkout that ships .opencode/ or opencode.json(c), and switches to --auto (opencode ≥ 1.17.12). reviewctl and GitLab CI secrets are stripped from the env of runner CLIs and git (pkg/reviewer/subprocess.go); git runs without hooks or fsmonitor.
  • Run outcomes: status + reason for every runner (codex and opencode classified from their error text), reported with cost in debug bundles and exported as reviewer_runs_total / reviewer_run_cost_usd_total. One shared retry policy for transient provider errors (SDK retries off), incl. failed Responses replies.
  • Cost accounting: failed runs, the Step 2 retry and failed judge attempts are billed; a run whose review was created before an upload failed is not counted twice.
  • Direct runner: fix diff refs in GitLab CI (bare branch names); warn before the round limit, grace rounds, maxRounds profile param overridden by --max-rounds / REVIEW_MAX_ROUNDS; provider retries logged as they happen.
  • Panel: debug bundles for judge and panel-level failures; empty member and judge reviews tagged not_submitted.
  • reviewctl: handle SIGTERM — a cancelled job is not a failure; a second signal exits during cleanup.
  • Debug bundles: artifacts gzip-compressed in memory, 2MB body cap lifted, metadata clipped; uploads for unknown projects rejected before the body is read (503 on a failed lookup); artifacts served only as JSON or sandboxed plain text; project key masked in logs and error messages.
  • Frontend: Vite 8, vue-router 5, vue-tsc 3, TypeScript 6, markdown-it 15, all npm audit advisories cleared; highlight.js common languages only (main chunk 1.21 MB → 447 KB); Node 24 and a Frontend workflow (build + audit).
  • Housekeeping: go-openai v1.42.1, go fix, reviewctl docs updated for stream-json and the RPC config flow.

Test plan

  • make fmt lint test — green
  • Multi-review panel: direct + codex members, claude judge — fused review uploaded
  • reviewctl review --runner direct --api-provider openai --model gpt-6-sol — Responses API with tool use
  • reviewctl review --runner direct --api-provider deepseek — effort passed, cost recorded
  • GitLab CI: direct runner diff range in an MR pipeline; job cancel → bundle with cancelled
  • codex and opencode runners in the CI image (REVIEW_CODEX_SANDBOX=danger-full-access)
  • Failed run with an exhausted balance → /v1/debug/storage/ shows reason billing, reviewer_runs_total increments once

- Add Opus 5.5, Fable 5.1, GPT-6 and deepseek-flash to price tables and
  model lists; patch retired model ids in runner profiles
- Add an OpenAI Responses API provider for GPT-6 in the direct runner;
  custom base URLs (Azure, LiteLLM) keep chat completions
- Pass reasoning effort to DeepSeek and raise its output cap to 128K
- Update the codex runner: effort, per-call usage on resume, and a
  --codex-sandbox flag for containers where bubblewrap can't start
- Isolate CLI runners from the reviewed checkout: claude loads user
  settings only and no MCP servers; opencode runs without project
  config, formatters and LSP, and refuses a checkout that ships
  .opencode/ or opencode.json(c), whose plugins it would execute
- Switch opencode to --auto
- Classify run outcomes (status + reason) for all runners, report them
  with cost in debug bundles, and export reviewer_runs_total and
  reviewer_run_cost_usd_total
- Retry transient provider errors with one shared policy; turn off the
  Anthropic SDK's own retries so attempts don't stack
- Warn the direct runner before its round limit, add grace rounds and
  a maxRounds runner-profile param (--max-rounds)
- Fix direct runner diff refs in GitLab CI (bare branch names)
- Fix cost reporting to include failed runs, the Step 2 retry and
  failed judge attempts
- Fix debug bundle uploads capped at 2MB by the global body limit
- Keep debug artifacts gzip-compressed in memory; clip bundle metadata
- Handle SIGTERM in reviewctl: a cancelled job is not a failure
- Update go-openai to v1.42.1
- Update vite 6.4 -> 8.3 and @vitejs/plugin-vue 5 -> 6; switch the vt
  build config to rolldownOptions
- Update vue-router 4 -> 5, vue-tsc 2 -> 3 and typescript 5.7 -> 6.0;
  pin typescript with ~ since TS 7 breaks vue-tsc (./lib/tsc is gone)
- Update markdown-it 14 -> 15 and drop @types/markdown-it: import
  StateCore/Token from the package root, deep lib/* imports are removed
- markdown-it 15 stops fuzzy-linking bare names, so README.md or
  setup.py in review text no longer become bogus http:// links
- Load highlight.js/lib/common instead of every language: main chunk
  drops 1.21 MB -> 447 KB; alias postgresql fences to sql
- Drop the unused selectEl ref in FillExampleSelect found by vue-tsc 3
- Bump vue, tailwindcss, mermaid 11.17, highlight.js and ufo minors,
  clearing all 12 npm audit advisories
- Keep mermaid on 11.x: 12.0 adds 2 MB to the embedded bundle and a
  lodash-es advisory via chevrotain
- Move to Node 24 (.nvmrc, Docker) and declare engines node >=22.12
- Add a Frontend workflow: npm ci, build:all, audit of runtime deps
- pkg/reviewer/run_metrics_test.go imports client_model directly, so
  go mod tidy moves it out of the indirect block
- go.sum and vendor are unchanged
- Ship a debug bundle when the judge fails; tag empty member and judge
  reviews as not_submitted
- Fail a single review whose review.json stays unfilled after the
  Step 2 retry instead of uploading the skeleton
- Retry and classify Responses API replies with status failed
- Report provider retries as they happen (Request.OnRetry) and log them
- Record every run of a runner for review cost, usage and duration,
  failed attempts and the Step 2 retry included; ship debug bundles
  from one place, honoring --debug-upload for panel members and judge
- Reject debug uploads for unknown projects before reading the body,
  clip metadata fields, and keep implausible costs out of the metrics
- End grace rounds after two rounds of refused tool calls
- Validate --max-rounds against the runner-profile bounds
- Turn off Claude Code auto-memory in review runs; force formatter and
  LSP off inside an operator's OPENCODE_CONFIG_CONTENT
- Record the codex run duration; time CLI subprocesses in runExec
- Log panel members, member labels, direct rounds, notices, resolved
  model ids and run cost
- Clip strings on rune boundaries with one shared helper
- Apply go fix (any, strings.SplitSeq, wg.Go, new(v))
- Strip reviewctl and GitLab CI secrets from the env of runner CLIs
  and git, and run git on the checkout without hooks or fsmonitor
- Classify codex/opencode failures from their error text (billing,
  auth, rate limit); billing wording now wins over the HTTP status
- Retry OpenAI transport errors, classify undecodable error bodies
  by HTTP status
- Fix double-counted run metrics when the review was created before
  an md upload failed: the debug bundle now carries the review id
- Ship a debug bundle for a panel's own failure under the "panel"
  runner label
- Apply the profile's maxRounds unless --max-rounds or
  REVIEW_MAX_ROUNDS is set; let a second signal end reviewctl
- Serve debug artifacts only as JSON or sandboxed plain text, mask
  the project key in logs and errors, 503 on a failed project lookup
- Warn when OPENCODE_CONFIG_CONTENT can't be merged
- Skip gateway profiles (own apiBaseURL) in the retired-models patch
- Update reviewctl docs for stream-json and the RPC config flow
- Pin v2.13.2 in the lint workflow and Makefile: CI's v2.12.2
  flagged goconst repeats and the //go:fix directive that the
  local v2.13.2 passes cleanly
- Upload every member when the judge fails or can't start, so each
  completed run is counted; report a judge that never started
- Keep --max-rounds / REVIEW_MAX_ROUNDS over panel member and judge
  profiles
- Mask the project key in the access log, RPC param logs, Sentry
  events, reviewctl logs and upload transport errors
- Keep a failed Step 2 retry's own reason (cancelled, timeout,
  billing) instead of reporting not_submitted
- Run runner CLIs in their own process group: SIGTERM it on cancel,
  kill leftovers after exit, bound pipe waits with WaitDelay; handle
  SIGHUP in reviewctl
- Skip Slack notifications for member reviews
- Test the decompressed artifact size limit at its boundary
@sergeyfast
sergeyfast merged commit 67126a7 into master Sep 24, 2026
4 checks passed
@sergeyfast
sergeyfast deleted the feat/v0.3.2 branch September 24, 2026 18:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant