Assign least-privilege Azure roles, not broad contributor rights

Give workloads and people the narrow Azure role they need instead of defaulting to Contributor.

July 5, 2026 · 2 min · 274 words

Avoid hidden allocations in hot paths

Watch for small per-item allocations inside loops, parsers, serializers, and request paths.

July 5, 2026 · 2 min · 306 words

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 · 288 words

Expose a Python FastAPI AI tool as an Aspire service

Keep Python AI code behind an HTTP boundary and let Aspire wire it into the local system.

July 5, 2026 · 1 min · 184 words

Keep model name and deployment name in config

Do not hard-code model routing decisions into application logic.

July 5, 2026 · 2 min · 281 words

Keep vector search filters separate from semantic ranking

Use filters for eligibility and ranking for relevance instead of blending both concerns.

July 5, 2026 · 2 min · 298 words

Measure before you optimize

Use traces, counters, profiles, and focused benchmarks before changing code for performance.

July 5, 2026 · 2 min · 280 words

Middleware order is important

Place ASP.NET Core middleware in the order that matches routing, security, and endpoint behavior.

July 5, 2026 · 2 min · 265 words

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 · 261 words

Pass CancellationToken through real boundaries

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

July 5, 2026 · 2 min · 290 words