Skip to content

Latest commit

 

History

History
1738 lines (1321 loc) · 57.9 KB

File metadata and controls

1738 lines (1321 loc) · 57.9 KB

SAP 2.3 - Space AI Protocol Integrated Specification

Version: 2.3
License: MIT License
Date: 2025-12-10
Production Status: ✅ 95% Ready (Verified)

Change Log:

  • 2.3 (2025-12-10) - Performance verification completed, benchmarks added, 95% production readiness
  • 2.1 (2025-12-10) - Rollback mechanism, dynamic horizon, time synchronization model added
  • 2.0 (2025-12-07) - Initial integrated specification

Table of Contents

  1. Overview
  2. Protocol Purpose
  3. System Architecture
  4. Core Concepts
  5. Layer Specifications
  6. Core Algorithms
  7. Technology Stack
  8. API Specification
  9. Data Structures
  10. Security and Trust
  11. Performance Specifications
  12. Appendix

1. Overview

1.1 What is SAP?

SAP (Space AI Protocol) is a spatial-temporal trading protocol for the real-time coordination of Autonomous Mobile Robot (AMR) swarms.

SAP defines spatio-temporal resources as economic units to allow robots to share physical space safely and effectively, allocating them through a distributed auction mechanism.

1.2 Core Values

Value Description
Safety Collision prevention via real-time verification based on physics laws
Fairness Strategic manipulation prevention via Vickrey auctions
Efficiency Congestion distribution via dynamic pricing
Resilience Predictive synchronization + Deterministic rollback

1.3 Applications

  • Logistics Warehouse AMR Control
  • Semiconductor FAB FOUP Transport
  • Hospital Logistics Robots
  • Airport/Port Autonomous Equipment
  • Smart City Autonomous Vehicles

2. Protocol Purpose

2.1 Problem Definition

Limitations of existing AMR swarm control systems:

  1. Centralized Bottleneck: Single scheduler failure paralyzes the entire system
  2. Static Path Allocation: Inability to respond to real-time situation changes
  3. Unfair Priorities: Starvation occurs due to First-Come-First-Served/Fixed priorities
  4. Prediction-Execution Mismatch: Error accumulation between predicted and actual paths

2.2 SAP Solutions

Problem SAP Solution
Centralized Bottleneck Edge Distributed Architecture - Independent processing per Zone
Static Path VoxelTimeSlot Auction - Real-time dynamic allocation
Unfair Priorities Vickrey Auction - Honest value expression via second-price bidding
Prediction Mismatch PredictiveSync - Prediction-based synchronization + Rollback

2.3 Design Goals

┌────────────────────────────────────────────────────────────┐
│                    SAP 2.0 Design Goals                     │
├─────────────────┬──────────────────────────────────────────┤
│ Latency         │ < 50ms (Command response within Edge)    │
│ Throughput      │ > 1,000 commands/sec (Per Zone)          │
│ Availability    │ 99.9% (Including failure response)       │
│ Scalability     │ Linear Scale (Adding Zones)              │
│ Safety          │ 100% Physics Verification (Stop on REJECT)│
└─────────────────┴──────────────────────────────────────────┘

3. System Architecture

3.1 5-Layer Architecture

┌──────────────────────────────────────────────────────────────────┐
│                        SAP 2.0 Stack                              │
├──────────────────────────────────────────────────────────────────┤
│                                                                   │
│   L5: Cloud Layer (sap-cloud)                                    │
│   ┌─────────────────────────────────────────────────────────┐    │
│   │  GlobalStateAggregator  │  VtsAllocator                 │    │
│   │  - Zone State Aggregation│  - Global VTS Allocation     │    │
│   │  - Stale Detection      │  - Spatio-temporal Conflict   │    │
│   └─────────────────────────────────────────────────────────┘    │
│                              ▲                                    │
│                              │                                    │
│   L4: Economy Layer (sap-economy)                                │
│   ┌─────────────────────────────────────────────────────────┐    │
│   │  VickreyAuction     │  PricingEngine  │  TicketManager  │    │
│   │  - Second-price Auction│  - Dynamic Pricing│  - Ticket Issue│    │
│   │  - Bid Collection      │  - Demand-based   │  - Expiry Mgmt │    │
│   └─────────────────────────────────────────────────────────┘    │
│                              ▲                                    │
│                              │                                    │
│   L3: Network Layer (sap-network)                                │
│   ┌─────────────────────────────────────────────────────────┐    │
│   │  StateComparator   │  RollbackManager  │  FailsafeManager│   │
│   │  - Pred/Actual Compare│  - Snapshot Rollback│  - Failure Resp│   │
│   │  - Delta Calculation  │  - Cooldown Policy  │  - Mode Switch │    │
│   └─────────────────────────────────────────────────────────┘    │
│                              ▲                                    │
│                              │                                    │
│   L2: Physics Layer (sap-physics)                                │
│   ┌─────────────────────────────────────────────────────────┐    │
│   │  PhysicsValidator   │  KinematicsChecker │ CollisionPredictor│
│   │  - Constraint Verify │  - Vel/Accel       │  - Collision Pred│    │
│   │  - OK/ADJUST/REJECT │  - Jerk Limits     │  - Path Safety   │    │
│   └─────────────────────────────────────────────────────────┘    │
│                              ▲                                    │
│                              │                                    │
│   L1: Core Layer (sap-core)                                      │
│   ┌─────────────────────────────────────────────────────────┐    │
│   │  Types             │  Packets           │  Validation    │    │
│   │  - Pos/Vel          │  - DeltaTickPacket │  - Frame/Result│    │
│   │  - RobotState       │  - RollbackFrame   │  - constraint  │    │
│   └─────────────────────────────────────────────────────────┘    │
│                                                                   │
└──────────────────────────────────────────────────────────────────┘

3.2 Deployment Topology

                    ┌─────────────┐
                    │   Cloud     │
                    │  (sap-cloud)│
                    └──────┬──────┘
                           │
          ┌────────────────┼────────────────┐
          │                │                │
    ┌─────▼─────┐    ┌─────▼─────┐    ┌─────▼─────┐
    │  Edge 1   │    │  Edge 2   │    │  Edge 3   │
    │ (Zone A)  │    │ (Zone B)  │    │ (Zone C)  │
    │ sap-edge  │    │ sap-edge  │    │ sap-edge  │
    └─────┬─────┘    └─────┬─────┘    └─────┬─────┘
          │                │                │
    ┌─────▼─────┐    ┌─────▼─────┐    ┌─────▼─────┐
    │ Physvisor │    │ Physvisor │    │ Physvisor │
    │sap-physvisor    │sap-physvisor    │sap-physvisor
    └─────┬─────┘    └─────┬─────┘    └─────┬─────┘
          │                │                │
    ┌─────▼─────┐    ┌─────▼─────┐    ┌─────▼─────┐
    │ Robot SDK │    │ Robot SDK │    │ Robot SDK │
    │ sap-robot │    │ sap-robot │    │ sap-robot │
    └───────────┘    └───────────┘    └───────────┘

3.3 Data Flow

Robot                 Edge                  Cloud
  │                    │                      │
  │ ── MotionCommand ─▶│                      │
  │                    │                      │
  │                    │◀─ VTS Request ───────│
  │                    │── VTS Allocate ─────▶│
  │                    │                      │
  │                    │── Bid Submit ───────▶│
  │                    │◀─ Auction Result ────│
  │                    │                      │
  │◀─ TransitTicket ───│                      │
  │                    │                      │
  │ ── Execute ───────▶│                      │
  │                    │── State Update ─────▶│
  │                    │                      │

4. Core Concepts

4.1 VoxelTimeSlot (VTS)

VoxelTimeSlot is the core economic unit of SAP, a spatio-temporal resource combining a 3D spatial voxel + time interval.

pub struct VoxelTimeSlot {
    pub voxel_id: u64,      // 3D spatial voxel ID
    pub t_start_ns: u64,    // Start time (nanoseconds)
    pub t_end_ns: u64,      // End time (nanoseconds)
}

Features:

  • Exclusive Occupancy: Only one robot allocated per VTS
  • Time Division: Same space utilized multiple times via time division
  • Auction Unit: Bidding/trading unit

4.1.1 VtsId (VTS Identifier)

VtsId is the globally unique identifier (128-bit) for a VoxelTimeSlot.

pub struct VtsId(u128);

impl VtsId {
    /// Generate VtsId by hashing zone_id + VoxelTimeSlot
    pub fn from_vts(zone_id: u32, vts: &VoxelTimeSlot) -> Self;
    
    /// Generate from individual components
    pub fn from_components(zone_id: u32, voxel_id: u64, t_start_ns: u64, t_end_ns: u64) -> Self;
}

Design Principles:

  • Zone Inclusion: Different ID if different Zone, even with same voxel/time
  • Deterministic: Same input → Same output (FNV-1a hash)
  • Collision Resistance: < 2^-64 collision probability with 128-bit

4.1.2 ID System Relationship

┌─────────────────────────────────────────────────────────────────┐
│                      SAP ID System                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  zone_id (u32)                                                   │
│      │                                                           │
│      ▼                                                           │
│  ┌─────────────────────────────────────────────┐                │
│  │  VoxelTimeSlot                               │                │
│  │  ├─ voxel_id: u64 (Spatial Voxel)            │                │
│  │  ├─ t_start_ns: u64 (Start Time)             │                │
│  │  └─ t_end_ns: u64 (End Time)                 │                │
│  └──────────────────┬──────────────────────────┘                │
│                     │                                            │
│                     │ hash(zone_id + voxel_id + t_start + t_end) │
│                     ▼                                            │
│  ┌─────────────────────────────────────────────┐                │
│  │  VtsId: u128                                 │                │
│  │  (Global Unique VTS ID)                      │                │
│  └──────────────────┬──────────────────────────┘                │
│                     │                                            │
│                     │ Referenced on Auction Win                  │
│                     ▼                                            │
│  ┌─────────────────────────────────────────────┐                │
│  │  TransitTicket                               │                │
│  │  ├─ ticket_id: u128 (Unique Ticket ID)       │                │
│  │  ├─ robot_id: u64 (Owner Robot)              │                │
│  │  ├─ vts_list: Vec<VoxelTimeSlot> (Reserved)  │                │
│  │  └─ smev_sig: Vec<u8> (Signature)            │                │
│  └──────────────────┬──────────────────────────┘                │
│                     │                                            │
│                     │ Referenced in Robot State                  │
│                     ▼                                            │
│  ┌─────────────────────────────────────────────┐                │
│  │  RobotState                                  │                │
│  │  ├─ robot_id: u64                            │                │
│  │  ├─ ticket_id: u128 (Current Ticket)         │                │
│  │  └─ ... (Position, Velocity etc.)            │                │
│  └─────────────────────────────────────────────┘                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

ID Type Summary:

ID Type Bits Description
zone_id 32 Zone Identifier
robot_id 64 Robot Identifier
voxel_id 64 Spatial Voxel Identifier
ticket_id 128 Ticket Unique Identifier
VtsId 128 VTS Global Identifier (Hash)

4.2 TransitTicket

TransitTicket is a digital transit pass proving a robot's right to use specific VTSs.

pub struct TransitTicket {
    pub ticket_id: u128,            // Ticket Unique ID
    pub robot_id: u64,              // Owner Robot ID
    pub zone_id: u32,               // Zone ID
    pub vts_list: Vec<VoxelTimeSlot>, // Reserved VTS List
    pub valid_from_ns: u64,         // Valid From
    pub valid_to_ns: u64,           // Valid To
    pub priority_class: u8,         // Priority Class
    pub total_price_milli: u64,     // Total Price
    pub smev_sig: Vec<u8>,          // S-MEV Signature
}

Lifecycle:

  1. Issue: Issued upon winning auction
  2. Validate: Checked for validity during movement
  3. Expire: Automatically discarded after validity period

4.3 PredictiveSync

PredictiveSync is a prediction-based synchronization mechanism to overcome network latency.

Operation Principle:

  1. Edge predicts robot's next state using physics simulation
  2. Robot reports result after actual execution
  3. Calculate error between prediction and actual
  4. Trigger State Reconciliation (Rollback) if error exceeds threshold
Prediction: Position(5.0, 3.0, 0.0)
Actual:     Position(5.1, 2.9, 0.0)
Error:      0.12m (> 0.10m threshold exceeded)
Decision:   NeedsRollback

Sync Decision Thresholds:

Result Position Error Description
InSync < 0.07m Normal sync state
Warning 0.07m ~ 0.10m Drift detected, monitoring required
NeedsRollback > 0.10m Rollback needed, state reconciliation

Note: Warning threshold is automatically calculated as 70% of rollback threshold. Thresholds are adjustable per environment (e.g., wider thresholds for high-speed robots).

4.3.1 Rollback Mechanism (State Reconciliation)

Important: SAP's "Rollback" refers to logical state reconciliation. Physical robots cannot reverse time.

Two Recovery Layers:

Layer Name Description
Logical State Rollback Restore WorldState to previous snapshot
Physical Physical Recovery Send safe stop/decellerate/reroute command to robot

Logical Rollback Procedure:

  1. Search nearest snapshot upon error detection
  2. Restore WorldState to snapshot time
  3. Generate RollbackFrame including safe_trajectory
  4. Send RollbackFrame to robot

Physical Recovery Procedure:

  1. Robot receives safe_trajectory in RollbackFrame
  2. Safely decelerate/stop current action
  3. Execute recovery action following safe_trajectory
  4. Resume operation upon reaching normal state
// RollbackFrame Structure
pub struct RollbackFrame {
    pub rollback_tick: u64,           // Target Tick
    pub world_state_hash: [u8; 32],   // Snapshot Hash
    pub safe_trajectory: Vec<PredictedState>, // Safe Recovery Trajectory
    pub reason: RollbackReason,       // Rollback Reason
}

4.3.2 Snapshot Strategies

RollbackManager supports three snapshot storage strategies:

Strategy Description Pros Cons Default Params
TickBased Fixed tick interval • Predictable
• Simple implementation
• Constant recovery time
• Fixed memory usage
• Does not adapt to changes
interval: 10 ticks
MemoryBudget Memory limit based • Limits memory usage
• Embedded friendly
• Old snapshots auto-deleted
• Limited recovery range
max_bytes: 10MB
Adaptive Frequency based • Dynamic optimization
• Focus on problematic robots
• Untredictable
• Increased complexity
base_interval: 10
reduction_factor: 0.5

Usage Scenarios:

TickBased:
  - Data center AMR (Predictable environment)
  - SLA guarantee needed (Constant recovery time)
  - Sufficient memory

MemoryBudget:
  - Embedded Edge devices (Memory constrained)
  - Large Zones (100+ robots)
  - Cost optimization needed

Adaptive:
  - Mixed environment (Fast/Slow robots)
  - Experimental deployment (Learning rollback patterns)
  - Variable network quality

Selection Criteria:

if memory < 100MB:
    use MemoryBudget
else if environment is very stable:
    use TickBased(interval=20)
else if rollback frequency is high:
    use Adaptive(base=10, reduction=0.6)

Note: RollbackManager does not support runtime strategy changes. Existing snapshots are kept, new strategy applies to new snapshots.

4.4 S-MEV (Space MEV)

S-MEV (Space Maximal Extractable Value) applies Blockchain MEV concepts to spatial trading.

Vickrey Auction (Second-Price Sealed-Bid):

  • Each robot bids its true value
  • Highest bidder wins at second price
  • Honest bidding is optimal strategy (Incentive Compatibility)
Bids:
  Robot A: 800
  Robot B: 600  ← 2nd price
  Robot C: 500

Result:
  Winner: Robot A
  Price: 600 (Robot B's price)

Auction Parameters:

Parameter Type Default Description
min_bid u64 100 Minimum bid amount (milli)
reserve_price u64 50 Reserve price (floor for single bid)
deadline_ns u64 0 Auction deadline (0 = Unlimited)
max_bids usize 1000 Max bids per VTS

Note: If there is only a single bidder, reserve_price applies as the winning price. This prevents market manipulation and helps form fair prices.


5. Layer Specifications

5.1 L1: Core Layer (sap-core)

Purpose: Defines basic types and data structures used across the entire system.

Key Modules:

Module Description
types Position, Velocity, Acceleration, RobotState, WorldState
ticket TransitTicket, Bid, VoxelTimeSlot
packet DeltaTickPacket, RollbackFrame
validation ValidationFrame, ValidationResult
error SapError

Core Types:

// 3D Position
pub struct Position {
    pub x: f32,  // meter
    pub y: f32,
    pub z: f32,
}

// 3D Velocity
pub struct Velocity {
    pub vx: f32,  // m/s
    pub vy: f32,
    pub vz: f32,
}

// Robot State
pub struct RobotState {
    pub robot_id: u64,
    pub position: Position,
    pub velocity: Velocity,
    pub acceleration: Acceleration,
    pub timestamp_ns: u64,
    pub zone_id: u32,
    pub ticket_id: u64,
}

// Global Simulation State
pub struct WorldState {
    pub robots: Vec<RobotState>,           // All Robot States
    pub static_obstacles: Vec<Obstacle>,   // Static Obstacles
    pub dynamic_obstacles: Vec<Obstacle>,  // Dynamic Obstacles
    pub vts_allocations: HashMap<u64, u128>, // VTS Allocations (voxel_id -> robot_id)
    pub timestamp_ns: u64,                 // State Timestamp
}

WorldState represents the global state targeted for restoration during a Rollback. It is saved as a snapshot and used to restore the previous state upon network synchronization failure.

5.2 L2: Physics Layer (sap-physics)

Purpose: Physics-based command verification and collision prediction.

Key Components:

Component Function
PhysicsValidator Comprehensive command validation (OK/ADJUST/REJECT)
KinematicsChecker Velocity/Acceleration/Jerk limit checks
CollisionPredictor Collision prediction and path safety checks
CommandGate Policy-based command filtering

Validation Result:

pub enum ValidationResult {
    OK,      // Command Allowed
    ADJUST,  // Allowed after adjustment
    REJECT,  // Command Rejected (Dangerous)
}

Behavior on ADJUST:

When ADJUST results, an AdjustedCommand structure is returned to provide a safe alternative command:

pub struct AdjustedCommand {
    pub adjusted_velocity: f32,          // Adjusted linear velocity (m/s)
    pub adjusted_angular_velocity: f32,  // Adjusted angular velocity (rad/s)
    pub adjusted_acceleration: f32,      // Adjusted acceleration (m/s²)
    pub scale_factor: f32,               // Adjustment Ratio (0.0~1.0)
    pub adjustment_note: Option<String>, // Reason for adjustment
}

Adjustment Strategies:

  • Velocity Scaling: Multiply scale_factor to original velocity (e.g., 80% deceleration)
  • Clamping: Limit to maximum values if physics limits exceeded
  • Partial Allowance: Maintain direction but adjust velocity only

Usage Example:

Original Command: velocity=6.0 m/s (Exceeds max 5.0 m/s)
→ Returns ADJUST
→ AdjustedCommand { adjusted_velocity: 5.0, scale_factor: 0.83 }
→ Robot executes with adjusted 5.0 m/s

Physics Limits (Defaults):

Limit Value Unit
Max Velocity 5.0 m/s
Max Acceleration 3.0 m/s²
Max Jerk 10.0 m/s³
Collision Radius 0.5 m

VehicleProfile

Defines kinematic characteristics per robot drive type.

Supported Robot Types:

Type Description Features
Differential Differential Drive (Default) Rotate in place, no lateral movement
Ackermann Ackermann Steering (Car-like) Min turning radius, no rotation in place
Mecanum Mecanum Wheel Omnidirectional, supports strafing
Omnidirectional Holonomic Fully omnidirectional, independent rotation/movement
Tracked Tracked Rough terrain, slip during rotation
pub struct VehicleProfile {
    pub vehicle_type: VehicleType,
    pub kinematics: KinematicsParams,
    pub width: f32,              // Robot Width (m)
    pub length: f32,             // Robot Length (m)
    pub height: f32,             // Robot Height (m)
    pub safety_margin: f32,      // Safety Margin (m)
}

pub struct KinematicsParams {
    pub max_velocity: f32,              // Max Linear Velocity (m/s)
    pub max_acceleration: f32,          // Max Acceleration (m/s²)
    pub max_deceleration: f32,          // Max Deceleration (m/s²)
    pub max_angular_velocity: f32,      // Max Angular Velocity (rad/s)
    pub max_angular_acceleration: f32,  // Max Angular Acceleration (rad/s²)
    pub max_jerk: f32,                  // Max Jerk (m/s³)
    pub min_turning_radius: f32,        // Min Turning Radius (m)
}

Preset Profiles:

  • VehicleProfile::amr() - Autonomous Mobile Robot (Differential, 2.0 m/s)
  • VehicleProfile::agv() - Automated Guided Vehicle (Ackermann, 1.5 m/s, 2m turning radius)
  • VehicleProfile::mecanum() - Mecanum Wheel (Mecanum, 1.2 m/s, strafing supported)

Usage: Apply physics verification parameters differentially by robot type for accurate motion modeling.

5.2.1 Recovery Levels

For Physical Recovery, 4 levels of RecoveryCommand are used:

Level Name Priority Scenario Resumable Stop Distance*
L0 EmergencyStop Highest • Collision Imminent (< 0.5m)
• Safety Risk Detected
• Sensor Failure
v²/(2×5.0)
L1 SafeDeceleration High • Pred Error Exceeded (> 0.10m)
• Rollback occur
• VTS Reallocation needed
v²/(2×3.0)
L2 SafeHold Medium • Ticket Expiry Wait
• Zone Border Wait
• Auction in progress
Current Position
L3 PathReplanning Low • Dynamic Obstacle Avoidance
• Better Path Found
• Bypass Congestion
v²/(2×1.5)

* Stop Distance Formula: d = v²/(2a), v=current speed, a=deceleration

Recovery Command Trigger Conditions:

┌──────────────────────────────────────────┐
│        RecoveryLevel Selection            │
├──────────────────────────────────────────┤
│                                          │
│  Collision Pred (TTC < 1s)                │
│    └─→ RecoveryCommand::EmergencyStop    │
│                                          │
│  Rollback Occur (PredictiveSync Error)    │
│    └─→ RecoveryCommand::SafeDeceleration │
│                                          │
│  Ticket Expiry Alert (10s before)         │
│    └─→ RecoveryCommand::SafeHold         │
│                                          │
│  Dynamic Obstacle (Human, non-SAP robot)  │
│    └─→ RecoveryCommand::PathReplanning   │
│                                          │
└──────────────────────────────────────────┘

RecoveryCommand Structure:

pub struct RecoveryCommand {
    pub robot_id: u64,                  // Target Robot
    pub level: RecoveryLevel,           // Recovery Level
    pub target_position: Option<Position>, // Target Position (L2, L3)
    pub target_velocity: Velocity,      // Target Velocity (Usually 0)
    pub max_deceleration: f32,          // Max Deceleration (m/s²)
    pub allow_resume: bool,             // Resumable after recovery
    pub reason_code: u32,               // Reason Code
    pub timestamp_ns: u64,              // Issue Time
}

Usage Examples:

// 1. Collision Imminent - Emergency Stop
let cmd = RecoveryCommand::emergency_stop(
    robot_id: 42,
    max_decel: 5.0,
    timestamp_ns: now()
);

// 2. Rollback Occurred - Safe Deceleration
let cmd = RecoveryCommand::safe_deceleration(
    robot_id: 42,
    max_decel: 3.0,
    timestamp_ns: now()
).with_reason(ROLLBACK_PREDICTION_ERROR);

// 3. Ticket Expiry - Safe Hold
let cmd = RecoveryCommand::safe_hold(
    robot_id: 42,
    position: current_pos,
    timestamp_ns: now()
);

// 4. Path Replanning - New Target
let cmd = RecoveryCommand::path_replanning(
    robot_id: 42,
    new_target: alternative_pos,
    timestamp_ns: now()
);

Recovery Procedure Sequence:

Edge                    Robot                   Safety Layer
 │                       │                           │
 │  RollbackFrame        │                           │
 ├──────────────────────►│                           │
 │  (safe_trajectory)    │                           │
 │                       │  RecoveryCommand          │
 │                       ├──────────────────────────►│
 │                       │  (L1: SafeDeceleration)   │
 │                       │                           │
 │                       │  Start Safe Deceleration  │
 │                       │◄──────────────────────────┤
 │                       │                           │
 │  RecoveryResult       │  Stop Completed           │
 │◄──────────────────────┤◄──────────────────────────┤
 │  (success=true)       │                           │
 │                       │                           │
 │  safe_trajectory      │  Follow Recovery Trajectory│
 │  Execution Order       ├──────────────────────────►│
 ├──────────────────────►│                           │
 │                       │  Reached Normal State     │
 │  Confirm Recovery      │◄──────────────────────────┤
 │◄──────────────────────┤                           │
 │                       │  Resume Operation         │
 │                       ├──────────────────────────►│

Important: RecoveryCommand is for identifying safe physical control of the robot. It performs complete recovery when used with logical state restoration of RollbackFrame.

5.3 L3: Network Layer (sap-network)

Purpose: Distributed system synchronization and failure recovery.

Key Components:

Component Function
StateComparator Compare predicted vs actual state
RollbackManager Snapshot-based state rollback
FailsafeManager Failure detection and mode switching

Sync Result:

pub enum SyncResult {
    InSync,         // Synced
    Warning,        // Warning (Error increasing)
    NeedsRollback,  // Rollback Needed
}

Operation Modes:

pub enum OperationMode {
    Normal,     // Normal Operation
    Degraded,   // Degraded Mode
    Emergency,  // Emergency Stop Mode
}

5.4 L4: Economy Layer (sap-economy)

Purpose: Economic allocation of spatio-temporal resources.

Key Components:

Component Function
VickreyAuction Second-price sealed-bid auction
PricingEngine Demand-based dynamic pricing
TicketManager Ticket issuance/verification/expiry management

Auction Flow:

1. Collect Bids: submit_bid(robot_id, vts_id, amount)
2. Auction Close: settle(vts_id, timestamp)
3. Return Result: AuctionResult { winner_id, winning_price }
4. Issue Ticket: issue_ticket(winner_id, vts_id)

Pricing Factors:

Factor Weight Description
Base Price 1.0x Base price for section
Demand Factor 1.0~2.0x Recent request frequency
Time Factor 0.8~1.5x Time-based congestion

5.5 L5: Cloud Layer (sap-cloud)

Purpose: Global state aggregation and Cross-Zone coordination.

Key Components:

Component Function
VtsAllocator Global VTS allocation/conflict resolution
GlobalStateAggregator Zone state aggregation/monitoring

VTS Allocation Rules:

  1. No Spatio-temporal Conflict: Prohibit overlapping voxel_id + time
  2. Zone Limits: Limit max concurrent allocations per Zone
  3. Auto-Release on Expiry: Automatically return upon validity expiration

6. Core Algorithms

6.1 Vickrey Auction Algorithm

Algorithm: VickreyAuction

Input: bids = [(robot_id, amount), ...]
Output: AuctionResult { winner_id, winning_price }

1. Sort bids in descending order by amount
2. if bids.len() == 0:
      return None  // No bids
3. if bids.len() == 1:
      winner = bids[0]
      price = min_bid  // Minimum bid price
4. else:
      winner = bids[0]  // Highest bidder
      price = bids[1].amount  // Second price
5. return AuctionResult { winner.robot_id, price }

Characteristics:

  • Time Complexity: O(n log n) (Sorting)
  • Incentive Compatibility: Honest bidding is optimal strategy
  • Pareto Efficiency: Value-maximizing allocation

6.2 Dynamic Pricing Algorithm

Algorithm: DynamicPricing

Input: vts_id, timestamp, base_price, demand_history
Output: PriceQuote { price, valid_until }

1. demand_factor = calculate_demand(vts_id, demand_history)
   // Based on recent 5 min requests
   // Range: 1.0 ~ 2.0
   
2. time_factor = calculate_time_sensitivity(timestamp)
   // Peak time: 1.5x
   // Off-peak: 0.8x
   
3. price = base_price × demand_factor × time_factor

4. return PriceQuote { price, valid_until: timestamp + 5s }

6.3 PredictiveSync Algorithm

Algorithm: PredictiveSync

Input: robot_id, predicted_state, actual_state
Output: SyncResult

1. position_delta = |predicted.position - actual.position|
2. velocity_delta = |predicted.velocity - actual.velocity|

3. if position_delta < 0.10m AND velocity_delta < 0.1m/s:
      return InSync
4. else if position_delta < 0.20m:
      return Warning
5. else:
      return NeedsRollback

6.4 Rollback Algorithm

Algorithm: Rollback

Input: robot_id, current_tick, reason
Output: RollbackFrame

1. // Cooldown Check
   if last_rollback[robot_id] + cooldown > current_tick:
      return Error(CooldownActive)

2. // Consecutive limit
   if consecutive_count[robot_id] >= max_consecutive:
      return Error(ConsecutiveLimitExceeded)

3. // Find Snapshot
   snapshot = find_latest_snapshot(current_tick)
   if snapshot is None:
      return Error(NoSnapshotAvailable)

4. // Create Rollback Frame
   frame = RollbackFrame {
      rollback_tick: snapshot.tick,
      target_tick: current_tick,
      world_state: snapshot.state,
      reason,
   }

5. // Update Counters
   consecutive_count[robot_id] += 1
   last_rollback[robot_id] = current_tick

6. return Ok(frame)

6.5 Collision Prediction Algorithm

Algorithm: CollisionPrediction

Input: robot_state, obstacles[], prediction_horizon
Output: CollisionRisk { min_distance, time_to_collision }

1. trajectory = predict_trajectory(robot_state, prediction_horizon)
   // Physics-based path extrapolation

2. min_distance = ∞
   time_to_collision = None

3. for obstacle in obstacles:
      for t in 0..prediction_horizon:
         robot_pos = trajectory[t]
         obstacle_pos = obstacle.predict(t)
         distance = |robot_pos - obstacle_pos|
         
         if distance < min_distance:
            min_distance = distance
            
         if distance < collision_threshold:
            time_to_collision = t
            break

4. return CollisionRisk { min_distance, time_to_collision }

7. Technology Stack

7.1 Programming Languages

Language Usage Version
Rust Core Runtime 1.75+

Reason for Rust:

  • Memory Safety (Ownership system)
  • Zero-cost Abstractions
  • no_std support (Embedded)
  • Rich Type System

7.2 Core Dependencies

Crate Version Usage
serde 1.0 Serialization/Deserialization
bincode 1.3 Binary Encoding
thiserror 1.0 Error Types definition
tracing 0.1 Structured Logging

7.3 Development Tools

Tool Usage
cargo Build/Dependency Management
clippy Linter
rustfmt Code Formatting
criterion Benchmark
cargo-audit Security Audit

7.4 CI/CD

Workflow Trigger Function
rust-ci.yml push/PR Build + Test + Clippy
security-audit.yml weekly Dependency Vulnerability Check
documentation.yml push main rustdoc deployment

8. API Specifications

8.1 EdgeRuntime API

impl EdgeRuntime {
    /// Create new runtime
    pub fn new(zone_id: u32) -> Self;
    
    /// Advance tick
    pub fn tick(&mut self, timestamp_ns: u64);
    
    /// Process command
    pub fn process_command(&mut self, cmd: &MotionCommand, timestamp_ns: u64) -> CommandResult;
    
    /// Check synchronization
    pub fn check_sync(&mut self, robot_id: u64, position_delta: f32, timestamp_ns: u64) -> SyncCheckResult;
    
    /// Submit bid
    pub fn submit_bid(&mut self, robot_id: u64, vts_id: u64, amount: u64, timestamp_ns: u64) -> Result<(), String>;
    
    /// Settle auction
    pub fn settle_auction(&mut self, vts_id: u64, timestamp_ns: u64) -> Option<AuctionResult>;
    
    /// Quote price
    pub fn quote_price(&mut self, vts_id: u64, timestamp_ns: u64) -> u64;
}

8.2 Robot SDK API (sap-robot)

Purpose: Client SDK embedded in robots, communicating with Edge servers to receive spatial allocations and generate motion commands.

RobotStateManager

Core component that tracks and manages robot state.

impl RobotStateManager {
    /// Create new State Manager
    pub fn new(robot_id: u64) -> Self;
    
    /// Create with initial position
    pub fn with_position(robot_id: u64, position: Position) -> Self;
    
    /// Update state from sensors
    pub fn update_from_sensor(
        &mut self,
        position: Position,
        velocity: Velocity,
        timestamp_ns: u64
    );
    
    /// Apply Edge server correction (PredictiveSync)
    pub fn apply_correction(
        &mut self,
        position: Position,
        velocity: Velocity,
        timestamp_ns: u64
    );
    
    /// Local prediction (position after dt)
    pub fn predict(&mut self, dt_ns: u64) -> Position;
    
    /// Compute prediction error (compare with server)
    pub fn compute_prediction_error(&self, server_position: Position) -> f32;
    
    /// Get current state
    pub fn state(&self) -> &RobotState;
    pub fn position(&self) -> Position;
    pub fn velocity(&self) -> Velocity;
    pub fn robot_id(&self) -> u64;
}

Usage Example:

let mut state_mgr = RobotStateManager::new(42);
state_mgr.update_from_sensor(
    Position::new(5.0, 3.0, 0.0),
    Velocity::new(0.5, 0.0, 0.0),
    current_time_ns
);

// Receive correction from server
state_mgr.apply_correction(server_pos, server_vel, current_time_ns);

CommandBuilder

Builder pattern interface for generating motion commands.

impl CommandBuilder {
    /// Create new Command Builder
    pub fn new(robot_id: u64) -> Self;
    
    /// Set velocity
    pub fn with_velocity(self, velocity: Velocity) -> Self;
    
    /// Set acceleration
    pub fn with_acceleration(self, acceleration: Acceleration) -> Self;
    
    /// Set ticket ID
    pub fn with_ticket(self, ticket_id: u128) -> Self;
    
    /// Set priority
    pub fn with_priority(self, priority: u8) -> Self;
    
    /// Convenience method: Move to velocity
    pub fn move_to_velocity(self, vx: f32, vy: f32) -> Self;
    
    /// Convenience method: Stop
    pub fn stop(self) -> Self;
    
    /// Build command
    pub fn build(self, timestamp_ns: u64, sequence: u64) -> RobotCommand;
    
    /// Validate command
    pub fn validate(&self) -> Result<(), CommandError>;
}

Usage Example:

let cmd = CommandBuilder::new(42)
    .with_velocity(Velocity::new(1.0, 0.0, 0.0))
    .with_ticket(12345u128)
    .with_priority(5)
    .build(current_time_ns, sequence);

TicketRequester

Requests and manages VTS tickets.

impl TicketRequester {
    /// Create new Ticket Requester
    pub fn new(robot_id: u64) -> Self;
    
    /// Request VTS allocation (Send to Edge)
    pub fn create_request(
        &mut self,
        zone_id: u32,
        vts_list: Vec<VoxelTimeSlot>,
        priority: u8,
        timestamp_ns: u64
    ) -> u64; // returns request_id
    
    /// Receive ticket from Edge
    pub fn receive_ticket(&mut self, request_id: u64, ticket: TransitTicket) -> bool;
    
    /// Get valid ticket
    pub fn get_valid_ticket(&self, current_time_ns: u64) -> Option<&TransitTicket>;
    
    /// Check if specific ticket is valid
    pub fn is_ticket_valid(&self, ticket_id: u128, current_time_ns: u64) -> bool;
    
    /// Cleanup expired tickets
    pub fn cleanup_expired(&mut self, current_time_ns: u64) -> usize;
    
    /// Cancel request
    pub fn cancel_request(&mut self, request_id: u64) -> bool;
    
    /// Statistics
    pub fn active_ticket_count(&self) -> usize;
    pub fn pending_request_count(&self) -> usize;
}

Usage Example:

let mut requester = TicketRequester::new(42);
let request_id = requester.create_request(
    zone_id,
    vec![vts1, vts2],
    priority,
    current_time_ns
);

// Receive response from Edge
requester.receive_ticket(request_id, ticket);

8.3 Physvisor API (sap-physvisor)

Purpose: Intermediate layer service responsible for Zone management and multi-robot simulation.

ZoneManager

Manages Zone boundaries and tracks robot Zone assignments.

impl ZoneManager {
    /// Create new Zone Manager
    pub fn new() -> Self;
    
    /// Add Zone
    pub fn add_zone(&mut self, boundary: ZoneBoundary);
    
    /// Get Zone
    pub fn get_zone(&self, zone_id: u32) -> Option<&ZoneBoundary>;
    
    /// Find Zone by position
    pub fn find_zone_for_position(&self, pos: Position) -> Option<u32>;
    
    /// Update robot's Zone
    pub fn update_robot_zone(&mut self, robot_id: u64, pos: Position) -> Option<u32>;
    
    /// Get robot's Zone
    pub fn get_robot_zone(&self, robot_id: u64) -> Option<u32>;
    
    /// List robots in Zone
    pub fn robots_in_zone(&self, zone_id: u32) -> Vec<u64>;
    
    /// Statistics
    pub fn zone_count(&self) -> usize;
    pub fn robot_count(&self) -> usize;
    
    /// Remove robot
    pub fn remove_robot(&mut self, robot_id: u64) -> bool;
}

Usage Example:

let mut zone_mgr = ZoneManager::new();
zone_mgr.add_zone(ZoneBoundary::new(1, 0.0, 10.0, 0.0, 10.0));

// Determine Zone by robot position
let zone_id = zone_mgr.find_zone_for_position(Position::new(5.0, 5.0, 0.0));

SimulationEngine

Predicts future collisions using physics simulation.

impl SimulationEngine {
    /// Create new Simulation Engine
    pub fn new(max_robots: usize) -> Self;
    
    /// Create with default config (100 robots)
    pub fn with_default_config() -> Self;
    
    /// Add Zone
    pub fn add_zone(&mut self, zone_id: u32, min_x: f32, max_x: f32, min_y: f32, max_y: f32);
    
    /// Register robot
    pub fn register_robot(&mut self, robot_id: u64) -> bool;
    
    /// Update robot state
    pub fn update_robot(&mut self, robot_id: u64, position: Position, velocity: Velocity);
    
    /// Execute 1 tick simulation (Collision Prediction)
    pub fn step(&mut self) -> SimulationResult;
    
    /// Get robot position
    pub fn get_position(&self, robot_id: u64) -> Option<Position>;
    
    /// Statistics
    pub fn robot_count(&self) -> usize;
    pub fn current_tick(&self) -> u64;
    pub fn zone_manager(&self) -> &ZoneManager;
}

Usage Example:

let mut sim = SimulationEngine::with_default_config();
sim.add_zone(1, 0.0, 10.0, 0.0, 10.0);
sim.register_robot(42);
sim.update_robot(42, position, velocity);

let result = sim.step();
if result.has_collision() {
    // Handle collision warning
}

RobotRegistry

Registers active robots and tracks their state.

impl RobotRegistry {
    /// Create new Registry
    pub fn new(max_robots: usize) -> Self;
    
    /// Create with default capacity (1000 robots)
    pub fn with_default_capacity() -> Self;
    
    /// Register robot
    pub fn register(&mut self, robot_id: u64) -> Result<(), RegistryError>;
    
    /// Unregister robot
    pub fn unregister(&mut self, robot_id: u64) -> bool;
    
    /// Update robot state
    pub fn update_state(
        &mut self,
        robot_id: u64,
        position: Position,
        velocity: Velocity,
        timestamp_ns: u64
    );
    
    /// Get robot state
    pub fn get_state(&self, robot_id: u64) -> Option<&RobotState>;
    pub fn get_position(&self, robot_id: u64) -> Option<Position>;
    
    /// Get all robots
    pub fn get_all_robots(&self) -> Vec<u64>;
    
    /// Get robots in radius
    pub fn get_robots_in_radius(&self, center: Position, radius: f32) -> Vec<u64>;
    
    /// Statistics
    pub fn count(&self) -> usize;
    pub fn is_registered(&self, robot_id: u64) -> bool;
}

Usage Example:

let mut registry = RobotRegistry::with_default_capacity();
registry.register(42)?;
registry.update_state(42, position, velocity, current_time_ns);

// Find robots within 5m radius
let nearby = registry.get_robots_in_radius(center, 5.0);

8.4 VickreyAuction API

impl VickreyAuction {
    /// Create new Auction
    pub fn with_default_config() -> Self;
    
    /// Submit bid
    pub fn submit_bid(&mut self, bid: BidEntry) -> Result<(), AuctionError>;
    
    /// Settle auction
    pub fn settle(&mut self, vts_id: u64, timestamp_ns: u64) -> Option<AuctionResult>;
}

9. Data Structures

9.1 Packet Formats

DeltaTickPacket

#[repr(C)]
pub struct DeltaTickPacket {
    pub header: PacketHeader,   // 12 bytes
    pub tick: u64,              // 8 bytes
    pub delta_count: u16,       // 2 bytes
    pub checksum: u32,          // 4 bytes
    // Total: 26 bytes header
}

RollbackFrame

pub struct RollbackFrame {
    pub frame_id: u64,
    pub rollback_tick: u64,
    pub target_tick: u64,
    pub zone_id: u32,
    pub robot_id: u64,
    pub reason: RollbackReason,
    pub world_state: WorldState,
    pub tos_sig: Vec<u8>,  // 64-byte signature
}

9.2 Message Formats

Bid Message

{
  "type": "BID",
  "robot_id": 42,
  "vts_id": 100,
  "amount_milli": 500000,
  "timestamp_ns": 1701961200000000000
}

AuctionResult Message

{
  "type": "AUCTION_RESULT",
  "vts_id": 100,
  "winner_id": 42,
  "winning_price": 400000,
  "settle_timestamp_ns": 1701961260000000000
}

10. Security and Trust

10.1 Trust Model

SAP uses a Hierarchical Trust Model:

Layer Trust Level Verification Method
Cloud Highest Digital Signature
Edge High Certificate Based
Robot Limited Ticket Verification

10.2 Security Mechanisms

Mechanism Purpose
TOS Signature Prevent ticket forgery
Packet Checksum Data integrity
Timestamp Validation Prevent Replay Attacks
Zone Isolation Privilege separation

10.3 Physical Safety

Safety Measure Description
Physics Verification Verify all commands with physics laws
REJECT → Stop Immediate stop on dangerous command
Collision Prediction Pre-emptive path avoidance
Failsafe Mode Switch to safe state on failure

11. Time Synchronization Model

11.1 Time Standard

SAP operates based on Unix Nanosecond Timestamps.

Timestamp Format:

  • Unit: Nanosecond (10^-9 sec)
  • Base: Unix Epoch (1970-01-01 00:00:00 UTC)
  • Type: u64 (Can represent approx. 584 years)

11.2 Clock Skew Tolerance

Definition: Clock Skew is the difference in time between different nodes.

Allowed Skew Calculation Formula

The maximum allowable clock skew in SAP cannot exceed half of the VTS time resolution:

max_skew < (voxel_size_m / v_max_ms) / 2

Rationale:

  • VTS Time Slot = voxel_size / v_max (Min time for robot to pass a voxel)
  • If skew exceeds half of the slot, adjacent VTS collision is possible
  • Safety factor of 2 applied

Domain Examples:

Domain voxel_size v_max VTS Slot max_skew Recommended Sync
WAREHOUSE 1.0m 2.5 m/s 400ms 200ms NTP
FAB 0.5m 0.8 m/s 625ms 312ms PTP
HOSPITAL 0.8m 1.0 m/s 800ms 400ms NTP

Important: For FAB environments, PTP is recommended due to high precision requirements. NTP is sufficient for WAREHOUSE/HOSPITAL.

11.3 Time Synchronization Protocols

SAP supports two synchronization protocols:

PTP (Precision Time Protocol) Profile

IEEE 1588 based High Precision Sync

[time_sync.ptp]
protocol = "IEEE1588-2008"
profile = "Default"  # or "Industry", "Power"
domain = 0
priority1 = 128
sync_interval_log2 = -3  # 125ms (2^-3)
announce_interval_log2 = 1  # 2s
delay_req_interval_log2 = 0  # 1s

Features:

  • Accuracy: ±100ns ~ ±1μs (Sub-microsecond)
  • Requirements:
    • NIC supporting PTP hardware timestamping
    • IEEE 1588 Switch (Transparent Clock or Boundary Clock)
  • Applicable Environment: FAB (Semiconductor), High-precision manufacturing

Pros:

  • Extreme precision
  • Deterministic latency

Cons:

  • High hardware requirements
  • Increased cost

NTP (Network Time Protocol) Profile

RFC 5905 based Standard Sync

[time_sync.ntp]
protocol = "NTPv4"
server_pool = ["0.pool.ntp.org", "1.pool.ntp.org"]
poll_interval_s = 64  # 64s
max_poll_interval_s = 1024  # approx 17 min
min_poll_interval_s = 16  # 16s

Features:

  • Accuracy: ±1ms ~ ±10ms (Millisecond level)
  • Requirements:
    • Internet connection or local NTP server
    • Standard network equipment
  • Applicable Environment: WAREHOUSE, HOSPITAL, General Logistics

Pros:

  • Low hardware requirements
  • Simple implementation

Cons:

  • Affected by network jitter
  • Millisecond level accuracy

11.4 Profile Selection Guide

┌──────────────────────────────────────────┐
│        Time Sync Protocol Selection       │
├──────────────────────────────────────────┤
│                                          │
│  max_skew < 10ms?                        │
│      ├─ YES → PTP Required               │
│      └─ NO  → NTP Possible               │
│                                          │
│  PTP Hardware Available?                 │
│      ├─ YES → PTP Recommended            │
│      └─ NO  → NTP                        │
│                                          │
│  Cost Sensitive?                          │
│      ├─ YES → NTP                        │
│      └─ NO  → PTP (Precision first)      │
│                                          │
└──────────────────────────────────────────┘

Recommended Mapping:

  • FAB (max_skew=312ms, actual need ±1ms): PTP
  • WAREHOUSE (max_skew=200ms): NTP (±10ms sufficient)
  • HOSPITAL (max_skew=400ms): NTP

11.5 Timestamp Validation

SAP Edge validates timestamps of received commands as follows:

fn validate_timestamp(cmd_timestamp_ns: u64, server_time_ns: u64, max_skew_ns: u64) -> bool {
    let diff = if cmd_timestamp_ns > server_time_ns {
        cmd_timestamp_ns - server_time_ns
    } else {
        server_time_ns - cmd_timestamp_ns
    };
    
    diff < max_skew_ns
}

Behavior on Validation Failure:

  • Timestamp difference > max_skew → TimestampOutOfBounds Error
  • Reject command and request time resynchronization to robot

11.6 Implementation Recommendations

  1. Robot SDK:

    • Use monotonic clock instead of system clock
    • Track timestamp offset with Edge
    • Periodic offset correction (every 60s)
  2. Edge Server:

    • Ensure NTP/PTP daemon is running
    • Monitor inter-server time synchronization
    • Alarm on max_skew exceed
  3. Testing:

    • Intentional clock skew injection test
    • Sync loss recovery scenarios
    • Measure Edge-Robot timestamp drift

12. Performance Specifications

12.1 Target Performance

Metric Target Condition
Command Latency < 20ms Within Edge
Sync Latency < 50ms Edge-Cloud
Auction Settle Latency < 100ms 100 bids
Throughput > 1,000 cmd/s Per Zone
Availability 99.9% Including failure response

12.2 Scalability

Dimension Scaling Method
Zone Count Horizontal Scale (Add Edge)
Robots per Zone Vertical Scale (Edge Spec Up)
Global Cloud Sharding

12.3 Benchmark Results (Reference)

EdgeRuntime::process_command
  - 1 robot:   ~1,500 ops/sec
  - 10 robots: ~12,000 ops/sec
  - 100 robots: ~80,000 ops/sec

SimulationEngine::step
  - 10 robots:  < 1ms
  - 100 robots: < 5ms
  - 500 robots: < 25ms

12.4 Time Sync Requirements Summary

SAP requires precise time synchronization.

Clock Skew Tolerance:

max_skew < (voxel_size / v_max) / 2
Environment voxel_size v_max max_skew
WAREHOUSE 1.0m 2.5 m/s < 200ms
FAB 0.5m 0.8 m/s < 312ms
HOSPITAL 0.8m 1.0 m/s < 400ms

Sync Protocols:

Protocol Accuracy Environment
PTP (IEEE 1588) < 1μs FAB, High-precision
NTP < 10ms WAREHOUSE, General
GPS Time < 100ns Outdoor, Port

13. Appendix

13.1 Glossary

Term Definition
AMR Autonomous Mobile Robot
VTS VoxelTimeSlot, Spatio-temporal slot
S-MEV Space MEV, Space Maximal Extractable Value
Edge Distributed processing node per Zone
Physvisor Physics Supervisor

13.2 References

  1. Vickrey, W. (1961). "Counterspeculation, Auctions, and Competitive Sealed Tenders"
  2. Lamport, L. (1978). "Time, Clocks, and the Ordering of Events in a Distributed System"
  3. IEEE 1588-2019: Precision Time Protocol (PTP)

13.3 License

Apache License 2.0

Copyright 2025 SpaceAI Team

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

13.4 Version History

Version Date Changes
2.3 2025-12-10 Performance verified, benchmarks added, 95% production ready
2.1 2025-12-10 Added Rollback, Dynamic Horizon, Time Sync Model
2.0 2025-12-07 Initial Integrated Specification

13.5 Verification Status

Tests: 226 (100% Pass) ✅
Benchmarks: 7 (All complete) ✅
Demo: Warehouse (20/20 tasks complete) ✅
Scalability: 500-1000 robots verified ✅
Production Readiness: 95% 🚀


End of Document