Skip to content

fix(db): stop documenting 0090 as a grandfathered migration duplicate - #9825

Closed
shin-core wants to merge 1 commit into
JSONbored:mainfrom
shin-core:fix/check-migrations-0090-grandfather-9653
Closed

fix(db): stop documenting 0090 as a grandfathered migration duplicate#9825
shin-core wants to merge 1 commit into
JSONbored:mainfrom
shin-core:fix/check-migrations-0090-grandfather-9653

Conversation

@shin-core

Copy link
Copy Markdown
Contributor

What & why

KNOWN_MIGRATION_DUPLICATES (src/db/migration-collisions.ts) is already correct — 0090 is not a key, because #8897 renumbered 0090_pull_request_detail_sync_head_sha to 0092, leaving a single 0090_contributor_cap_label file at 0090. But scripts/check-migrations.ts's header still documented 0090 as a grandfathered duplicate and cross-referenced "same reasoning as 0074/0090", so a future reader could re-add the dead entry straight from git history.

The fix

Tests (test/unit/migration-collisions.test.ts)

Two guards so the header comment and the data can't silently diverge again:

  • Every filename in KNOWN_MIGRATION_DUPLICATES exists in the real migrations/ directory — a re-added 0090 entry (naming the renumbered-away file) fails this (verified by injecting one).
  • Every on-disk migration number with more than one file is a key of KNOWN_MIGRATION_DUPLICATES — the reverse direction, so a new un-grandfathered collision surfaces here, not only at premerge.

Validation

  • npm run db:migrations:check green; npm run typecheck green; the migration-collisions and check-migrations-script suites green.
  • scripts/** is outside Codecov's include, so the comment change carries no coverage obligation; the new tests import src/db/migration-collisions.ts, so coverage collection sees real src/** files.
  • git diff --check <base> HEAD clean; diff is two files, no src/** source or migration change.

Closes #9653

`KNOWN_MIGRATION_DUPLICATES` (src/db/migration-collisions.ts) is already correct —
0090 is not a key, because JSONbored#8897 renumbered 0090_pull_request_detail_sync_head_sha
to 0092, leaving a single 0090_contributor_cap_label file. But check-migrations.ts's
header still listed 0090 as a grandfathered duplicate and cross-referenced
"0074/0090", so a future reader could re-add the dead entry from git history.

Replace the 0090 bullet with a note that it was renumbered (not grandfathered) and
correct the 0156 cross-reference to name only real grandfathers (0074). No script
or KNOWN_MIGRATION_DUPLICATES behaviour change.

Add two guards so the header and the data cannot silently diverge again: every
filename in KNOWN_MIGRATION_DUPLICATES must exist in migrations/ (a re-added 0090
fails this), and every on-disk migration number with more than one file must be a
key (a new un-grandfathered collision fails this).

Closes JSONbored#9653
@shin-core
shin-core requested a review from JSONbored as a code owner July 29, 2026 11:43
@superagent-security

Copy link
Copy Markdown
Contributor

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

@loopover-orb

loopover-orb Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Caution

🛑 LoopOver review result - reject/close recommended

Review updated: 2026-07-29 12:02:34 UTC

2 files · 1 AI reviewer · 1 blocker · CI failing · unstable

🛑 Suggested Action - Reject/Close

Review summary
This PR only touches a comment header in scripts/check-migrations.ts and adds tests in test/unit/migration-collisions.test.ts — it does not edit src/db/migration-collisions.ts. But the PR's premise ("0090 is already correct — not a key") and its new test (`KNOWN_MIGRATION_DUPLICATES.has(90)` expected `false`) are false against the actual current file: the RELEVANT EXISTING CODE section shows src/db/migration-collisions.ts still defines `[90, new Set(["0090_contributor_cap_label.sql", "0090_pull_request_detail_sync_head_sha.sql"])]` in KNOWN_MIGRATION_DUPLICATES. That directly contradicts the new assertions and explains the FAILED validate-tests check. The comment-only fix is well-reasoned in isolation, but it's built on an incorrect premise about the data file's real state, and the accompanying tests will fail as written.

Blockers

  • The new test expects KNOWN_MIGRATION_DUPLICATES.has(90) to be false and the sorted-keys list to equal [15,17,74,156], but the actual src/db/migration-collisions.ts still contains a 90 entry, so this test fails.
  • The 'stays byte-identical' test asserts [...KNOWN_MIGRATION_DUPLICATES.keys()].sort((a,b)=>a-b)).toEqual([15, 17, 74, 156]) which will fail if 90 is still present in the real map, per the reference file content shown.
Nits — 4 non-blocking
  • The header comment change is well-written and clearly documents the renumbering history, but since KNOWN_MIGRATION_DUPLICATES itself still contains the 90 entry per the reference file, the comment now describes a state that doesn't match the data it's documenting.
  • The PR description explicitly claims KNOWN_MIGRATION_DUPLICATES 'is not edited' and is 'already correct,' which should have been re-verified against the actual current file content before writing tests that assert the opposite.
  • Before merging, re-run `npm run db:migrations:check` and the new test suite against the actual head commit to confirm KNOWN_MIGRATION_DUPLICATES really doesn't contain 90 — if it still does (as the reference content suggests), the real fix belongs in src/db/migration-collisions.ts, not just the comment.
  • If the 90 entry does still need removing from KNOWN_MIGRATION_DUPLICATES, that change (plus verifying no already-shipped renumbering side effects) should be part of this PR rather than assumed as already done.

Why this is blocked

  • The new test expects KNOWN_MIGRATION_DUPLICATES.has(90) to be false and the sorted-keys list to equal [15,17,74,156], but the actual src/db/migration-collisions.ts still contains a 90 entry, so this test fails.
📋 Copy for AI agents — paste into your coding agent
Fix the following blocker(s) from this PR review:

1. The new test expects KNOWN\_MIGRATION\_DUPLICATES.has\(90\) to be false and the sorted-keys list to equal \[15,17,74,156\], but the actual src/db/migration-collisions.ts still contains a 90 entry, so this test fails.

CI checks failing

  • validate
  • validate-tests

Decision drivers

  • ❌ Code review — 1 blocker (1 reviewer)
  • ❌ Gate result — Blocking (Repo-configured hard blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #9653
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (1 linked issue).
Validation posture ❌ 5/25 Preflight is holding this PR: the review lane is unavailable, so it is not ready for automated review.
Contributor workload ✅ 10/10 Author activity: 63 registered-repo PR(s), 46 merged, 0 issue(s).
Contributor context ✅ Confirmed Gittensor contributor shin-core; Gittensor profile; 63 PR(s), 0 issue(s).
Improvement ✅ Minor risk: clean · value: minor · LLM: unclear
Linked issue satisfaction

Addressed
The PR removes the stale 0090 grandfather bullet, replaces it with a note about the #8897 renumber to 0092, corrects the 0156 cross-reference to only cite 0074, and adds the two required bidirectional guard tests over the real migrations/ directory without touching KNOWN_MIGRATION_DUPLICATES.

Review context
  • Author: shin-core
  • Role context: outside_contributor
  • Public audience mode: oss maintainer
  • Lane context: Repository is registered but has no active allocation in the current snapshot.
  • Public profile languages: TypeScript, JavaScript, Solidity, Dart, Python, CSS, PHP, Rust
  • Official Gittensor activity: 63 PR(s), 0 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Await review-lane availability.
  • Then work through the remaining 2 steps in the Signals table above.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask 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.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/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.

  • Re-run LoopOver review

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

❌ 6 Tests Failed:

Tests completed Failed Passed Skipped
25208 6 25202 21
View the top 3 failed test(s) by shortest run time
test/unit/config-templates.test.ts > config/examples review templates (#1682) > loopover.full.yml body matches .loopover.yml.example from WHERE IT LIVES onward
Stack Traces | 0.0205s run time
AssertionError: expected '# WHERE IT LIVES (first match wins):\…' to be '# WHERE IT LIVES (first match wins):\…' // Object.is equality

- Expected
+ Received

@@ -260,29 +260,10 @@
    # column or dashboard toggle.
    advisoryCheckRuns:
      - name: Contributor trust
        appSlug: example-security-app

-   # Check-runs to IGNORE ENTIRELY (#9810) — the stronger sibling of advisoryCheckRuns above. Same
-   # spoof-resistant { name, appSlug } matching, but a matched run is treated as if it did not exist: it never
-   # gates CI, never counts as "still running", and — unlike advisory — never routes the PR to a manual-review
-   # hold either. Its conclusion is surfaced informationally only.
-   #
-   # Use this when a check's verdict carries no signal for YOUR repo while OTHER checks from the same app stay
-   # meaningful. The motivating case: a vendor app publishes both a real security scan AND a heuristic
-   # contributor-trust score. The scan is worth gating on; the trust score fails for perfectly good
-   # contributors, and listing it under advisoryCheckRuns still converts every one of their otherwise-clean PRs
-   # into a manual review — automation replaced by a queue of human decisions, and contributors left wondering
-   # whether they are being judged fairly. Ignoring the trust check keeps the scan's protection and drops the
-   # noise. If BOTH lists name the same check, ignore wins (it is the stronger, more explicit intent).
-   #
-   # List of { name, appSlug }, or omit. Default: not configured (byte-identical behavior for every repo that
-   # doesn't opt in). Config-as-code only — no DB column or dashboard toggle.
-   ignoredCheckRuns:
-     - name: Contributor trust
-       appSlug: example-security-app
-
    # Promote a confident AI-judgment-only finding (one the reviewer itself placed under "Blockers", never
    # a "Nit") into a real, deterministic gate blocker instead of leaving it advisory (#3907). Only matters
    # for repos already running the registry content lane (see contentLane below) — content/registry repos
    # have no schema/lint/codecov net to catch a semantically-wrong-but-structurally-valid defect, so their
    # own AI reviewer's judgment is the only thing that ever catches it.

 ❯ test/unit/config-templates.test.ts:39:57
test/unit/agent-approval-queue.test.ts > agent approval queue (#779) > unions branch-protection contexts into the accept-time live CI re-check
Stack Traces | 0.0361s run time
AssertionError: expected "vi.fn()" to be called with arguments: [ { …(29) }, 'owner/repo', 'h7', …(4) ]

Received:

  1st vi.fn() call:

@@ -46,13 +46,14 @@
        "send": [Function send],
      },
    },
    "owner/repo",
    "h7",
-   Any<String>,
+   "test-installation-token",
    Set {
      "branch-required",
      "build",
    },
-   Any<String>,
+   "installation:5",
+   undefined,
    undefined,
  ]

  2nd vi.fn() call:

@@ -46,13 +46,14 @@
        "send": [Function send],
      },
    },
    "owner/repo",
    "h7",
-   Any<String>,
+   "test-installation-token",
    Set {
      "branch-required",
      "build",
    },
-   Any<String>,
-   undefined,
+   "installation:5",
+   null,
+   null,
  ]


Number of calls: 2

 ❯ test/unit/agent-approval-queue.test.ts:602:34
test/unit/agent-approval-queue.test.ts > agent approval queue (#779) > falls back to expectedCiContexts when the accept-time branch-protection read fails
Stack Traces | 0.0417s run time
AssertionError: expected "vi.fn()" to be called with arguments: [ { …(29) }, 'owner/repo', 'h7', …(4) ]

Received:

  1st vi.fn() call:

@@ -46,12 +46,13 @@
        "send": [Function send],
      },
    },
    "owner/repo",
    "h7",
-   Any<String>,
+   "test-installation-token",
    Set {
      "build",
    },
-   Any<String>,
+   "installation:5",
+   null,
    null,
  ]


Number of calls: 1

 ❯ test/unit/agent-approval-queue.test.ts:617:34
test/unit/agent-approval-queue.test.ts > agent approval queue (#779) > threads the repo's expectedCiContexts into the accept-time live CI re-check
Stack Traces | 0.0515s run time
AssertionError: expected "vi.fn()" to be called with arguments: [ { …(29) }, 'owner/repo', 'h7', …(4) ]

Received:

  1st vi.fn() call:

@@ -46,13 +46,14 @@
        "send": [Function send],
      },
    },
    "owner/repo",
    "h7",
-   Any<String>,
+   "test-installation-token",
    Set {
      "build",
      "test",
    },
-   Any<String>,
+   "installation:5",
+   undefined,
    undefined,
  ]

  2nd vi.fn() call:

@@ -46,13 +46,14 @@
        "send": [Function send],
      },
    },
    "owner/repo",
    "h7",
-   Any<String>,
+   "test-installation-token",
    Set {
      "build",
      "test",
    },
-   Any<String>,
-   undefined,
+   "installation:5",
+   null,
+   null,
  ]


Number of calls: 2

 ❯ test/unit/agent-approval-queue.test.ts:586:34
test/unit/queue.test.ts > queue processors > surfaces stale optional CI after the stale-CI cap
Stack Traces | 0.229s run time
AssertionError: expected "fetchLiveCiAggregatePreferGraphQl" to be called with arguments: [ Anything, 'owner/agent-repo', …(5) ]

Received:

  1st fetchLiveCiAggregatePreferGraphQl call:

  [
-   Anything,
+   {
+     "ADMIN_GITHUB_LOGINS": "jsonbored",
+     "AI_REVIEW_CLOSE_CONFIDENCE_AUTOTUNE_ENABLED": "false",
+     "AI_REVIEW_CLOSE_CONFIDENCE_TIGHTEN_ENABLED": "false",
+     "CONFIG_DRIFT_SENTINEL_ENABLED": "false",
+     "DB": TestD1Database {
+       "db": DatabaseSync {
+         "isOpen": true,
+         "isTransaction": false,
+         Symbol(sqlite-type): "node:sqlite",
+       },
+     },
+     "GITHUB_APP_ID": "3824093",
+     "GITHUB_APP_PRIVATE_KEY": "-----BEGIN PRIVATE KEY-----
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZaAuqqQDt+yQ7
+ qwt1AMQtf690ul3/xs/2gWfGgIK0zLzWkivn1e+TtBvzzPvq9LLhOxKgqKFRZI1D
+ JZ6mMRmMTWBX+z27uTyIzNhxtolIhEassFBBspfmHjiuxV5l00zLNf1kTLyb3k2a
+ hOxa7BsKEDf4fe3UNuvNJjBAw+uvG5L1O9BjfRnyncPMRtXZJAM92CMTMSXokfTN
+ CUYvG9ejgsOzi0t6QYDSbY/BIHPkP1rwwU73zWTGpfB4jjzp8TTlNxymDbzuFObu
+ S+u3gHV1hYRG00XKssOh4xajo1RyHSPYQLkUifBjGd4c/qq2CYoVDCVe1lD1y++Q
+ wSd81fRRAgMBAAECggEAEYhKnZEKxEZbLA0ti7pbt7wa9Q/E/hglRAC4UtmhAM3c
+ gjTQQd5et1OAaBM9MxvX86IxDMAAn2jbnAFEB6zAvc/tH7dBCZsk+rbDUztIW67g
+ KLPAyyWJCqugAFcmF1HYmPAyDrVCBhNhwH7s9SGihheb/egA5prlvfnxDP4HywuJ
+ CDgjzqqmlnH/yFZXe34NiKqouun+5K06nUC9kFeaNG438oG0E7pROM+Ee5uQVwmH
+ qONnxvUy+Bq4J0ohyYC/JAx2RvkW6hpoRLGANzX1udcWsa9jj2iNtRumLWKH5lkU
+ JAT0zE9l/DF915sQ1lvz6dpIc4OAm9A7HOTEFdi0yQKBgQDybqUOqkxn7DOp9M9t
+ YKQX30vkLEiL+i7vHTKP02Jjb+D34pB+SVLDuH0NWSaSQtNaXjnMeDeBWy1XT/Uo
+ J8rC8zAn0rwCqFZ9JhYUWg3BvrFbG7VLG2Ty3aFZwX/v71s6QRPUViZumfvYfBm1
+ dIOmA7kzJdMde6++Ya7HK83TKQKBgQDlktp+6awmsGDsTMPF5B7r35OuC4wEAfxw
+ 5hoopkAGJ8fTZeaLXhHUCVgPswWvQBSLU5ZXhcGks8w86IZtxkivBfj3XAeFL/Yi
+ ktZCeZy5kp5L2UiOavoVyF/5MuwnVWcMuKvmewnaN2+BOye4YRiy5P/7Tv/ddEsS
+ R9LFtzck6QKBgF+4OAt2SfyuUifEtTGmeqPCUqCgq3Q5L9bRXGlVOP+x6M128z4p
+ jTgh254tmQEeyXxgv8lvndrBOUHEHDPiojge9OCEYB9cf+mh5A3dEJlyxWwHoKkr
+ A8ywnUhnEjCV/RsfHskzyrDYs4tiVHREsMYXqkP7p0N41ocA4pVZQkchAoGAV2Gj
+ OuVUelFuQuMhLUScJGmwO3H3tFrRLGPZFxnYir8/hw5lRyziGlQIKcmZY1A/wZxq
+ QBwQTdGF7rUO3d+4MK5USkrELgTIafZ8CUdiyRuulu44eMTtNbdUGHUyf/I4zBXK
+ kGrKoD2zenv6rWp/zS/u40f5ieBG5slhx5HqMmkCgYBkAPCmiHlq+uooluiSl112
+ NpbFvWzcyu2Pqf1aLPCznwGAdLqTfe/zALhAZTK1bc0erUcV7EP26XBPzwg0zJCg
+ 4YMQuv/325H4yNl5m6RueDM2rg1BD6teVaF2B/n2IVaPdCNOuPV05241C7GmS7Xp
+ pzznYGT53vqrwH3LKSzWNw==
+ -----END PRIVATE KEY-----",
+     "GITHUB_APP_SLUG": "loopover-orb",
+     "GITHUB_WEBHOOK_SECRET": "test-webhook-secret",
+     "GITTENSOR_REGISTRY_URL": "https://raw.githubusercontent..../validator/weights/master_repositories.json",
+     "GITTENSOR_UPSTREAM_REF": "test",
+     "GITTENSOR_UPSTREAM_REPO": "entrius/gittensor",
+     "INTERNAL_JOB_TOKEN": "dev-internal-token",
+     "JOBS": {
+       "send": [Function send],
+     },
+     "LOOPOVER_API_TOKEN": "test-api-token",
+     "LOOPOVER_AUTO_FILE_DRIFT_ISSUES": "false",
+     "LOOPOVER_DRIFT_ISSUE_REPO": "test-harness/no-self-repo-match",
+     "LOOPOVER_EXPERIMENTAL_GITTENSOR": "false",
+     "LOOPOVER_FAIRNESS_ANALYTICS": "false",
+     "LOOPOVER_MCP_TOKEN": "test-mcp-token",
+     "LOOPOVER_REVIEW_REPOS": "JSONbored/gittensory,acme/widgets",
+     "LOOPOVER_SKIP_AUTOMATION_BOT_PRS": "true",
+     "MCP_ACTUATION_REPO_ALLOWLIST": "*",
+     "MCP_READ_REPO_ALLOWLIST": "*",
+     "PUBLIC_API_ORIGIN": "https://api.loopover.ai",
+     "PUBLIC_SITE_ORIGIN": "https://loopover.ai",
+     "SATISFACTION_FLOOR_AUTOTUNE_ENABLED": "false",
+     "SELFHOST_TRANSIENT_CACHE": {
+       "claim": [Function claim],
+       "del": [Function del],
+       "get": [Function get],
+       "releaseIfValue": [Function releaseIfValue],
+       "set": [Function set],
+     },
+     "WEBHOOKS": {
+       "send": [Function send],
+     },
+   },
    "owner/agent-repo",
    "a7",
-   Any<String>,
+   "installation-token",
    Set {
      "trusted-required-ci",
    },
    "installation:9001",
+   undefined,
    undefined,
  ]

  2nd fetchLiveCiAggregatePreferGraphQl call:

  [
-   Anything,
+   {
+     "ADMIN_GITHUB_LOGINS": "jsonbored",
+     "AI_REVIEW_CLOSE_CONFIDENCE_AUTOTUNE_ENABLED": "false",
+     "AI_REVIEW_CLOSE_CONFIDENCE_TIGHTEN_ENABLED": "false",
+     "CONFIG_DRIFT_SENTINEL_ENABLED": "false",
+     "DB": TestD1Database {
+       "db": DatabaseSync {
+         "isOpen": true,
+         "isTransaction": false,
+         Symbol(sqlite-type): "node:sqlite",
+       },
+     },
+     "GITHUB_APP_ID": "3824093",
+     "GITHUB_APP_PRIVATE_KEY": "-----BEGIN PRIVATE KEY-----
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZaAuqqQDt+yQ7
+ qwt1AMQtf690ul3/xs/2gWfGgIK0zLzWkivn1e+TtBvzzPvq9LLhOxKgqKFRZI1D
+ JZ6mMRmMTWBX+z27uTyIzNhxtolIhEassFBBspfmHjiuxV5l00zLNf1kTLyb3k2a
+ hOxa7BsKEDf4fe3UNuvNJjBAw+uvG5L1O9BjfRnyncPMRtXZJAM92CMTMSXokfTN
+ CUYvG9ejgsOzi0t6QYDSbY/BIHPkP1rwwU73zWTGpfB4jjzp8TTlNxymDbzuFObu
+ S+u3gHV1hYRG00XKssOh4xajo1RyHSPYQLkUifBjGd4c/qq2CYoVDCVe1lD1y++Q
+ wSd81fRRAgMBAAECggEAEYhKnZEKxEZbLA0ti7pbt7wa9Q/E/hglRAC4UtmhAM3c
+ gjTQQd5et1OAaBM9MxvX86IxDMAAn2jbnAFEB6zAvc/tH7dBCZsk+rbDUztIW67g
+ KLPAyyWJCqugAFcmF1HYmPAyDrVCBhNhwH7s9SGihheb/egA5prlvfnxDP4HywuJ
+ CDgjzqqmlnH/yFZXe34NiKqouun+5K06nUC9kFeaNG438oG0E7pROM+Ee5uQVwmH
+ qONnxvUy+Bq4J0ohyYC/JAx2RvkW6hpoRLGANzX1udcWsa9jj2iNtRumLWKH5lkU
+ JAT0zE9l/DF915sQ1lvz6dpIc4OAm9A7HOTEFdi0yQKBgQDybqUOqkxn7DOp9M9t
+ YKQX30vkLEiL+i7vHTKP02Jjb+D34pB+SVLDuH0NWSaSQtNaXjnMeDeBWy1XT/Uo
+ J8rC8zAn0rwCqFZ9JhYUWg3BvrFbG7VLG2Ty3aFZwX/v71s6QRPUViZumfvYfBm1
+ dIOmA7kzJdMde6++Ya7HK83TKQKBgQDlktp+6awmsGDsTMPF5B7r35OuC4wEAfxw
+ 5hoopkAGJ8fTZeaLXhHUCVgPswWvQBSLU5ZXhcGks8w86IZtxkivBfj3XAeFL/Yi
+ ktZCeZy5kp5L2UiOavoVyF/5MuwnVWcMuKvmewnaN2+BOye4YRiy5P/7Tv/ddEsS
+ R9LFtzck6QKBgF+4OAt2SfyuUifEtTGmeqPCUqCgq3Q5L9bRXGlVOP+x6M128z4p
+ jTgh254tmQEeyXxgv8lvndrBOUHEHDPiojge9OCEYB9cf+mh5A3dEJlyxWwHoKkr
+ A8ywnUhnEjCV/RsfHskzyrDYs4tiVHREsMYXqkP7p0N41ocA4pVZQkchAoGAV2Gj
+ OuVUelFuQuMhLUScJGmwO3H3tFrRLGPZFxnYir8/hw5lRyziGlQIKcmZY1A/wZxq
+ QBwQTdGF7rUO3d+4MK5USkrELgTIafZ8CUdiyRuulu44eMTtNbdUGHUyf/I4zBXK
+ kGrKoD2zenv6rWp/zS/u40f5ieBG5slhx5HqMmkCgYBkAPCmiHlq+uooluiSl112
+ NpbFvWzcyu2Pqf1aLPCznwGAdLqTfe/zALhAZTK1bc0erUcV7EP26XBPzwg0zJCg
+ 4YMQuv/325H4yNl5m6RueDM2rg1BD6teVaF2B/n2IVaPdCNOuPV05241C7GmS7Xp
+ pzznYGT53vqrwH3LKSzWNw==
+ -----END PRIVATE KEY-----",
+     "GITHUB_APP_SLUG": "loopover-orb",
+     "GITHUB_WEBHOOK_SECRET": "test-webhook-secret",
+     "GITTENSOR_REGISTRY_URL": "https://raw.githubusercontent..../validator/weights/master_repositories.json",
+     "GITTENSOR_UPSTREAM_REF": "test",
+     "GITTENSOR_UPSTREAM_REPO": "entrius/gittensor",
+     "INTERNAL_JOB_TOKEN": "dev-internal-token",
+     "JOBS": {
+       "send": [Function send],
+     },
+     "LOOPOVER_API_TOKEN": "test-api-token",
+     "LOOPOVER_AUTO_FILE_DRIFT_ISSUES": "false",
+     "LOOPOVER_DRIFT_ISSUE_REPO": "test-harness/no-self-repo-match",
+     "LOOPOVER_EXPERIMENTAL_GITTENSOR": "false",
+     "LOOPOVER_FAIRNESS_ANALYTICS": "false",
+     "LOOPOVER_MCP_TOKEN": "test-mcp-token",
+     "LOOPOVER_REVIEW_REPOS": "JSONbored/gittensory,acme/widgets",
+     "LOOPOVER_SKIP_AUTOMATION_BOT_PRS": "true",
+     "MCP_ACTUATION_REPO_ALLOWLIST": "*",
+     "MCP_READ_REPO_ALLOWLIST": "*",
+     "PUBLIC_API_ORIGIN": "https://api.loopover.ai",
+     "PUBLIC_SITE_ORIGIN": "https://loopover.ai",
+     "SATISFACTION_FLOOR_AUTOTUNE_ENABLED": "false",
+     "SELFHOST_TRANSIENT_CACHE": {
+       "claim": [Function claim],
+       "del": [Function del],
+       "get": [Function get],
+       "releaseIfValue": [Function releaseIfValue],
+       "set": [Function set],
+     },
+     "WEBHOOKS": {
+       "send": [Function send],
+     },
+   },
    "owner/agent-repo",
    "a7",
-   Any<String>,
+   "installation-token",
    Set {
      "trusted-required-ci",
    },
    "installation:9001",
+   undefined,
    undefined,
  ]


Number of calls: 2

 ❯ test/unit/queue.test.ts:1872:25
test/unit/queue.test.ts > queue processors > durable CI-state snapshot cache (#selfhost-ci-verification, cross-job) > REGRESSION (#selfhost-ci-verification gate review): a swallowed branch-protection read failure never writes the fail-open aggregate through to the durable cache
Stack Traces | 0.267s run time
AssertionError: expected { …(24) } to match object { ciState: 'passed', …(1) }
(22 matching properties omitted from actual)

- Expected
+ Received

  {
-   "ciRequiredContextsKey": "[\"trusted-required-ci\"]|adv:",
+   "ciRequiredContextsKey": "[\"trusted-required-ci\"]|adv:|ign:",
    "ciState": "passed",
  }

 ❯ test/unit/queue.test.ts:3172:81

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

@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 29, 2026
@loopover-orb

loopover-orb Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

LoopOver is closing this pull request on the maintainer's behalf (CI is failing (validate, validate-tests); AI review flagged a likely critical defect: The new test expects KNOWN_MIGRATION_DUPLICATES.has(90) to be false and the sorted-keys list to equal [15,17,74,156], but the actual src/db/migration-collisions.ts still contains a 90 entry, so this test fails.). This is an automated maintenance action — to pursue this change, please open a new pull request with the issues resolved. Closed PRs may be analyzed later to improve review accuracy, but they are not automatically reopened or re-reviewed.

@loopover-orb loopover-orb Bot closed this Jul 29, 2026
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.

db: check-migrations' grandfathered-duplicate list documents a 0090 collision that no longer

1 participant