Skip to content

Layering: frame core with no architect; frame-architect for the integration - #28

Merged
fts-forge[bot] merged 2 commits into
mainfrom
refactor/gh-5-core-architect-split
Nov 2, 2026
Merged

fts-forge[bot] merged 2 commits into
mainfrom
refactor/gh-5-core-architect-split

Conversation

@fts-forge

@fts-forge fts-forge Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Closes #5. Part of #2. Stacked on #27 (which is on #26); this PR's base is #27's branch.

What

The split follows the line the embedded-view design needs: architect defines the view contract, Frame implements it, and architect never depends on Frame.

frame (core) keeps the document and format, the Scene IR, the Vello renderer, the surface protocol, runtime and kit, motion, feed and theme.

  • The boundary. With every core feature on, its normal tree has no architect, vox, Dioxus, figcraft or crdt crate. just boundary checks this (scripts/check-core-boundary.sh) and runs as a CI step. I confirmed it fails on the pre-split tree.
  • SurfaceEngine is a plain trait. It has the same methods and none of the push streams.
  • LoroScene wraps a plain loro::LoroDoc (same loro 1.16 as crdt). crdt itself depends on architect, so it couldn't stay. A host on architect passes crdt_doc.loro().clone(), which is a reference clone, so both edit one document.
  • The demo catalog is frame::surface::demo::demo_catalog.
  • The runtime's Engine, Local, connect and send stay in core.

frame-architect (new crate) holds the architect integration.

  • #[architect::rpc] SurfaceEngine. It keeps the same name, so the vox wire names don't change. It is implemented for every core engine by a blanket impl, so an engine implements only the core trait plus SurfaceEngineStreamSource for its pushes.
  • memory::Memory: the mock engine.
  • remote feature: the vox client as a runtime Engine, plus connect_ws, connect_ws_stream, serve_ws, Telemetry, Incoming and PumpEnd.
  • library feature: surface libraries (proto, fs, link).
  • vox feature, on by default. The rpc macro gates its generated items on the calling crate's vox feature.

Breaks (pre-1.0).

  • frame drops these features: vox, rpc, remote, library, library-proto-vox, codec, surface-runtime-rpc and surface-runtime-vox.
  • Its default is now empty (it was vox).
  • Consumers move to frame-architect; Studio does so in Studio depends on Frame by tag; no Frame code left in Studio studio#373.
  • The tools now depend on frame-architect where they serve or connect to engines or use libraries.

Tests.

  • Two of the tests Studio cut (studio#203) come back where they now belong:
    • frame-architect/tests/remote.rs, the vox round trip over a real WebSocket, including the engine being killed;
    • frame/tests/loro_scene.rs, the Loro replica.
  • Core's own tests now turn on host-scene and nice-plug, so the workspace check compiles those paths. They had gone uncompiled, which is how Frame on architect v0.10.0 #27 missed the host-scene break; Frame on architect v0.10.0 #27 now carries that fix.

CI on hosted runners for PRs (second commit). The repo went public, and the THEBATTLESHIP pool's job gate refuses pull_request jobs from public repos, so every PR job failed at "Set up runner".

  • PR jobs now run on ubuntu-latest, with nix and rust-cache.
  • Pushes to main stay on the pool, with kache.
  • .github/actions/rust-env sets up either kind of runner.
  • No RUSTFLAGS anywhere.

Checks (local, nix develop .#ci, kache; per LOCAL-CHECKS.md)

Ran:

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • just boundary
  • cargo test --workspace, once, after the split: remote 3/3, loro_scene 10/10, frame 4 unit tests + 1 doctest
  • the core with embed, nice-plug and host-scene on, which is now part of the workspace check

Skipped:

  • I didn't rerun tests after the host-scene fix, which touches neither test.
  • No parity run: the renderer is unchanged here, and Frame on architect v0.10.0 #27 has the parity numbers.
  • No full CI set; main CI runs it after merge.

…ration

Splits along the line the embedded-view design needs (architect defines
the view contract and Frame implements it; architect never depends on
Frame):

- frame (core): document/format, the Scene IR, the Vello renderer, the
  surface protocol, runtime and kit, motion, feed, theme. No architect,
  vox, Dioxus, figcraft or crdt in its normal dependency tree, with every
  feature on (`just boundary`, a CI step). SurfaceEngine is a plain trait;
  LoroScene wraps a plain loro::LoroDoc (a host passes its CrdtDoc's
  loro().clone(), a reference clone); the demo catalog is
  surface::demo::demo_catalog; the runtime's Engine/Local/connect/send
  stay.
- frame-architect: the #[architect::rpc] SurfaceEngine (same name, so the
  same wire names), implemented for every core engine; the mock engine
  (memory::Memory); remote engines and the telemetry pump (feature
  remote, was frame's remote/surface-runtime-vox); surface libraries
  (feature library, was frame's library).
- frame loses the vox, rpc, remote, library, library-proto-vox, codec,
  surface-runtime-rpc and surface-runtime-vox features, and default is
  now empty (was vox). A break, pre-1.0: consumers move to frame-architect
  (Studio in FastTrackStudios/studio#373).
- The tools depend on frame-architect where they serve, connect or use
  libraries.
- Two of the tests Studio cut (studio#203) come back where they now
  belong: the vox round trip (frame-architect/tests/remote.rs) and the
  Loro replica (frame/tests/loro_scene.rs).
@fts-forge
fts-forge Bot force-pushed the refactor/gh-5-core-architect-split branch from 300936a to 8c541c7 Compare November 2, 2026 05:50
@fts-forge
fts-forge Bot changed the base branch from build/gh-4-architect-v0.10.0 to main November 2, 2026 05:50
The THEBATTLESHIP pool's job gate refuses pull_request jobs from public
repos, so every PR job failed at "Set up runner". PR jobs now run on
ubuntu-latest (nix installed, cargo home and target cached per job by
rust-cache); pushes to main stay on the pool with kache. The shared
setup is .github/actions/rust-env. Still no RUSTFLAGS anywhere.
@fts-forge
fts-forge Bot merged commit 19b2751 into main Nov 2, 2026
3 checks passed
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.

Layering: a frame core with no architect dependency; frame-architect for the integration

0 participants