Evaluating Tech and Assisting the Solution Architect
Spikes, bake-offs, and risk registers — how I evaluate technologies as an Assistant Solution Architect and what I bring to the Solution Architect versus what I decide myself.
When production hurts across services, I ask whether it is the model, the queue, or the database — correlation IDs, incident sequences, and NestJS logging patterns that make system-level debugging tractable.
A spike in “AI is slow” tickets can be a saturated worker pool, a Postgres lock, a vector index rebuild, a provider blip, or a frontend that never stops polling. As Assistant Solution Architect, I am often pulled into incidents not to restart pods first, but to narrow the blast radius of the investigation.
The skill looks like debugging. The posture looks like architecture: boundaries, contracts, and observability designed before the fire.
Correlate first, hypothesize second. Instinct without IDs is storytelling.
Fictional Northline Assist: users report answers never arriving. Accept API looks healthy.
The architecture review question afterward is not “who messed up” — it is “which signal was missing so we spent forty minutes on the LLM dashboard.”
Every accept path must mint or forward a correlation id into queue payloads, worker logs, and provider traces.
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { randomUUID } from 'crypto';
@Injectable()
export class CorrelationInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {
const req = context.switchToHttp().getRequest<{ headers: Record<string, string>; id?: string }>();
const correlationId = req.headers['x-correlation-id'] ?? randomUUID();
req.id = correlationId;
// AsyncLocalStorage / cls-hooked binding omitted for brevity
return next.handle();
}
}
export function logIncident(event: string, fields: Record<string, unknown>) {
logger.error(event, {
...fields,
// correlationId read from request/async context
});
}
Without this, “same outage” becomes three teams arguing about three timelines.
I write answers in the incident channel as a checklist so we do not thrash.
Architecture reviews should demand:
If a system cannot answer “model vs queue vs DB” within five minutes, the observability design failed earlier than the incident.
Postmortems that stop at “restarted worker” waste pain. I push for one ADR update or one diagram annotation when a systemic gap appears: missing SLO, missing idempotency, missing backpressure.
Flows we debug: Data Flow Diagrams for AI Backends. Sync vs async choices that change failure modes: Microservices Communication: Sync vs Async. NestJS structure: Building Scalable APIs with NestJS.
Teach the system to confess. Then triage becomes engineering again.