Skip to content

feat(orb): serve GET /v1/public/eval-scores — the v1 EvalScoreRecord transport#9283

Open
JSONbored wants to merge 2 commits into
mainfrom
feat/eval-scores-endpoint
Open

feat(orb): serve GET /v1/public/eval-scores — the v1 EvalScoreRecord transport#9283
JSONbored wants to merge 2 commits into
mainfrom
feat/eval-scores-endpoint

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • New GET /v1/public/eval-scores?subject=&since= — the v1 transport Spec: validator-facing eval interface — what SN74 consumes from LoopOver as the objective eval provider #9215 specs for EvalScoreRecords. Unauthenticated, same LOOPOVER_PUBLIC_STATS flag/cache posture as /v1/public/stats.
  • Wired for the outcome_confirmed_precision source now: reshapes loadPublicRulePrecision's already-computed data into per-record, digest-committed EvalScoreRecords, one per rule, anchored to the latest persisted backtest run's corpus checksum. Emits nothing when there's no freeze point to commit to yet (a record whose commitments can't be independently re-derived isn't publishable, per Spec: validator-facing eval interface — what SN74 consumes from LoopOver as the objective eval provider #9215).
  • PublicRulePrecisionRow gains a raw confirmed count (previously only the rounded precision ratio was exposed) — needed so EvalScoreRecord.score.confirmed is exact, not reconstructed by inverting an already-rounded value. This also flows through /v1/public/stats (which spreads the block verbatim); OpenAPI schema updated to match.
  • recall/abstained don't apply to this work-unit kind (ORB's rules fire deterministically, no agent abstention concept here) — recall: null (genuinely inapplicable), abstained: 0 (correctly zero, not a masked null).

One deliberate deviation from #9266's own written requirement: the issue asked for "404 disabled / 503 on internal error." I didn't add a try/catch — loadPublicRulePrecision is fail-safe internally (safeAll swallows every read error into an empty section, by its own doc comment) and the rest of the pipeline is pure, so there's no reachable throw path in this composition today, and /v1/public/stats itself doesn't test its own 503 path for the identical reason. Added a comment explaining this and left real error handling for when #9265's benchmark-run source (which will have real IO) actually needs it.

Closes #9266.

Test plan

  • npx vitest run test/unit/eval-score-records.test.ts — 12/12 passing, 100% statement/branch/function/line coverage on the new core module
  • npx vitest run test/unit/public-rule-precision.test.ts — updated for the new confirmed field, 5/5 passing
  • npx vitest run test/integration/public-eval-scores-route.test.ts — 7/7 passing: flag-gated 404, empty-array on no freeze point, digest recomputability, subject/since filtering, cache headers, fail-safe degradation on a broken store
  • npx vitest run test/integration/public-decision-ledger-routes.test.ts — added to the shared exempt-public-routes table (14/14 passing)
  • npx vitest run test/unit/openapi.test.ts — 3/3 passing
  • npm run ui:openapi / ui:openapi:check — regenerated and verified clean
  • npx tsx scripts/check-import-specifiers.ts — clean

@superagent-security

Copy link
Copy Markdown
Contributor

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

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 27, 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 Updated (UTC)
🔵 In progress
View logs
loopover-ui b90f7e5 Jul 27 2026, 11:29 AM

@JSONbored JSONbored self-assigned this Jul 27, 2026
…transport (#9266)

Reshapes the already-computed outcome-confirmed rule precision into the
EvalScoreRecord shape spec'd on #9215: per-record digest commitment,
corpus-checksum-anchored, independently re-derivable by any consumer without
trusting the transport. Same flag/cache posture as /v1/public/stats since this
is a reshaping of the same data, not a new scoring surface.

Extends PublicRulePrecisionRow with a raw confirmed count (previously only the
rounded precision ratio was exposed) so EvalScoreRecord.score.confirmed is
exact rather than reconstructed from an already-rounded value.
@codecov

codecov Bot commented Jul 27, 2026

Copy link
Copy Markdown

Bundle Report

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

Detailed changes
Bundle name Size Change
loopover-ui 7.49MB 2.12kB (0.03%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-B1tvC3UZ.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-Bk3uZKSL.js (New) 817.03kB 817.03kB 100.0% 🚀
openapi.json 1.33kB 533.43kB 0.25%
assets/docs.fumadocs-spike-api-reference-CWvXJbyA.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-z-WcqiDW.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-Ch5JrPxb.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-BiCXHFS2.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/maintainer-panel-CKmAEnQb.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/routes-B7hJtsZX.js (New) 35.96kB 35.96kB 100.0% 🚀
assets/owner-panel-CyBIEgNZ.js (New) 27.92kB 27.92kB 100.0% 🚀
assets/app-cHjmmv6F.js (New) 25.78kB 25.78kB 100.0% 🚀
assets/ui-vendor-CCN3nBYk.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/miner-panel-2kHiXl0X.js (New) 20.24kB 20.24kB 100.0% 🚀
assets/app.runs-Lidjhckl.js (New) 20.22kB 20.22kB 100.0% 🚀
assets/api._op-UkTmWy-o.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-CVXwjapH.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-Cf9OXNDJ.js (New) 15.52kB 15.52kB 100.0% 🚀
assets/playground-panel-wZQPFo_s.js (New) 14.42kB 14.42kB 100.0% 🚀
assets/fairness-D-M4aSpm.js (New) 10.73kB 10.73kB 100.0% 🚀
assets/app.audit-DA_kgYeP.js (New) 10.08kB 10.08kB 100.0% 🚀
assets/app.config-generator-Xj0L_kr-.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-C3cWF8EQ.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-vScLTG6K.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-vxu6aLT0.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-DVOhzGv5.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/maintainer-workflow-C-0KiWx3.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-DeJxGeTT.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-NJwca65k.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-DUfeHsJW.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/docs.index-CNru9zqM.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-Q67Jtt2x.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-CUnuLuB6.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-Cki_PiqC.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-DRFkdKiB.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-DzbfA-9U.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-DVC31iuu.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-DHgbHlHj.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-BQCMeuhe.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-C2EnHvbT.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-6fAu4Nfy.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-jwtSA5JF.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-CDxqrThY.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-DmrP5G3v.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-Qitnogmp.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-sc-NeVqc.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-16eD6Mlq.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-B2iXOvPB.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-B4G83W6I.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-CdRDwxa3.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-DcqucMC0.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-CFofH15y.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-CRlFz3o5.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-BxVER8BF.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-BLNMNjtJ.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-DusJxp0I.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history--b1Xp7_v.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-DeNYCIMl.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-Bu3RchpJ.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-B0cb9bFv.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-DIOP0rIp.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-Cw3Jd1VP.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-B3e62Vht.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/add-scalar-classes-CtyCukOw.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-n-afb5Ft.js (Deleted) -816.24kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-Nf8lDID9.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-1F8DcEIh.js (Deleted) -201.7kB 0 bytes -100.0% 🗑️
assets/modal-CGckLwYe.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-DPbbRffq.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-DGQROUv8.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/routes-DqJtNcHQ.js (Deleted) -35.96kB 0 bytes -100.0% 🗑️
assets/owner-panel-C2VJ0mvH.js (Deleted) -27.92kB 0 bytes -100.0% 🗑️
assets/app-BNCrmV2I.js (Deleted) -25.78kB 0 bytes -100.0% 🗑️
assets/ui-vendor-CXSQ_VVW.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-C6K_LklA.js (Deleted) -20.24kB 0 bytes -100.0% 🗑️
assets/app.runs-BWfQtOeS.js (Deleted) -20.22kB 0 bytes -100.0% 🗑️
assets/api._op-CRRBfZaK.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-DV0ZcVjq.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-CeTNRJbf.js (Deleted) -15.52kB 0 bytes -100.0% 🗑️
assets/playground-panel-BC6wrKrp.js (Deleted) -14.42kB 0 bytes -100.0% 🗑️
assets/fairness-Dpz8hbf6.js (Deleted) -10.73kB 0 bytes -100.0% 🗑️
assets/app.audit-C5W0UQfJ.js (Deleted) -10.08kB 0 bytes -100.0% 🗑️
assets/app.config-generator-D4CLji6B.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-CHOUEXrx.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-Sn1I3sys.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-Dh722kWf.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-DT_Lswd0.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow--9Iza8ll.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-Ci02S1oK.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-DTOcIB5G.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-C4HmVCPb.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/docs.index-BRBdQwit.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-DrCPvlo-.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-BAPOm2aW.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-CsoBd91X.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-D7-FxYuc.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-CTsU1Vrm.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-DD4YCjrS.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-0RwsPKG3.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-BLBDQ7Xa.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-LyIqwu7Y.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-BwAXod_I.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-BN0RdPaa.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-7F-RRvU-.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-5yyiuLk3.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-Cwc1VC_y.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-BryDHpbM.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-CBAt8b_e.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-BZuJ_y_W.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-DuSCa9KY.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-BgN1AsgH.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-CFesfmip.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-BJLHSWrS.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-CzmSl2jt.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-ohUvOoiA.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-CUlNHUzE.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-C-IQSENi.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-B9YpPXi3.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-CXImsDeS.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-DUWw5Wsz.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-DfmMa5kv.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-BB4nDFpX.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-BXWkEqrv.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-E26vxZiZ.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️

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

codecov Bot commented Jul 27, 2026

Copy link
Copy Markdown

❌ 5 Tests Failed:

Tests completed Failed Passed Skipped
22681 5 22676 21
View the top 3 failed test(s) by shortest run time
test/unit/selfhost-pg-retention.test.ts > runRetentionPrune + processJob on the Postgres backend (#977) > processJob prune-retention deletes eligible rows and records a success audit event on Postgres
Stack Traces | 0.00416s run time
AssertionError: expected 3 to be +0 // Object.is equality

- Expected
+ Received

- 0
+ 3

 ❯ test/unit/selfhost-pg-retention.test.ts:119:44
test/unit/selfhost-pg-retention.test.ts > pruneExpiredRecords on the Postgres backend (#977) > deletes across multiple bounded batches and stops at the per-table cap, same as the SQLite path
Stack Traces | 0.0107s run time
AssertionError: expected +0 to be 4 // Object.is equality

- Expected
+ Received

- 4
+ 0

 ❯ test/unit/selfhost-pg-retention.test.ts:76:33
test/unit/selfhost-metrics.test.ts > DEFAULT_METRIC_META completeness (drift guard, 2026-07 fix) > every literal metric name emitted anywhere in src/ has a registered DEFAULT_METRIC_META entry
Stack Traces | 0.147s run time
AssertionError: expected [ …(2) ] to deeply equal []

- Expected
+ Received

- []
+ [
+   "loopover_orb_relay_multiple_live_enrollments_total",
+   "loopover_private_manifest_warnings_total",
+ ]

 ❯ test/unit/selfhost-metrics.test.ts:498:21
test/unit/worker-entry-boundary.test.ts > worker entry boundary > does not reference pixelmatch, pngjs, visual-diff, gifenc, or sharp in worker-reachable source
Stack Traces | 0.485s run time
AssertionError: worker-reachable files must not mention Node-only visual diff/GIF/image deps: .../review/visual/visual-findings.ts: expected [ Array(1) ] to deeply equal []

- Expected
+ Received

- []
+ [
+   ".../review/visual/visual-findings.ts",
+ ]

 ❯ test/unit/worker-entry-boundary.test.ts:82:118
View the full list of 1 ❄️ flaky test(s)
test/unit/salvageability.test.ts > resolveAiReviewSalvageableHold > defaults: no configured floor uses the gate default, and a confidence-less blocker counts as certainty (at/above floor)

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

Stack Traces | 0.00628s run time
AssertionError: expected undefined to be defined
 ❯ test/unit/salvageability.test.ts:88:18

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 commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Caution

🛑 LoopOver review result - fixes required

Review updated: 2026-07-27 11:46:22 UTC

10 files · 1 AI reviewer · no blockers · CI failing · unstable

🛑 Suggested Action - Manual Review

Review summary
The AI review returned non-blocking notes for this change but did not include a separate narrative summary. Review the nits below before deciding this PR.

Nits — 4 non-blocking
  • routes.ts's handler calls `loadPublicRulePrecision(c.env)` (implicit `Date.now()`) and then separately calls `new Date().toISOString()` for `issuedAt` — two independent clock reads a few ms apart; passing one shared timestamp through both would make the window commitment exact rather than approximately exact.
  • Magic numbers 404/200 in the new OpenAPI registration (routes.ts:1315, spec.ts:1025-1026) follow the pre-existing repo convention of inline status codes in doc registrations, so this is stylistic only.
  • Thread a single `nowMs`/`issuedAt` value through both `loadPublicRulePrecision(env, nowMs)` and `buildEvalScoreRecordsFromRulePrecision(precision, new Date(nowMs).toISOString())` in routes.ts so the recorded window commitments exactly match the query window used to produce the numbers.
  • 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.

CI checks failing

  • validate
  • validate-tests

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 #9266
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 ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 13 registered-repo PR(s), 13 merged, 307 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 13 PR(s), 307 issue(s).
Improvement ✅ Minor risk: clean · value: minor
Linked issue satisfaction

Partially addressed
The PR implements the endpoint, filtering, OpenAPI registration, auth exemption, cache headers, and digest verification exactly as specced, wired for the outcome-confirmed-precision source with solid test coverage — but it explicitly deviates from requirement #1's stated '503 on internal error' behavior, instead always returning 200 with an empty array on failure, which is a self-acknowledged, doc

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: Python, TypeScript, Ruby, Go, MDX, Shell, Solidity, JavaScript
  • Official Gittensor activity: 13 PR(s), 307 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
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: hold · clause: success
  • config: 03a7f8b529a9 · pack: oss-anti-slop
  • record: f420da7a8ada (schema v3, head 41d49ed)
Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
diff /
diff /
/ 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 · Diff highlights exactly what changed.

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

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 27, 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. manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

eval-interface: serve GET /v1/public/eval-scores — the v1 transport #9215 committed to

1 participant