A cybernetic runtime for Python, providing a resilient core for managing devices, services, and processes in autonomous or IoT systems.
Project description
BussDCC
bussdcc (Bussdieker Durable Cybernetic Core) is a minimal, strongly-typed cybernetic runtime for Python.
It provides a resilient core for building systems that coordinate devices, processes, services, and interfaces through explicit lifecycles, event-driven communication, and strict typing.
The project is intentionally lightweight: it defines contracts and flow, not application policy.
Quick Start
from bussdcc import Runtime
from bussdcc.device import Device
from bussdcc.process import Process
from bussdcc.service import Service
class MySensor(Device):
kind = "sensor"
def connect(self): print("Sensor online")
def disconnect(self): print("Sensor offline")
class MyProcess(Process):
name = "logger"
def handle_event(self, ctx, evt):
print(evt.name, evt.data)
class MyService(Service):
name = "heartbeat"
interval = 2.0
def tick(self, ctx):
ctx.events.emit("heartbeat.tick")
rt = Runtime()
rt.attach_device(MySensor(id="device1"))
rt.register_process(MyProcess())
rt.register_service(MyService())
rt.boot()
Design Philosophy
bussdcc is built around a few guiding principles:
- Cybernetics over frameworks — systems coordinate through feedback loops (events), not tight coupling.
- Protocols first — behavior is defined via
typing.Protocol, not deep inheritance. - Replaceable infrastructure — clocks, event engines, state stores, and runtimes are swappable.
- Explicit lifecycles — startup, attachment, execution, and shutdown are visible and ordered.
- Strict typing — compatible with
mypy --strictwithout sacrificing flexibility.
This is not an automation framework. It is a kernel for building your own.
Core Concepts
Runtime
The Runtime coordinates the system:
-
Manages devices, processes, services, and interfaces
-
Constructs the shared
Context -
Emits lifecycle events:
runtime.bootingruntime.bootedruntime.shutting_downruntime.shutdown
Boot order is deterministic:
- Devices attach
- Processes attach
- Interfaces attach
- Services start (under supervision)
Shutdown reverses this order.
Context
A lightweight capability container shared by all components.
Provides access to:
clock— monotonic + UTC timeevents— synchronous event busstate— thread-safe hierarchical stateruntime— runtime introspection and lookup
The context is intentionally small and side-effect free.
Clock
Clocks are abstracted via a protocol.
Default: SystemClock, providing:
now_utc()monotonic()uptime()sleep(seconds)
Custom clocks (simulated, deterministic, test clocks) can be injected into the runtime.
Events
Synchronous, in-process, thread-safe event engine.
- Events are named strings with structured payloads
- Handlers run in the emitter’s thread
- Subscriber failures are isolated and reported as
event.subscriber_error - Subscriptions are cancellable
This is coordination, not messaging middleware.
State
Thread-safe hierarchical state engine with dot-path access:
ctx.state.set("runtime.clock.uptime", 42)
ctx.state.get("runtime.clock.uptime")
- No schema enforcement
- No persistence (by design)
- Intended for coordination and observation, not storage
Devices
Devices represent hardware, external resources, or system boundaries.
Lifecycle:
attach(ctx) → connect()
detach() → disconnect()
Events emitted:
device.attacheddevice.detacheddevice.failed
Devices are expected to be honest about failure.
Processes
Processes are event-driven units of work.
They:
- Subscribe to the event engine
- React synchronously to events
- May emit new events or update state
Lifecycle hooks:
attach(ctx)start(ctx)handle_event(ctx, evt)stop(ctx)detach()
Errors are isolated and reported as process.error.
Interfaces
Interfaces are processes by role, not by mechanism.
They typically:
- Translate human, network, or UI inputs into events
- Present system state outward
- Remain event-driven like any other process
They attach and detach alongside processes but are registered separately for clarity.
Services
Services are long-running, time-driven components, managed by the ServiceSupervisor.
Characteristics:
- Run in their own threads
- Execute
tick(ctx)on an interval - Can restart automatically on failure
- May be marked
critical
Lifecycle:
start(ctx)tick(ctx)(loop)stop(ctx)
Supervisor events:
service.startedservice.stoppedservice.errorservice.restartservice.critical_failure
What bussdcc Is (and Isn’t)
It is:
- A cybernetic coordination kernel
- A foundation for durable, event-driven systems
- Suitable for IoT, automation, robotics, and control planes
It is not:
- An application framework
- A scheduler or cron replacement
- A rules engine or policy engine
- Batteries included
Status
Pre-alpha. APIs may evolve, but core concepts are stabilizing.
License
MIT License
Durable systems start with clear contracts, explicit lifecycles, and honest boundaries.
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bussdcc-0.20.0.tar.gz.
File metadata
- Download URL: bussdcc-0.20.0.tar.gz
- Upload date:
- Size: 20.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9613132a0ea0c89226b91e039fa9fd90b9c26051ad55c93fa4511162af499488
|
|
| MD5 |
235a7ca7ae752cc019e8df1aeb57cf8f
|
|
| BLAKE2b-256 |
a2aad5b854051563ce6e1d0cd7fb3541f90d9dfbeddd4c4c7a9ced35327614fc
|
File details
Details for the file bussdcc-0.20.0-py3-none-any.whl.
File metadata
- Download URL: bussdcc-0.20.0-py3-none-any.whl
- Upload date:
- Size: 19.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8013dd589190b8c1ce426d4023308f942f705ac3d76a4990dd985714ba5462a
|
|
| MD5 |
09d799329c505478e970162ab6aec280
|
|
| BLAKE2b-256 |
1986d48c5425db831a36ca8d99c5de5da1d1affa7c34bd4080d8915d271c3891
|