Skip to content

fix(openapi): register each internal job once, with the status its handler returns (#9706) - #9759

Merged
JSONbored merged 1 commit into
fix/openapi-internal-security-9707from
fix/openapi-internal-jobs-9706
Jul 29, 2026
Merged

fix(openapi): register each internal job once, with the status its handler returns (#9706)#9759
JSONbored merged 1 commit into
fix/openapi-internal-security-9707from
fix/openapi-internal-jobs-9706

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Closes #9706.

Stacked on #9758 (which closes #9707). Base is that branch, so this diff shows only #9706's own change; GitHub retargets it to main when #9758 merges. The dependency is real: #9707 gave three /v1/internal/jobs/* routes an auth declaration to clear its "no 401 without a scheme" assertion, and this PR moves those same three into the jobs table where they belong.

The duplication

buildOpenApiSpec() registered the /v1/internal/jobs/* family twice — five explicit blocks plus a nine-entry loop in spec.ts, and jobRoutes() in internal-and-public-route-specs.ts. 11 POST operations were contributed twice with nothing detecting it.

zod-to-openapi keeps the last registration, which silently discarded the more accurate half. Verified against the committed document: POST /v1/internal/jobs/backfill-pr-details published queueBackfillPrDetailsJob with responses ["202","401"], while the spec.ts block declaring postInternalJobsBackfillPrDetails and a 400 was gone entirely. The route does return 400.

The ratchet cannot catch this. It compares sets, so a path registered twice still balances in both directions of its diff. The guard added here consumes SPEC_REGISTRARS — the same list buildOpenApiSpec iterates — rather than restating the registrar modules, because a guard that must be kept in sync with what it guards goes quiet exactly when a new registrar is added.

The statuses

Checked route by route against the handlers:

  • Every SINGLE_JOBS entry enqueues and answers 202. The table published a 200 that was unreachable for all five, with summaries claiming the job ran. Now 202, and "Queue a job to …".
  • rag-index declares the 404 it returns when retrieval is disabled, and no 400 — an unparseable body becomes {} rather than a rejection.
  • regate-pr declares both: it validates its body and 404s an uninstalled repo.
  • The nine routes that validate a body declare a 400, through a per-entry override rather than by widening the shared QUEUED/RAN constants — which would have attached a 400 to every route that happily accepts any body. Both arms are asserted, since an override whose negative side nobody exercises is an override nobody tested.

build-contributor-evidence, build-burden-forecasts, and repair-data-fidelity join SINGLE_JOBS with the rest of the family. They were the three loop entries with no /run sibling to be tabled with — and, being legacy registerPath calls declaring no auth, they published a 401 with no scheme that could produce it, since requiresApiToken returns false for /v1/internal/* (that family has its own middleware). Every operation under that prefix now declares its bearer, asserted exhaustively.

Validation

  • Every new assertion fails on the pre-fix spec — the duplicate guard, all five "queued not run" cases, and both rag-index/regate-pr status cases.
  • grep -c 'internal/jobs' src/openapi/spec.ts0.
  • npx vitest run --changed: 1934 passed, 142 files. tsc --noEmit clean; the ratchet still passes in both directions.

…ndler returns (#9706)

buildOpenApiSpec registered the /v1/internal/jobs/* family TWICE -- five explicit blocks plus a
nine-entry loop in spec.ts, and jobRoutes() in internal-and-public-route-specs.ts -- so 11 POST
operations were contributed twice with nothing detecting it. zod-to-openapi keeps the last, which
silently discarded the more accurate half: backfill-pr-details published an operation with no 400,
while the spec.ts block declaring the 400 its handler really returns never reached the document.

The ratchet cannot catch this. It compares SETS, so a path registered twice still balances in both
directions of its diff. The guard added here consumes SPEC_REGISTRARS -- the same list
buildOpenApiSpec iterates -- rather than restating the registrar modules, because a guard that has
to be kept in sync with what it guards goes quiet exactly when a new one is added.

Statuses now match the handlers, verified route by route. Every SINGLE_JOBS entry ENQUEUES and
answers 202; the table published a 200 that was unreachable for all five, with summaries claiming
the job ran. rag-index declares the 404 it returns when retrieval is disabled and no 400, since an
unparseable body becomes {} rather than a rejection; regate-pr declares both. The nine routes that
do validate a body declare a 400 through a per-entry override -- not by widening the shared QUEUED
and RAN constants, which would have attached a 400 to every route that accepts any body. Both arms
are asserted, since an override nobody exercises the negative side of is an override nobody tested.

build-contributor-evidence, build-burden-forecasts, and repair-data-fidelity move into SINGLE_JOBS
with the rest of the family. They were the three loop entries with no /run sibling to be tabled
with, and being legacy registerPath calls that declared no auth, they published a 401 with no
scheme that could produce it -- requiresApiToken returns false for /v1/internal/*, which has its own
middleware. Every operation under that prefix now declares its bearer, asserted exhaustively.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 29, 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 916f778 Commit Preview URL

Branch Preview URL
Jul 29 2026, 07:04 AM

@loopover-orb

loopover-orb Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Tip

✅ LoopOver review result - approve/merge recommended

Review updated: 2026-07-29 07:23:32 UTC

4 files · 1 AI reviewer · no blockers · readiness 71/100 · CI green · clean

✅ Suggested Action - Approve/Merge

  • safe to merge

Review summary
This closes #9706 by removing the duplicate registration of the internal jobs routes (spec.ts's manual registerPath calls vs. jobRoutes() in internal-and-public-route-specs.ts), fixing statuses (202 not 200 for enqueue-only jobs, correct per-route 400/404 presence) and adding a SPEC_REGISTRARS-driven test that asserts each method+path is registered exactly once. The fix is at the right layer — it removes the stale duplicate block in spec.ts rather than papering over zod-to-openapi's 'last registration wins' behavior — and the new tests exercise the actual generated document (buildOpenApiSpec()/registry.definitions), not a fabricated payload. The openapi.json diff is consistent with the source changes (202 replacing 200, added 400s, corrected operationIds/tags), and the PR is properly scoped to and closes its stated issue.

Nits — 8 non-blocking
  • src/openapi/internal-and-public-route-specs.ts: JobPair's queueValidates/runValidates booleans are easy to get backwards for a new entry since nothing enforces they match the handler; consider a short inline comment per row citing the validated field (as the module comment does for build-contributor-decision-packs) so future additions are checkable at a glance.
  • The duplicate-registration guard test (test/unit/route-spec-ratchet.test.ts) is a valuable addition but is fully dependent on SPEC_REGISTRARS being kept complete — worth a one-line comment there noting that a new registrar module must be added to that array or the guard silently stops covering it, similar to the caution already given for buildOpenApiSpec()'s own list.
  • openapi.json is a large generated artifact; note only for reviewers scanning the diff that it can be regenerated and doesn't need line-by-line scrutiny beyond spot-checking (done above).
  • Consider adding a lint/CI script assertion (or extending the existing ratchet test) that fails if SPEC_REGISTRARS omits a module actually exported from src/openapi/*-route-specs.ts, closing the last gap the module comment flags as a known weak point.
  • Since MALFORMED is intentionally per-entry rather than folded into QUEUED/RAN, consider a short JSDoc example on JobPair documenting one concrete case (e.g. build-contributor-decision-packs) so a future contributor immediately sees why the flags are independent.
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.
  • Pull request duplicates other open work — Check for an existing pull request or issue covering this change and coordinate or consolidate before continuing.
  • Readiness score is below the configured threshold — Use the readiness panel as advisory maintainer context; the score does not block this PR.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ✅ Gate result — Passing (No configured blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #9706, #9707
Related work ⚠️ Same linked issue: #9758 Another open PR references the same linked issue.
Change scope ❌ 8/20 High review scope from cached public metadata (2 linked issues).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 14 registered-repo PR(s), 13 merged, 359 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 14 PR(s), 359 issue(s).
Improvement ✅ Minor risk: low · value: minor
Linked issue satisfaction

Addressed
The diff deletes the five explicit spec.ts blocks and the nine-entry loop for /v1/internal/jobs/*, folds build-contributor-evidence/build-burden-forecasts/repair-data-fidelity into SINGLE_JOBS with auth:"internal" and 202 responses, gives rag-index/regate-pr the specified 404/400 split, adds per-entry MALFORMED overrides for the nine body-validating routes without widening the shared QUEUED/RAN co

Review context
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
  • Then work through the remaining 5 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 <question> answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat <question> 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.

Decision record
  • action: merge · clause: success
  • config: 76c853cfa3c566bf39c9d347eb3cb85ac4fe3bf3b7b61380f43db5e6ba64053c · pack: oss-anti-slop · ci: passed
  • record: 3ca048fa0a7f80488e2ec9336d89d988ad8549d41d736dc7597ba1e2db0cf2b9 (schema v5, head 916f778)
Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

Scroll preview
Route Before (production) After (this PR's preview)
/ before / (scroll)
before / (scroll)
after / (scroll)
after / (scroll)

A short scroll-through clip (desktop) — click either thumbnail to open the full animation. Evidence for scroll-linked behavior a single screenshot can't show.

🟩 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

@JSONbored JSONbored self-assigned this Jul 29, 2026
@superagent-security

Copy link
Copy Markdown
Contributor

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

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 1.29kB (0.02%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.81MB 1.29kB (0.02%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-CFwXXHmg.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-lpHJq59p.js (New) 914.85kB 914.85kB 100.0% 🚀
openapi.json 846 bytes 716.1kB 0.12%
assets/docs.fumadocs-spike-api-reference-BVq5HLNE.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-By-AVz6D.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-XsYvyXyX.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-BbdSw0T6.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/maintainer-panel-Bykwprly.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/routes-CP4VJsR3.js (New) 35.96kB 35.96kB 100.0% 🚀
assets/owner-panel-D_lcyzA5.js (New) 27.92kB 27.92kB 100.0% 🚀
assets/app-CvvA4zSZ.js (New) 25.78kB 25.78kB 100.0% 🚀
assets/ui-vendor-OdMtrLSF.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/miner-panel-Bq9vm48T.js (New) 20.24kB 20.24kB 100.0% 🚀
assets/app.runs-CmAKD6Zo.js (New) 20.22kB 20.22kB 100.0% 🚀
assets/api._op-CGJ-mNP4.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-OFMB1VFO.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-CWftFiwu.js (New) 15.52kB 15.52kB 100.0% 🚀
assets/playground-panel-mYsrQ_jb.js (New) 14.42kB 14.42kB 100.0% 🚀
assets/fairness-CbP7aMci.js (New) 12.16kB 12.16kB 100.0% 🚀
assets/app.audit-kFbU9t_l.js (New) 10.08kB 10.08kB 100.0% 🚀
assets/app.config-generator-CQUyZKzF.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-BZ9CbdUc.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-PNHLndFk.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-YUxf0ap9.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-D5Zmom9e.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/maintainer-workflow-ClgBvPH3.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-C0MIII69.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-C3fkK1-h.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-D7NJu9Nk.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/docs.index-ZQHvlegH.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-D6nHYH-R.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-COtPPv-1.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-CB98GXJL.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-B_Q9yuNS.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-CaNJy2Py.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-Ct4cMqYi.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-6D-sTol0.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-rShoFOvz.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-D7ismqO4.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-CgoE7S1I.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-DeUAO9LG.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-CZho-TaI.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-CiO610_a.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-Ck-JDjTX.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-BRhH5H3S.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-lI5MtHYj.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-1sZ5FVQ-.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-DrBVX7dW.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-q9tAO3yc.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-BCN_dwbh.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-CkkIyorB.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-C-NNlp7X.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-CJTMETGY.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-DIggSIDS.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-rczyBth_.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-BGsc2MF_.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-Bw4ZP4Er.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-Bi2gbScg.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-fTqmGA1Z.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-CMGI_78S.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-DaVkvv34.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-77lZKHt3.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/add-scalar-classes-BnHY5uVm.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-gopR17mF.js (Deleted) -914.41kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-CZWLQldh.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-BDt8ncwb.js (Deleted) -201.7kB 0 bytes -100.0% 🗑️
assets/modal-j8IcsL2_.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-BznQraoz.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BKHY5aJk.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/routes-DmeFSX8Y.js (Deleted) -35.96kB 0 bytes -100.0% 🗑️
assets/owner-panel-qInmqo7U.js (Deleted) -27.92kB 0 bytes -100.0% 🗑️
assets/app-BY3Sc2ko.js (Deleted) -25.78kB 0 bytes -100.0% 🗑️
assets/ui-vendor-Cvt5jSzJ.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-k3-6H4jh.js (Deleted) -20.24kB 0 bytes -100.0% 🗑️
assets/app.runs-Cls0Yini.js (Deleted) -20.22kB 0 bytes -100.0% 🗑️
assets/api._op-Bu53w3VP.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-D8Z75SLI.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-DHhaHFMY.js (Deleted) -15.52kB 0 bytes -100.0% 🗑️
assets/playground-panel-n_rVv_4f.js (Deleted) -14.42kB 0 bytes -100.0% 🗑️
assets/fairness-B9pn97gE.js (Deleted) -12.16kB 0 bytes -100.0% 🗑️
assets/app.audit-BFNSKI3Q.js (Deleted) -10.08kB 0 bytes -100.0% 🗑️
assets/app.config-generator-CCnUUImh.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-B0-ahFas.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-DfxO4Miy.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-TWV16pts.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-DGP0VDLl.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-kQNbVWLl.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-pIhckz8h.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-Vto6bo3t.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-VYh7_Kx5.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/docs.index-Z6fHPLKa.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-9aWIW_Hq.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-BemzBQnd.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-Bzd0GSzk.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-cU1AIpya.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-xxyDZalR.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-D4RzwJJj.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-hc6d2ZLv.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-hYeO1VTe.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-5nKtO_QE.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-BCbuKhKF.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-D3Tlhmgp.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-BwdnqF62.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-D_bFyDCP.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-BQEb_Tlc.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-0KtxvBws.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-C8KNehFb.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-upnp6ti6.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-BES3tiy7.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-BcHmUncq.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-Vflida55.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-Buw-6ZKx.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-CF_tbrf1.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-Bu6nchrw.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-BALOt43W.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-8zbm3mLi.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-CqaxdqbK.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-kY-q7LWC.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-BZ0jo8aB.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw--qlZFpoj.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-DhccWzL1.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-CW2tsKuv.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-UyJfSfKb.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 89.45%. Comparing base (1e19944) to head (916f778).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@                          Coverage Diff                           @@
##           fix/openapi-internal-security-9707    #9759      +/-   ##
======================================================================
- Coverage                               89.45%   89.45%   -0.01%     
======================================================================
  Files                                     904      904              
  Lines                                  113210   113206       -4     
  Branches                                26859    26861       +2     
======================================================================
- Hits                                   101275   101271       -4     
  Misses                                  10846    10846              
  Partials                                 1089     1089              
Flag Coverage Δ
backend 94.06% <100.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/openapi/internal-and-public-route-specs.ts 100.00% <100.00%> (ø)
src/openapi/spec.ts 99.26% <100.00%> (-0.02%) ⬇️

@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 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LoopOver approves — the gate is satisfied and CI is green.

@JSONbored
JSONbored merged commit 9e2fab1 into main Jul 29, 2026
11 checks passed
@JSONbored
JSONbored deleted the fix/openapi-internal-jobs-9706 branch July 29, 2026 07:27
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

1 participant