Skip to content

ci(release): wire @loopover/contract into the release and publish automation - #9753

Merged
JSONbored merged 3 commits into
mainfrom
feat/publish-contract-package
Jul 29, 2026
Merged

ci(release): wire @loopover/contract into the release and publish automation#9753
JSONbored merged 3 commits into
mainfrom
feat/publish-contract-package

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

@loopover/contract is a runtime dependencies entry of both @loopover/mcp and @loopover/miner, but it had no publish path — no publish workflow, and no entry in release-please's config or manifest. It was the only workspace package shaped for publishing (no private: true, publishConfig.access: public, a files allowlist) with no automation behind it.

Left alone the next mcp/miner release ships uninstallable: both are at 3.15.2 locally against 3.14.x on npm, so the already-cut publish carries "@loopover/contract": "^0.1.0" against a package that did not exist.

0.1.0 has now been bootstrap-published by hand — npm's OIDC trusted publishing cannot create a brand-new package, the same bootstrap @loopover/engine needed — and a Trusted Publisher is configured against publish-contract.yml (GitHub Actions · JSONbored/loopover · environment release). Renaming that file breaks the connection and every publish with it, which is why the workflow header says so.

Closes #9749

What's here

publish-contract.yml mirrors publish-engine.yml / publish-ui-kit.yml: unprivileged validate resolves the version, verifies the commit is on main, resolves the release commit from the version string rather than tagging HEAD (#8525), builds, packs and smoke-tests; privileged publish tags and pushes the exact tested tarball via OIDC behind environment: release. No separate typecheck step — this package's build is tsc -p tsconfig.json.

The secret scan needed one deliberate change. Unlike its siblings, this package ships the redaction logic: dist/telemetry.js defines SECRET_VALUE_PATTERN, whose source text contains a literal PEM PRIVATE KEY header, plus a doc comment quoting a full one describing the bug that alternative fixes. The siblings' verbatim pattern is a guaranteed false positive on every release — verified against the real 0.1.0 tarball. So the scan excludes that one module, and a second, narrower token-shaped scan still runs across everything including the excluded module, so a genuine leak there still fails the build.

Prerequisite ordering. mcp/miner depend on contract exactly as they depend on engine, so the reconciliation job now treats both as prerequisites — contract and engine publish first, and mcp/miner are skipped entirely if either fails, rather than resolving a version that exists nowhere and failing ETARGET.

Versioning. Contract stays independently versioned (like ui-kit) rather than joining the engine-and-dependents linked-versions group. It has only just shipped 0.1.0; renumbering it into the 3.x train before it has consumers costs more than it buys. Worth revisiting at its next major.

LICENSE. The package declares AGPL-3.0-only but shipped no LICENSE file; engine, mcp and ui-kit all carry one. (miner is also missing one — out of scope here, but worth a follow-up.)

Validation

Everything below was run against the real 0.1.0 tarball built from this tree:

Check Result
npm run actionlint clean
npm run lint:composite-actions clean
npm run release-manifest:sync:check checked 5 package version(s), all in sync (was 4)
release-please-config.json / .release-please-manifest.json parse clean, contract tracked at 0.1.0
Both workflow files valid YAML
Tarball allowlist rule passes — only dist/ + package.json + README.md
Secret scan with the exclusion passes (verbatim sibling pattern fails, as expected)
Narrow token scan across all files passes
Install-from-tarball + import index / public-api / api-schemas passes, TOOL_CATEGORIES = 10
git diff --check clean

The reconciliation ordering was also behaviorally tested against five scenarios with stubbed dispatch helpers — nothing-to-do, contract+mcp happy path, contract-fails, engine-fails-contract-ok, and mcp-only-with-deps-already-live. The load-bearing case is engine failing while contract succeeded: mcp/miner are still skipped, because both are prerequisites.

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/src code changes and no UI output, hence no coverage obligation and no UI Evidence table. The privileged publish job holds id-token: write but never runs npm install or a build — it only downloads and publishes the tarball the unprivileged job already produced and tested, preserving the same privilege separation as every sibling publish workflow. No credential value appears anywhere in the diff.

…omation

@loopover/contract is a runtime `dependencies` entry of both @loopover/mcp and
@loopover/miner, but it had no publish path — no publish workflow, and no entry
in release-please's config or manifest. It was the only workspace package shaped
for publishing (no `private: true`, `publishConfig.access: public`, a `files`
allowlist) with no automation behind it.

Left alone, the next mcp/miner release ships uninstallable: both are at 3.15.2
locally against 3.14.x on npm, so the pending publish already carries
`"@loopover/contract": "^0.1.0"` against a package that did not exist.
0.1.0 has now been bootstrap-published by hand (npm's OIDC trusted publishing
cannot create a brand-new package, the same bootstrap @loopover/engine needed),
and a Trusted Publisher is configured against publish-contract.yml — so renaming
that file breaks the connection and every publish with it.

publish-contract.yml mirrors publish-engine.yml/publish-ui-kit.yml: unprivileged
validate resolves the version, verifies the commit is on main, resolves the
release commit from the version string rather than tagging HEAD (#8525), builds,
packs, and smoke-tests; privileged publish tags and pushes the exact tested
tarball via OIDC behind environment `release`. No separate typecheck step —
this package's `build` IS `tsc -p tsconfig.json`.

The secret scan needed one deliberate change. Unlike its siblings, this package
SHIPS the redaction logic: dist/telemetry.js defines SECRET_VALUE_PATTERN, whose
source text contains a literal PEM `PRIVATE KEY` header (plus a doc comment
quoting a full one, describing the bug that alternative fixes). The siblings'
verbatim pattern is a guaranteed false positive on every release — verified
against the 0.1.0 tarball. Excluding that one module keeps the check meaningful
for the other 92 files, and a second, narrower scan still runs across everything
including the excluded module, so a real token-shaped leak there still fails.

mcp/miner depend on contract exactly as they depend on engine, so the
reconciliation job now treats both as prerequisites: contract and engine publish
first, and mcp/miner are skipped entirely if either fails, rather than resolving
a dependency version that exists nowhere and failing ETARGET.

Contract stays independently versioned (like ui-kit) rather than joining the
engine-and-dependents linked-versions group: it has only just shipped 0.1.0, and
renumbering it into the 3.x train before it has any consumers costs more than it
buys. Revisit at its next major.

Also adds the LICENSE file the package declares (AGPL-3.0-only) but never
shipped — engine, mcp and ui-kit all carry one.

Closes #9749
@JSONbored JSONbored self-assigned this Jul 29, 2026
@loopover-orb

loopover-orb Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Important

🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨

⏳ LoopOver is waiting…

LoopOver has seen this pull request and is waiting on CI checks to finish before reviewing it. This comment will update once the review runs.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed · 🟨 Waiting

@superagent-security

Copy link
Copy Markdown
Contributor

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

@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.27%. Comparing base (ef6d580) to head (86d36f2).
⚠️ Report is 8 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #9753   +/-   ##
=======================================
  Coverage   90.27%   90.27%           
=======================================
  Files         904      904           
  Lines      113178   113178           
  Branches    26840    26840           
=======================================
  Hits       102172   102172           
  Misses       9676     9676           
  Partials     1330     1330           
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
…t's independent cadence

Review catch on #9753: contract was left out of the "engine-and-dependents"
linked-versions group on the reasoning that it should version independently
"like ui-kit". That reasoning was wrong, and this repo has already paid for the
bug it reintroduces.

mcp-release-please.yml's own header is explicit about what the group is for:
mcp/miner carry a REAL runtime `dependencies` entry, so node-workspace bumps
their range the moment the prerequisite's version changes -- and under
separate-pull-requests: true that bump lands on the dependent's OWN branch,
leaving its package.json requiring a version that exists nowhere (not locally,
since the prerequisite's bump is on a different unmerged branch; not on npm,
since it hasn't published). `npm ci` then fails ETARGET. That was confirmed
live across several release cycles (#7086/#7087/#7107/#7108/#7119/#7120/#7121),
and node-workspace's own `merge` option was already tried and does NOT override
separate-pull-requests.

ui-kit is outside the group because it has NO dependency edge to anything here
-- not because independent versioning is the default. contract has exactly the
edge engine has, so it belongs in the group for exactly the same reason.
Membership tracks the dependency edge, not release cadence; the header now says
so, since "publish it like ui-kit" is the trap that produced this.

The reconciliation ordering added in this PR stays: the group fixes the
release-PR stage (ranges and versions land in one commit), reconciliation fixes
the publish stage (registry propagation and dispatch ordering). Engine needs
both today and contract needs both for the same reasons.

Cost of the fix, stated plainly: contract joins the group's version train
rather than staying at 0.1.0, so its next release will not be 0.2.0. That is a
worse version story than independence and a better correctness story, and
0.1.0 is already published either way.
@JSONbored

Copy link
Copy Markdown
Owner Author

Valid blocker — fixed in the latest push. You were right, and the repo's own documentation settles it against my original reasoning.

mcp-release-please.yml's header states three things that together make this unambiguous:

  1. The race is caused by a real runtime dependency edge combined with separate-pull-requests: true — node-workspace bumps the dependent's range onto the dependent's own branch, leaving its package.json requiring a version that exists neither locally (the prerequisite's bump is on a different unmerged branch) nor on npm (it hasn't published). npm ci then fails ETARGET.
  2. node-workspace's own merge option does not override separate-pull-requests — already tried, and verified against release-please's manifest.ts and docs/manifest-releaser.md. So linked-versions is the only mechanism.
  3. ui-kit is outside the group because it has no dependency edge to any other package here — not because independent versioning is a default.

My "independent like ui-kit" justification inverted that last point: ui-kit is independent precisely because it lacks the edge contract now has. And this was not hypothetical — the header cites it as confirmed live across several mcp/miner cycles (#7086/#7087/#7107/#7108/#7119/#7120/#7121).

So rather than confirm cross-group reconciliation works, I've added contract to the group. I also rewrote the header comment to say that membership tracks the dependency edge, not release cadence, and called out "publish it like ui-kit" as the wrong instinct for any future package something here depends on — since that framing is exactly what produced this gap.

The reconciliation ordering added in this PR stays as-is. The two mechanisms cover different stages: the group fixes the release-PR stage (prerequisite version and dependents' ranges land in one commit), reconciliation fixes the publish stage (dispatch ordering and registry propagation). Engine needs both today; contract needs both for the same reasons.

Cost, stated plainly: contract joins the group's version train rather than staying at 0.1.0, so its next release won't be 0.2.0. That's a worse version story and a better correctness story, and 0.1.0 is published either way. If you'd rather keep contract on true independent semver, the only clean way is removing the edge — bundling contract into mcp/miner and demoting it to a devDependency (option B on #9749) — which is a real change to both build pipelines, not a config tweak.

actionlint, lint:composite-actions, and release-manifest:sync:check (5 packages, all in sync) still pass.

…cy graph

Adding contract to the group fixed today's instance. It did not fix the class:
group membership is a function of the dependency graph, nothing enforced that,
and the last time an edge was added the config was not updated. #9521 made
@loopover/contract a runtime dependency of both @loopover/mcp and
@loopover/miner without touching linked-versions, and that sat unnoticed until
#9749 -- by which point the package was not even published, so the next
mcp/miner release would have shipped uninstallable.

check-release-linked-versions.ts derives the requirement instead of trusting
memory. It reads the real package.json edges between release-please-tracked
packages and fails when two are joined by a shipping dependency but not by a
linked-versions group -- the exact ETARGET race mcp-release-please.yml's header
documents, and which node-workspace's own `merge` option provably does not fix.

It also closes a second silent gap found while wiring this: sync-release-manifest
builds its work list from the MANIFEST's own keys (`if (!(workspacePath in
manifest)) continue`), so a package added to release-please-config.json but not
to the manifest is silently exempt from the staleness check that stops
release-please re-proposing an already-published version. Adding a package to one
file and not the other had no feedback at all; now it fails.

Deliberately scoped to dependencies/peerDependencies/optionalDependencies.
devDependencies are excluded because they never reach a consumer, and forcing two
packages into permanent version lockstep over a build-time-only edge costs more
than the failure it prevents -- which surfaces immediately in CI on the branch
that introduced it rather than in a published artifact. That tradeoff is written
down at the constant, so the next person hitting it can revisit deliberately.

ui-kit is the case that proves the check is not merely "group everything": it has
no dependency edge, stays ungrouped, and there is an invariant test asserting it
is never reported -- otherwise the check would drag unrelated packages into
lockstep, which is the opposite of the goal.

Verified both ways: removing contract from the group reproduces the #9521 gap and
exits 1 naming both offending edges; removing its manifest entry exits 1 naming
the consequence; the real config exits 0.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 29, 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 86d36f2 Commit Preview URL

Branch Preview URL
Jul 29 2026, 06:45 AM

@JSONbored

Copy link
Copy Markdown
Owner Author

Second push: the config fix alone closed today's instance but not the class, so I've added enforcement.

The actual problem is that linked-versions membership is a function of the dependency graph, and nothing checked that. #9521 made @loopover/contract a runtime dependency of both @loopover/mcp and @loopover/miner without touching the group, and it sat unnoticed until #9749 — by which point the package wasn't even published, so the next mcp/miner release would have shipped uninstallable. A config edit fixes that once; the next edge added silently reintroduces it.

scripts/check-release-linked-versions.ts derives the requirement from the real package.json edges between release-please-tracked packages and fails when two are joined by a shipping dependency but not by a linked-versions group. Wired into test:ci next to release-manifest:sync:check.

It also closes a second silent gap I hit while wiring this: sync-release-manifest.ts builds its work list from the manifest's own keys (if (!(workspacePath in manifest)) continue), so a package added to release-please-config.json but not to the manifest is silently exempt from the staleness check that stops release-please re-proposing an already-published version. Adding a package to one file and not the other had zero feedback.

Scope decision, written down at the constant: only dependencies/peerDependencies/optionalDependencies. devDependencies are excluded because they never reach a consumer, and forcing permanent version lockstep over a build-time-only edge costs more than the failure it prevents — which surfaces immediately in CI on the introducing branch rather than in a published artifact. There's a test pinning that exclusion so it can't drift by accident.

ui-kit is the case proving this isn't just "group everything": no dependency edge, stays ungrouped, and an invariant test asserts it is never reported. Otherwise the check would drag unrelated packages into lockstep, which is the opposite of the goal.

Verified both directions:

Config state Exit Output
contract removed from group (reproduces #9521) 1 names both mcp→contract and miner→contract edges
contract's manifest entry removed 1 names the package and the consequence
real config 0 5 tracked package(s), all dependency edges linked and manifest-tracked

15 unit tests, pure-core/thin-IO split mirroring sync-release-manifest.ts. The only uncovered lines are that file's default IO closures (readFileSync wrapper, process.exit) — the same untestable seam its sibling has. typecheck, actionlint, validate:no-hand-written-js, coverage-boltons:check, and both release checks all pass.

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Bundle Report

Changes will decrease total bundle size by 843 bytes (-0.01%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.8MB -843 bytes (-0.01%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-PZquozTL.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-HxNzpMSs.js (New) 913.59kB 913.59kB 100.0% 🚀
openapi.json -523 bytes 713.96kB -0.07%
assets/docs.fumadocs-spike-api-reference-UKimzZzg.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-CtED5kRz.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-Be-SY-yw.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-DLyp_qv9.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/maintainer-panel-CoWSWY4N.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/routes-OLYPcCrE.js (New) 35.96kB 35.96kB 100.0% 🚀
assets/owner-panel-Dfu6nug3.js (New) 27.92kB 27.92kB 100.0% 🚀
assets/app-bW4xP4ZO.js (New) 25.78kB 25.78kB 100.0% 🚀
assets/ui-vendor-CiqB10ma.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/miner-panel-BCOVc4f5.js (New) 20.24kB 20.24kB 100.0% 🚀
assets/app.runs-LpEtJUkM.js (New) 20.22kB 20.22kB 100.0% 🚀
assets/api._op-Co6m8dOe.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-BIHSnrTh.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-C_ibpxVV.js (New) 15.52kB 15.52kB 100.0% 🚀
assets/playground-panel-CVMdLceY.js (New) 14.42kB 14.42kB 100.0% 🚀
assets/fairness-xFlFaxuv.js (New) 10.73kB 10.73kB 100.0% 🚀
assets/app.audit-MF3JGuWY.js (New) 10.08kB 10.08kB 100.0% 🚀
assets/app.config-generator-ByPAGAbb.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-DpK1NPJG.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-e8Fj2Gn8.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-B3WcXx8T.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-DtvHDFSz.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/maintainer-workflow-YUSUlsOc.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-DYvzunjE.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-DF0YLjz0.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-CdnP3uu_.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/docs.index-DwVN_FQ9.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-DJtH8ur8.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-BmWFkYMw.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-DJBJ_Wf_.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-3dVdNIxZ.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-CG0g4XFX.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-vemsGZnI.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-BHiv0szm.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-DZTMmPS6.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-bBUWJzKj.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-B5cqtuqL.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-JyfBfkeb.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-7HfOquKq.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-AvtJiD8R.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-C_hwq5jA.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-CGzDzSOo.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-e3bbvEe7.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-J7jMOB-V.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-Cke8shDG.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-DqwPeVpB.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-Cj3mqfH-.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-NZjFpzNc.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-CeyCI8jW.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-Bnfamjzm.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-D5K51pp-.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-DlGYoqtD.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-CFXnlewx.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-CWoUOhaC.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-CWPnHPEo.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-DzBra1JP.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-yfdACFC0.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-IObLLVGd.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-DjnSjHd_.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/add-scalar-classes-Be7dtln8.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-CGSpsB5i.js (Deleted) -913.91kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-DTLtPPeF.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-iGEdSZeI.js (Deleted) -201.7kB 0 bytes -100.0% 🗑️
assets/modal-*.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-CVCtmw1n.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BjOTlahS.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/routes-DA54I6Le.js (Deleted) -35.96kB 0 bytes -100.0% 🗑️
assets/owner-panel-BxuMiuCn.js (Deleted) -27.92kB 0 bytes -100.0% 🗑️
assets/app-AU--k-vI.js (Deleted) -25.78kB 0 bytes -100.0% 🗑️
assets/ui-vendor-BQS1Zftn.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-CqM7MPS5.js (Deleted) -20.24kB 0 bytes -100.0% 🗑️
assets/app.runs-CeYgmORT.js (Deleted) -20.22kB 0 bytes -100.0% 🗑️
assets/api._op-BFQWfcn9.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-CvXT8jki.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-DgmQKj7f.js (Deleted) -15.52kB 0 bytes -100.0% 🗑️
assets/playground-panel-Dj7muM7P.js (Deleted) -14.42kB 0 bytes -100.0% 🗑️
assets/fairness-dmwQ4n4o.js (Deleted) -10.73kB 0 bytes -100.0% 🗑️
assets/app.audit-DpZEfpKc.js (Deleted) -10.08kB 0 bytes -100.0% 🗑️
assets/app.config-generator-BlMIdWhd.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-Dst5ojPo.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-Dzmljb2C.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-Dpk_gj0x.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-B8Gi4y1P.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-C0crBeos.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-BXuwCicO.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-CCza5CtT.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-tyQcMghf.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/docs.index-Cj6CZCAs.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-Be00UFYE.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-DI0mpBC2.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-De8cjXIF.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-DdqdagYF.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-CEn13uEB.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-CCXUmRT5.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-CsSviwlD.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-DAdwTweL.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-BqPvSDz1.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-DUOq-S_7.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-DNYF1pQP.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-CHOzQ_gj.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-ByWQs0vO.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-DNsmpRJM.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-Cz0cCEOv.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-BM904ls-.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-dAjfDE0F.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-rRCgHu8S.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-lxONSK7S.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-DPCo-rju.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-DZtAjewF.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-9KzIkFPF.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-x6aMbwhE.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-D_5FQ8RJ.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-Cf1utcRQ.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history--DHChrMH.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-ByGHetBo.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-DJ30kMKk.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-G_yqUkAE.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-BERm0GS4.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-CrXj_H86.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-Ssscojx0.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️

@JSONbored
JSONbored merged commit f5adbcd into main Jul 29, 2026
9 checks passed
@JSONbored
JSONbored deleted the feat/publish-contract-package branch July 29, 2026 07:06
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.

@loopover/contract is unpublished but is a runtime dependency of @loopover/mcp and @loopover/miner — the next release of either ships uninstallable

1 participant