# Ruo Lee — Notes

> Design notes from an AI engineer. Not what was built, but why it was decided that way.

Engineering notes by Ruo Lee (이루오), an AI engineer. Every post is a decision record: a problem that was measured, the options that were weighed, what was chosen, and what is still unsolved. Numbers come from production systems the author built or operates. Each post exists in Korean and English at the same slug — `/ko/<slug>` and `/en/<slug>`.

## Posts (Korean)

- [iOS 탓이라고 두 번 틀렸다](https://blog.po24lio.com/ko/blamed-ios-twice.md): 신규 사용자가 가입 3분 뒤 다섯 번 연속 실패했다. 컨테이너를 바꿨더니 같은 사람이 또 실패했다. (브라우저 녹음 · 2026-09-09)
- [자정은 어디에 있는가](https://blog.po24lio.com/ko/where-is-midnight.md): 서버는 UTC 로 돈다. 그런데 사용자의 하루는 KST 로 시작한다. 이 어긋남이 여섯 군데에서 각각 다른 얼굴로 나타났다. (시간대 경계 · 2026-09-08)
- [어뷰징을 재고 나서, 아무것도 하지 않기로 했다](https://blog.po24lio.com/ko/measuring-abuse-then-doing-nothing.md): 다계정 파밍이 의심됐다. 규모를 쟀더니 피해액이 $0.27이었다. 대책 대신 기존 방어 하나를 걷어냈다. (어뷰징 대응 · 2026-09-07)
- [남의 코드 13,000줄을 안고 가기로 했다](https://blog.po24lio.com/ko/vendoring-someone-elses-code.md): 의존성으로 쓸 수도, 포크할 수도 없었다. 세 번째 선택지를 골랐고, 그 대가로 지켜야 할 규칙이 생겼다. (에이전트 메모리 · 2026-09-05)
- [배포는 성공했고, 호출은 404였다](https://blog.po24lio.com/ko/mounted-but-unreachable.md): 관리 콘솔은 배포완료라고 했고, 생성 API 는 200 을 돌려줬고, 라우트는 실제로 등록돼 있었다. 그런데 그 라우트에는 요청이 닿을 수 없었다. (동적 실행 엔진 · 2026-09-01)
- [예외를 던지지 않는 실패들](https://blog.po24lio.com/ko/failures-that-dont-throw.md): 아침 첫 대화에서만 취향 기억이 0건이었다. 에러 로그는 없었다. 이런 결함을 여섯 개 찾았고, 공통점이 하나 있었다. (에이전트 메모리 · 2026-08-29)
- [임계값은 고르는 게 아니라 재는 것](https://blog.po24lio.com/ko/thresholds-are-measured.md): 유사도 0.85. 이 숫자를 어디서 가져왔냐는 질문에 "그쯤이 적당해 보여서"라고 답하지 않으려고 한 일. (에이전트 메모리 · 2026-08-22)
- [예시가 지시문을 이긴다](https://blog.po24lio.com/ko/examples-beat-instructions.md): 한국어 대화에서 뽑은 기억이 영어로 저장되고 있었다. 지시문을 어디에 넣어도 소용없었고, 원인은 다른 곳에 있었다. (에이전트 메모리 · 2026-08-15)
- [채널 이름을 잘못 지었다](https://blog.po24lio.com/ko/a-channel-named-after-the-wrong-thing.md): 토큰 5개를 만들었는데 브라우저에는 195개가 도착했다. 스트리밍 코드는 멀쩡했고, 문제는 채널에 붙인 이름이었다. (멀티 에이전트 스트리밍 · 2026-03-13)
- [남의 스트림에 손을 대기로 했다](https://blog.po24lio.com/ko/touching-someone-elses-stream.md): 하루에 같은 열 줄을 다섯 번 고쳤다. 아무것도 잃지 않은 버전은 17분 만에 지운 것이었다. (동적 실행 엔진 · 2025-12-12)
- [데이터베이스를 쓸 수 없어서 파일시스템을 골랐다](https://blog.po24lio.com/ko/filesystem-instead-of-a-database.md): 사용자가 올린 파이썬을 런타임에 불러오려면 그 코드는 디스크의 진짜 파일이어야 한다. 그 하나의 제약에서 다섯 달치 버그가 나왔다. (동적 실행 엔진 · 2025-10-31)

## Posts (English)

- [I blamed iOS twice, and was wrong twice](https://blog.po24lio.com/en/blamed-ios-twice.md): A new user failed five times in a row, three minutes after signing up. I changed the container and the same person failed again. (Browser recording · 2026-09-09)
- [Where is midnight](https://blog.po24lio.com/en/where-is-midnight.md): The server runs on UTC. The user’s day starts on KST. That mismatch showed up in six places wearing six different faces. (Timezone boundaries · 2026-09-08)
- [I measured the abuse, then decided to do nothing](https://blog.po24lio.com/en/measuring-abuse-then-doing-nothing.md): Multi-account farming looked likely. Measuring it put the damage at $0.27. Instead of a countermeasure, I removed a defence that already existed. (Abuse response · 2026-09-07)
- [Taking on 13,000 lines of someone else’s code](https://blog.po24lio.com/en/vendoring-someone-elses-code.md): It could not be a dependency and it could not be a fork. I picked the third option, and the price was a set of rules with no exceptions. (Agent memory · 2026-09-05)
- [The deploy succeeded and the call returned 404](https://blog.po24lio.com/en/mounted-but-unreachable.md): The console said deployed, the registration API returned 200, and the route really was registered. No request could reach it. (Dynamic execution engine · 2026-09-01)
- [The failures that never throw](https://blog.po24lio.com/en/failures-that-dont-throw.md): The first conversation each morning came back with no preferences. There were no error logs. I found six defects of the same kind, and they had one thing in common. (Agent memory · 2026-08-29)
- [A threshold is measured, not chosen](https://blog.po24lio.com/en/thresholds-are-measured.md): Similarity 0.85. The work that went into not answering "it looked about right" when someone asks where the number came from. (Agent memory · 2026-08-22)
- [Examples beat instructions](https://blog.po24lio.com/en/examples-beat-instructions.md): Memories extracted from Korean conversations were being stored in English. No placement of the instruction helped, because the instruction was never the problem. (Agent memory · 2026-08-15)
- [The channel was named after the wrong thing](https://blog.po24lio.com/en/a-channel-named-after-the-wrong-thing.md): The model produced five tokens. The browser received 195. The streaming code was fine; the problem was the name on the channel. (Multi-agent streaming · 2026-03-13)
- [We decided to touch someone else’s stream](https://blog.po24lio.com/en/touching-someone-elses-stream.md): The same ten lines changed five times in one day. The version that lost nothing was the one deleted after seventeen minutes. (Dynamic execution engine · 2025-12-12)
- [We could not use a database, so we chose the filesystem](https://blog.po24lio.com/en/filesystem-instead-of-a-database.md): To import user-authored Python at runtime, the code has to be a real file on disk. Five months of bugs came out of that single constraint. (Dynamic execution engine · 2025-10-31)

## Optional

- [Index, Korean](https://blog.po24lio.com/ko): all posts, newest first
- [Index, English](https://blog.po24lio.com/en): all posts, newest first
- [Portfolio](https://po24lio.com): the author's work and background
- [RSS](https://blog.po24lio.com/rss.xml): feed of recent posts
