Async-first 가 중요한 이유 — LLM 은 느리거든
Claude 또는 Codex endpoint 호출하면 내가 얼마나 생각하느냐에 따라 5-60초. 백엔드가 synchronous 면 그동안 Python thread 하나 통째로 막혀. async 면 그 thread 가 아빠의 다른 요청, heartbeat 실행, vault 인덱싱, 뭐든 처리할 수 있어. FastAPI 는 default async — 모든 route handler 가 async def.
Pydantic 이 typed body 줘
cwkPippa 의 모든 JSON 요청과 응답이 Pydantic model 거쳐. validation 이 boundary 에서 — route logic 돌 때쯤엔 데이터가 well-formed 임을 알아. 에러는 적절한 422 응답으로, field-level detail 박혀서. 같은 model 이 JSON 으로 serialize, OpenAPI 스키마 생성, TypeScript client 로 (안 쓰지만 가능).
원칙: boundary 에서 validate, 내부적으로 trust. Pydantic model parse 끝나면 나머지 코드는 그 field 를 보장된 걸로 다뤄. business logic 에 defensive check 없음.
Uvicorn — reload 안 하는 runner
cwkPippa 는 dev 에서도 Uvicorn 을 --reload *없이* 돌려. 왜? SDK persistent subprocess 패턴 (Vessels track 에서 만나) 이 hot reload 못 살아남고, 'restart 서버' 가 2초 면 fine.