Skip to content

fix(fairness): make the anchored ledger publicly verifiable, and stop misreporting an empty one - #9959

Merged
loopover-orb[bot] merged 2 commits into
mainfrom
fix/verifier-distinguishes-empty-ledger-9940
Jul 30, 2026
Merged

fix(fairness): make the anchored ledger publicly verifiable, and stop misreporting an empty one#9959
loopover-orb[bot] merged 2 commits into
mainfrom
fix/verifier-distinguishes-empty-ledger-9940

Conversation

@JSONbored

@JSONbored JSONbored commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Closes #9940.

What was wrong

The anchoring mechanism was never broken. edge-nl-01 signs its ledger and anchors to Rekor on schedule. The problem was topological: the deployment holding the anchored ledger was bound to 127.0.0.1, and the deployment the world can reach has an empty one.

api.loopover.ai (Worker) edge-nl-01 (Orb)
decision-ledger/verify totalCount: 0 totalCount: 2190+, ok: true
anchor-key unconfigured, 0 keys 6b6490126ad44b51
anchor-payload 404 signed checkpoint
decision record for a real PR not_found present

So /fairness, verify-this-review, and the verifier from #9723 all pointed at a surface that could not serve what they described.

Three fixes

1. The Orb's public surface is now reachable. Extended the existing Cloudflare Tunnel's ingress with a second path rule (^/v1/public/.*$localhost:8787) on the hostname it already serves. No new DNS, no new credentials, no inbound port.

Scoped deliberately — verified from the open internet that everything else stays sealed:

/v1/public/decision-ledger/verify   HTTP 200   tipSeq 2197
/v1/repos                           HTTP 404
/v1/admin/config                    HTTP 404
/v1/orb/ingest                      HTTP 404
/metrics                            HTTP 404

And the end-to-end proof, run from outside:

$ npx -p @loopover/mcp loopover-verify --base-url https://shots.loopover.ai
PASS  The current signed ledger checkpoint verifies offline against a published key
      checkpoint at seq 2197 verifies against published key "6b6490126ad44b51"

That is also the first time #9723's crypto path has verified a real production signature rather than a fixture.

2. The verifier no longer misattributes an empty ledger. Both states produced one sentence — "anchor signing not configured, or the ledger is empty" — and that ambiguity is what sent me looking for a missing secret on a deployment whose anchoring worked fine. It now reads the ledger's size and reports three distinct states: empty (nothing to anchor, and it names --base-url as the fix), records-present-but-unsigned (a real gap, with the count), and size-unknown.

3. The docs name both surfaces. /fairness methodology and the walkthrough now say which surface answers which question, and that a skipped ledger check against the aggregate is expected rather than a failure.

Validation

  • 34 verifier tests, 1 new covering all three states including that "records present" must not read as EMPTY.
  • docs:drift-check, typecheck, import-specifiers, dead-exports, checkers-wired, contract:api-schemas pass; ui:test 692 passing.
  • Tunnel config validated with cloudflared tunnel ingress validate before reload; previous config backed up on the box.

Not included

The corpus-commitment half of the original issue (a corpusChecksum published for ai_consensus_defect with no downloadable corpus) is a separate defect in #9805's omission logic and gets its own issue rather than being folded in here.

Refs #9940.

Both produced the same sentence -- 'anchor signing not configured, or the ledger
is empty' -- and the difference is the entire diagnosis. It sent me looking for a
missing secret on edge-nl-01, whose anchoring was working perfectly: the surface
the verifier defaults to simply holds no ledger, because decisions are recorded
on the ORB and only aggregate outcomes travel to the public API.

The check now reads the ledger's own size and reports three distinct states: an
empty ledger (nothing to anchor -- not a failure, and it names --base-url as the
fix), records present with nothing signed (a real gap), and an unreachable
ledger endpoint.

Verified end to end against production: api.loopover.ai reports the empty-ledger
skip, and the ORB's own surface PASSES -- checkpoint at seq 2190 verifies offline
against published key 6b6490126ad44b51, which is also the first proof this
verifier's crypto path works against a real signature.
@JSONbored JSONbored self-assigned this Jul 30, 2026
@loopover-orb

loopover-orb Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Tip

✅ LoopOver review result - approve/merge recommended

Review updated: 2026-07-30 22:02:58 UTC

5 files · 1 AI reviewer · no blockers · readiness 98/100 · CI green · clean

✅ Suggested Action - Approve/Merge

  • safe to merge

Review summary
This PR fixes a genuine diagnostic bug in the public verifier: `checkAnchorCheckpoint` previously produced the identical skip message for an empty ledger and for a misconfigured signer, and the fix correctly threads a new `/v1/public/decision-ledger/verify` fetch through `loopover-verify.ts` to distinguish the two cases with a `totalCount` check. The logic is sound (totalCount===0 vs >0 vs unknown are all handled and tested), the added test in `verify-public-claims.test.ts` exercises all three branches, and the docs updates correctly explain the two-surface split. Note that the diff only contains fix #2 (the message disambiguation) and #3 (docs); fix #1 from the PR description — extending the Cloudflare Tunnel ingress so the Orb's ledger becomes publicly reachable — is infrastructure config not visible in this diff and cannot be verified here.

Nits — 6 non-blocking
  • The PR description's headline claim (making the anchored ledger 'publicly verifiable' via a Cloudflare Tunnel ingress rule) is not represented anywhere in this diff, which only changes the CLI's diagnostic wording — worth confirming that change lives in a separate, already-merged or infra-only commit.
  • packages/loopover-mcp/lib/verify-public-claims.ts: the block comment above the empty-ledger branch is quite long (6+ lines) relative to the repo's usual comment density; consider trimming to the load-bearing sentence.
  • bin/loopover-verify.ts now fires 5 parallel requests instead of 4 per run — negligible, but worth noting in case a future low-timeout environment starts hitting rate limits on `/v1/public/*`.
  • Consider asserting in the test that `ledgerOutcome.ok === false` (endpoint unreachable) is passed through as `undefined` end-to-end from `loopover-verify.ts`, not just unit-tested at the `checkAnchorCheckpoint` level.
  • In the docs (fairness-methodology.mdx / verify-this-review.mdx), it might help to show the JSON output of `--base-url https:​//shots.loopover.ai` once fix feat(docs): add install site and mcp diagnostics #1 is live, so readers see the EMPTY-vs-configured distinction in practice rather than only in prose.
  • 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.

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 #9940
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, 287 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 9 PR(s), 287 issue(s).
Improvement ✅ Minor risk: clean · value: minor · LLM: moderate
Linked issue satisfaction

Partially addressed
The PR makes real progress on the anchor-checkpoint half of the issue by exposing the Orb's ledger endpoint publicly and improving the verifier's diagnostic messaging, and documents that a --base-url flag is needed to reach it — but the default production run against api.loopover.ai still reports the anchor checkpoint as a (better-explained) SKIP rather than a PASS. The corpusChecksum/corpus-downl

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), 287 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.

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

superagent-security Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

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

The public API's ledger is empty by design -- it aggregates outcomes Orbs report
rather than holding their chains -- so /fairness and the walkthrough were sending
readers to a surface that structurally could not answer the ledger question.

Both pages now name the two surfaces and what each answers, and say plainly that
a skipped ledger check against the aggregate is expected rather than a failure.
@JSONbored JSONbored changed the title fix(verify): tell an empty ledger apart from a missing signing key fix(fairness): make the anchored ledger publicly verifiable, and stop misreporting an empty one Jul 30, 2026
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 30, 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 1f2d483 Commit Preview URL

Branch Preview URL
Jul 30 2026, 09:42 PM

@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Bundle Report

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

Detailed changes
Bundle name Size Change
loopover-ui 7.9MB 6.83kB (0.09%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-CYom3w3q.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-w5vxsQP4.js (New) 955.23kB 955.23kB 100.0% 🚀
assets/docs.fumadocs-spike-api-reference-D7EUCV4I.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-T2Qmm9kP.js (New) 201.69kB 201.69kB 100.0% 🚀
assets/modal-BSMH6J7R.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-qx-5LRUT.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/maintainer-panel-CT9UuaKc.js (New) 78.97kB 78.97kB 100.0% 🚀
assets/verify-this-review-C8lVDPER.js (New) 65.28kB 65.28kB 100.0% 🚀
assets/fairness-methodology-D4HZ__bh.js (New) 38.95kB 38.95kB 100.0% 🚀
assets/routes-BtWTy0pa.js (New) 35.88kB 35.88kB 100.0% 🚀
assets/owner-panel-CYfNqz5n.js (New) 28.26kB 28.26kB 100.0% 🚀
assets/app-Dq4fNnte.js (New) 25.82kB 25.82kB 100.0% 🚀
assets/ui-vendor-MbrTNFX9.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/fairness-H6fr9hcq.js (New) 23.13kB 23.13kB 100.0% 🚀
assets/miner-panel-DeU_8W85.js (New) 20.49kB 20.49kB 100.0% 🚀
assets/api._op-EEQqS-Px.js (New) 17.51kB 17.51kB 100.0% 🚀
assets/self-hosting-docs-audit-Dcw-QCYe.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs-client-loader-CRsYl3qP.js (New) 15.51kB 15.51kB 100.0% 🚀
assets/playground-panel-DXtbGuXD.js (New) 14.35kB 14.35kB 100.0% 🚀
assets/app.audit-DhIA0DRr.js (New) 10.22kB 10.22kB 100.0% 🚀
assets/app.config-generator-ChDLebcq.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-m9gV7eOg.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-DkT4rHt2.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-Btq81viS.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-DVnEmHK7.js (New) 6.74kB 6.74kB 100.0% 🚀
assets/maintainer-workflow-DVM3zIu5.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-D2Cwct7E.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-ChSgabjx.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-Bi2M1dHY.js (New) 6.12kB 6.12kB 100.0% 🚀
assets/docs.index-BTG2MhXd.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/api.index-CfV0kyfX.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-DQFUkKgg.js (New) 3.01kB 3.01kB 100.0% 🚀
assets/api-DcVgXTFW.js (New) 2.66kB 2.66kB 100.0% 🚀
assets/docs-page-BAilB5WE.js (New) 2.14kB 2.14kB 100.0% 🚀
assets/table-DG_cdsh2.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-C9ahjsPi.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-DbW4kfYc.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-DTeeGO7T.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-CpqBMtqY.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-B4vaCiIY.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/docs._slug-Cm8LvtDB.js (New) 549 bytes 549 bytes 100.0% 🚀
assets/app.maintainer-BpbyRVlj.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-Dl9-RMhz.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-DJbNOkZd.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-MNnIeE9d.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-B5cOzSH-.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-Kq7HspUh.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-DevhCyu2.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-Ba1jWA40.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-CCqvYaJr.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-B6I3ZZk0.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/git-pull-request-arrow-C_INhHYw.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-B41aQ-dr.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-BxzuzWi3.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-CJrjoBMn.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-BTATW6mz.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-Bsa72u6k.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/play-C5oW6EmF.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-d6XdFzJ0.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/add-scalar-classes-Cf3Nn6w3.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-CArzhjLP.js (Deleted) -955.23kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-Be8AWFqf.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-i7eu_zSl.js (Deleted) -201.69kB 0 bytes -100.0% 🗑️
assets/modal-DxObGOeQ.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-CHpvhBzS.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BitOO5AK.js (Deleted) -78.97kB 0 bytes -100.0% 🗑️
assets/verify-this-review-DXotzUZh.js (Deleted) -61.77kB 0 bytes -100.0% 🗑️
assets/routes-Dm_KJKg0.js (Deleted) -35.88kB 0 bytes -100.0% 🗑️
assets/fairness-methodology-B2-axDCa.js (Deleted) -35.63kB 0 bytes -100.0% 🗑️
assets/owner-panel-xTdm1oxd.js (Deleted) -28.26kB 0 bytes -100.0% 🗑️
assets/app-CzQiyE11.js (Deleted) -25.82kB 0 bytes -100.0% 🗑️
assets/ui-vendor-CopOe5Wm.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/fairness-Dz5JNgdL.js (Deleted) -23.13kB 0 bytes -100.0% 🗑️
assets/miner-panel-kBqAuSBh.js (Deleted) -20.49kB 0 bytes -100.0% 🗑️
assets/api._op-BPYGt70c.js (Deleted) -17.51kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-BSCKW7_b.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs-client-loader-BWG28Ey1.js (Deleted) -15.51kB 0 bytes -100.0% 🗑️
assets/playground-panel-DXFnOyb1.js (Deleted) -14.35kB 0 bytes -100.0% 🗑️
assets/app.audit-CjrFcal4.js (Deleted) -10.22kB 0 bytes -100.0% 🗑️
assets/app.config-generator-BNCfh0SX.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-B9m6eBK4.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-DHZuQnUp.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-DMl_7rOa.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-gkRVSDbB.js (Deleted) -6.74kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-oRMyL0kw.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-isbmABv4.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-BVn025bU.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-BGT7NsFf.js (Deleted) -6.12kB 0 bytes -100.0% 🗑️
assets/docs.index-Cnv1ZkB9.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/api.index-BAm3MzNN.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-CCmQgG5I.js (Deleted) -3.01kB 0 bytes -100.0% 🗑️
assets/api-Cfxr3LTM.js (Deleted) -2.66kB 0 bytes -100.0% 🗑️
assets/docs-page-CNTFeRd6.js (Deleted) -2.14kB 0 bytes -100.0% 🗑️
assets/table-BSKrevt2.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-CJ8Jx7vz.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-CUPaw-wH.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-CzU5qUPb.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-Camc98xc.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-DMwhJ6Nw.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/docs._slug-DPOLwPoi.js (Deleted) -549 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-C1YxcfXb.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-BslY6Q5g.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-BoaA-NUX.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-B1zP7ODP.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-BN0xmUfP.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-Bo0fiVHZ.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-ESv1fUkZ.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-Dmw80Mx9.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-CIAIFC6e.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-COadFKWP.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-DTawd7rT.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-IGJiaKKs.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-DuACOrh5.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-D2CbX1zC.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-D4EOLc35.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-KJDdYeAS.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/play-GGEK4eeQ.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-DCdbT6qO.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️

@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.87%. Comparing base (648e68c) to head (1f2d483).
⚠️ Report is 3 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9959      +/-   ##
==========================================
- Coverage   91.88%   91.87%   -0.01%     
==========================================
  Files         928      928              
  Lines      113675   113679       +4     
  Branches    27412    27415       +3     
==========================================
  Hits       104445   104445              
  Misses       7931     7931              
- Partials     1299     1303       +4     
Flag Coverage Δ
backend 95.66% <100.00%> (-0.01%) ⬇️

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

Files with missing lines Coverage Δ
packages/loopover-mcp/bin/loopover-verify.ts 84.31% <100.00%> (ø)
packages/loopover-mcp/lib/verify-public-claims.ts 95.40% <100.00%> (+0.22%) ⬆️

... and 1 file with indirect coverage changes

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fairness: the anchored ledger lives on the ORB, which is not publicly reachable — the public API serves an empty one

1 participant