Skip to content

refactor(gate): delete the dead firstTimeContributorGrace surface end-to-end - #6714

Merged
loopover-orb[bot] merged 1 commit into
mainfrom
fix/config-as-code-gate-consolidation-6446
Jul 16, 2026
Merged

refactor(gate): delete the dead firstTimeContributorGrace surface end-to-end#6714
loopover-orb[bot] merged 1 commit into
mainfrom
fix/config-as-code-gate-consolidation-6446

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • Decision 1 (no code change needed): the 7 fields reachable only via the secondary gate: block (gatePack, slopGateMode/slopGateMinScore/slopAiAdvisory, mergeReadinessGateMode, manifestPolicyGateMode, linkedIssueSatisfactionGateMode, requireFreshRebaseWindowMinutes, aiReviewLowConfidenceDisposition) are confirmed wired through applyGateConfigOverrides and already have DB columns + dashboard UI — so consolidating on gate: alone (no new settings.* twins) requires no source change here, matching config-as-code: migrate gate/quality/AI-review mode settings off the DB (settings: + gate: dedup) #6444's identical decision for its own field set.
  • Decision 2 (this PR's actual scope): firstTimeContributorGrace has been RESERVED/INERT since fix(review): mark gate.firstTimeContributorGrace as reserved/inert #2411 deliberately stopped evaluateGateCheckCore from reading it — a would-be blocker gates a genuine newcomer exactly like a repeat contributor, by design (blocker findings must remain closure/rejection outcomes for the gate's one-shot model). Rather than re-wire a softened-block exception against that settled principle, this deletes the dead surface entirely:
    • the DB column (migration 0161) and its getRepositorySettings/upsertRepositorySettings plumbing,
    • RepositorySettings["firstTimeContributorGrace"] and the maintainer settings write schema,
    • .loopover.yml's gate.firstTimeContributorGrace parsing, its reserved/inert parse-time warning, and the field itself, in both the app's src/signals/focus-manifest.ts and the engine's packages/loopover-engine/src/focus-manifest.ts,
    • the predicted-gate engine mirror (predicted-gate.ts/predicted-gate-types.ts/manifest-deps-types.ts),
    • the dashboard's disabled disclosure toggle added by fix(ui): disclose the inert firstTimeContributorGrace dashboard toggle #5321 ("Reserved — currently has no effect on gate decisions"),
    • and every doc/example mention (.loopover.yml.example, config/examples/loopover.full.yml, self-hosting-configuration.mdx).
  • authorMergedPrCount/authorClosedUnmergedPrCount (the sibling RESERVED/INERT fields the old grace logic would have consulted) are explicitly out of scope and untouched — only firstTimeContributorGrace itself was named in config-as-code: expose gate:-only fields under settings:, resolve firstTimeContributorGrace #6446's decision.

Closes #6446, closes epic #6440 — all four config-as-code batches (#6442/#6443/#6445/#6446) are now shipped or in-flight.

Scope

Validation

  • git diff --check
  • npm run actionlint
  • npm run typecheck
  • npm run test:coverage locally — 100% patch coverage confirmed by hand-checking every added line across all 8 changed backend source files (routes.ts, repositories.ts, gate-checks.ts, processors.ts, advisory.ts, focus-manifest.ts, settings-preview.ts, openapi/schemas.ts) against coverage/lcov.info — zero 0-hit lines in the diff.
  • npm run test:workers
  • npm run build:mcp
  • npm run test:mcp-pack
  • npm run ui:openapi:check + ui:openapi:settings-parity (confirms the RepositorySettings field count actually dropped, 111 → 110 — a genuine deletion, unlike the prior config-as-code batches which kept the type unchanged)
  • npm run docs:drift-check / manifest:drift-check / engine-parity:drift-check / command-reference:check
  • npm run ui:lint
  • npm run ui:typecheck
  • npm run ui:build
  • npm audit --audit-level=moderate — not run (no dependency changes in this PR).
  • New/changed behavior has tests: deleted the dedicated firstTimeContributorGrace test blocks in focus-manifest.test.ts (parsing + the reserved/inert warning), gate-check-policy.test.ts (the field-specific end-to-end test), and predicted-gate.test.ts (the field-specific duplicate-blocker test), while preserving the still-real invariant tests in a renamed gate-check-policy.test.ts describe block ("author-history blockers stay unsoftened") that confirms blockers are never softened by authorMergedPrCount/authorClosedUnmergedPrCount alone — the actual fix(review): mark gate.firstTimeContributorGrace as reserved/inert #2411 regression guard, now without a dead field as its trigger. Also deleted the dedicated engine-parity golden fixture (first-time-grace-inert.ts + its committed .json golden) and its index.ts registration, and fixed ~20 other test files' now-invalid RepositorySettings/FocusManifestGateConfig fixture literals.

Full local npm run test:ci passed 100% clean end-to-end on the first attempt after rebasing onto the latest main (which had picked up the now-merged #6445 in the meantime, requiring a migration renumber from 0160 to 0161 after a collision) — zero failures anywhere in the entire gate, including the two flaky filesystem/subprocess tests (agent-sdk-driver.test.ts, miner-repo-clone.test.ts) that had intermittently timed out on earlier local runs from machine load this session.

Safety

  • No secrets/wallet/hotkey/PAT/trust-score exposure.
  • Public GitHub text unaffected.
  • No auth/cookie/CORS/session changes.
  • Dashboard change (removing the now-pointless "First-time-contributor grace" disabled-disclosure toggle) uses live data, no mock fallback.
  • N/A UI Evidence — maintainer-authored PR, per standing team convention the screenshot-table requirement doesn't bind owner PRs.
  • Docs updated: removed the gate.firstTimeContributorGrace entry from self-hosting-configuration.mdx, .loopover.yml.example, and config/examples/loopover.full.yml.

Notes

…-to-end

Confirmed via #6446's two decisions: (1) the 7 gate:-only fields
(gatePack, slopGateMode/slopGateMinScore/slopAiAdvisory,
mergeReadinessGateMode, manifestPolicyGateMode,
linkedIssueSatisfactionGateMode, requireFreshRebaseWindowMinutes,
aiReviewLowConfidenceDisposition) are already correctly wired through
applyGateConfigOverrides and already have DB columns + dashboard UI, so no
new settings.* twins are added -- gate: stays canonical, matching #6444's
decision. (2) firstTimeContributorGrace has been RESERVED/INERT since
#2411 deliberately stopped evaluateGateCheckCore from reading it (blocker
findings must remain closure/rejection outcomes, not softened for a
newcomer) -- rather than wiring it in against that settled design, this
deletes the dead surface entirely: the DB column (migration 0161), the
manifest gate.firstTimeContributorGrace parsing in both the app and
engine copies of focus-manifest.ts, the predicted-gate engine mirror, the
dashboard's disabled disclosure toggle (#5321), and every doc/example
mention.

Closes #6446, closes epic #6440 (all four config-as-code batches now
shipped).
@superagent-security

Copy link
Copy Markdown
Contributor

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

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
loopover-ui 9005e5a Commit Preview URL

Branch Preview URL
Jul 16 2026, 08:20 PM

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 2.11kB (0.03%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.54MB 2.11kB (0.03%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-BSmeXASq.js (New) 2.17MB 2.17MB 100.0% 🚀
assets/tanstack-vendor-NK47vw2r.js (New) 702.85kB 702.85kB 100.0% 🚀
openapi.json 2.04kB 502.63kB 0.41%
assets/docs.fumadocs-spike-api-reference-nB5fcT2w.js (New) 442.94kB 442.94kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-DkAO5flQ.js (New) 201.71kB 201.71kB 100.0% 🚀
assets/modal-BA7YhLcb.js (New) 184.28kB 184.28kB 100.0% 🚀
assets/client-BoOACK9o.js (New) 146.06kB 146.06kB 100.0% 🚀
assets/maintainer-panel-D7-70XKv.js (New) 80.66kB 80.66kB 100.0% 🚀
assets/self-hosting-configuration-DAC-XfPl.js (New) 77.08kB 77.08kB 100.0% 🚀
assets/ui-vendor-TP-QLG2G.js (New) 65.93kB 65.93kB 100.0% 🚀
assets/app.analytics-Bu1xPBF8.js (New) 34.92kB 34.92kB 100.0% 🚀
assets/routes-BNQbj7fv.js (New) 34.04kB 34.04kB 100.0% 🚀
assets/app.runs-DXN04oxV.js (New) 27.14kB 27.14kB 100.0% 🚀
assets/owner-panel-DjjLgr3V.js (New) 27.02kB 27.02kB 100.0% 🚀
assets/app.operator-BoKcgSlN.js (New) 26.03kB 26.03kB 100.0% 🚀
assets/app-D59ikgbj.js (New) 25.84kB 25.84kB 100.0% 🚀
assets/miner-panel-r3qQ1QI7.js (New) 20.49kB 20.49kB 100.0% 🚀
assets/docs-source-U_Bas3ja.js (New) 19.3kB 19.3kB 100.0% 🚀
assets/api._op-CCtnUwl-.js (New) 17.89kB 17.89kB 100.0% 🚀
assets/self-hosting-docs-audit-84L_MaHO.js (New) 16.73kB 16.73kB 100.0% 🚀
assets/app.index-DB1WvTF9.js (New) 16.19kB 16.19kB 100.0% 🚀
assets/playground-panel-CkMldtyR.js (New) 14.43kB 14.43kB 100.0% 🚀
assets/app.audit-D0gEVkk1.js (New) 9.62kB 9.62kB 100.0% 🚀
assets/extension-VJbCts6X.js (New) 9.21kB 9.21kB 100.0% 🚀
assets/app.config-generator-Dz4YQ_o0.js (New) 9.19kB 9.19kB 100.0% 🚀
assets/maintainers-C_0okfRb.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-BqF1cPV0.js (New) 7.89kB 7.89kB 100.0% 🚀
assets/agents-Cc-Du69T.js (New) 7.76kB 7.76kB 100.0% 🚀
assets/commands-panel-CUClgM3O.js (New) 6.72kB 6.72kB 100.0% 🚀
assets/digest-panel-DqPN82y6.js (New) 6.34kB 6.34kB 100.0% 🚀
assets/roadmap-CuEjxh9y.js (New) 6.33kB 6.33kB 100.0% 🚀
assets/docs.index-oVEw6xNG.js (New) 5.42kB 5.42kB 100.0% 🚀
assets/repos._owner._repo.quality-DCAbJV3x.js (New) 5.09kB 5.09kB 100.0% 🚀
assets/api.index-COuQlpMX.js (New) 4.78kB 4.78kB 100.0% 🚀
assets/changelog-R2yWPp9T.js (New) 4.67kB 4.67kB 100.0% 🚀
assets/control-primitives-TjeMzK00.js (New) 3.75kB 3.75kB 100.0% 🚀
assets/api-p7RwMYiE.js (New) 2.73kB 2.73kB 100.0% 🚀
assets/docs-BYNlO7XF.js (New) 2.67kB 2.67kB 100.0% 🚀
assets/alert-dialog-BjRj0ErJ.js (New) 2.07kB 2.07kB 100.0% 🚀
assets/button-BnXukcNv.js (New) 1.74kB 1.74kB 100.0% 🚀
assets/app.workbench-YD4EwCyR.js (New) 1.63kB 1.63kB 100.0% 🚀
assets/tooltip-C2Jj9GJi.js (New) 1.45kB 1.45kB 100.0% 🚀
assets/session-XQTi7FRZ.js (New) 1.44kB 1.44kB 100.0% 🚀
assets/tabs-CHRk004l.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/trend-chart-DvfrXoRm.js (New) 1.22kB 1.22kB 100.0% 🚀
assets/app.repos-B-St_0SB.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/analytics-card-shell-ByP2-w_A.js (New) 987 bytes 987 bytes 100.0% 🚀
assets/switch-Dwpw9STo.js (New) 982 bytes 982 bytes 100.0% 🚀
assets/use-api-resource-CD6oOT46.js (New) 934 bytes 934 bytes 100.0% 🚀
assets/refresh-meta-Cb4zoADO.js (New) 797 bytes 797 bytes 100.0% 🚀
assets/input-BEubXghZ.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-BdLjuquO.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/docs.ai-summaries-DoYS0Jdp.js (New) 568 bytes 568 bytes 100.0% 🚀
assets/docs.scoreability-LPL-jH8Q.js (New) 562 bytes 562 bytes 100.0% 🚀
assets/docs.upstream-drift-DEwHvuJy.js (New) 562 bytes 562 bytes 100.0% 🚀
assets/docs.branch-analysis-DsSqnlNG.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-ai-providers-Dg-jR_qM.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-backup-scaling-CVWn1ySL.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-configuration-4840wh5f.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-docs-audit-CqZcMIte.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-github-app-wgmoRL6b.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-quickstart-BJf9xMa9.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-rag-DoNjdEjd.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-rees-DuKkEI77.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-rees-analyzers-NLu8JIyU.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-release-checklist-DoR_YdZ9.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-releases-DZggCx73.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-security-sFkToq4l.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-troubleshooting-BfkW3I8t.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.self-hosting-unified-ams-orb-DC-X0kUA.js (New) 561 bytes 561 bytes 100.0% 🚀
assets/docs.federated-fleet-intelligence-BK66cBZ4.js (New) 560 bytes 560 bytes 100.0% 🚀
assets/docs.maintainer-install-trust-0MF4nMD6.js (New) 560 bytes 560 bytes 100.0% 🚀
assets/docs.mcp-clients-BzG_pp5m.js (New) 560 bytes 560 bytes 100.0% 🚀
assets/docs.owner-checklist-CuPsCkDA.js (New) 560 bytes 560 bytes 100.0% 🚀
assets/docs.quickstart-BLvlzyo7.js (New) 560 bytes 560 bytes 100.0% 🚀
assets/docs.ams-config-precedence-CT_S9U1M.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-deployment-DNC-iO-F.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-discovery-plane-QIr-76rl.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-env-reference-Cw_ouhFS.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-fleet-manifest-BNbsKzcN.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-goal-spec-BpF4nPpm.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-observability-c4ZiOQLD.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-operations-runbook-B5Y-p9Wa.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-sizing-BQyIyXwv.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.ams-unattended-scheduling-SN3fld8n.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.beta-onboarding-Clpbaqzx.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.maintainer-self-hosting-76plcwWb.js (New) 559 bytes 559 bytes 100.0% 🚀
assets/docs.maintainer-workflow-DK1Wn0mk.js (New) 558 bytes 558 bytes 100.0% 🚀
assets/docs.privacy-security-9ygg5VcY.js (New) 558 bytes 558 bytes 100.0% 🚀
assets/docs.troubleshooting-CCtmReIr.js (New) 558 bytes 558 bytes 100.0% 🚀
assets/docs.tuning-B0FNcXDD.js (New) 558 bytes 558 bytes 100.0% 🚀
assets/docs.github-app-BRn1CxTq.js (New) 557 bytes 557 bytes 100.0% 🚀
assets/docs.loopover-commands-CgtblUBN.js (New) 556 bytes 556 bytes 100.0% 🚀
assets/docs.how-reviews-work-DmmPvIXx.js (New) 555 bytes 555 bytes 100.0% 🚀
assets/app.maintainer-CimIIQIK.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/sparkles-pRLBXA4r.js (New) 494 bytes 494 bytes 100.0% 🚀
assets/app.owner-t2w5KKIe.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-CaWCG80o.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-yjrNPwWq.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/reveal-DtWafoQl.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-GAbomI0y.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-q9Tf7RRN.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-QyMJlYzQ.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-8i3Zm53c.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-S3LSkPZ4.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-CcF6i05G.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-2N7lbMy1.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-BKpXatGs.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-DLM7LMBB.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/shield-check-CJ-Mr1kQ.js (New) 320 bytes 320 bytes 100.0% 🚀
assets/wrench-D-Iuvyf-.js (New) 303 bytes 303 bytes 100.0% 🚀
assets/bell-DZwqdSy2.js (New) 290 bytes 290 bytes 100.0% 🚀
assets/data-table-lq9jDvwj.js (New) 289 bytes 289 bytes 100.0% 🚀
assets/list-checks-C6kmCpM5.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/shield-BatP49--.js (New) 272 bytes 272 bytes 100.0% 🚀
assets/workflow-Bsicitmv.js (New) 265 bytes 265 bytes 100.0% 🚀
assets/chart-column-xZ6-YURV.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/compass-Bm5f4t1H.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/skeleton-Bnkajo0_.js (New) 241 bytes 241 bytes 100.0% 🚀
assets/history--ESEpoAS.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/activity-DS4u1mQk.js (New) 234 bytes 234 bytes 100.0% 🚀
assets/message-square-C3-dNm7L.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/download-B-LDlmgn.js (New) 232 bytes 232 bytes 100.0% 🚀
assets/chevron-right-B_yzbnVi.js (New) 207 bytes 207 bytes 100.0% 🚀
assets/lock-MybQE4Xm.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-si_qF-KU.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-DlpLVJzy.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-CE4tqZxa.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-D2s1IaXv.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/self-hosting-configuration-CIk7LHvo.js (New) 144 bytes 144 bytes 100.0% 🚀
assets/self-hosting-docs-audit-B0jf392o.js (New) 141 bytes 141 bytes 100.0% 🚀
assets/circle-Dsn3uJGx.js (New) 130 bytes 130 bytes 100.0% 🚀
assets/modal-uiECYzRG.js (New) 115 bytes 115 bytes 100.0% 🚀
assets/add-scalar-classes-DcCh9wQv.js (Deleted) -2.17MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-C3juqa2s.js (Deleted) -701.95kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-BQEnegeu.js (Deleted) -442.94kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-Bem8CZfw.js (Deleted) -201.71kB 0 bytes -100.0% 🗑️
assets/modal-DMJ6Tza1.js (Deleted) -184.28kB 0 bytes -100.0% 🗑️
assets/client-BL95AEDH.js (Deleted) -146.06kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-Cbh3lVF_.js (Deleted) -80.86kB 0 bytes -100.0% 🗑️
assets/self-hosting-configuration-DMHAD4D8.js (Deleted) -77.68kB 0 bytes -100.0% 🗑️
assets/ui-vendor--Upel2cH.js (Deleted) -65.93kB 0 bytes -100.0% 🗑️
assets/app.analytics-CZHuVmC4.js (Deleted) -34.92kB 0 bytes -100.0% 🗑️
assets/routes-BqZ_Rhh2.js (Deleted) -34.04kB 0 bytes -100.0% 🗑️
assets/app.runs-BseGKyre.js (Deleted) -27.14kB 0 bytes -100.0% 🗑️
assets/owner-panel-Z0_z8CpX.js (Deleted) -27.05kB 0 bytes -100.0% 🗑️
assets/app.operator-BiJ9k7mQ.js (Deleted) -26.03kB 0 bytes -100.0% 🗑️
assets/app-CBiYIcrB.js (Deleted) -25.84kB 0 bytes -100.0% 🗑️
assets/miner-panel-CIJOMmt1.js (Deleted) -20.49kB 0 bytes -100.0% 🗑️
assets/docs-source-BMepbFzS.js (Deleted) -19.3kB 0 bytes -100.0% 🗑️
assets/api._op-2Pd0qnqF.js (Deleted) -17.89kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-BCLFylIG.js (Deleted) -16.73kB 0 bytes -100.0% 🗑️
assets/app.index--SxAzO9K.js (Deleted) -16.19kB 0 bytes -100.0% 🗑️
assets/playground-panel-CXNx3qAx.js (Deleted) -14.43kB 0 bytes -100.0% 🗑️
assets/app.audit-BjwKJGKs.js (Deleted) -9.62kB 0 bytes -100.0% 🗑️
assets/extension-C0JvTPeR.js (Deleted) -9.21kB 0 bytes -100.0% 🗑️
assets/app.config-generator-BSWclnBK.js (Deleted) -9.19kB 0 bytes -100.0% 🗑️
assets/maintainers-DD6ydoIh.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-JDX6zw9S.js (Deleted) -7.89kB 0 bytes -100.0% 🗑️
assets/agents-DbInLTU8.js (Deleted) -7.76kB 0 bytes -100.0% 🗑️
assets/commands-panel-_5Z_znJ5.js (Deleted) -6.72kB 0 bytes -100.0% 🗑️
assets/digest-panel-YmIqgnFy.js (Deleted) -6.34kB 0 bytes -100.0% 🗑️
assets/roadmap-QCZ884al.js (Deleted) -6.33kB 0 bytes -100.0% 🗑️
assets/docs.index-D8NKE0jd.js (Deleted) -5.42kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-CU5RCkqS.js (Deleted) -5.09kB 0 bytes -100.0% 🗑️
assets/api.index-Daqbl_sa.js (Deleted) -4.78kB 0 bytes -100.0% 🗑️
assets/changelog-DPqir3aR.js (Deleted) -4.67kB 0 bytes -100.0% 🗑️
assets/control-primitives-DaeU4g6j.js (Deleted) -3.75kB 0 bytes -100.0% 🗑️
assets/api-D01L9A9h.js (Deleted) -2.73kB 0 bytes -100.0% 🗑️
assets/docs-Ae8SDWRd.js (Deleted) -2.67kB 0 bytes -100.0% 🗑️
assets/alert-dialog-iARScjKQ.js (Deleted) -2.07kB 0 bytes -100.0% 🗑️
assets/button-BNTe4_wo.js (Deleted) -1.74kB 0 bytes -100.0% 🗑️
assets/app.workbench-CMVBJO1L.js (Deleted) -1.63kB 0 bytes -100.0% 🗑️
assets/tooltip-BWuAgQWA.js (Deleted) -1.45kB 0 bytes -100.0% 🗑️
assets/session-CQM8eoiZ.js (Deleted) -1.44kB 0 bytes -100.0% 🗑️
assets/tabs-CF1MpJVD.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/trend-chart-ilT26Io7.js (Deleted) -1.22kB 0 bytes -100.0% 🗑️
assets/app.repos-CQXFc7nw.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/analytics-card-shell-MI24CbQu.js (Deleted) -987 bytes 0 bytes -100.0% 🗑️
assets/switch-BSEmgOMd.js (Deleted) -982 bytes 0 bytes -100.0% 🗑️
assets/use-api-resource-DXGhXBhX.js (Deleted) -934 bytes 0 bytes -100.0% 🗑️
assets/refresh-meta-DBhmN-rh.js (Deleted) -797 bytes 0 bytes -100.0% 🗑️
assets/input-iIANMRrL.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-DIIG3l2_.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/docs.ai-summaries-DOMh89iK.js (Deleted) -568 bytes 0 bytes -100.0% 🗑️
assets/docs.scoreability-BLuYJTtt.js (Deleted) -562 bytes 0 bytes -100.0% 🗑️
assets/docs.upstream-drift-ClEnF606.js (Deleted) -562 bytes 0 bytes -100.0% 🗑️
assets/docs.branch-analysis-CK2Z1Ofg.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-ai-providers-BkmyB2so.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-backup-scaling-DsSxsd38.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-configuration-DuQ7C-Hr.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-docs-audit-DX9la_ne.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-github-app-DaB-ocfN.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-quickstart-DizvGI27.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rag-Gj4Kc-6b.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-DrmWKWHk.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-rees-analyzers-DqMb70yT.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-release-checklist-CPlmUcRI.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-releases-Bg8V4Uk4.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-security-qaSF9yYi.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-troubleshooting-BdcTRT16.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.self-hosting-unified-ams-orb-CzNk7ZPa.js (Deleted) -561 bytes 0 bytes -100.0% 🗑️
assets/docs.federated-fleet-intelligence-BY9-UFLq.js (Deleted) -560 bytes 0 bytes -100.0% 🗑️
assets/docs.maintainer-install-trust-D5qGPoal.js (Deleted) -560 bytes 0 bytes -100.0% 🗑️
assets/docs.mcp-clients-BppGOGE2.js (Deleted) -560 bytes 0 bytes -100.0% 🗑️
assets/docs.owner-checklist-Cp3ftzcJ.js (Deleted) -560 bytes 0 bytes -100.0% 🗑️
assets/docs.quickstart-24ODgJ08.js (Deleted) -560 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-config-precedence-XrUWqiMb.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-deployment-CqDCLXY9.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-discovery-plane-CMFQe9DC.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-env-reference-BqGqfEkR.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-fleet-manifest-BF1wDHyu.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-goal-spec-Dp0irI4v.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-observability-DujYr7X6.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-operations-runbook-cyX_G-qi.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-sizing-r8SGDtAX.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.ams-unattended-scheduling-CAIAUyWz.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.beta-onboarding-DCpAWwS-.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.maintainer-self-hosting-CjNOkkH8.js (Deleted) -559 bytes 0 bytes -100.0% 🗑️
assets/docs.maintainer-workflow-CV1AbKuy.js (Deleted) -558 bytes 0 bytes -100.0% 🗑️
assets/docs.privacy-security-CYDTjtLP.js (Deleted) -558 bytes 0 bytes -100.0% 🗑️
assets/docs.troubleshooting-Duh84oPQ.js (Deleted) -558 bytes 0 bytes -100.0% 🗑️
assets/docs.tuning-D2HSMJXC.js (Deleted) -558 bytes 0 bytes -100.0% 🗑️
assets/docs.github-app-BiWNr8wa.js (Deleted) -557 bytes 0 bytes -100.0% 🗑️
assets/docs.loopover-commands-Dh4AmymG.js (Deleted) -556 bytes 0 bytes -100.0% 🗑️
assets/docs.how-reviews-work-5zTYTaAu.js (Deleted) -555 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-QvMmi7pG.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/sparkles-CU3tsZFY.js (Deleted) -494 bytes 0 bytes -100.0% 🗑️
assets/app.owner-B_VicoVd.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-Cx8Nj86P.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-Bb-PEt7E.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/reveal-RrPx8oIr.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-D1_ZZGSs.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-D7T1N1IL.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-8JOeaVXP.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-HHjlkj5M.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-DQoRGU6Z.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-B0iUyb2o.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-CRLlN-5s.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-M_bJGGGk.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-CsiPzGxz.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/shield-check-rjcPFGgo.js (Deleted) -320 bytes 0 bytes -100.0% 🗑️
assets/wrench-iHjz9guM.js (Deleted) -303 bytes 0 bytes -100.0% 🗑️
assets/bell-CTx706N4.js (Deleted) -290 bytes 0 bytes -100.0% 🗑️
assets/data-table-MUffb0lo.js (Deleted) -289 bytes 0 bytes -100.0% 🗑️
assets/list-checks-CYWyYkkM.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/shield-Ch5sB6VR.js (Deleted) -272 bytes 0 bytes -100.0% 🗑️
assets/workflow-DLwZA-uQ.js (Deleted) -265 bytes 0 bytes -100.0% 🗑️
assets/chart-column-BevNYEfw.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/compass-CkodK-EE.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/skeleton-Cs23zOpH.js (Deleted) -241 bytes 0 bytes -100.0% 🗑️
assets/history-MEypmClV.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/activity-zeB3oF0d.js (Deleted) -234 bytes 0 bytes -100.0% 🗑️
assets/message-square-Cu6FfU4l.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/download-BZfWKa6z.js (Deleted) -232 bytes 0 bytes -100.0% 🗑️
assets/chevron-right-TyYML4Zv.js (Deleted) -207 bytes 0 bytes -100.0% 🗑️
assets/lock-BCrAWj5G.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-2p4epSMQ.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-CWZN9iht.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-DBkU8_k3.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-BwyKe4eW.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️
assets/self-hosting-configuration-DIajL_rr.js (Deleted) -144 bytes 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-C2PTiTPM.js (Deleted) -141 bytes 0 bytes -100.0% 🗑️
assets/circle-D_oYdvkn.js (Deleted) -130 bytes 0 bytes -100.0% 🗑️
assets/modal-DrLa99Lp.js (Deleted) -115 bytes 0 bytes -100.0% 🗑️

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.65%. Comparing base (3acc512) to head (9005e5a).
⚠️ Report is 23 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #6714      +/-   ##
==========================================
- Coverage   93.65%   93.65%   -0.01%     
==========================================
  Files         681      682       +1     
  Lines       68098    68112      +14     
  Branches    18695    18697       +2     
==========================================
+ Hits        63775    63788      +13     
  Misses       3347     3347              
- Partials      976      977       +1     
Flag Coverage Δ
shard-1 43.91% <ø> (+0.01%) ⬆️
shard-2 36.80% <ø> (-0.05%) ⬇️
shard-3 32.42% <ø> (+0.02%) ⬆️
shard-4 34.83% <ø> (+0.17%) ⬆️
shard-5 31.01% <ø> (+0.08%) ⬆️
shard-6 45.69% <ø> (+0.03%) ⬆️

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

Files with missing lines Coverage Δ
...ages/loopover-engine/src/advisory/gate-advisory.ts 98.75% <ø> (ø)
packages/loopover-engine/src/focus-manifest.ts 99.03% <ø> (-0.01%) ⬇️
packages/loopover-engine/src/predicted-gate.ts 100.00% <ø> (ø)
src/api/routes.ts 94.60% <ø> (+0.05%) ⬆️
src/db/repositories.ts 96.72% <ø> (-0.01%) ⬇️
src/db/schema.ts 72.97% <ø> (ø)
src/openapi/schemas.ts 100.00% <ø> (ø)
src/queue/gate-checks.ts 100.00% <ø> (ø)
src/queue/processors.ts 95.51% <ø> (ø)
src/rules/advisory.ts 97.77% <ø> (ø)
... and 3 more

... and 1 file with indirect coverage changes

@loopover-orb loopover-orb Bot added the gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier. label Jul 16, 2026
@loopover-orb

loopover-orb Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Tip

✅ LoopOver review result - approve/merge recommended

Review updated: 2026-07-16 20:31:39 UTC

42 files · 1 AI reviewer · no blockers · readiness 98/100 · CI green · clean

✅ Suggested Action - Approve/Merge

  • safe to merge

Review summary
This PR deletes the dead firstTimeContributorGrace surface end-to-end: DB column (with a corresponding migration), schema types, focus-manifest parsing, predicted-gate mirror, dashboard toggle, OpenAPI schema, and all associated tests/fixtures. The removal is consistent and thorough — every producer/consumer site listed in the description is actually touched in the diff, and the migration is a straightforward single-column DROP with no data-migration complexity. The linked issue #6446 only partially covers this PR's scope (it also asks to expose gate:-only fields under settings:, which this PR explicitly defers as "Decision 1: no code change needed"), so the issue-linkage is incomplete for full closure.

Nits — 6 non-blocking
  • The linked issue config-as-code: expose gate:-only fields under settings:, resolve firstTimeContributorGrace #6446 also asks to resolve/expose the gate:-only settings fields under settings:; this PR only addresses the firstTimeContributorGrace deletion half, so the issue won't fully close on merge — worth a comment on the issue clarifying the split.
  • migrations/0161_drop_first_time_contributor_grace.sql:7 drops a column outright; since SQLite's DROP COLUMN is well-supported and D1-safe here, this is fine, but confirm no in-flight deploy still reads `first_time_contributor_grace` during the rollout window.
  • The long comment blocks explaining the historical rationale (fix(review): gate.firstTimeContributorGrace is documented as softening blockers but is dead/inert #2266/fix(review): mark gate.firstTimeContributorGrace as reserved/inert #2411) are duplicated verbatim across gate-advisory.ts and rules/advisory.ts (src/rules/advisory.ts and packages/loopover-engine/src/advisory/gate-advisory.ts) — consider centralizing this doc-comment to avoid drift if the reasoning is revisited again.
  • Consider linking this PR to a comment on config-as-code: expose gate:-only fields under settings:, resolve firstTimeContributorGrace #6446 clarifying that the gate:-only consolidation is explicitly out of scope here, so reviewers of the issue don't expect it closed by this merge alone.
  • The removed dashboard toggle and OpenAPI descriptions were the last visible trace of the reserved field for maintainers — worth a changelog/release note mentioning the field's removal for any maintainer who had it set to true in their DB (upsertRepositorySettings will now silently drop it, which is correct but worth surfacing).
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ✅ Gate result — Passing (No configured blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #6446
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 (1 linked issue).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 33 registered-repo PR(s), 26 merged, 273 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 33 PR(s), 273 issue(s).
Improvement ✅ Minor risk: clean · value: minor · LLM: moderate
Linked issue satisfaction

Addressed
The PR directly resolves both parts of the issue: it confirms (with rationale) that the 7 gate:-only fields are already wired through applyGateConfigOverrides and deliberately consolidates on gate: alone rather than duplicating settings.* twins, and it fully removes the dead firstTimeContributorGrace surface (DB column, parsing, dashboard toggle, docs, fixtures) rather than silently wiring it in,

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: 33 PR(s), 273 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
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://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

🟩 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 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LoopOver approves — the gate is satisfied and CI is green.

@loopover-orb
loopover-orb Bot merged commit cfd08ef into main Jul 16, 2026
21 checks passed
@loopover-orb
loopover-orb Bot deleted the fix/config-as-code-gate-consolidation-6446 branch July 16, 2026 20:31
This was referenced Jul 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

config-as-code: expose gate:-only fields under settings:, resolve firstTimeContributorGrace

1 participant