01. Why Runtime Coordination Is Hard
The Real Difficulty
Newcomers often learn async and await through small examples:
- wait for a web request
- read a file
- run two tasks together
Those examples are useful, but they do not capture what makes a machine-oriented desktop system difficult.
This repository is not managing one asynchronous operation. It is coordinating many things that can change independently:
- connection state
- safety signals
- motion state
- recipe loading
- workflow progression
- telemetry streaming
- frame streaming
- defect updates
- faults, acknowledgment, and recovery
- persisted run history and startup hydration
In a real industrial desktop app, the hard problem is not “can this method be async?” The hard problem is:
- who owns the truth?
- which operations are allowed in which state?
- how should active work stop?
- what should the UI do when background services publish updates?
- what happens when producers are faster than consumers?
That is why this repo is worth studying. It contains realistic coordination pressure without being so large that the structure disappears under complexity.
Why Industrial Desktop Systems Feel Different
Industrial or machine-adjacent desktop systems usually combine three things:
- command-driven behavior
- long-lived runtime state
- concurrent background activity
That is a very different environment from a simple form-based app.
When an operator clicks Start Run, the system is not merely changing one UI panel. It is coordinating:
- guarded command acceptance
- active run creation
- motion steps
- streaming pipelines
- defect updates
- terminal summary production
When an operator injects a fault, the system must preserve a different story:
- unsafe condition
- blocked commands
- acknowledgment
- clearance
- explicit recovery
That is why runtime coordination deserves its own module in the course.
How This Repo Keeps The Problem Bounded
The repo uses a few key strategies:
- one canonical
AppState - one mutation owner
- application-layer workflow orchestration
- bounded pipelines
- UI projection on the dispatcher thread
Those design choices do not remove complexity. They make complexity visible and testable.
Trade-Offs
What This Buys
- fewer hidden state sources
- clearer operational semantics
- better testability
- easier code review
What It Costs
- a larger central state record
- a high-context workflow service
- more explicit coordination code than a quick demo would need
For a training repo, that is a good trade. The structure is part of the lesson.
Related Lessons
Diagram Brief
Title: Why runtime coordination is hardPurpose: Show the multiple independently changing concerns that make the workstation runtime more complex than a simple async exampleAudience: newcomer engineerNodes: Connection, Safety, Motion, Workflow, Telemetry, Frames, Faults, History, UIEdges: each node influences or constrains runtime behavior and ultimately affects operator-visible stateGrouping: Control concerns, streaming concerns, failure concerns, operator-facing concernsCaption: The difficulty comes from coordination across many moving parts, not from any single async methodDestination file path:docs/diagrams/source/course-04-01-why-runtime-coordination-is-hard.drawio