Skip to content

docs(openapi): publish the anchor-attempts request body, and stop the pattern from shipping a regex flag - #9778

Merged
JSONbored merged 1 commit into
mainfrom
feat/anchor-attempts-request-schema
Jul 29, 2026
Merged

docs(openapi): publish the anchor-attempts request body, and stop the pattern from shipping a regex flag#9778
JSONbored merged 1 commit into
mainfrom
feat/anchor-attempts-request-schema

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

POST /v1/decision-ledger/anchor-attempts exists to be called by a submitter this repo deliberately does not shipledger-anchor-bittensor.ts's own header says so: "a small process on the operator's own node infrastructure … never in this repo". Its only reference is the OpenAPI document, which registered responses and no body at all, leaving the entire contract discoverable only by reading the TypeScript that rejects it.

Closes #9770

Where the schema lives, and why the validator stays

Beside parseBittensorAnchorReport, not in the spec file — the two are one contract described twice and must be edited together.

The validator remains the runtime authority. It is not replaced. Each of its arms returns a named rejection identifying the exact field it refused, which is what makes a submitter bug diagnosable from the 400 body alone; a generic zod issue list would be a downgrade for precisely the off-repo caller this endpoint is built for.

They're held together by a cross-check suite: 25 payloads through both, asserting they agree on accept/reject. Neither can drift without failing CI. It covers the cases most likely to diverge — status/backendRef and status/error coupling, the u16 netuid ceiling, non-integer seq, and blank-after-trim hotkey/error.

Two bugs that fell out of actually generating the document

1. The hash regexes carried an i flag. JSON Schema has no flags concept, so they serialized as:

"pattern": "^[0-9a-f]{64}$/i"

A generated client compiling that would require a literal /i suffix and reject every valid hash. Case-insensitivity is now spelled into the character class ([0-9a-fA-F]) — behaviourally identical for hex, safe to publish. The published patterns are now ^[0-9a-fA-F]{64}$ and ^0x[0-9a-fA-F]{64}$, and there's a cross-check case pinning that uppercase hashes still parse.

2. SpecEntry couldn't describe a body. It declared only params under request, even though registerRouteSpec already reads options.request?.body and RouteSpecOptions has carried body since #9705. The rendering path existed and was unreachable from this file. Widened to match the seam it feeds.

Validation

Check Result
Patch coverage on ledger-anchor-bittensor.ts 65 changed lines, 0 uncovered, 0 partial branches
ledger-anchor-bittensor + openapi-security-parity + define-route 58 tests green
typecheck · ui:openapi:check · contract:api-schemas:check · git diff --check clean

Verified against the regenerated artifact rather than assumed — required: ["signed","status"], status enum ["ok","failed"], netuid bounds 0–65535, and both hash patterns flag-free.

Scope

  • The PR title follows type(scope): short summary Conventional Commit format, for example fix(api): restore profile access checks.
  • This PR is focused and does not mix unrelated backend, UI, MCP, docs, dependency, and deploy changes.
  • This follows CONTRIBUTING.md and does not reintroduce GitHub Pages, VitePress, site/, or CNAME.
  • I linked a currently open issue this PR resolves (e.g. Closes #123) — a linked open issue is required for every contributor PR.

Safety

  • No secrets, wallet details, hotkeys, coldkeys, user PATs, private keys, raw trust scores, private rankings, or private maintainer evidence are exposed.
  • Public GitHub text stays sanitized, low-noise, and does not imply compensation guarantees or optimization tactics.
  • Auth, cookie, CORS, GitHub App, Cloudflare, or session changes include negative-path tests.
  • API/OpenAPI/MCP behavior is updated and tested where needed.
  • UI changes use live API data or real empty/error/loading states, not production mock/demo fallbacks.
  • Visible UI changes include a UI Evidence section below with JPG/JPEG or PNG screenshots arranged as organized, captioned, clickable thumbnails. SVG screenshots are not used as review evidence. Review-only screenshots or recordings are not committed to the repository.
  • Public docs/changelogs are updated where needed; changelogs are only edited for release-prep PRs.

No runtime behaviour changes beyond the regex widening, which accepts exactly the same inputs the i flag did. Auth is untouched: the route stays auth: "orb" (the LOOPOVER_LEDGER_ANCHOR_REPORT_TOKEN ingest bearer, which fails closed when unset), and openapi-security-parity still passes. The published schema describes a submitter's payload — a signed checkpoint, a status, and public on-chain coordinates. The hotkey field is documented explicitly as an ss58 account, a public on-chain identity and never key material, so nobody reads the field name and infers a secret belongs there. No UI output, hence no UI Evidence table.

Notes

The 422 rejection reasons #9770 also asked for (unknown_key, bad_signature, row_not_found, row_hash_mismatch) were already documented upstream, including the row_not_found note explaining it is by design when the receiver does not hold the ledger — the constraint recorded on #9719. Left as-is.

… pattern from shipping a regex flag

POST /v1/decision-ledger/anchor-attempts exists to be called by a submitter this
repo deliberately does not ship -- ledger-anchor-bittensor.ts's own header says
so: "a small process on the operator's own node infrastructure ... never in this
repo". Its only reference is the OpenAPI document, which registered responses
and no body at all, leaving the entire contract discoverable only by reading the
TypeScript that rejects it.

The schema lives beside parseBittensorAnchorReport rather than in the spec file,
because the two are one contract described twice and must be edited together.
The validator stays the runtime authority: each of its arms returns a NAMED
rejection identifying the exact field it refused, which is what makes a submitter
bug diagnosable from the 400 body alone, and a generic zod issue list would be a
downgrade for precisely the caller this endpoint is built for. A cross-check
suite runs 25 payloads through BOTH and asserts they agree on accept/reject, so
neither can drift without failing CI -- including the ones that matter most:
status/backendRef and status/error coupling, the u16 netuid ceiling, and blank
-after-trim hotkeys and errors.

Two fixes fell out of actually generating the document:

  - The hash regexes carried an `i` FLAG. JSON Schema has no flags concept, so
    they serialized as `^[0-9a-f]{64}$/i` -- a pattern requiring a literal "/i"
    suffix, which would reject every valid hash in any generated client.
    Case-insensitivity is now spelled into the character class, which is
    behaviourally identical for hex and safe to publish.
  - SpecEntry in internal-and-public-route-specs.ts declared only `params` under
    `request`, so an entry there could not describe its own body even though
    registerRouteSpec already knew how to render one (define-route.ts's
    RouteSpecOptions has carried `body` since #9705). Widened to match the seam
    it feeds.

Closes #9770
@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 08:35:52 UTC

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

✅ Suggested Action - Approve/Merge

  • safe to merge

Review summary
This PR replaces a `/i`-flagged regex (which JSON Schema can't express and which would have serialized as a literal `/i` suffix, rejecting all valid hashes) with an equivalent case-insensitive character class, and publishes the previously undocumented `anchor-attempts` request body as a zod schema wired through a widened `SpecEntry.request.body` type. The runtime validator (`parseBittensorAnchorReport`) is correctly left as the authority, and a 25-case cross-check test (`test/unit/ledger-anchor-bittensor.test.ts`) asserts the published zod schema and the runtime parser agree on accept/reject for the same payloads, including a case pinning uppercase-hash acceptance under the new pattern. The change is narrow, well-tested, and closes the linked issue (#9770) as described.

Nits — 6 non-blocking
  • The published OpenAPI/zod schema's top-level `required: ["signed","status"]` (and the corresponding JSON Schema `required` list) doesn't encode the conditional requirement that `backendRef` is required when `status:"ok"` and `error` when `status:"failed"` — that logic lives only in the zod `.refine()`, which zod-to-openapi doesn't project into a JSON Schema `if/then` or `oneOf`, so a generated client can still construct a body the endpoint will 400 on.
  • External brief flags several new numeric literals (40, 64, 512, 65535, etc.) in `ledger-anchor-bittensor.ts` as unexplained magic numbers, though each is already documented inline via adjacent field comments.
  • `apps/loopover-ui/public/openapi.json` is a large generated artifact; worth confirming it was produced by the documented generation step rather than hand-edited, though nothing in the diff suggests drift.
  • Consider whether the zod-to-openapi conversion supports emitting the refine as a JSON Schema conditional (e.g. via `oneOf` with two required-field branches) so the published contract fully matches the accept/reject behavior asserted by the cross-check test.
  • If a generated client is expected to consume this schema directly, note in the endpoint summary or description that `backendRef`/`error` requirement is conditional on `status`, since the JSON Schema alone won't express it.
  • 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 #9770
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 adds the requestBody schema derived from parseBittensorAnchorReport and wires up a cross-check test plus fixes the regex flag bug, directly addressing the core ask of publishing the request contract. However, it does not document the four named 422 rejection reasons (unknown_key, bad_signature, row_not_found, row_hash_mismatch) or add the explicit row_not_found note the issue specifically c

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 2 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: 072aa018a9db999b140486ad907c881f4239571d9dbc1b5b178a59ec3e35cdb7 · pack: oss-anti-slop · ci: passed
  • record: a91ab5fd41a13e6bd42cebb5305621ff324e857d85ba23e67c8cd5474c058fb3 (schema v5, head b9b9041)
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

@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 b9b9041 Commit Preview URL

Branch Preview URL
Jul 29 2026, 08:15 AM

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Bundle Report

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

Detailed changes
Bundle name Size Change
loopover-ui 7.87MB 5.27kB (0.07%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-DYYYDat1.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-P-bF364g.js (New) 923.46kB 923.46kB 100.0% 🚀
openapi.json 4.07kB 738.76kB 0.55%
assets/docs.fumadocs-spike-api-reference-2LNkhTNi.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-BfMpIvNN.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-CtW3eFA9.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-DetnyrEO.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/maintainer-panel-aqnu_rzp.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/routes-vXDK_gag.js (New) 35.96kB 35.96kB 100.0% 🚀
assets/owner-panel-BbjFeJXp.js (New) 27.97kB 27.97kB 100.0% 🚀
assets/app-xrsm73Wa.js (New) 25.78kB 25.78kB 100.0% 🚀
assets/ui-vendor-CCLcO5DY.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/miner-panel-C9PwtVIn.js (New) 20.24kB 20.24kB 100.0% 🚀
assets/app.runs-RcLOXsPz.js (New) 20.22kB 20.22kB 100.0% 🚀
assets/api._op-o9Dnr3Sx.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-CpAypZNS.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-BtuYF_Vs.js (New) 15.52kB 15.52kB 100.0% 🚀
assets/playground-panel-pfAmISPu.js (New) 14.42kB 14.42kB 100.0% 🚀
assets/fairness-U_pwrekt.js (New) 12.16kB 12.16kB 100.0% 🚀
assets/app.audit-CcHkR7zb.js (New) 10.08kB 10.08kB 100.0% 🚀
assets/app.config-generator-DtzVzg6-.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-Dbn7sR14.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-BocrQ0N1.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-DdVCr8QH.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-L1_9g4LO.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/maintainer-workflow-BRdWeg0d.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-BU2bagfE.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-BkB8Y0ub.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-CsQRxtZp.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/docs.index-DAF40MF1.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-3UXYO2WW.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-FQksKzYE.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-5ajYPMJt.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-D65b6G-m.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-D_3DesxO.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-BG_PfFuM.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-CifyxyQE.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-cZbvNejs.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-7lGkf0qo.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-Dnm9Fu1K.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-Durutj_-.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-Bi2_nTsC.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-BvZtRLvf.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-CpVnAThw.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-Cddklz8c.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-8dxFNZbU.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-BwTj32G_.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-XkmjztTD.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-B-8WeUR_.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-DB8VDg61.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-BBJ1WdW0.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-BWORjlem.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-C7UTV4z-.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-hdKcolGL.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-C3bNUIq_.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-Bs0XJprs.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-DiDoDU5a.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-ncpRK3By.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-DnPL0Osd.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-CyjzhZ6u.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-DHKBCFVb.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-D03sJVQv.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/add-scalar-classes-CURBXySL.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-C_TVxaA9.js (Deleted) -922.27kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-ByQEOLVM.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-DGurA78u.js (Deleted) -201.7kB 0 bytes -100.0% 🗑️
assets/modal-D9Kfy5Qu.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-dCikoPul.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-CUtWF2RC.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/routes-DE9g-uXj.js (Deleted) -35.96kB 0 bytes -100.0% 🗑️
assets/owner-panel-CahX6y_z.js (Deleted) -27.97kB 0 bytes -100.0% 🗑️
assets/app-duUYvOJJ.js (Deleted) -25.78kB 0 bytes -100.0% 🗑️
assets/ui-vendor-CMbWZ0G1.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-B5GzAfWI.js (Deleted) -20.24kB 0 bytes -100.0% 🗑️
assets/app.runs-BUiy8JRG.js (Deleted) -20.22kB 0 bytes -100.0% 🗑️
assets/api._op-BEm3cgIq.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-D9n5ouXv.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-B2J22McP.js (Deleted) -15.52kB 0 bytes -100.0% 🗑️
assets/playground-panel-BiEfcLM1.js (Deleted) -14.42kB 0 bytes -100.0% 🗑️
assets/fairness-CaMw_FRY.js (Deleted) -12.16kB 0 bytes -100.0% 🗑️
assets/app.audit-CeQnzt3u.js (Deleted) -10.08kB 0 bytes -100.0% 🗑️
assets/app.config-generator-CDc-Z_YP.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-QoZteGf-.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-DJfvvm7J.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-B9FcscYT.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-Drhzsu-_.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-D1I26v4-.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-DybRNdmH.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-DRnnXb1Q.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-B9XXQEr0.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/docs.index-rdwCij2Z.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-CPdFHm2F.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-DcDtXSlm.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-eyKLQPIB.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-Cl0pDd9J.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-Ba4JIPpS.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-BBiq0DeL.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-C9MM08QY.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-Dy5ucQcb.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-BV3-JPjD.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-DK4b8x2H.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-DiBlImtl.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-6bAEMVwL.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-XyIehAXz.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-CzFU3sjk.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-B0H2_xWN.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-CW7n-apw.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-C5Td8Cx-.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-fiIn2QZY.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-AzHW3phz.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-CR5EtpGq.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-DnW_uwsw.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-C4_rXFb6.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-Md2U_8OX.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-jo0AwWin.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-CvKbbaTJ.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-BAsi1uDT.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-BnjyhquM.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-C2OggXBJ.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-BSD83AYG.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-Biqy5YYv.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-D7Kuj2Xt.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-kR-1A4h2.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.48%. Comparing base (4935e84) to head (b9b9041).
⚠️ Report is 3 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9778      +/-   ##
==========================================
- Coverage   90.30%   89.48%   -0.82%     
==========================================
  Files         912      912              
  Lines      113554   113556       +2     
  Branches    26954    26954              
==========================================
- Hits       102543   101615     -928     
- Misses       9682    10851    +1169     
+ Partials     1329     1090     -239     
Flag Coverage Δ
backend 94.08% <100.00%> (-1.48%) ⬇️

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% <ø> (ø)
src/review/ledger-anchor-bittensor.ts 100.00% <100.00%> (ø)

... and 3 files 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.

@JSONbored
JSONbored merged commit 4fe7127 into main Jul 29, 2026
11 checks passed
@JSONbored
JSONbored deleted the feat/anchor-attempts-request-schema branch July 29, 2026 08:35
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.

anchors: POST /v1/decision-ledger/anchor-attempts publishes no request-body schema

1 participant