Skip to content

fix(review): make size-gate file/line thresholds configurable - #5997

Merged
JSONbored merged 1 commit into
mainfrom
fix/config-size-gate-thresholds
Jul 15, 2026
Merged

fix(review): make size-gate file/line thresholds configurable#5997
JSONbored merged 1 commit into
mainfrom
fix/config-size-gate-thresholds

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • The oversized-PR manual-review HOLD gate (gate.size.mode) has been configurable for a while, but its actual thresholds -- SIZE_HOLD_DEFAULT_MAX_FILES=10 / SIZE_HOLD_DEFAULT_MAX_LINES=1000 -- were bare hardcoded module constants in src/rules/advisory.ts (and its intentionally-divergent engine-parity twin, packages/loopover-engine/src/advisory/gate-advisory.ts), with no config path at all. The doc comments on GateCheckPolicy.sizeGateMode already referenced sizeGateMaxFiles/sizeGateMaxLines as if they were real fields -- they never were.
  • Adds sizeGateMaxFiles/sizeGateMaxLines as real RepositorySettings fields, wired end-to-end:
    • .loopover.yml gate.size.maxFiles/maxLines parsing in both the host (src/signals/focus-manifest.ts) and engine (packages/loopover-engine/src/focus-manifest.ts) config layers, plus the engine's predicted-gate.ts policy builder.
    • Threaded through gateCheckPolicy() (src/queue/gate-checks.ts) into the GateCheckPolicy object.
    • buildSizeHoldFinding in both src/rules/advisory.ts and its engine twin now falls back to the same 10-file/1000-line defaults only when the setting is unset -- existing behavior is byte-identical until an operator sets one.
  • Adds sizeGateMaxFiles/sizeGateMaxLines to the OpenAPI RepositorySettingsSchema and regenerates openapi.json, and documents both fields in .loopover.yml.example / config/examples/loopover.full.yml (replacing the stale "engine defaults, not configurable here" comment).

Test plan

  • npm run test:ci (full local gate) green
  • npm audit --audit-level=moderate -- 0 vulnerabilities
  • New tests: raised maxFiles lets an over-threshold-by-default PR pass; lowered maxLines holds an under-threshold-by-default PR; explicit null still falls back to the built-in default; gateCheckPolicy threading + default-null cases; resolveEffectiveSettings config-mapping case
  • Verified via lcov: every new line and branch fully hit

The oversized-PR HOLD gate (gate.size.mode) has been configurable for
a while, but its actual thresholds -- SIZE_HOLD_DEFAULT_MAX_FILES=10 /
SIZE_HOLD_DEFAULT_MAX_LINES=1000 -- were bare hardcoded constants in
src/rules/advisory.ts (and its engine-parity twin), with no way to
override them. The doc comments on GateCheckPolicy.sizeGateMode
already referenced sizeGateMaxFiles/sizeGateMaxLines as if they
existed; they never did.

Adds sizeGateMaxFiles/sizeGateMaxLines as real RepositorySettings
fields, wired through gate.size.maxFiles/maxLines in the config
parser (both the host and engine copies), gateCheckPolicy, and
buildSizeHoldFinding in both src/rules/advisory.ts and its engine
twin -- falling back to the same 10/1000 defaults when unset, so
existing behavior is unchanged until an operator sets one.
@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 258 bytes (0.01%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 3.04MB 258 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-fAWjkcnf.js (New) 718.53kB 718.53kB 100.0% 🚀
openapi.json 148 bytes 487.7kB 0.03%
assets/maintainer-panel-le78Vvzc.js (New) 75.5kB 75.5kB 100.0% 🚀
assets/ui-vendor-91PmMG2C.js (New) 65.83kB 65.83kB 100.0% 🚀
assets/owner-panel-DN72mTgw.js (New) 58.63kB 58.63kB 100.0% 🚀
assets/docs.self-hosting-configuration-Ddp_GDhJ.js (New) 48.42kB 48.42kB 100.0% 🚀
assets/app.analytics-GDTEcAPf.js (New) 36.26kB 36.26kB 100.0% 🚀
assets/docs.self-hosting-release-checklist-DPfg_PNP.js (New) 34.54kB 34.54kB 100.0% 🚀
assets/docs.tuning-Dog0zuh3.js (New) 34.22kB 34.22kB 100.0% 🚀
assets/routes-D1hYn2D9.js (New) 34.04kB 34.04kB 100.0% 🚀
assets/app.runs-DN2tlSVL.js (New) 27.11kB 27.11kB 100.0% 🚀
assets/app-08d3Z15G.js (New) 25.83kB 25.83kB 100.0% 🚀
assets/app.operator-CDaeOMkt.js (New) 24.59kB 24.59kB 100.0% 🚀
assets/docs.self-hosting-security-BXruhilA.js (New) 21.3kB 21.3kB 100.0% 🚀
assets/docs.github-app-vEGmS04S.js (New) 19.49kB 19.49kB 100.0% 🚀
assets/miner-panel-BMUgD2Sg.js (New) 19.23kB 19.23kB 100.0% 🚀
assets/docs.self-hosting-troubleshooting-BUDjNBoL.js (New) 18.47kB 18.47kB 100.0% 🚀
assets/api._op-DQA1sed2.js (New) 17.89kB 17.89kB 100.0% 🚀
assets/docs.self-hosting-github-app-B7y_sv1r.js (New) 17.32kB 17.32kB 100.0% 🚀
assets/docs.how-reviews-work-h_P9nTsI.js (New) 16.95kB 16.95kB 100.0% 🚀
assets/app.index-gJ0XsPgZ.js (New) 16.19kB 16.19kB 100.0% 🚀
assets/docs.maintainer-self-hosting-CrNqqJvX.js (New) 15.99kB 15.99kB 100.0% 🚀
assets/playground-panel-DGc2hD01.js (New) 14.43kB 14.43kB 100.0% 🚀
assets/docs.self-hosting-quickstart-BNgBRg1s.js (New) 14.15kB 14.15kB 100.0% 🚀
assets/docs.self-hosting-docs-audit-54dIwl7W.js (New) 12.14kB 12.14kB 100.0% 🚀
assets/docs.maintainer-install-trust-2oDZ0wJo.js (New) 10.51kB 10.51kB 100.0% 🚀
assets/docs.self-hosting-backup-scaling-BObGQSgr.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/docs.beta-onboarding-JbQQ8ZCN.js (New) 9.95kB 9.95kB 100.0% 🚀
assets/app.audit-97WZ-tZX.js (New) 9.35kB 9.35kB 100.0% 🚀
assets/extension-D_QSqEZf.js (New) 9.21kB 9.21kB 100.0% 🚀
assets/docs.self-hosting-rees-DJnCs3h3.js (New) 8.95kB 8.95kB 100.0% 🚀
assets/docs.self-hosting-ai-providers-WygisIA8.js (New) 8.92kB 8.92kB 100.0% 🚀
assets/app.config-generator-CKQawun1.js (New) 8.13kB 8.13kB 100.0% 🚀
assets/maintainers-DXRnfUdf.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-CcfbykrH.js (New) 7.88kB 7.88kB 100.0% 🚀
assets/agents-CoV__dxa.js (New) 7.76kB 7.76kB 100.0% 🚀
assets/docs.privacy-security-C4ZB0w9U.js (New) 7.21kB 7.21kB 100.0% 🚀
assets/docs.owner-checklist-CYPdDAbN.js (New) 7.0kB 7.0kB 100.0% 🚀
assets/commands-panel-B3Ybqft_.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/docs.self-hosting-releases-VyNTnlyM.js (New) 6.62kB 6.62kB 100.0% 🚀
assets/roadmap-CKv7n9GN.js (New) 6.33kB 6.33kB 100.0% 🚀
assets/docs.self-hosting-rees-analyzers-DsIByU6a.js (New) 6.05kB 6.05kB 100.0% 🚀
assets/digest-panel-DmkHVBXF.js (New) 6.04kB 6.04kB 100.0% 🚀
assets/docs.loopover-commands-C3ic17-N.js (New) 5.18kB 5.18kB 100.0% 🚀
assets/docs.scoreability-BY5VFp2A.js (New) 5.05kB 5.05kB 100.0% 🚀
assets/docs.troubleshooting-D7NrU_vA.js (New) 4.91kB 4.91kB 100.0% 🚀
assets/repos._owner._repo.quality-D-6BHmtc.js (New) 4.87kB 4.87kB 100.0% 🚀
assets/api.index-iykmsf1P.js (New) 4.78kB 4.78kB 100.0% 🚀
assets/docs.index-aWC5pguE.js (New) 4.68kB 4.68kB 100.0% 🚀
assets/changelog-Dx275P59.js (New) 4.67kB 4.67kB 100.0% 🚀
assets/docs.maintainer-workflow-BWA9HqQw.js (New) 4.36kB 4.36kB 100.0% 🚀
assets/docs.self-hosting-rag-BBrDZN1r.js (New) 4.35kB 4.35kB 100.0% 🚀
assets/control-primitives-CUYZusJI.js (New) 3.75kB 3.75kB 100.0% 🚀
assets/docs.ai-summaries-B9BPIDzv.js (New) 3.04kB 3.04kB 100.0% 🚀
assets/docs.branch-analysis-BzSyTOzO.js (New) 2.91kB 2.91kB 100.0% 🚀
assets/docs.mcp-clients-C16BCyEg.js (New) 2.9kB 2.9kB 100.0% 🚀
assets/api-Bxi-Lxdo.js (New) 2.73kB 2.73kB 100.0% 🚀
assets/docs-BsIi8n98.js (New) 2.67kB 2.67kB 100.0% 🚀
assets/docs.quickstart-D0eiTM-X.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/alert-dialog-CtumLt-C.js (New) 2.07kB 2.07kB 100.0% 🚀
assets/docs.upstream-drift-CAGt7Hgv.js (New) 2.04kB 2.04kB 100.0% 🚀
assets/button-CZAasUsl.js (New) 1.74kB 1.74kB 100.0% 🚀
assets/app.workbench-DfbJaFwt.js (New) 1.63kB 1.63kB 100.0% 🚀
assets/tooltip-z-46Wql4.js (New) 1.45kB 1.45kB 100.0% 🚀
assets/session-BnbR3WCO.js (New) 1.44kB 1.44kB 100.0% 🚀
assets/tabs-BYnYlOEZ.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/trend-chart-Dch1DIyX.js (New) 1.22kB 1.22kB 100.0% 🚀
assets/app.repos-BS_b_etY.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/switch-BN_MCHlR.js (New) 982 bytes 982 bytes 100.0% 🚀
assets/analytics-card-shell-BcelZpIE.js (New) 972 bytes 972 bytes 100.0% 🚀
assets/use-api-resource-BnR1Zy21.js (New) 934 bytes 934 bytes 100.0% 🚀
assets/input-Bm5OSXgm.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/refresh-meta-CQy3MJHF.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-ChN4jozK.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-CI5hOmUR.js (New) 501 bytes 501 bytes 100.0% 🚀
assets/sparkles-B0OJ-otJ.js (New) 494 bytes 494 bytes 100.0% 🚀
assets/app.owner-DZaVUDmj.js (New) 473 bytes 473 bytes 100.0% 🚀
assets/app.commands-6ATlKa4m.js (New) 454 bytes 454 bytes 100.0% 🚀
assets/reveal-tyri65J6.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/app.playground-BJlBSbe8.js (New) 441 bytes 441 bytes 100.0% 🚀
assets/index-BNpb_Qm2.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/eye-off-CbL90C3o.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.digest-Cfvc-rMF.js (New) 429 bytes 429 bytes 100.0% 🚀
assets/app.miner-Y-KxEeKx.js (New) 421 bytes 421 bytes 100.0% 🚀
assets/key-round-G-RHlvNF.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-Dlsz5ERG.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-BF5aO9ew.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-BzMkEN9d.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-Cvi9rKzg.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/shield-check-BQG0mdp6.js (New) 320 bytes 320 bytes 100.0% 🚀
assets/wrench-DZyAKqI4.js (New) 303 bytes 303 bytes 100.0% 🚀
assets/bell-DDODRopa.js (New) 290 bytes 290 bytes 100.0% 🚀
assets/list-checks-ifxC_0Ih.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/shield-DJaTYLCr.js (New) 272 bytes 272 bytes 100.0% 🚀
assets/workflow-D7WadMH3.js (New) 265 bytes 265 bytes 100.0% 🚀
assets/chart-column-Bahs5bGC.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/compass-BrZbtEm7.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/skeleton-ClaGIU2I.js (New) 241 bytes 241 bytes 100.0% 🚀
assets/history-DvqPJWdM.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/activity-BZpX0SZP.js (New) 234 bytes 234 bytes 100.0% 🚀
assets/message-square-PFYAnUaR.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/download-CuH5fuz_.js (New) 232 bytes 232 bytes 100.0% 🚀
assets/chevron-right-DmvvTHSJ.js (New) 207 bytes 207 bytes 100.0% 🚀
assets/lock-C6mBh1Ka.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-C5MnI0fW.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-CbVNYJq7.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-B1Yr8xr8.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-BVvlqyIh.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/circle-CWZKbbAb.js (New) 130 bytes 130 bytes 100.0% 🚀
assets/tanstack-vendor-Dif8XsKC.js (Deleted) -718.45kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BcBZ8WTF.js (Deleted) -75.5kB 0 bytes -100.0% 🗑️
assets/ui-vendor-BF-usqSI.js (Deleted) -65.83kB 0 bytes -100.0% 🗑️
assets/owner-panel-DAlrt7dy.js (Deleted) -58.6kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-configuration-9w86G5ho.js (Deleted) -48.42kB 0 bytes -100.0% 🗑️
assets/app.analytics-COy3Yi0N.js (Deleted) -36.26kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-release-checklist-CldY9wI3.js (Deleted) -34.54kB 0 bytes -100.0% 🗑️
assets/docs.tuning-DdIN6e3y.js (Deleted) -34.22kB 0 bytes -100.0% 🗑️
assets/routes-BJwJklsB.js (Deleted) -34.04kB 0 bytes -100.0% 🗑️
assets/app.runs-Bv9tWrc7.js (Deleted) -27.11kB 0 bytes -100.0% 🗑️
assets/app-C42RuZQX.js (Deleted) -25.83kB 0 bytes -100.0% 🗑️
assets/app.operator-BExGCT-l.js (Deleted) -24.59kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-security-B-B7r6up.js (Deleted) -21.3kB 0 bytes -100.0% 🗑️
assets/docs.github-app-Cy35zbjL.js (Deleted) -19.49kB 0 bytes -100.0% 🗑️
assets/miner-panel-DQeaeQK9.js (Deleted) -19.23kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-troubleshooting-DYQgdzMS.js (Deleted) -18.47kB 0 bytes -100.0% 🗑️
assets/api._op-Bzfk7GNE.js (Deleted) -17.89kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-github-app-BPX8b46f.js (Deleted) -17.32kB 0 bytes -100.0% 🗑️
assets/docs.how-reviews-work-Bj-aCJSR.js (Deleted) -16.95kB 0 bytes -100.0% 🗑️
assets/app.index-B-ot0DsP.js (Deleted) -16.19kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-self-hosting-Dqd5auL3.js (Deleted) -15.99kB 0 bytes -100.0% 🗑️
assets/playground-panel-CrC5KAdf.js (Deleted) -14.43kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-quickstart-Eyzjr-V-.js (Deleted) -14.15kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-docs-audit-9BZBUNc4.js (Deleted) -12.14kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-install-trust-BfPIuSLw.js (Deleted) -10.51kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-backup-scaling-a6wvgn3A.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/docs.beta-onboarding-CxZQq8tv.js (Deleted) -9.95kB 0 bytes -100.0% 🗑️
assets/app.audit-BZJQeTN2.js (Deleted) -9.35kB 0 bytes -100.0% 🗑️
assets/extension-D93JJIFW.js (Deleted) -9.21kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-Xqz_r14l.js (Deleted) -8.95kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-ai-providers-BlUlZgQM.js (Deleted) -8.92kB 0 bytes -100.0% 🗑️
assets/app.config-generator-16pmC5yL.js (Deleted) -8.13kB 0 bytes -100.0% 🗑️
assets/maintainers-CkJBgbSn.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-CUypq11g.js (Deleted) -7.88kB 0 bytes -100.0% 🗑️
assets/agents-1dxq_v25.js (Deleted) -7.76kB 0 bytes -100.0% 🗑️
assets/docs.privacy-security-BUTYpqDf.js (Deleted) -7.21kB 0 bytes -100.0% 🗑️
assets/docs.owner-checklist-B8hy9fxU.js (Deleted) -7.0kB 0 bytes -100.0% 🗑️
assets/commands-panel-DZGoQ6s6.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-releases-DU5s0Bhm.js (Deleted) -6.62kB 0 bytes -100.0% 🗑️
assets/roadmap-rBUC4frG.js (Deleted) -6.33kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-analyzers-Bd631kXv.js (Deleted) -6.05kB 0 bytes -100.0% 🗑️
assets/digest-panel-ihKQVxLL.js (Deleted) -6.04kB 0 bytes -100.0% 🗑️
assets/docs.loopover-commands-Dba6jQG0.js (Deleted) -5.18kB 0 bytes -100.0% 🗑️
assets/docs.scoreability-BmKQSiUd.js (Deleted) -5.05kB 0 bytes -100.0% 🗑️
assets/docs.troubleshooting-DG8Nk2--.js (Deleted) -4.91kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-D-v6e9kf.js (Deleted) -4.87kB 0 bytes -100.0% 🗑️
assets/api.index-3GKiIzPP.js (Deleted) -4.78kB 0 bytes -100.0% 🗑️
assets/docs.index-CkAdqis6.js (Deleted) -4.68kB 0 bytes -100.0% 🗑️
assets/changelog-BLhdsOST.js (Deleted) -4.67kB 0 bytes -100.0% 🗑️
assets/docs.maintainer-workflow-B8aDO4lC.js (Deleted) -4.36kB 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rag-C2GVenu0.js (Deleted) -4.35kB 0 bytes -100.0% 🗑️
assets/control-primitives-BvQ7XYPd.js (Deleted) -3.75kB 0 bytes -100.0% 🗑️
assets/docs.ai-summaries-BTNf3XNU.js (Deleted) -3.04kB 0 bytes -100.0% 🗑️
assets/docs.branch-analysis-D91CTjdB.js (Deleted) -2.91kB 0 bytes -100.0% 🗑️
assets/docs.mcp-clients-D2pACjRS.js (Deleted) -2.9kB 0 bytes -100.0% 🗑️
assets/api-C0gmcORb.js (Deleted) -2.73kB 0 bytes -100.0% 🗑️
assets/docs-DPIUaI8g.js (Deleted) -2.67kB 0 bytes -100.0% 🗑️
assets/docs.quickstart-BOgrZFcl.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/alert-dialog-eGvvefUK.js (Deleted) -2.07kB 0 bytes -100.0% 🗑️
assets/docs.upstream-drift-3TjedH52.js (Deleted) -2.04kB 0 bytes -100.0% 🗑️
assets/button-UOQnhyYn.js (Deleted) -1.74kB 0 bytes -100.0% 🗑️
assets/app.workbench-D1Sldna1.js (Deleted) -1.63kB 0 bytes -100.0% 🗑️
assets/tooltip-BbTfeqY5.js (Deleted) -1.45kB 0 bytes -100.0% 🗑️
assets/session-BxQU1jzG.js (Deleted) -1.44kB 0 bytes -100.0% 🗑️
assets/tabs-DzrbttIm.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/trend-chart-G1l8Vs2i.js (Deleted) -1.22kB 0 bytes -100.0% 🗑️
assets/app.repos-ZpqmYp8w.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/switch-9Blna0--.js (Deleted) -982 bytes 0 bytes -100.0% 🗑️
assets/analytics-card-shell-Dn6SC1uI.js (Deleted) -972 bytes 0 bytes -100.0% 🗑️
assets/use-api-resource-BF9LO61y.js (Deleted) -934 bytes 0 bytes -100.0% 🗑️
assets/input-BK0DPyzZ.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/refresh-meta-BsVJIChW.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-CIFPeuXq.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-B3NgOmzL.js (Deleted) -501 bytes 0 bytes -100.0% 🗑️
assets/sparkles-xHCPDtps.js (Deleted) -494 bytes 0 bytes -100.0% 🗑️
assets/app.owner-DWi4pDK8.js (Deleted) -473 bytes 0 bytes -100.0% 🗑️
assets/app.commands-eTbNciWs.js (Deleted) -454 bytes 0 bytes -100.0% 🗑️
assets/reveal-CUGo_wiF.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/app.playground-DBI5WbDx.js (Deleted) -441 bytes 0 bytes -100.0% 🗑️
assets/index-BzhXLtpe.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/eye-off-D8Rnge7Y.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.digest-BQWvCYM7.js (Deleted) -429 bytes 0 bytes -100.0% 🗑️
assets/app.miner-CgTNq_4L.js (Deleted) -421 bytes 0 bytes -100.0% 🗑️
assets/key-round-BiI7fpvr.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-Cx94FS-b.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-C218Pwvw.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-FykLfS3u.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-CCUspvSv.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/shield-check-C79agp9f.js (Deleted) -320 bytes 0 bytes -100.0% 🗑️
assets/wrench-DXD88PDo.js (Deleted) -303 bytes 0 bytes -100.0% 🗑️
assets/bell-Dhr5idbi.js (Deleted) -290 bytes 0 bytes -100.0% 🗑️
assets/list-checks-DUNlurVD.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/shield-D7DVOAka.js (Deleted) -272 bytes 0 bytes -100.0% 🗑️
assets/workflow-BvCgcpba.js (Deleted) -265 bytes 0 bytes -100.0% 🗑️
assets/chart-column-D7gHM-F0.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/compass-BvKaWIeM.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/skeleton-oSijkFy5.js (Deleted) -241 bytes 0 bytes -100.0% 🗑️
assets/history-DlURcTFS.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/activity-C4uWexvl.js (Deleted) -234 bytes 0 bytes -100.0% 🗑️
assets/message-square-asBzEXDL.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/download-BskLXpBs.js (Deleted) -232 bytes 0 bytes -100.0% 🗑️
assets/chevron-right-CU7WbaZp.js (Deleted) -207 bytes 0 bytes -100.0% 🗑️
assets/lock-DWhUezzb.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-REpNRjY7.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-CrWDrTJp.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-ND1Mnxid.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-BxzAbrUF.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️
assets/circle-BO1hJ_ci.js (Deleted) -130 bytes 0 bytes -100.0% 🗑️

@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 06:20:13 UTC

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

⏸️ Suggested Action - Manual Review

Review summary
This PR closes a real config/doc drift: `GateCheckPolicy.sizeGateMode` docs already referenced `sizeGateMaxFiles`/`sizeGateMaxLines` as if they were real fields, but the thresholds were hardcoded module constants with no config path. The change wires `gate.size.maxFiles`/`maxLines` end-to-end through both the host and engine config layers, `RepositorySettings`, `gateCheckPolicy()`, `buildSizeHoldFinding` (both twins), OpenAPI, and docs, defaulting to the existing 10-file/1000-line constants when unset so existing behavior is unchanged until an operator opts in. The threading is consistent across all call sites shown (`??`/explicit null-checks used correctly in both `src/rules/advisory.ts` and its engine twin `gate-advisory.ts`), and new tests cover raised/lowered thresholds plus the explicit-null-falls-back-to-default case.

Nits — 5 non-blocking
  • The description doesn't include an explicit "Closes #NNNN" issue link — please confirm this ties to a maintainer-authorized issue rather than being unsolicited scope, per repo convention.
  • apps/loopover-ui/public/openapi.json:9662-9667 adds `sizeGateMaxFiles`/`sizeGateMaxLines` as bare `{"type": "number"}` with no description, unlike most other fields in this schema — worth a one-line description matching the Zod comments in src/openapi/schemas.ts.
  • src/openapi/schemas.ts:684-685 uses `z.number().optional()` with no positivity/integer constraint, so a directly-set API value could bypass the `normalizeOptionalPositiveInteger` guard that only applies to `.loopover.yml` parsing — low risk since this is described as config-only, but worth confirming no dashboard write path exists for these fields.
  • Consider adding `.int().positive()` to the `sizeGateMaxFiles`/`sizeGateMaxLines` Zod schema entries in src/openapi/schemas.ts:684-685 to mirror the config-layer validation.
  • Add a short description to the new OpenAPI properties in apps/loopover-ui/public/openapi.json for consistency with neighboring fields.

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
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 <question> answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat <question> 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 f56edd2 into main Jul 15, 2026
17 checks passed
@JSONbored
JSONbored deleted the fix/config-size-gate-thresholds branch July 15, 2026 06:24
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