Skip to content

fix(review): give LOOPOVER_OPEN_PR_FILE_COLLISION a per-repo config override - #6035

Merged
JSONbored merged 1 commit into
mainfrom
fix/config-open-pr-collision-override
Jul 15, 2026
Merged

fix(review): give LOOPOVER_OPEN_PR_FILE_COLLISION a per-repo config override#6035
JSONbored merged 1 commit into
mainfrom
fix/config-open-pr-collision-override

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • The open-PR file-path collision annotation (#2653) -- preflight/queue-health enrichment showing which open PRs touch overlapping files, display-only, never a close/gate blocker -- was gated entirely by a single fleet-wide LOOPOVER_OPEN_PR_FILE_COLLISION env var, with no per-repo override anywhere. Same shape as the other three config-as-code gaps fixed in this series (fix(review): wire skipAutomationBotAuthors into .loopover.yml config #5986, fix(review): make size-gate file/line thresholds configurable #5997, fix(review): give LOOPOVER_DUPLICATE_WINNER a per-repo config override #6005).
  • Adds openPrFileCollisionMode ("inherit" | "off" | "enabled", mirroring duplicateWinnerMode/skipAutomationBotAuthors' shape) wired through .loopover.yml settings.openPrFileCollisionMode.
  • Adds src/settings/open-pr-file-collision-mode.ts (isOpenPrFileCollisionEnabledGlobally + resolveOpenPrFileCollisionEnabled, mirroring duplicate-winner-mode.ts's resolver pattern), which the one call site in src/queue/processors.ts now goes through instead of reading env.LOOPOVER_OPEN_PR_FILE_COLLISION directly. "inherit" (the default) reproduces today's exact fleet-wide behavior byte-for-byte; "off"/"enabled" let one repo opt out of (or into) the extra GitHub API round-trip this enrichment costs per open PR, regardless of the global default.

Test plan

  • npm run test:ci (full local gate) green
  • npm audit --audit-level=moderate -- 0 vulnerabilities
  • New test/unit/open-pr-file-collision-mode.test.ts: the resolver's inherit/off/enabled truth table, both directions
  • New parseFocusManifest/resolveEffectiveSettings test for openPrFileCollisionMode (mirrors the existing duplicateWinnerMode test)
  • Existing end-to-end webhook tests (test/unit/queue-2.test.ts) covering the env-flag-on and env-flag-off cases pass unchanged, confirming byte-identical default behavior

…verride

The open-PR file-path collision annotation (preflight/queue-health
enrichment showing which open PRs touch overlapping files -- display
only, never a close/gate blocker) was gated entirely by a single
fleet-wide LOOPOVER_OPEN_PR_FILE_COLLISION env var, with no per-repo
override -- the same shape as the other three config-as-code gaps
fixed in this series.

Adds openPrFileCollisionMode ("inherit" | "off" | "enabled", mirroring
duplicateWinnerMode/skipAutomationBotAuthors' shape) wired through
.loopover.yml settings.openPrFileCollisionMode, and a
resolveOpenPrFileCollisionEnabled helper (mirrors
resolveDuplicateWinnerEnabled) that the one call site in
processors.ts now goes through instead of reading the env var
directly. "inherit" (the default) reproduces today's exact fleet-wide
behavior; "off"/"enabled" let one repo opt out of (or into) the extra
GitHub API calls this enrichment costs, regardless of the global
default.
@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 267 bytes (0.01%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 3.04MB 267 bytes (0.01%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/tanstack-vendor-2ShA11fZ.js (New) 718.68kB 718.68kB 100.0% 🚀
openapi.json 188 bytes 488.07kB 0.04%
assets/maintainer-panel-DkiZlqqS.js (New) 75.5kB 75.5kB 100.0% 🚀
assets/ui-vendor-CE2rzz7f.js (New) 65.83kB 65.83kB 100.0% 🚀
assets/owner-panel-BYH36WMN.js (New) 58.65kB 58.65kB 100.0% 🚀
assets/docs.self-hosting-configuration-B_CVFjE7.js (New) 48.42kB 48.42kB 100.0% 🚀
assets/app.analytics-C2JK5KSL.js (New) 36.26kB 36.26kB 100.0% 🚀
assets/docs.self-hosting-release-checklist-CQDHGY9U.js (New) 34.54kB 34.54kB 100.0% 🚀
assets/docs.tuning-DMHrRMUl.js (New) 34.42kB 34.42kB 100.0% 🚀
assets/routes-jN48-GeQ.js (New) 34.04kB 34.04kB 100.0% 🚀
assets/app.runs-BjH6BQ-U.js (New) 27.11kB 27.11kB 100.0% 🚀
assets/app-C-2V-Ryj.js (New) 25.83kB 25.83kB 100.0% 🚀
assets/app.operator-DKGJgS5u.js (New) 24.59kB 24.59kB 100.0% 🚀
assets/docs.self-hosting-security-CGH3k1Ec.js (New) 21.3kB 21.3kB 100.0% 🚀
assets/docs.github-app-ryrG7ffY.js (New) 19.49kB 19.49kB 100.0% 🚀
assets/miner-panel-DDhUEcBq.js (New) 19.23kB 19.23kB 100.0% 🚀
assets/docs.self-hosting-troubleshooting-gx0i1hbS.js (New) 18.47kB 18.47kB 100.0% 🚀
assets/api._op-Cl1yWVV2.js (New) 17.89kB 17.89kB 100.0% 🚀
assets/docs.self-hosting-github-app-AW8Tpf1B.js (New) 17.32kB 17.32kB 100.0% 🚀
assets/docs.how-reviews-work-CcsNp0vC.js (New) 17.03kB 17.03kB 100.0% 🚀
assets/app.index-DFamDdhw.js (New) 16.19kB 16.19kB 100.0% 🚀
assets/docs.maintainer-self-hosting-CL90-8L_.js (New) 15.99kB 15.99kB 100.0% 🚀
assets/playground-panel-BUuPrK36.js (New) 14.43kB 14.43kB 100.0% 🚀
assets/docs.self-hosting-quickstart-DFA8JNw1.js (New) 14.15kB 14.15kB 100.0% 🚀
assets/docs.self-hosting-docs-audit-CkRPySKc.js (New) 12.14kB 12.14kB 100.0% 🚀
assets/docs.maintainer-install-trust-7SLYSFRj.js (New) 10.51kB 10.51kB 100.0% 🚀
assets/docs.self-hosting-backup-scaling-DeCBFVWI.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/docs.beta-onboarding-DZqISd1v.js (New) 9.95kB 9.95kB 100.0% 🚀
assets/app.audit-g4S0oE02.js (New) 9.35kB 9.35kB 100.0% 🚀
assets/extension-BHY5yWvL.js (New) 9.21kB 9.21kB 100.0% 🚀
assets/docs.self-hosting-rees-Cl5v_pgs.js (New) 8.95kB 8.95kB 100.0% 🚀
assets/docs.self-hosting-ai-providers-BeqM2zgF.js (New) 8.92kB 8.92kB 100.0% 🚀
assets/app.config-generator-21fgSf4o.js (New) 8.13kB 8.13kB 100.0% 🚀
assets/maintainers-BvoqvFcj.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-Cs27Jakx.js (New) 7.88kB 7.88kB 100.0% 🚀
assets/agents-DtiXbfpi.js (New) 7.76kB 7.76kB 100.0% 🚀
assets/docs.privacy-security-CKvpwtl7.js (New) 7.21kB 7.21kB 100.0% 🚀
assets/docs.owner-checklist-CB1T0T6T.js (New) 7.0kB 7.0kB 100.0% 🚀
assets/commands-panel-C9mBHGx0.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/docs.self-hosting-releases-H9PHRPyX.js (New) 6.62kB 6.62kB 100.0% 🚀
assets/roadmap-Db8vu4iN.js (New) 6.33kB 6.33kB 100.0% 🚀
assets/docs.self-hosting-rees-analyzers-DSaaTUR2.js (New) 6.05kB 6.05kB 100.0% 🚀
assets/digest-panel-ELQWCuKV.js (New) 6.04kB 6.04kB 100.0% 🚀
assets/docs.loopover-commands-ra4qZym8.js (New) 5.18kB 5.18kB 100.0% 🚀
assets/docs.scoreability-DMexuLOU.js (New) 5.05kB 5.05kB 100.0% 🚀
assets/docs.troubleshooting-BRUZL6Kw.js (New) 4.91kB 4.91kB 100.0% 🚀
assets/repos._owner._repo.quality-BJvxvgkD.js (New) 4.87kB 4.87kB 100.0% 🚀
assets/api.index-qjtInJnw.js (New) 4.78kB 4.78kB 100.0% 🚀
assets/docs.index-BLJACJMy.js (New) 4.68kB 4.68kB 100.0% 🚀
assets/changelog-DeS1Ti8x.js (New) 4.67kB 4.67kB 100.0% 🚀
assets/docs.maintainer-workflow-Dys6b5nO.js (New) 4.36kB 4.36kB 100.0% 🚀
assets/docs.self-hosting-rag-BfxEaxge.js (New) 4.35kB 4.35kB 100.0% 🚀
assets/control-primitives-BynrLU0B.js (New) 3.75kB 3.75kB 100.0% 🚀
assets/docs.ai-summaries-DT5CaCep.js (New) 3.04kB 3.04kB 100.0% 🚀
assets/docs.branch-analysis-BGV97oCi.js (New) 2.91kB 2.91kB 100.0% 🚀
assets/docs.mcp-clients-BrK67NcM.js (New) 2.9kB 2.9kB 100.0% 🚀
assets/api-BetKNRLZ.js (New) 2.73kB 2.73kB 100.0% 🚀
assets/docs-DOEud9RZ.js (New) 2.67kB 2.67kB 100.0% 🚀
assets/docs.quickstart-DmN4g4xg.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/alert-dialog-CtEbNsd2.js (New) 2.07kB 2.07kB 100.0% 🚀
assets/docs.upstream-drift-DBKkiM7E.js (New) 2.04kB 2.04kB 100.0% 🚀
assets/button-lYtH04B0.js (New) 1.74kB 1.74kB 100.0% 🚀
assets/app.workbench-BYGTQaIJ.js (New) 1.63kB 1.63kB 100.0% 🚀
assets/tooltip-Vv1GSvGw.js (New) 1.45kB 1.45kB 100.0% 🚀
assets/session-Du1j0KUR.js (New) 1.44kB 1.44kB 100.0% 🚀
assets/tabs-CT9KI_fe.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/trend-chart-CTrblxfo.js (New) 1.22kB 1.22kB 100.0% 🚀
assets/app.repos-DenqWv1C.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/switch-Cl34Ufnx.js (New) 982 bytes 982 bytes 100.0% 🚀
assets/analytics-card-shell-BpQE1lUs.js (New) 972 bytes 972 bytes 100.0% 🚀
assets/use-api-resource-CfrVzC1y.js (New) 934 bytes 934 bytes 100.0% 🚀
assets/input-CIPRr6Wa.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/refresh-meta-DW6B622K.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-B87Ih60a.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-BLDzMz9h.js (New) 501 bytes 501 bytes 100.0% 🚀
assets/sparkles-CmpkrtAo.js (New) 494 bytes 494 bytes 100.0% 🚀
assets/app.owner-DUQdw_Jj.js (New) 473 bytes 473 bytes 100.0% 🚀
assets/app.commands-Dc3j52bX.js (New) 454 bytes 454 bytes 100.0% 🚀
assets/reveal-Cf9aOShi.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/app.playground-BlMB1bpd.js (New) 441 bytes 441 bytes 100.0% 🚀
assets/index-BI8QASaS.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/eye-off-DyEOsu-P.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.digest-DX2gPaiz.js (New) 429 bytes 429 bytes 100.0% 🚀
assets/app.miner-BXFesZu0.js (New) 421 bytes 421 bytes 100.0% 🚀
assets/key-round-DijjJ3Pv.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-CT4cbdHr.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-Dyz7ptVg.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-VhVIeBNe.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-CUG1T-hU.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/shield-check-By12r8tD.js (New) 320 bytes 320 bytes 100.0% 🚀
assets/wrench-B5O_LvuL.js (New) 303 bytes 303 bytes 100.0% 🚀
assets/bell-mw_qZjyb.js (New) 290 bytes 290 bytes 100.0% 🚀
assets/list-checks-aP43GST_.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/shield-vZ3LqhL7.js (New) 272 bytes 272 bytes 100.0% 🚀
assets/workflow-Cv-G83sR.js (New) 265 bytes 265 bytes 100.0% 🚀
assets/chart-column-DCmEKyvS.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/compass-DvdG7ziX.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/skeleton-DqBGRQGk.js (New) 241 bytes 241 bytes 100.0% 🚀
assets/history-D-Sy7vlT.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/activity-DOhfkhHg.js (New) 234 bytes 234 bytes 100.0% 🚀
assets/message-square-B8l8gzqs.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/download-CX3bYneP.js (New) 232 bytes 232 bytes 100.0% 🚀
assets/chevron-right-C5Tckzz9.js (New) 207 bytes 207 bytes 100.0% 🚀
assets/lock-BaBWKd0H.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-D2QLvZg4.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-DAg_HQwl.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-DZdBsQy6.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-DztityCe.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/circle-Bdn2SfHA.js (New) 130 bytes 130 bytes 100.0% 🚀
assets/tanstack-vendor-6XeVwX1N.js (Deleted) -718.6kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BHVSXtkt.js (Deleted) -75.5kB 0 bytes -100.0% 🗑️
assets/ui-vendor-BARCU0sR.js (Deleted) -65.83kB 0 bytes -100.0% 🗑️
assets/owner-panel-oS3f_Oiv.js (Deleted) -58.65kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-configuration-DFxf4kcg.js (Deleted) -48.42kB 0 bytes -100.0% 🗑️
assets/app.analytics-CBfziuVx.js (Deleted) -36.26kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-release-checklist-CQg25LuC.js (Deleted) -34.54kB 0 bytes -100.0% 🗑️
assets/docs.tuning-BP-TPRco.js (Deleted) -34.42kB 0 bytes -100.0% 🗑️
assets/routes-Dzy5Y9K2.js (Deleted) -34.04kB 0 bytes -100.0% 🗑️
assets/app.runs-CDq7l85V.js (Deleted) -27.11kB 0 bytes -100.0% 🗑️
assets/app-BqGVrZiM.js (Deleted) -25.83kB 0 bytes -100.0% 🗑️
assets/app.operator-Bps0z0HE.js (Deleted) -24.59kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-security-ddq2pA0s.js (Deleted) -21.3kB 0 bytes -100.0% 🗑️
assets/docs.github-app-RwidpXDu.js (Deleted) -19.49kB 0 bytes -100.0% 🗑️
assets/miner-panel-C7gNwqoz.js (Deleted) -19.23kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-troubleshooting-C2V7cDG9.js (Deleted) -18.47kB 0 bytes -100.0% 🗑️
assets/api._op-D0KfhkO5.js (Deleted) -17.89kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-github-app-BkSiM80K.js (Deleted) -17.32kB 0 bytes -100.0% 🗑️
assets/docs.how-reviews-work-CPxb_JSr.js (Deleted) -17.03kB 0 bytes -100.0% 🗑️
assets/app.index-BHsJdTUk.js (Deleted) -16.19kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-self-hosting-DuXCbaMq.js (Deleted) -15.99kB 0 bytes -100.0% 🗑️
assets/playground-panel-7arbW3zK.js (Deleted) -14.43kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-quickstart-DH2crgim.js (Deleted) -14.15kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-docs-audit-oENBSkpv.js (Deleted) -12.14kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-install-trust-Y7OoKpE8.js (Deleted) -10.51kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-backup-scaling-Ch-F-0-I.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/docs.beta-onboarding-B_k5ftac.js (Deleted) -9.95kB 0 bytes -100.0% 🗑️
assets/app.audit-CdeDbEXo.js (Deleted) -9.35kB 0 bytes -100.0% 🗑️
assets/extension-CDRYcl4f.js (Deleted) -9.21kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-DhbgPnAn.js (Deleted) -8.95kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-ai-providers-NbB67tpz.js (Deleted) -8.92kB 0 bytes -100.0% 🗑️
assets/app.config-generator-D9ulVoRg.js (Deleted) -8.13kB 0 bytes -100.0% 🗑️
assets/maintainers-C0zLpgEr.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-TRJHVET6.js (Deleted) -7.88kB 0 bytes -100.0% 🗑️
assets/agents-CYVFicHf.js (Deleted) -7.76kB 0 bytes -100.0% 🗑️
assets/docs.privacy-security-DPNZ9ZY-.js (Deleted) -7.21kB 0 bytes -100.0% 🗑️
assets/docs.owner-checklist-kSFPakxm.js (Deleted) -7.0kB 0 bytes -100.0% 🗑️
assets/commands-panel-DY7eCgaT.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-releases-BBQKHeyd.js (Deleted) -6.62kB 0 bytes -100.0% 🗑️
assets/roadmap-DLdirpqS.js (Deleted) -6.33kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-analyzers-Db12wPmw.js (Deleted) -6.05kB 0 bytes -100.0% 🗑️
assets/digest-panel-BV8j_XPi.js (Deleted) -6.04kB 0 bytes -100.0% 🗑️
assets/docs.loopover-commands-ZIw27ccX.js (Deleted) -5.18kB 0 bytes -100.0% 🗑️
assets/docs.scoreability-mV9gzD6d.js (Deleted) -5.05kB 0 bytes -100.0% 🗑️
assets/docs.troubleshooting-D7iMmOQl.js (Deleted) -4.91kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-BYTM9QOq.js (Deleted) -4.87kB 0 bytes -100.0% 🗑️
assets/api.index-DL6w_BDT.js (Deleted) -4.78kB 0 bytes -100.0% 🗑️
assets/docs.index-BS7w19x-.js (Deleted) -4.68kB 0 bytes -100.0% 🗑️
assets/changelog-C5iQcUPy.js (Deleted) -4.67kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-workflow-Ddesuoqk.js (Deleted) -4.36kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rag-2dAwfzq-.js (Deleted) -4.35kB 0 bytes -100.0% 🗑️
assets/control-primitives-bYSkL7dA.js (Deleted) -3.75kB 0 bytes -100.0% 🗑️
assets/docs.ai-summaries-BWmrPCWk.js (Deleted) -3.04kB 0 bytes -100.0% 🗑️
assets/docs.branch-analysis-CsBK2jQH.js (Deleted) -2.91kB 0 bytes -100.0% 🗑️
assets/docs.mcp-clients-CKOlKXx6.js (Deleted) -2.9kB 0 bytes -100.0% 🗑️
assets/api-BTHmm6y9.js (Deleted) -2.73kB 0 bytes -100.0% 🗑️
assets/docs-DPY-qRd2.js (Deleted) -2.67kB 0 bytes -100.0% 🗑️
assets/docs.quickstart-BNpJsCqB.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/alert-dialog-DHuilbc6.js (Deleted) -2.07kB 0 bytes -100.0% 🗑️
assets/docs.upstream-drift-CCTxaQ8x.js (Deleted) -2.04kB 0 bytes -100.0% 🗑️
assets/button-D3C6VlfD.js (Deleted) -1.74kB 0 bytes -100.0% 🗑️
assets/app.workbench-Be2991LA.js (Deleted) -1.63kB 0 bytes -100.0% 🗑️
assets/tooltip-Bnn6l0p3.js (Deleted) -1.45kB 0 bytes -100.0% 🗑️
assets/session-B5TAeaQy.js (Deleted) -1.44kB 0 bytes -100.0% 🗑️
assets/tabs-M1WUjDwT.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/trend-chart-CqeASnnE.js (Deleted) -1.22kB 0 bytes -100.0% 🗑️
assets/app.repos-CYi_MVGM.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/switch-BQ-Vjcnv.js (Deleted) -982 bytes 0 bytes -100.0% 🗑️
assets/analytics-card-shell-CWb3DrHj.js (Deleted) -972 bytes 0 bytes -100.0% 🗑️
assets/use-api-resource-Cz-W4okR.js (Deleted) -934 bytes 0 bytes -100.0% 🗑️
assets/input-Cm_hdzAg.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/refresh-meta-j8YED58D.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-CreL162t.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-aEsrizm9.js (Deleted) -501 bytes 0 bytes -100.0% 🗑️
assets/sparkles-CrNapn_o.js (Deleted) -494 bytes 0 bytes -100.0% 🗑️
assets/app.owner-B-Sy3Amd.js (Deleted) -473 bytes 0 bytes -100.0% 🗑️
assets/app.commands-1nzjbRC5.js (Deleted) -454 bytes 0 bytes -100.0% 🗑️
assets/reveal-DRv5Z-br.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/app.playground-CKSHzv7x.js (Deleted) -441 bytes 0 bytes -100.0% 🗑️
assets/index-BiiIVt-D.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/eye-off-B5VO0IAe.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.digest-BpBp0tod.js (Deleted) -429 bytes 0 bytes -100.0% 🗑️
assets/app.miner-CCpiDUrQ.js (Deleted) -421 bytes 0 bytes -100.0% 🗑️
assets/key-round-Bz_O4fmb.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-2qPZRg1m.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-DeQu90U8.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-BO7liV8w.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-D0TJV5-2.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/shield-check-CpqOPxJ2.js (Deleted) -320 bytes 0 bytes -100.0% 🗑️
assets/wrench-Co-5Ybz-.js (Deleted) -303 bytes 0 bytes -100.0% 🗑️
assets/bell-CHEY2rgL.js (Deleted) -290 bytes 0 bytes -100.0% 🗑️
assets/list-checks-DUzaFiRf.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/shield-un3NWyjG.js (Deleted) -272 bytes 0 bytes -100.0% 🗑️
assets/workflow-KvygnHpS.js (Deleted) -265 bytes 0 bytes -100.0% 🗑️
assets/chart-column-BCwm3Ws5.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/compass-BbaM2OCm.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/skeleton-Dfs7lT55.js (Deleted) -241 bytes 0 bytes -100.0% 🗑️
assets/history-DWxLGN0v.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/activity-Cnfgm8l9.js (Deleted) -234 bytes 0 bytes -100.0% 🗑️
assets/message-square-DjdK1hGC.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/download-CY2SwAQO.js (Deleted) -232 bytes 0 bytes -100.0% 🗑️
assets/chevron-right-DYWIE2bz.js (Deleted) -207 bytes 0 bytes -100.0% 🗑️
assets/lock-CyB5UDhb.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-d27QKyLR.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-JNLUBleS.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-DY154wHw.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-DaBkBBIK.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️
assets/circle-D6W9z0uE.js (Deleted) -130 bytes 0 bytes -100.0% 🗑️

@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 95.16%. Comparing base (38014f8) to head (d3bf13b).
⚠️ Report is 16 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #6035   +/-   ##
=======================================
  Coverage   95.16%   95.16%           
=======================================
  Files         592      593    +1     
  Lines       46949    46955    +6     
  Branches    15003    15006    +3     
=======================================
+ Hits        44679    44685    +6     
  Misses       1512     1512           
  Partials      758      758           
Flag Coverage Δ
shard-1 43.93% <57.14%> (+<0.01%) ⬆️
shard-2 36.53% <42.85%> (+0.01%) ⬆️
shard-3 32.07% <71.42%> (+0.08%) ⬆️
shard-4 33.02% <42.85%> (+1.07%) ⬆️
shard-5 31.36% <14.28%> (-1.17%) ⬇️
shard-6 44.58% <57.14%> (-0.04%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
packages/loopover-engine/src/focus-manifest.ts 98.86% <100.00%> (+<0.01%) ⬆️
src/openapi/schemas.ts 100.00% <ø> (ø)
src/queue/processors.ts 95.71% <100.00%> (ø)
src/settings/open-pr-file-collision-mode.ts 100.00% <100.00%> (ø)
src/types.ts 100.00% <ø> (ø)

@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 15, 2026
@loopover-orb

loopover-orb Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Warning

🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨

⏸️ LoopOver review result - manual review recommended

Review updated: 2026-07-15 07:24:39 UTC

11 files · 1 AI reviewer · 2 blockers · readiness 91/100 · CI green · clean

⏸️ Suggested Action - Manual Review

Review summary
This PR adds a per-repo config override for the LOOPOVER_OPEN_PR_FILE_COLLISION env flag, following the exact established pattern from duplicate-winner-mode.ts: a new resolver module, wiring through types.ts/manifest-deps-types.ts/focus-manifest.ts/schemas.ts, and swapping the single call site in processors.ts from a direct env read to the resolver. The wiring is traced end-to-end (schema, focus-manifest parser+resolver, openapi.json, docs examples in both loopover.full.yml and .loopover.yml.example, and new/updated tests) and matches prior PRs in this series (#5986, #5997, #6005). This is display-only enrichment (never a gate/close blocker) so the blast radius of a wiring mistake is low, and the diff is well-scoped to just this one setting.

Nits — 4 non-blocking
  • src/settings/open-pr-file-collision-mode.ts: no self-host docs page update (docs.self-hosting-configuration.tsx) mentioning openPrFileCollisionMode alongside duplicateWinnerMode, unlike the yml example files which were both updated.
  • test/unit/focus-manifest.test.ts: the new test covers inherit/off/enabled/invalid but doesn't explicitly assert the DB-only case (no yml settings block at all) beyond the 'noOverride' case, though that's arguably covered.
  • Consider adding a docs.self-hosting-configuration.tsx entry for openPrFileCollisionMode to keep the settings reference page in sync with the two yml examples.
  • Since the enrichment cost is per-open-PR GitHub API calls, a brief note in the resolver's JSDoc (already partially present) about typical repo open-PR-count cost could help operators decide the override — this is already reasonably covered.

Concerns raised — review before merging

  • No linked issue detected — If this PR is intended to solve an issue, link it explicitly in the PR body.
  • Maintainer requires a linked issue — Link the relevant issue (for example Closes #123) before opening the PR.
📋 Copy for AI agents — paste into your coding agent
Fix the following blocker(s) from this PR review:

1. No linked issue detected — If this PR is intended to solve an issue, link it explicitly in the PR body.

2. Maintainer requires a linked issue — Link the relevant issue (for example `Closes #123`) before opening the PR.
Signal Result Evidence
Code review ❌ 2 blockers 1 reviewer
Linked issue ⚠️ Missing No linked issue or no-issue rationale found.
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (no linked issue context).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 43 registered-repo PR(s), 35 merged, 367 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 43 PR(s), 367 issue(s).
Gate result ❌ Blocking Repo-configured hard blocker found.
Improvement ✅ Minor risk: clean · value: minor · LLM: minor
Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: not available
  • Official Gittensor activity: 43 PR(s), 367 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
  • Then work through the remaining 2 steps in the Signals table above.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://gittensory.aethereal.dev/docs/loopover-commands

🧪 Experimental — new and may change.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 15, 2026
@JSONbored
JSONbored merged commit 4d7fece into main Jul 15, 2026
19 checks passed
@JSONbored
JSONbored deleted the fix/config-open-pr-collision-override branch July 15, 2026 07:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant