Use idempotency keys for retryable writes

Make a retried write replay the same operation instead of creating a duplicate side effect.

July 12, 2026 · 3 min · Lukas Walter

Make logs structured before adding dashboards

Capture queryable fields first so dashboards are built on data, not text search.

July 9, 2026 · 3 min · Lukas Walter

Use IHttpClientFactory

Create configured HttpClient instances through the factory instead of scattering clients and handlers.

July 8, 2026 · 2 min · Lukas Walter

Do not hide exceptions inside fire-and-forget tasks

If work can fail, give it ownership, logging, cancellation, and a lifecycle.

July 5, 2026 · 2 min · Lukas Walter

Nullable warnings are design feedback, not noise

Treat nullable warnings as pressure to make object state and API contracts clearer.

July 5, 2026 · 2 min · Lukas Walter

Pass CancellationToken through real boundaries

Thread cancellation through every expensive operation instead of dropping it mid-chain.

July 5, 2026 · 2 min · Lukas Walter

Prefer health checks that test dependencies deliberately

Health checks should say something useful about readiness without turning every probe into production load.

July 5, 2026 · 2 min · Lukas Walter

Use OpenTelemetry before you need production debugging

Add traces, metrics, and logs while the system is still easy to reason about.

July 5, 2026 · 2 min · Lukas Walter

Why CancellationToken Matters More in .NET AI Systems

Why CancellationToken matters more in .NET AI systems, and how to pass it through LLM calls, streaming responses, embeddings, retrieval, and tool execution.

May 24, 2026 · 12 min · Lukas Walter