v2.24.0

Added

  • A provider “prompt too long” rejection now skips the review (#1056). The pre-flight estimate can be too low. Before, the provider rejected the prompt with an HTTP 400, every agent failed, and the comment said “0 findings, 2 failed agents”. Now the engine stops and posts a skip comment that names the agent, the model, and AI_EXCLUDE_PATTERNS. The comment also carries the analyzer and SARIF findings, and the run does not advance the watermark. AI_FAIL_ON_CONTEXT_WINDOW=true makes this skip exit with code 2. With AI_FAIL_ON_FINDINGS=true this skip also exits with code 2, because no agent reviewed the PR. That is the same exit code as the failed run had before. Only the Anthropic message text is matched, and only for the Anthropic provider. The pr-summarizer, the issue-linker, and the judge pass also continue when the provider rejects their prompt, so the main agents reach this skip. If only some agents are rejected, the review continues and the failed-agent note says so.
  • Bitbucket: the /ai-pr-review feedback [F<n>] <text> command (#933). The text is required and an F<n> is optional. The command uses the same authorization as false-positive and wont-fix. It writes to the learning-loop store only when AI_FEEDBACK_LOOP=true and AI_BITBUCKET_VERDICTS=true. See Slash commands and Bitbucket setup.
  • The COST_ESTIMATE log line ends with input= and output_cap= (#1055). Use them to see how much of the estimate is the worst-case output cap. The configuration page has a worked example. See Configuration.

  • A new analyzer, suppression-check (#1077). It flags a comment on an added line that turns off a security rule: noqa with an S code, nosec, nosemgrep, phpcs:ignore on a security sniff, eslint-disable on a security rule. It reports Medium. A workflow with an explicit analyzers allowlist must add suppression-check. See Static analyzers.
  • A crypto finding category (#1076). It covers weak hashes, weak randomness and insecure tokens. Bitbucket shows it as a VULNERABILITY annotation. See Static analyzers and Bitbucket setup.
  • A finding can carry impact and trigger (#1078). GitHub and GitLab comments and the review body show them before the remediation. Bitbucket annotations do not.
  • The code-reviewer checks that a value one function writes and another reads agrees (#1079). A cookie against a header, or a Bearer prefix that nobody strips, is the example.
  • A harness to measure a verifier that re-reads the code (#1082). It is a measurement tool and changes no review behavior.

Changed

  • Behavior change: a style or documentation finding no longer merges into a nearby security finding (#1074). A docs finding, and a finding that an analyzer marks as style only (a phpcs style sniff, a ruff formatting or naming code, an eslint formatting rule, a shellcheck or hadolint style finding), cluster only with style findings of their own category. A rule that finds a defect, such as ruff F821 or a ruff S security code, still merges with the agent finding for it. A finding counts as corroborated only when an analyzer and an agent describe the same kind of defect, so fewer findings show as corroborated. A finding that both reported but that is not corroborated shows the label analyzer and agent, not confirmed. The headline text of some clusters changes, so their fingerprints change once on open PRs.
  • Behavior change: phpcs sniffs in the Commenting, WhiteSpace, Formatting and NamingConventions categories are Low (#1075). A missing docblock was High. The other sniffs keep ERROR to High and WARNING to Medium.
  • Repeated semgrep findings of one rule roll up in each file (#1081). Two or more hits become one finding at the first line, with all the lines in its text. Only the first site gets an inline comment.
  • A destructive shell command that an empty argument can aim at / is Critical (#1080). chmod, chown and rm on $DIR/* with an unchecked argument, in a script that can run as root.
  • Behavior change: the severity icons are different shapes (#1037). Critical is ⛔, High is 🚨, Medium is 🔶, and Low is 💬. 🚨 meant Critical before and means High now. A review comment that was posted before the upgrade keeps its old icon until the next review rewrites it. No parser reads the icon. See Agents.
  • The also_reported notes are capped only when they are shown (#1047). The first 5 notes are shown, with a “(+N more from other analyzers)” line. The count is now correct when a cluster has more than 5 notes.
  • The example workflows pass approval-ceiling (#1064). vars.AI_REVIEW_APPROVAL_CEILING now reaches the action, so an organization-level variable covers every repository that copies the example.
  • The phpcs analyzer code is split (#1047). Behavior is unchanged. The security canary has a symlink case and a test with the real phpcs.