diff --git a/apps/loopover-ui/src/routes/docs.beta-onboarding.tsx b/apps/loopover-ui/src/routes/docs.beta-onboarding.tsx index d810cfc375..1c258d5912 100644 --- a/apps/loopover-ui/src/routes/docs.beta-onboarding.tsx +++ b/apps/loopover-ui/src/routes/docs.beta-onboarding.tsx @@ -35,8 +35,8 @@ function BetaOnboarding() { Product positioning. LoopOver is a deterministic base-agent and control-plane layer for the Gittensor ecosystem. It is{" "} - - jsonbored/gittensory + + jsonbored/loopover , independent of{" "} @@ -59,26 +59,26 @@ function BetaOnboarding() { Quickstart.
  • Sign in. GitHub Device Flow — no PAT storage.
  • Run diagnostics. Confirms API reachability, auth, source-upload posture, and optional local score-preview wiring. - +
  • Plan next work. Ranked actions, lane context, and blockers — copilot-only; does not open PRs or post comments.
  • @@ -86,15 +86,15 @@ gittensory-mcp whoami`} Preflight the branch. Branch blockers, queue pressure, and maintainer-fit notes before you push.
  • Prepare a public-safe packet. Maintainer-readable PR description with no private scoring language.
  • diff --git a/apps/loopover-ui/src/routes/docs.github-app.tsx b/apps/loopover-ui/src/routes/docs.github-app.tsx index be98859b9d..e90b6814e9 100644 --- a/apps/loopover-ui/src/routes/docs.github-app.tsx +++ b/apps/loopover-ui/src/routes/docs.github-app.tsx @@ -10,7 +10,7 @@ export const Route = createFileRoute("/docs/github-app")({ { name: "description", content: - "How the LoopOver GitHub App reviews pull requests once installed. Self-hosting is the only currently available path; a shared, centrally hosted App is planned as a future offering. The LoopOver Orb Review Agent check plus a review comment posted as gittensory[bot]. Choose repos, configure sticky PR panels, advisory checks, and optional review-agent enforcement.", + "How the LoopOver GitHub App reviews pull requests once installed. Self-hosting is the only currently available path; a shared, centrally hosted App is planned as a future offering. The LoopOver Orb Review Agent check plus a review comment posted as loopover[bot]. Choose repos, configure sticky PR panels, advisory checks, and optional review-agent enforcement.", }, { property: "og:title", content: "GitHub App configuration — LoopOver docs" }, { @@ -39,7 +39,7 @@ function GithubApp() { available path. Each review produces two surfaces: the{" "} LoopOver Orb Review Agent check run (and the advisory{" "} LoopOver Context check), and a single review comment posted by{" "} - gittensory[bot] that updates in place as the PR evolves. The review behavior + loopover[bot] that updates in place as the PR evolves. The review behavior below this page's Install section (PR panel, checks, gate modes, config-as-code) is the same regardless of which connection mode your self-hosted App uses.

    @@ -101,8 +101,8 @@ GET /v1/installations/:id/repair`}

    PR panel

    The PR panel is the review comment the LoopOver app posts on each pull request. It is one - sticky comment authored by gittensory[bot] that updates in place — the app - edits the same comment instead of adding new ones. It shows a public-safe readiness score, + sticky comment authored by loopover[bot] that updates in place — the app edits + the same comment instead of adding new ones. It shows a public-safe readiness score, concrete signal evidence, and short actions for linked issues, related work, review load, validation evidence, open PR queue, contributor context, and Gate result.

    @@ -341,12 +341,12 @@ review: code={`# Roll grounding + the unified comment onto one repo: LOOPOVER_REVIEW_GROUNDING="true" LOOPOVER_REVIEW_UNIFIED_COMMENT="true" -LOOPOVER_REVIEW_REPOS="JSONbored/gittensory"`} +LOOPOVER_REVIEW_REPOS="JSONbored/loopover"`} />

    Dogfood mode

    - For repos like JSONbored/gittensory and awesome-claude, enable PR + For repos like JSONbored/loopover and awesome-claude, enable PR comments, labels, Context, and Gate together to test the full product surface. If another maintainer agent can merge quickly, configure that agent to wait for{" "} LoopOver Orb Review Agent before merge or close. diff --git a/apps/loopover-ui/src/routes/docs.maintainer-self-hosting.tsx b/apps/loopover-ui/src/routes/docs.maintainer-self-hosting.tsx index 059cc16999..5529446a49 100644 --- a/apps/loopover-ui/src/routes/docs.maintainer-self-hosting.tsx +++ b/apps/loopover-ui/src/routes/docs.maintainer-self-hosting.tsx @@ -280,7 +280,7 @@ function MaintainerSelfHosting() {

    Moving a repo between hosted and self-host

    - "Hosted" here means the private managed-beta shared gittensory App + "Hosted" here means the private managed-beta shared loopover App described in GitHub App configuration — it previously accepted new installs and is currently paused while self-hosted Orb is the primary way to run LoopOver. A new centrally hosted offering is planned for the future. "Switching from @@ -318,7 +318,7 @@ function MaintainerSelfHosting() {
  • Uninstall the shared hosted App from that repo (repo Settings → Integrations → GitHub Apps - → gittensory → Uninstall, or the equivalent org-level App settings page) once you've + → loopover → Uninstall, or the equivalent org-level App settings page) once you've confirmed the self-host App is reviewing PRs correctly. Leaving both installed means two reviewers post competing checks and comments on the same PRs.
  • @@ -354,8 +354,8 @@ function MaintainerSelfHosting() {

    What stays identical for contributors either way: the review still posts as a{" "} - gittensory[bot]-style comment (under your own App's slug once you migrate, - not literally gittensory[bot]) plus the same check-run shape, and the gate + loopover[bot]-style comment (under your own App's slug once you migrate, + not literally loopover[bot]) plus the same check-run shape, and the gate semantics in Tuning your reviews and{" "} How reviews work are unchanged — only the infrastructure and the settings storage location differ. diff --git a/apps/loopover-ui/src/routes/docs.mcp-clients.tsx b/apps/loopover-ui/src/routes/docs.mcp-clients.tsx index b1f4513217..d1b8dcd7c8 100644 --- a/apps/loopover-ui/src/routes/docs.mcp-clients.tsx +++ b/apps/loopover-ui/src/routes/docs.mcp-clients.tsx @@ -36,18 +36,18 @@ function McpClients() {

    These commands print config only. They do not mutate your local client files.

    --print mcp uses the same JSON snippet as Claude Desktop and Cursor for other stdio MCP hosts that expect the mcpServers shape. Every generated snippet - assumes gittensory-mcp is on your PATH (install it globally first, + assumes loopover-mcp is on your PATH (install it globally first, per Quickstart) — pass{" "} - --command /absolute/path/to/gittensory-mcp if your client doesn't inherit your + --command /absolute/path/to/loopover-mcp if your client doesn't inherit your shell PATH.

    @@ -55,8 +55,8 @@ gittensory-mcp init-client --print vscode`} @@ -66,8 +66,8 @@ args = ["--stdio"]`} lang="json" code={`{ "mcpServers": { - "gittensory": { - "command": "gittensory-mcp", + "loopover": { + "command": "loopover-mcp", "args": ["--stdio"] } } @@ -80,8 +80,8 @@ args = ["--stdio"]`} lang="json" code={`{ "mcpServers": { - "gittensory": { - "command": "gittensory-mcp", + "loopover": { + "command": "loopover-mcp", "args": ["--stdio"] } } @@ -98,9 +98,9 @@ args = ["--stdio"]`} lang="json" code={`{ "servers": { - "gittensory": { + "loopover": { "type": "stdio", - "command": "gittensory-mcp", + "command": "loopover-mcp", "args": ["--stdio"] } } diff --git a/apps/loopover-ui/src/routes/docs.miner-quickstart.tsx b/apps/loopover-ui/src/routes/docs.miner-quickstart.tsx index bbfbf63e97..398692776c 100644 --- a/apps/loopover-ui/src/routes/docs.miner-quickstart.tsx +++ b/apps/loopover-ui/src/routes/docs.miner-quickstart.tsx @@ -60,18 +60,18 @@ npx -y @loopover/mcp@latest --help npm i -g @loopover/mcp@latest # sign in, confirm identity, check the session -gittensory-mcp login -gittensory-mcp whoami --json -gittensory-mcp status --json +loopover-mcp login +loopover-mcp whoami --json +loopover-mcp status --json # verify API, auth, and the local scorer before any analysis -gittensory-mcp doctor --json`} +loopover-mcp doctor --json`} /> Session tokens are LoopOver tokens backed by GitHub identity, not your GitHub PATs. Source upload stays disabled (LOOPOVER_UPLOAD_SOURCE=false) and local absolute paths are redacted from anything that leaves your machine. Log out anytime - with gittensory-mcp logout. + with loopover-mcp logout.

    1. Choose your lane

    @@ -83,8 +83,8 @@ gittensory-mcp doctor --json`}

    The repo's configured lane comes back as one of these (it is set by the repo's @@ -120,9 +120,9 @@ gittensory-mcp repo-decision --login your-login --repo owner/repo --json`} then generate the public-safe packet to paste into the PR body.

    3. Issue-solving PR lane

    @@ -133,9 +133,9 @@ gittensory-mcp agent packet --login your-login --repo owner/repo --base origin/m

    4. Issue discovery lane

    @@ -146,8 +146,8 @@ gittensory-mcp agent packet --login your-login --repo owner/repo --base origin/m loops.

    5. Docs and context work

    @@ -157,9 +157,9 @@ gittensory-mcp decision-pack --login your-login --json`} public-safe artifact regardless of whether the change is code or docs.

    6. Repo-specific lanes

    @@ -170,8 +170,8 @@ gittensory-mcp agent packet --login your-login --repo owner/repo --base origin/m before you commit to a path.

    Validation expectations (every lane)

    @@ -183,8 +183,8 @@ gittensory-mcp analyze-branch --login your-login --repo owner/repo --base origin validation, not a guess.

    The PR packet from agent packet is public-safe: it is scrubbed diff --git a/apps/loopover-ui/src/routes/docs.miner-workflow.tsx b/apps/loopover-ui/src/routes/docs.miner-workflow.tsx index 6308618fb5..d0bbb52fab 100644 --- a/apps/loopover-ui/src/routes/docs.miner-workflow.tsx +++ b/apps/loopover-ui/src/routes/docs.miner-workflow.tsx @@ -34,7 +34,7 @@ export function MinerWorkflow() { <> Pull a decision pack — lane context, repo targets to pursue or avoid, freshness, and ranked next actions. - + ), maintainer: ( @@ -54,7 +54,7 @@ export function MinerWorkflow() { <> Metadata-only branch analysis on the current branch — refs, changed-file metadata, labels, linked issues, commit messages, validation summaries. - + ), maintainer: ( @@ -74,7 +74,7 @@ export function MinerWorkflow() { <> Combine branch analysis with account/queue context to surface branch blockers, account blockers, and maintainer-fit notes. - + ), maintainer: ( @@ -94,7 +94,7 @@ export function MinerWorkflow() { <> Produce a public-safe PR packet — a description that reads cleanly to maintainers, with no private scoring or risk language leaking out. - + ), maintainer: ( diff --git a/apps/loopover-ui/src/routes/docs.owner-checklist.tsx b/apps/loopover-ui/src/routes/docs.owner-checklist.tsx index 73a395bdbf..8753d130e5 100644 --- a/apps/loopover-ui/src/routes/docs.owner-checklist.tsx +++ b/apps/loopover-ui/src/routes/docs.owner-checklist.tsx @@ -51,7 +51,7 @@ function OwnerChecklist() { GET /v1/repos/:owner/:repo/gittensor-config-recommendation`} />

    1. Repository registration

    diff --git a/apps/loopover-ui/src/routes/docs.privacy-security.tsx b/apps/loopover-ui/src/routes/docs.privacy-security.tsx index 39e3a00d92..a9eb631aea 100644 --- a/apps/loopover-ui/src/routes/docs.privacy-security.tsx +++ b/apps/loopover-ui/src/routes/docs.privacy-security.tsx @@ -81,7 +81,7 @@ function PrivacySecurity() {

    Session tokens are LoopOver tokens backed by GitHub identity, not your - GitHub PATs. You can log out anytime with gittensory-mcp logout. + GitHub PATs. You can log out anytime with loopover-mcp logout.

    3. Run your first analysis

    Analyze the current branch with metadata only. No source ever leaves your machine.

    4. Wire it into your coding agent

    @@ -76,9 +76,9 @@ gittensory-mcp preflight --login your-login --json`} Beta onboarding.

    ); diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-ai-providers.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-ai-providers.tsx index 90ba0be472..c116a32455 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-ai-providers.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-ai-providers.tsx @@ -201,7 +201,7 @@ CLAUDE_AI_EFFORT=medium`} the running container so the file lands on the volume the image expects ( /data/codex, mounted at ~/.codex):

    - +

    This also needs the explicit opt-in shown in the fallback example above ( LOOPOVER_ENABLE_UNSAFE_CODEX_REVIEWER=1) — see the Subscription CLI safety note diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-backup-scaling.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-backup-scaling.tsx index c8061aad3e..af6ba55fda 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-backup-scaling.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-backup-scaling.tsx @@ -156,7 +156,7 @@ npm run selfhost:postgres:migrate -- --sqlite /data/loopover.sqlite --execute`} .dump`} +docker compose --profile backup run --rm backup sh /scripts/verify-backup.sh /backups/postgres/loopover-.dump`} />

    A healthy run ends with [verify] postgres archive OK: … (N TOC entries) (or{" "} diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-configuration.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-configuration.tsx index afb2acab7b..2d5c156e47 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-configuration.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-configuration.tsx @@ -142,35 +142,35 @@ cp config/examples/global.loopover.yml loopover-config/.loopover.yml`} Keep anti-abuse thresholds, maintainer allowlists, and autonomy dials in the{" "} private mount — not in a public .loopover.yml contributors can read. config/examples/TEMPLATES.md documents the public-vs-private split and - how to apply the templates to gittensory, awesome-claude, and{" "} + how to apply the templates to loopover, awesome-claude, and{" "} metagraphed without committing private policy. Lint before deploy:{" "} npx tsx scripts/loopover-config-lint.ts path/to/.loopover.yml.

    Authoritative copies in git:

    • - + config/examples/loopover.minimal.yml
    • - + config/examples/loopover.full.yml {" "} (same body as{" "} - + .loopover.yml.example )
    • - + config/examples/TEMPLATES.md {" "} — catalog + fleet usage notes
    • - + config/examples/README.md {" "} — the full private-config layout, precedence chain, and deep-merge semantics, including @@ -187,7 +187,7 @@ cp config/examples/global.loopover.yml loopover-config/.loopover.yml`} filename=".env" code={`PUBLIC_API_ORIGIN=https://reviews.example.com GITHUB_APP_ID=123456 -GITHUB_APP_SLUG=my-gittensory-app +GITHUB_APP_SLUG=my-loopover-app GITHUB_APP_PRIVATE_KEY_FILE=/run/secrets/github-app-private-key.pem GITHUB_WEBHOOK_SECRET= @@ -207,7 +207,7 @@ INTERNAL_JOB_TOKEN=`}

      LOOPOVER_MCP_TOKEN is a shared, end-user-obtainable CLI credential (the normal - alternative to gittensory-mcp login), so it must not implicitly stage actions + alternative to loopover-mcp login), so it must not implicitly stage actions (merges, closes, approvals) on every repo the App happens to be installed on.{" "} MCP_ACTUATION_REPO_ALLOWLIST scopes it to an explicit, comma/whitespace-separated owner/repo list —{" "} diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-docs-audit.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-docs-audit.tsx index 421c70ad5b..bdc24c9aa1 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-docs-audit.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-docs-audit.tsx @@ -40,7 +40,7 @@ function SelfHostingDocsAudit() { > This page is the in-repo paper trail for the self-host docs audit under roadmap{" "} - #1819. REES analyzer + #1819. REES analyzer metadata generation is tracked separately on the REES roadmap — the analyzer reference page covers names and shapes; auto-generated metadata tables are out of scope here. @@ -110,7 +110,7 @@ function SelfHostingDocsAudit() {

      Defaults, optional services, and experimental surfaces

      • - Core stack (default): gittensory + Redis + SQLite on the mounted data + Core stack (default): loopover + Redis + SQLite on the mounted data volume; SELFHOST_DEPLOYMENT_MODE=dry-run in{" "} .env.selfhost.example.
      • diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-github-app.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-github-app.tsx index 020bc94703..f347a271b9 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-github-app.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-github-app.tsx @@ -162,7 +162,7 @@ SELFHOST_SETUP_TOKEN=change-this-long-random-value # unlocks /setup for a fresh `} /> diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-operations.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-operations.tsx index 81ae1e6cfa..49ddc7965c 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-operations.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-operations.tsx @@ -574,7 +574,7 @@ volumes: code={`# Your Sentry project DSN — never commit this to git SENTRY_DSN=https://examplePublicKey@o0.ingest.sentry.io/0 SENTRY_ENVIRONMENT=production -SENTRY_SERVER_NAME=gittensory-us-east +SENTRY_SERVER_NAME=loopover-us-east SENTRY_RELEASE=gittensory-selfhost@2026.07.05 # Optional: sample review tracing spans (0.05 = 5%) # SENTRY_TRACES_SAMPLE_RATE=0.05`} @@ -605,7 +605,7 @@ SENTRY_RELEASE=gittensory-selfhost@2026.07.05 VITE_SENTRY_ENVIRONMENT=production # Match the release id the ui-sentry-release workflow uploaded for this commit, # or symbolication won't find the matching source maps: -VITE_SENTRY_RELEASE=gittensory-ui@`} +VITE_SENTRY_RELEASE=loopover-ui@`} />

        Every browser event is scrubbed before it leaves the box: request cookies, headers, and body @@ -643,7 +643,7 @@ VITE_SENTRY_RELEASE=gittensory-ui@`} { title: "Contexts (full scrubbed detail)", description: - "gittensory (engine captures), review (failed reviews), log (structured console lines), sentry_monitor (cron failures), otel (active trace ids). Secrets, tokens, bodies, diffs, prompts, and review text are redacted before send.", + "loopover (engine captures), review (failed reviews), log (structured console lines), sentry_monitor (cron failures), otel (active trace ids). Secrets, tokens, bodies, diffs, prompts, and review text are redacted before send.", }, { title: "Subsystems", @@ -773,7 +773,7 @@ VITE_SENTRY_RELEASE=gittensory-ui@`}

        Sentry server name

        SENTRY_SERVER_NAME sets a clean, human name for this instance in Sentry (for - example gittensory-us-east). Unset defaults to the OS hostname — never the + example loopover-us-east). Unset defaults to the OS hostname — never the public-origin URL. Set this explicitly if you run more than one instance and want to tell their Sentry events apart at a glance instead of matching container hostnames.

        diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-quickstart.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-quickstart.tsx index af9337fcbc..611866a37e 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-quickstart.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-quickstart.tsx @@ -125,8 +125,8 @@ LOOPOVER_IMAGE=ghcr.io/jsonbored/loopover-selfhost@sha256:... ./scripts/deploy-s

        Contributors and anyone customizing the Dockerfile can still build locally —{" "} - docker compose up -d --build builds the gittensory service from - the checkout instead of pulling a published image. Everything else in this quickstart (env, + docker compose up -d --build builds the loopover service from the + checkout instead of pulling a published image. Everything else in this quickstart (env, health checks, GitHub App) is identical either way. Two build-args trim the image:{" "} --build-arg INSTALL_AI_CLIS=false skips the Claude Code/Codex CLIs (default{" "} true), and --build-arg INSTALL_VISUAL_REVIEW=true adds{" "} @@ -271,7 +271,7 @@ cp config/examples/global.loopover.yml loopover-config/owner__my-repo/.loopover. - Only the gittensory service restarts (--no-deps);{" "} + Only the loopover service restarts (--no-deps);{" "} .env, data volumes, and loopover-config/ are untouched;{" "} /ready returns 200 after the health-check wait. @@ -262,7 +262,7 @@ git push origin orb-v0.1.0`} (Postgres, Redis, Qdrant, Grafana) already up. - Only the gittensory container recreates; profile-service containers and + Only the loopover container recreates; profile-service containers and their volumes are never touched. @@ -298,8 +298,8 @@ git push origin orb-v0.1.0`}

        Direct GitHub App mode (default)

        @@ -316,7 +316,7 @@ SELFHOST_SMOKE_EXTRA_VOLUMES="\${TEST_APP_PRIVATE_KEY_PATH}:/run/secrets/github- SELFHOST_SMOKE_EXTRA_ENV="GITHUB_APP_ID=123456 GITHUB_APP_PRIVATE_KEY_FILE=/run/secrets/github-app-private-key.pem" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_orb_export_error,selfhost_orb_relay_register" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate`} +./scripts/smoke-selfhost.sh loopover:rc-candidate`} />

        selfhost_orb_relay_register must NOT appear here — relay registration is @@ -344,7 +344,7 @@ SELFHOST_SMOKE_EXTRA_ENV="ORB_ENROLLMENT_SECRET=\${TEST_ENROLLMENT_SECRET} PUBLIC_API_ORIGIN=https://selfhost-smoke.example" \\ SELFHOST_SMOKE_EXPECT_EVENTS="selfhost_orb_relay_register" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_orb_relay_register_failed" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate +./scripts/smoke-selfhost.sh loopover:rc-candidate # Pull mode -- no PUBLIC_API_ORIGIN needed; the container polls the broker outbound instead of # exposing an inbound endpoint. The right fit for NAT/tailnet operators with no public ingress. @@ -352,7 +352,7 @@ SELFHOST_SMOKE_EXTRA_ENV="ORB_ENROLLMENT_SECRET=\${TEST_ENROLLMENT_SECRET} ORB_RELAY_MODE=pull" \\ SELFHOST_SMOKE_EXPECT_EVENTS="selfhost_orb_relay_register" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_orb_relay_register_failed" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate`} +./scripts/smoke-selfhost.sh loopover:rc-candidate`} />

        Air-gapped / no-telemetry mode

        @@ -366,7 +366,7 @@ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_orb_relay_register_failed" \\ lang="bash" code={`SELFHOST_SMOKE_EXTRA_ENV="ORB_AIR_GAP=true" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_orb_export_error,selfhost_orb_relay_register" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate`} +./scripts/smoke-selfhost.sh loopover:rc-candidate`} />

        AI provider: Claude Code / Codex / both

        @@ -383,14 +383,14 @@ SELFHOST_SMOKE_EXTRA_ENV="AI_PROVIDER=claude-code CLAUDE_CODE_OAUTH_TOKEN=\${TEST_CLAUDE_TOKEN}" \\ SELFHOST_SMOKE_EXPECT_EVENTS="selfhost_ai_provider" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_ai_cli_missing" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate +./scripts/smoke-selfhost.sh loopover:rc-candidate # Codex only (requires the fail-closed opt-in) SELFHOST_SMOKE_EXTRA_ENV="AI_PROVIDER=codex LOOPOVER_ENABLE_UNSAFE_CODEX_REVIEWER=1" \\ SELFHOST_SMOKE_EXPECT_EVENTS="selfhost_ai_provider" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_ai_cli_missing" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate +./scripts/smoke-selfhost.sh loopover:rc-candidate # Codex primary, Claude Code fallback SELFHOST_SMOKE_EXTRA_ENV="AI_PROVIDER=codex,claude-code @@ -400,7 +400,7 @@ CLAUDE_CODE_OAUTH_TOKEN=\${TEST_CLAUDE_TOKEN} LOOPOVER_ENABLE_UNSAFE_CODEX_REVIEWER=1" \\ SELFHOST_SMOKE_EXPECT_EVENTS="selfhost_ai_provider" \\ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_ai_cli_missing" \\ -./scripts/smoke-selfhost.sh gittensory:rc-candidate`} +./scripts/smoke-selfhost.sh loopover:rc-candidate`} /> These need real credentials to reach a genuinely healthy /ready (it probes the @@ -418,10 +418,10 @@ SELFHOST_SMOKE_FORBID_EVENTS="selfhost_ai_cli_missing" \\ @@ -439,7 +439,7 @@ docker rm -f gt-pg && docker network rm gt-pg-smoke`} @@ -551,7 +551,7 @@ docker rm -f gt-qdrant && docker network rm gt-rag-smoke`} "docker-compose.override.yml(.example) and any host-specific compose profile config live outside the image entirely; the image only ever contains the application bundle plus its declared runtime dependencies.", }, { - title: "apps/ (gittensory-ui) and test/ — excluded from the build context", + title: "apps/ (loopover-ui) and test/ — excluded from the build context", description: "Already in .dockerignore alongside the existing exclusions (shipped ahead of this checklist, in the same #1819 hardening pass): the self-host bundle's only entry point is src/server.ts and npm ci only reads the root package*.json, so the UI workspace app and the test suite are never read during the image build (~11MB of this repo's ~22MB tracked-file footprint kept out).", }, @@ -608,7 +608,7 @@ docker images ghcr.io/jsonbored/loopover-selfhost:orb-v0.1.0 --format '{{.Size}} { title: "The escape hatch already exists", description: - "An operator who wants a smaller image without the AI CLIs can build it themselves today: docker compose build --build-arg INSTALL_AI_CLIS=false gittensory. Nothing about shipping one default image forecloses adding a published minimal tag later.", + "An operator who wants a smaller image without the AI CLIs can build it themselves today: docker compose build --build-arg INSTALL_AI_CLIS=false loopover. Nothing about shipping one default image forecloses adding a published minimal tag later.", }, ]} /> @@ -640,7 +640,7 @@ docker pull ghcr.io/jsonbored/loopover-selfhost:orb-v0.1.0 Multi-arch (linux/amd64 + linux/arm64). See https://gittensory.aethereal.dev/docs/maintainer-self-hosting for setup. Includes the Claude Code / Codex subscription CLIs by default; credentials stay runtime-only. -Sentry release id baked into the image: \`gittensory-orb@0.1.0\`. +Sentry release id baked into the image: \`loopover-orb@0.1.0\`. ## First stable release @@ -654,7 +654,7 @@ The \`latest\` tag now points here. - Redis cache (required in every mode). - Claude Code and Codex AI providers, including a provider chain with fallback. - Health/readiness endpoints (\`/health\`, \`/ready\`, \`/metrics\`) and the documented log-event contract. -- Rollback to a prior image tag and one-service (\`gittensory\` only) restart, via +- Rollback to a prior image tag and one-service (\`loopover\` only) restart, via \`scripts/deploy-selfhost-image.sh\` / \`scripts/deploy-selfhost-prebuilt.sh\`. ## Experimental diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-releases.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-releases.tsx index b9c85dfcc8..61a116ab0f 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-releases.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-releases.tsx @@ -91,7 +91,7 @@ docker pull ghcr.io/jsonbored/loopover-selfhost:latest`}
      • Pull and restart with scripts/deploy-selfhost-image.sh (or rebuild the checkout with scripts/deploy-selfhost-prebuilt.sh) — both restart only the{" "} - gittensory service (--no-deps) and wait for it to report{" "} + loopover service (--no-deps) and wait for it to report{" "} healthy before returning, instead of a bare docker compose up -d{" "} that returns as soon as the container starts.
      • @@ -114,7 +114,7 @@ curl http://localhost:8787/ready LOOPOVER_VERSION from the checked-out commit ( git rev-parse --short=8 HEAD) unless you set SENTRY_RELEASE{" "} yourself. A plain{" "} - docker compose pull gittensory && docker compose up -d gittensory still + docker compose pull loopover && docker compose up -d loopover still works, but skips the health-check wait loop and input validation both scripts provide.
        @@ -128,8 +128,8 @@ curl http://localhost:8787/ready

        Sentry source maps

        diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-security.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-security.tsx index 775e57e7ce..1652427069 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-security.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-security.tsx @@ -258,14 +258,14 @@ SELFHOST_USE_INFISICAL=1 ./scripts/deploy-selfhost-prebuilt.sh`} { title: "Bring your own reverse proxy", description: - "Skip both profiles and put an existing nginx/Traefik/ALB in front of the gittensory service's own port instead.", + "Skip both profiles and put an existing nginx/Traefik/ALB in front of the loopover service's own port instead.", }, ]} />

        Caddy: automatic HTTPS with Let's Encrypt

        - The caddy profile runs Caddy 2 in front of the gittensory service, + The caddy profile runs Caddy 2 in front of the loopover service, terminating TLS on 80/443/443/udp (the last for HTTP/3) and obtaining a Let's Encrypt certificate automatically for whatever domain you set. It needs a real DNS record: point DOMAIN at this host's public IP{" "} @@ -279,7 +279,7 @@ SELFHOST_USE_INFISICAL=1 ./scripts/deploy-selfhost-prebuilt.sh`}

        - The shipped caddy/Caddyfile reverse-proxies to gittensory:8787 on + The shipped caddy/Caddyfile reverse-proxies to loopover:8787 on the compose network, forwards the real client IP, enables compression, sets standard security headers (HSTS, X-Content-Type-Options, X-Frame-Options, a strict referrer policy), and logs as JSON to stderr: @@ -287,7 +287,7 @@ SELFHOST_USE_INFISICAL=1 ./scripts/deploy-selfhost-prebuilt.sh`} - The gittensory service's compose entry has a direct{" "} + The loopover service's compose entry has a direct{" "} {`ports: ["\${PORT:-8787}:8787"]`} mapping with a comment marking exactly this: remove it once Caddy is your public listener, or the app stays reachable on{" "} :8787 with no TLS, bypassing the proxy entirely and defeating the whole point @@ -340,7 +340,7 @@ SELFHOST_USE_INFISICAL=1 ./scripts/deploy-selfhost-prebuilt.sh`}

        Already run a reverse proxy or load balancer?

        Skip the caddy profile entirely. Remove the same direct ports:{" "} - mapping from the gittensory service, keep it on the compose network (or publish{" "} + mapping from the loopover service, keep it on the compose network (or publish{" "} 8787 bound to a private interface your existing proxy can reach), and terminate TLS the way you already do for everything else — nginx, Traefik, an AWS ALB, a Cloudflare Tunnel. Whatever fronts it just needs to forward to port 8787 and preserve the @@ -360,8 +360,8 @@ SELFHOST_USE_INFISICAL=1 ./scripts/deploy-selfhost-prebuilt.sh`} TS_EXTRA_ARGS= # optional, e.g. --advertise-tags=tag:self-host`} /> - Tailscale doesn't replace the gittensory service's listener the way Caddy does - — it adds a new network interface to the host. Docker's default{" "} + Tailscale doesn't replace the loopover service's listener the way Caddy does — + it adds a new network interface to the host. Docker's default{" "} {`ports: ["\${PORT:-8787}:8787"]`} mapping publishes to all of the host's interfaces, so once Tailscale is up, that same mapping is what makes port 8787{" "} reachable at the host's tailnet IP too —{" "} diff --git a/apps/loopover-ui/src/routes/docs.self-hosting-troubleshooting.tsx b/apps/loopover-ui/src/routes/docs.self-hosting-troubleshooting.tsx index 762098d2d4..e88dd432c0 100644 --- a/apps/loopover-ui/src/routes/docs.self-hosting-troubleshooting.tsx +++ b/apps/loopover-ui/src/routes/docs.self-hosting-troubleshooting.tsx @@ -206,21 +206,21 @@ sum by (class) (rate(loopover_github_graphql_cache_total[15m]))`} deployment's configuration.

      • - A dimension-mismatch error means the existing gittensory collection (the - fixed collection name self-host always uses) was created with a different embedding model - than the one currently configured (AI_EMBED_MODEL). Recreating it — delete - the collection and let the next index run recreate it at the current width — is the fix, - but it temporarily removes ALL indexed RAG context for every repo until re-indexing - completes, so treat it as a deliberate, disruptive step, not a routine one. + A dimension-mismatch error means the existing loopover collection (the fixed + collection name self-host always uses) was created with a different embedding model than + the one currently configured (AI_EMBED_MODEL). Recreating it — delete the + collection and let the next index run recreate it at the current width — is the fix, but + it temporarily removes ALL indexed RAG context for every repo until re-indexing completes, + so treat it as a deliberate, disruptive step, not a routine one.

      Orb export or relay problems

      diff --git a/apps/loopover-ui/src/routes/docs.troubleshooting.tsx b/apps/loopover-ui/src/routes/docs.troubleshooting.tsx index 7ba48e7411..30a07d8f5a 100644 --- a/apps/loopover-ui/src/routes/docs.troubleshooting.tsx +++ b/apps/loopover-ui/src/routes/docs.troubleshooting.tsx @@ -34,9 +34,9 @@ function Troubleshooting() { >

      Health checks

      Or hit the public API endpoint directly to confirm reachability:

      @@ -44,7 +44,7 @@ gittensory-mcp whoami`}

      Self-host Docker observability

      The Docker stack exposes three different operator signals: structured logs from the{" "} - gittensory container, Prometheus metrics at /metrics, and optional + loopover container, Prometheus metrics at /metrics, and optional OpenTelemetry traces through the observability profile. Metrics answer how much{" "} work is happening; traces answer where time went inside a review job.

      @@ -75,7 +75,7 @@ OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318`}

      Login hangs on device flow

      Confirm you can reach github.com/login/device in your browser. Re-run{" "} - gittensory-mcp login and paste the new code. + loopover-mcp login and paste the new code.

      “Stale fidelity” warning

      @@ -92,7 +92,7 @@ OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318`}

      401 Unauthorized from the API

      - Your LoopOver session expired. Run gittensory-mcp login again. Static bearer + Your LoopOver session expired. Run loopover-mcp login again. Static bearer tokens are not user-facing.

      diff --git a/apps/loopover-ui/src/routes/docs.upstream-drift.tsx b/apps/loopover-ui/src/routes/docs.upstream-drift.tsx index 77faa3e18c..030287cf65 100644 --- a/apps/loopover-ui/src/routes/docs.upstream-drift.tsx +++ b/apps/loopover-ui/src/routes/docs.upstream-drift.tsx @@ -45,8 +45,8 @@ function UpstreamDrift() { Upstream relationship. entrius/gittensor is the upstream project LoopOver analyzes. LoopOver is{" "} - - jsonbored/gittensory + + jsonbored/loopover {" "} — an independent base-agent layer for the Gittensor ecosystem, not affiliated with the official subnet. diff --git a/test/unit/docs-beta-onboarding.test.ts b/test/unit/docs-beta-onboarding.test.ts index 80eb25bff4..ee27bf03e5 100644 --- a/test/unit/docs-beta-onboarding.test.ts +++ b/test/unit/docs-beta-onboarding.test.ts @@ -12,8 +12,8 @@ describe("docs beta onboarding page", () => { const normalizedSource = source.replace(/\s+/g, " "); it("documents miner MCP flow through packet", () => { - expect(source).toMatch(/gittensory-mcp login/); - expect(source).toMatch(/gittensory-mcp doctor/); + expect(source).toMatch(/loopover-mcp login/); + expect(source).toMatch(/loopover-mcp doctor/); expect(source).toMatch(/agent plan/); expect(source).toMatch(/preflight/); expect(source).toMatch(/agent packet/); diff --git a/test/unit/docs-miner-quickstart.test.ts b/test/unit/docs-miner-quickstart.test.ts index 1fbe39b9ea..0447cb81fd 100644 --- a/test/unit/docs-miner-quickstart.test.ts +++ b/test/unit/docs-miner-quickstart.test.ts @@ -13,17 +13,17 @@ describe("docs miner quickstart page", () => { it("documents the full miner loop: install, auth, doctor, plan, preflight, packet", () => { expect(source).toMatch(/@loopover\/mcp/); - expect(source).toMatch(/gittensory-mcp login/); - expect(source).toMatch(/gittensory-mcp whoami/); - expect(source).toMatch(/gittensory-mcp status/); - expect(source).toMatch(/gittensory-mcp doctor/); + expect(source).toMatch(/loopover-mcp login/); + expect(source).toMatch(/loopover-mcp whoami/); + expect(source).toMatch(/loopover-mcp status/); + expect(source).toMatch(/loopover-mcp doctor/); expect(source).toMatch(/agent plan --login/); - expect(source).toMatch(/gittensory-mcp preflight --login/); + expect(source).toMatch(/loopover-mcp preflight --login/); expect(source).toMatch(/agent packet --login/); }); it("uses CLI commands that match the current MCP package syntax", () => { - // Real flags from `gittensory-mcp --help` — guards against drift in documented syntax. + // Real flags from `loopover-mcp --help` — guards against drift in documented syntax. expect(source).toMatch(/--repo owner\/repo/); expect(source).toMatch(/--base origin\/main/); expect(source).toMatch(/--branch-eligibility eligible/); diff --git a/test/unit/docs-selfhost-update-rollback.test.ts b/test/unit/docs-selfhost-update-rollback.test.ts index f3745313f8..7031d441bd 100644 --- a/test/unit/docs-selfhost-update-rollback.test.ts +++ b/test/unit/docs-selfhost-update-rollback.test.ts @@ -27,12 +27,12 @@ describe("self-host update + rollback docs (#1823)", () => { expect(operations).toContain("Migrations are forward-only"); }); - it("deploy scripts restart only gittensory with --no-deps", () => { + it("deploy scripts restart only loopover with --no-deps", () => { expect(imageScript).toContain('up -d --no-build --no-deps "$SERVICE"'); expect(prebuiltScript).toContain('up -d --no-deps "$SERVICE"'); }); - it("prebuilt deploy builds the gittensory-engine workspace before bundling (#4530)", () => { + it("prebuilt deploy builds the loopover-engine workspace before bundling (#4530)", () => { // packages/loopover-engine/dist/ is gitignored and built via `tsc`; `npm ci --ignore-scripts` // never triggers that build on its own, so anything that imports the engine (e.g. // packages/loopover-miner) fails to resolve during the --all bundle unless this runs first.