Research directions, developer tooling, and the vision for a lingua franca of sensor experience
Joe Scanlin
November 2025
This final section explores open research questions in information-theoretic compression, verifiable compilation, and frontier model integration. It also details the comprehensive developer tooling ecosystem needed to make Spaxiom accessible to practitioners.
We conclude by positioning Spaxiom as the foundation for a new kind of AI substrate: a lingua franca for sensor experience that bridges the physical world and the agents that will increasingly inhabit it.
Spaxiom currently relies on hand-designed event schemas. Open questions:
Potential direction: treat Spaxiom events as a learned discrete bottleneck, analogous to VQ-VAE codes but for sensor experiences.
We sketched how safety envelopes could be compiled to automata. Future work:
On the model side:
We expect an ecosystem of Spaxiom-aware agent frameworks, where the DSL is the default way to "speak sensor."
To move beyond thought experiments, we plan to define benchmarks across several dimensions:
Adoption of any new framework depends critically on developer experience (DX). Even with powerful abstractions, developers need practical tools to build, test, debug, and deploy Spaxiom applications efficiently. This section outlines the tooling ecosystem required to make Spaxiom accessible to practitioners.
Modern developers expect first-class IDE support. Spaxiom provides:
# VSCode shows inline type hints and errors
from spaxiom import Sensor, Zone, Condition
from spaxiom.units import meters, celsius
zone = Zone(x=0, y=0, width=10 * meters, height=5 * meters)
temp = Sensor(name="temp", unit=celsius)
# Error: incompatible units (meters vs celsius)
# VSCode underlines in red: "Cannot compare Temperature with Distance"
too_hot = Condition(lambda: temp.read() > 10 * meters) # Type error!
For exploratory development and data science workflows:
# In Jupyter notebook
from spaxiom.viz import plot_zones, plot_event_timeline
# Visualize spatial layout
plot_zones([loading_zone, staging_zone, storage_zone])
# Plot event timeline
events = store.query(since="2025-01-01", limit=1000)
plot_event_timeline(events, group_by="zone")
The spaxiom CLI provides project scaffolding, testing, and deployment:
# Create new Spaxiom project
$ spaxiom init warehouse-monitor
Created warehouse-monitor/
├── spaxiom.yaml # Configuration
├── sensors.py # Sensor definitions
├── patterns.py # INTENT patterns
├── main.py # Runtime entry point
└── tests/ # Unit tests
# Install dependencies
$ cd warehouse-monitor
$ spaxiom install
# Run unit tests (simulated sensors)
$ spaxiom test
Running 12 tests...
✓ test_occupancy_threshold (0.2s)
✓ test_queue_formation (0.5s)
✓ test_overheating_alert (0.1s)
...
12 passed, 0 failed
# Validate configuration
$ spaxiom validate
✓ All sensors defined
✓ All zones have valid coordinates
✓ No circular pattern dependencies
✓ Type checking passed
# Check coverage (which sensors/patterns are tested)
$ spaxiom test --coverage
Sensor coverage: 18/20 (90%)
Pattern coverage: 8/10 (80%)
Condition coverage: 15/20 (75%)
# Deploy to edge device
$ spaxiom deploy --target pi@192.168.1.100
Uploading code... ✓
Installing dependencies... ✓
Starting runtime... ✓
Runtime listening on http://192.168.1.100:8080
# View logs
$ spaxiom logs --follow
[2025-01-06 10:23:45] INFO: Runtime started (tick_rate=10Hz)
[2025-01-06 10:23:46] INFO: Sensors online: 20/20
[2025-01-06 10:23:47] EVENT: OccupancyChanged(zone=loading, count=5)
[2025-01-06 10:23:50] ALERT: QueueFormed(zone=loading, length=8)
# Check runtime health
$ spaxiom status
Runtime: HEALTHY
Uptime: 3d 14h 22m
Sensors: 20/20 online
Events/sec: 12.3
Latency p99: 8.2ms
Spaxiom includes a pytest-based testing framework with specialized fixtures:
# tests/test_queue_pattern.py
from spaxiom.testing import MockRuntime, MockSensor, advance_time
def test_queue_formation():
# Create mock runtime with simulated sensors
runtime = MockRuntime()
camera = MockSensor(name="camera", initial_value=0)
runtime.add_sensor(camera)
# Create pattern
from patterns import QueuePattern
queue = QueuePattern(camera=camera, threshold=5)
runtime.add_pattern(queue)
# Simulate sensor readings
camera.set_value(3) # Below threshold
runtime.tick()
assert not queue.is_active()
camera.set_value(7) # Above threshold
runtime.tick()
assert queue.is_active()
# Simulate time passage
advance_time(runtime, seconds=10)
assert queue.duration() == 10.0
# tests/test_warehouse_scenario.py
from spaxiom.testing import SimulatedEnvironment
def test_warehouse_workflow():
# Create simulated warehouse with 4 zones
env = SimulatedEnvironment.from_config("warehouse.yaml")
# Simulate 1 hour of activity
events = []
for t in range(3600):
env.step() # Advance 1 second
events.extend(env.get_events())
# Assert expected event sequence
assert any(e["type"] == "TruckArrived" for e in events)
assert any(e["type"] == "LoadingStarted" for e in events)
assert any(e["type"] == "LoadingCompleted" for e in events)
# Check performance metrics
avg_loading_time = env.get_metric("avg_loading_time")
assert avg_loading_time < 600.0 # Under 10 minutes
Web-based UI for stepping through event sequences:
# Start debugger with recorded events
$ spaxiom debug /var/lib/spaxiom/events.db
Opening debugger at http://localhost:3000
# Debugger UI shows:
# - Timeline slider (scrub through time)
# - Event list (filter by type, zone, priority)
# - Sensor values at each timestamp
# - Pattern state visualization
# - Condition evaluation traces
3D visualization of zones, entities, and sensor coverage:
from spaxiom.viz import SpatialVisualizer
viz = SpatialVisualizer(runtime)
# Render 3D scene (Three.js / Unity)
viz.show_zones(wireframe=True)
viz.show_entities(trail_length=30) # Show movement trails
viz.show_sensor_coverage(camera_sensors, fov=90)
# Animate event timeline
viz.playback(events, speed=10.0) # 10x real-time
Set breakpoints triggered by specific events:
from spaxiom.debug import breakpoint_on_event
# Pause execution when queue forms
@breakpoint_on_event("QueueFormed")
def inspect_queue(event):
print(f"Queue in {event['zone']}: length={event['length']}")
# Drop into interactive debugger
import pdb; pdb.set_trace()
runtime.run()
from spaxiom.profiling import RuntimeProfiler
profiler = RuntimeProfiler(runtime)
profiler.start()
runtime.run(duration=300) # Profile 5 minutes
report = profiler.report()
print(report.summary())
# Output:
# ========== Spaxiom Runtime Profile ==========
# Total ticks: 3000 (10.0 Hz)
#
# Top 5 patterns by latency:
# 1. QueueFlow: 4.2ms avg, 8.9ms p99
# 2. OccupancyField: 2.1ms avg, 5.3ms p99
# 3. ADLTracker: 1.8ms avg, 3.2ms p99
#
# Top 3 callbacks by duration:
# 1. on_queue_formed: 12.3ms avg
# 2. on_overheating: 0.8ms avg
#
# Sensor read latency:
# camera_loading: 3.2ms avg
# modbus_temp_1: 0.5ms avg
$ spaxiom profile memory --duration 3600
Monitoring memory usage for 1 hour...
Memory growth detected:
Pattern: OccupancyField (zone=loading)
Growth rate: +2.3 MB/hour
Likely cause: Unbounded history buffer
Recommendation: Add max_history_size parameter
$ spaxiom profile flamegraph --output profile.svg
Generated flamegraph: profile.svg
Open in browser to see call stack visualization
from spaxiom.sim import SyntheticSensor, GaussianNoise, PeriodicSignal
# Temperature with diurnal cycle + noise
temp = SyntheticSensor(
name="temp",
base_signal=PeriodicSignal(
amplitude=5.0, # ±5°C
period=86400.0, # 24 hours
offset=20.0 # 20°C baseline
),
noise=GaussianNoise(std=0.5)
)
# Occupancy with Poisson arrivals
occupancy = SyntheticSensor(
name="occupancy",
generator=lambda t: np.random.poisson(lam=10.0) # 10 people avg
)
runtime.add_sensor(temp)
runtime.add_sensor(occupancy)
from spaxiom.sim import ScenarioRecorder, ScenarioPlayer
# Record a scenario from production
recorder = ScenarioRecorder(runtime)
runtime.run(duration=3600) # Record 1 hour
recorder.save("scenarios/normal_ops.spx")
# Later: replay for regression testing
player = ScenarioPlayer.load("scenarios/normal_ops.spx")
test_runtime = SpaxiomRuntime()
player.attach(test_runtime)
# Run at 100x speed
test_runtime.run(speed=100.0)
# Assert no regressions
assert test_runtime.event_count("SafetyViolation") == 0
from spaxiom.monitoring import PrometheusExporter
exporter = PrometheusExporter(runtime, port=9090)
exporter.start()
# Metrics exposed:
# spaxiom_events_total{type="DoorOpened",zone="loading"}
# spaxiom_pattern_latency_seconds{pattern="QueueFlow"}
# spaxiom_sensor_read_errors_total{sensor="camera_1"}
# spaxiom_runtime_tick_rate_hz
Pre-built Grafana dashboards for common metrics:
# Import dashboard templates
$ spaxiom grafana import --dashboard runtime-overview
$ spaxiom grafana import --dashboard sensor-health
$ spaxiom grafana import --dashboard event-timeline
# Dashboards show:
# - Event rate over time (by type, zone, priority)
# - Pattern latency heatmaps
# - Sensor health status
# - Callback execution times
# - Memory and CPU usage
from spaxiom.tracing import OpenTelemetryTracer
tracer = OpenTelemetryTracer(
endpoint="http://jaeger:4318",
service_name="warehouse-runtime"
)
runtime.set_tracer(tracer)
# Traces show:
# - Sensor read → Pattern update → Condition eval → Callback dispatch
# - Cross-site event propagation (edge → cloud)
# - ML model inference triggered by events
# Generate docs from code
$ spaxiom docs generate --output docs/
Generating documentation...
✓ API reference (200 endpoints)
✓ Pattern library (25 patterns)
✓ Type definitions (50 types)
✓ Examples (30 snippets)
Docs available at docs/index.html
Generate Python pattern classes from declarative YAML schemas:
# patterns/custom.yaml
- name: CustomOccupancy
sensors:
- camera: Camera
- floor: PressureMat
parameters:
- threshold: int
events:
- name: ZoneOccupied
fields:
- count: int
- timestamp: datetime
$ spaxiom generate patterns patterns/custom.yaml --output patterns/generated.py
Generated patterns/generated.py with 1 pattern class
# Now import and use
from patterns.generated import CustomOccupancy
$ spaxiom api spec --output openapi.yaml
Generated OpenAPI 3.0 spec with:
- GET /events
- GET /sensors/{id}
- POST /patterns
- GET /zones
# Use with code generators
$ openapi-generator-cli generate -i openapi.yaml -g python -o clients/python
# Install from PyPI
$ pip install spaxiom
# With optional dependencies
$ pip install spaxiom[vision] # Camera/video support
$ pip install spaxiom[industrial] # Modbus, OPC UA, BACnet
$ pip install spaxiom[cloud] # AWS, Azure, GCP connectors
$ pip install spaxiom[ml] # ML integration (Feast, Tecton)
$ pip install spaxiom[all] # Everything
# Official images on Docker Hub
$ docker pull spaxiom/runtime:latest
$ docker pull spaxiom/runtime:edge # Minimal for Raspberry Pi
$ docker pull spaxiom/runtime:cloud # With cloud connectors
# Run containerized runtime
$ docker run -p 8080:8080 \
-v /var/lib/spaxiom:/data \
spaxiom/runtime:latest
# Add Helm repo
$ helm repo add spaxiom https://charts.spaxiom.io
# Install runtime on Kubernetes
$ helm install warehouse-runtime spaxiom/runtime \
--set config.tickRate=10 \
--set config.sensors[0].name=camera_1 \
--set config.sensors[0].type=rtsp
# Supports horizontal scaling
$ kubectl scale deployment warehouse-runtime --replicas=10
Browser-based editor with live preview (like Rust Playground):
# Visit https://playground.spaxiom.io
# Features:
# - Code editor with syntax highlighting
# - Simulated sensors (drag-and-drop spatial layout)
# - Real-time event visualization
# - Share links to examples
# - Fork and modify templates
$ spaxiom examples list
Available examples:
1. hello-world Simple occupancy detection
2. warehouse-queue Queue flow monitoring
3. hvac-optimization Energy-aware HVAC control
4. robot-safety Collision avoidance with safety zones
5. retail-analytics Customer journey tracking
...
$ spaxiom examples run hello-world
Running example: hello-world
Press Ctrl+C to stop
[Output shows simulated events in real-time]
Community repository of reusable patterns:
# Search for patterns
$ spaxiom marketplace search "queue"
Found 5 patterns:
- advanced-queue-flow (★ 245)
- multi-stage-queue (★ 89)
- priority-queue-manager (★ 67)
# Install pattern
$ spaxiom marketplace install advanced-queue-flow
Installed advanced-queue-flow v2.1.0
# Now use in code
from spaxiom.marketplace import AdvancedQueueFlow
# Create custom plugin
from spaxiom.plugins import Plugin
class CustomVisualizerPlugin(Plugin):
def on_event(self, event):
# Custom visualization logic
self.render(event)
# Register plugin
runtime.register_plugin(CustomVisualizerPlugin())
# Discover community plugins
$ spaxiom plugins search "visualization"
$ spaxiom plugins install spaxiom-3d-viz
Spaxiom's developer experience is designed to support the full development lifecycle:
By investing in world-class tooling, Spaxiom aims to reduce the barrier to entry for developers building spatiotemporal applications, accelerating adoption across industries from manufacturing to healthcare to smart cities.
As sensors proliferate and AI shifts into the Era of Experience, we need programming tools that treat space, time, and interaction as first-class design constraints. Spaxiom proposes:
In the same way SQL became the lingua franca for structured business data, and modern deep learning frameworks became a lingua franca for neural computation, Spaxiom aims to become a lingua franca for sensor experience: a bridge between the physical world and the agents that will increasingly inhabit it.
If we succeed, future frontier models will not just read the internet; they will read the world through a concise, structured, and safe language that lets them understand, remember, and act on the experiences of billions of devices and the humans they serve.