arch: split circuitforge-core into MIT infrastructure layer + BSL 1.1 orchestration layer #24

Closed
opened 2026-04-04 18:08:41 -07:00 by pyr0ball · 1 comment
Owner

MIT / BSL 1.1 Split — Design Complete

Full spec: circuitforge-plans/circuitforge-core/superpowers/specs/2026-04-04-mit-bsl-split-design.md

Decisions

Package boundary:

  • circuitforge-core (MIT): db, config, affiliates, preferences, tiers, wizard, LLMRouter, TaskScheduler protocol + LocalScheduler
  • circuitforge-orch (BSL 1.1): CFOrchClient, coordinator FastAPI app, OrchestratedScheduler, auto-discovery probe engine

BSL cutoff: CFOrchClient is the first BSL symbol. Core never statically imports it.

Capability gate:

Tier Max GPUs Hosts Config
Free 2 1 Static env vars (GPU_0_*, GPU_1_*)
Paid unlimited 1 Auto-discovery (coordinator)
Premium unlimited unlimited Multi-host federation

Auto-discovery is BSL-gated — it is the coordinator magic behind the license.

LLMRouter stays MIT. Its lazy from circuitforge_orch.client import CFOrchClient only fires when CF_ORCH_URL is set — zero hard dependency at import time.

TaskScheduler: Protocol + LocalScheduler in MIT core. OrchestratedScheduler in orch.

Migration Steps

  1. Create circuitforge-orch repo (BSL 1.1, private)
  2. Move resources/coordinator/, resources/client.py into it
  3. Add OrchestratedScheduler to orch
  4. Add TaskScheduler protocol + LocalScheduler to core tasks/
  5. Update LLMRouter lazy import path
  6. Bump core to 0.8.0; add orch pyproject.toml with circuitforge-core>=0.8.0 dep
  7. Update consumers (peregrine, kiwi, snipe)

Status

Design complete. Implementation blocked until after current affiliates/preferences PR (#25) merges.

## MIT / BSL 1.1 Split — Design Complete Full spec: `circuitforge-plans/circuitforge-core/superpowers/specs/2026-04-04-mit-bsl-split-design.md` ### Decisions **Package boundary:** - `circuitforge-core` (MIT): db, config, affiliates, preferences, tiers, wizard, `LLMRouter`, `TaskScheduler` protocol + `LocalScheduler` - `circuitforge-orch` (BSL 1.1): `CFOrchClient`, coordinator FastAPI app, `OrchestratedScheduler`, auto-discovery probe engine **BSL cutoff:** `CFOrchClient` is the first BSL symbol. Core never statically imports it. **Capability gate:** | Tier | Max GPUs | Hosts | Config | |------|----------|-------|--------| | Free | 2 | 1 | Static env vars (`GPU_0_*`, `GPU_1_*`) | | Paid | unlimited | 1 | Auto-discovery (coordinator) | | Premium | unlimited | unlimited | Multi-host federation | **Auto-discovery is BSL-gated** — it is the coordinator magic behind the license. **`LLMRouter`** stays MIT. Its lazy `from circuitforge_orch.client import CFOrchClient` only fires when `CF_ORCH_URL` is set — zero hard dependency at import time. **`TaskScheduler`:** Protocol + `LocalScheduler` in MIT core. `OrchestratedScheduler` in orch. ### Migration Steps 1. Create `circuitforge-orch` repo (BSL 1.1, private) 2. Move `resources/coordinator/`, `resources/client.py` into it 3. Add `OrchestratedScheduler` to orch 4. Add `TaskScheduler` protocol + `LocalScheduler` to core `tasks/` 5. Update `LLMRouter` lazy import path 6. Bump core to 0.8.0; add orch `pyproject.toml` with `circuitforge-core>=0.8.0` dep 7. Update consumers (peregrine, kiwi, snipe) ### Status Design complete. Implementation blocked until after current affiliates/preferences PR (#25) merges.
Author
Owner

Implementation Complete

circuitforge-core v0.8.0 (MIT) and circuitforge-orch v0.1.0 (BSL 1.1) are live.

What shipped

  • circuitforge-orch repo created at Circuit-Forge/circuitforge-orch (private)
  • All of resources/ (coordinator, agent, inference, docuvision, profiles, client, models, cli) moved to orch
  • OrchestratedScheduler added to orch (coordinator-aware VRAM budgeting)
  • TaskScheduler Protocol + LocalScheduler (FIFO, no coordinator) added to core tasks/
  • LLMRouter lazy import updated: circuitforge_core.resources.clientcircuitforge_orch.client
  • circuitforge_core.resources deleted from core
  • 181 tests passing in core, 169 in orch
  • Consumers updated: snipe, kiwi, peregrine all green

Verification

  • from circuitforge_core.resources.client import CFOrchClientModuleNotFoundError
  • from circuitforge_orch.client import CFOrchClient → ok
  • from circuitforge_core.tasks.scheduler import LocalScheduler → ok
  • from circuitforge_orch.scheduler import OrchestratedScheduler → ok
  • import circuitforge_core.llm.router (no CF_ORCH_URL set) → ok
## Implementation Complete **circuitforge-core v0.8.0** (MIT) and **circuitforge-orch v0.1.0** (BSL 1.1) are live. ### What shipped - `circuitforge-orch` repo created at `Circuit-Forge/circuitforge-orch` (private) - All of `resources/` (coordinator, agent, inference, docuvision, profiles, client, models, cli) moved to orch - `OrchestratedScheduler` added to orch (coordinator-aware VRAM budgeting) - `TaskScheduler` Protocol + `LocalScheduler` (FIFO, no coordinator) added to core `tasks/` - `LLMRouter` lazy import updated: `circuitforge_core.resources.client` → `circuitforge_orch.client` - `circuitforge_core.resources` deleted from core - 181 tests passing in core, 169 in orch - Consumers updated: snipe, kiwi, peregrine all green ### Verification - `from circuitforge_core.resources.client import CFOrchClient` → `ModuleNotFoundError` ✅ - `from circuitforge_orch.client import CFOrchClient` → ok ✅ - `from circuitforge_core.tasks.scheduler import LocalScheduler` → ok ✅ - `from circuitforge_orch.scheduler import OrchestratedScheduler` → ok ✅ - `import circuitforge_core.llm.router` (no CF_ORCH_URL set) → ok ✅
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/circuitforge-core#24
No description provided.