No description
Find a file
Claude 5c42cad8da test: Cycle 40 — pre-filled memory, engine clone, i64 ops, 200-actor stress
- guest_start_function_modifies_alloc_region: host overwrites pre-filled 0xFF memory
- engine_clone_is_same_engine: cloned engine produces working actors
- handle_uses_i64_operations: i64 arithmetic with i32.wrap_i64
- two_hundred_actors_from_same_engine: 200 actors all process one message
- Updated history.md with Cycles 27-39

All 170 tests pass. No new bugs found.

Authored by Claude, lovingly guided by Zachery Aaron Shores-Chmielewski
2026-02-13 21:07:59 +07:00
benches major feature update 2026-02-13 07:11:24 +00:00
CLAUDE/notes test: Cycle 40 — pre-filled memory, engine clone, i64 ops, 200-actor stress 2026-02-13 21:07:59 +07:00
crates test: Cycle 40 — pre-filled memory, engine clone, i64 ops, 200-actor stress 2026-02-13 21:07:59 +07:00
docs feat: skeleton for in browser swactor engine (#35) 2026-02-13 13:27:34 +00:00
examples feat: transport protocol (#27) 2026-02-09 19:05:37 +00:00
fuzz major feature update 2026-02-13 07:11:24 +00:00
scripts feat: distribution simulation tests (#34) 2026-02-13 13:18:38 +00:00
src feat: skeleton for in browser swactor engine (#35) 2026-02-13 13:27:34 +00:00
tests distribution realization (#33) 2026-02-13 07:55:12 +00:00
tools feat: runtime dashboard and docs (#23) 2026-02-09 09:04:57 +00:00
.gitignore feat: distribution simulation tests (#34) 2026-02-13 13:18:38 +00:00
Cargo.lock test: Cycle 6 — bounded mailbox backpressure + alloc fuzzing property test 2026-02-13 21:07:59 +07:00
Cargo.toml feat: skeleton for in browser swactor engine (#35) 2026-02-13 13:27:34 +00:00
Dockerfile distribution realization (#33) 2026-02-13 07:55:12 +00:00
README.md distribution realization (#33) 2026-02-13 07:55:12 +00:00

swactor

Minimal actor runtime for Rust. Single-threaded or multi-threaded, with Python and WebAssembly bindings.

Quick Start

use swactor::actor::{ActorAddress, ActorInterface};
use swactor::runtime::{Ctx, Runtime, RuntimeConfig};

#[derive(Clone)]
struct Greet { name: String, reply_to: ActorAddress }

#[derive(Clone)]
struct Greeting(String);

struct Greeter;

impl ActorInterface for Greeter {
    type Incoming = Greet;
    type Response = Greeting;

    fn handle(&mut self, ctx: &Ctx, msg: Greet) {
        let _ = ctx.send(msg.reply_to, Greeting(format!("Hello, {}!", msg.name)));
    }
}

fn main() {
    let rt = Runtime::new(RuntimeConfig::default());
    let addr = rt.spawn(Greeter).unwrap();
    let inbox = rt.new_inbox::<Greeting>().unwrap();

    rt.send_to(addr, Greet { name: "world".into(), reply_to: *inbox.addr() }).unwrap();
    rt.tick();
    rt.tick();

    println!("{}", inbox.try_recv().unwrap().0); // "Hello, world!"
}

Features

Actor Model

Actors implement one trait (ActorInterface), receive one message type, and hold mutable state. No lifecycle hooks, no supervision trees, no async.

Every actor gets a 32-byte globally unique ActorAddress. The same ctx.send(addr, msg) call works whether the target is on the same worker, a different worker thread, an external inbox, or a remote process.

Single-threaded mode (rt.tick()) gives deterministic frame-level control. Multi-threaded mode (rt.run()) spawns OS threads with adaptive backoff.

See docs/runtime/actor-model.md and docs/runtime/runtime.md for the full model.

Transport

Pluggable cross-process messaging. User-provided codecs handle serialization (gRPC/protobuf, bincode, hand-rolled — no serde bounds imposed) and user-provided transports handle delivery (TCP, in-memory, gRPC channel).

cargo build --features transport
cargo run --example tcp_ping_pong --features transport -- receiver  # terminal 1
cargo run --example tcp_ping_pong --features transport -- sender    # terminal 2

See docs/distribution/transport.md for the routing chain, codec registry, and address resolution.

Runtime Dashboard

Live web dashboard for monitoring actors, message throughput, and mailbox depths. Supports trace recording and replay at configurable speed.

Includes hand-authored SVG diagrams (actor lifecycle, message lifecycle, tick cycle, transport routing) and generated diagrams from DOT sources (architecture, dataflow, type erasure).

See crates/runtime-dashboard/.

Language Bindings

Python — PyO3 via Maturin. Spawn actors from Python callables, pass dicts as messages, single-threaded or multi-threaded.

cd crates/swactor-python && maturin develop

Examples in examples/python/ (single-thread, async, Jupyter notebook).

WASM — wasm-bindgen. Runs single-threaded with deterministic addressing (no_random feature).

cd crates/swactor-wasm && wasm-pack build --target nodejs

Connectome Analysis

Structural analysis of the internal dependency graph.

  • depgraph (tools/depgraph/) — AST-based extraction of module dependencies, outputs GraphViz DOT
  • spectral (tools/spectral/) — Laplacian eigenvalue analysis, Connectome Complexity Index (CCI), coupling heatmaps, interactive HTML dashboard
cargo run --manifest-path tools/depgraph/Cargo.toml -- --src-dir src/ --output deps
python tools/spectral/spectral_analysis.py deps.dot

See docs/connectome/connectome.md for metric interpretation.

Building & Testing

cargo test                              # all tests
cargo test --features transport         # include transport tests
cargo run --example hello               # single actor example
cargo run --example ring                # 500-actor ring topology
cargo bench                             # benchmarks (criterion)

Feature Flags

Flag Default What it does
getrandom yes System RNG for actor addresses
no_random no Deterministic counter (WASM / reproducible tests)
transport no Pluggable remote messaging (codec + transport)
tracing no tracing instrumentation for runtime internals
serde no Serde derives for stats types
python no PyO3 bindings (cdylib wheel)

Documentation

Document Covers
Actor Model Traits, type erasure, addresses
Runtime Runtime, Ctx, Inbox, RuntimeHandle, stats
Worker Thread Tick phases, backoff, routing, full system topology
Channels HybridChannel, AddressMap, Placement
Transport Codec, Transport, remote messaging, address resolution
Distribution SWIM membership, Kademlia, NodeDriver
Connectome CCI metrics, spectral analysis interpretation
Dashboard Live web UI, trace recording, diagram index