tibet-twin — Digital Twin Synchronicity Guard
No action without proven synchronization.
Every deviation is an alert. Every decision is a TIBET token.
tibet-twin ensures physical and virtual systems are synchronized before allowing any action. When a digital twin's view of reality diverges from actual sensor data, tibet-twin blocks the action and creates a TIBET audit trail.
The Deadly Scenario
Factories and ports build digital twins — virtual 3D copies of physical machines. But there's always latency between the physical sensor and the virtual model.
[Physical Crane] [Digital Twin]
sensor: FAULT t=14:32:01.003 status: OK t=14:32:00.500
| |
└──── tibet-twin compares ─────────┘
Δt = 503ms, status ≠ sync
→ BLOCK action
→ TIBET token: audit trail
If the digital twin authorizes a "move left" command while the physical crane has a fault... people die.
Install
pip install tibet-twin
Quick Start
from tibet_twin import SyncGuard, PhysicalState, TwinState
guard = SyncGuard(max_drift_ms=200) # Port crane: max 200ms drift
# Physical crane reports: FAULT
guard.update_physical("crane-01", PhysicalState(
device_id="crane-01",
timestamp="2026-02-27T14:32:01.003+00:00",
values={"position_x": 12.5, "load_kg": 2500.0},
status="fault",
))
# Digital twin still thinks: OK
guard.update_twin("crane-01", TwinState(
device_id="crane-01",
timestamp="2026-02-27T14:32:00.500+00:00",
values={"position_x": 12.5, "load_kg": 2500.0},
status="operational",
))
decision = guard.check("crane-01", intent="move_left")
print(decision.blocked) # True
print(decision.reason) # "BLOCKED: status mismatch: physical=fault, twin=operational"
Demo
tibet-twin demo # Interactive crane safety demo
tibet-twin info # The deadly scenario explained
tibet-twin profiles # Industry profiles with sync thresholds
Why TIBET Is Unique Here
Other synchronization systems check: "Is the data there?"
tibet-twin checks:
- Is it the right data? (value comparison)
- From the right device? (JIS identity)
- At the right time? (temporal drift)
- Does the intent match the state? (TIBET provenance)
All four must pass. One failure = BLOCK.
Industry Profiles
| Profile | Sector | Max Drift | Safety Critical | Example Assets |
|---|---|---|---|---|
port |
Maritime | 200ms | Yes | Container cranes, AGVs |
manufacturing |
Factory | 100ms | Yes | CNC, robot arms (KUKA/ABB) |
energy |
Power Grid | 500ms | Yes | Wind turbines, substations |
steel |
Heavy Industry | 300ms | Yes | Blast furnaces, hot strip mills |
semiconductor |
Chip Fab | 50ms | Yes | ASML EUV, etch tools |
building |
Smart Building | 5000ms | No | HVAC, fire detection |
tibet-twin profiles --json
TIBET Provenance
Every sync decision creates a TIBET token:
| Layer | Content |
|---|---|
| ERIN | Decision (allowed/blocked, drift, value deltas) |
| ERAAN | Device JIS identity, parent tokens |
| EROMHEEN | Guard node, timestamp, environment |
| ERACHTER | Intent (what action was attempted), safety flag |
The token chain is an immutable safety audit trail. When an inspector asks "was the twin in sync when the crane moved?" — the TIBET chain proves it.
Python API
from tibet_twin import SyncGuard, PhysicalState, TwinState
guard = SyncGuard(
max_drift_ms=200,
value_tolerances={
"crane-01": {"position_x": 0.5, "load_kg": 100.0},
},
)
# Update states continuously
guard.update_physical("crane-01", PhysicalState(...))
guard.update_twin("crane-01", TwinState(...))
# Check before every action
decision = guard.check("crane-01", intent="move_left")
if decision.blocked:
handle_block(decision)
else:
execute_action()
# Audit trail
for token in guard.export_audit():
print(token["erin"]["details"]["reason"])
# Status
print(guard.status())
# {'checks': 150, 'allowed': 142, 'blocked': 8, 'block_rate': 5.3}
Part of the TIBET ecosystem
| Package | Purpose |
|---|---|
tibet-core |
Protocol core |
tibet-y2k38 |
Y2K38 Time Bridge |
tibet-pol |
Process Integrity Checker |
tibet-pqc |
Post-Quantum Crypto Router |
tibet-overlay |
Identity Overlay |
| tibet-twin | Digital Twin Guard |
License
MIT — Humotica AI Lab 2025-2026
Authors
- J. van de Meent — jasper@humotica.com
- R. AI (Root AI) — root_idd@humotica.nl
Credits
Designed by Jasper van de Meent. Built by Jasper and Root AI as part of HumoticaOS.
Stack-positie: Groep safety · Bootstrap = OSAPI-handshake naar tibet + jis (fail → snaft-rule + tibet-pol-rapport) · ← tibet-workload · tibet-pol → · See STACK.md · See demo/golden-path/ for the spine end-to-end.
Enterprise
For private hub hosting, SLA support, custom integrations, or compliance guidance:
| Enterprise | enterprise@humotica.com |
| Support | support@humotica.com |
| Security | security@humotica.com |
See ENTERPRISE.md for details.
Metadata
Release files for tibet-twin 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tibet_twin-0.1.1.tar.gz | 13.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tibet_twin-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.1 kB
Release files / tibet_twin-0.1.1.tar.gz
| Download URL | tibet_twin-0.1.1.tar.gz |
|---|---|
| Size | 13.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
030862d4733f47c47d67ec303b9d0e9abba0d456fff8272b87a8e4c2536dfb5a
|
|
BLAKE2b-256 checksum How to use checksums |
09a9a9d39bcdb668470a05ae50e5f6faa9f0c57a6e240d0cd94e8e4e6b18c34a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / tibet_twin-0.1.1-py3-none-any.whl
| Download URL | tibet_twin-0.1.1-py3-none-any.whl |
|---|---|
| Size | 15.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f6dd603fa0286d2c860128b3ac7608ab3435ce9794c2144c712292eb85a91817
|
|
BLAKE2b-256 checksum How to use checksums |
748e579081a58782c349ecc863e507d5d99a16ba642bb803281927058538a3e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|