Skip to content

feat(github)!: rename the @gittensory bot mention command to @loopover - #5715

Merged
JSONbored merged 2 commits into
mainfrom
rebrand-mention-command
Jul 14, 2026
Merged

feat(github)!: rename the @gittensory bot mention command to @loopover#5715
JSONbored merged 2 commits into
mainfrom
rebrand-mention-command

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

Phase 2 of #5705 (the gittensory -> loopover rebrand epic). Full cutover, no dual-recognition per explicit maintainer decision -- the @gittensory mention trigger, help text, and every generated PR-comment/API string mentioning "Gittensory" by name across the dispatch stack now say @loopover/"LoopOver".

  • src/github/commands.ts's dispatch regex + entire command catalog, src/queue/processors.ts, src/api/routes.ts, and 20 other src/ files with live dispatch logic or generated public-facing text.
  • A real duplicate implementation found mid-sweep: sanitizePublicComment() has an independent copy in packages/gittensory-engine/src/github/sanitize-public-comment.ts with its own "@gittensory "-prefix safelist check -- fixed in place. The two implementations should eventually be consolidated (follow-up, not done here -- flagging rather than scope-creeping this PR).
  • scripts/gen-command-reference.mjs and scripts/check-docs-drift.mjs had their own hardcoded "@gittensory <id>" templates; regenerated apps/gittensory-ui/src/lib/command-reference.ts accordingly.
  • 17 apps/gittensory-ui doc/site pages with their own @gittensory command examples (needed fixing for command-syntax accuracy -- distinct from general product-name prose across the UI, which is a much larger, separate surface deferred to a later phase).
  • .loopover.yml.example + config/examples/*.yml comments, and renamed 6 config-example files whose names still said "gittensory" (config/examples/{gittensory.full,gittensory.minimal,global.gittensory,repo-override.gittensory,shared.gittensory}.yml, root .gittensory.minimal.yml) plus every file referencing them by name.

Regression caught and fixed mid-sweep: a blind rename in test/unit/queue-5.test.ts and src/github/app.ts had accidentally renamed references to the deliberately-preserved legacy check-run names ("Gittensory Gate" / "Gittensory Orb Review Agent", src/review/check-names.ts's GITTENSORY_LEGACY_* constants) into a nonsense "LoopOver Gate" string that collided with the real current check-run name and broke the upgrade-migration superseder logic. Reverted those specific legacy-detection references back to their correct historical values -- check-names.ts itself and its own dedicated test (test/unit/check-names.test.ts) were never touched.

Explicitly NOT in scope here (tracked separately in #5705): the MCP server's own "gittensory"-branded identity + 96 tool names (Phase 4), directory names (Phase 5), internal code identifiers like parseGittensoryMentionCommand (Phase 6), and general bare-prose "Gittensory" mentions scattered across ~40 additional src/ files that don't affect the mention command itself (found during this sweep, genuinely out of scope for this PR -- will need its own phase; #5705 will be updated to reflect the larger-than-originally-scoped surface).

Breaking change

The bot no longer recognizes @gittensory as a command trigger anywhere -- only @loopover works. Any saved PR-comment template, bookmark, or muscle-memory referencing @gittensory <command> must be updated to @loopover <command>.

Test plan

  • npx tsc --noEmit --incremental false clean
  • npm run docs:drift-check clean
  • npm run command-reference regenerated + verified
  • npm run test:coverage (unsharded, post-rebase): 832/832 test files, 16179/16179 tests pass, exit 0
  • Specifically verified the legacy check-run superseder logic still works correctly (test/unit/check-names.test.ts, test/unit/queue-5.test.ts's gate-override-live-head regression) after reverting the accidental legacy-name rename

Refs #5705

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 14, 2026

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 8687062 Commit Preview URL

Branch Preview URL
Jul 14 2026, 07:16 AM

@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

❌ 7 Tests Failed:

Tests completed Failed Passed Skipped
16178 7 16171 12
View the full list of 7 ❄️ flaky test(s)
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > actually narrows the PRs-tracked count to a selected $repo, and 'All' still includes every repo

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.0709s run time
AssertionError: expected '0' to be '3' // Object.is equality

Expected: "3"
Received: "0"

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:478:22
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > adds local, webhook-observed issue-activity stat panels alongside the review_targets PR panels (#3716, switched off the GitHub API 2026-07)

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.019s run time
AssertionError: expected 'SELECT count(*) AS opened FROM issues…' to contain '(${repo:sqlstring} = \'$__all\' OR re…'

Expected: "(${repo:sqlstring} = '$__all' OR repo = ${repo:sqlstring})"
Received: "SELECT count(*) AS opened FROM issues WHERE (${repo:sqlstring} = '__ALL__' OR repo = ${repo:sqlstring}) AND unixepoch(created_at) >= ${__from:date:seconds} AND unixepoch(created_at) < ${__to:date:seconds}"

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:343:33
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > drops a bot-authored release PR from the tracked-PR count and table (#4685-follow-up)

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.0389s run time
AssertionError: expected '0' to be '2' // Object.is equality

Expected: "2"
Received: "0"

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:546:26
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > filters the pull request table to the selected time window

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.022s run time
AssertionError: expected '' to contain 'owner/repo|2|new|commented|comment|ne…'

- Expected
+ Received

- owner/repo|2|new|commented|comment|new row|2026-06-29T21:00:00Z

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:446:18
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > issue-activity panels count real rows correctly by state and window

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.0345s run time
AssertionError: expected '0' to be '2' // Object.is equality

Expected: "2"
Received: "0"

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:416:20
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > scopes every review_targets panel query to the selected repo with Grafana SQL-string escaping

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.0053s run time
AssertionError: expected 'SELECT count(*) AS prs FROM review_ta…' to contain '(${repo:sqlstring} = \'$__all\' OR re…'

Expected: "(${repo:sqlstring} = '$__all' OR repo = ${repo:sqlstring})"
Received: "SELECT count(*) AS prs FROM review_targets WHERE (submitter NOT LIKE '%[bot]%' OR submitter IS NULL) AND (${repo:sqlstring} = '__ALL__' OR repo = ${repo:sqlstring}) AND unixepoch(updated_at) >= ${__from:date:seconds} AND unixepoch(updated_at) < ${__to:date:seconds}"

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:384:32
test/unit/selfhost-grafana-dashboard.test.ts > maintainer Reviews & PRs Grafana dashboard > scopes the issue-activity panels to the selected $repo, same as the PR panels

Flake rate in main: 100.00% (Passed 0 times, Failed 4 times)

Stack Traces | 0.00671s run time
AssertionError: expected 'SELECT count(*) AS opened FROM issues…' to contain '(${repo:sqlstring} = \'$__all\' OR re…'

Expected: "(${repo:sqlstring} = '$__all' OR repo = ${repo:sqlstring})"
Received: "SELECT count(*) AS opened FROM issues WHERE (${repo:sqlstring} = '__ALL__' OR repo = ${repo:sqlstring}) AND unixepoch(created_at) >= ${__from:date:seconds} AND unixepoch(created_at) < ${__to:date:seconds}"

 ❯ test/unit/selfhost-grafana-dashboard.test.ts:361:44

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@superagent-security

Copy link
Copy Markdown
Contributor

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

Phase 2 of the gittensory -> loopover rebrand epic (#5705). Full cutover,
no dual-recognition: the @gittensory mention trigger, help text, and
every generated PR-comment/API string mentioning "Gittensory" by name
across the dispatch stack now say "@Loopover"/"LoopOver".

- src/github/commands.ts's dispatch regex + entire command catalog,
  src/queue/processors.ts, src/api/routes.ts, and 20 other src/ files
  with live dispatch logic or generated public-facing text.
- A duplicate sanitizePublicComment() implementation in
  packages/gittensory-engine/src/github/sanitize-public-comment.ts had
  its own independent copy of the same "@gittensory "-prefix safelist
  check -- fixed in place; the two implementations should eventually be
  consolidated into one (follow-up, not done here).
- scripts/gen-command-reference.mjs and scripts/check-docs-drift.mjs
  had their own hardcoded "@gittensory <id>" templates, regenerated
  apps/gittensory-ui/src/lib/command-reference.ts accordingly.
- 17 apps/gittensory-ui doc/site pages with their own @gittensory
  command examples (docs.beta-onboarding, docs.maintainer-workflow,
  command-palette, etc.) -- these needed fixing for command-syntax
  accuracy, distinct from general product-name prose (deferred to a
  later phase).
- .loopover.yml.example + config/examples/*.yml comments.
- Renamed 6 config-example files whose names still said "gittensory":
  config/examples/{gittensory.full,gittensory.minimal,global.gittensory,
  repo-override.gittensory,shared.gittensory}.yml and root
  .gittensory.minimal.yml, plus every file referencing them by name.
- REGRESSION FIX caught mid-sweep: a blind rename in test/unit/queue-5.test.ts
  and src/github/app.ts had accidentally renamed references to the
  DELIBERATELY-preserved legacy check-run names ("Gittensory Gate" /
  "Gittensory Orb Review Agent", src/review/check-names.ts's
  GITTENSORY_LEGACY_* constants) into a nonsense "LoopOver Gate" string
  that collided with the real current check-run name -- reverted those
  specific legacy-detection references back to their correct historical
  values; check-names.ts itself and its own dedicated test were never
  touched.

Explicitly NOT in scope here (tracked separately in #5705): the MCP
server's own "gittensory"-branded identity/96 tool names (Phase 4),
directory names (Phase 5), internal code identifiers like
parseGittensoryMentionCommand (Phase 6), and general bare-prose
"Gittensory" mentions scattered across ~40 additional src/ files that
don't affect the mention command itself (found during this sweep but
out of scope for this PR -- will need its own phase).

BREAKING CHANGE: the bot no longer recognizes @gittensory as a command
trigger anywhere -- only @Loopover works. Any saved PR-comment template,
bookmark, or muscle-memory referencing @gittensory <command> must be
updated to @Loopover <command>.

Refs #5705
…ntion-command

- worker-runtime.test.ts still expected the pre-rebrand OpenAPI title
  "Gittensory API"; the source already emits "LoopOver API".
- miner-attempt-runner.test.ts still stubbed the pre-rebrand env var
  GITTENSORY_MINER_GOVERNOR_STATE_DB; governor-state.js now reads
  LOOPOVER_MINER_GOVERNOR_STATE_DB, so the stub silently no-op'd and the
  "production path" test fell through to the real default governor-state
  store instead of an isolated tmpdir, both failing the assertion and
  writing real rows to disk.
@JSONbored
JSONbored force-pushed the rebrand-mention-command branch from 973b7be to 8687062 Compare July 14, 2026 07:14
@JSONbored
JSONbored merged commit 40e6cdf into main Jul 14, 2026
12 of 15 checks passed
@JSONbored
JSONbored deleted the rebrand-mention-command branch July 14, 2026 07:14
@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 14, 2026
JSONbored added a commit that referenced this pull request Jul 14, 2026
…2 chars

PR #5715's literal find-replace shortened the JSX text content without
re-wrapping the surrounding {" "} whitespace-preservation tokens, leaving
prettier-incompatible line breaks in 3 files. Auto-fixed via eslint --fix
(pure whitespace/wrapping, no content change).
JSONbored added a commit that referenced this pull request Jul 14, 2026
…gine + regen openapi.json (#5718)

* fix(github): finish @gittensory -> @Loopover cutover in gittensory-engine JSDoc + regen openapi.json

PR #5715 renamed the mention command's dispatch regex but missed the
packages/gittensory-engine package tree (a separate source root from
top-level src/), leaving several @gittensory command-syntax examples in
JSDoc comments that feed the generated OpenAPI schema descriptions. Also
regenerates apps/gittensory-ui/public/openapi.json, which was stale
(still had the pre-rebrand "Gittensory API" title) and failing the
ui:openapi:check drift gate.

* fix(ui): reflow JSX text after @gittensory -> @Loopover shortened by 2 chars

PR #5715's literal find-replace shortened the JSX text content without
re-wrapping the surrounding {" "} whitespace-preservation tokens, leaving
prettier-incompatible line breaks in 3 files. Auto-fixed via eslint --fix
(pure whitespace/wrapping, no content change).
JSONbored added a commit that referenced this pull request Jul 14, 2026
Three independent, pre-existing gate breaks, none introduced by this branch --
found while chasing why release-please's PRs (#5710-5713) looked flaky under
local parallel test runs, and confirmed to reproduce identically on a clean
origin/main checkout:

- test/unit/agent-sdk-driver.test.ts, ai-summaries.test.ts, upstream-ruleset.test.ts:
  each does real, non-trivial work (git subprocess round-trips, a 42-entry
  forbidden-word sweep, 29 sequential D1-backed scenarios) that reliably exceeds
  vitest's 15s default under load. Widened each to an explicit, realistic timeout
  instead of leaving them to flake.
- test/unit/selfhost-grafana-dashboard.test.ts: 5f187c2 (#5716) fixed a real
  production bug -- Grafana's ${var:sqlstring} doesn't sql-quote a value that
  starts with $__, so the old $__all "All repos" sentinel leaked through
  unescaped and SQLite misparsed it as its own bind parameter, silently zeroing
  every "All"-filtered panel. That commit updated the dashboard JSON and two
  sibling test files but missed this one.
- apps/gittensory-ui/public/openapi.json + 3 route/component .tsx files:
  40e6cdf (#5715, the @gittensory -> @Loopover bot-mention rename) changed
  copy text but never regenerated the OpenAPI spec or ran prettier on the
  reflowed JSX text nodes, so ui:openapi:check and ui:lint both fail on main.

Regenerated the spec (npm run ui:openapi) and ran eslint --fix on the affected
files; both are mechanical, zero-semantic-diff outputs.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant