refactor(gate): delete the dead firstTimeContributorGrace surface end-to-end - #6714
Conversation
…-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 didn't find any vulnerabilities or security issues in this PR. |
Deploying with
|
| 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 |
Bundle ReportChanges will increase total bundle size by 2.11kB (0.03%) ⬆️. This is within the configured threshold ✅ Detailed changes
Affected Assets, Files, and Routes:view changes for bundle: loopover-uiAssets Changed:
|
Codecov Report✅ All modified and coverable lines are covered by tests. 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
Flags with carried forward coverage won't be shown. Click here to find out more.
|
|
Tip ✅ LoopOver review result - approve/merge recommendedReview updated: 2026-07-16 20:31:39 UTC
Review summary Nits — 6 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk 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.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Visual preview
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.
|
Summary
gate:block (gatePack,slopGateMode/slopGateMinScore/slopAiAdvisory,mergeReadinessGateMode,manifestPolicyGateMode,linkedIssueSatisfactionGateMode,requireFreshRebaseWindowMinutes,aiReviewLowConfidenceDisposition) are confirmed wired throughapplyGateConfigOverridesand already have DB columns + dashboard UI — so consolidating ongate:alone (no newsettings.*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.firstTimeContributorGracehas been RESERVED/INERT since fix(review): mark gate.firstTimeContributorGrace as reserved/inert #2411 deliberately stoppedevaluateGateCheckCorefrom 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:getRepositorySettings/upsertRepositorySettingsplumbing,RepositorySettings["firstTimeContributorGrace"]and the maintainer settings write schema,.loopover.yml'sgate.firstTimeContributorGraceparsing, its reserved/inert parse-time warning, and the field itself, in both the app'ssrc/signals/focus-manifest.tsand the engine'spackages/loopover-engine/src/focus-manifest.ts,predicted-gate.ts/predicted-gate-types.ts/manifest-deps-types.ts),disableddisclosure toggle added by fix(ui): disclose the inert firstTimeContributorGrace dashboard toggle #5321 ("Reserved — currently has no effect on gate decisions"),.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 — onlyfirstTimeContributorGraceitself 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
type(scope): short summaryConventional Commit format.CONTRIBUTING.md.Validation
git diff --checknpm run actionlintnpm run typechecknpm run test:coveragelocally — 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) againstcoverage/lcov.info— zero 0-hit lines in the diff.npm run test:workersnpm run build:mcpnpm run test:mcp-packnpm 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:checknpm run ui:lintnpm run ui:typechecknpm run ui:buildnpm audit --audit-level=moderate— not run (no dependency changes in this PR).firstTimeContributorGracetest blocks infocus-manifest.test.ts(parsing + the reserved/inert warning),gate-check-policy.test.ts(the field-specific end-to-end test), andpredicted-gate.test.ts(the field-specific duplicate-blocker test), while preserving the still-real invariant tests in a renamedgate-check-policy.test.tsdescribe block ("author-history blockers stay unsoftened") that confirms blockers are never softened byauthorMergedPrCount/authorClosedUnmergedPrCountalone — 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.jsongolden) and itsindex.tsregistration, and fixed ~20 other test files' now-invalidRepositorySettings/FocusManifestGateConfigfixture literals.Full local
npm run test:cipassed 100% clean end-to-end on the first attempt after rebasing onto the latestmain(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
gate.firstTimeContributorGraceentry fromself-hosting-configuration.mdx,.loopover.yml.example, andconfig/examples/loopover.full.yml.Notes
originpartway through this work).