Skip to content

fix(ledger): anchoring is a self-host capability — correct the docs and ship the missing keypair runbook (#9719) - #9761

Merged
JSONbored merged 1 commit into
mainfrom
fix/anchoring-is-self-host-9719
Jul 29, 2026
Merged

fix(ledger): anchoring is a self-host capability — correct the docs and ship the missing keypair runbook (#9719)#9761
JSONbored merged 1 commit into
mainfrom
fix/anchoring-is-self-host-9719

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

The diagnosis holds

#9719's topology analysis is correct, and I verified it against the code rather than taking it on faith: src/index.ts:61-75 acks and drops review-execution jobs on the hosted Worker, so api.loopover.ai never decides anything, its ledger is permanently empty, and runScheduledLedgerAnchor early-returns empty_ledger on every 2-minute tick — forever.

Decision on item 1: anchoring lives on self-host, and the docs now say so

The alternative — ingest decision records centrally so the hosted Worker has something to anchor — I rejected on the merits, not on effort. The central chain would be a re-chained aggregate of many instances' records. Anchoring it proves nothing about the per-instance chain a verifier actually cares about, and every real chain would still be unanchored. It would produce a more authoritative-looking artifact carrying a weaker guarantee: exactly the "looks verified, isn't" failure this whole epic exists to prevent.

The user-facing half of this was a genuine false claim. what-you-can-verify.mdx told verifiers to run:

curl -s "https://api.loopover.ai/v1/public/decision-ledger/anchors?limit=1"

as the anchor walkthrough — an endpoint that returns [] forever. In trust documentation that's the highest-severity kind of error. Every command now runs against $ORB, the instance that reviewed the PR, with the boundary and the reasoning stated inline where a reader hits it, plus what status tells them before they read the list.

Item 2 was simply missing

No file outside src/ and test/ mentioned LEDGER_ANCHOR at all. Both halves had to be hand-produced in exact encodings, with a keyId that is computeAnchorKeyId of the public half — guess any of it wrong and you got ledger_anchor_skipped_unconfigured and an empty list.

npm run ledger:anchor-keygen now emits both, deriving the id with the same function the runtime uses so the published key and the anchors referencing it cannot disagree.

The derivation is exported and returns values rather than only printing them, deliberately: a generator that emits a key the runtime refuses would reproduce the original failure while looking like a fix. Six tests run the generated values through the real parseAnchorPublicKeyscurrentAnchorKeysignLedgerAnchorPayloadverifyLedgerAnchorSignature path, including that the key is selectable as current (the specific early return that left anchors empty) and that a signature does not verify against a different run's key.

Plus the operator runbook that didn't exist: what to set, which half is secret, how to read the four status values, and the rotation rule — a retired key is closed with notAfter, never removed, because a verifier checking a two-year-old checkpoint needs the key it was signed with.

Item 3 was already done

publicAnchorStatus (#9755) already distinguishes anchored / pending / empty_ledger / unconfigured. I checked before duplicating it.

Verification

6 new tests; 49 passing across the anchor suites. tsc, docs-drift, import-specifiers, dead-source-files and command-reference all clean. The generator was run for real — its output is a valid P-256 keypair in the documented encodings.

Closes #9719

…nd ship the missing keypair runbook (#9719)

#9719 diagnosed the topology precisely and it holds: hosted review
execution is retired (src/index.ts:61-75 acks and drops review jobs), so
api.loopover.ai never decides anything, its ledger is permanently empty,
and `runScheduledLedgerAnchor` early-returns `empty_ledger` on every tick
forever. Verified against the code rather than taken on faith.

DECISION on the issue's item 1 -- anchoring lives on self-host, and the
docs say so. The alternative (ingest decision records centrally so the
hosted Worker has something to anchor) was rejected on the merits: the
central chain would be a re-chained AGGREGATE of many instances' records,
so anchoring it proves nothing about the per-instance chain a verifier
actually cares about, and every real chain would still be unanchored. It
would produce a MORE authoritative-looking artifact carrying a WEAKER
guarantee -- the exact "looks verified, isn't" failure this epic exists to
prevent.

The user-facing half of that was a genuine false claim: what-you-can-verify
told verifiers to `curl https://api.loopover.ai/v1/public/decision-ledger/
anchors`, an endpoint that returns `[]` forever, as THE anchor walkthrough.
Every command now runs against `$ORB` -- the instance that reviewed the PR
-- with the boundary and the reasoning stated where the reader hits it.

Item 2 was simply missing: no file outside src/ and test/ mentioned
LEDGER_ANCHOR at all, so both halves had to be hand-produced in exact
encodings, with a keyId that is computeAnchorKeyId of the public half.
`npm run ledger:anchor-keygen` now emits both, deriving the id with the
same function the runtime uses. The derivation is exported and returns
values rather than only printing, because a generator that emits a key the
runtime REFUSES would reproduce the original failure while looking like a
fix -- six tests run the generated values through the real
parse/select/sign/verify path, including that a signature does not verify
against a different run's key.

Plus the operator runbook that did not exist: what to set, which half is
secret, how to read the four `status` values, and the rotation rule that a
retired key is closed with notAfter and never removed.

Item 3 (make the silence visible) was already closed by #9755's
publicAnchorStatus -- checked before duplicating it.
@loopover-orb

loopover-orb Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Warning

⏸️ LoopOver review result - manual review recommended

Review updated: 2026-07-29 07:30:11 UTC

5 files · 1 AI reviewer · 1 blocker · CI green · clean

⏸️ Suggested Action - Manual Review

Review summary
This PR corrects the self-hosting docs to state that decision-ledger anchoring only runs on self-host instances (since hosted review execution is retired and `api.loopover.ai`'s ledger is permanently empty), rewrites the verification walkthrough to target `$ORB` instead of the hosted API, and adds a `ledger:anchor-keygen` script plus tests that exercise the generated keypair through the real parse/sign/verify runtime path. The keygen script correctly derives `keyId` via the same `computeAnchorKeyId` function the runtime uses, and the test suite verifies round-tripping rather than just checking output shape, which is the right way to guard against a generator that produces a key the runtime then rejects. The 'leaked secret' flags on the test file are false positives — those lines assert PEM formatting (`startsWith`/`endsWith`) on a freshly generated, ephemeral test key, not a committed credential.

Nits — 6 non-blocking
  • The 'console.log added' flags in `scripts/gen-ledger-anchor-keypair.ts:67-78` are expected here since this is an intentional CLI output tool, not debug leftovers to clean up.
  • `self-hosting-configuration.mdx` grows past the 400-line size-smell threshold, but this is a reference doc where that's expected; no action needed.
  • `scripts/gen-ledger-anchor-keypair.ts:22` hardcodes `64` for PEM line-wrap width — consider naming it (e.g. `PEM_LINE_WIDTH`) for readability, though it's a well-known PEM convention.
  • Consider adding a short note in the PEM-wrap helper (`toPem`) that 64 is the standard PEM line width, for readers unfamiliar with the convention.
  • The docs table for `LOOPOVER_LEDGER_ANCHOR_KEYS` correctly marks it safe to publish/commit — worth double-checking that no lint/secret-scanner in CI would flag this env var name as sensitive by pattern-matching '_KEY' generically.
  • 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.

Concerns raised — review before merging

  • Possible leaked secret in the diff (private_key_block): The PR diff matches secret pattern(s): private_key_block. Found at: test/unit/gen-ledger-anchor-keypair.test.ts:77. A committed credential must be rotated and removed from the change before merge. — Remove the secret from the diff, rotate the exposed credential, then re-run the gate.
📋 Copy for AI agents — paste into your coding agent
Fix the following blocker(s) from this PR review:

1. Possible leaked secret in the diff (private_key_block): The PR diff matches secret pattern(s): private_key_block. Found at: test/unit/gen-ledger-anchor-keypair.test.ts:77. A committed credential must be rotated and removed from the change before merge. — Remove the secret from the diff, rotate the exposed credential, then re-run the gate.

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

Partially addressed
The PR correctly resolves item 1 (documents anchoring as self-host-only, fixes the false api.loopover.ai walkthrough) and ships a genuinely tested keygen script for item 2, but item 3 — making 'unconfigured' visibly distinct from 'empty_ledger' on the public anchors endpoint — is only described in the docs (which now reference a `status` field with values like `unconfigured`/`empty_ledger`/`pendin

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is registered but has no active allocation in the current snapshot.
  • Public profile languages: not available
  • Official Gittensor activity: 14 PR(s), 370 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
  • Then work through the remaining 1 step 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: hold · clause: secret_leak
  • config: 2844e5f2a813510f2bda9bce04531c0f14061a171dabad3dfb315b1797d6618d · pack: oss-anti-slop · ci: passed
  • record: fe59c95808413f65d11a4040da6368434ce3ae3dd817854c5f3ae70d43aa872e (schema v5, head 5bea2bc)
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.

@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 Preview URL Updated (UTC)
✅ Deployment successful!
View logs
loopover-ui 5bea2bc Commit Preview URL

Branch Preview URL
Jul 29 2026, 07:07 AM

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Bundle Report

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

Detailed changes
Bundle name Size Change
loopover-ui 7.83MB 18.69kB (0.24%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-CAF6en3b.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-DFirKdtU.js (New) 915.66kB 915.66kB 100.0% 🚀
assets/docs.fumadocs-spike-api-reference-D6gQ1dwh.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-8LA70481.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-Bjkp3IZh.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-Dop89dtn.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/self-hosting-configuration-CZNNH3OE.js (New) 115.98kB 115.98kB 100.0% 🚀
assets/maintainer-panel-81tfrZ5t.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/what-you-can-verify-DRZe7pNw.js (New) 59.84kB 59.84kB 100.0% 🚀
assets/routes-DNhfKZTz.js (New) 35.96kB 35.96kB 100.0% 🚀
assets/owner-panel-DnT_907l.js (New) 27.97kB 27.97kB 100.0% 🚀
assets/app-Ckkp1NqG.js (New) 25.78kB 25.78kB 100.0% 🚀
assets/ui-vendor-BC12sDuQ.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/miner-panel-Ow-AYjs7.js (New) 20.24kB 20.24kB 100.0% 🚀
assets/app.runs-BOCmTaVf.js (New) 20.22kB 20.22kB 100.0% 🚀
assets/api._op-AKJz-M_4.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-CIursIxE.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-BZAl5VT6.js (New) 15.52kB 15.52kB 100.0% 🚀
assets/playground-panel-D1tpUoqs.js (New) 14.42kB 14.42kB 100.0% 🚀
assets/fairness-wvNF7vKH.js (New) 12.16kB 12.16kB 100.0% 🚀
assets/app.audit-BvM_up3z.js (New) 10.08kB 10.08kB 100.0% 🚀
assets/app.config-generator-UYNKSlHF.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-Ct2Cve2b.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-BufvFUCz.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-eGCXzj9p.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-C6RuRpTf.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/maintainer-workflow-Cde12kq6.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-HqulFqO-.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-CSyll5gE.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-BsSfZFS0.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/docs.index-D6oM5ARV.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-BDW40iM9.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-sm6kTJQv.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-PVY90rcO.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-D8Hp8R64.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-2mEZlxaj.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-lgpl3PmT.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-QUr1PaCy.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-CYuC_tq0.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-4sKivq-q.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-CBkPrVOn.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-9HdVWMYO.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-Qxue_gSn.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-ZuKs2XC1.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-BluueA-l.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-CYh3xe5d.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-BSiFOj5B.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-KefvBl8Z.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-C1ZfoLaH.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-Cg_2zDBO.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-C8qJujY6.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-CXerI48w.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-CYt2-PTG.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-ClNceBur.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-dBrOxrjo.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-DemR8J2v.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-DCsramQF.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-aeTsYSQ5.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-D4CusI29.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-BrSR8P8h.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-BB-bwnxY.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-Clp0QwaY.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-DK79rrTB.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/add-scalar-classes-BnTfhquB.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-DHteDKaR.js (Deleted) -915.66kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-BCtMoOWT.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-C2D1ztHn.js (Deleted) -201.7kB 0 bytes -100.0% 🗑️
assets/modal-Dagy12us.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-Dqmgi0ZO.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/self-hosting-configuration-UIRWop09.js (Deleted) -102.36kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-D04N3YlR.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/what-you-can-verify-O9XQoPIZ.js (Deleted) -54.77kB 0 bytes -100.0% 🗑️
assets/routes-Dx6-NJ6U.js (Deleted) -35.96kB 0 bytes -100.0% 🗑️
assets/owner-panel-5k4hfRjq.js (Deleted) -27.97kB 0 bytes -100.0% 🗑️
assets/app-CXlATF_7.js (Deleted) -25.78kB 0 bytes -100.0% 🗑️
assets/ui-vendor-dlIH5EhE.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-vVmTUJAo.js (Deleted) -20.24kB 0 bytes -100.0% 🗑️
assets/app.runs-DrMOlb_z.js (Deleted) -20.22kB 0 bytes -100.0% 🗑️
assets/api._op-1rTY5jD_.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-CFqjWuIs.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-DCWmFxrh.js (Deleted) -15.52kB 0 bytes -100.0% 🗑️
assets/playground-panel-BDqJmn4o.js (Deleted) -14.42kB 0 bytes -100.0% 🗑️
assets/fairness-CsHwagU3.js (Deleted) -12.16kB 0 bytes -100.0% 🗑️
assets/app.audit-DM1OMC1o.js (Deleted) -10.08kB 0 bytes -100.0% 🗑️
assets/app.config-generator-CjCxpxhV.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-BKF7bFXR.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-CfettF97.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-v8nshneK.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-vsrEAGog.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-Id77S-4b.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-BcgalAxr.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-C2hPbirN.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-BPBAlD5L.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/docs.index-dHO6Qf49.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-BhI8m3nj.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-BF5McryK.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-BERMPSBd.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-D6d-eixj.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-BibLd14d.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-fMjHsMok.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-CqVMGCaY.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-DPxZfUFA.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-DRGWS31B.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-BHM9OwT2.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-Hyj0DaBh.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-CeITeuix.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-D5BtXmgD.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-B0lCwogu.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-CCklUZzZ.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-Lf4qKaUG.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-D57JtDUm.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-B9LKRi3n.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-Dn81zMF1.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-BX3ZJRKk.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-7uwfgbui.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-B9ij8oLF.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-ctcXjQxB.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-C9ihUo4j.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-BsTQePc8.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-C1wcLLkH.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-DAHDL9NG.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-zkRDC2_3.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-CllLB8L3.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-DlyhiskF.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-z1JAdYiE.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-BZ71ot9M.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 90.28%. Comparing base (7ffb51e) to head (5bea2bc).
⚠️ Report is 2 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #9761   +/-   ##
=======================================
  Coverage   90.28%   90.28%           
=======================================
  Files         906      906           
  Lines      113349   113349           
  Branches    26890    26890           
=======================================
  Hits       102335   102335           
  Misses       9683     9683           
  Partials     1331     1331           
Flag Coverage Δ
backend 95.54% <ø> (ø)

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

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 29, 2026
@JSONbored
JSONbored merged commit 03909f6 into main Jul 29, 2026
11 checks passed
@JSONbored
JSONbored deleted the fix/anchoring-is-self-host-9719 branch July 29, 2026 07:30
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.

Provision the ledger-anchor keypair so self-host anchoring can actually run

1 participant