docs: 감사 4라운드 반영 + const는 HUMAN_TODO로 이관(사용자 결정)

사용자 결정 — const 바인딩 재검토는 에이전트가 정할 문제가 아님. 논거:
pesde의 타입 추출(d.ts처럼 types emit)류 툴링이 미성숙해 const를 제공 못
하고 언제 가능해지는지도 불명확하며, 이는 사용자가 확인된 정보로 제공하는
게 맞다는 것. question.md에서 닫고 archive로 옮긴 뒤 HUMAN_TODO.md 8번
신설 — 사용자가 시점을 파악하거나 가능해질 때 에이전트에 알림. 그때까지
에이전트는 "일단 local로" 원칙 유지. architecture.md에 날짜와 논거 반영.

감사 4라운드(설계 코퍼스 각도):
- todos.md의 개수 하드코딩 2건 제거("체크리스트 8개", "11개 전원 완료")
  — 이 프로젝트 자신의 "개수는 소스 하나만" 규칙 위반이던 기존 항목
- 코퍼스 확실 발견 0건(설계 문서 쪽은 깨끗)

주입 경로 실측 둘:
- 에이전트 정의는 이번엔 HEAD보다 1커밋 전 — 뒤처지는 폭이 실행마다 다름을
  관측표에 4번째 행으로 추가
- CLAUDE.md @import 컨텍스트는 세션 시작 시점에 고정됨(감사자가 받은 것이
  세션 시작 커밋과 일치, 그 사이 7커밋). 메인 세션도 동일해 옛 conventions.md
  를 들고 있었음. 동작이 명확한 별개 경로라 conventions.md에 규칙으로 명시 —
  @import 파일을 고친 세션은 기억이 아니라 파일을 직접 Read해서 따를 것

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
qwreey 2026-08-16 04:01:29 +09:00
parent ebb1fd0f5a
commit 01c4abf727
Signed by: qwreey
GPG key ID: D28DB79297A214BD
8 changed files with 141 additions and 6 deletions

View file

@ -29,8 +29,15 @@ model: sonnet
> | 감사 1라운드 | 그 시점 HEAD 커밋(`1343796`)과 바이트 단위 동일 | > | 감사 1라운드 | 그 시점 HEAD 커밋(`1343796`)과 바이트 단위 동일 |
> | 감사 2라운드 | **어느 커밋과도 불일치** — 배너는 구버전인데 "출력 형식"의 `사용자 판단` 문단은 신버전인 하이브리드 | > | 감사 2라운드 | **어느 커밋과도 불일치** — 배너는 구버전인데 "출력 형식"의 `사용자 판단` 문단은 신버전인 하이브리드 |
> | 감사 3라운드 | 디스크 현재 내용과 바이트 동일(감사자 2개가 마커 문구로 각각 확인) | > | 감사 3라운드 | 디스크 현재 내용과 바이트 동일(감사자 2개가 마커 문구로 각각 확인) |
> | 감사 4라운드 | HEAD보다 **정확히 1커밋 전** 상태(하이브리드는 아니었음) |
> >
> **일관되게 낡은 것도 아니다** — 3라운드는 현재 내용을 그대로 받았다. > **일관되게 낡은 것도 아니다** — 3라운드는 현재 내용을, 4라운드는 1커밋 전을
> 받았다. 뒤처지는 폭이 실행마다 다르다.
>
> **별개 경로 주의**: `CLAUDE.md` `@import`로 들어오는 컨텍스트
> (`conventions.md`/`project-context.md`/`todos.md`)는 이것과 다른 주입
> 경로이고, **세션 시작 시점에 고정**된다(4라운드 실측: 세션 시작 커밋과
> 정확히 일치, 그 사이 7커밋). 그쪽은 불확실한 게 아니라 그냥 그렇게 동작한다.
> >
> 2라운드가 받은 텍스트는 메인 세션이 이 파일을 **여러 번에 나눠 편집하던 > 2라운드가 받은 텍스트는 메인 세션이 이 파일을 **여러 번에 나눠 편집하던
> 중간의 워킹트리 상태**와 일치했고, 그 상태는 커밋된 적이 없다(`git log -S`로 > 중간의 워킹트리 상태**와 일치했고, 그 상태는 커밋된 적이 없다(`git log -S`로

View file

@ -767,3 +767,23 @@ context-rejected.md`. 아래는 그중 **아직 실제로 열려있는 것만**
사용자가 구두로 세운 것인데 문서화가 누락됐다는 판단. 이 추정에서 사용자가 구두로 세운 것인데 문서화가 누락됐다는 판단. 이 추정에서
**"사용자 발언을 인용할 때는 논거까지 남긴다"는 새 관례**가 같이 나왔음 **"사용자 발언을 인용할 때는 논거까지 남긴다"는 새 관례**가 같이 나왔음
(`conventions.md` "작업 방식" 절). (`conventions.md` "작업 방식" 절).
## `const` 바인딩 미채택 판단의 재검토 트리거 (2026-08-16 신설 → 같은 날 해소)
**결론: 에이전트가 정할 문제가 아님 — 사용자가 확인된 정보로 제공하고,
추적은 `HUMAN_TODO.md` 8번이 소스.**
감사가 `base/architecture.md``const` 미채택 사유에 날짜가 없다고 지적해
"(a) 날짜만 / (b) 구체적 트리거 명시" 중 고르는 질문으로 올렸으나, 사용자가
**전제 자체를 정정**했다.
**사용자 논거 원문**: "const 건은 생각보다 더 컴플랙스함. 예를 들어 pesde 의
타입추출화 해서 d.ts 같이 types emit 하는 류가 있음. 아직 툴링이 미성숙한
상태라 const 를 제공 못하는 상황이고, 언제 다시 사용가능해지는지 명확치가
않음. 따라서 이는 사용자가 확인된 정보로 제공하는게 맞다고 보고 있음."
즉 (b)의 "구체적 트리거"를 에이전트가 적어둘 수 없는 종류의 문제다 —
툴링 체인(pesde types emit 등)의 지원 시점은 외부 사정이고 관측 수단이
에이전트에 없다. 그래서 질문을 닫고 `HUMAN_TODO.md` 8번(사용자가 시점을
파악하거나, 가능해질 때 에이전트에 알림)으로 옮겼다.

View file

@ -264,9 +264,16 @@ falsy(`nil`/`false`)여도 정확하게 동작함(`dispatch-core-plan.md`의
금지 대상은 어디까지나 `A and B or C` 3항 조합. 금지 대상은 어디까지나 `A and B or C` 3항 조합.
**`const` 바인딩도 Luau 공식 문법**(<https://luau.org/syntax/#const-bindings>) **`const` 바인딩도 Luau 공식 문법**(<https://luau.org/syntax/#const-bindings>)
이지만 **지금은 채택하지 않음** — 타입 추출/narrowing 등 주변 툴링이 이지만 **[2026-08-12 기준] 지금은 채택하지 않음** — 그 시점에 타입
아직 `const`를 폭넓게 지원하지 못해서, 지금 전면 도입하면 나중에 그 추출/narrowing 등 주변 툴링이 `const`를 폭넓게 지원하지 못해서, 전면
간극을 메꾸는 비용이 더 클 수 있음. **원칙**: 새로 짜는 코드는 일단 도입하면 나중에 그 간극을 메꾸는 비용이 더 클 수 있다는 판단.
**툴링 성숙도에 매인 판단이라 시간이 지나면 거짓이 될 수 있는데, 그
시점은 에이전트가 확인할 수 없음** — 사용자 설명(2026-08-16): pesde의 타입
추출처럼 `d.ts` 식으로 types를 emit하는 툴링이 아직 미성숙해 `const`
제공하지 못하고, **언제 다시 가능해지는지도 명확하지 않다**. 그래서 이건
사용자가 확인된 정보로 알려주기로 정해졌고, 추적은 루트 `HUMAN_TODO.md`
8번이 소스다. **알려주기 전까지 에이전트는 스스로 판단하지 말 것**
위 "일단 `local`로" 원칙을 그대로 따른다. **원칙**: 새로 짜는 코드는 일단
`local`로 — 나중 리팩터 시점에 특정 바인딩을 `const`로 바꾸는 비용이 `local`로 — 나중 리팩터 시점에 특정 바인딩을 `const`로 바꾸는 비용이
싸 보이면 그때 바꿔도 되고, 비싸 보이면 굳이 지금 손대지 않아도 됨. 싸 보이면 그때 바꿔도 되고, 비싸 보이면 굳이 지금 손대지 않아도 됨.
지금 `const`가 없다고 "이 프로젝트가 구식 Luau를 쓴다"고 오해하지 지금 `const`가 없다고 "이 프로젝트가 구식 Luau를 쓴다"고 오해하지

View file

@ -73,6 +73,13 @@ haiku, 일반 작업은 sonnet. 특히 소스코드를 많이 읽어야 하는
의심할 수 있지만, 없으면 영원히 현재형으로 읽힘. 의심할 수 있지만, 없으면 영원히 현재형으로 읽힘.
6. **인덱스 레이어 3개를 같이 갱신**: `.claude/README.md`(색인), 6. **인덱스 레이어 3개를 같이 갱신**: `.claude/README.md`(색인),
`question.md`(사용자가 답할 것만), 루트 `ROADMAP.md`/`HUMAN_TODO.md`. `question.md`(사용자가 답할 것만), 루트 `ROADMAP.md`/`HUMAN_TODO.md`.
- **⭐ [2026-08-16 실측] `@import`로 로드되는 파일(이 문서/`project-context.md`/
`todos.md`)을 그 세션에 고쳐도 **그 세션의 컨텍스트엔 반영되지 않는다.**
세션 시작 시점 버전이 그대로 남는다 — 4라운드 감사가 받은 임포트 블록이
세션 시작 커밋과 정확히 일치했고(그 사이 7커밋), 메인 세션 자신의
컨텍스트도 마찬가지였다. **그래서 이 문서를 고친 세션은 자기가 방금 쓴
규칙을 컨텍스트에서 못 본다** — 고친 뒤에는 기억에 의존하지 말고 파일을
직접 `Read`해서 따를 것. 다음 세션부터는 정상적으로 새 버전이 로드된다.
- **기계 점검 — `python3 .claude/tools/doc-check.py`.** 깨진 파일/절 - **기계 점검 — `python3 .claude/tools/doc-check.py`.** 깨진 파일/절
참조, README 색인 누락, 날짜 없는 시한부 주장, 미반영 배너를 한 번에 참조, README 색인 누락, 날짜 없는 시한부 주장, 미반영 배너를 한 번에
훑음. **커밋 전에 돌리는 게 기본** — 수동 감사에서 나온 발견의 대부분이 훑음. **커밋 전에 돌리는 게 기본** — 수동 감사에서 나온 발견의 대부분이

View file

@ -1377,3 +1377,19 @@ blob과 바이트 단위로 동일, 메인이 `git rev-parse`로 독립 확인).
`message.usage.iterations[]`의 opus 항목에 낚임, (2) 화면 최상단 세션 헤더, `message.usage.iterations[]`의 opus 항목에 낚임, (2) 화면 최상단 세션 헤더,
(3) 폐기된 워크플로의 픽스 에이전트 49개는 실제로 opus였던 것. 신뢰할 (3) 폐기된 워크플로의 픽스 에이전트 49개는 실제로 opus였던 것. 신뢰할
소스는 트랜스크립트 최상위 `message.model` 하나. 소스는 트랜스크립트 최상위 `message.model` 하나.
**[같은 세션, 감사 3·4라운드]** 3라운드는 `agent-memory/`가 재재정정을 안
따라온 걸 두 감사자가 독립으로 잡음(정정 커밋이 그 폴더를 안 건드림 —
"변경한 세션은 자기가 뭘 안 건드렸는지 모른다"의 교과서적 사례, 게다가 같은
파일이 한 세션에 두 번 연속 stale). 고치면서 그 메모리가 결론을 복제하지
않고 정의 배너를 **가리키기만** 하도록 바꿔 근본 원인을 제거. 4라운드는
코퍼스 확실 발견 0건이고 대신 (1) `todos.md`의 개수 하드코딩 2건(이 세션과
무관한 기존 항목), (2) `base/architecture.md``const` 미채택 사유에 날짜
없음을 잡음. 4라운드 부수 실측 둘 — 에이전트 정의는 이번엔 HEAD보다 1커밋
전이었고(뒤처지는 폭이 실행마다 다름), **`CLAUDE.md` `@import` 컨텍스트는
세션 시작 시점에 고정**됨을 확인(메인 세션도 옛 `conventions.md`/`todos.md`를
들고 있었음). 후자는 동작이 명확해서 `conventions.md`에 규칙으로 명시 —
**`@import` 파일을 고친 세션은 파일을 직접 `Read`해서 따를 것.**
`const` 건은 사용자가 전제를 정정 — pesde의 types emit 같은 툴링 체인 지원
시점은 에이전트가 관측할 수 없으므로 `HUMAN_TODO.md` 8번(사용자가 파악하거나
가능해질 때 알림)으로 이관.

View file

@ -399,3 +399,61 @@ Claude Code 세션 헤더**다:
부수적으로 둘 다 자기 모델을 "You are powered by the model named Sonnet 5. 부수적으로 둘 다 자기 모델을 "You are powered by the model named Sonnet 5.
The exact model ID is claude-sonnet-5."로 보고 — §13/§14의 트랜스크립트 The exact model ID is claude-sonnet-5."로 보고 — §13/§14의 트랜스크립트
실측과 일치. 실측과 일치.
## 16. 감사 4라운드 — 코퍼스는 깨끗, 대신 주입 경로 실측이 나옴
한 패스는 툴링, 다른 패스는 **설계 코퍼스**(`base/`/`research/`/`ROADMAP.md`)를
맡겼다. 이 세션이 툴링만 만졌으니 설계 쪽은 오래 안 훑인 영역이었다.
**설계 코퍼스 각도(B)** — 이 세션과 무관한 기존 항목 2건:
- `todos.md`가 "Handler 작성 체크리스트 **8개**", "우선순위1 **11개** 전원
완료"로 개수를 두 번째 장소에 하드코딩. 이 프로젝트 자신의 "개수는 소스
하나만" 규칙 위반이라 개수를 빼고 소스를 가리키게 함.
- `base/architecture.md``const` 미채택 사유에 날짜 없음 —
`doc-check.py`의 TEMPORAL 정규식이 못 잡는 자연어 변형("지금은 ~ 못해서").
감사 절차 7번이 노리는 유형이 실제로 걸린 사례. → 아래 §17.
감사가 확인만 하고 넘어간 것도 값졌다: `doc-check.py`
`dispatch-core-plan.md` 인용 WARN 클러스터 11곳을 직접 파본 결과 **전부 본문에
굵은 글씨 인라인으로 실존**했다(헤딩이 아니라 스크립트가 못 찾을 뿐).
그 문서가 최근 분리된 파일이라 "분리 후 인용자 안 따라옴" 패턴이 의심됐던
자리인데 콘텐츠 유실이 없음이 확인됐다.
**툴링 각도(A)** — 코퍼스 확실 발견 0건. 대신 주입 경로 관측 둘:
- 이번 라운드가 받은 **에이전트 정의**는 HEAD보다 정확히 1커밋 전이었다
(2라운드 같은 하이브리드는 아니었음). 관측표 4번째 행.
- **`CLAUDE.md` `@import` 컨텍스트는 세션 시작 시점에 고정된다** —
감사자가 받은 `conventions.md`/`todos.md`/`project-context.md`가 세션 시작
커밋(`8aeec76`)과 정확히 일치했고 그 사이 7커밋이 있었다. 감사자가
"메인 세션 컨텍스트도 그런지 확인해달라"고 요청해 메인이 자기 컨텍스트를
직접 확인 — **그렇다.** 이 세션의 메인은 삭제된 워크플로를 "먼저 돌릴 것"
이라 지시하는 옛 `conventions.md`와, 항목 6에서 끝나는 옛 `todos.md`
컨텍스트에 들고 작업해왔다(실제로는 파일을 직접 읽고 고치며 새 절차를
따랐으므로 행동에는 영향이 없었다).
이건 에이전트 정의 쪽의 "모르는 현상"과 달리 **경로가 다르고 동작이
명확한 것**이라 `conventions.md`에 규칙으로 적었다: **`@import` 파일을
고친 세션은 자기가 방금 쓴 규칙을 컨텍스트에서 못 보므로, 기억에
의존하지 말고 파일을 직접 `Read`해서 따를 것.**
## 17. [사용자 결정] `const` 미채택 재검토 — 에이전트가 정할 문제가 아니었음
감사가 "날짜만 붙일지, 구체적 트리거를 명시할지"를 사용자 판단으로 올렸는데,
사용자가 **전제 자체를 정정**했다.
**사용자 논거 원문**:
> "const 건은 생각보다 더 컴플랙스함. 예를 들어 pesde 의 타입추출화 해서
> d.ts 같이 types emit 하는 류가 있음. 아직 툴링이 미성숙한 상태라 const 를
> 제공 못하는 상황이고, 언제 다시 사용가능해지는지 명확치가 않음. 따라서
> 이는 사용자가 확인된 정보로 제공하는게 맞다고 보고 있음. 필요한 경우
> Human todo 에 해당 부분의 사용 가능해지는 시점을 파악하거나, 사용
> 가능해질 때 에이전트에 알려야할 필요를 명시해둬"
즉 "구체적 트리거"를 에이전트가 적어둘 수 없는 종류다 — pesde의 types emit
같은 툴링 체인의 지원 시점은 외부 사정이고 에이전트에 관측 수단이 없다.
그래서 `question.md`에서 닫고(→ `archive/question-resolved.md`)
**`HUMAN_TODO.md` 8번**으로 옮겼다: 사용자가 시점을 파악하거나, 사용
가능해질 때 에이전트에 알린다. **알려주기 전까지 에이전트는 스스로 판단하지
않고 "일단 `local`로" 원칙을 유지한다.**

View file

@ -33,7 +33,7 @@
아니라 **하강 diff**임, `retractFrom`은 3-인자, 클로저 인자는 아니라 **하강 diff**임, `retractFrom`은 3-인자, 클로저 인자는
`nil`이거나 같은 핸들러가 처리할 값(타입 보장), `HANDLER_PRIORITY_FALLBACK`, `nil`이거나 같은 핸들러가 처리할 값(타입 보장), `HANDLER_PRIORITY_FALLBACK`,
"base가 소유하는 핸들러와 주입되는 엔진 op"(`addTag`/`removeTag`/ "base가 소유하는 핸들러와 주입되는 엔진 op"(`addTag`/`removeTag`/
`setAttribute`). **Handler 작성 체크리스트 8개**를 새 핸들러 짜기 전에 `setAttribute`). **Handler 작성 체크리스트**(개수는 그 문서가 소스)를 새 핸들러 짜기 전에
훑을 것 — 지난 세션들에서 실제로 반복된 실수 목록임. 훑을 것 — 지난 세션들에서 실제로 반복된 실수 목록임.
해소 전 원문은 `archive/question-resolved.md`(0-Y/0-Z/0-A 절), 뒤집힌 옛 해소 전 원문은 `archive/question-resolved.md`(0-Y/0-Z/0-A 절), 뒤집힌 옛
@ -42,7 +42,7 @@
1. **구현 시작 — 루트 `ROADMAP.md`의 M0부터.** 설계 단계는 2026-08-04 로드맵 1. **구현 시작 — 루트 `ROADMAP.md`의 M0부터.** 설계 단계는 2026-08-04 로드맵
인수인계 라운드로 종료. `research/pre-implementation-audit.md` 우선순위1은 인수인계 라운드로 종료. `research/pre-implementation-audit.md` 우선순위1은
2026-08-12 열일곱 번째 세션에 마지막 넷(1-3/1-4/1-10/1-11)까지 전부 2026-08-12 열일곱 번째 세션에 마지막 넷(1-3/1-4/1-10/1-11)까지 전부
해소되어 **11개 전원 완료**. **[14차 세션 기준] 0-Y/0-Z/0-A까지 전부 해소되어 **전원 완료**(항목 수는 그 문서가 소스). **[14차 세션 기준] 0-Y/0-Z/0-A까지 전부
해소돼 설계 게이트는 남아있지 않음** — 착수 전 읽을 것은 위 0번의 두 해소돼 설계 게이트는 남아있지 않음** — 착수 전 읽을 것은 위 0번의 두
문서(`typing-limits.md`/`dispatch-core-plan.md`)뿐이고, 스파이크 상태는 문서(`typing-limits.md`/`dispatch-core-plan.md`)뿐이고, 스파이크 상태는
아래 그대로: 아래 그대로:

View file

@ -103,6 +103,26 @@ B(Attribute의 Instance 참조 타입)/C(CollectionService 태그 왕복) —
`.claude/luau-test/not-run/gc-trigger-helper.server.luau` 참고. 위 `.claude/luau-test/not-run/gc-trigger-helper.server.luau` 참고. 위
1번(MCP 연결)이 되면 에이전트가 대신 돌릴 수도 있음. 1번(MCP 연결)이 되면 에이전트가 대신 돌릴 수도 있음.
## 8. **[2026-08-16 신설, 안 막음]** `const` 바인딩 — 툴링이 언제 지원하는지 사용자만 알 수 있음
`base/architecture.md`의 "코드 스타일" 절이 `const` 바인딩을 **[2026-08-12
기준] 채택 안 함**으로 두고 있음. 사유가 "주변 툴링 미성숙"인데, **이건
에이전트가 확인할 수 없는 정보**라 사용자가 알려주는 게 맞다고 사용자
본인이 정리함(2026-08-16).
**사용자가 설명한 구체적 사정**: 예를 들어 **pesde**의 타입 추출 —
`d.ts`처럼 types를 emit하는 류의 툴링이 있는데, 아직 미성숙해서 `const`
제공하지 못하는 상황. **언제 다시 사용 가능해지는지가 명확하지 않음.**
**사람이 할 일 — 둘 중 하나**:
1. `const`를 쓸 수 있게 되는 시점을 파악해 알려주거나,
2. 사용 가능해지는 순간 에이전트에 알려줄 것.
둘 중 어느 쪽이든 **에이전트는 스스로 판단하지 않고 대기**한다 — 알려주기
전까지는 `architecture.md`의 "새로 짜는 코드는 일단 `local`로" 원칙을 그대로
따름. 알려주면 그때 `architecture.md`의 해당 절을 갱신하고 기존 코드의
`const` 전환 범위를 같이 상의할 것.
## 6. **[2026-08-13 신설, 안 막음]** 에디터의 Luau 솔버 설정 확인 ## 6. **[2026-08-13 신설, 안 막음]** 에디터의 Luau 솔버 설정 확인
`luau-analyze` CLI는 **새 솔버가 기본값**이지만 에디터가 쓰는 `luau-analyze` CLI는 **새 솔버가 기본값**이지만 에디터가 쓰는