Ready for human
I run a coding session per repository and they can't talk to each other. For a while the thing carrying messages between them was me, and I kept getting it wrong.

I run a coding session per repository and they can't talk to each other. For a while the thing carrying messages between them was me, and I kept getting it wrong.

Half my CI jobs ran for no reason on every merge request. Skipping them with rules:changes, and why that is trickier than the manual suggests.

Moving off tag-on-merge releases, where a release is a side effect of merging, to a model where the release is itself a reviewable change.

A CI component gated on the default branch fired on every Renovate schedule too, because a scheduled run is also on the default branch.

Nearly every CI job began by fetching and compiling the same tools. Baking them into one image instead, and what that saved per pipeline.

Three Hugo sites each hand-rolled a near-identical deploy job that only ever ran on merge, so nothing ever checked the build before it landed.

A secret scanner failed a merge request over a test key and a documentation PEM that the change did not contain. Scoping a scan properly.

Let CI sign with a KMS key without storing any AWS credentials, using OIDC federation. Covers both the GitLab and the GitHub path.

Turning three advisory CI jobs into real gates once they were trustworthy enough to block a merge, and how to tell when they are.

Moving this blog from Jekyll and GitHub Pages to Hugo and GitLab Pages, and the two things I would do differently next time.
