2026

Spec tools and hooks: what they automate

Follow an ordinary repair, a shared dependency change and stale evidence to see where specification tools help—and which decisions remain with the reviewer.

Writing specifications for coding agents

A compact structure for specifying settled behaviour, preserving implementation discretion and keeping unresolved decisions in the working record.

2025

Dependency Lifecycle Management in Go

Introduction

Lifecycle management ensures that application components like servers, databases, and background workers are correctly initialized, started in the right order, and gracefully stopped.

Go developers typically wire dependencies manually, instead of relying on heavy frameworks or reflection based dependency injection. This approach improves readability and reduces hidden behavior, but it also shifts the burden of managing component interactions and lifecycle sequencing onto the developer.

As applications scale, the lack of built-in orchestration increases the risk of subtle bugs and inconsistent shutdown behavior.

2023

structured logging: slog

Event logging is one of the three pillars of observability (traces and metrics being the other two).

A log entry is a timestamped record about the application’s activity, which can be used for troubleshooting, monitoring or auditing purposes.

Logs may have different formats:

  • unstructured or plain text: similar to print statements, free-form text
  • semi-structured: some values have a structure and the remaining data free-form
  • structured: there is a well-defined and consistent format, such as: W3C Log Format, NCSA Log Format, Key/Value Pair, CSV or JSON, among others. Structured logs can be easily machine parsed, which simplifies analytics, filtering and aggregation.

This article is a non-exhaustive walkthrough of logging in Go.

2022

Opentelemetry - Log-Based Change Data Capture tracing

Opentelemetry provides vendor neutral standards and implementations to generate, collect, and export tracing data.

A Context is a propagation mechanism which carries execution-scoped values across API boundaries and between logically associated execution units. Cross-cutting concerns access their data in-process using the same shared Context object.

Context propagation is required when the tracing needs to cross process or service boundaries. Common ways to propagate the context is using W3C Trace Context or Zipkin B3 headers, while to inject the context is, for example, http headers or metadata fields in event messages.