Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/loopover-engine/src/reward-risk.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Deterministic reward/risk reasoning signals, extracted to `@loopover/engine` (#2281) so the

Check warning on line 1 in packages/loopover-engine/src/reward-risk.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 1 in packages/loopover-engine/src/reward-risk.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/reward-risk.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/reward-risk.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Review queue is busy

This repo has a busy review queue in the local Gittensory cache.
// gittensory-miner can rank candidate work locally with the same logic the maintainer-side gate computes.
// loopover-miner can rank candidate work locally with the same logic the maintainer-side gate computes.
//
// Unlike the earlier self-contained extractions, reward-risk sits on top of the maintainer signal stack in
// `packages/loopover-engine/src/signals/engine.ts` (#4884; monorepo shim at `src/signals/engine.ts`).
Expand Down Expand Up @@ -925,7 +925,7 @@
return null;
}

/** Unknown/unparseable timestamps floor freshness (parity with gittensory-engine opportunity-freshness.ts). */
/** Unknown/unparseable timestamps floor freshness (parity with loopover-engine opportunity-freshness.ts). */
function issueAgeDays(value: string | null): number {
if (!value) return Number.POSITIVE_INFINITY;
const parsed = Date.parse(value);
Expand Down
6 changes: 3 additions & 3 deletions packages/loopover-engine/src/scoring/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,10 @@
constants[name] = Number(raw.replace(/_/g, ""));
}
return constants;
}

Check warning on line 99 in packages/loopover-engine/src/scoring/model.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 99 in packages/loopover-engine/src/scoring/model.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 99 in packages/loopover-engine/src/scoring/model.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.

Check notice on line 99 in packages/loopover-engine/src/scoring/model.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Review queue is busy

This repo has a busy review queue in the local Gittensory cache.

/**
* Upstream operational/infra constants gittensory intentionally does not model in score previews.
* Upstream operational/infra constants loopover intentionally does not model in score previews.
* They are not scoring dimensions — surfacing them as "unmodeled drift" is noise (#809).
*/
const NON_SCORING_UPSTREAM_CONSTANT_NAMES = new Set([
Expand All @@ -120,12 +120,12 @@
// false-positive unmodeled-scoring-drift warning (#809).
"EMISSION_SHARE_TOLERANCE",
// Fallback weight applied by the validator's load_programming_language_weights() for extensions absent from
// the JSON file; gittensory reads the JSON directly and does not track this loader default (#1692).
// the JSON file; loopover reads the JSON directly and does not track this loader default (#1692).
"DEFAULT_PROGRAMMING_LANGUAGE_WEIGHT",
]);

/**
* Numeric constant names upstream gittensor defines that gittensory's scoring engine does NOT model.
* Numeric constant names upstream gittensor defines that loopover's scoring engine does NOT model.
* The normal parse is `knownOnly` (it keeps only constants we already encode), which silently hides
* upstream ADDITIONS — e.g. a newly-introduced time-decay constant. Surfacing these makes scoring
* staleness visible: if upstream adds a scoring dimension, an operator sees it instead of the gate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Shared repo-scoped exemption list (#2463) for gittensory's deterministic anti-abuse auto-close/throttle
// Shared repo-scoped exemption list (#2463) for loopover's deterministic anti-abuse auto-close/throttle

Check warning on line 1 in packages/loopover-engine/src/settings/auto-close-exempt.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 1 in packages/loopover-engine/src/settings/auto-close-exempt.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/settings/auto-close-exempt.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
// mechanisms — currently the review-nag cooldown; intended to be reused by the per-contributor open-item cap
// (#2270) once that lands, rather than each feature growing its own duplicate whitelist. A maintainer-named
// GitHub login here is NEVER throttled or closed by either mechanism, on top of the standing owner/admin/
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-engine/src/signals/duplicate-winner.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**

Check warning on line 1 in packages/loopover-engine/src/signals/duplicate-winner.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 1 in packages/loopover-engine/src/signals/duplicate-winner.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/signals/duplicate-winner.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
* Duplicate-winner adjudication (#dup-winner) — thin re-export shim (#4251). This file and
* `../duplicate-winner.ts` were accidental byte-identical forks living inside the same package (not a
* `src/`-vs-engine extraction pair; both copies were already inside `gittensory-engine`). The top-level module
* `src/`-vs-engine extraction pair; both copies were already inside `loopover-engine`). The top-level module
* is the source of truth; see its doc comment for the full election-order rationale (claim-time election,
* anti-backdating semantics). Kept as a re-export (not deleted) so `advisory/gate-advisory.ts`'s existing
* `../signals/duplicate-winner.js` import keeps resolving without a call-site change.
Expand Down
6 changes: 3 additions & 3 deletions packages/loopover-engine/src/signals/engine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4456,10 +4456,10 @@
: "success";
const gateConclusion = args.gate?.conclusion ?? fallbackGateConclusion;
const gateBlocking = gateEnabled && (gateConclusion === "failure" || gateConclusion === "action_required");
const gateHeld = gateEnabled && (gateConclusion === "neutral" || gateConclusion === "action_required");

Check warning on line 4459 in packages/loopover-engine/src/signals/engine.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 4459 in packages/loopover-engine/src/signals/engine.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 4459 in packages/loopover-engine/src/signals/engine.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
const missingLinkedIssue = args.pr.linkedIssues.length === 0 && !hasClearNoIssueRationale(args.pr);
const confirmedMiner = isOfficialContributorDetection(args.detection);
// Author with no Gittensor footprint at all (not detected via official API or cache): gittensory's
// Author with no Gittensor footprint at all (not detected via official API or cache): loopover's
// contribution analysis is for Gittensor contributors, so fire MINIMALLY — a brief welcome + the
// earn invite — instead of the full readiness panel. A KNOWN contributor (official or cached) still
// gets the full review. The always-on footer CTA appears either way, so every PR keeps marketing.
Expand Down Expand Up @@ -4619,7 +4619,7 @@
].join("\n");
}

/** Minimal public comment for a non-registered contributor. gittensory's readiness/contribution
/** Minimal public comment for a non-registered contributor. loopover's readiness/contribution
* analysis is for registered Gittensor contributors, so we skip the panel and post a brief welcome
* + earn invite; the always-on footer CTA does the conversion. Carries the same panel marker so it
* updates in place if the author later registers (the full panel then replaces it). */
Expand Down Expand Up @@ -4652,7 +4652,7 @@
* Build the public PR panel's readiness signal rows (the `allRows` table) as a PURE function, from the
* SAME inputs `buildPublicPrIntelligenceComment` uses. It calls the same private panel helpers, so the rows
* are byte-identical to the legacy panel's. Exposed for the unified-comment bridge (convergence) so the
* converged comment surfaces gittensory's exact signals; the legacy path is unchanged. The `key` lets the
* converged comment surfaces loopover's exact signals; the legacy path is unchanged. The `key` lets the
* caller honor `.loopover.yml review.fields` visibility the same way the legacy renderer does.
*/
export function buildPublicPrPanelSignalRows(args: {
Expand Down
4 changes: 2 additions & 2 deletions packages/loopover-engine/src/signals/path-matchers.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { isCodeFile, isTestPath } from "./test-evidence.js";

Check warning on line 1 in packages/loopover-engine/src/signals/path-matchers.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 1 in packages/loopover-engine/src/signals/path-matchers.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/signals/path-matchers.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.

// Pure, deterministic path matchers for slop classification (#561), extracted to
// `@loopover/engine` (#4252) so the published gittensory-mcp/gittensory-miner CLIs can depend on
// `@loopover/engine` (#4252) so the published loopover-mcp/loopover-miner CLIs can depend on
// the same source instead of hand-porting it. Siblings to `isTestFile` / `isTestPath`: they identify changed
// files that are NOT genuine hand-authored effort — machine-generated output, vendored/imported third-party
// code, minified bundles, dependency lockfiles, and docs — so slop signals can tell a padded diff from real
Expand All @@ -16,7 +16,7 @@
return isTestPath(file);
}

// isCodeFile is the single source of truth the published gittensory-mcp/gittensory-miner CLIs also
// isCodeFile is the single source of truth the published loopover-mcp/loopover-miner CLIs also
// depend on — defined once in test-evidence.ts alongside the isSourcePath/isTestPath pair it composes,
// re-exported here so this file's existing callers don't change.
export { isCodeFile };
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-engine/src/signals/test-evidence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@
// isSourcePath owns the JVM/.NET/Swift/Groovy/Kotlin-script set symmetric with isTestPath.
const EXTENDED_SOURCE_EXTENSION = /\.(php|cpp|cc|c|h|hpp|m|vue|svelte|astro|dart)$/i;

/** cs/swift/groovy/kts plus php, C/C++/Objective-C, vue/svelte/astro, and dart — see isSourcePath for the

Check warning on line 36 in packages/loopover-engine/src/signals/test-evidence.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 36 in packages/loopover-engine/src/signals/test-evidence.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 36 in packages/loopover-engine/src/signals/test-evidence.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
* canonical JVM/.NET/Swift/Groovy/Kotlin-script matcher kept symmetric with isTestPath. Generated Dart part
* files (.g.dart/.freezed.dart/.gr.dart) stay non-code (#3724). The single source of truth both the Worker
* (src/signals/path-matchers.ts) and the published @loopover/mcp/gittensory-miner CLIs delegate
* (src/signals/path-matchers.ts) and the published @loopover/mcp/loopover-miner CLIs delegate
* to, so the three previously-independent hand-ports can't silently drift from each other again. */
export function isCodeFile(file: string): boolean {
if (isSourcePath(file)) return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// expensive AI verifier (src/review/unlinked-issue-match.ts), which is the actual precision gate. This stage
// is deliberately RECALL-oriented (a coincidental token/path overlap is cheap to false-positive here — the AI
// step is what must be accurate), never the reverse: it must never silently drop a genuinely-matching issue
// just to save an AI call.

Check warning on line 6 in packages/loopover-engine/src/signals/unlinked-issue-candidates.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 6 in packages/loopover-engine/src/signals/unlinked-issue-candidates.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 6 in packages/loopover-engine/src/signals/unlinked-issue-candidates.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
//
// Extracted out of `src/signals/unlinked-issue-candidates.ts` into the shared engine (#4883) so the published
// gittensory-miner/gittensory-mcp CLIs can run the identical recall pass the maintainer gate uses, instead of
// loopover-miner/loopover-mcp CLIs can run the identical recall pass the maintainer gate uses, instead of
// a driftable second copy; `src/signals/unlinked-issue-candidates.ts` is now a thin re-export shim (imported
// via relative source path, matching this repo's existing engine-consumption convention — see src/signals/slop.ts).

Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-engine/src/subprocess-env.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Shared subprocess env-allowlist + secret-redaction helpers (#4284). Any driver that spawns a locally-authenticated

Check warning on line 1 in packages/loopover-engine/src/subprocess-env.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 1 in packages/loopover-engine/src/subprocess-env.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/subprocess-env.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
// CLI (the review `claude`/`codex` subprocess in src/selfhost/ai.ts, and the coding-agent drivers coming in
// gittensory-miner) needs the SAME two safety primitives: hand the child a STRICT allowlisted env (never the full
// loopover-miner) needs the SAME two safety primitives: hand the child a STRICT allowlisted env (never the full
// worker/host env, which can carry runtime credentials into a prompt-injectable subprocess), and redact well-known
// secret shapes out of the child's untrusted stderr before it reaches logs. This module is the single engine-hosted
// source of truth for both, so those callers depend on one implementation instead of copy-pasting the pattern.
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-engine/src/tenant-config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Per-tenant configuration layer (pure) — #4787, part of the Rent-a-Loop path #4778.

Check warning on line 1 in packages/loopover-engine/src/tenant-config.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 1 in packages/loopover-engine/src/tenant-config.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 1 in packages/loopover-engine/src/tenant-config.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
//
// A customer's own autonomy/config, scoped strictly to their rented repo and independent of gittensory's own
// A customer's own autonomy/config, scoped strictly to their rented repo and independent of loopover's own
// configuration. Deterministic and side-effect-free: it resolves a tenant's effective config from the defaults
// plus their overrides, and holds per-tenant configs in an IMMUTABLE store. Isolation is guaranteed by
// construction — every resolve returns a NEW config with freshly-copied collections, and every store update
Expand Down
8 changes: 4 additions & 4 deletions packages/loopover-engine/src/types/manifest-deps-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -407,10 +407,10 @@
* configurable-with-fallback shape as {@link blacklistLabel} (including the explicit-`null`-closes-without-a-
* label idiom); defaults to `"over-contributor-limit"` so the disposition works regardless of the label a
* repo sets. Always populated by the DB layer; optional so existing settings fixtures/callers need not be
* touched. */

Check warning on line 410 in packages/loopover-engine/src/types/manifest-deps-types.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check warning on line 410 in packages/loopover-engine/src/types/manifest-deps-types.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 8 meaningful terms.

Check notice on line 410 in packages/loopover-engine/src/types/manifest-deps-types.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
contributorCapLabel?: string | null | undefined;
/** Cancel in-flight CI runs on a contributor_cap close (#2462, anti-abuse): when true, after a PR is
* auto-closed for exceeding {@link contributorOpenPrCap}, gittensory lists and cancels that PR's
* auto-closed for exceeding {@link contributorOpenPrCap}, loopover lists and cancels that PR's
* in-progress/queued Actions runs at its head SHA. Requires the App installation to have granted
* `actions: write` -- degrades gracefully (skipped + logged, never blocks the close) when it hasn't.
* `null`/undefined (the DB-layer default) means "unset" and falls back to the
Expand Down Expand Up @@ -448,7 +448,7 @@
* or a login on {@link autoCloseExemptLogins}. */
reviewNagMonitoredMentions?: string[] | undefined;
/** Shared repo-scoped exemption list (#2463, anti-abuse): GitHub logins that are NEVER throttled or closed by
* gittensory's deterministic anti-abuse mechanisms (review-nag and the per-contributor open-item cap above),
* loopover's deterministic anti-abuse mechanisms (review-nag and the per-contributor open-item cap above),
* on top of the standing owner/admin/automation-bot exemption. Always populated by the DB layer (default
* `[]`); optional so existing settings fixtures/callers need not be touched. */
autoCloseExemptLogins?: string[] | undefined;
Expand All @@ -470,7 +470,7 @@
* apply one manual-review label without enabling ready/changes-requested disposition labels. */
manualReviewLabel?: string | null | undefined;
/** Optional review-state label names. Config-as-code only; each `null` disables that specific label. These are
* deliberately generic defaults rather than `gittensory:*` names so self-hosters can opt into their own
* deliberately generic defaults rather than `loopover:*` names so self-hosters can opt into their own
* taxonomy without inheriting project-specific labels. */
readyToMergeLabel?: string | null | undefined;
changesRequestedLabel?: string | null | undefined;
Expand Down Expand Up @@ -548,7 +548,7 @@
* the global config's `bannedLabel` (itself defaulting to `"mod:banned"`). */
moderationBannedLabel?: string | undefined;
/** Review-evasion protection (#review-evasion-protection): a contributor closing or converting their OWN
* PR to draft while gittensory has an ACTIVE review pass running against it is dodging the one-shot
* PR to draft while loopover has an ACTIVE review pass running against it is dodging the one-shot
* review process. `"off"` (the default) disables detection entirely; `"close"` reopens (if needed) and
* re-closes as the App -- a close the contributor cannot themselves reopen (#one-shot-reopen) -- applies
* the configured label/comment, and records a `review_evasion` moderation strike. */
Expand Down
Loading