Skip to content

feat(proof): the public per-repo proof page, the last piece of #9569 - #9989

Merged
JSONbored merged 1 commit into
mainfrom
site/public-proof-page-9569
Jul 31, 2026
Merged

feat(proof): the public per-repo proof page, the last piece of #9569#9989
JSONbored merged 1 commit into
mainfrom
site/public-proof-page-9569

Conversation

@JSONbored

@JSONbored JSONbored commented Jul 31, 2026

Copy link
Copy Markdown
Owner

The API half already shipped. /v1/public/repos/:owner/:repo/proof, the badge SVG, the feature flag and the per-repo opt-out are all on main, all built on buildProofSummary. What was missing was the page the issue is named for — there was no apps/loopover-ui/src/routes/proof.*.

One implementation, two renderings

This component renders and computes nothing. Every figure comes from the endpoint, which is the same composition the in-app trust panel (#9193) reads, so the two cannot disagree about a number. The only arithmetic is multiplying an already-computed rate by 100 for display — a percentage derived here would be a second implementation free to drift from the first, undermining the exact property the page exists to demonstrate.

The states are the substance

Each is somewhere a plausible implementation says something untrue, so each is tested:

State What the page does Why
Below the sample floor Shows the decision count, no rate "7 decisions, too few to claim a rate" is honest. Hiding the count with the figure, or printing 0%, are not.
Not yet anchored Neutral A repo without an anchor is not failing — the chain is still self-verifying.
Empty ledger Neutral: "a new repository, not a failing one" Same.
Broken ledger Stated as a problem, naming the row and the kind The one state that must not be softened; the kind of break is the actionable half.
Unavailable "not a claim that anything is wrong" Could-not-check is not evidence of a fault.
Opted out (404) Empty state, not an error Different ARIA role, different meaning. Telling an opted-out repo something broke invites hunting a fault that does not exist.
Accuracy Never without its denominator and Wilson interval The difference between a claim someone can argue with and marketing.

Two further details:

  • The boundary statement is rendered from the payload, not written in this component, so a screenshot or embed cannot shed the caveat while keeping the numbers.
  • Digests are head-and-tail with the full value in title — a truncated digest with no way back to the whole cannot be checked against anything.

Mutation testing

Mutation Result
Publish a rate below the sample floor 1 failed
Hardcode the boundary instead of reading the payload 1 failed
Turn the 404 into an error instead of empty 1 failed

Baseline restored green.

Issue requirements

  1. /proof/:owner/:repo page — this PR
  2. README badge SVG endpoint — already on main
  3. One implementation, two renderings — shared buildProofSummary
  4. Privacy boundary — allowlisted shape in proof-summary.ts
  5. Honest boundary states — table above
  6. Opt-out decision recorded — isProofPageEnabledForRepo

Verification

  • ui:typecheck, typecheck, docs:drift-check, dead-source-files:check, dead-exports:check, import-specifiers:check, coverage-boltons:check, ui-derived-types:check green
  • Full ui:test suite green; 10 new tests
  • routeTree.gen.ts regenerated via ui:build and committed
  • Raw Tailwind text sizes converted to the repo's text-token-* design tokens, which ui:lint's no-restricted-syntax rule enforces

Note: ui:lint currently fails on main for an unrelated reason — chart.test.tsx formatting, fixed in #9988. Not caused by this PR.

Closes #9569

The API half already shipped: `/v1/public/repos/:owner/:repo/proof`, the badge
SVG, the feature flag and the per-repo opt-out are all on main, all built on
`buildProofSummary`. What was missing was the page the issue is named for.

ONE IMPLEMENTATION, TWO RENDERINGS. This component renders and computes nothing.
Every figure comes from the endpoint, which is the same composition the in-app
trust panel (#9193) reads, so the two cannot disagree about a number. The only
arithmetic is multiplying an already-computed rate by 100 for display -- a
percentage derived here would be a second implementation free to drift from the
first, undermining the exact property the page exists to demonstrate.

The states are the substance, because each is somewhere a plausible
implementation says something untrue:

  • BELOW THE SAMPLE FLOOR the page shows the decision COUNT and no rate --
    "7 decisions, too few to claim a rate". Hiding the count along with the
    figure, or printing 0%, both misrepresent it.
  • NOT-YET-ANCHORED and EMPTY LEDGER are neutral. A new repository is not a
    failing one, and rendering it as an error lies in the more damaging
    direction.
  • A BROKEN ledger is the one state stated as a problem, naming the row and the
    kind of break, because the kind is the actionable half.
  • UNAVAILABLE says so explicitly: it is not a claim that anything is wrong.
  • AN OPTED-OUT REPO (404) is an EMPTY state, not an error -- a different ARIA
    role and a different meaning. Telling an opted-out repo something broke
    invites someone to hunt a fault that does not exist.
  • ACCURACY never appears without its denominator and Wilson interval.

The boundary statement is rendered FROM THE PAYLOAD rather than written here, so
a screenshot or an embed cannot shed the caveat while keeping the numbers.

Digests are shown head-and-tail with the full value in `title`: a truncated
digest with no way back to the whole cannot be checked against anything.

Mutation-tested: publishing a rate below the floor, hardcoding the boundary
statement, and turning the 404 into an error each fail.

Closes #9569
@cloudflare-workers-and-pages

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)
❌ Deployment failed
View logs
loopover-ui fa8be68 Jul 31 2026, 05:03 AM

@loopover-orb

loopover-orb Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Caution

🛑 LoopOver review result - fixes required

Review updated: 2026-07-31 05:13:19 UTC

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

🛑 Suggested Action - Manual Review

Review summary
Adds the missing public proof page (route + component + tests) that reads entirely from the existing `/v1/public/repos/:owner/:repo/proof` endpoint, matching the description's claim that all figures come from the API and the page performs no computation beyond `rate * 100` for display. The state handling (insufficient_data, empty ledger, broken ledger, not-yet-anchored, 404-as-empty) is implemented and each state is covered by a corresponding test in public-proof-page.test.tsx, and the routeTree.gen.ts diff is the expected generated-file delta for the new route. The CI failure on 'Workers Builds: loopover-ui' is undetailed and the branch is 2 commits behind default, which is a plausible cause per the given BASE BRANCH STATUS note.

Nits — 6 non-blocking
  • apps/loopover-ui/src/components/site/public-proof-page.tsx:80 — the `20`/`-6` slice offsets in `shortDigest` and the `8000`ms timeout, `404` status check, and `95` (confidence interval label) are unexplained magic numbers; naming a couple as constants (e.g. `DIGEST_HEAD_LEN`, `FETCH_TIMEOUT_MS`) would help future readers.
  • apps/loopover-ui/src/components/site/public-proof-page.tsx:155 — the `AccuracyCard`/`LedgerCard` nesting via chained early-returns is a bit deep (flagged at depth 5); consider a small early-return-per-branch refactor for readability, though it's not harmful as written.
  • routeTree.gen.ts is a generated file with an `as any` cast (line 212) consistent with the rest of that file's existing generated pattern, so no action needed beyond confirming it wasn't hand-edited.
  • The CI failure on 'Workers Builds: loopover-ui' has no detail provided; given the branch is 2 commits behind main, this is most likely resolved by rebasing rather than a defect in this diff.
  • Consider extracting the repeated `text-token-sm font-medium` card-header pattern across LedgerCard/AccuracyCard/AnchorCard into a shared subcomponent to reduce duplication (nit-level, not required for merge).
  • 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

  • Workers Builds: loopover-ui — Workers Builds: loopover-ui

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 #9569
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: 9 registered-repo PR(s), 8 merged, 272 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 9 PR(s), 272 issue(s).
Improvement ✅ Minor risk: clean · value: minor
Linked issue satisfaction

Partially addressed
The PR adds the /proof/:owner/:repo page consuming the existing public proof endpoint, correctly implementing the boundary-state handling (broken/neutral/opted-out), sample records with digests, and anchor status, satisfying most of requirement 1 and the 'one implementation, two renderings' principle. However, requirement 2 (README badge SVG endpoint) is described as already shipped on main in the

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: 9 PR(s), 272 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: a9b9afade38815900c1408793f1f877ca8e2f498925fb1a08836c3cee5325017 · pack: oss-anti-slop · ci: failed
  • record: 06a49d6c0babf80b1fa064176151ca8f1d6cf18159ca0a93c21628ac1c8b06c1 (schema v6, head fa8be68)
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

@superagent-security

Copy link
Copy Markdown
Contributor

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

@codecov

codecov Bot commented Jul 31, 2026

Copy link
Copy Markdown

Bundle Report

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

Detailed changes
Bundle name Size Change
loopover-ui 7.94MB 8.09kB (0.1%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-BQnKAA_M.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-Ba12Nhtk.js (New) 956.69kB 956.69kB 100.0% 🚀
assets/docs.fumadocs-spike-api-reference-CYtIQC_k.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-XzHt9NhM.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-DnTMM0Y5.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-AWrdiulp.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/styles-BsezzObU.css (New) 130.37kB 130.37kB 100.0% 🚀
assets/maintainer-panel-CwVzT84r.js (New) 78.97kB 78.97kB 100.0% 🚀
assets/routes-D30VH8AL.js (New) 35.88kB 35.88kB 100.0% 🚀
assets/owner-panel-DIRAokrY.js (New) 28.26kB 28.26kB 100.0% 🚀
assets/app-BTjZG3_3.js (New) 25.82kB 25.82kB 100.0% 🚀
assets/ui-vendor-Cv8vZ-EA.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/fairness-Cb4t5Fu6.js (New) 23.13kB 23.13kB 100.0% 🚀
assets/miner-panel-BwS_fQVA.js (New) 20.49kB 20.49kB 100.0% 🚀
assets/api._op-DDJhPWGY.js (New) 17.51kB 17.51kB 100.0% 🚀
assets/self-hosting-docs-audit-CeM_Vclb.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs-client-loader-CO2gJZNO.js (New) 15.68kB 15.68kB 100.0% 🚀
assets/playground-panel-EJukdlNp.js (New) 14.35kB 14.35kB 100.0% 🚀
assets/app.audit-qIQpfb-H.js (New) 10.22kB 10.22kB 100.0% 🚀
assets/app.config-generator-de1tTLKg.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-JqdNzCNl.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-DnVzAf5I.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-Cnh14S-z.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/proof._owner._repo-Bu-PaBJR.js (New) 7.11kB 7.11kB 100.0% 🚀
assets/commands-panel-Dnr2WsQN.js (New) 6.74kB 6.74kB 100.0% 🚀
assets/maintainer-workflow-B-9nAphG.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/docs-nav-CYJmIGtp.js (New) 6.19kB 6.19kB 100.0% 🚀
assets/digest-panel-C1DJixsv.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-CLrQVGkU.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs.index-Cb1MB5PP.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/api.index-aU4XDl0Z.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-Tq6-Qis5.js (New) 3.01kB 3.01kB 100.0% 🚀
assets/api-D4NXhc-G.js (New) 2.66kB 2.66kB 100.0% 🚀
assets/docs-page-CqF8d79O.js (New) 2.14kB 2.14kB 100.0% 🚀
assets/table-FB1jGVCm.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-BdAZFujB.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-C3C7AaMh.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-BEuqNjTx.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-DEY8xK_g.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-DeSUnrkF.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/docs._slug-NlZdqBHw.js (New) 554 bytes 554 bytes 100.0% 🚀
assets/app.maintainer-Du7KFBOd.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-cUdgz-Pa.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-pRhnmwia.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-DF3kUfQT.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-Hm-B0YHj.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-Bq9F-uEm.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-C32-y6CH.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-DZayO9JG.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-DgORtV8h.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-CzjjbSgi.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/git-pull-request-arrow-DABXR__r.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-CLZhVYu-.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-TYGOm5rK.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-DBQ5jdF4.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-hzfSRxBk.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-CW_rfAwB.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/play-Di-XAPhC.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-D7JWvm_3.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/add-scalar-classes-Agp4PnUJ.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-BJdlk6BY.js (Deleted) -955.9kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-BE33n4Jh.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-CgoO_KJs.js (Deleted) -201.69kB 0 bytes -100.0% 🗑️
assets/modal-_ivjjvwx.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-BlKrC3_a.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/styles-CGmjney1.css (Deleted) -130.18kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BE2iIalK.js (Deleted) -78.97kB 0 bytes -100.0% 🗑️
assets/routes-CnLR3qPV.js (Deleted) -35.88kB 0 bytes -100.0% 🗑️
assets/owner-panel-Cn3KqB8D.js (Deleted) -28.26kB 0 bytes -100.0% 🗑️
assets/app-C2A8vTLy.js (Deleted) -25.82kB 0 bytes -100.0% 🗑️
assets/ui-vendor-w96SBcHA.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/fairness-Bs-CayAz.js (Deleted) -23.13kB 0 bytes -100.0% 🗑️
assets/miner-panel-D67Stna_.js (Deleted) -20.49kB 0 bytes -100.0% 🗑️
assets/api._op-BETb2p84.js (Deleted) -17.51kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-CNaaeUdo.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs-client-loader-qPrxiQgB.js (Deleted) -15.68kB 0 bytes -100.0% 🗑️
assets/playground-panel-Z1BYtlLp.js (Deleted) -14.35kB 0 bytes -100.0% 🗑️
assets/app.audit-nezhDBr7.js (Deleted) -10.22kB 0 bytes -100.0% 🗑️
assets/app.config-generator-BG83awav.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-6H-wlyG0.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-BGZq2l7q.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-BmkSwKWJ.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-BnK8jnIA.js (Deleted) -6.74kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-B2wD4Vmz.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/docs-nav-BWLOtDqk.js (Deleted) -6.19kB 0 bytes -100.0% 🗑️
assets/digest-panel-GGEfwo4n.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-DlImFGg6.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs.index-Cgv1d_rO.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/api.index-Cz9LHJw6.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-DCe-BajX.js (Deleted) -3.01kB 0 bytes -100.0% 🗑️
assets/api-Bj5jRgUm.js (Deleted) -2.66kB 0 bytes -100.0% 🗑️
assets/docs-page-CNDEcK0y.js (Deleted) -2.14kB 0 bytes -100.0% 🗑️
assets/table-HdOzM9xQ.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-B3J1j9jA.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-QVkpNixv.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-BeIxcO6R.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-CWhOog1Q.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-CLSULDCp.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/docs._slug-kevm-WAF.js (Deleted) -549 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-DdMYDIKj.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-Cu7oDiaC.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-CQ1h3Jto.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-CCeK3i46.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-DZOv4gJh.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-Z3qZCpmB.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-BN7zCiO5.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-CkXxIeaF.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-CX0Z49l8.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-De51JD--.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-CnYqSBjW.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-IQ2sjwSe.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-yeaUO1Fc.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-DmA3GmTv.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-DL9vyEI_.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-BLO3IlzU.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/play-7pQZxrXw.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-BKMcgzwq.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 31, 2026
@JSONbored

Copy link
Copy Markdown
Owner Author

On the red Workers Builds: loopover-ui — investigated, and it is not this PR.

It is Cloudflare-side, not GitHub Actions. The GitHub-side Build UI preview artifact job passes on this PR; the failing check comes from the cloudflare-workers-and-pages app.

Three things point away from our code:

  1. It never ran. The check-run reports started_at and completed_at at the same second — a 0-second failure, with no log surfaced anywhere outside the Cloudflare dashboard.
  2. The exact build command succeeds locally. I ran what Cloudflare runs — npm run build:cloudflare, which is npm --prefix ../.. ci && npm --prefix ../.. run ui:build — on this branch, from a clean install. Exit 0.
  3. It is intermittent on main itself, with no code pattern: 5ee37c48b succeeded, d1f770670 failed, 364f5ba4a failed then succeeded. d1f770670 is feat(status): publish per-component service status from the existing alerting stack #9984, which merged with this same check red.

So it is non-blocking and not caused by this change.

Worth a look when you have dashboard access, though. This is a dashboard-configured GitHub integration, independent of the repo's workflows — and it targets production (/workers/services/view/loopover-ui/production/builds/...) while running on pull-request branches. The repo's own ui-deploy.yml is deliberately workflow_dispatch-only, so there is a second, repo-invisible deploy path here. I cannot diagnose or reconfigure it: the Cloudflare MCP server is unauthorized in this session, and the build logs live only behind that dashboard.

@JSONbored
JSONbored merged commit b73347a into main Jul 31, 2026
9 of 10 checks passed
@JSONbored
JSONbored deleted the site/public-proof-page-9569 branch July 31, 2026 05:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Public proof page /proof/:owner/:repo + README badge — the shareable verification surface

1 participant