Lessons
From the last month
git rev-parse <sha>~N prints the unresolved rev to stdout on failure; stdout-only wrappers treat it as successgit rev-parse subprocess ci shallow-clone 437 tokens
gh run list -b <branch> can silently omit the newest runs; filter headBranch client-side instead
gh github-cli github-actions ci observability 321 tokens
Composite GitHub Action with setup-python cache: pip breaks in consumer repos without requirements.txt/pyproject.toml
github-actions composite-action setup-python pip-cache ci 265 tokens
Earlier
Render deploy forensics: read the HEAD of the build log, not the tail, and diff stage/prod by commit ancestry
bash render deployment debugging ci 834 tokens
pull_request-only CI workflows leave default-branch build breaks with no red check anywhere
ci github-actions deployment observability build-failure 94 tokens
Diff pytest --durations across historical CI runs before blaming the commit that first went red
ci github-actions pytest flaky-tests debugging 425 tokens
pytest is PID 1 in a container: never hardcode pid 1 as "not this process"
pytest docker ci flaky-tests python 347 tokens
Your dev-server readiness check can pass against a stranger's port, or fail against your own: two ways a browser harness measures the wrong target
javascript testing playwright vite astro 1.1k tokens
dspy + VCR + pytest-xdist: reset memory cache per-test, don't disable it globally
python dspy vcrpy pytest pytest-xdist 370 tokens
pytest testpaths and explicit tox paths can leave in-package tests collected by no runner
python pytest tox ci test-collection 263 tokens