Commit 1b62f94
feat: competitive review pipeline improvements (#33)
* feat: add file triage, dynamic context boundaries, and robust LLM parsing
Phase 1 improvements to the review pipeline, informed by competitive analysis
of Greptile, CodeRabbit, and Qodo Merge architectures:
- File triage (#29): Heuristic classifier skips lock files, generated files,
deletion-only, whitespace-only, and comment-only changes before expensive
LLM review. 45 unit tests.
- Dynamic context boundaries (#25): Context fetcher now searches upward for
enclosing function/class definitions instead of using fixed-window context.
Uses asymmetric padding (more before, less after) matching Qodo's approach.
6 unit tests.
- Robust LLM output parsing (#28): 5-strategy fallback chain for parsing LLM
responses — primary format, numbered lists, markdown bullets, file:line
format, and JSON extraction. Prevents silent comment loss when models deviate
from the expected format. 11 unit tests.
- Fix rust-embed v8 derive macro (Embed -> RustEmbed)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add verification pass and multi-model routing
- Verification pass (#23): LLM validates review findings against actual code,
scoring 0-10 with auto-zero for noise (docstrings, type hints, imports).
Filters hallucinated comments before output. 17 new tests.
- Multi-model routing (#26): ModelRole enum (Primary/Weak/Reasoning/Embedding)
with per-role model config and fallback chain. 12 new tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add adaptive patch compression for large PRs (#30)
4-stage progressive degradation strategy for diffs exceeding token budget:
Stage 1 (Full): all diffs fit → use as-is
Stage 2 (Compressed): remove deletion-only hunks, drop tail files
Stage 3 (Clipped): truncate large files at hunk boundaries
Stage 4 (MultiCall): split into multiple batches (up to 5)
Integrated into review pipeline — files dropped by compression are
skipped with logging. 24 new tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address review pipeline false skips and UTF-8 safety
Prevent compression analysis from skipping files in per-file review mode, make verification diff truncation UTF-8 safe, and tighten comment-only triage to avoid dereference false positives while improving compression packing order.
Made-with: Cursor
* fix: rustfmt formatting and bump quinn-proto 0.11.14 (RUSTSEC-2026-0037)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: skip DiffScope self-review when API key not configured
Instead of failing the workflow, emit a notice and skip the review
and comment-posting steps when OPENAI_API_KEY is not set.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address Devin review feedback — triage false positives and embedding default
- `#` comment prefix: exclude Rust attributes (#[...], #![...]), C
preprocessor directives (#include, #define, etc.) from comment detection
- `generated/` match: use boundary-aware checks (starts_with or /generated/)
to avoid false positives on paths like `user_generated/`
- Embedding model default: fall back to primary model instead of hardcoding
OpenAI's text-embedding-3-small, respecting self-hosted provider support
- 4 new tests for the triage fixes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: wire ModelRole into verification pass, resolve clippy dead_code errors
Use the Weak model role for the verification pass — it's a validation
task that doesn't need the frontier model. This also resolves the
clippy dead_code errors for ModelRole, model_for_role, and
to_model_config_for_role by giving them their first real callsite.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>1 parent aa2f3c4 commit 1b62f94
File tree
12 files changed
+2602
-8
lines changed- .github/workflows
- src
- core
- parsing
- review
- server
12 files changed
+2602
-8
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
30 | 40 | | |
| 41 | + | |
31 | 42 | | |
32 | 43 | | |
33 | 44 | | |
34 | 45 | | |
35 | 46 | | |
36 | | - | |
| 47 | + | |
37 | 48 | | |
| 49 | + | |
38 | 50 | | |
39 | 51 | | |
40 | 52 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
7 | 25 | | |
8 | 26 | | |
9 | 27 | | |
| |||
29 | 47 | | |
30 | 48 | | |
31 | 49 | | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
32 | 66 | | |
33 | 67 | | |
34 | 68 | | |
| |||
303 | 337 | | |
304 | 338 | | |
305 | 339 | | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
306 | 344 | | |
307 | 345 | | |
308 | 346 | | |
| |||
869 | 907 | | |
870 | 908 | | |
871 | 909 | | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
| 925 | + | |
| 926 | + | |
872 | 927 | | |
873 | 928 | | |
874 | 929 | | |
| |||
1509 | 1564 | | |
1510 | 1565 | | |
1511 | 1566 | | |
| 1567 | + | |
| 1568 | + | |
| 1569 | + | |
| 1570 | + | |
| 1571 | + | |
| 1572 | + | |
| 1573 | + | |
| 1574 | + | |
| 1575 | + | |
| 1576 | + | |
| 1577 | + | |
| 1578 | + | |
| 1579 | + | |
| 1580 | + | |
| 1581 | + | |
| 1582 | + | |
| 1583 | + | |
| 1584 | + | |
| 1585 | + | |
| 1586 | + | |
| 1587 | + | |
| 1588 | + | |
| 1589 | + | |
| 1590 | + | |
| 1591 | + | |
| 1592 | + | |
| 1593 | + | |
| 1594 | + | |
| 1595 | + | |
| 1596 | + | |
| 1597 | + | |
| 1598 | + | |
| 1599 | + | |
| 1600 | + | |
| 1601 | + | |
| 1602 | + | |
| 1603 | + | |
| 1604 | + | |
| 1605 | + | |
| 1606 | + | |
| 1607 | + | |
| 1608 | + | |
| 1609 | + | |
| 1610 | + | |
| 1611 | + | |
| 1612 | + | |
| 1613 | + | |
| 1614 | + | |
| 1615 | + | |
| 1616 | + | |
| 1617 | + | |
| 1618 | + | |
| 1619 | + | |
| 1620 | + | |
| 1621 | + | |
| 1622 | + | |
| 1623 | + | |
| 1624 | + | |
| 1625 | + | |
| 1626 | + | |
| 1627 | + | |
| 1628 | + | |
| 1629 | + | |
| 1630 | + | |
| 1631 | + | |
| 1632 | + | |
| 1633 | + | |
| 1634 | + | |
| 1635 | + | |
| 1636 | + | |
| 1637 | + | |
| 1638 | + | |
| 1639 | + | |
| 1640 | + | |
| 1641 | + | |
| 1642 | + | |
| 1643 | + | |
| 1644 | + | |
| 1645 | + | |
| 1646 | + | |
| 1647 | + | |
| 1648 | + | |
| 1649 | + | |
| 1650 | + | |
| 1651 | + | |
| 1652 | + | |
| 1653 | + | |
| 1654 | + | |
| 1655 | + | |
| 1656 | + | |
| 1657 | + | |
| 1658 | + | |
| 1659 | + | |
| 1660 | + | |
| 1661 | + | |
| 1662 | + | |
| 1663 | + | |
| 1664 | + | |
| 1665 | + | |
| 1666 | + | |
| 1667 | + | |
| 1668 | + | |
| 1669 | + | |
| 1670 | + | |
| 1671 | + | |
| 1672 | + | |
| 1673 | + | |
| 1674 | + | |
| 1675 | + | |
| 1676 | + | |
| 1677 | + | |
| 1678 | + | |
| 1679 | + | |
| 1680 | + | |
| 1681 | + | |
| 1682 | + | |
| 1683 | + | |
| 1684 | + | |
| 1685 | + | |
| 1686 | + | |
| 1687 | + | |
| 1688 | + | |
| 1689 | + | |
| 1690 | + | |
| 1691 | + | |
| 1692 | + | |
| 1693 | + | |
| 1694 | + | |
| 1695 | + | |
| 1696 | + | |
| 1697 | + | |
| 1698 | + | |
| 1699 | + | |
| 1700 | + | |
| 1701 | + | |
| 1702 | + | |
| 1703 | + | |
| 1704 | + | |
| 1705 | + | |
| 1706 | + | |
| 1707 | + | |
| 1708 | + | |
1512 | 1709 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| |||
50 | 51 | | |
51 | 52 | | |
52 | 53 | | |
53 | | - | |
54 | | - | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
55 | 66 | | |
56 | 67 | | |
57 | 68 | | |
| |||
62 | 73 | | |
63 | 74 | | |
64 | 75 | | |
65 | | - | |
| 76 | + | |
66 | 77 | | |
67 | 78 | | |
68 | 79 | | |
| |||
330 | 341 | | |
331 | 342 | | |
332 | 343 | | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
333 | 366 | | |
334 | 367 | | |
335 | 368 | | |
| |||
0 commit comments