Skip to content

feat(selfhost): automate daily ORB beta releases from a version manifest - #4160

Merged
JSONbored merged 2 commits into
mainfrom
orb-release-automation
Jul 8, 2026
Merged

feat(selfhost): automate daily ORB beta releases from a version manifest#4160
JSONbored merged 2 commits into
mainfrom
orb-release-automation

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • Adds orb-manifest.json as the git-tracked source of truth for the self-host container image's target release version (mirrors packages/gittensory-mcp/package.json's role for MCP; ORB has no npm manifest of its own).
  • Adds scripts/orb-release-core.mjs (pure logic, deliberately independent of scripts/mcp-release-core.mjs) + scripts/check-orb-release-due.mjs (read-only CLI): decides whether a new beta snapshot is due by scanning commits since the last orb-v tag for image-relevant paths, and computes the next orb-vX.Y.Z-beta.N tag.
  • Adds .github/workflows/orb-beta-release.yml: runs the check daily (or on demand), and when due, tags + pushes the beta and dispatches release-selfhost.yml to build and publish it.
  • Two small, backward-compatible changes to release-selfhost.yml to support that dispatch: a create_github_release opt-in input (a GITHUB_TOKEN-authored tag push doesn't fire this workflow's own push trigger, so the new workflow dispatches it explicitly instead -- the same pattern publish-engine.yml/npm-publish.yml already use for the identical reason), and routing an actual beta version to a new no-required-reviewers release-beta GitHub Environment so the daily cut runs fully unattended. A stable or -rc.N version still routes to the existing human-gated release environment -- promoting a beta to a stable release stays a manual, deliberate git tag.

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 -- no open issue matches this specifically (checked #1953/#1819, both are broader review-quality/hardening roadmaps, not release engineering); maintainer PR, so no issue was opened solely to satisfy this box.

Validation

  • git diff --check
  • npm run actionlint
  • npm run typecheck
  • npm run test:coverage locally -- new logic lives under scripts/ (not src/**), so it isn't Codecov-measured, but test/unit/orb-release.test.ts covers every branch (commit-relevance filtering, semver/tag helpers including malformed-input edge cases, and the full buildOrbReleaseReport decision table) anyway.
  • npm run test:workers
  • npm run build:mcp
  • npm run test:mcp-pack
  • npm run ui:openapi:check
  • npm run ui:lint
  • npm run ui:typecheck
  • npm run ui:build
  • npm audit --audit-level=moderate
  • New or changed behavior has unit/integration tests for new branches, fallback paths, and sanitizer boundaries

All of the above ran via a single full npm run test:ci (green) plus npm audit --audit-level=moderate (0 vulnerabilities) locally before pushing. Also verified with actionlint directly and a manual YAML parse on both touched workflow files, and manually exercised the new CLI (node scripts/check-orb-release-due.mjs --json) and both embedded Node heredoc steps against this repo's real current tag/commit state.

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. (N/A -- no such changes.)
  • API/OpenAPI/MCP behavior is updated and tested where needed. (N/A -- no API/OpenAPI/MCP surface touched.)
  • UI changes use live API data or real empty/error/loading states, not production mock/demo fallbacks. (N/A -- no UI changes.)
  • Visible UI changes include a UI Evidence section below. (N/A -- no visible UI changes; table left blank intentionally.)
  • Public docs/changelogs are updated where needed; changelogs are only edited for release-prep PRs. (N/A -- no changelog edit.)

UI Evidence

N/A -- no UI/frontend/docs changes in this PR.

Notes

  • New GitHub Environment release-beta (no required reviewers) was created under repo Settings so the daily beta dispatch can run unattended, distinct from the existing release environment which still gates every stable/rc release behind a human reviewer.
  • Deliberately does not touch anything under packages/gittensory-mcp/** or packages/gittensory-engine/**, or their release scripts/workflows -- that automation is out of scope here.

@superagent-security

Copy link
Copy Markdown
Contributor

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

@codecov

codecov Bot commented Jul 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.73%. Comparing base (8fe552b) to head (bffd402).
⚠️ Report is 2 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #4160   +/-   ##
=======================================
  Coverage   93.73%   93.73%           
=======================================
  Files         387      387           
  Lines       36304    36304           
  Branches    13298    13298           
=======================================
  Hits        34031    34031           
  Misses       1617     1617           
  Partials      656      656           
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 8, 2026
@loopover-orb

loopover-orb Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Warning

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

⏸️ Gittensory review result - manual review recommended

Review updated: 2026-07-08 09:17:46 UTC

7 files · 2 blockers · readiness 93/100 · CI green · clean

⏸️ Suggested Action - Manual Review

  • No linked issue detected — If this PR is intended to solve an issue, link it explicitly in the PR body.
  • Maintainer requires a linked issue — Link the relevant issue (for example Closes #123) before opening the PR.

Concerns raised — review before merging

  • No linked issue detected — If this PR is intended to solve an issue, link it explicitly in the PR body.
  • Maintainer requires a linked issue — Link the relevant issue (for example Closes #123) before opening the PR.
Signal Result Evidence
Code review ❌ 2 blockers No AI review summary
Linked issue ⚠️ Missing No linked issue or no-issue rationale found.
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 (no linked issue context).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 52 registered-repo PR(s), 43 merged, 486 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 52 PR(s), 486 issue(s).
Gate result ❌ Blocking Repo-configured hard blocker found.
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, JavaScript, Ruby, Go, Kotlin, MDX, Shell
  • Official Gittensor activity: 52 PR(s), 486 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Treat this as maintainer-lane context rather than normal contributor-lane activity.
  • Explain no-issue PR.
  • Link the issue being solved, or explicitly explain why this is a no-issue PR.
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.

🟩 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 Gittensory, a quiet PR intelligence layer for OSS maintainers.

  • Re-run Gittensory review

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 8, 2026
JSONbored added 2 commits July 8, 2026 02:01
Adds orb-manifest.json as the git-tracked source of truth for the
self-host container image's target release version -- mirrors how
packages/gittensory-mcp/package.json's version field works for MCP, since
ORB has no npm manifest of its own. scripts/orb-release-core.mjs decides
whether a new beta snapshot is due by scanning commits since the last
orb-v tag for image-relevant paths (src/**, migrations/**, Dockerfile,
the selfhost build/deploy scripts) and computing the next
orb-vX.Y.Z-beta.N tag; scripts/check-orb-release-due.mjs is the
read-only CLI wrapper. Deliberately independent of
scripts/mcp-release-core.mjs (no shared imports/state) so the two
release paths can never regress each other.

.github/workflows/orb-beta-release.yml runs this daily (or on demand via
workflow_dispatch), and when due, tags + pushes the new beta and
dispatches release-selfhost.yml to build and publish it. That dispatch
needed two small, backward-compatible changes to release-selfhost.yml:
a create_github_release opt-in input (a GITHUB_TOKEN-authored tag push
doesn't fire release-selfhost.yml's own push trigger, so this workflow
dispatches it explicitly instead, the same pattern publish-engine.yml /
npm-publish.yml already use for the identical reason), and routing an
actual beta version to a new no-required-reviewers release-beta
environment so the daily cut runs fully unattended -- a stable or rc
version still routes to the existing human-gated release environment.
Promoting a beta to a stable release stays a manual, deliberate git tag.
… tag

buildOrbReleaseReport's beta-number reset only checked that the latest
orb-v tag's major.minor.patch matched targetVersion, not that the tag
was itself a beta -- once a target version's stable tag is cut,
parseOrbBetaVersion returns betaNumber: null for it (a stable version
has no prerelease suffix at all), so the next due beta silently fell
through to beta.1, a tag that already exists from before the stable
promotion. anyTagIsBetaOfTargetVersion now requires betaNumber !== null,
and due itself goes false once a stable tag already matches
targetVersion (nothing to cut until a human moves the manifest's target
forward). orb-beta-release.yml's dispatch step now also gates on the
tag step having actually just created a tag, not only on due, as a
backstop against ever rebuilding an already-published image tag.
@JSONbored
JSONbored force-pushed the orb-release-automation branch from d7669fb to bffd402 Compare July 8, 2026 09:07
@JSONbored
JSONbored merged commit 59c6048 into main Jul 8, 2026
10 checks passed
@JSONbored
JSONbored deleted the orb-release-automation branch July 8, 2026 09:25
JSONbored added a commit that referenced this pull request Jul 11, 2026
…g Release PR (#5063)

The ORB (self-host container image) beta channel has been fully automated
since #4160, but promoting to a STABLE orb-vX.Y.Z release stayed a fully
manual git tag dance with no scheduled cadence -- the one release surface
in this repo not already brought up to release-please parity (MCP/engine
here, plus metagraphed's own release-please setup).

Adds a release-please-equivalent for ORB, hand-rolled because ORB's
image-relevant scoping is cross-cutting (src/** shared with UI/MCP-only
subtrees it must exclude) rather than a clean directory component the way
packages/gittensory-mcp and packages/gittensory-engine are:

- buildOrbStableReleaseReport (orb-release-core.mjs) infers the next
  stable version from conventional commits since the last stable orb-v
  tag, reusing the same image-relevant commit filtering the beta channel
  already uses.
- orb-stable-release-pr.yml runs on the same schedule as
  mcp-release-please.yml (plus workflow_dispatch) and keeps a standing
  release-orb-stable branch + PR in sync with that proposal -- nothing
  ships until a maintainer reviews and merges it.
- orb-stable-release-tag.yml fires on that PR's merge, tags orb-vX.Y.Z,
  and dispatches release-selfhost.yml exactly like the beta workflow
  does, landing on the human-gated `release` environment (not
  `release-beta`) for a second, independent approval.

The daily, fully-unattended beta channel is unchanged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. manual-review Gittensor contributor context

Development

Successfully merging this pull request may close these issues.

1 participant