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