Innovate, disrupt, code the future. 💻🔐🚀

Detect unreachable goroutine leaks with Go 1.27

A goroutine count can show that a service is growing, but it does not explain whether the blocked work is expected. A busy HTTP server may have many goroutines waiting on sockets, timers, or a work queue and still be healthy. A goroutine that is waiting on a channel which no remaining code can ever send to is different: it will retain its stack and anything it references until the process exits.

2026-09-18

Check GitHub Actions retention before October cleanup

A repository can have a healthy Actions workflow today and still lose the evidence needed to explain a failed deployment, a changed check, or an approval decision. GitHub announced that, starting 1 October 2026, checks, workflow runs, and statuses will follow the same retention setting that already controls Actions artifacts and logs. Before that change, those records were retained for more than 400 days even when a repository had a shorter artifact and log window.

2026-09-18

Test Python tarfile data filters before extracting deployment artifacts

An archive-extraction step is often hidden inside a deployment helper: download a release bundle, unpack it, then move the expected files into place. That makes the archive a filesystem input, not just a transport format. A member name, symlink, hard link, device entry, ownership field, or permission can change what extraction tries to create.

Python’s tarfile module now has extraction filters for this boundary. Python 3.14 changed the default filter to data, but Python 3.13 and earlier have a less restrictive default. Passing filter="data" explicitly is therefore useful in code that supports more than one Python release. It is not a substitute for patching: Ubuntu’s September Python advisory includes CVE-2026-4224, involving how the tarfile filter parameter was applied to hard links. Update the interpreter or distribution package before relying on any filter behavior.

2026-09-17

Validate MemoryQoS kubelet prerequisites before a node rollout

A kubelet configuration can look harmless in a review because it contains only two new fields. On a Kubernetes v1.37 node, memoryThrottlingFactor and memoryReservationPolicy change how the kubelet uses the cgroup v2 memory controller. The change is not confined to one container: it changes the pressure and protection behavior applied to Pods on that node.

MemoryQoS is beta and enabled by default in Kubernetes v1.37. The feature does not, by itself, turn on memory throttling or reservation. The default kubelet configuration leaves both behaviors off. A non-null memoryThrottlingFactor requests throttling, while memoryReservationPolicy: TieredReservation requests memory protection. Both decisions need a worker-node cgroup v2 prerequisite and a rollout plan that treats the configuration as node behavior, not as an application manifest.

2026-09-17

Validate GitHub Actions cache-mode on low-trust triggers

A workflow that restores dependencies from a cache is making a trust decision, not only a performance decision. GitHub Actions caches are shared by scope, and a later job restores their contents as files on its runner. A cache that a low-trust workflow can write can become an input to a trusted workflow, which is the boundary that makes cache poisoning relevant.

GitHub added cache-mode on 10 September 2026. The setting can apply at the workflow level or to one job. It has four values: read, write, write-only, and none. The useful part is that the cache service enforces the selected capability rather than expecting every cache step to make the right choice. The dangerous part is just as explicit: write and write-only can override the read-only default GitHub applies to low-trust events.

2026-09-16

Validate Kubernetes HPA scale-to-zero metric choices before deployment

A HorizontalPodAutoscaler can reduce the replica count of a Deployment, but minReplicas: 0 changes the question from how to scale down to how a workload starts again. A CPU or memory metric describes Pods that already exist. When the target has zero Pods, there is no Pod CPU or memory value for the controller to use as a wake-up signal.

Kubernetes v1.37 moves HPA scale-to-zero support to beta and enables it by default. The supported use is an HPA using an external or object metric, such as queue depth, a pending-work count, or another signal that remains available while the workload has no Pods. The release notes explicitly exclude CPU and memory metrics from scale-to-zero because they depend on active Pods.

2026-09-15

Fail a Node test filter that matches nothing

A focused test command is useful before a small dependency update or a narrow code change. Running one named behavior is faster than running an entire suite, and it gives a reviewer a direct answer about the part of the application that changed. The command is only useful, though, if the name filter actually selects a test.

Node’s built-in test runner accepts --test-name-pattern for that purpose. In a disposable Node 22.23.2 project, a pattern matching one top-level test returned zero. A pattern matching no test names also returned zero. Its TAP output began with 1..0, then reported the test file itself as a successful subtest. A CI job that treats the process exit status as the whole result can therefore accept a focused check that exercised none of the intended assertions.

2026-09-09

Check an OpenSSL private key before a TLS deployment

A TLS deployment can fail before a client ever reaches certificate-chain validation. A private-key file may be truncated during a secret export, copied in the wrong encoding, encrypted with an unavailable passphrase, or simply not be the key format the service expects. A file existing at the configured path is not useful evidence that OpenSSL can read it, and a successful PEM header search is weaker still.

openssl pkey -check provides a small offline check for a private key that is already in a controlled review location. In a Linux AMD64 validation run with OpenSSL 3.5.7, a newly generated synthetic RSA key printed Key is valid and returned zero. Removing its PEM end marker made the same command return 1 before a consistency check could run. That distinction is the useful gate: first ensure the input can be decoded, then accept OpenSSL’s key-consistency result. It is not a substitute for protecting the key, matching it to a certificate, or testing the deployed TLS service.

2026-09-08

Test Git object connectivity before mirroring a repository

A repository can have a branch name, a current-looking HEAD, and a clean worktree while still being unable to supply every object reachable from its history. That matters when a backup, mirror, deployment export, or migration job treats a successful git fetch as enough evidence that the repository can be copied safely.

git fsck --connectivity-only gives that review a small, local failure boundary. It walks the object graph without performing the broader object-validity checks that a full git fsck performs. In a disposable repository tested with Git 2.47.3, the connectivity check exited zero while the committed blob existed. After that one reachable blob was removed from the disposable object database, the same command reported a missing blob and exited 2. Nothing contacted a remote and no application repository was modified.

2026-09-08

Enforce pip hashes with an offline wheelhouse before deployment

A dependency install can appear repeatable right up to the moment a package file changes behind an unchanged version pin. idna==3.10 tells pip which release to select. It does not, by itself, state which exact wheel or source archive the installer is allowed to accept. A hash-checked requirements file closes that gap by making the expected file digest part of the deployment input.

This guide builds a small offline wheelhouse and tests both outcomes with pip 26.1.2 on Python 3.13.5: a wheel whose SHA-256 digest matches the requirements file installs into a disposable target, while the same wheel with an intentionally wrong digest is rejected. The useful boundary is not a successful download. It is proving that the installer refuses a file when the declared digest and the bytes on disk disagree.

2026-09-07