Changelog

What changed in V12, newest first.

October 2026

  1. API changes - status changes without reasons, Steers without revisions

    The REST API stays at /api/v2 and the MCP server at /api/mcp. These changes apply to REST, MCP and the CLI alike; check any client that validates responses strictly or still sends a reason with a status change.

    Improved

    • Runs name their repository's slug. GET /runs, GET /runs/{run} and the run start and cancel responses now carry slug on the run's repository and on each of its repositories. CLI 1.2 requires it, so update with npm install -g @v12sh/cli before you use v12 runs. A client that checks responses against a fixed list of fields must accept the new one.
    • A failed GitHub request answers 503. upstream_error now returns HTTP 503 instead of 502, so a client that retries only on 502 must retry on 503 too. See Errors.
    • Push credentials check the branch name. The branch must be a valid Git branch name; a name Git refuses, such as a..b, one that starts with -, or one that ends in .lock, now gets 400.

    Removed

    • Reasons on status changes. PATCH /findings, PATCH /findings/{finding} and the update_findings tool refuse reason with 400 invalid_request, and v12 findings status no longer takes --reason. Stop sending it; to say why, comment on the finding. See Triage the inbox.
    • Reasons in finding responses. A finding's decision is now { "kind": ... } without reason, and the assessed, marked-fixed and marked-present entries in its activity have no reason. Reasons recorded earlier are no longer returned. A client that requires these fields must stop requiring them; CLI 1.1 and older do, so update with npm install -g @v12sh/cli. See Findings.
    • Steer events in a finding's activity. A changed entry no longer has steer as its field, and a decision change carries the decision kind as its value. A client that switches on field can drop its steer case. See the REST reference.
    • Steer revisions. revision is gone from Steers and from the Steers a run carried, and steerRevisions from a run estimate. A run still keeps every Steer document as it was when the run started. See Steers.
  2. Scheduled reviews, Steer management and zip exports

    New

    • Scheduled reviews. An Autopilot rule can now review a branch daily or weekly, covering either what changed since the last review or the whole branch. See Scheduled reviews.
    • Archive and restore Steers. Archiving takes a Steer out of new runs and detaches it from Autopilot rules; restoring makes it available again. See Archive or restore a Steer.
    • Manage Steers from the CLI, REST API and MCP. Create, edit, archive and restore Steers with v12 steers or the create_steer, update_steer, archive_steer and restore_steer tools. These writes need the opt-in steers:write scope, shown as Manage Steers on an API key. See Manage Steers and the MCP tools.
    • Export findings as Markdown. The inbox export is now a zip with one Markdown file per finding, including its proof of concept and proposed fix, and it replaces the CSV export. Guests of a shared link can export what they see. See Export findings.
    • Send feedback from an MCP client. The send_feedback tool reports a bug, a missing feature or a confusing result to the V12 team. See Send feedback.

    Improved

    • The triage controls on a finding page now also appear in a narrow window, beneath the finding title. See Triage findings.

    Fixed

    • Runs on Foundry projects whose foundry.toml sets a very large integer, such as gas_limit = 9223372036854775807, no longer fail while V12 prepares the repository.

    Removed

    • Dismissing findings. The Dismissed view, Dismiss from inbox and the v12 findings dismiss and restore commands are gone; triage by status, severity and assignee is unchanged. See Triage findings.
    • Finding status on public run reports. A report now lists each finding's title, severity and repository. See Public run reports.