Skip to content

docs(rfc): propose repository migration for a smaller core - #4426

Open
drew wants to merge 9 commits into
mainfrom
docs/4425-repository-migration-rfc/drew
Open

drew wants to merge 9 commits into
mainfrom
docs/4425-repository-migration-rfc/drew

Conversation

@drew

@drew drew commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

Propose splitting OpenShell into a smaller core and focused repositories so new maintainers can own platforms, packaging, SDKs, and provider integrations. Keep RFC 0019 short and conversational for early discussion.

Related Issue

Closes #4425

Changes

  • Define the proposed repository responsibilities and ownership expectations.
  • Outline an incremental migration, risks, and alternatives.
  • Leave macOS isolation, microVM placement, host process assembly, and cross-repository compatibility as open questions.

Testing

  • Markdown lint passes (mise exec -- markdownlint-cli2 rfc/0019-repository-migration/README.md).
  • git diff --check passes.
  • Unit and E2E tests are not applicable to this RFC-only change.

Checklist

  • Follows Conventional Commits
  • Commits are signed off (DCO)
  • Architecture documentation updates are not applicable to this draft proposal.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
@copy-pr-bot

copy-pr-bot Bot commented Oct 12, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

Signed-off-by: Drew Newberry <anewberry@nvidia.com>
@SDAChess SDAChess mentioned this pull request Oct 13, 2026
2 of 37 tasks
Comment thread rfc/0019-repository-migration/README.md Outdated
| --- | --- |
| `openshell` | CLI, gateway, and supervisor builds for Linux, Windows, and macOS; Linux sandbox runtime with Linux, gVisor, Kata, and Firecracker support; prover; a compute driver that assembles these pieces as host processes. Publishes containers and binaries. |
| `openshell-desktop` | macOS isolation and container integration, Podman, Docker, and possibly microVM support. |
| `openshell-packages` | The one-line `install.sh` installation path and RPM, DEB, and Snap packages. |

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.

Simon pointed me here from #3510 (Fedora packaging), so a few notes from that work on where the packaging line might fall. Take these as ideas.

It might help to separate two kinds of packaging, because they couple to core very differently:

Oliver raised the lockstep concern on #4244: distro packaging needs build flags, dependencies and toolchain versions kept in sync with core. One way to keep a separate packages repo honest might be for core to document a small source-build contract (supported features, environment variables, minimum toolchain, expected outputs) and to run a cheap from-source smoke build in its own CI, so drift shows up in core before it reaches a packaging repo. That could also keep the option open of leaving the from-source recipes with core while openshell-packages owns publishing and installation.

@drew drew Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One way to keep a separate packages repo honest might be for core to document a small source-build contract (supported features, environment variables, minimum toolchain, expected outputs)

That makes sense to me. Are there other examples of projects doing this?

[...] and to run a cheap from-source smoke build in its own CI, so drift shows up in core before it reaches a packaging repo

Hopefully we could use the same build recipe for the core and the package repos, so core would always be the source of truth from a build recipe perspective.

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.

Some examples, and what a contract looked like for OpenShell.

Other projects write down what distro packagers need, usually as a section in their build docs. I checked three:

  • Zed has a "Notes for packaging Zed" section (docs/src/development/linux.md). It lists which crates to build, where each binary goes, the desktop file template, the environment variable that turns off auto-update, and points at script/bundle-linux as a complete example build.
  • Node.js has "Building to use shared dependencies at runtime" in BUILDING.md: configure options such as --shared-openssl for distributions that manage their own dependencies, and a note that the distribution must keep those libraries matching what the binary expects.
  • Neovim has "Build without 'bundled' dependencies" in BUILD.md, with USE_BUNDLED switches, and points packagers at the Debian package and Homebrew formula for the exact versions.

I only read the docs. I didn't check whether any of them also run a from-source build in CI, so I can't say how they keep the docs from drifting.

I agree about one recipe with core as the source of truth. For a Fedora build, I think it would be the cargo invocation and its inputs, not the whole spec, because Fedora builds offline from vendored sources and can't use prebuilt binaries. Building 0.1.6 for Fedora, these were the differences I carried:

A short contract in core would cover the same things: supported features, the environment variables the build honors, the minimum toolchain and the expected outputs. If the SQLite choice and the version stamp became a feature flag and an environment variable, the Fedora spec would need almost no patches. I can write that down in more detail if it would help the RFC.

Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
Comment thread rfc/0019-repository-migration/README.md Resolved
drew added 7 commits October 27, 2026 08:02
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
- Helm chart and its publication.
- Kubernetes operator.
- A compute driver that assembles these components as processes on the host.
On Linux, use `systemd-nspawn` for launch and isolation.

@ericcurtin ericcurtin Nov 4, 2026 •

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.

Keep in mind, docker/podman and systemd-nspawn have a lot of overlap.

docker/podman are generally more mature versions of systemd-nspawn, more engineering effort put in.

Not against adding it, but it's effectively scoping in a less mature version of docker/podman.

@rhuss

rhuss commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

The Go SDK is the first RFC 0019 move through the cutover: its history and a standalone module are in ai-openshell/sdk-go, and #5245 deprecated sdk/go in core and dropped its CI gate. The move isn't finished yet: the release automation is waiting for its GitHub App, and removing sdk/go from core comes after the next stable release. I collected the lessons so far and a per-phase checklist for the next moves in #5273.

Three of them relate to the implementation plan here:

  1. Retire in two core PRs. The first deprecates the old path and drops the CI gate; the second removes the code after a core release has shipped the deprecation and the new repository's automation is live. That's one concrete way to "validate the replacement before retiring its old paths".
  2. Enforce the freeze with a check. A freeze announced in comments doesn't stop merges. chore(sdk/go): deprecate the in-tree Go SDK and drop its CI gate #5245 added a required check that fails on changes to the moved directory, together with dropping the gate that forced those changes.
  3. Name at least two maintainers besides the person doing the move. The ai-openshell rulesets require last-push approval, so a team with only one other reviewer can't merge without an org admin.

On how the move runs: I drive it as spec-driven development with spec-kit and cc-spex, so there's a spec, a plan, and a phased task list, and every executed step goes into a migration log with its deviations from the plan. The discussion is long, but that's on purpose: it's meant to be fed to an agent planning the next move, so it walks around the traps we hit. At the end, the playbook becomes a migrate-repo agent skill that runs a migration as gated stages (intake, drain and freeze, import, port, automation, retire) with the history, verification, and porting scripts bundled, without needing spec-kit.

Feedback on the playbook is welcome in the discussion, so this thread can stay about the RFC.

This branch has not been deployed

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(rfc): propose repository migration for a smaller core

6 participants