Source and sink balance
Read resource movement as a relationship between purpose, input, choice, and output.
A source adds a resource to a model; a sink removes it. The useful design question is not whether both exist, but whether their relationship supports a clear player decision.
Key points
Name the purpose first
Tie every input and output to the decision the model is meant to clarify.
Compare movement, not isolated totals
Look at what enters, what leaves, and what can change either direction.
Review the next decision
A useful balance leaves the player with another understandable choice.
Generic example
This invented function describes direction only; it is not tuned for a real game.
type Snapshot = { incoming: number; outgoing: number };
export const direction = ({ incoming, outgoing }: Snapshot) =>
incoming === outgoing ? "steady" : incoming > outgoing ? "growing" : "shrinking";