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 README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ LoopOver CI and LoopOver review score, gate, and comment on pull requests. The r

**Check-run and comment surfaces, disambiguated** (a common point of confusion — these are three independent, separately-configured things, not layers of the same feature):

- **`Gittensory Orb Review Agent`** (`gate.*` / `settings.reviewCheckMode`, off by default) — the authoritative GitHub Check Run carrying the gate's pass/fail verdict. This is the one worth making a required status check.
- **`Gittensory Context`** (`settings.checkRunMode` / `settings.checkRunDetailLevel`, off by default) — a separate, purely advisory Check Run. At its default `checkRunDetailLevel: minimal` it publishes no findings at all; even at `standard`/`deep` it only re-renders content already shown elsewhere. Never make this one required.
- **`LoopOver Orb Review Agent`** (`gate.*` / `settings.reviewCheckMode`, off by default) — the authoritative GitHub Check Run carrying the gate's pass/fail verdict. This is the one worth making a required status check.
- **`LoopOver Context`** (`settings.checkRunMode` / `settings.checkRunDetailLevel`, off by default) — a separate, purely advisory Check Run. At its default `checkRunDetailLevel: minimal` it publishes no findings at all; even at `standard`/`deep` it only re-renders content already shown elsewhere. Never make this one required.
- **Inline review comments** (`GITTENSORY_REVIEW_INLINE_COMMENTS` + `.gittensory.yml`'s `review.inline_comments`, off by both by default) — real, reply-able line-anchored PR review comment threads (CodeRabbit-style). This is the ONLY one of the three that posts an interactive per-line thread; the two check runs above never do. With `.gittensory.yml`'s `review.suggestions` also on, a precise line-anchored fix is additionally rendered as a one-click, committable GitHub suggested-change block. With `review.finding_categories` also on (off by default), each finding is additionally tagged with a category — security/correctness/performance/maintainability/tests/style — in both the inline comment label and the unified comment's "Finding categories" collapsible; a deterministic path/keyword fallback covers whatever the model omits.

See [Tuning your reviews](https://gittensory.aethereal.dev/docs/tuning) for the full flag, setting, and `.gittensory.yml` reference.
Expand Down
8 changes: 4 additions & 4 deletions apps/gittensory-ui/public/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -3838,7 +3838,7 @@
"comment_only",
"label_only"
],
"description": "Governs ONLY the PR comment and label -- never the Gittensory Context check (checkRunMode) or the Gittensory Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
"description": "Governs ONLY the PR comment and label -- never the LoopOver Context check (checkRunMode) or the LoopOver Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
},
"commentMode": {
"type": "string",
Expand Down Expand Up @@ -9199,7 +9199,7 @@
"comment_only",
"label_only"
],
"description": "Governs ONLY the PR comment and label -- never the Gittensory Context check (checkRunMode) or the Gittensory Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
"description": "Governs ONLY the PR comment and label -- never the LoopOver Context check (checkRunMode) or the LoopOver Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
},
"includeMaintainerAuthors": {
"type": "boolean"
Expand Down Expand Up @@ -9704,7 +9704,7 @@
"comment_only",
"label_only"
],
"description": "Governs ONLY the PR comment and label -- never the Gittensory Context check (checkRunMode) or the Gittensory Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
"description": "Governs ONLY the PR comment and label -- never the LoopOver Context check (checkRunMode) or the LoopOver Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
},
"commentMode": {
"type": "string",
Expand Down Expand Up @@ -10111,7 +10111,7 @@
"comment_only",
"label_only"
],
"description": "Governs ONLY the PR comment and label -- never the Gittensory Context check (checkRunMode) or the Gittensory Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
"description": "Governs ONLY the PR comment and label -- never the LoopOver Context check (checkRunMode) or the LoopOver Orb Review Agent gate check (reviewCheckMode), which are independent axes by design (#2852). Setting this to \"off\" does NOT silence either check-run."
},
"commentMode": {
"type": "string",
Expand Down
16 changes: 8 additions & 8 deletions packages/gittensory-engine/src/advisory/gate-advisory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import type { CollisionReport } from "../types/predicted-gate-types.js";
import { isDuplicateClusterWinnerByClaim } from "../signals/duplicate-winner.js";
import type { GuardrailPathMatch } from "../signals/change-guardrail.js";
import { nowIso } from "../utils/json.js";
import { GITTENSORY_GATE_CHECK_NAME } from "../review/check-names.js";
import { LOOPOVER_GATE_CHECK_NAME } from "../review/check-names.js";
import { CLA_CHECK_UNRESOLVED_CODE, CLA_CONSENT_MISSING_CODE } from "../review/cla-check.js";
import { REVIEW_THREAD_BLOCKER_CODE } from "../review/review-thread-findings.js";
import { labelMatchesPattern } from "../scoring/label-match.js";
Expand Down Expand Up @@ -338,7 +338,7 @@ function advisory(
): Advisory {
const severity = highestSeverity(findings);
const conclusion = conclusionForSeverity(severity, findings);
const title = conclusion === "success" ? "Gittensory advisory passed" : "Gittensory advisory available";
const title = conclusion === "success" ? "LoopOver advisory passed" : "LoopOver advisory available";
return {
id: randomUUID(),
targetType,
Expand Down Expand Up @@ -441,8 +441,8 @@ function evaluateGateCheckCore(advisoryResult: Advisory, policy: GateCheckPolicy
return {
enabled: true,
conclusion: "neutral",
title: `${GITTENSORY_GATE_CHECK_NAME} — not evaluated yet`,
summary: "Gittensory has not finished syncing this repo/PR. The gate stays advisory and re-evaluates automatically; no action is needed.",
title: `${LOOPOVER_GATE_CHECK_NAME} — not evaluated yet`,
summary: "LoopOver has not finished syncing this repo/PR. The gate stays advisory and re-evaluates automatically; no action is needed.",
blockers: [],
warnings,
};
Expand Down Expand Up @@ -472,7 +472,7 @@ function evaluateGateCheckCore(advisoryResult: Advisory, policy: GateCheckPolicy
return {
enabled: true,
conclusion: "neutral",
title: `${GITTENSORY_GATE_CHECK_NAME} — held for human review`,
title: `${LOOPOVER_GATE_CHECK_NAME} — held for human review`,
summary: "The AI review could not be completed for this change, so the gate is held for a human reviewer rather than passed automatically. It re-evaluates on the next update.",
blockers: [],
warnings: gateWarnings,
Expand All @@ -490,7 +490,7 @@ function evaluateGateCheckCore(advisoryResult: Advisory, policy: GateCheckPolicy
return {
enabled: true,
conclusion: "neutral",
title: `${GITTENSORY_GATE_CHECK_NAME} — held for manual review`,
title: `${LOOPOVER_GATE_CHECK_NAME} — held for manual review`,
summary: holds.map((h) => sanitizeForCheckRun(h.title)).join("; "),
blockers: [],
warnings: [...gateWarnings, ...holds],
Expand All @@ -499,7 +499,7 @@ function evaluateGateCheckCore(advisoryResult: Advisory, policy: GateCheckPolicy
return {
enabled: true,
conclusion: "success",
title: `${GITTENSORY_GATE_CHECK_NAME} passed`,
title: `${LOOPOVER_GATE_CHECK_NAME} passed`,
summary: "No configured hard blocker was found. Advisory findings, if any, stay advisory.",
blockers,
warnings: gateWarnings,
Expand All @@ -511,7 +511,7 @@ function evaluateGateCheckCore(advisoryResult: Advisory, policy: GateCheckPolicy
return {
enabled: true,
conclusion: "failure",
title: `${GITTENSORY_GATE_CHECK_NAME}: ${titleDetail}`,
title: `${LOOPOVER_GATE_CHECK_NAME}: ${titleDetail}`,
summary: blockers
.map((finding) => `${sanitizeForCheckRun(finding.title)}${finding.action ? ` — ${sanitizeForCheckRun(finding.action)}` : ""}`)
.join("; "),
Expand Down
8 changes: 4 additions & 4 deletions packages/gittensory-engine/src/focus-manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ export type FocusManifestIssueDiscoveryPolicy = "encouraged" | "neutral" | "disc
* only chooses which deterministic blockers are active, never who can be blocked. There is no single
* gate master switch: each per-dimension mode (`linkedIssue`, `duplicates`, `readinessMode`, etc.)
* independently controls whether that dimension evaluates. `checkMode`/`enabled` (#2852) is a separate
* axis entirely: whether/how the "Gittensory Orb Review Agent" check-RUN publishes, independent of gate
* axis entirely: whether/how the "LoopOver Orb Review Agent" check-RUN publishes, independent of gate
* evaluation itself (which always runs regardless of `checkMode`/`enabled`) — see {@link ReviewCheckMode}.
*/
export type FocusManifestGateConfig = {
present: boolean;
/** `gate.enabled` (legacy): a boolean shorthand for `checkMode` below -- `true` maps to `"required"`,
* `false` maps to `"disabled"` (see resolveEffectiveSettings/applyGateConfigOverrides). Despite the name,
* this controls ONLY whether the "Gittensory Orb Review Agent" check-run publishes -- it has NO effect on
* this controls ONLY whether the "LoopOver Orb Review Agent" check-run publishes -- it has NO effect on
* gate evaluation, disposition, comments, labels, audit, spend, or autonomous merge/close, all of which run
* identically regardless of this field. It also cannot express `checkMode`'s third state (`"visible"`), and
* is silently ignored once `checkMode` is set (see the parse-time warning a few lines below this type).
Expand Down Expand Up @@ -1373,7 +1373,7 @@ function parseGateConfig(value: JsonValue | undefined, warnings: string[]): Focu
if (gate.firstTimeContributorGrace === true) {
warnings.push(`Manifest field "gate.firstTimeContributorGrace" is currently reserved/inert — it does not soften a blocker outcome for first-time contributors.`);
}
// gate.enabled only controls whether the "Gittensory Orb Review Agent" check-run publishes (the legacy
// gate.enabled only controls whether the "LoopOver Orb Review Agent" check-run publishes (the legacy
// enabled -> reviewCheckMode alias in applyGateConfigOverrides) -- it does NOT gate spend, merge, comment,
// label, or close behavior, and it cannot express checkMode's "visible" state. checkMode always wins when
// both are set, so once an operator sets checkMode, a lingering enabled becomes pure inert noise they have
Expand All @@ -1383,7 +1383,7 @@ function parseGateConfig(value: JsonValue | undefined, warnings: string[]): Focu
// side effect instead, twice).
if (gate.enabled !== null && gate.checkMode === null) {
warnings.push(
`Manifest field "gate.enabled" only controls whether the Gittensory Orb Review Agent check-run publishes — it does not gate spend, merge, comment, label, or close behavior, and it cannot express reviewCheckMode's "visible" state. Set "gate.checkMode" (required/visible/disabled) explicitly instead of "gate.enabled".`,
`Manifest field "gate.enabled" only controls whether the LoopOver Orb Review Agent check-run publishes — it does not gate spend, merge, comment, label, or close behavior, and it cannot express reviewCheckMode's "visible" state. Set "gate.checkMode" (required/visible/disabled) explicitly instead of "gate.enabled".`,
);
}
gate.present =
Expand Down
2 changes: 1 addition & 1 deletion packages/gittensory-engine/src/review/check-names.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const GITTENSORY_GATE_CHECK_NAME = "Gittensory Orb Review Agent";
export const LOOPOVER_GATE_CHECK_NAME = "LoopOver Orb Review Agent";
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ export type RepositorySettings = {
* Selection-time only — real-time webhook-driven review is not gated by this and can process any PR at
* any time regardless of the chosen order. */
regateSweepOrderMode: "staleness" | "oldest-first";
/** The actual runtime authority for whether the "Gittensory Orb Review Agent" check-run publishes (#2852).
/** The actual runtime authority for whether the "LoopOver Orb Review Agent" check-run publishes (#2852).
* See {@link ReviewCheckMode}. */
reviewCheckMode: ReviewCheckMode;
/** Auto-project/milestone matching (#3183). See {@link ProjectMilestoneMatchMode}. Always populated by the DB
Expand Down
Loading
Loading