Ruo Lee — Notes
Design notes from an AI engineer. Not what was built, but why it was decided that way.
- Dynamic execution engine
How allowed_agent_ids became worker_agent_ids
An A2A orchestrator's worker list was used to block calls too, and three days later that came out. It was a guard set up in advance for a customer requirement, and it got in the way of the one in front of us: being callable from outside.
- Dynamic execution engine
An orchestrator that splits purpose-built agents into A2A workers
We used to build a separate agent for RAG, for searching large attachments, for table search. Now small workers are handed to one orchestrator as tools. In dev-cluster testing it never picked the wrong worker, and each fix landed on one worker.
- OPIc app
The week signups fell 27% and revenue hit a high
Weekend signups dropped and I went in expecting an outage. It was the seasonal downswing of the whole market, and once I pulled the cohorts it turned out this was never a retention business.
- Map interfaces
Setting the map inset rule by measurement
I decided when to show the inset map by running all 155 stops. Brussels was the single exception, and the 104px size stayed an eyeball call to the end.
- OPIc app
R8 optimisation deleted the payment plugin
Turning on R8 as Play Console required stripped the Cordova payment plugin registry. In-app payments sat at zero for ten days; one keep rule fixed it.
- OPIc app
A file that starts with moof
Re-entering the start function across its await threw away the initialisation segment. I blamed iOS and fixed for it, which did nothing; printing the first bytes of the upload settled it.
- OPIc app
Six KST boundary bugs on a UTC server
The server runs on UTC and the user's day starts in KST. Six bugs with nothing in common on the surface shared one root, and the problem was two reference points mixed inside a single function.
- OPIc app
Multi-account farming cost us $0.27
I checked the scale before picking a countermeasure. At $0.27 the answer was to do nothing, and to remove one existing defence that was causing more harm than it prevented.
- Agent memory
Why we vendored 13,000 lines of open source
Neither a dependency nor a fork worked, so we vendored. The price is a discipline: no formatter over that tree, commits kept separate, and what we cannot fix written down.
- Dynamic execution engine
When Mount prefix matching hides a route
The deploy succeeded, the route was registered, and calls still returned 404. FastAPI's Mount matches on prefix and takes the first hit; allowing a slash in the alias was the cause.
- Agent memory
The failures that never throw
Six defects that never raised an error. All of them used one empty array for both "nothing there" and "could not fetch"; four were caught before deploy.
- Agent memory
Setting the 0.85 similarity threshold from sentence pairs
I started at 0.9, then measured real sentence pairs through the production embedding model and landed on 0.85. The two directions of failure cost different amounts, so the slack went to one side; on the search path I dropped the threshold entirely.
- Agent memory
Why Korean conversations produced English memories
The extraction prompt carried 14 English few-shot examples. No placement of an instruction changed anything; cutting to three examples with one Korean pair did.