Tú (tusgino)
AI Software Engineer

Tú (tusgino)

AI Software Engineer in Da Nang. I write about production system architecture and what each choice costs.

12 articles📍 Đà Nẵng

I’m Tú, working under the alias tusgino, an AI Software Engineer in Da Nang, four years on backend and distributed systems.

The largest system I have run: 10k requests/second, 2TB of data, 300k users. AIVO is where I write down what broke, at which layer, and how I fixed it.

Every design answers to four pillars

  1. Scalability — traffic grows, the system scales out instead of piling onto one bottleneck.
  2. Reliability — anything can fail; the system isolates faults and degrades gracefully.
  3. Maintainability — strict types, automated tests, clear module boundaries. Technical debt is a cost, not a detail.
  4. Security — Zero-Trust and Least Privilege designed into the data model, not patched on at the end.

Nothing is free

Every decision trades four axes against each other: performance, cost (FinOps), observability (logs, metrics, traces) and operational complexity. Winning one axis usually costs another, and I name the loss before proposing the design.

What I run day to day

  • Backend: TypeScript/Node.js (NestJS), PostgreSQL, Redis, MongoDB.
  • Infrastructure: Docker, Kubernetes, AWS; microservices, DDD, event-driven and realtime systems.
  • AI/LLM: LLM integration, AI agents, MCP, RAG, Ollama; Claude, Qwen, DeepSeek; PyTorch/ONNX.
  • Frontend: React, React Native.

How I work

  • Point out unverified assumptions instead of defaulting to them.
  • Say the risk out loud, even when it is unwelcome.
  • Conclude from evidence. Without a measurement, I call it an observation.

Published articles (12)

One point splitting into two paths: the upper through five ticked boxes, the lower broken toward an empty box

100% coverage, and it still did not run

A feature was completely dead in production while 178 tests were green and coverage held at 100%. Tests measure lines that ran, not the path that ships.

An arrow entering a vertical gate, with two short blocked arrows on the far side

Ask before writing, and refuse when nobody answers

Permission is not a true/false flag. It is a seam with a contract, three sandbox modes that speak only about files, and a safe default: no answer means no.

A row of eight blocks, the middle two bracketed with a solid replacement block above them

Cut the context, keep the audit trail

Compaction deletes nothing. It only shadows a range on the surface sent to the model, records exactly which range, and leaves the original in the log for later.

Seven connected squares, the middle one solid as the tool body, six with gate ticks above

Permission sits on the path, not in the tool

A tool call passes seven stages before it reaches the tool body. Policy, hooks and sandboxing live there — and the tool itself need not know about them.

A stack of log records with two arrows fanning out to what is derived from it

The log is the source, not a copy

Everything the model sees must be in the log first. Context is never stored beside it — it is derived, and that is the difference between a source and a copy.

Four identical loops, each with a cut at a different position

The same loop, different seams

Every harness has a log, a tool registry, a context budget and a permission layer. They differ in which of those you may replace — I read four to answer.

A harness plugin tree with the four core parts highlighted among the other plugins

Where a harness begins

The loop is only a coordinator. Four parts turn it into a harness: a durable log, a tool registry, a context budget, and a permission layer, all four pluggable.

System One AI architecture diagram and Typed Decisions with the Jev model

System One AI: don't burn 800ms just to get one routing keyword

Explore System One AI with TypeSafe Jev: replace slow LLMs with Typed Decisions, probability distributions and the three primitives Choice, Score and Noul.

A minimal while loop with four broken branches marked around it

The while loop works, until it doesn't

An agent loop runs in ten lines. The production version of that same loop is 101 lines, and every extra line marks a place it used to break. Here are the four.

The boundary between the tool declaration sent to the model and the execution that stays host-side

The model proposes, your code executes

The model sees only a tool declaration, never its execution. A tool call is a structured request your code validates, authorises, and then decides to run.

A budget bar filling up block by block, the final block cut off past the limit line

The context window is not memory

A context window is a finite budget, not a memory. On the same request, two published token ratios differ by 1.6x, and you cannot tell which one you are on.

Two separate API calls, where the second one carries the entire history of the first

Call the API, then forget

Every API call is a pure function: text in, text out, then nothing. The memory you think the model has is history you resend yourself, and you pay for it.