Skip to main content

Five Patterns, One Pipeline

Five patterns form a complete pipeline. Each solves its own problem AND helps the next. Together they achieve 99.4% data reduction while preserving all content.
╔═════════════════════════════════════════════════════════════════╗
║  COMPLETE 5-PATTERN PIPELINE                                    ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║   PTY Output                                                    ║
║       │                                                         ║
║       ▼                                                         ║
║   ┌───────────────────────────────────────────────────────┐     ║
║   │  PATTERN 1: Unbounded Channel                         │     ║
║   │  Guarantee: NO DATA LOSS                              │     ║
║   └───────────────────────────────────────────────────────┘     ║
║       │                                                         ║
║       ▼                                                         ║
║   ┌───────────────────────────────────────────────────────┐     ║
║   │  PATTERN 2: Unix Socket                               │     ║
║   │  Guarantee: NATURAL BACKPRESSURE                      │     ║
║   └───────────────────────────────────────────────────────┘     ║
║       │                                                         ║
║       ▼                                                         ║
║   ┌───────────────────────────────────────────────────────┐     ║
║   │  PATTERN 3: Actor (SessionActor)                      │     ║
║   │  Guarantee: NO RACE CONDITIONS, ORDERED PROCESSING    │     ║
║   └───────────────────────────────────────────────────────┘     ║
║       │                                                         ║
║       ▼                                                         ║
║   ┌───────────────────────────────────────────────────────┐     ║
║   │  PATTERN 4: State Absorber                            │     ║
║   │  Guarantee: FIXED MEMORY, LATEST STATE ONLY           │     ║
║   └───────────────────────────────────────────────────────┘     ║
║       │                                                         ║
║       ▼                                                         ║
║   ┌───────────────────────────────────────────────────────┐     ║
║   │  PATTERN 5: ACK Flow Control                          │     ║
║   │  Guarantee: SCREEN STABILITY (60fps)                  │     ║
║   └───────────────────────────────────────────────────────┘     ║
║       │                                                         ║
║       ▼                                                         ║
║   xterm.js WebGL Render                                         ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝

Synergy Matrix

Each pattern solves its own problem AND helps others:
╔═════════════════════════════════════════════════════════════════╗
║  HOW PATTERNS HELP EACH OTHER                                   ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║  ┌────────────────┬────────────────────────┬──────────────────┐ ║
║  │ Pattern        │ Own Guarantee          │ Helps Next       │ ║
║  ├────────────────┼────────────────────────┼──────────────────┤ ║
║  │                │                        │                  │ ║
║  │ 1. Unbounded   │ No data loss           │ All downstream   │ ║
║  │    Channel     │                        │ receives data    │ ║
║  │                │                        │                  │ ║
║  ├────────────────┼────────────────────────┼──────────────────┤ ║
║  │                │                        │                  │ ║
║  │ 2. Unix        │ Natural backpressure   │ Channel does not │ ║
║  │    Socket      │ (~208KB limit)         │ grow infinitely  │ ║
║  │                │                        │                  │ ║
║  ├────────────────┼────────────────────────┼──────────────────┤ ║
║  │                │                        │                  │ ║
║  │ 3. Actor       │ No race conditions     │ State receives   │ ║
║  │                │ Ordered processing     │ ordered updates  │ ║
║  │                │                        │                  │ ║
║  ├────────────────┼────────────────────────┼──────────────────┤ ║
║  │                │                        │                  │ ║
║  │ 4. State       │ Fixed memory           │ ACK handles only │ ║
║  │    Absorber    │ Latest state only      │ coalesced state  │ ║
║  │                │                        │                  │ ║
║  ├────────────────┼────────────────────────┼──────────────────┤ ║
║  │                │                        │                  │ ║
║  │ 5. ACK         │ Screen stability       │ Frontend renders │ ║
║  │                │ 60fps guarantee        │ at stable rate   │ ║
║  │                │                        │                  │ ║
║  └────────────────┴────────────────────────┴──────────────────┘ ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝

Reverse Dependency

Later patterns help earlier ones stay efficient:
╔═════════════════════════════════════════════════════════════════╗
║  CIRCULAR BENEFIT SYSTEM                                        ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║   ACK (5) ────────────────────────────────────────▶ Absorber (4)║
║                                                                 ║
║     ACK slows emit rate (60/sec max)                            ║
║       │                                                         ║
║       └───▶ State absorbs more updates per emit                 ║
║             └───▶ Data reduction ratio increases                ║
║                                                                 ║
║   ───────────────────────────────────────────────────────────   ║
║                                                                 ║
║   Absorber (4) ──────────────────────────────────────▶ Actor (3)║
║                                                                 ║
║     State processes instantly (just overwrite)                  ║
║       │                                                         ║
║       └───▶ Actor's MPSC queue stays short                      ║
║             └───▶ Actor loop runs fast                          ║
║                                                                 ║
║   ───────────────────────────────────────────────────────────   ║
║                                                                 ║
║   Actor (3) ─────────────────────────────────────────▶ Socket (2)
║                                                                 ║
║     Actor reads socket continuously                             ║
║       │                                                         ║
║       └───▶ Socket drains quickly                               ║
║             └───▶ PTY Daemon stays fast                         ║
║                                                                 ║
║   ───────────────────────────────────────────────────────────   ║
║                                                                 ║
║   Socket (2) ────────────────────────────────────────▶ Channel (1)
║                                                                 ║
║     Socket drains quickly                                       ║
║       │                                                         ║
║       └───▶ Channel drains quickly                              ║
║             └───▶ Memory stays low                              ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝
Key Insight: The 5 patterns form a circular benefit system. Forward: each enables the next. Reverse: each pattern’s efficiency helps the previous stay light.

Data Reduction Flow

╔═════════════════════════════════════════════════════════════════╗
║  DATA REDUCTION: 10,000 -> 60                                   ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║   PTY Output: 10,000 updates/sec                                ║
║        │                                                        ║
║        ▼                                                        ║
║   1. Unbounded Channel ───▶ 10,000/sec (NO reduction, NO loss)  ║
║        │                                                        ║
║        ▼                                                        ║
║   2. Unix Socket ─────────▶ 10,000/sec (backpressure only)      ║
║        │                                                        ║
║        ▼                                                        ║
║   3. Actor ───────────────▶ 10,000/sec (ordering only)          ║
║        │                                                        ║
║        ▼                                                        ║
║   4. State Absorber ──────▶ ~500/sec (95% reduction)            ║
║        │                    ^^^^^^^^                            ║
║        │                    FIRST MAJOR REDUCTION               ║
║        ▼                                                        ║
║   5. ACK ─────────────────▶ 60/sec (88% reduction)              ║
║        │                    ^^^^^^^                             ║
║        │                    SECOND MAJOR REDUCTION              ║
║        ▼                                                        ║
║   Frontend: 60 renders/sec                                      ║
║                                                                 ║
║   ───────────────────────────────────────────────────────────   ║
║                                                                 ║
║   TOTAL: 10,000/sec -> 60/sec = 99.4% reduction                 ║
║                                                                 ║
║   All 10,000 updates are PROCESSED (by Alacritty VTE parser)    ║
║   Only EMISSION to frontend is reduced                          ║
║   NO DATA LOSS - only STATE COALESCING                          ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝

Why All 5 Patterns Are Needed

╔═════════════════════════════════════════════════════════════════╗
║  WHAT HAPPENS WITHOUT EACH PATTERN?                             ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║  WITHOUT Pattern 1 (Unbounded Channel):                         ║
║  • Bounded channel would drop data when full                    ║
║  • Terminal output corrupted, missing content                   ║
║  • User sees incomplete results                                 ║
║                                                                 ║
║  ───────────────────────────────────────────────────────────    ║
║                                                                 ║
║  WITHOUT Pattern 2 (Unix Socket):                               ║
║  • No kernel-level backpressure                                 ║
║  • Channel could grow infinitely                                ║
║  • Memory explosion if Tauri is slow                            ║
║                                                                 ║
║  ───────────────────────────────────────────────────────────    ║
║                                                                 ║
║  WITHOUT Pattern 3 (Actor):                                     ║
║  • Multiple threads accessing state simultaneously              ║
║  • Race conditions, data corruption                             ║
║  • Locks required -> contention -> slowdown                     ║
║                                                                 ║
║  ───────────────────────────────────────────────────────────    ║
║                                                                 ║
║  WITHOUT Pattern 4 (State Absorber):                            ║
║  • Need queue between Actor and ACK                             ║
║  • Queue grows: 10,000 - 60 = 9,940 items/sec                   ║
║  • Memory grows indefinitely                                    ║
║                                                                 ║
║  ───────────────────────────────────────────────────────────    ║
║                                                                 ║
║  WITHOUT Pattern 5 (ACK):                                       ║
║  • Frontend receives all ~500 states/sec                        ║
║  • xterm.js event queue grows                                   ║
║  • Frame drops, stuttering, screen instability                  ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝
Conclusion: All 5 patterns are NECESSARY. Remove any one, and the system fails differently.

Memory Control Points

╔═════════════════════════════════════════════════════════════════╗
║  WHERE MEMORY IS CONTROLLED                                     ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║   PTY DAEMON          TAURI BACKEND           FRONTEND          ║
║                                                                 ║
║   ┌────────────┐                                                ║
║   │    PTY     │                                                ║
║   │   Master   │                                                ║
║   └─────┬──────┘                                                ║
║         │ read()                                                ║
║         ▼                                                       ║
║   ┌────────────┐      Point A: Can grow if socket blocks        ║
║   │ Unbounded  │      (But socket rarely blocks)                ║
║   │ Channel    │                                                ║
║   └─────┬──────┘                                                ║
║         │                                                       ║
║         ▼                                                       ║
║   ╔════════════╗      Actual Backpressure Point                 ║
║   ║   UNIX     ║      Kernel ~208KB                             ║
║   ║   SOCKET   ║      write() BLOCKS when full                  ║
║   ╚══════╤═════╝                                                ║
║          │             ┌────────────────┐                       ║
║          └────────────▶│ SessionActor   │  Point B: MPSC queue  ║
║                        │ (SINGLE OWNER) │  (Stays short)        ║
║                        └───────┬────────┘                       ║
║                                │                                ║
║                                ▼                                ║
║                        ┌────────────────┐  Point C: FIXED SIZE  ║
║                        │ State Absorber │  OVERWRITES always    ║
║                        └───────┬────────┘                       ║
║                                │                                ║
║                                ▼                                ║
║                        ┌────────────────┐                       ║
║                        │  ACK Control   │─────▶ xterm.js        ║
║                        └────────────────┘                       ║
║                                ▲                                ║
║                                │                                ║
║                        ┌────────────────┐                       ║
║                        │   grid_ack()   │◀───── Frontend        ║
║                        └────────────────┘                       ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝

Pattern Origins

These are not new inventions. They are proven patterns, combined for terminal rendering.
╔═════════════════════════════════════════════════════════════════╗
║  INDUSTRY-PROVEN SOLUTIONS                                      ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║  ┌────────────────┬──────────────────┬─────────────────────────┐║
║  │ Pattern        │ Origin           │ Proven In               │║
║  ├────────────────┼──────────────────┼─────────────────────────┤║
║  │                │                  │                         │║
║  │ 1. Unbounded   │ Rust std library │ Async systems,          │║
║  │    Channel     │ (MPSC)           │ message passing         │║
║  │                │                  │                         │║
║  ├────────────────┼──────────────────┼─────────────────────────┤║
║  │                │                  │                         │║
║  │ 2. Unix        │ BSD (1983)       │ 40+ years of network    │║
║  │    Socket      │                  │ programming             │║
║  │                │                  │                         │║
║  ├────────────────┼──────────────────┼─────────────────────────┤║
║  │                │                  │                         │║
║  │ 3. Actor       │ Carl Hewitt 1973 │ Erlang telecom          │║
║  │    Model       │ Erlang 1986      │ (99.9999999% uptime)    │║
║  │                │                  │                         │║
║  ├────────────────┼──────────────────┼─────────────────────────┤║
║  │                │                  │                         │║
║  │ 4. Coalescing  │ GUI frameworks   │ React batching,         │║
║  │                │ (decades old)    │ game engines            │║
║  │                │                  │                         │║
║  ├────────────────┼──────────────────┼─────────────────────────┤║
║  │                │                  │                         │║
║  │ 5. ACK Flow    │ TCP/IP (1974)    │ Every internet          │║
║  │    Control     │ Vint Cerf        │ connection              │║
║  │                │                  │                         │║
║  └────────────────┴──────────────────┴─────────────────────────┘║
║                                                                 ║
║  MonoTerm's innovation: Combining them in the VTE parsing layer ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝

Summary

╔═════════════════════════════════════════════════════════════════╗
║  FIVE PATTERN SYNERGY: KEY TAKEAWAYS                            ║
╠═════════════════════════════════════════════════════════════════╣
║                                                                 ║
║  1. Five patterns form a complete pipeline                      ║
║  2. Each pattern has ONE guarantee                              ║
║  3. Each pattern helps the next (forward dependency)            ║
║  4. Each pattern's efficiency helps the previous (reverse)      ║
║  5. Remove any pattern -> system fails                          ║
║  6. Together: 99.4% data reduction, zero data loss, stable 60fps║
║                                                                 ║
║  ───────────────────────────────────────────────────────────    ║
║                                                                 ║
║  Pattern 1 (Unbounded)   -> No data loss                        ║
║  Pattern 2 (Socket)      -> Backpressure                        ║
║  Pattern 3 (Actor)       -> Ordering                            ║
║  Pattern 4 (Absorber)    -> Memory stability + Temporal sync    ║
║  Pattern 5 (ACK)         -> Screen stability                    ║
║                                                                 ║
║  COMBINED: AI-native terminal that handles any output volume    ║
║                                                                 ║
╚═════════════════════════════════════════════════════════════════╝