quad/.claude/session/2026-08-14-02-fallback-xpcall-spike-verified.md
qwreey c5ea3aa597
docs(research): Fallback의 xpcall+traceback 메커니즘 실측 확인
component-fallback-plan.md가 열어뒀던 "xpcall 에러 핸들러 배선 실측
필요" 질문을 luau 스파이크(component-fallback-xpcall-spike.luau)로
확인 — 클로저 업밸류 배선, 3단 중첩 debug.traceback 캡처 등 10개 검증
전부 통과. 부수적으로 error(msg) 기본 호출이 위치 접두("파일:줄: ")를
자동으로 붙인다는 캐비엇을 새로 확인해 "프로덕션에서의 동작" 절에 반영.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 02:54:37 +09:00

3.2 KiB

2026-08-14 두 번째 세션 — Fallback 메커니즘 xpcall 실측 확인

배경

직전 세션(2026-08-14-01-component-fallback-plan.md)에서 research/component-fallback-plan.md를 신설하며 "xpcall 에러 핸들러 배선의 실측 필요"를 열린 질문으로 남겨뒀음. 사용자가 새 워크트리로 이동해 직접 luau로 확인해보라고 요청, 메인 체크아웃은 다른 에이전트가 쓰는 동안 워크트리를 벗어나지 말라고 지시.

한 일

.claude/research/component-fallback-xpcall-spike.luau 스파이크 작성 — 문서의 Fallback 의사코드를 그대로 옮겨 luau로 10개 검증:

  1. 성공 경로 — onError 안 불리고 원래 반환값 그대로 통과
  2. 실패 경로 — onError의 반환값이 최종 결과, 에러 메시지 전달됨
  3. 에러 핸들러 안에서 클로저 업밸류(trace)에 쓴 값이 xpcall 리턴 후 onError 호출 시점에 정상적으로 보임(가장 핵심적인 확인 대상)
  4. 3단 중첩 호출(level1→level2→level3)에서도 debug.traceback(nil, 2)가 실패 지점(level3)까지 정확히 담음, level=2가 익명 에러 핸들러 프레임을 올바르게 스킵
  5. 비-문자열 에러 값(error({...}))도 손실 없이 onError에 전달됨
  6. 문서의 "추가 상태 필요하면 커링" 관용구가 그대로 동작
  7. vararg 컴포넌트 시그니처((T...) -> Comp)도 정상 동작

전부 통과, luau-analyze도 클린(타입 에러 0).

부수 발견 — 문서에 없던 캐비엇: error(msg)를 레벨 지정 없이(Luau 기본 level=1) 호출하면 onError가 받는 메시지에 Luau가 자동으로 "파일:줄: " 위치 접두를 붙임 — Fallback이 붙이는 게 아니라 error() 자체의 기본 동작. error(msg, 0)으로 호출하면 접두 없이 순수 메시지만 전달됨. 최초 스파이크 작성 시 이걸 몰라 커링 테스트가 실패했었고 (exact-match assert가 접두 포함 문자열과 안 맞아서), 원인 확인 후 전용 테스트(6번)를 추가하고 기존 assert를 contains 방식으로 고쳐서 재통과시킴 — 테스트 버그가 아니라 실제 Luau 동작이었음을 별도 pcall 디버그로 먼저 확인한 뒤 정식 반영.

반영

research/component-fallback-plan.md:

  • 메커니즘 스케치 절에 실측 완료 표시 + 위치 접두 캐비엇 추가
  • "열린 질문 — xpcall 에러 핸들러 배선의 실측" 항목을 해소로 표시
  • "프로덕션에서의 동작" 항목에 위치 접두가 raw 정보에 포함된다는 점 추가
  • 상단 상태 요약에 스파이크 파일 포인터 추가

README.md research 표 갱신. 새로 연 설계 질문 없음 — 백로그 우선순위(맨 뒤, 착수 안 함)는 그대로.

워크트리 메모

이번엔 처음부터 필요한 파일(README.md/CLAUDE.md/component-fallback-plan.md/ doc-check.py)만 메인 체크아웃(로컬 main)에서 복사해 워크트리 안에서 편집 — 직전 세션에서 정정한 원인(EnterWorktree 기본값이 origin/master에서 갈라치는데 계획 문서는 SAFETY.md 때문에 로컬 main에만 있음)을 그대로 재확인, 새로 놀랄 것 없었음.