Repository navigation
Modular scope resolution for iOS/Android/web, refusal and crash fixes - #57
Merged
Merged
Conversation
- Fix scope depth tie that folded first-level modules (Swift packages, Gradle modules) into the root scope - Keep LLM scope boundaries when the root manifest is only a container - Pick manifests deterministically by priority; add Xcode, CocoaPods, XcodeGen, Tuist, Gradle settings, Deno, Nx, pnpm workspace, go.work - Extract Gradle namespace and Xcode project names as package names - Add review.max_concurrent_scopes cap for per-scope fan-out - Split RLM action steps locally so extraction-model commentary no longer reaches Opus (content_filter refusals) - Fall back to deterministic scopes when refinement fails; soft-fail the audit instead of aborting the review - Escape untrusted text printed through Rich markup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Modular repositories (iOS Swift packages, Android Gradle modules, web monorepos) are now reviewed one module per scope. Before this change, peaks-ios PR #3276 resolved to a single root scope
.with all 101 files. The PR also fixes the Bedrockcontent_filterrefusals and two crashes seen on that PR.Scope resolution
_assign_files): root.and first-level modules both had depth 0, and the tie-break put root first, so its empty prefix captured every file. Root now has depth 0 and other scopesslashes + 1. This affected every manifest one level below the root (e.g.SettingsFeature/,androidApp/)._apply_boundaries): a root manifest (e.g. a rootbuild.gradle.ktsorGemfile) dropped every boundary the LLM proposed. Boundaries are now dropped only inside a non-root manifest scope, or when the root manifest is the only one.Gemfileno longer wins overPeaks.xcodeproj.*.xcodeproj,*.xcworkspace,*.podspec,Podfile,project.yml(XcodeGen),Project.swift(Tuist)settings.gradle(.kts)deno.json(c),pnpm-workspace.yaml,project.json(Nx, only when the repo root hasnx.json)go.workbun.lock(b),deno.lock,Package.resolved,Podfile.lockproject.pbxproj. Only a change to the SwiftPM lock (Package.resolved) inside the bundle counts as a dependency change. No scopes are created inside the bundle directories.namespace. Xcode, podspec and Tuist projects use their project name.Concurrency
review.max_concurrent_scopes(default 8; envREVIEW_MAX_CONCURRENT_SCOPES, Action inputmax-concurrent-scopes). code_review, doc and supply_chain each limit how many scopes they review at once, MCP startup included.Refusals and resilience
reasoning, the block becomescode.nemotron-nano) sometimes wrote its own commentary intoreasoning, e.g. "I need to extract the reasoning and code…" (6 of 20 in testing).NEEDS_DISCUSSIONwith findings,APPROVEwithout.Crash fixes
[/{accountID}]raisedMarkupError, which hid the real error.Breaking changes
Peaks). Earlier memory stored under the old IDs is no longer recalled for those scopes. This is accepted, and no migration is planned.Known follow-ups
.xcworkspacemanifest path: when it is the chosen manifest, its path stays a directory, which supply_chain can't read. Point it atcontents.xcworkspacedata.Testing
tests/test_modular_scopes.py(19): iOS and Android layouts, manifest priority, Nx, LLM boundaries, parsers, concurrency cap, refinement and audit fallbackstests/test_rlm_action_split.py(6): the extraction model is never called for RLM steps, on both the sync and async pathstests/test_rich_markup_safety.py(2)main(cerebral, config_memory, doc_extractor and review_memories tests).ruff: no new findings in the changed files.