feat(selfhost): give sweep-watchdog and PR-reconciliation a per-repo opt-out#6319
Conversation
…opt-out Both crons only had a global LOOPOVER_SWEEP_WATCHDOG / LOOPOVER_PR_RECONCILIATION kill-switch with no repo-level control. Add review.sweepWatchdog and review.prReconciliation (bool | null, force-off-only, mirroring review.selftune's established shape) so an operator can exclude one repo from either scan via .loopover.yml without touching the global flag. A manifest-load error fails open (the repo stays watched), matching each scan's existing settings-blip fail-safe.
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Warning ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-16 02:19:56 UTC
Review summary Nits — 6 non-blocking
Concerns raised — review before merging
📋 Copy for AI agents — paste into your coding agentDecision drivers
Context & advisory signals — never blocks the verdict
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://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.
|
Summary
LOOPOVER_SWEEP_WATCHDOG(src/review/sweep-watchdog.ts) andLOOPOVER_PR_RECONCILIATION(src/review/pr-reconciliation.ts) each gate their cron on a global on/off env flag only — there was no way for an operator to exclude a single repo from either scan without flipping the fleet-wide switch..loopover.ymlfields,review.sweepWatchdog: falseandreview.prReconciliation: false, wired throughpackages/loopover-engine/src/focus-manifest.tsexactly likereview.selftune(type + parse + present + overlay + serialize), and checked inside each file's existingwatchedRepos()loop right after the existing convergence-allowlist/isAgentConfiguredwatch check.null/true⇒ included exactly as today (byte-identical default); only an explicitfalseexcludes the repo. There is notrueoverride — forcing a repo the scan wouldn't otherwise watch into it would bypass the separate convergence-allowlist/acting-autonomy consent boundary, same rationale asselftune's own asymmetric shape.Scope
type(scope): short summaryConventional Commit format, for examplefix(api): restore profile access checks.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Closes #123) — a linked open issue is required for every contributor PR. (N/A — maintainer PR referencing epic epic: migrate fleet-wide feature-toggle env vars to .loopover.yml config-as-code #6275 with "Part of", not a closing keyword, since the epic covers further toggles.)Validation
git diff --checknpm run actionlint(vianpm run test:ci)npm run typechecknpm run test:coveragelocally — 100% line/branch coverage on every changed line insrc/review/sweep-watchdog.tsandsrc/review/pr-reconciliation.ts;packages/loopover-engine/src/focus-manifest.ts's changed lines are also 100%/100% (the file's handful of pre-existing uncovered branches are all in unrelated code this PR never touches).npm run test:workers(vianpm run test:ci)npm run build:mcp(vianpm run test:ci)npm run test:mcp-pack(vianpm run test:ci)npm run ui:openapi:check(vianpm run test:ci)npm run ui:lint(vianpm run test:ci)npm run ui:typecheck(vianpm run test:ci)npm run ui:build(vianpm run test:ci)npm audit --audit-level=moderatetest/unit/sweep-watchdog.test.tsandtest/unit/pr-reconciliation.test.tscovering: explicitfalseexcludes an otherwise-watched repo, explicittrueis a no-op, and a manifest-load error fails open (repo stays watched).Ran the full local gate via
npm run test:ciend-to-end (rebased onto latestmain): all test files passed, 0 lint errors, clean typecheck, successfului:build.npm audit --audit-level=moderatefound 0 vulnerabilities.Safety
review.selftune.)UI Evidencesection below with screenshots. (N/A — no visible UI change.).loopover.yml.exampleandconfig/examples/loopover.full.ymlupdated with matching doc blocks for both new fields;CHANGELOG.mduntouched.)UI Evidence
N/A — no visible UI/frontend change.
Notes
watchedRepos()functions already callresolveRepositorySettings(), which internally loads the repo's focus manifest too (for settings resolution) — this PR's opt-out check loads the manifest a second time vialoadRepoFocusManifest(), mirroringselftune-wire.ts'sselfTuneRepos(), which does the exact same double-load for the identical reason (no manifest data is threaded back out ofresolveRepositorySettings).