⚠️ Breaking changes and upgrade notes
- Host-only settings: Repository
.pr_agent.tomlfiles can no longer override GitHub pacing and retry settings (github.seconds_between_requests,github.seconds_between_writes,github.api_retries,github.ratelimit_retries),config.num_retries,azure_devops_server.agent_identity, custom-label settings (config.enable_custom_labelsand[custom_labels]), orpr_code_suggestions.max_number_of_calls.config.num_retriesis capped at 10. Per-directory.pr_agent.tomlfiles also cannot setpr_code_suggestions.dual_publishing_score_threshold. Move values you rely on to host configuration. (#4445, #4475, #4485, #4632, #4745) - Comment arguments:
config.ai_timeoutandpr_code_suggestions.max_number_of_callscan no longer be set through command comments. (#4445) - Removed no-op settings:
pr_code_suggestions.approve_pr_on_self_reviewandpr_code_suggestions.fold_suggestions_on_self_revieware removed from the shipped configuration. PR-Agent warns if they remain set; they never changed/improvebehavior. (#4598) - Custom provider integrations: Unused provider methods and capability names were removed. Review #4691 if a custom provider calls those internal methods.
- Auto-approval:
config.enable_auto_approvalis now host-only. The auto-approval path remains disabled in this release. (#4700)
🔐 Trusted Publishing
PyPI releases now use PyPI Trusted Publishing through GitHub Actions OIDC and produce package attestations. The release workflow rejects commits that are not reachable from main. (#3909)
🚀 Features
- feat(push_outputs): select tools and deliver Ask answers by @PeterDaveHello in #4739
- feat(cli): enable JSON output for plain-diff describe and improve by @PeterDaveHello in #4730
- feat(i18n): localize improve summaries and empty states by @PeterDaveHello in #4731
- feat(config): add protected host system instructions by @Evhye38496 in #4716
- feat(i18n): translate the fixed text of the /review comment into response_language by @AdelFetner in #4684
- feat: add Microsoft Teams output sink by @utsab345 in #4630
- feat(repo-context): expand @path imports by @utsab345 in #4620
- feat(review): include commit messages in /review and /improve prompts by @abhiramshaji-cyber in #4603
- feat(scripts): link config reference sections to their docs pages by @mirzasnowy in #4596
- feat(doctor): check configured output destinations by @oleksii-tumanov in #4541
- feat(config): identify keys absent from shipped declarations by @oleksii-tumanov in #4505
- feat(litellm): add per-PR session ids by @utsab345 in #4503
- feat(models): support Kimi K3 / K3.1 Pro and bypass temperature parameter by @JI4JUN in #4515
- feat(review): add an opt-in deterministic structural-reach row by @moinerus in #4421
- feat: support Amazon Bedrock guardrails on the Converse route by @luisrviz in #4420
- feat: configure improve failure comments by @utsab345 in #4426
- feat(models): add Claude Sonnet 5.5 and Haiku 5.5 support by @montss in #4360
- feat(model-routing): support a patch character limit by @oleksii-tumanov in #4376
- feat(github-action): stop the runner on a failed key check by @Yoel-qin in #4325
🐛 Bug Fixes
-
[Bug] Prefetch review diff outside the event loop by @askarshabdanov1-collab in #4403
-
fix(ci): Restrict releases to main and attest PyPI packages by @oleksii-tumanov in #3909
-
fix(config): keep dual_publishing_score_threshold out of per-directory settings by @shu-chen-dot-ca in #4745
-
fix(gitea): build file links for AGit-flow PRs from the head SHA by @Yi-111-a in #4744
-
fix(plain-diff): strip terminal controls from Markdown output by @jiangjiang248 in #4738
-
fix(github): keep suggestions just outside a hunk instead of dropping them by @ylcn91 in #4734
-
fix(servers): parse string-valued boolean settings in webhook servers by @ylcn91 in #4735
-
fix: pin auto-approval to the reviewed head and make enable_auto_approval host-only by @wanjinhao1 in #4700
-
fix(improve): reuse persistent summaries when history is disabled by @PeterDaveHello in #4717
-
fix(servers): honor disabled string-valued push triggers by @PeterDaveHello in #4720
-
fix(output): preserve stdout JSON on restricted encodings by @PeterDaveHello in #4719
-
fix(doctor): keep the report when stdout cannot encode it by @Bortlesboat in #4714
-
fix(security): reject host-only and forbidden keys written with whitespace around the section dot by @Yi-111-a in #4686
-
fix(push_outputs): require exact channel names by @PeterDaveHello in #4705
-
fix(gitlab): ignore unified-diff file headers in per-file line counts by @zhengqiuyang in #4651
-
fix(github): support GitHub Enterprise Cloud data residency (*.ghe.com) by @alexjansons in #4688
-
fix(providers): build help_docs links from the whole repo URL by @Xch4rt in #4687
-
fix(review): preserve distinct ticket identities across chunks by @rudycelekli in #4662
-
fix(improve): preserve literal data in already aligned replacements by @rudycelekli in #4674
-
fix(diff): keep negative context settings from corrupting hunk counts by @rudycelekli in #4680
-
fix(usage): reject negative and boolean token counts by @rudycelekli in #4664
-
fix(describe): retain files when unused optional summaries are malformed by @rudycelekli in #4676
-
fix(improve): retain suggestions with quoted or unusable length caps by @rudycelekli in #4681
-
fix(add_docs): validate model anchors and placement before insertion by @rudycelekli in #4677
-
fix(doctor): align endpoint and key checks with model routing by @PeterDaveHello in #4570
-
fix(bitbucket): preserve significant spaces in rename paths by @rudycelekli in #4682
-
fix(action): write Unicode outputs using UTF-8 by @rudycelekli in #4663
-
fix(diff): preserve Git line boundaries in supplied diff parsing by @rudycelekli in #4668
-
fix(azure): preserve physical lines in suggestion ranges and reconciliation by @rudycelekli in #4672
-
fix(azure): keep the suggestion fence in inline /improve threads by @Chebaleomkar in #4659
-
fix(review): keep invalid chunk scores out of conservative reduction by @rudycelekli in #4669
-
fix(routing): skip overflowing model limits by @rudycelekli in #4667
-
fix: keep an unpaired backtick literal in replace_code_tags by @kevin9327 in #4679
-
fix(tickets): offload blocking ticket reads by @PeterDaveHello in #4658
-
fix(action): skip duplicate first-open review requests by @Aschenbath in #4654
-
fix(bitbucket): decode raw file contents as UTF-8 by @tanishqbaweja in #4648
-
fix(describe): strip whitespace from type items before schema validation by @mirzasnowy in #4647
-
fix: scope response language instructions to each command by @PeterDaveHello in #4645
-
fix(jira): accept Jira Cloud project keys that contain digits by @tanishqbaweja in #4646
-
fix: retry truncated responses before publishing tool results by @PeterDaveHello in #4640
-
fix(diff): preserve complete filenames in compressed metadata by @PeterDaveHello in #4639
-
fix(azure): preserve encoded PR names in published links by @Aschenbath in #4637
-
fix(labels): remove labels left out of the set on Gitea by @tanishqbaweja in #4628
-
fix: protect custom labels from repo overrides by @utsab345 in #4632
-
fix(gerrit): keep credentials out of child arguments by @utsab345 in #4569
-
fix(labels): remove labels left out of the set on Azure DevOps by @tanishqbaweja in #4618
-
fix: deprecate no-op self-review marker keys by @utsab345 in #4598
-
fix(azure): resolve agent identity for persistent reviews by @dellch in #4613
-
fix: align config comments and large patch fallback by @utsab345 in #4593
-
fix(bitbucket-server): find the projects/users segment by its position in the PR URL by @tanishqbaweja in #4563
-
fix(github-action): allow static commands without model keys by @PeterDaveHello in #4583
-
fix(structural-reach): preserve imports for blobs shared across languages by @oleksii-tumanov in #4579
-
fix(improve): retry truncated suggestion responses by @PeterDaveHello in #4582
-
fix(ci): preserve the test image cache after smoke builds by @PeterDaveHello in #4610
-
fix: exclude NuGet and Swift lockfiles from analysis by @PeterDaveHello in #4608
-
fix: include Gradle build scripts in default analysis by @PeterDaveHello in #4600
-
fix: align config comments and gitlab bot log by @utsab345 in #4592
-
fix(ask): keep inline diff reads off the event loop by @PeterDaveHello in #4601
-
fix: match patch_extension_skip_types regardless of case by @RagedPanda in #4605
-
fix(improve): preserve const-to-let reassignment suggestions by @PeterDaveHello in #4607
-
fix(gitlab): skip webhook events from ignored user IDs by @sarankumar1325 in #4562
-
fix: filter generated suffixes regardless of case by @oleksii-tumanov in #4572
-
fix(plain-diff): preserve the default title in describe output by @PeterDaveHello in #4571
-
fix(gitlab): handle single-line /ask diff notes by @PeterDaveHello in #4568
-
fix(describe): tolerate mixed category list values by @PeterDaveHello in #4578
-
fix(tools): remove unmatched closing rows from HTML tables by @PeterDaveHello in #4576
-
fix(polling): preserve queued work when marking another notification fails by @PeterDaveHello in #4567
-
fix(improve): honor publish_output when reconciling suggestion threads by @PeterDaveHello in #4566
-
fix(yaml): preserve reviews with unicode separators by @awais-ur-rehman in #4555
-
fix: ignore bot push commits in github app by @utsab345 in #4558
-
fix: align suggestions score threshold default by @utsab345 in #4559
-
fix(review): retry truncated model completions before publishing by @PeterDaveHello in #4533
-
fix(providers): validate suggestion line ranges in Gerrit, Gitea and CodeCommit by @TheNetherWatcher in #4520
-
fix(github-action): fail when the required GitHub token missing by @PeterDaveHello in #4544
-
fix(review): render split themes without GFM by @oleksii-tumanov in #4542
-
fix: clarify unresolved token limits and guard model budgets by @PeterDaveHello in #4539
-
fix(polling): preserve command text after repeated bot mentions by @PeterDaveHello in #4540
-
fix(doctor): apply the ambient-auth exemption to the doctor key check by @Kiddo4993 in #4536
-
fix(ignore): drop a non-list ignore setting instead of disabling every rule by @RagedPanda in #4510
-
fix(review): drop look-alike structural_reach keys and skip malformed tsconfig files by @RagedPanda in #4522
-
fix(gitlab): request max page size for full lists by @utsab345 in #4517
-
fix(add_docs): keep local failures out of review.md by @utsab345 in #4516
-
fix(providers): classify GitLab and Gitea URLs by path segment by @RagedPanda in #4509
-
fix(providers): include filtered filenames in local review context by @oleksii-tumanov in #4504
-
fix(labels): report label read and publication failures by @oleksii-tumanov in #4502
-
fix(github): avoid rebuilding diffs from failed content reads by @PeterDaveHello in #4473
-
fix(providers): share LF-based diff line counting by @PeterDaveHello in #4489
-
fix(deps): Replace deprecated Uvicorn workers in Gunicorn service images by @PeterDaveHello in #4491
-
fix(bitbucket): reject invalid diffstat line counts by @PeterDaveHello in #4490
-
fix(github): classify issue and pull request URLs by path by @PeterDaveHello in #4486
-
fix(similar_issue): stop embedding fallback on access errors by @PeterDaveHello in #4497
-
fix(improve): match const and let as whole words by @PeterDaveHello in #4499
-
fix(azure_devops): make azure_devops_server.agent_identity host-only by @itsvrushabh in #4485
-
fix: keep valid ignore rules when a pattern has the wrong type by @Aschenbath in #4484
-
fix(servers): disable_auto_feedback stops push and review commands too by @MilkteaTW1 in #4461
-
fix(local): stop failed /improve and /describe from overwriting review.md by @YokoAC in #4483
-
fix: move describe and improve diff fetch off event loop by @utsab345 in #4462
-
fix: cap config.num_retries and keep host only by @utsab345 in #4475
-
fix(improve): only update comments authored by the agent by @Aschenbath in #4330
-
fix(deps): Update certifi to 2026.10.23 to drop distrusted roots by @PeterDaveHello in #4478
-
fix(packaging): honor the declared uv version requirement by @PeterDaveHello in #4474
-
fix(telemetry): mark recorded tool errors as command span errors by @PeterDaveHello in #4477
-
fix(describe): preserve large PR file walkthrough format by @PeterDaveHello in #4432
-
fix(github-action): honor PR ignore policy for automatic tools by @PeterDaveHello in #4471
-
fix(describe): use provider head SHA in marker headers by @PeterDaveHello in #4467
-
fix(improve): preserve Git line boundaries in code suggestions by @PeterDaveHello in #4472
-
fix: merge section-level comment args into the section instead of replacing it by @mirzasnowy in #4458
-
fix(settings): declare the Bitbucket push settings and document the Server switch by @MilkteaTW1 in #4457
-
fix(settings): declare app_key under [bitbucket] in secrets template by @vishalkaay in #4459
-
fix: use model_dump in prepare_logs to avoid pydantic dict deprecation by @mirzasnowy in #4456
-
fix: load tiktoken files bundled with LiteLLM so token counting works… by @luisrviz in #4423
-
fix(similar_issue): migrate deprecated Pydantic Config to ConfigDict by @itsvrushabh in #4447
-
fix(security): make pacing and retry settings host-only by @utsab345 in #4445
-
fix(litellm): make the handler the only retry layer by @dodoshell in #4425
-
fix: publish empty improve results in GitHub workflow by @ofir-frd in #4442
-
fix(config): share boolean parsing across command entry points by @PeterDaveHello in #4438
-
fix(similar_issue): enforce embedding model token limits by @PeterDaveHello in #4437
-
fix(gitlab): record the head used by the reviewed diff by @PeterDaveHello in #4431
-
fix(add-docs): preserve Git line numbers in source anchors by @PeterDaveHello in #4435
-
fix: enforce tiny skills token budgets by @utsab345 in #4415
-
fix(improve): handle quoted integer impact thresholds by @PeterDaveHello in #4399
-
fix(gitlab): publish validated suggestions from patch-only files by @PeterDaveHello in #4428
-
fix: only use static AWS fallback for auth errors by @pei711 in #4414
-
fix(gerrit): preserve commit-message Jira context by @oleksii-tumanov in #4416
-
fix(improve): retry malformed suggestion responses with fallback models by @PeterDaveHello in #4408
-
fix(github-action): skip ignored comments before repo setup by @PeterDaveHello in #4406
-
fix(describe): preserve title and labels in structured outputs by @PeterDaveHello in #4405
-
fix(describe): retain fallback entries in file walkthroughs by @PeterDaveHello in #4402
-
fix(add-docs): skip suggestions without the original source line by @PeterDaveHello in #4401
-
fix(diff): exclude metadata from inline comment anchors by @PeterDaveHello in #4398
-
fix: skip GitHub merge commits in incremental reviews by @utsab345 in #4371
-
fix(providers): reset the whole diff state between auto commands by @Yoel-qin in #4373
-
fix(improve): retry unusable self-reflection feedback by @PeterDaveHello in #4377
-
fix(improve): don't state identifiers that aren't visible in the diff as fact by @ira-at-work in #4223
-
fix: reject invalid webhook body sizes by @utsab345 in #4388
-
fix(telemetry): isolate direct Prometheus runs by @oleksii-tumanov in #4380
-
fix(review): preserve prose TODO findings across chunks by @PeterDaveHello in #4384
-
fix(review): include commit context in contribution-time estimates by @oleksii-tumanov in #4381
-
fix(describe): handle nullable description output by @PeterDaveHello in #4382
-
fix(review): retain partial compliance in ticket summaries by @PeterDaveHello in #4383
-
fix(review): preserve effort labels without a valid replacement by @PeterDaveHello in #4378
-
fix(help): retry unusable structured answers with fallback models by @PeterDaveHello in #4365
-
fix: preserve quoted headers in user descriptions by @oleksii-tumanov in #4358
⚡ Performance
- perf(ask_line): offload review history reads by @PeterDaveHello in #4728
- perf(gitlab): batch verified MR file content reads by @PeterDaveHello in #4718
- perf(review): keep diff preparation off the event loop by @PeterDaveHello in #4721
- perf(gitlab): skip redundant notes reads in inline deduplication by @PeterDaveHello in #4661
- perf(github-action): reuse provider across commands with fresh PR state by @PeterDaveHello in #4580
- perf(github): prefetch diff file contents via GraphQL with REST fallback by @PeterDaveHello in #4581
- perf(github): avoid duplicate comment reads for short threads by @PeterDaveHello in #4602
- perf(providers): reuse latest commit URLs within a command by @PeterDaveHello in #4577
- perf(tools): reuse request-scoped providers in manual commands by @PeterDaveHello in #4430
- perf(tools): remove unused initial token handlers by @PeterDaveHello in #4545
- perf(tools): keep manual diff preparation off the event loop by @PeterDaveHello in #4538
- perf(tickets): skip sub-issue queries for known-empty issues by @PeterDaveHello in #4537
- perf(review): split only the requested source excerpt by @PeterDaveHello in #4498
- perf(models): skip tokenizing uncached user prompts by @PeterDaveHello in #4494
- perf(improve): count file lines without allocating split strings by @PeterDaveHello in #4493
- perf(github): reuse repository objects for differently cased URLs by @PeterDaveHello in #4492
- perf(similar_issue): stop fetching comments after the selected match by @PeterDaveHello in #4488
- perf(gitlab): fetch merge request comments in larger pages by @PeterDaveHello in #4487
- perf(tools): remove unused TokenHandler setup from four commands by @PeterDaveHello in #4496
- perf(docker): preserve dependencies across docs changes by @PeterDaveHello in #4469
- perf(tests): skip files without referenced names by @PeterDaveHello in #4468
- perf(tickets): skip redundant empty-ticket budget evaluation by @PeterDaveHello in #4434
- perf(diff): avoid splitting unused head file tails by @PeterDaveHello in #4439
- perf(improve): avoid repeatedly serializing suggestion thread context by @PeterDaveHello in #4433
- perf(gitlab): skip parent reads for expanded submodule files by @PeterDaveHello in #4436
- perf(labels): skip publishing unchanged label sets by @PeterDaveHello in #4429
- perf(tests): use literal checks for quoted configuration keys by @PeterDaveHello in #4427
- perf(gitea): skip deleted-file head reads by @oleksii-tumanov in #4417
- perf(diff): stop preparing chunks after reaching the call limit by @PeterDaveHello in #4404
- perf(diff): render whole-file additions and deletions directly by @PeterDaveHello in #4400
- perf(azure): skip history without an incremental anchor by @oleksii-tumanov in #4375
- perf(context): bound instruction rendering to retained lines by @PeterDaveHello in #4366
- perf(help-docs): bound memory when reading documentation by @PeterDaveHello in #4367
- perf(tickets): reuse issue reads during ticket extraction by @PeterDaveHello in #4363
- perf(similar-issue): request only required result fields by @PeterDaveHello in #4364
- perf: skip truncation when commands require the full diff by @oleksii-tumanov in #4362
- perf(gitea): skip raw diff for nonreviewable files by @oleksii-tumanov in #4361
- perf(bitbucket): skip OAuth setup for ignored webhook events by @oleksii-tumanov in #4357
📚 Documentation
-
docs: simplify compatible provider setup by @copilot-swe-agent[bot] in #4441
-
docs: correct configuration and usage guidance by @PeterDaveHello in #4722
-
docs(readme): add linked release and project status badges by @PeterDaveHello in #4584
-
docs: clarify doctor CLI entry point on service Docker images by @Yi-111-a in #4701
-
docs: clarify doctor command in service images by @dajiaohuang in #4641
-
docs: correct CLI example and section boundaries by @PeterDaveHello in #4643
-
docs: describe config keys and push trigger scope by @utsab345 in #4594
-
docs: shorten long configuration descriptions by @utsab345 in #4597
-
docs: align documentation with implementation by @utsab345 in #4557
-
docs(platforms): align provider matrix with implementation by @utsab345 in #4524
-
docs: document config.num_retries for rate-limit handling by @HarshRajSinghania in #4194
-
docs: add APIClaw to changing_a_model by @ankita37105 in #4355
-
docs: add a Runcrate section to changing_a_model by @heydryft in #4374
🧹 Maintenance
-
test(config): record the keys PR comments can override by @atishay-kasliwal in #4706
-
test: exercise real lockfile filtering in provider diff tests by @PeterDaveHello in #4609
-
test: clean up SyntaxWarning escape sequences and PytestRemovedIn10Warning by @itsvrushabh in #4482
-
ci: cancel superseded pull request test runs by @PeterDaveHello in #4466
-
refactor: one command registry so aliases behave the same in every entry point by @SpinachDigital in #4727
-
chore(deps): bump oauthlib from 4.0.0 to 4.0.1 by @dependabot[bot] in #4709
-
chore: remove helpers only their own tests called by @Goldloli in #4692
-
chore(providers): remove unused provider methods by @utsab345 in #4691
-
chore(deps): update webpack-dev-server in docs/ via npm audit fix by @PeterDaveHello in #4660
-
chore(deps): bump the python-minor-and-patch group with 15 updates by @dependabot[bot] in #4635
-
chore(deps): exclude litellm from Python groups by @utsab345 in #4633
-
chore(ci): bump astral-sh/setup-uv from 10.3.2 to 10.3.3 in the actions-minor-and-patch group by @dependabot[bot] in #4616
-
chore(docker): bump python from
b347e2dto35caba8in /docker by @dependabot[bot] in #4615 -
refactor(code-suggestions): move replacement helpers into algo/code_replacement by @ira-at-work in #4393
-
chore(deps): bump joi from 17.13.8 to 17.13.9 in /docs by @dependabot[bot] in #4573
-
chore(deps): bump pyasn1 from 0.6.4 to 0.6.5 by @dependabot[bot] in #4575
-
chore(deps): bump follow-redirects from 1.16.1 to 1.16.2 in /docs by @dependabot[bot] in #4574
-
chore: bump pytest to 9.2.0 and ruff to 0.17.3, fix tests by @even-even in #4543
-
refactor(providers): share the get_languages percentage helper by @TheNetherWatcher in #4521
-
refactor(deps): Reuse Tenacity for GitHub diffs and remove legacy retry by @PeterDaveHello in #4495
-
chore(deps): bump qs from 6.16.0 to 6.16.2 in /docs by @dependabot[bot] in #4479
-
refactor(tests): remove test smells from unit tests by @lizandrapinheiro in #4440
-
chore(deps): bump anthropic from 1.15.0 to 2.3.0 in the python-major group across 1 directory by @dependabot[bot] in #4419
-
chore(deps): bump postcss-selector-parser from 6.1.4 to 6.1.5 in /docs by @dependabot[bot] in #4418
-
chore: clean up settings file detection by @utsab345 in #4389
-
chore(ci): bump the actions-minor-and-patch group with 6 updates by @dependabot[bot] in #4410
-
chore(deps): Update boto3 and botocore to 1.43.118 by @PeterDaveHello in #4379
-
chore: remove fixable list ruff rules by @even-even in #4359
⬆️ Dependencies
- chore(deps): bump oauthlib from 4.0.0 to 4.0.1 by @dependabot[bot] in #4709
- chore(deps): bump the python-minor-and-patch group with 15 updates by @dependabot[bot] in #4635
- chore(ci): bump astral-sh/setup-uv from 10.3.2 to 10.3.3 in the actions-minor-and-patch group by @dependabot[bot] in #4616
- chore(docker): bump python from
b347e2dto35caba8in /docker by @dependabot[bot] in #4615 - chore(deps): bump joi from 17.13.8 to 17.13.9 in /docs by @dependabot[bot] in #4573
- chore(deps): bump pyasn1 from 0.6.4 to 0.6.5 by @dependabot[bot] in #4575
- chore(deps): bump follow-redirects from 1.16.1 to 1.16.2 in /docs by @dependabot[bot] in #4574
- chore(deps): bump qs from 6.16.0 to 6.16.2 in /docs by @dependabot[bot] in #4479
- chore(deps): bump anthropic from 1.15.0 to 2.3.0 in the python-major group across 1 directory by @dependabot[bot] in #4419
- chore(deps): bump postcss-selector-parser from 6.1.4 to 6.1.5 in /docs by @dependabot[bot] in #4418
- chore(ci): bump the actions-minor-and-patch group with 6 updates by @dependabot[bot] in #4410
Full Changelog: v0.49.0...v0.50.0