Layered operations tree — observe, diff, orchestrate infrastructure as data
Project description
op3 — Layered Operations Tree
AI Cost Tracking
- 🤖 LLM usage: $1.8000 (12 commits)
- 👤 Human dev: ~$435 (4.3h @ $100/h, 30min dedup)
Generated on 2026-04-21 using openrouter/qwen/qwen3-coder-next
Layered infrastructure observation: observe, diff, orchestrate infrastructure as data.
Overview
op3 provides a unified framework for observing hierarchical infrastructure state across multiple layers:
- Physical Layer: Hardware, displays, network, compute
- OS Layer: Kernel, configuration
- Runtime Layer: Containers, compositor
- Service Layer: Containers, systemd services
- Endpoint Layer: HTTP endpoints, TCP ports
- Business Layer: Application health, business logic
Built on fraq's fractal data primitives, op3 enables:
- Deterministic layer scanning with probe system
- Format adapters (LESS, migration.yaml, snapshot.yaml)
- Drift detection between intended and actual state
- Immutable snapshots with diff capabilities
Installation
pip install op3
Quick Start
from opstree import LayerTree, LinearScanner, scan_device
from opstree.layers.builtin import PhysicalLayer, OsLayer, RuntimeLayer
# Register layers
tree = LayerTree()
tree.register(PhysicalLayer.display)
tree.register(OsLayer.kernel)
tree.register(RuntimeLayer.container)
# Scan a device
def execute(cmd: str):
# Your SSH/local execution logic
stdout, stderr, rc = ...
return stdout, stderr, rc
snapshot = scan_device("pi@192.168.188.109", execute, tree)
print(snapshot.to_yaml())
Format Adapters
from opstree.formats.less import LessAdapter
adapter = LessAdapter()
# Parse LESS to PartialSnapshot
partial = adapter.parse(open("app.doql.less").read())
# Render Snapshot to LESS
less_output = adapter.render(snapshot)
Project Status
Sprint 4 Complete (2026-04-21)
- ✅ Fixed datetime deprecation warnings (datetime.utcnow() → datetime.now(timezone.utc))
- ✅ All 26 tests passing with zero warnings
Sprint 5 Complete (2026-04-21)
- ✅ Added business.health builtin probe
- ✅ Added CLI layer filtering option (--layers flag)
Sprint 6 Complete (2026-04-21)
- ✅ Tested op3 with real-world examples from fraq, redeploy, doql
- ✅ Created examples/ folder with app.doql.less files from all three projects
- ✅ Enhanced CLI convert command to handle migration.yaml format
- ✅ All 26 tests passing
Sprint 3 Complete (2026-04-21)
- ✅ CLI with scan, drift, and convert commands
- ✅ Builtin probes (service.containers, endpoint.http)
- ✅ Format conversion between LESS, migration.yaml, snapshot.yaml
- ✅ CLI integration tested
Sprint 2 Complete (2026-04-21)
- ✅ Probe contexts (SSH, Local, Mock)
- ✅ Builtin probes (RPi display, Linux OS, container runtime)
- ✅ Format adapters (migration.yaml, snapshot.yaml)
- ✅ Integration tests with mock context (2 passing)
- ✅ ExecuteResult handling for compatibility
Sprint 1 Complete (2026-04-21)
- ✅ Layer tree with topological ordering
- ✅ Builtin layer definitions
- ✅ Snapshot model with Pydantic
- ✅ Probe protocol and registry
- ✅ Linear scanner
- ✅ Format registry (wraps fraq)
- ✅ LESS format adapter
- ✅ Unit tests (16 passing)
Dependencies
- fraq >= 0.2.15 (core primitives: FraqNode, FormatRegistry, adapters)
- pydantic >= 2.0
- pyyaml >= 6.0
- click >= 8.0
- jmespath >= 1.0
- rich >= 13.0
License
Licensed under Apache-2.0.
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 op3-0.2.1.tar.gz.
File metadata
- Download URL: op3-0.2.1.tar.gz
- Upload date:
- Size: 237.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57794ff80708c1727a1411a8349f2219ff0f1f348d8142bbfe5f97bdcda87f9c
|
|
| MD5 |
6545158dba2e5574d73a08e5e0592ec9
|
|
| BLAKE2b-256 |
2c12a0fe1adea8a6dc81b5402cfa990ce8e242a0d5cebb852285fd985305ef87
|
File details
Details for the file op3-0.2.1-py3-none-any.whl.
File metadata
- Download URL: op3-0.2.1-py3-none-any.whl
- Upload date:
- Size: 57.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f79d58bea5cd2aa5499b2b1b11a2a1d8f79d125d714574aee9dca6223cc145da
|
|
| MD5 |
332c7e4396f204105c979fb3d359fcb4
|
|
| BLAKE2b-256 |
338784688d5e4193a4097779a458f3bf2458ad02327cda4529183907f0dcc459
|