Skip to main content

Simulation vs Presentation

This page explores a fundamental pattern shared between game engines and MonoTerm’s terminal architecture: separating the β€œtruth” (simulation/state) from its β€œpresentation” (rendering/display).

The Core Insight

╔═══════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  "THE WORLD DOESN'T STOP JUST BECAUSE YOU BLINKED"                    β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  In games:                                                             β•‘
β•‘  * The ball keeps moving even if the screen can't show every position β•‘
β•‘  * Physics simulation is the TRUTH                                     β•‘
β•‘  * Rendered frames are just SNAPSHOTS of that truth                   β•‘
β•‘                                                                        β•‘
β•‘  In terminals:                                                         β•‘
β•‘  * Characters keep arriving even if the screen can't show every updateβ•‘
β•‘  * Grid state is the TRUTH                                             β•‘
β•‘  * Screen updates are just SNAPSHOTS of that truth                    β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  THE PATTERN:                                                          β•‘
β•‘                                                                        β•‘
β•‘       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘       β”‚                                                           β”‚   β•‘
β•‘       β”‚   SIMULATION (Backend)          PRESENTATION (Frontend)   β”‚   β•‘
β•‘       β”‚   ====================          ======================    β”‚   β•‘
β•‘       β”‚                                                           β”‚   β•‘
β•‘       β”‚   * Runs continuously           * Runs when possible      β”‚   β•‘
β•‘       β”‚   * Never skips                 * May skip/delay          β”‚   β•‘
β•‘       β”‚   * Is the "truth"              * Shows the "truth"       β”‚   β•‘
β•‘       β”‚   * Deterministic               * Best-effort             β”‚   β•‘
β•‘       β”‚                                                           β”‚   β•‘
β•‘       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Game Engine Frame Management

The Fixed Timestep Pattern

╔═══════════════════════════════════════════════════════════════════════╗
β•‘  GAME ENGINE: PHYSICS vs RENDERING                                     β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  TIME ───────────────────────────────────────────────────────────▢  β•‘
β•‘                                                                        β•‘
β•‘  PHYSICS (Fixed 60Hz - NEVER skips):                                   β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β•‘
β•‘  β”‚ P1 β”‚ β”‚ P2 β”‚ β”‚ P3 β”‚ β”‚ P4 β”‚ β”‚ P5 β”‚ β”‚ P6 β”‚ β”‚ P7 β”‚ β”‚ P8 β”‚ β”‚ P9 β”‚ β”‚P10 β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β•‘
β•‘    β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚   β•‘
β•‘    v      v      v      v      v      v      v      v      v      v   β•‘
β•‘  16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6msβ•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  RENDERING (Variable - MAY skip):                                      β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”               β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β” β•‘
β•‘  β”‚ R1 β”‚ β”‚ R2 β”‚        β”‚ R4 β”‚               β”‚ R7 β”‚ β”‚ R8 β”‚        β”‚R10 β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”˜               β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”˜ β•‘
β•‘    β”‚      β”‚      ^      β”‚      ^      ^      β”‚      β”‚      ^      β”‚   β•‘
β•‘    β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚   β•‘
β•‘    β”‚      β”‚   SKIP!     β”‚   SKIP!  SKIP!     β”‚      β”‚   SKIP!     β”‚   β•‘
β•‘    β”‚      β”‚   (GPU      β”‚   (GPU busy)       β”‚      β”‚   (GPU      β•‘
β•‘    β”‚      β”‚    busy)    β”‚                    β”‚      β”‚    busy)    β”‚   β•‘
β•‘    v      v             v                    v      v             v   β•‘
β•‘                                                                        β•‘
β•‘  WHAT USER SEES:                                                       β•‘
β•‘                                                                        β•‘
β•‘  Frame 1 ──▢ Frame 2 ───────────▢ Frame 4 ────────────▢ Frame 7 ──▢ ...β•‘
β•‘                        β”‚                      β”‚                        β•‘
β•‘                   Interpolated           Interpolated                  β•‘
β•‘                   (smooth jump)          (smooth jump)                 β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

The Spiral of Death

Why clamping is essential to prevent infinite loops.
╔═══════════════════════════════════════════════════════════════════════╗
β•‘  THE SPIRAL OF DEATH: Why Clamping is Essential                        β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  WITHOUT CLAMP:                                                        β•‘
β•‘                                                                        β•‘
β•‘     Frame takes 200ms (huge lag spike)                                 β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     Need 12 physics steps to catch up!                                 β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     12 steps take 100ms...                                             β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     Now still behind!                                                  β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     INFINITE LOOP - GAME FREEZES                                       β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  WITH CLAMP (max 250ms):                                               β•‘
β•‘                                                                        β•‘
β•‘     Frame takes 500ms                                                  β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     Clamp to 250ms                                                     β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     250ms of simulation SKIPPED (acknowledged loss)                    β•‘
β•‘           β”‚                                                            β•‘
β•‘           v                                                            β•‘
β•‘     Game continues from new baseline                                   β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  PHILOSOPHY:                                                           β•‘
β•‘                                                                        β•‘
β•‘     "It's better to lose some simulation time than to freeze forever"  β•‘
β•‘                                                                        β•‘
β•‘     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘     β”‚  RECOVERABLE          vs          UNRECOVERABLE               β”‚ β•‘
β•‘     β”‚  ────────────                      ─────────────               β”‚ β•‘
β•‘     β”‚  Skip 250ms of physics             Infinite freeze loop       β”‚ β•‘
β•‘     β”‚  User notices a "jump"             Game is dead               β”‚ β•‘
β•‘     β”‚  Game continues                    Must force quit            β”‚ β•‘
β•‘     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

MonoTerm ACK Gate Pattern

The terminal equivalent of game frame management.
╔═══════════════════════════════════════════════════════════════════════╗
β•‘  MONOTERM: VTE PARSING vs GRID UPDATES                                 β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  TIME ───────────────────────────────────────────────────────────▢  β•‘
β•‘                                                                        β•‘
β•‘  VTE PARSING (Continuous - NEVER stops):                               β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β•‘
β•‘  β”‚ V1 β”‚ β”‚ V2 β”‚ β”‚ V3 β”‚ β”‚ V4 β”‚ β”‚ V5 β”‚ β”‚ V6 β”‚ β”‚ V7 β”‚ β”‚ V8 β”‚ β”‚ V9 β”‚ β”‚V10 β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β•‘
β•‘    β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚      β”‚   β•‘
β•‘    v      v      v      v      v      v      v      v      v      v   β•‘
β•‘  Parse  Parse  Parse  Parse  Parse  Parse  Parse  Parse  Parse  Parse β•‘
β•‘  "ls"   "-la"  "\n"   "foo"  "bar"  ...    ...    ...    ...    ...   β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  GRID UPDATES (ACK-gated - MAY wait):                                  β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”β•‘
β•‘  β”‚ G1 β”‚ β”‚ G2 β”‚ β–‘WAITβ–‘ β–‘WAITβ–‘ β–‘WAITβ–‘ β”‚   G3 (batched)     β”‚ β”‚ G4 β”‚ β”‚ G5 β”‚β•‘
β•‘  β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜β•‘
β•‘    β”‚      β”‚                                   β”‚              β”‚      β”‚  β•‘
β•‘    β”‚      β”‚      ^       ^       ^            β”‚              β”‚      β”‚  β•‘
β•‘    β”‚      β”‚      β”‚       β”‚       β”‚            β”‚              β”‚      β”‚  β•‘
β•‘    β”‚      β”‚   waiting_for_ack = true          β”‚              β”‚      β”‚  β•‘
β•‘    β”‚      β”‚   (Frontend processing G2)        β”‚              β”‚      β”‚  β•‘
β•‘    v      v                                   v              v      v  β•‘
β•‘  Send   Send                               Send           Send   Send β•‘
β•‘         β”‚                                     β”‚                       β•‘
β•‘         └────── ACK β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       β•‘
β•‘               received!                                               β•‘
β•‘                                                                        β•‘
β•‘  WHAT USER SEES:                                                       β•‘
β•‘                                                                        β•‘
β•‘  Update 1 ──▢ Update 2 ──────────────────▢ Update 3 ──▢ Update 4 ──▢...β•‘
β•‘                               β”‚                                        β•‘
β•‘                          Batched                                       β•‘
β•‘                          (contains V3,V4,V5,V6 changes)                β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Side-by-Side Comparison

The Two Loops

╔═══════════════════════════════════════════════════════════════════════╗
β•‘  GAME LOOP vs TERMINAL LOOP                                            β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β•‘  β”‚         GAME LOOP                 β”‚ β”‚       MONOTERM LOOP           β”‚
β•‘  β”‚                                   β”‚ β”‚                               β”‚
β•‘  β”‚  while (running) {                β”‚ β”‚  while (session_active) {     β”‚
β•‘  β”‚                                   β”‚ β”‚                               β”‚
β•‘  β”‚    // Time management             β”‚ β”‚    // Data management         β”‚
β•‘  β”‚    dt = get_delta_time();         β”‚ β”‚    data = pty.read();         β”‚
β•‘  β”‚    accumulator += dt;             β”‚ β”‚    grid.update(data);         β”‚
β•‘  β”‚                                   β”‚ β”‚                               β”‚
β•‘  β”‚    // Fixed timestep physics      β”‚ β”‚    // Continuous VTE parsing  β”‚
β•‘  β”‚    while (acc >= FIXED_DT) {      β”‚ β”‚    // (always runs)           β”‚
β•‘  β”‚      physics_step(FIXED_DT);      β”‚ β”‚                               β”‚
β•‘  β”‚      acc -= FIXED_DT;             β”‚ β”‚                               β”‚
β•‘  β”‚    }                              β”‚ β”‚                               β”‚
β•‘  β”‚                                   β”‚ β”‚    // ACK-gated sending       β”‚
β•‘  β”‚    // Render when possible        β”‚ β”‚    if (!waiting_for_ack) {    β”‚
β•‘  β”‚    alpha = acc / FIXED_DT;        β”‚ β”‚      send_grid_update();      β”‚
β•‘  β”‚    render(interpolate(alpha));    β”‚ β”‚      waiting_for_ack = true;  β”‚
β•‘  β”‚                                   β”‚ β”‚    } else {                   β”‚
β•‘  β”‚                                   β”‚ β”‚      has_pending = true;      β”‚
β•‘  β”‚                                   β”‚ β”‚    }                          β”‚
β•‘  β”‚  }                                β”‚ β”‚  }                            β”‚
β•‘  β”‚                                   β”‚ β”‚                               β”‚
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  KEY INSIGHT: Both patterns solve PRODUCER-CONSUMER synchronization    β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚  PRODUCER                MEDIATOR               CONSUMER          β”‚ β•‘
β•‘  β”‚  ────────                ────────               ────────          β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚  Game:                                                            β”‚ β•‘
β•‘  β”‚  Physics    ───────▢    Accumulator    ───────▢    Renderer       β”‚ β•‘
β•‘  β”‚  (fixed)               (time storage)             (variable)      β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚  MonoTerm:                                                        β”‚ β•‘
β•‘  β”‚  VTE Parser ───────▢    Grid State     ───────▢    xterm.js       β”‚ β•‘
β•‘  β”‚  (continuous)          (cell storage)             (ACK-gated)     β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Truth vs Presentation

╔═══════════════════════════════════════════════════════════════════════╗
β•‘  "SOURCE OF TRUTH" ARCHITECTURE                                        β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘                                                                        β•‘
β•‘      ╔═══════════════════════════════════════════════════════════════╗ β•‘
β•‘      β•‘                                                               β•‘ β•‘
β•‘      β•‘                    SOURCE OF TRUTH                            β•‘ β•‘
β•‘      β•‘                    ================                           β•‘ β•‘
β•‘      β•‘                                                               β•‘ β•‘
β•‘      β•‘   Game: Physics State          MonoTerm: Grid State           β•‘ β•‘
β•‘      β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β•‘ β•‘
β•‘      β•‘   β”‚ ball.x = 150      β”‚        β”‚ cell[0] = 'A'     β”‚          β•‘ β•‘
β•‘      β•‘   β”‚ ball.y = 200      β”‚        β”‚ cell[1] = 'B'     β”‚          β•‘ β•‘
β•‘      β•‘   β”‚ ball.vx = 5       β”‚        β”‚ cursor = (5,10)   β”‚          β•‘ β•‘
β•‘      β•‘   β”‚ ball.vy = -3      β”‚        β”‚ fg = red          β”‚          β•‘ β•‘
β•‘      β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β•‘ β•‘
β•‘      β•‘         β”‚                            β”‚                        β•‘ β•‘
β•‘      β•‘         β”‚ Always                     β”‚ Always                 β•‘ β•‘
β•‘      β•‘         β”‚ up-to-date                 β”‚ up-to-date             β•‘ β•‘
β•‘      β•‘         β”‚                            β”‚                        β•‘ β•‘
β•‘      ╠═════════β•ͺ════════════════════════════β•ͺ════════════════════════╣ β•‘
β•‘                β”‚                            β”‚                          β•‘
β•‘                v                            v                          β•‘
β•‘      ╔═══════════════════════════════════════════════════════════════╗ β•‘
β•‘      β•‘                                                               β•‘ β•‘
β•‘      β•‘                    PRESENTATION                               β•‘ β•‘
β•‘      β•‘                    ============                               β•‘ β•‘
β•‘      β•‘                                                               β•‘ β•‘
β•‘      β•‘   Game: Rendered Frame         MonoTerm: xterm.js View        β•‘ β•‘
β•‘      β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β•‘ β•‘
β•‘      β•‘   β”‚    o              β”‚        β”‚ $ ls -la          β”‚          β•‘ β•‘
β•‘      β•‘   β”‚      \            β”‚        β”‚ foo  bar  baz     β”‚          β•‘ β•‘
β•‘      β•‘   β”‚       \           β”‚        β”‚                   β”‚          β•‘ β•‘
β•‘      β•‘   β”‚        *          β”‚        β”‚                   β”‚          β•‘ β•‘
β•‘      β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β•‘ β•‘
β•‘      β•‘         β”‚                            β”‚                        β•‘ β•‘
β•‘      β•‘         β”‚ May be                     β”‚ May be                 β•‘ β•‘
β•‘      β•‘         β”‚ outdated                   β”‚ outdated               β•‘ β•‘
β•‘      β•‘         β”‚                            β”‚                        β•‘ β•‘
β•‘      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β•‘
β•‘                                                                        β•‘
β•‘                                                                        β•‘
β•‘  THE KEY PRINCIPLE:                                                    β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   "The presentation is a SNAPSHOT of the truth,                   β”‚ β•‘
β•‘  β”‚    not the truth itself.                                          β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚    Missing a snapshot doesn't change the truth.                   β”‚ β•‘
β•‘  β”‚    The truth continues regardless of whether we can show it."     β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Skip vs Delay vs Batch

Three strategies for handling overwhelming data.
╔═══════════════════════════════════════════════════════════════════════╗
β•‘  HANDLING BACKPRESSURE: THREE APPROACHES                               β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  INPUT:  [A] [B] [C] [D] [E] [F] [G] [H] [I] [J]                       β•‘
β•‘          (10 updates, consumer can only handle 5)                      β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  STRATEGY 1: SKIP (Game Frames)                                        β•‘
β•‘                                                                        β•‘
β•‘  OUTPUT: [A] [B] ─── ─── [E] [F] ─── ─── [I] [J]                       β•‘
β•‘                 ^           ^                                          β•‘
β•‘                 β”‚           β”‚                                          β•‘
β•‘            C,D lost    G,H lost                                        β•‘
β•‘                                                                        β•‘
β•‘  OK Constant latency                                                   β•‘
β•‘  OK Never falls behind                                                 β•‘
β•‘  X  Data permanently lost                                              β•‘
β•‘  X  Requires interpolation for smoothness                              β•‘
β•‘                                                                        β•‘
β•‘  USE WHEN: Visual continuity matters more than exact accuracy          β•‘
β•‘            (games, video, animation)                                   β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  STRATEGY 2: DELAY (Simple Queue)                                      β•‘
β•‘                                                                        β•‘
β•‘  OUTPUT: [A] [B] [C] [D] [E] ... (eventually) ... [F] [G] [H] [I] [J]  β•‘
β•‘                          ^                                             β•‘
β•‘                          β”‚                                             β•‘
β•‘                    Growing delay                                       β•‘
β•‘                                                                        β•‘
β•‘  OK No data loss                                                       β•‘
β•‘  X  Unbounded latency                                                  β•‘
β•‘  X  Can cause memory exhaustion                                        β•‘
β•‘  X  User sees increasingly stale data                                  β•‘
β•‘                                                                        β•‘
β•‘  USE WHEN: Every piece of data is critical and timing doesn't matter  β•‘
β•‘            (file transfers, logging)                                   β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  STRATEGY 3: BATCH (MonoTerm ACK Gate)                                 β•‘
β•‘                                                                        β•‘
β•‘  OUTPUT: [A] [B] [C+D+E+F] [G] [H+I+J]                                 β•‘
β•‘                    ^             ^                                     β•‘
β•‘                    β”‚             β”‚                                     β•‘
β•‘              Batched into    Batched into                              β•‘
β•‘              single update   single update                             β•‘
β•‘                                                                        β•‘
β•‘  OK No data loss                                                       β•‘
β•‘  OK Bounded latency (waits for ACK, not queue)                         β•‘
β•‘  OK Efficient (fewer IPC calls)                                        β•‘
β•‘  OK Latest state always shown                                          β•‘
β•‘                                                                        β•‘
β•‘  USE WHEN: All data matters AND latest state is most important         β•‘
β•‘            (terminals, real-time editors, collaborative tools)         β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Why Terminals Need Batching, Not Skipping

╔═══════════════════════════════════════════════════════════════════════╗
β•‘  WHY TERMINALS CAN'T USE GAME-STYLE FRAME SKIPPING                     β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  GAME:                                                                 β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   Frame 1:  Ball at (100, 100)                                    β”‚ β•‘
β•‘  β”‚   Frame 2:  Ball at (110, 105)  <── SKIPPED                       β”‚ β•‘
β•‘  β”‚   Frame 3:  Ball at (120, 110)  <── SKIPPED                       β”‚ β•‘
β•‘  β”‚   Frame 4:  Ball at (130, 115)  <── SHOWN                         β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   User sees: Ball "jumps" from (100,100) to (130,115)             β”‚ β•‘
β•‘  β”‚   With interpolation: Smooth movement                             β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   IS THIS OK?  OK YES - position (110,105) was just intermediate  β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  TERMINAL:                                                             β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   Update 1:  "$ ls"                                               β”‚ β•‘
β•‘  β”‚   Update 2:  "\n"              <── SKIPPED?                       β”‚ β•‘
β•‘  β”‚   Update 3:  "foo bar"         <── SKIPPED?                       β”‚ β•‘
β•‘  β”‚   Update 4:  "\n$ "            <── SHOWN                          β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   User sees: "$ ls\n$ "                                           β”‚ β•‘
β•‘  β”‚   MISSING: "foo bar" (the actual output!)                         β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   IS THIS OK?  X  NO - "foo bar" is CRITICAL information          β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  THE DIFFERENCE:                                                       β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚          GAME                     β”‚          TERMINAL              β”‚ β•‘
β•‘  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β•‘
β•‘  β”‚ Each frame = position snapshot    β”‚ Each update = NEW information  β”‚ β•‘
β•‘  β”‚ Intermediate frames redundant     β”‚ Every character matters        β”‚ β•‘
β•‘  β”‚ Final position is what counts     β”‚ All characters must be shown   β”‚ β•‘
β•‘  β”‚ Can interpolate between states    β”‚ Cannot "interpolate" charactersβ”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•‘  ════════════════════════════════════════════════════════════════════  β•‘
β•‘                                                                        β•‘
β•‘  MONOTERM SOLUTION:                                                    β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   Batch updates, don't skip them                                  β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   Update 1:  "$ ls"           ──▢ SEND                            β”‚ β•‘
β•‘  β”‚   Update 2:  "\n"             ]                                   β”‚ β•‘
β•‘  β”‚   Update 3:  "foo bar"        ]────▢ BATCH into single update     β”‚ β•‘
β•‘  β”‚   Update 4:  "\n$ "           ]                                   β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚   User sees: Everything, just slightly delayed                    β”‚ β•‘
β•‘  β”‚   Nothing is lost                                                 β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

The Universal Principle

╔═══════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  ╔═══════════════════════════════════════════════════════════════════╗   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•‘   THE SIMULATION-PRESENTATION SEPARATION PRINCIPLE            β•‘   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•‘   ═══════════════════════════════════════════════════════════  β•‘   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•‘   1. Simulation (Backend) owns the TRUTH                      β•‘   β•‘
β•‘  β•‘      - Runs at its own pace                                   β•‘   β•‘
β•‘  β•‘      - Never stops for presentation                           β•‘   β•‘
β•‘  β•‘      - State is always consistent                             β•‘   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•‘   2. Presentation (Frontend) shows SNAPSHOTS                  β•‘   β•‘
β•‘  β•‘      - Runs when resources allow                              β•‘   β•‘
β•‘  β•‘      - May skip, delay, or batch                              β•‘   β•‘
β•‘  β•‘      - Decoupled from simulation timing                       β•‘   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•‘   3. A MEDIATOR absorbs timing differences                    β•‘   β•‘
β•‘  β•‘      - Prevents producer from blocking                        β•‘   β•‘
β•‘  β•‘      - Allows consumer to catch up                            β•‘   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•‘   4. BACKPRESSURE prevents system collapse                    β•‘   β•‘
β•‘  β•‘      - Acknowledges consumer capacity limits                  β•‘   β•‘
β•‘  β•‘      - Gracefully degrades (skip/delay/batch)                 β•‘   β•‘
β•‘  β•‘      - Prevents unbounded queue growth                        β•‘   β•‘
β•‘  β•‘                                                               β•‘   β•‘
β•‘  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•   β•‘
β•‘                                                                        β•‘
β•‘                                                                        β•‘
β•‘  APPLICATIONS OF THIS PRINCIPLE:                                       β•‘
β•‘                                                                        β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β”‚  Domain          β”‚ Simulation      β”‚ Presentation  β”‚ Strategy    β”‚ β•‘
β•‘  β”‚  ────────────────┼──────────────────┼───────────────┼───────────── β”‚ β•‘
β•‘  β”‚  Games           β”‚ Physics engine  β”‚ Renderer      β”‚ Skip+Interp β”‚ β•‘
β•‘  β”‚  Video Streaming β”‚ Source video    β”‚ Player        β”‚ Adaptive    β”‚ β•‘
β•‘  β”‚  Terminals       β”‚ VTE parser      β”‚ Display       β”‚ Batch       β”‚ β•‘
β•‘  β”‚  Real-time DBs   β”‚ Write log       β”‚ Query results β”‚ Snapshot    β”‚ β•‘
β•‘  β”‚  Financial       β”‚ Order book      β”‚ Charts        β”‚ Throttle    β”‚ β•‘
β•‘  β”‚  IoT Sensors     β”‚ Measurements    β”‚ Dashboard     β”‚ Sample      β”‚ β•‘
β•‘  β”‚                                                                   β”‚ β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Summary

╔═══════════════════════════════════════════════════════════════════════╗
β•‘  SUMMARY                                                               β•‘
╠═══════════════════════════════════════════════════════════════════════╣
β•‘                                                                        β•‘
β•‘  Q: "Is it the same pattern - simulation continues, only frames drop?"β•‘
β•‘                                                                        β•‘
β•‘  A: YES. Exactly the same principle:                                   β•‘
β•‘                                                                        β•‘
β•‘     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘     β”‚                                                               β”‚ β•‘
β•‘     β”‚  GAME:     Physics runs ──▢ Render may skip ──▢ Interpolate   β”‚ β•‘
β•‘     β”‚  MONOTERM: VTE parses ──▢ Send may wait ──▢ Batch             β”‚ β•‘
β•‘     β”‚                                                               β”‚ β•‘
β•‘     β”‚  Both: Backend TRUTH never stops                              β”‚ β•‘
β•‘     β”‚  Both: Frontend PRESENTATION adapts to capacity               β”‚ β•‘
β•‘     β”‚  Both: MEDIATOR absorbs timing mismatches                     β”‚ β•‘
β•‘     β”‚  Both: BACKPRESSURE prevents system collapse                  β”‚ β•‘
β•‘     β”‚                                                               β”‚ β•‘
β•‘     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•‘  KEY DIFFERENCE:                                                       β•‘
β•‘                                                                        β•‘
β•‘     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β•‘
β•‘     β”‚                                                               β”‚ β•‘
β•‘     β”‚  Games SKIP frames (visual continuity, can interpolate)       β”‚ β•‘
β•‘     β”‚  Terminals BATCH updates (every character matters)            β”‚ β•‘
β•‘     β”‚                                                               β”‚ β•‘
β•‘     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘
β•‘                                                                        β•‘
β•‘  THE MONOTERM PHILOSOPHY:                                              β•‘
β•‘                                                                        β•‘
β•‘     "The PTY never stops. The VTE parser never stops.                 β•‘
β•‘      Only the presentation waits for the consumer.                    β•‘
β•‘      The truth continues, whether or not anyone is watching."         β•‘
β•‘                                                                        β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•