# [철회됨] 복수 `PreRef`/`PostRef` 간 fire 순서를 "미보장"으로 두려던 안 **제안·철회 모두 2026-08-14 아홉 번째 세션**(원 결정: 2026-08-07 아홉 번째 세션). **현재 유효한 계약은 "배열 index 순서 그대로 보장"** — 즉 2026-08-07 결정이 그대로 살아 있음, 정본은 `base/ref-plan.md`의 "`phase` 옵션 폐기 → 위치로 표현, `PreRef` 신설" 절(복수 `PreRef` 간 순서 항목)과 "`PostRef`" 절. 이 파일은 **한 세션 안에서 뒤집었다 되돌린 왕복의 기록**이고, 남겨두는 이유는 양쪽 논거가 나중에 비슷한 판단(“보장할까 말까”)에서 다시 쓸 만해서임. ## 원래 계약 (2026-08-07 아홉 번째 세션, 지금도 유효) > 복수 `PreRef` 간 순서 — 새 규칙 불필요, **배열 index 순서 그대로**. > 이 pre-pass는 "배열 파트는 index 순서대로" 계약을 그대로 재사용해 > 리터럴 순서대로 fire하면 됨. ## 미보장으로 바꾸자던 안 (제안 → 같은 세션에 철회) 사용자 원 메모: > 각 PreRef 간의 순서는 보장 안함. PostRef간 순서는 보장 안함(실제로 > 하더라도, 안 한다고 두는게 버그를 차라리 덜 만든다고 생각함. 같은 계열 > 내 Ref 등록 순서에 의존하는 무언가가 생겨선 안된다는 생각, 그건 구조부터 > 잘못된거니까) 논지: (1) 순서에 의존하는 훅 코드는 애초에 설계가 잘못된 것이니 보장을 제공하면 그 구조를 권장하게 됨, (2) 보장을 안 하면 나중에 pre-pass 구현을 바꿀 자유가 남음, (3) 그 순서에 기대는 사용자 코드가 안 생겨 버그가 덜 남. **구현은 어차피 안 바뀌고 계약만 좁히는 변경**이었음(pre-pass는 미보장 상태에서도 index 순서로 훑음). ## 왜 철회했나 **결정적 반례 — `FastQuery(...) -> PreRef`류 조합(사용자 제시).** 어떤 팩토리가 `PreRef`를 반환하면서 뭔가를 미리 해결해두면, **배열에서 그 뒤에 오는 `OnCreated`가 "그게 이미 끝났다"를 전제로** 동작할 수 있음: ```lua Frame { FastQuery(...), -- PreRef를 반환하는 팩토리 OnCreated(function(inst) -- 위가 끝난 뒤에 불림 ... end), } ``` 이건 "잘못된 구조"가 아니라, **이 배열이 원래 제공하는 정당한 합성 방식**임 — children의 마운트 선후가 배열 위치로 정해지는 것(`base/ref-plan.md` "`phase` 옵션 폐기 → 위치로 표현, `PreRef` 신설" 절이 `phase` 옵션을 없앨 수 있었던 바로 그 이유)과 정확히 같은 성격이고, 서로 다른 저자가 쓴 항목(팩토리 제공자 vs 호출자)이 한 배열에 섞이는 유일한 자리이기도 함. 곁들여 확인된 것들: 1. **보장 비용이 0** — pre-pass가 어차피 index 순서로 훑고, `PostRef`의 `postRefList`도 그 스윕이 만든 목록이라 push 순서가 곧 배열 순서. 2. **미래 구현 자유를 내주는 것도 없음** — `base/dispatch-core-plan.md`가 이미 "배열 파트는 index 순서대로"를 **백엔드 이식성 때문에 명시적 계약**으로 못박아 뒀으므로, 어떤 백엔드든 index 순서를 제공해야 함. PreRef 순서 보장은 새 약속이 아니라 그 계약의 자동 귀결. 3. **미보장인데 결정론적이면 실효가 없음** — 런타임이 항상 index 순서로 주는 이상 위반이 테스트에서 절대 안 걸림. (Go의 map 순회 무작위화처럼 디버그 모드에서 일부러 역순으로 돌려 노출시키는 방법은 있으나, 이 사소한 규범 하나를 위해 장치를 더 만들 가치는 없다고 판단.) 4. **계약 표면에 예외가 하나 느는 비용** — "배열 파트는 순서 보장, 단 그 안의 PreRef끼리는 아님"을 읽는 사람이 따로 기억해야 함. ## 남은 것 보장은 유지하되 **스타일 권고**만 문서에 남김 — 순서로 조율해야 할 만큼 얽힌 훅이면 대개 하나의 훅 안에서 순서대로 부르는 게 낫고, 위 `FastQuery`처럼 "앞의 것이 뒤의 것의 전제를 만들어주는" 명시적 합성이 아니면 순서에 기대지 말 것(`base/ref-plan.md`/`base/lifecycle-hooks-plan.md` 양쪽에 기재).