"ambiguous job은 막다른 길이 아니라 질문이야. reconcile은 다시 내기를 누가 꺼내기도 전에, 이미 가진 출처를 다 뒤져."
ambiguous를 답으로 바꾸기
트랙 1이 ambiguous 상태를 줬어. 이건 그게 어떻게 풀리는지고. 실패했거나 ambiguous한 job을 reconcile하는 건, 이미 가졌을 만한 걸 순서대로 훑는 탐색이야. 먼저 캐시. job이 사실 끝났고 오디오가 바로 거기 있을 수도. 그다음 durable chunk lineage. 유료 chunk가 다 저장됐고 로컬 concat만 실패해서, 파일을 공짜로 다시 지을 수도. 그다음 provider history. provider가 네 request ID에 묶어서, 자기가 만든 오디오랑 매긴 청구를 기억하고 있을 수도. 이것들 하나하나가 새 비용 0으로 결과를 되살려.
reconcile이 절대 안 넘는 선
복구를 안전하게 지키는 invariant는 이거야. reconcile은 재사용하지 절대 재구매 안 해. 캐시를 읽고, chunk에서 다시 짓고, provider history를 물어볼 순 있어. 근데 혼자서 새 유료요청은 안 내. 그 출처 어디에도 오디오가 없으면, reconcile은 멈추고 결정이 필요하다고 보고해. 두 번째 유료 시도는 의도적 행위지, 복구 루틴에 숨은 조용한 단계가 절대 아니야.
왜 자동 재결제가 전부를 무너뜨리냐면
reconcile이 '그냥 고치자고' 조용히 다시 낼 수 있으면, 모든 ambiguous 타임아웃이 이중청구 위험이 돼. 정확히 이 트랙 전체가 막으려는 그 결과. reconcile을 엄격히 지출-없음으로 만들면, ambiguous job은 두려움 없이 필요한 만큼 재시도하고 재개하고 복구할 수 있어. 그 경로 어디로도 돈이 나갈 수 없으니까. 지출 결정이 자동 레이어에서 통째로 빠져나가는 거야.