swactor/Cargo.toml
Zachery Aaron Shores-Chmielewski b8aff00dc1 enforce datastream telemetry-only invariant: ban frame types from control code
The datastream is metrics/logging only; control decisions must never branch
on a frame.  This was a recurring cultural problem with no structural
enforcement.  This change makes it a compile-time and CI-enforced fact.

datastream crate (lib.rs):
- Stop re-exporting Frame, DatastreamEvent, FrameDelivery at crate root.
   is now a compile error (E0425).  These types live
  only in datastream::frame::* and are documented as the observer surface.
- Safe identity types (ChannelId, StreamId, Position, Record, etc.) remain
  re-exported at root for producer-side callers.

orchestration/app.rs:
- Extracted all frame-touching code (CollectedDatastreamFrame,
  drain_datastream_connections, update_load_progress_from_frame,
  drain_frames, archive_collected_frame, pump, OrchDatastream,
  DashboardSupport) into two new observability modules:
  frame_collector.rs and orch_datastream.rs.
- The orchestrator now interacts through a FrameCollector whose
  drain/drain_with_progress methods take closures; it never names Frame,
  DatastreamEvent, or CollectedDatastreamFrame.
- StageLoadProgress (the one control-relevant signal previously scraped
  from frame payloads) is extracted inside FrameCollector and handed to
  the control loop as plain data.

xtask:
- New check-telemetry-isolation command scans control-plane modules
  (orchestration/, distribution/, data-plane/, provisioning/) for
  forbidden frame-type references and fails the build if any are found.

Verified: workspace builds (myelin + dashboard feature), datastream 29
tests pass, myelin 64 lib tests pass, check-telemetry-isolation passes
clean.

Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-08-12 16:14:57 +04:00

75 lines
2.1 KiB
TOML

[workspace]
members = [
".",
"crates/engine",
"crates/bindings/python",
"crates/bindings/wasm-runtime",
"crates/process",
"crates/provisioning",
"crates/transport",
"crates/distribution",
"crates/iroh-driver",
"crates/dashboard",
"apps/myelin",
"xtask",
"tools/vastai",
]
default-members = [
".",
"crates/engine",
"crates/process",
"crates/provisioning",
"crates/transport",
"crates/distribution",
"crates/dashboard",
"apps/myelin",
"tools/vastai",
]
# The language bindings (python, wasm) and xtask are built on demand
# (-p / --workspace / cargo-xtask), not during normal native iteration.
exclude = ["crates/bindings/wasm-crypto", "examples"]
[workspace.dependencies]
# Centralized so every member resolves tokio with the SAME feature set.
# Without this, members declared tokio with different features, so building
# one member vs another (or `run` vs `test`) recompiled tokio each time.
tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros", "process", "io-util", "sync", "time", "net", "signal"] }
[package]
name = "swactor"
version = "0.1.0"
edition = "2024"
license = "AGPL-3.0-only"
autobenches = false
[profile.bench]
debug = true
strip = false
[lib]
crate-type = ["rlib"]
[features]
default = ["getrandom", "std"]
std = [] # OTP patterns: supervisors, registries, timers, routers
getrandom = ["dep:getrandom"]
serde = ["dep:serde"]
tracing = ["dep:tracing"]
no_random = [] # compile without access to a source of randomness
transport = [
] # transport-agnostic messaging (no mandatory deps; codec is user-provided)
wasm = ["no_random", "dep:web-time"] # browser/wasm32 target support
[dependencies]
getrandom = { version = "0.2", optional = true }
serde = { version = "1", features = ["derive"], optional = true }
tracing = { version = "0.1", optional = true }
web-time = { version = "0.2", optional = true }
crossbeam-queue = "0.3.12"
crossbeam-utils = "0.8.21"
parking_lot = "0.12"
[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }
proptest = "1"
proptest-state-machine = "0.3"