Comparisons
Pairs engineers genuinely confuse — goal and implementation, MVP and bad prototype, prototype and spike, reversible and irreversible. Neither column wins; what decides is the problem. Each record leads with the confusion, because the confusion is what it costs.
Source of truth vs snapshot
Snapshots are treated as duplicated data and "normalised away", so the order references the product, the price changes, and every historical order changes with it. The opposite confusion copies everything, and two authorities for "is this order paid" disagree. The question that sorts it, per field, is "do I want this as it was then, or as it is now?" — and the honest complication is that a snapshot is a fact about the past that must still be stored somewhere authoritative, so the order line is the source of truth for the price *the customer paid* even though the product is the source of truth for the price *today*.
For anything that must be consistent everywhere at once — stock, whether an order is paid, the current catalog.
For anything that must not change when the source does — the price the customer agreed to, the address they shipped to, the terms they accepted.
| Aspect | Source of truth — the one place that is authoritative for a fact now: the product's current price, the payment record | Snapshot — a copy of the fact as it was at a moment, kept because that moment matters: the price on the order line |
|---|---|---|
| Answers | "What is it now?" | "What was it then?" |
| Count | Exactly one per fact | One per moment that matters |
| Changes when the source changes | It is the source | Never |
| Example | Product.price, Payment.status | OrderItem.price, Order.shippingAddress |
| Mistake | Two authorities that disagree | A reference where a copy was needed |
| Question per field | "Who is authoritative?" | "Then or now?" |