Skip to content

add readable multi-branch Qdrant aliases - #243

Merged
rostilos merged 5 commits into
mainfrom
feature/multi-branch-rag-index
Aug 10, 2026
Merged

add readable multi-branch Qdrant aliases#243
rostilos merged 5 commits into
mainfrom
feature/multi-branch-rag-index

Conversation

@rostilos

@rostilos rostilos commented Aug 7, 2026

Copy link
Copy Markdown
Owner
  • publish atomic aliases for primary and retained branch generations
  • preserve immutable generation aliases as the analysis source of truth
  • reconcile aliases for existing active indexes after deployment
  • serialize updates per branch while allowing different branches to run in parallel
  • retain backward-compatible project-level aliases
  • update RAG configuration and operator documentation
  • add Java and Python coverage for alias publication and reconciliation

- publish atomic aliases for primary and retained branch generations
- preserve immutable generation aliases as the analysis source of truth
- reconcile aliases for existing active indexes after deployment
- serialize updates per branch while allowing different branches to run in parallel
- retain backward-compatible project-level aliases
- update RAG configuration and operator documentation
- add Java and Python coverage for alias publication and reconciliation
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 213 files, which is 113 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2b7a0c7e-37e2-45f0-acff-4c5bd2750418

📥 Commits

Reviewing files that changed from the base of the PR and between 06553f3 and 6e829b0.

📒 Files selected for processing (213)
  • deployment/.env.sample
  • deployment/config/inference-orchestrator/.env.sample
  • deployment/config/java-shared/application.properties.sample
  • deployment/config/rag-pipeline/.env.sample
  • deployment/docker-compose.prod.yml
  • deployment/docker-compose.yml
  • java-ecosystem/libs/analysis-api/src/main/java/org/rostilos/codecrow/analysisapi/rag/RagOperationsService.java
  • java-ecosystem/libs/analysis-engine/src/main/java/org/rostilos/codecrow/analysisengine/aiclient/AiAnalysisClient.java
  • java-ecosystem/libs/analysis-engine/src/main/java/org/rostilos/codecrow/analysisengine/processor/analysis/BranchAnalysisProcessor.java
  • java-ecosystem/libs/analysis-engine/src/main/java/org/rostilos/codecrow/analysisengine/processor/analysis/PullRequestAnalysisProcessor.java
  • java-ecosystem/libs/analysis-engine/src/main/java/org/rostilos/codecrow/analysisengine/service/BranchArchiveService.java
  • java-ecosystem/libs/analysis-engine/src/main/java/org/rostilos/codecrow/analysisengine/service/branch/BranchAnalysisGateService.java
  • java-ecosystem/libs/analysis-engine/src/main/java/org/rostilos/codecrow/analysisengine/service/branch/BranchHealthService.java
  • java-ecosystem/libs/analysis-engine/src/test/java/org/rostilos/codecrow/analysisengine/aiclient/AiAnalysisClientTest.java
  • java-ecosystem/libs/analysis-engine/src/test/java/org/rostilos/codecrow/analysisengine/processor/analysis/BranchAnalysisProcessorTest.java
  • java-ecosystem/libs/analysis-engine/src/test/java/org/rostilos/codecrow/analysisengine/processor/analysis/PullRequestAnalysisProcessorTest.java
  • java-ecosystem/libs/analysis-engine/src/test/java/org/rostilos/codecrow/analysisengine/service/BranchArchiveServiceTest.java
  • java-ecosystem/libs/analysis-engine/src/test/java/org/rostilos/codecrow/analysisengine/service/branch/BranchAnalysisGateServiceTest.java
  • java-ecosystem/libs/commit-graph/pom.xml
  • java-ecosystem/libs/commit-graph/src/main/java/module-info.java
  • java-ecosystem/libs/commit-graph/src/main/java/org/rostilos/codecrow/commitgraph/model/AnalyzedCommit.java
  • java-ecosystem/libs/commit-graph/src/main/java/org/rostilos/codecrow/commitgraph/persistence/AnalyzedCommitRepository.java
  • java-ecosystem/libs/commit-graph/src/main/java/org/rostilos/codecrow/commitgraph/service/AnalyzedCommitService.java
  • java-ecosystem/libs/commit-graph/src/main/java/org/rostilos/codecrow/commitgraph/service/BranchCommitService.java
  • java-ecosystem/libs/commit-graph/src/main/java/org/rostilos/codecrow/commitgraph/service/CommitCoverageService.java
  • java-ecosystem/libs/commit-graph/src/test/java/org/rostilos/codecrow/commitgraph/service/BranchCommitServiceTest.java
  • java-ecosystem/libs/commit-graph/src/test/java/org/rostilos/codecrow/commitgraph/service/CommitCoverageServiceTest.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/dto/analysis/issue/IssueDTO.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/dto/project/ProjectDTO.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/branch/BranchIssue.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/codeanalysis/CodeAnalysisIssue.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/project/config/ProjectConfig.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/project/config/RagConfig.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagBranchIndex.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagBranchIndexGeneration.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagBranchIndexGenerationStatus.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagBranchIndexKind.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagBranchIndexLifecycleStatus.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagIndexOperation.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/model/rag/RagIndexOperationStatus.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/job/JobRepository.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/rag/RagBranchIndexGenerationRepository.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/rag/RagBranchIndexRepository.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/persistence/repository/rag/RagIndexOperationRepository.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/AnalysisJobService.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/CodeAnalysisService.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/IssueDeduplicationService.java
  • java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/JobService.java
  • java-ecosystem/libs/core/src/main/resources/db/migration/managed/V2.23.0__exact_branch_index_registry.sql
  • java-ecosystem/libs/core/src/main/resources/db/migration/managed/V2.24.0__scm_evidence_and_branch_analysis_scope.sql
  • java-ecosystem/libs/core/src/test/java/org/rostilos/codecrow/core/model/project/config/RagConfigTest.java
  • java-ecosystem/libs/core/src/test/java/org/rostilos/codecrow/core/model/rag/RagBranchIndexGenerationTest.java
  • java-ecosystem/libs/core/src/test/java/org/rostilos/codecrow/core/service/IssueDeduplicationServiceTest.java
  • java-ecosystem/libs/core/src/test/java/org/rostilos/codecrow/core/service/JobServiceTest.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/branch/BranchIndexBuildExecutorConfiguration.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/branch/BranchIndexGenerationBuildService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/branch/BranchIndexMaintenanceService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/branch/RagBranchOperatorAliasReconciliationService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/branch/RagIndexOperationRecoveryService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/branch/RagTransientBranchIndexCleanupService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/client/RagPipelineClient.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/service/IncrementalRagUpdateService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/service/RagBranchIndexRegistryService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/service/RagOperationsServiceImpl.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/service/VcsRagIndexingService.java
  • java-ecosystem/libs/rag-engine/src/main/java/org/rostilos/codecrow/ragengine/source/RepositorySourceTreeIdentity.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/branch/BranchIndexGenerationBuildServiceTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/branch/RagBranchOperatorAliasReconciliationServiceTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/branch/RagIndexOperationRecoveryServiceTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/branch/RagTransientBranchIndexCleanupServiceTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/client/RagPipelineClientTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/service/IncrementalRagUpdateServiceTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/service/RagBranchIndexRegistryServiceTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/service/RagOperationsServiceImplTest.java
  • java-ecosystem/libs/rag-engine/src/test/java/org/rostilos/codecrow/ragengine/source/RepositorySourceTreeIdentityTest.java
  • java-ecosystem/libs/scm-evidence/pom.xml
  • java-ecosystem/libs/scm-evidence/src/main/java/module-info.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/api/AnalysisReceiptView.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/api/CommitEvidenceView.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/api/IssueProvenance.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/api/PromotionPlan.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/config/ScmEvidenceAutoConfiguration.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/model/ScmAddedLineEvidence.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/model/ScmAnalysisReceipt.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/model/ScmCommitEvidence.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/persistence/ScmAddedLineEvidenceRepository.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/persistence/ScmAnalysisReceiptRepository.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/persistence/ScmCommitEvidenceRepository.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/service/PatchIdentity.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/service/ScmEvidenceService.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/service/ScmPromotionPlanner.java
  • java-ecosystem/libs/scm-evidence/src/main/java/org/rostilos/codecrow/scmevidence/service/UnifiedDiffAddedLineParser.java
  • java-ecosystem/libs/scm-evidence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • java-ecosystem/libs/scm-evidence/src/test/java/org/rostilos/codecrow/scmevidence/config/ScmEvidenceAutoConfigurationTest.java
  • java-ecosystem/libs/scm-evidence/src/test/java/org/rostilos/codecrow/scmevidence/service/ScmEvidenceServiceTest.java
  • java-ecosystem/libs/scm-evidence/src/test/java/org/rostilos/codecrow/scmevidence/service/ScmPromotionPlannerTest.java
  • java-ecosystem/libs/scm-evidence/src/test/java/org/rostilos/codecrow/scmevidence/service/UnifiedDiffAddedLineParserTest.java
  • java-ecosystem/libs/vcs-client/src/main/java/org/rostilos/codecrow/vcsclient/github/actions/CommentOnPullRequestAction.java
  • java-ecosystem/libs/vcs-client/src/main/java/org/rostilos/codecrow/vcsclient/github/actions/GetPullRequestDiffAction.java
  • java-ecosystem/libs/vcs-client/src/test/java/org/rostilos/codecrow/vcsclient/github/actions/CommentOnPullRequestActionTest.java
  • java-ecosystem/libs/vcs-client/src/test/java/org/rostilos/codecrow/vcsclient/github/actions/GetPullRequestDiffActionTest.java
  • java-ecosystem/mcp-servers/vcs-mcp/src/main/java/org/rostilos/codecrow/mcp/McpStdioServer.java
  • java-ecosystem/mcp-servers/vcs-mcp/src/main/java/org/rostilos/codecrow/mcp/McpTools.java
  • java-ecosystem/mcp-servers/vcs-mcp/src/test/java/org/rostilos/codecrow/mcp/McpToolsSourceWindowTest.java
  • java-ecosystem/pom.xml
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/bitbucket/webhookhandler/BitbucketCloudBranchWebhookHandler.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/config/AsyncConfig.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/generic/controller/ProviderPipelineActionController.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/generic/controller/RagIndexingController.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/generic/processor/PipelineActionProcessor.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/generic/processor/WebhookAsyncProcessor.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/generic/service/PipelineJobService.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/github/service/GitHubReportingService.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/github/service/GitHubReviewFormatter.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/github/webhookhandler/GitHubBranchWebhookHandler.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/github/webhookhandler/GitHubPullRequestWebhookHandler.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/gitlab/webhookhandler/GitLabBranchWebhookHandler.java
  • java-ecosystem/services/pipeline-agent/src/main/java/org/rostilos/codecrow/pipelineagent/gitlab/webhookhandler/GitLabMrMergeWebhookHandler.java
  • java-ecosystem/services/pipeline-agent/src/test/java/org/rostilos/codecrow/pipelineagent/config/AsyncConfigTest.java
  • java-ecosystem/services/pipeline-agent/src/test/java/org/rostilos/codecrow/pipelineagent/generic/processor/PipelineActionProcessorDependencyGateTest.java
  • java-ecosystem/services/pipeline-agent/src/test/java/org/rostilos/codecrow/pipelineagent/generic/processor/WebhookAsyncProcessorBranchGateTest.java
  • java-ecosystem/services/pipeline-agent/src/test/java/org/rostilos/codecrow/pipelineagent/github/service/GitHubReportingServiceTest.java
  • java-ecosystem/services/pipeline-agent/src/test/java/org/rostilos/codecrow/pipelineagent/github/service/GitHubReviewFormatterTest.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/controller/ProjectController.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/dto/request/UpdateRagConfigRequest.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/dto/response/RagBranchIndexStatusDTO.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/service/IProjectService.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/service/ProjectService.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/service/RagBranchIndexStatusService.java
  • java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/project/service/RagIndexingTriggerService.java
  • java-ecosystem/services/web-server/src/test/java/org/rostilos/codecrow/webserver/project/service/ProjectServiceRagConfigTest.java
  • java-ecosystem/services/web-server/src/test/java/org/rostilos/codecrow/webserver/project/service/RagBranchIndexStatusServiceTest.java
  • python-ecosystem/inference-orchestrator/integration/test_qa_documentation.py
  • python-ecosystem/inference-orchestrator/src/README.MD
  • python-ecosystem/inference-orchestrator/src/api/routers/qa_documentation.py
  • python-ecosystem/inference-orchestrator/src/model/dtos.py
  • python-ecosystem/inference-orchestrator/src/model/output_schemas.py
  • python-ecosystem/inference-orchestrator/src/server/queue_consumer.py
  • python-ecosystem/inference-orchestrator/src/service/rag/rag_client.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/inference_policy.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/mcp_tool_executor.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/orchestrator.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/reconciliation.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/stage_1_file_review.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/stage_2_cross_file.py
  • python-ecosystem/inference-orchestrator/src/service/review/orchestrator/stage_3_aggregation.py
  • python-ecosystem/inference-orchestrator/src/service/review/prompt_dry_run.py
  • python-ecosystem/inference-orchestrator/src/service/review/quality_capture.py
  • python-ecosystem/inference-orchestrator/src/service/review/review_service.py
  • python-ecosystem/inference-orchestrator/src/utils/prompts/constants_mcp.py
  • python-ecosystem/inference-orchestrator/src/utils/prompts/prompt_builder.py
  • python-ecosystem/inference-orchestrator/tests/prompt_dry_run_neutral_fixture.py
  • python-ecosystem/inference-orchestrator/tests/test_candidate_ledger.py
  • python-ecosystem/inference-orchestrator/tests/test_inference_policy.py
  • python-ecosystem/inference-orchestrator/tests/test_mcp_tool_executor.py
  • python-ecosystem/inference-orchestrator/tests/test_orchestrator_helpers.py
  • python-ecosystem/inference-orchestrator/tests/test_prompt_builder.py
  • python-ecosystem/inference-orchestrator/tests/test_prompt_dry_run.py
  • python-ecosystem/inference-orchestrator/tests/test_quality_capture.py
  • python-ecosystem/inference-orchestrator/tests/test_rag_client.py
  • python-ecosystem/inference-orchestrator/tests/test_rag_client_duplication_unit.py
  • python-ecosystem/inference-orchestrator/tests/test_reconciliation.py
  • python-ecosystem/inference-orchestrator/tests/test_reconciliation_full.py
  • python-ecosystem/inference-orchestrator/tests/test_review_service_helpers.py
  • python-ecosystem/inference-orchestrator/tests/test_stage_1_file_review.py
  • python-ecosystem/inference-orchestrator/tests/test_stage_2_helpers.py
  • python-ecosystem/inference-orchestrator/tests/test_stage_3_full.py
  • python-ecosystem/inference-orchestrator/tests/test_stage_3_helpers.py
  • python-ecosystem/rag-pipeline/Dockerfile
  • python-ecosystem/rag-pipeline/Dockerfile.observable
  • python-ecosystem/rag-pipeline/integration/conftest.py
  • python-ecosystem/rag-pipeline/main.py
  • python-ecosystem/rag-pipeline/requirements.local.txt
  • python-ecosystem/rag-pipeline/requirements.txt
  • python-ecosystem/rag-pipeline/src/rag_pipeline/api/models.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/api/routers/index.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/api/routers/inspect.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/api/routers/pr.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/api/routers/query.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/coordination.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/generation_manifest.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/index_manager/branch_manager.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/index_manager/collection_manager.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/index_manager/indexer.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/index_manager/manager.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/index_manager/point_operations.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/index_representation.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/loader.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/pr_overlay_identity.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/pr_overlay_manifest.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/pr_overlay_representation.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/revision_binding.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/revision_preflight.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/revision_preflight_cache.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/core/source_tree.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/models/config.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/server/rag_queue_consumer.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/services/base.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/services/deterministic_context.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/services/pr_context.py
  • python-ecosystem/rag-pipeline/src/rag_pipeline/services/semantic_search.py
  • python-ecosystem/rag-pipeline/tests/test_coordination.py
  • python-ecosystem/rag-pipeline/tests/test_generation_advance.py
  • python-ecosystem/rag-pipeline/tests/test_index_manager.py
  • python-ecosystem/rag-pipeline/tests/test_indexer.py
  • python-ecosystem/rag-pipeline/tests/test_loader_extended.py
  • python-ecosystem/rag-pipeline/tests/test_pr_overlay_manifest.py
  • python-ecosystem/rag-pipeline/tests/test_revision_bound_queries.py
  • python-ecosystem/rag-pipeline/tests/test_revision_preflight.py
  • python-ecosystem/rag-pipeline/tests/test_revision_preflight_cache.py
  • python-ecosystem/rag-pipeline/tests/test_router_index.py
  • python-ecosystem/rag-pipeline/tests/test_router_pr.py
  • python-ecosystem/rag-pipeline/tests/test_source_tree.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@rostilos

rostilos commented Aug 9, 2026

Copy link
Copy Markdown
Owner Author

/codecrow analyze

@codecrow-local codecrow-local Bot deleted a comment from codecrow-ai Bot Aug 9, 2026
fix #1: improve PR review reporting, RAG consistency, and concurrent analysis

fix #2: prevent out-of-diff findings from rejecting PR reviews

fix #3: handle empty Jira task descriptions ( qa-doc )
Group only plausible duplicate candidates, preserve uncertain findings, and retain all merged locations. Bind MCP verification to the exact reviewed commit, finding ID, file, and source window while keeping model context token-efficient.
Add bounded archive extraction, case-safe branch aliases, preserve RAG settings through compatibility updates, and clean up all registered branch generations.
@codecrow-local

codecrow-local Bot commented Aug 10, 2026

Copy link
Copy Markdown

⚠️ Code Analysis Results

Quality Gate Default Quality Gate: 🔴 FAILED

  • HIGH Issues by Severity > 0 (actual: 2) - FAILED
  • MEDIUM Issues by Severity > 0 (actual: 7) - FAILED

Summary

Pull Request Review: add readable multi-branch Qdrant aliases

Status PASS WITH WARNINGS
Risk Level HIGH
Review Coverage 95 files analyzed in depth
Confidence HIGH

Executive Summary

This PR introduces readable multi-branch Qdrant aliases and related branch-aware indexing, analysis coordination, archival, and verification changes across Java and Python services. The overall design is substantial and addresses the intended multi-branch workflow, but the review identified high-risk integration defects involving repository persistence and MCP Stage 3 execution, along with additional runtime, cleanup, and test-build concerns. No task context was provided, so task-coverage confidence is based solely on the changed files and cross-file review.

Recommendation

Decision: PASS WITH WARNINGS

The PR should receive focused follow-up before merge, particularly for the high-severity integration issues and build/runtime paths identified in the detailed findings. The broader implementation can proceed through review, but merging without addressing or explicitly accepting these risks is not recommended.

Issues Overview

Severity Count
🔴 High 2 Critical issues requiring immediate attention
🟡 Medium 7 Issues that should be addressed
✅ Resolved 5 Resolved issues

Analysis completed on 2026-08-10 16:48:04 | View Full Report | Pull Request


📋 Detailed Issues (9)

🔴 High Severity Issues

Id on Platform: 4011

Category: 🐛 Bug Risk

File: .../orchestrator/stage_3_aggregation.py:431

MCP executor call uses unsupported arguments

The changed Stage 3 path constructs McpToolExecutor with review_revision and verification_issues arguments. The resolved current executor declaration accepts only (mcp_client, request, stage), so enabling MCP Stage 3 raises TypeError before verification starts and can fail the review flow instead of producing a report. This is a cross-module API mismatch between the changed call site and python-ecosystem/inference-orchestrator/src/service/review/orchestrator/mcp_tool_executor.py.

💡 Suggested Fix

Update McpToolExecutor.__init__ to accept and use the new verification context, or keep the constructor call compatible and pass that context through a separately supported API. Add an integration test that executes _stage_3_with_mcp with the real constructor signature.

View Issue Details


Id on Platform: 4014

Category: 🐛 Bug Risk

File: .../persistence/AnalyzedCommitRepository.java:36

JPQL references missing entity field

The added JPQL predicate uses ac.targetBranch. The visible AnalyzedCommit entity definition lists only id, project, commitHash, analyzedAt, analysisId, and analysisType, with no targetBranch field or accessor (RAG-9f957c9fc710bda3). Unless another unshown entity change adds that mapped property, Spring Data validation will fail when creating this repository, preventing application startup; the corresponding derived method has the same dependency.

💡 Suggested Fix

Add a persisted targetBranch property to AnalyzedCommit with the required schema migration and update its constraints, or remove these branch-scoped repository methods and use fields that actually exist.

View Issue Details


🟡 Medium Severity Issues

Id on Platform: 4009

Category: 🐛 Bug Risk

File: .../service/RagOperationsServiceImpl.java:944

Legacy stale indexes are not deleted

Cleanup now routes every stale branch through deleteBranchIndex(project, branch, eventConsumer). That method only deletes collections found through the durable branch-generation registry; when a stale branch exists only in the legacy shared collection returned by getIndexedBranches, it has no registered generations and the legacy collection is never deleted. Cleanup therefore reports the branch as failed and leaves stale vectors behind.

💡 Suggested Fix

Make deleteBranchIndex fall back to deleting the legacy branch collection when no durable generations are registered, or retain the legacy ragPipelineClient.deleteBranch(...) path in cleanup for branches without exact-generation records.

View Issue Details


Id on Platform: 4010

Category: 🐛 Bug Risk

File: .../webhookhandler/BitbucketCloudBranchWebhookHandler.java:170

Bitbucket webhook bypasses dependency gating

This handler now calls processAfterDependencyGate, which explicitly skips the processor's compatibility awaitPrAnalysis barrier. Unlike the generic pipeline path, this call does not pass a persisted Job or invoke BranchAnalysisGateService.awaitDependencies in the visible handler. A Bitbucket branch webhook can therefore begin branch reconciliation while an older PR analysis is still active, reintroducing the ordering race that the new durable gate is intended to prevent.

💡 Suggested Fix

Create or resolve the durable branch job before invoking the processor and run awaitDependencies with that job, or keep this handler on process(...) unless an equivalent durable gate has already been executed by the surrounding webhook dispatch path.

View Issue Details


Id on Platform: 4012

Category: 🔒 Security

File: .../orchestrator/mcp_tool_executor.py:98

Stage 3 permits unbound file evidence

Stage 3 only uses the verification identity when it happens to resolve to a known issue. If verificationId is missing or unknown, _verification_line_for_path returns zero, no anchor window is applied, and the request still proceeds against the pinned revision. This lets a malformed or untrusted Stage 3 tool call read arbitrary repository content without being bound to one of the reviewed finding locations, weakening the source-evidence contract and allowing unrelated content to influence verification.

💡 Suggested Fix

For Stage 3 getBranchFileContent calls, reject missing or unknown verification IDs before invoking the MCP client. Also validate that the requested file matches the primary or related location associated with that verification record; otherwise return a failed tool result and record invalid evidence.

View Issue Details


Id on Platform: 4013

Category: 🐛 Bug Risk

File: .../routers/index.py:152

Streaming endpoint accesses undefined request fields

The streaming endpoint uses direct attribute access for source_tree_sha256 and collection_target. The visible IndexRequest contract in python-ecosystem/rag-pipeline/src/rag_pipeline/api/models.py defines the request with fields such as repo_path, workspace, project, branch, and commit, but does not define either of these attributes (Evidence ID RAG-d51e661f0c42ddcc). Consequently, a normal request entering this endpoint raises AttributeError inside the worker before indexing, and the client receives an SSE error instead of an indexing result. The ordinary endpoint already uses getattr for these compatibility fields, which further indicates that the streaming path is inconsistent.

💡 Suggested Fix

Use getattr(request, "source_tree_sha256", None) and getattr(request, "collection_target", None) in the streaming worker, or add these fields to IndexRequest with the intended validation and defaults. Apply the same compatibility handling to every optional generation field used by this endpoint.

View Issue Details


Id on Platform: 4015

Category: 🧹 Code Quality

File: .../service/AnalyzedCommitService.java:65

Branch-scoped receipts violate commit uniqueness

The new branch-aware path deliberately creates a separate receipt with targetBranch, but the visible AnalyzedCommit mapping still has a unique constraint on (project_id, commit_hash) (RAG-9f957c9fc710bda3). When the same commit is analyzed in a second target-branch context, the branch-scoped lookup does not find the first branch's row, then saveAll attempts a duplicate (project, commit) insert and the transaction fails. This defeats the new branch isolation behavior and can prevent successful branch analysis.

💡 Suggested Fix

Change the database uniqueness constraint and corresponding migration to include target_branch (while defining how legacy null-branch rows are handled), or retain project-wide deduplication and avoid inserting branch-specific duplicate receipts.

View Issue Details


Id on Platform: 4016

Category: 🧪 Testing

File: .../service/RagBranchIndexStatusServiceTest.java:33

RagConfig test constructor has invalid arity

The added test calls new RagConfig(...) with eight arguments. The visible RagConfig declaration has six record components and no visible eight-argument constructor, so this test cannot compile. That prevents the web-server test source from building.

💡 Suggested Fix

Use the six-component RagConfig constructor or an existing supported overload, and configure any branch-pattern behavior through the corresponding project configuration rather than passing extra arguments.

View Issue Details


Id on Platform: 4017

Category: ⚡ Performance

File: .../index_manager/indexer.py:1163

Secondary alias targets are never cleaned up

The changed code swaps every alias in activation_aliases to the new pending collection, but cleanup only examines the primary alias via old_targets.get(alias_name). When publication_aliases contains aliases pointing to prior collections and seal_generation is false, those secondary old collections are no longer reachable through their aliases but are not deleted. Repeated replacements can therefore leave orphaned Qdrant collections and consume storage indefinitely.

💡 Suggested Fix

After a non-sealed replacement, collect the distinct old targets from all aliases, exclude the newly activated collection, and delete each obsolete collection after the swap. Preserve the existing retention behavior when seal_generation is enabled.

View Issue Details


Files Affected

  • .../service/RagOperationsServiceImpl.java: 1 issue
  • .../service/AnalyzedCommitService.java: 1 issue
  • .../orchestrator/stage_3_aggregation.py: 1 issue
  • .../orchestrator/mcp_tool_executor.py: 1 issue
  • .../webhookhandler/BitbucketCloudBranchWebhookHandler.java: 1 issue
  • .../index_manager/indexer.py: 1 issue
  • .../routers/index.py: 1 issue
  • .../persistence/AnalyzedCommitRepository.java: 1 issue
  • .../service/RagBranchIndexStatusServiceTest.java: 1 issue

@codecrow-local codecrow-local Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeCrow Review

Actionable comments posted: 9

Each finding below is attached to the relevant changed line. The complete analysis remains available in the CodeCrow summary comment.

for (String branch : staleBranches) {
try {
boolean success = ragPipelineClient.deleteBranch(workspaceSlug, projectSlug, branch);
boolean success = deleteBranchIndex(project, branch, eventConsumer);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Bug Risk

Legacy stale indexes are not deleted

Cleanup now routes every stale branch through deleteBranchIndex(project, branch, eventConsumer). That method only deletes collections found through the durable branch-generation registry; when a stale branch exists only in the legacy shared collection returned by getIndexedBranches, it has no registered generations and the legacy collection is never deleted. Cleanup therefore reports the branch as failed and leaves stale vectors behind.

💡 Suggested fix

Make deleteBranchIndex fall back to deleting the legacy branch collection when no durable generations are registered, or retain the legacy ragPipelineClient.deleteBranch(...) path in cleanup for branches without exact-generation records.

View issue in CodeCrow

};

Map<String, Object> result = branchAnalysisProcessor.process(request, processorConsumer);
Map<String, Object> result = branchAnalysisProcessor.processAfterDependencyGate(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Bug Risk

Bitbucket webhook bypasses dependency gating

This handler now calls processAfterDependencyGate, which explicitly skips the processor's compatibility awaitPrAnalysis barrier. Unlike the generic pipeline path, this call does not pass a persisted Job or invoke BranchAnalysisGateService.awaitDependencies in the visible handler. A Bitbucket branch webhook can therefore begin branch reconciliation while an older PR analysis is still active, reintroducing the ordering race that the new durable gate is intended to prevent.

💡 Suggested fix

Create or resolve the durable branch job before invoking the processor and run awaitDependencies with that job, or keep this handler on process(...) unless an equivalent durable gate has already been executed by the surrounding webhook dispatch path.

View issue in CodeCrow

fallback_llm=None,
) -> Dict[str, Any]:
executor = McpToolExecutor(mcp_client, request, stage="stage_3")
executor = McpToolExecutor(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 HIGH | Bug Risk

MCP executor call uses unsupported arguments

The changed Stage 3 path constructs McpToolExecutor with review_revision and verification_issues arguments. The resolved current executor declaration accepts only (mcp_client, request, stage), so enabling MCP Stage 3 raises TypeError before verification starts and can fail the review flow instead of producing a report. This is a cross-module API mismatch between the changed call site and python-ecosystem/inference-orchestrator/src/service/review/orchestrator/mcp_tool_executor.py.

💡 Suggested fix

Update McpToolExecutor.__init__ to accept and use the new verification context, or keep the constructor call compatible and pass that context through a separately supported API. Add an integration test that executes _stage_3_with_mcp with the real constructor signature.

View issue in CodeCrow

# Post-review evidence must come from the exact reviewed revision.
# Never let a model accidentally verify new PR code against target.
arguments["branch"] = self.review_revision
verification_id = str(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Security

Stage 3 permits unbound file evidence

Stage 3 only uses the verification identity when it happens to resolve to a known issue. If verificationId is missing or unknown, _verification_line_for_path returns zero, no anchor window is applied, and the request still proceeds against the pinned revision. This lets a malformed or untrusted Stage 3 tool call read arbitrary repository content without being bound to one of the reviewed finding locations, weakening the source-evidence contract and allowing unrelated content to influence verification.

💡 Suggested fix

For Stage 3 getBranchFileContent calls, reject missing or unknown verification IDs before invoking the MCP client. Also validate that the requested file matches the primary or related location associated with that verification record; otherwise return a failed tool result and record invalid evidence.

View issue in CodeCrow

def run_index() -> None:
try:
optional_generation_args = {}
if request.source_tree_sha256:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Bug Risk

Streaming endpoint accesses undefined request fields

The streaming endpoint uses direct attribute access for source_tree_sha256 and collection_target. The visible IndexRequest contract in python-ecosystem/rag-pipeline/src/rag_pipeline/api/models.py defines the request with fields such as repo_path, workspace, project, branch, and commit, but does not define either of these attributes (Evidence ID RAG-d51e661f0c42ddcc). Consequently, a normal request entering this endpoint raises AttributeError inside the worker before indexing, and the client receives an SSE error instead of an indexing result. The ordinary endpoint already uses getattr for these compatibility fields, which further indicates that the streaming path is inconsistent.

💡 Suggested fix

Use getattr(request, "source_tree_sha256", None) and getattr(request, "collection_target", None) in the streaming worker, or add these fields to IndexRequest with the intended validation and defaults. Apply the same compatibility handling to every optional generation field used by this endpoint.

View issue in CodeCrow

@Query("""
SELECT ac.commitHash FROM AnalyzedCommit ac
WHERE ac.project.id = :projectId
AND ac.targetBranch = :targetBranch

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 HIGH | Bug Risk

JPQL references missing entity field

The added JPQL predicate uses ac.targetBranch. The visible AnalyzedCommit entity definition lists only id, project, commitHash, analyzedAt, analysisId, and analysisType, with no targetBranch field or accessor (RAG-9f957c9fc710bda3). Unless another unshown entity change adds that mapped property, Spring Data validation will fail when creating this repository, preventing application startup; the corresponding derived method has the same dependency.

💡 Suggested fix

Add a persisted targetBranch property to AnalyzedCommit with the required schema migration and update its constraints, or remove these branch-scoped repository methods and use fields that actually exist.

View issue in CodeCrow

toSave.add(new AnalyzedCommit(project, hash, AnalysisType.BRANCH_ANALYSIS));
AnalyzedCommit analyzed = new AnalyzedCommit(
project, hash, AnalysisType.BRANCH_ANALYSIS);
analyzed.setTargetBranch(targetBranch);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Code Quality

Branch-scoped receipts violate commit uniqueness

The new branch-aware path deliberately creates a separate receipt with targetBranch, but the visible AnalyzedCommit mapping still has a unique constraint on (project_id, commit_hash) (RAG-9f957c9fc710bda3). When the same commit is analyzed in a second target-branch context, the branch-scoped lookup does not find the first branch's row, then saveAll attempts a duplicate (project, commit) insert and the transaction fails. This defeats the new branch isolation behavior and can prevent successful branch analysis.

💡 Suggested fix

Change the database uniqueness constraint and corresponding migration to include target_branch (while defining how legacy null-branch rows are handled), or retain project-wide deduplication and avoid inserting branch-specific duplicate receipts.

View issue in CodeCrow

ReflectionTestUtils.setField(project, "id", 42L);
ProjectConfig config = new ProjectConfig();
config.setRagConfig(new RagConfig(
true, "master", null, null, true, 30, List.of("develop"), true));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Testing

RagConfig test constructor has invalid arity

The added test calls new RagConfig(...) with eight arguments. The visible RagConfig declaration has six record components and no visible eight-argument constructor, so this test cannot compile. That prevents the web-server test source from building.

💡 Suggested fix

Use the six-component RagConfig constructor or an existing supported overload, and configure any branch-pattern behavior through the corresponding project configuration rather than passing extra arguments.

View issue in CodeCrow

raise

if old_target and old_target != pending_collection_name:
old_target = old_targets.get(alias_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MEDIUM | Performance

Secondary alias targets are never cleaned up

The changed code swaps every alias in activation_aliases to the new pending collection, but cleanup only examines the primary alias via old_targets.get(alias_name). When publication_aliases contains aliases pointing to prior collections and seal_generation is false, those secondary old collections are no longer reachable through their aliases but are not deleted. Repeated replacements can therefore leave orphaned Qdrant collections and consume storage indefinitely.

💡 Suggested fix

After a non-sealed replacement, collect the distinct old targets from all aliases, exclude the newly activated collection, and delete each obsolete collection after the swap. Preserve the existing retention behavior when seal_generation is enabled.

View issue in CodeCrow

@rostilos
rostilos merged commit a28fd11 into main Aug 10, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant