Consensus asks participants to decide a value subject to agreement, validity, and termination conditions. Agreement forbids incompatible decisions. Validity excludes meaningless solutions such as always deciding an unrelated constant; its exact formulation depends on the problem. Termination demands decisions by the required nonfaulty participants under specified conditions. A replicated log can use repeated decisions about ordered commands, but one decision and a complete storage service are different scopes.
Deciding that a command occupies a log position does not mean the command succeeds at the application level. The agreed command Reserve(12, Bo) can deterministically produce “already owned.” Consensus selects an agreed history in which the application checks its rules. It does not make every client request valid or eliminate application bugs.
Separate a proposed value from a final decision
For a small consensus problem, suppose three processes propose either 0 or 1. Use a validity condition that the decision must be a proposed value. If every process proposes 0, deciding 1 is forbidden. If both values are proposed, either can be valid, but the processes must not decide different values. The problem therefore contains both a choice and a restriction on how later decisions relate to earlier ones.
A proposal is information offered to the algorithm. A decision is a final result that the algorithm may no longer retract. Keeping a tentative local preference is harmless if the protocol can revise it. Reporting that preference as an irrevocable decision changes the safety obligation. A process that decides 0 cannot later say that its earlier result was merely provisional because another process decided 1. The promise made at the decision boundary matters.
Consider A and B proposing 0 while C proposes 1. A majority count makes 0 look natural, but consensus validity does not necessarily require majority preference. A safe algorithm could choose 1 in this mixed-input case. Conversely, counting two local preferences for 0 does not itself establish a safe decision protocol. The counting rule needs restrictions that prevent later participants from forming an incompatible decision from different evidence. The previous lesson separated that protocol obligation from set intersection.
This distinction explains why agreeing on a reservation command is different from approving a reservation. Suppose the agreed order contains Reserve(12, Ada), followed by Reserve(12, Bo). Each replica applies the first command to an empty seat and records Ada as owner. Each then applies the second command to an occupied seat and returns rejection. Both commands belong to the agreed history, but only one reservation succeeds. Application rejection is compatible with successful consensus about the order.
For the impossibility discussion, assume processes execute deterministic rules. Given the same local state and incoming event, a process makes the same transition. Assume messages can take arbitrarily long, and a process may crash without warning. The other processes cannot inspect its memory or directly detect its crash. Reliable communication between nonfaulty processes means messages eventually arrive in the relevant admissible executions. Reliability supplies eventual delivery, not a known deadline for deciding that an absent message will never arrive.
Keep two obligations separate when examining an algorithm. For safety, ask whether any permitted execution can produce incompatible final decisions. For termination, ask whether every execution covered by the claim eventually produces the required decisions. An algorithm that completes a million ordinary runs has evidence about those runs, not a guarantee over every permitted schedule. An algorithm that waits during uncertainty may protect agreement while failing an unconditional termination claim. The next section explains why the asynchronous model makes that distinction unavoidable.