Innovate, disrupt, code the future. 💻🔐🚀

Test age terminal output before restoring an encrypted file

A restore command can succeed cryptographically and still put bytes in the wrong place. That is easy to miss with encrypted archives because a command such as age -d writes plaintext to standard output when no output file is named. If that standard output is a terminal, a binary archive, database export, or image is not useful to read and can corrupt the display or escape sequence state of the terminal emulator.

2026-09-20

Verify GitHub release artifact attestations before running a CLI

A checksum tells you whether a file matches a published digest. It does not, by itself, tell you who made that digest, which repository produced the file, or which workflow made the claim. That distinction matters when a release archive is about to become an executable on an administrator workstation or a CI runner.

GitHub CLI can verify an artifact attestation before that handoff. gh attestation verify calculates the artifact digest, obtains the matching signed attestation, and checks its provenance against an expected owner or repository. The repository boundary is not optional decoration: without it, a valid attestation for a different project is not evidence that the intended project produced the file.

2026-09-19

Test Python 3.15 lazy imports before moving application startup work

A top-level import is often doing more work than its caller needs. A command-line program may import an optional client, a report renderer, or an SDK before it has parsed the subcommand that would use it. That work is visible as startup latency, but moving imports into functions can make dependency ownership difficult to see and can postpone errors in ways that are hard to test.

Python 3.15 adds explicit lazy imports through PEP 810. A lazy import statement keeps the normal, module-level declaration but defers loading the named module until code uses it. That makes it useful for a narrow startup boundary, not a switch to apply across an application without tests. An import that registers a plugin, changes process state, reads configuration, or is needed to make a module importable has an observable time boundary. Moving that boundary can change behavior even when the imported module itself is correct.

2026-09-19

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