quad/.claude/session/2026-08-13-01-gcconn-audit-relate-cycle-spike-readme-sync.md
qwreey 5e6498a3e1
audit(lifecycle): partial gcconn trick verification, close Relate cycle spike gap
User confirmed the two Roblox-engine-dependent assumptions behind the
gcconn trick (ClassName signal never fires, Connection.Connected flips
synchronously on Destroy) via a Studio script; record what's verified vs
still open in a new audit/ folder and document the GC-trigger technique
used. While re-auditing the corpus, found relate-plan.md's ephemeron/
mutual-cycle claim was never actually run in Luau, and CLAUDE.md's
open-questions list still listed State as unresolved after it was
finalized in session 20 — add spike 18 and fix the stale entry. A
background sweep synced .claude/README.md's summary rows against
sessions 8-21 and added spikes 19/20 for newer ownership/refcount
mechanisms lacking coverage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PGWwZ8khc3Zq7DAnd4Uw6a
2026-08-13 10:09:47 +09:00

104 lines
6.4 KiB
Markdown

# 2026-08-13 첫 번째 세션 — gcconn 트릭 부분 실측, `Relate` 상호 순환 스파이크 신규, README 동기화
## 배경
사용자가 `base/lifecycle-pattern.md``bindLifetime`/`canExecute`가 기대는
"gcconn 트릭"의 핵심 가정 둘(ClassName PropertyChangedSignal 미발화,
`Connection.Connected``Destroy()` 시 GC 없이 동기적으로 `false`가 됨)을
Roblox Studio에서 직접 실측하는 저수준 스크립트를 짜서 돌려봄 —
`luau-test/10-roblox-studio-checks.server.luau`의 공식 스크립트는 아니고,
같은 두 가정만 따로 떼어 검증한 자작 스크립트. 출력 로그를 보여주며 "이걸로
`luau-test/README.md`가 '심각한 발견'이라고 못 박아둔 위험이 해소됐다고 볼
수 있는지" 확인 요청.
## 1단계 — 읽기 전용 검토(쓰기 금지 지시)
당시 다른 에이전트가 작업 중이라는 안내가 있어 쓰기 없이 결론만 냄:
스크립트/로직 자체는 정확했고, 두 핵심 가정(신호 미발화, Connected 즉시
전환) 모두 확인됨 — 하지만 공식 `10` 파일이 커버하는 나머지(A-1/A-2
`canBound`/`unbindLifetime` 이중 바인딩 게이트, Part B Attribute Instance
참조, Part C CollectionService 왕복)는 이 자작 스크립트가 아예 안 건드려서
"완전 해소"로 볼 수 없다는 게 결론 — 부분 확인.
## 2단계 — 문서화 요청
사용자가 이어서: (1) 해소된 부분만 정리해 `.claude/audit/` 같은 폴더에
남기고, (2) 실측에 쓴 "GC 강제 트리거" 기법(canary weak table + 할당 압력
+ `task.wait` 폴링)도 재사용 가능하게 문서화하고, (3) 그 김에 코퍼스 전체를
훑어 luau-test에 더 필요한 게 있는지/stale한 게 있는지 보고 적절히
갱신해달라고 요청.
## 한 일
**`.claude/audit/` 신설** — `gcconn-trick-verification.md` 작성: 확인된
것 4개(신호 미발화, 연결 살아있는 동안 클로저 캡처값 GC 안 됨, Destroy 직후
`Connected` 동기적 전환, Destroy+GC 후 클로저 캡처값 실제 수거), 아직 확인
안 된 것(A-1/A-2, Part B/C, `inst` 자체를 `__mode="k"` weak key로 쓰는
경로) 명확히 구분.
**GC 트리거 기법 문서화**`luau-test/gc-trigger-helper.server.luau`
신설(`waitForGC()` 복붙용 스니펫). 부수적으로 `07-relate-weak-table-gc.luau`
"Studio에서는 GC 타이밍 검증 자체가 불가능"이라던 서술이 이번 발견으로
틀렸음을 확인 — `collectgarbage()` API가 없다는 것만 맞고, 간접 관찰은
가능하다고 정정.
**`18-relate-mutual-cycle-gc.luau` 신규** — 코퍼스를 다시 훑던 중,
`relate-plan.md`의 "두 `Relate` 상호 강참조 순환은 ephemeron 없이는 GC가
안 풂"이라는 주장(Slot의 `kSlotMap`/`slotOwner` GC 수정 사례 전체의 유일한
근거)이 지금까지 **공식 문서 인용으로만** 뒷받침돼 있었고 실제 Luau로
재현해본 적이 없었던 갭을 발견 — 음성 대조군(순환 재현)/양성 대조군(한쪽을
weak-value로 낮추면 풀리는지) 둘 다 넣은 순수 luau CLI 스파이크로 작성.
**CLAUDE.md stale 항목 발견·수정** — "지금 할 일" 2번(용어 정리)이 여전히
`State`를 "1순위, 위험도 높음, open"으로 나열하고 있었는데, `question.md`
확인 결과 `State`는 이미 2026-08-12 스무 번째 세션에 확정(현재 이름 유지)돼
있었음 — `question.md`는 정확했고 CLAUDE.md의 압축 요약만 안 따라감. 실제
열려있는 항목 목록(`DI`→`D`, `Slot`, `canExecute`, `Brand`, `Tag`류,
`Attribute`/`AttributeKey`)으로 정정.
**서브에이전트에 위임한 코퍼스 전체 스윕** — 세션 8~21(전부 2026-08-12,
`retract는 항상 불림` 정정부터 `Compute` 네이밍 근거까지)이 지난 마지막
전체 감사(세션 16) 이후 `.claude/README.md`의 요약 테이블에 제대로
반영됐는지, 그리고 이 기간에 생긴 새 메커니즘 중 luau-test 커버리지가
빠진 게 있는지 조사 위임. 결과:
- `base/`/`research/` 문서 **본문 자체는 이미 전부 최신**이었음 — 갭은
전적으로 `.claude/README.md`의 요약 테이블(색인 레이어)에만 있었음.
`bind-system-plan.md`/`slot-plan.md`/`tag-plan.md`/`modifier-plan.md`/
`architecture.md`/`framework-comparison-findings.md`/
`operator-sugar-plan.md`/`pre-implementation-audit.md` 8개 행에
세션 12~21 변경사항을 인용 마커로 보강.
- `attribute-plan.md` 행은 단순 append가 아니라 실제 오류 수정 — 세션 11의
중간 단계(`v==nil` 가드)를 "현재 상태"인 것처럼 적어뒀는데, 세션 16이
이미 이걸 완전히 뒤집어(retract 완전 no-op) 낡은 서술이 됐던 것.
- **`19-ownership-refcount-relate-patterns.luau`**,
**`20-slot-splice-index-arithmetic.luau`** 신규 추가 — 세션 8~21에서
생긴 세 소유권/참조카운트 알고리즘(Tag `kTagMap`/`tagNameMap`, Attribute
`rawNew`+`owners`, Slot `elementOwner`)과 `Slot:Splice`의 시프트 산술이
03/04/11/18과는 다른 새 알고리즘 모양이라 실측 가치가 있다고 판단해
작성. Ref/Slot의 retract-via-`Relate`-diff(세션 8/9)는 기존 03/04와 같은
메커니즘 급이라 스파이크 불필요로 판단, 추가 안 함.
- Part C(세션 17~21의 `pre-implementation-audit.md`/
`framework-comparison-findings.md`/`operator-sugar-plan.md`/
`question.md`/`ROADMAP.md` 개별 파일 스팟체크)는 전부 이미 정확해서
추가 수정 없음.
## 결과물
- 신규: `.claude/audit/gcconn-trick-verification.md`,
`luau-test/gc-trigger-helper.server.luau`,
`luau-test/18-relate-mutual-cycle-gc.luau`,
`luau-test/19-ownership-refcount-relate-patterns.luau`,
`luau-test/20-slot-splice-index-arithmetic.luau`
- 수정: `luau-test/07-relate-weak-table-gc.luau`(docstring 정정),
`luau-test/README.md`(테이블/공통 유틸리티 절/갱신이력 8~9차/결과 확인
체크리스트), `base/lifecycle-pattern.md`(gcconn 구현 스케치에 실측 각주),
`.claude/README.md`(`audit/` 행 신설, `base`/`research` 테이블 9개 행
동기화), `CLAUDE.md`("지금 할 일" 1/2번)
## 남은 것
- 공식 `luau-test/10` 파일로 A-1/A-2/Part B/Part C 마저 확인 필요(`10`의
A 섹션 앞부분만 부분 확인된 상태).
- `01`~`06`, `08`, `09`, `11`~`20`(총 18개 중 `10` 제외 전부) — 여전히
사용자가 실제로 안 돌려봄, M0 착수 전 최우선 게이트.