| "The build script is a release-engineering thing — I won't touch it." | The build is what produces the artifact your users run. It is the dev team's code, owned and refactored like any other. (97/63) |
| "We'll rebuild from source on the prod box with the same scripts — same result." | You lose the proof that what shipped is what was tested. Build once, promote that artifact through every environment. (97/61) |
| "I'll bake the staging API URL into the image — easier than wiring up config." | The image is no longer environment-agnostic. Push environment values into env vars, mounts, or a config service so one image runs everywhere. (97/61) |
| "Deploy is trivial — we'll wire it up at the end." | Deferred deploy hides assumptions until they are expensive to fix. Deploy to a clean environment from week one and refactor the pipeline as you go. (97/20) |
| "I'll add this new framework alongside the one we already use — it's better." | A parallel tool doubles maintenance and fragments knowledge. Respect the existing convention or change it deliberately, with the team. (97/10) |
| "It's open source so adoption is free." | License terms, upgrade cadence, support model, and lock-in are real costs. Evaluate before adopting; isolate behind an interface so it can be swapped. (97/10) |
| "The README is enough — installation is obvious." | The user runs cost-benefit on every second of friction. Ship a five-line working example and tell the user where files are written. (97/40) |
| "I'll just hand-format this file before committing — once is fine." | A standard nobody enforces is gone in a month. Automate the formatter into the commit hook and break the build on violations. (97/4) |
| "We have tests, so we don't need static analysis." | Tests find the bugs the tests imagined. Analyzers find the class of bug the tests forgot — null deref, dead branch, possible race. Run both. (97/79) |
| "I'll write a Python script for this one-line text munge." | A grep | awk | sort -u pipeline does it now and works on every project. Reach for the toolchest before reaching for a new file. (97/88) |
| "I've done this manual sequence twice — third time will be just as fast." | The third time is the moment to script it. The IDE-only or laptop-only workflow does not survive the next contributor or CI. (97/78) |
"fix bug is a fine commit message — git blame will explain it." | The next reader needs the why. One commit per logical change, with a message that names the intent, is the contract. (97/68) |
| "I'll hardcode the staging API key in the config file — easy to swap later." | Could you open-source this repo right now without leaking a credential? Push every per-deploy value out into env vars or a secrets manager. (12F/III) |
| "I'll patch the running prod box — faster than cutting a new release." | That collapses run back into build and destroys "what runs is what was tested." Roll forward to a new release; do not edit the running one. (12F/V) |
| "I'll write user uploads to a local directory and the next request reads them." | The next request may land on a different host, the next deploy will lose the directory, and a restart wipes it. State belongs in a backing service. (12F/VI) |
| "I'll have the process write logs to a rotated file on the host." | Log files on the host vanish on restart and require per-host access to read. Write to stdout/stderr and let the platform aggregate. (12F/XI) |
| "I'll tweak the Jenkins job in the UI — one-time fix." | The deploy pipeline is production code. UI tweaks bypass review and produce config drift. Pipeline lives in version control with PRs. (CD/PipelineAsCode) |