quad/.claude/archive/preref-order-guaranteed-reversed.md
qwreey bcd02f1cec
docs(base): PostRef 확정·OnRendered 채택, PreRef/PostRef 계열 안 순서 미보장으로 역전
- base/ref-plan.md: "PostRef" 절 신설(PreRef의 거울상 — pre-pass 공동 수집,
  ProcessedPostRef 센티널+전담 Handler, 동적 경로 가드, _fired, 타입 차단).
  보장 범위를 명시: 자기 서브트리 완성은 보장하되 이 인스턴스가 부모에
  붙기 전에 불림(React componentDidMount와 다름).
- 복수 PreRef/PostRef의 계열 안 fire 순서를 "배열 index 순서 보장"에서
  미보장으로 역전 — 구현이 아니라 계약만 좁힘
  (archive/preref-order-guaranteed-reversed.md 신설).
- research/lifecycle-hooks-plan.md → base/ 승격, OnRendered 채택 반영
  (마지막 열린 항목이던 채택 여부/메커니즘/스코프/패키지 전부 확정).
- dispatch-core-plan/brand/architecture/slot/modifier/typing-limits/README/
  ROADMAP/question.md 전파. doc-check.py ERROR 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 05:45:31 +09:00

3.8 KiB

[역전됨] 복수 PreRef 간 fire 순서 = "배열 index 순서 그대로 보장" → 미보장

역전 일자: 2026-08-14 아홉 번째 세션 (원 결정: 2026-08-07 아홉 번째 세션). 현재 유효한 계약은 base/ref-plan.md의 "phase 옵션 폐기 → 위치로 표현, PreRef 신설" 절(복수 PreRef 간 순서 항목)과 같은 문서의 "PostRef" 절 — 이 파일은 히스토리 보존용이라 여기 적힌 걸 근거로 코드를 짜지 말 것.

원문 (2026-08-07 아홉 번째 세션 확정, bind-system-plan.mdref-plan.md)

  • 복수 PreRef 간 순서(2026-08-07 아홉 번째 세션, 사용자 확인) — 새 규칙 불필요, 배열 index 순서 그대로. 같은 인스턴스에 PreRef가 여럿 있으면, 이 pre-pass는 위 "props 순회 순서" 절이 이미 확정해둔 "배열 파트는 index 순서대로" 계약을 그대로 재사용해 리터럴 순서대로 fire하면 됨 — 서로 다른 우선순위/순서 개념을 별도로 만들 필요 없음 (호이스팅은 "PreRef 전체 대 나머지"에만 적용되는 규칙이지, "PreRef끼리" 에는 적용될 게 없음 — PreRef끼리는 그냥 평범한 배열 순회).

무엇이 뒤집혔나

구현이 아니라 계약이 뒤집힘. pre-pass가 배열을 index 순서로 훑는다는 구현은 그대로이고, 실제 fire 순서도 사실상 리터럴 순서일 것임 — 바뀐 건 그걸 사용자에게 보장하느냐임.

역전 전 현재
PreRef끼리의 상대 순서 보장(배열 index 순서) 보장 안 함
PostRef끼리의 상대 순서 (당시 PostRef 없음) 보장 안 함
호이스팅("PreRef 전체가 나머지보다 먼저") 보장 보장(변경 없음)
PostRef("두 패스가 전부 끝난 뒤") (없음) 보장

역전 이유 (사용자)

"PreRef는 프로퍼티/자식 들어오기 전에 설정됨. 각 PreRef 간의 순서는 보장 안함. PostRef는 프로퍼티/자식 들어온 후 설정됨, PostRef간 순서는 보장 안함(실제로 하더라도, 안 한다고 두는게 버그를 차라리 덜 만든다고 생각함. 같은 계열 내 Ref 등록 순서에 의존하는 무언가가 생겨선 안된다는 생각, 그건 구조부터 잘못된거니까)"

정리하면 셋:

  1. 순서에 의존하는 코드는 애초에 설계가 잘못된 것 — 두 훅의 상대 순서가 중요할 정도면 훅을 둘로 나눌 게 아니라 하나 안에서 순서대로 부르면 됨. 보장을 제공하면 그 잘못된 구조를 오히려 권장하게 됨.
  2. 보장하지 않으면 구현을 바꿀 자유가 남음 — pre-pass의 순회 방식을 나중에 바꿔도(예: 최적화, 백엔드별 자료구조 차이) 계약 위반이 아님. base/dispatch-core-plan.md가 "다른 백엔드가 props를 Lua 테이블이 아닌 자료구조로 표현할 수 있다"는 이유로 두 패스 순서를 명시적 계약으로 고정했던 것과 같은 결의 판단 — 거기선 보장이 필요해서 고정했고, 여기선 필요 없어서 안 고정함.
  3. 버그가 덜 생김 — 보장이 없으면 그 순서에 기대는 사용자 코드가 애초에 안 생김.

영향 범위

  • base/ref-plan.md — 해당 bullet 교체(역전 표시 + 이유), 새 "PostRef" 절도 같은 규칙으로 서술.
  • base/lifecycle-hooks-plan.md — "다중 등록 가능" 절에 "같은 계열끼리 순서 미보장" 경고 추가, ② 절의 "복수 PostRef 간 순서는 복수 PreRef와 같은 원칙(배열 index 순서 그대로)" 문장 정정.
  • ROADMAP.md M8 — "복수 PreRef는 배열 index 순서 그대로(별도 규칙 없음)" 체크리스트 문구 정정.
  • 코드 영향 없음(구현이 안 바뀌므로) — 바뀐 건 문서화 대상 계약뿐.