How long should a node wait for a reply before giving up — and once it gives up, what should it assume actually happened: did the peer stop, drop one message, or start lying?
Six messages, all sent at slightly different times, all arriving with genuinely different delays. Drag Δ down and watch some of them start to "exceed the bound" — the same six messages, but now they no longer fit any single promise about how long you might have to wait.
A system model is an assumption about message delay, not a fact about the network. The synchronous model assumes a known bound on every message's delay; the asynchronous model assumes no such bound exists at all.
- — a single message, with a known send time and delivery time.
- — how long took to arrive: delivered time minus sent time.
- — the bound the synchronous model promises no message will exceed.
A node failure is a separate axis entirely — not about timing, but about what a node does when it's supposed to speak:
- CrashThe node sends nothing further to anyone — total silence, forever.
- OmissionThe node sends the correct value to some peers, but silently drops it for others.
- Byzantine
The node sends different peers conflicting values (or lies to everyone consistently) — behavior that can't be explained by silence or a dropped packet alone.
- CorrectAnything reachable that isn't one of the above: every peer got exactly what was expected.
A actually sent: B=1, C=1, D=1
classifyFailure(A) = correct
The top readout tracks — the smallest bound that actually makes this
round synchronous. Below it, step through each node's round log and watch classifyFailure name exactly what
went wrong, straight from what it was expected to send versus what it actually sent.
The six messages have delays 2, 9, 3, 3, 5, 3 (in MESSAGES order).
- Find the bottleneck
The largest delay is 9 (A → C). No bound smaller than 9 can call this round synchronous — one message alone would violate it.
- Confirm the minimum bound
At , every message qualifies. At , A → C alone breaks the promise.
- Now the four round logs
- A sent every peer exactly what was expected → correct
- B sent nothing at all → crash
- C sent the right value to A and B but never reached D → omission
- D told B a different value (5) than it told A and C (4) → byzantine, even though D never went silent
For each node A–D, read its round log and classify what happened: correct, crash, omission, or byzantine. Get all four right.
A actually sent: B=1, C=1, D=1
Synchrony is a promise about time — every message arrives within a known bound, or it doesn't. Failure is a promise about honesty — a node stays silent (crash), goes selectively silent (omission), or actively lies (Byzantine). Every protocol in this course has to pick assumptions on both axes before it can promise anything at all.