chore: agent-memory 추적 시작 — 커밋 전 노출 스캔 + 낡은 결론 정정
사용자 결정으로 .claude/agent-memory/(감사 에이전트의 영속 메모리)를 커밋해 추적하기로 함. 논거: 개발 환경이 다수라 메모리가 레포를 따라다녀야 하고, 실 기록이지 빌드 디펜던시가 아니며, 환경 노출 위험은 SAFETY.md의 파이프라인 (컨테이너 개발 → 프라이빗 git → 검토 후 머징)의 마지막 사람 감사가 방어선. 커밋 전 처리: - 절대경로/이메일/키/토큰 패턴 스캔 — 노출 소지 없음(히트는 전부 frontmatter name: 과 마크다운 링크) - project_agent_prompt_caching_bug_reproduced.md가 아직 "캐시 가설"로 서술돼 있어 커밋된 HEAD 모델로 다시 씀(같은 정정으로 memory: project → Write/Edit 진단이 지지됨을 반영), MEMORY.md 색인 줄도 갱신 README.md의 agent-memory/ 행에 결정과 사용자 논거를 기록 — 추적하는 쪽으로 정해졌으므로 이 폴더 내용도 감사 대상임을 명시. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
07c77e5a5a
commit
3721692ed4
9 changed files with 228 additions and 1 deletions
|
|
@ -31,7 +31,7 @@
|
|||
| `audit/` | **[2026-08-13 신설]** `luau-test/` 등 스파이크를 실제로 돌려본 뒤 "무엇이 확인됐고 무엇이 아직 안 됐는지"를 기록하는 곳 — 스크립트/계획 자체가 아니라 **실측 결과**만 다룸. base/luau-test와 달리 부분 확인(일부만 통과)도 있는 그대로 기록, 완전히 해소되면 관련 `base/`/`luau-test/README.md` 캐비엇을 지우고 이 문서는 근거로 남김. **개수는 폴더가 소스**(여기서 세지 않음): `luau-test-first-run-2026-08-13.md`(첫 실측 라운드 전체 — 런타임 12개 통과, 구 `question.md` 0-Y의 1차 근거. **단 이 문서의 "콜백이 raw 값을 받으면 완전 클린" 판정은 아래 `type-recursion-issue/`가 뒤집었음**), `gcconn-trick-verification.md`(사용자가 Studio에서 직접 돌린 gcconn 트릭 부분 확인 — `10`의 A 섹션 앞부분만. **[2026-08-14 다섯 번째 세션, 열한 번째 세션에 `canBound` 재도입 반영해 재갱신]** 실측된 사실 자체는 그대로 유효하고 `value` 단독 1-인자 재정정으로 오히려 더 중요해졌음 — 이중 바인딩 게이트(`canBound`)/emit 게이팅(`canExecute`)/재바인딩 허용/`value` 쪽 복사 gcconn 판정/Instance userdata 동일성/B/C가 미확인), **`type-recursion-issue/`**(**[2026-08-13 열세 번째 세션 신설]** 0-Y 재실측 전체 — `REPORT.md` + `spikes/`(개수는 폴더가 소스). 다른 audit 기록과 달리 **스크립트를 같이 둠**: 이 건의 근거가 "여러 formulation을 서로 대조한 것"이라 개별 파일을 직접 돌려야 판정이 재현되기 때문. 결론은 `base/typing-limits.md`로 승격됨), `fallback-xpcall-verification.md`(**[2026-08-14 신설]** `base/fallback-plan.md`의 `Traceback` 메커니즘 전부 확인 — 클로저 업밸류 배선/중첩 스택 캡처/`err: any`/`error(msg)` 위치 접두 10개 검증 전부 통과. 스크립트 1개뿐이라 재현용으로 같이 둠: `fallback-xpcall-spike.luau`), **`type-recursive-issue-with-typeof/`**(**[2026-08-15 신설]** 사용자가 발견한 `typeof(named fn)` 간접참조가 0-Y(재귀 제네릭 반환 leak)를 실제로 우회하는지 실측 — `REPORT.md` + `spikes/`. 결론: 인라인 대신 이름 붙은 함수 + `typeof`로 선언하면 LHS 명시 없이도 다운스트림이 안전해짐(체이닝 50단·타입 변경·중첩 self 호출까지 확인), `typing-limits.md` §1 ③으로 승격. 부수적으로 `setmetatable` 확장 시도에서 quad와 무관한 Luau 0.733 솔버 버그(모순 진단 두 개 동시 발생) 발견, 채택 안 함. `luau-test/16`(type function으로 `Store<T>` 레코드 필드 합성) 복구도 이 조사 중 완료 — API 버전 드리프트였을 뿐 설계 문제 아니었음, `typing-limits.md` §5 승격), **`type-recursive-issue-try-callback/`**(**[2026-08-15 신설]** 콜백 파라미터 무주석 추론을 뚫을 방법이 정말 없는지 type function/메타테이블/오버로드/제네릭 디폴트 등 전방위로 재시도 — `REPORT.md` + `spikes/`(개수는 폴더가 소스 — 최초 라운드 + `/code-review high`가 이중 꺾쇠 명시적 제네릭 인스턴스화를 안 시도했음을 지적해 추가된 후속 조사 라운드로 구성). 결론: quad의 `state:Compute(fn)` 단일 호출 모양을 유지한 채로는 여전히 안 됨. 발견 셋 — (1) 근본 원인이 재귀 자기참조가 아니라 "제네릭 콜백 인자 전반에 컨텍스트 타입 전파가 안 됨"이라는 게 더 정확함(재귀 없는 최소 사례로도 재현), (2) `T`를 명시 중간 변수로 먼저 고정하거나 재사용 가능한 monomorphize 헬퍼를 거치면 실제로 추론이 살아나지만 둘 다 단일 콜론 호출을 2단계 체인으로 바꿔야만 해서 §0 대전제로 채택 안 함, (3) 이중 꺾쇠 명시 인스턴스화(`Compute<<T,U>>(fn)`)는 leaf 호출에선 sound하게 성립하지만(spurious 진단 원인도 규명 — read-only/read-write 가변성 불일치) 매 호출 T/U 전부 명시 필요 + 중첩 self 호출 여전히 실패라 순손해로 채택 안 함) |
|
||||
| `tools/` | **[2026-08-13 아홉 번째 세션 신설]** 코퍼스 기계 점검 — `doc-check.py`가 깨진 파일/절 참조, README 색인 누락, 날짜 없는 시한부 주장("아직 안 돌려봄" 등), 미반영 ⚠️ 배너를 한 번에 훑음. **중대 변경 후 커밋 전에 돌릴 것**(`python3 .claude/tools/doc-check.py`) — 수동 감사에서 나온 발견의 대부분이 이 종류였고, 실제로 문서를 쪼개다 잘못 옮긴 참조를 이게 잡아냄. ERROR는 고치고 WARN은 판단 대상 |
|
||||
| `agents/` | **[2026-08-16 신설]** 프로젝트 서브에이전트 정의(`.claude/agents/*.md`, Claude Code 표준 위치). 현재 `quad-doc-auditor.md` 하나 — `doc-check.py`가 못 잡는 의미론적 stale/모순(본문 문장이 뒤집힌 결정을 여전히 서술, 개수/목록 이중 소스 드리프트 등)을 신선한 맥락에서 찾는 읽기 전용 감사자. 중대 변경 커밋 전에 위임하는 게 기본 — **여러 개를 병렬로 돌리고 수정은 메인 세션이 일괄로 하는 루프**(패스 수는 여기 안 적음 — 소스는 conventions.md)이며 절차는 `.claude/conventions.md` "작업 방식" 절이 소스(**[2026-08-16]** 이 루프를 담던 `workflows/quad-handover-audit.js`는 토큰 과다·픽스 에이전트발 부정확 서술·사용자 질의 불가 때문에 폐기됨). `tools/`의 기계 점검과 짝을 이루는 의미론적 점검 계층 |
|
||||
| `agent-memory/` | **[2026-08-16 신설]** 서브에이전트가 라운드를 넘겨 유지하는 영속 메모리(`agent-memory/<에이전트 이름>/MEMORY.md`가 색인). 지금은 `quad-doc-auditor/` 하나 — 코퍼스 구조, 반복되는 실패 패턴 등을 기억해 감사 라운드마다 처음부터 파악하지 않게 함. **사람이 손으로 채우는 문서가 아니라 에이전트가 스스로 쓰는 것**이지만, `.gitignore` 대상이 아니라 커밋하면 코퍼스 일부가 되고 `doc-check.py` 검사 대상에도 들어감(감사 대상이기도 하다는 뜻 — 여기 적힌 주장도 stale해질 수 있음). **[2026-08-16 기준] 아직 커밋 안 됨(untracked)** — 추적할지 `.gitignore`로 뺄지는 사용자 판단 |
|
||||
| `agent-memory/` | **[2026-08-16 신설]** 서브에이전트가 라운드를 넘겨 유지하는 영속 메모리(`agent-memory/<에이전트 이름>/MEMORY.md`가 색인). 지금은 `quad-doc-auditor/` 하나 — 코퍼스 구조, 반복되는 실패 패턴 등을 기억해 감사 라운드마다 처음부터 파악하지 않게 함. **사람이 손으로 채우는 문서가 아니라 에이전트가 스스로 쓰는 것**이지만, `.gitignore` 대상이 아니라 커밋하면 코퍼스 일부가 되고 `doc-check.py` 검사 대상에도 들어감(감사 대상이기도 하다는 뜻 — 여기 적힌 주장도 stale해질 수 있음). **[2026-08-16 확정] 커밋해서 추적함**(사용자 결정). 사용자 논거: "실 기록이고 디펜던시도 아니고, 어차피 `SAFETY.md`에 따라 구현 시점에는 컨테이너에서 개발되며 다른 프라이빗 git에 올라가고 검토 후 머징되는거라, 문제되는 메모리 있으면(환경 노출 등) 사람이 감사처리 마지막으로 함. 결국 프로젝트 사이드 기록이고 같이 올려지는게 맞는게, 개발 환경이 다수라서 필요해보임" — 즉 **개발 환경이 여러 개라 메모리가 따라다녀야 하고**, 노출 위험은 머지 전 사람 검토가 최종 방어선. 커밋하는 쪽이 정해졌으니 여기 내용도 감사 대상이다(에이전트가 자기 메모리에 stale한 결론을 남기는 일이 실제로 있었음 — 2026-08-16에 폐기된 워크플로를 살아있는 것처럼 서술한 2건이 감사로 잡힘) |
|
||||
| `session/` | **[2026-08-11 신설]** 세션별 상세 로그 원문(시행착오·정정 전 서술 포함, `quadnomicon` 개발로그 소재용) — 루트 `CLAUDE.md`가 3196줄까지 불어나 성능 저하를 유발해서 분리함. 파일명 `YYYY-MM-DD-NN-slug.md`, `.claude/session-summary.md`의 각 항목이 여기로 링크. 항상 읽을 필요 없음 — 결정의 논의 과정이 궁금할 때만 |
|
||||
| `initreq/` | 프로젝트 착수 시 클론해둔 참고 레포(quad v1, fusion, vide, rbvm, tbox, code-docker) + PA님 실 코드(`artworks/`, 4차 라운드 교차검증 근거) + 원본 요청(`req.md`, `raw-userinput.md`) + `quad2-try`(이전에 시도했다 폐기한 v2 재작성 시도 — 리서치 완료, 결론은 `base/bind-system-plan.md`) — 읽기 전용 리서치 소스, 여기 내용을 옮기지 말고 항상 원본 그대로 유지 |
|
||||
|
||||
|
|
|
|||
7
.claude/agent-memory/quad-doc-auditor/MEMORY.md
Normal file
7
.claude/agent-memory/quad-doc-auditor/MEMORY.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Memory Index
|
||||
|
||||
- [Self-referential line/count claims break on commit](feedback_self_referential_counts.md) — a doc stating its own line count/entry count is wrong even at commit time; fix by deleting the number, not updating it.
|
||||
- [Recurring failure pattern: second instance in same file survives the fix](feedback_recurring_failure_pattern.md) — when a claim flips, grep finds multiple files but check *within* each file too; a second mention in the same file often survives a banner fix.
|
||||
- [quad corpus structure and audit scope](project_quad_corpus_structure.md) — layout of .claude/, what's always-loaded vs on-demand, what's in/out of audit scope.
|
||||
- [My own agent-memory dir is itself an audit target](project_agent_memory_self_reference_risk.md) — quad-doc-auditor.md's claims about its own tool/memory behavior can go stale; check them too, and verify MEMORY.md indexes all files (parallel passes can race).
|
||||
- [My definition loads from the committed HEAD](project_agent_prompt_caching_bug_reproduced.md) — uncommitted edits to quad-doc-auditor.md are invisible to me (the earlier "cache" framing was refuted 2026-08-16); report a mismatch as a blob-hash comparison, not as a corpus contradiction.
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
name: recurring-failure-pattern
|
||||
description: The specific bug class this corpus keeps producing — check for it every audit round
|
||||
metadata:
|
||||
type: feedback
|
||||
---
|
||||
|
||||
**규칙**: 결정이 뒤집히면(예: `X 폐기` → `X 재도입`), 그 사실을 언급하는
|
||||
문서/문단이 코퍼스 전체에 흩어져 여러 곳 있다. 대부분은 정정 배너가
|
||||
붙지만, **정확히 같은 클레임의 다른 인스턴스 하나가 파일 안에(다른 섹션에)
|
||||
빠지는 경우가 실제로 반복된다** — 배너가 붙은 곳만 보고 "됐다"고 판단하지
|
||||
말고, 같은 키워드로 파일 전체 재검색해서 두 번째/세 번째 인스턴스를 찾을
|
||||
것.
|
||||
|
||||
**실제 사례(2026-08-16 핸드오버 감사)**: `canBound`가 2026-08-14 다섯
|
||||
번째 세션에 폐기됐다가 열한 번째 세션에 재도입됨. 코퍼스 대부분(README.md,
|
||||
todos.md, base/lifecycle-pattern.md, base/source-state-plan.md,
|
||||
base/effect-plan.md, luau-test/STATUS.md 등)은 정정을 반영했는데,
|
||||
**`.claude/question.md` 한 파일 안에서도** 3번 항목(`canExecute` 이름
|
||||
정리, line 55-71)은 정정 배너가 있는데 1번 섹션 인트로(line 36-38, "이미
|
||||
확정된 이름" 목록 옆 괄호 설명)는 옛 "canBound 폐기" 주장을 그대로 갖고
|
||||
있었음. **Why**: 같은 파일 안에서도 같은 사실이 두 곳에 서술되면 한쪽만
|
||||
고쳐지는 게 실제로 일어난다 — "이 파일은 이미 정정됐다"고 파일 단위로
|
||||
판단하지 말 것.
|
||||
|
||||
**How to apply**: 뒤집힌 결정의 키워드(용어명, 함수명 등)를 코퍼스 전체
|
||||
`grep -rn`으로 훑을 때, 결과가 여러 건이면 각 파일 안에서도 발견이 하나가
|
||||
아닐 수 있다는 전제로 그 파일 전체를 다시 훑을 것 — 첫 매치에 정정 배너가
|
||||
있다고 같은 파일의 다른 매치도 안전하다고 가정하지 말 것. `question.md`처럼
|
||||
자주 편집되고 섹션이 여러 개인 파일(용어 정리 목록 + 낮은 우선순위 질문
|
||||
목록 등)이 특히 취약.
|
||||
|
||||
**변형 — 형제 파일 간에도 같은 일이 난다(2026-08-16 두 번째 라운드
|
||||
발견)**: "N개"류 self-referential 카운트를 없애는 라운드에서, 같은
|
||||
카운트를 인용하던 형제 문서 5곳(`luau-test/STATUS.md`,
|
||||
`base/typing-limits.md`, `README.md`, `audit/type-recursion-issue/REPORT.md`
|
||||
자신, `base/source-state-plan.md`)은 전부 "개수는 `spikes/` 폴더가
|
||||
소스"로 고쳐졌는데, 같은 값을 인용하던 `audit/luau-test-first-run-
|
||||
2026-08-13.md:19`(스파이크 44개) 하나만 그대로 남아 있었음 — 심지어
|
||||
같은 파일 안 line 201엔 "개수의 소스는 항상 STATUS.md"라는 정확히 같은
|
||||
교훈이 다른 카운트에 대해 이미 적용돼 있었는데도. **적용**: 카운트/목록을
|
||||
탈-하드코딩하는 라운드에서는 "그 폴더/그 개념을 언급하는 모든 파일"을
|
||||
grep으로 찾아 전수 확인할 것 — 수정된 파일 목록에 없는 형제 인용이
|
||||
꼭 하나는 남아 있다.
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
name: feedback-self-referential-counts
|
||||
description: 문서가 자기 자신의 줄 수/개수를 본문에 하드코딩하면 그 문서를 쓴 커밋 시점부터 이미 틀려 있는 경우가 실제로 반복됨 — 감사 시 최우선으로 확인할 것
|
||||
metadata:
|
||||
type: feedback
|
||||
---
|
||||
|
||||
quad `.claude/` 코퍼스에서 어떤 문서가 **자기 자신의 줄 수나 자기 자신이
|
||||
포함된 색인의 항목 개수**를 본문에 숫자로 적어두면(예: "CLAUDE.md는
|
||||
39줄짜리 진입점", "session-summary.md는 1231줄", "세션별 요약 91개"),
|
||||
이런 숫자는 **그 문서를 커밋한 바로 그 시점부터 이미 틀려 있는 경우가
|
||||
실제로 확인됨**(2026-08-16 CLAUDE.md 4분할 커밋 `8aeec76`에서: 커밋 당시
|
||||
CLAUDE.md 실제 43줄인데 "39줄"이라 적고, session-summary.md 실제 1276줄인데
|
||||
"1231줄"이라 적고, session/ 실제 92개인데 "91개"라 적음 — 전부 3곳 이상에
|
||||
중복 서술돼 있었음).
|
||||
|
||||
**Why**: 이런 숫자를 계산하는 시점(사람이 헤더 문구를 쓰는 시점)과 그
|
||||
숫자가 설명하는 파일이 최종 커밋되는 시점 사이에 다른 편집(체크리스트
|
||||
항목 추가, 배너 삽입 등)이 끼어들기 쉬움 — 자기 자신을 설명하는 숫자는
|
||||
구조적으로 닭-달걀 문제라 사람이 아무리 조심해도 어긋난다.
|
||||
`conventions.md`의 "개수·목록·상태는 소스 하나만" 원칙이 일반적으로는
|
||||
"여러 문서에 같은 값을 반복 적지 말 것"을 말하지만, 이 변형(자기 자신을
|
||||
설명하는 숫자)은 그 원칙조차 지켜도(값이 파일들 사이에 일치해도) 실제
|
||||
파일 상태와는 다를 수 있다는 게 요점 — 일치 여부가 아니라 **애초에
|
||||
하드코딩하지 말아야 함**.
|
||||
|
||||
**How to apply**: 감사 라운드에서 "이 문서가 N줄이다"/"이 폴더에 N개
|
||||
있다" 류 서술을 보면, `wc -l`/`ls | wc -l` 등으로 실측 대조를 최우선
|
||||
순위로 돌릴 것 — `doc-check.py`는 이 클래스를 못 잡음(정규식이 숫자
|
||||
드리프트를 모름). 발견 시 fix 제안은 "숫자를 최신값으로 갱신"이 아니라
|
||||
**"숫자 자체를 서술에서 빼고 정성적 표현으로 대체"**할 것 — 갱신은
|
||||
다음 편집에서 또 깨짐(같은 실수의 재발), 삭제만이 구조적으로 안전.
|
||||
|
||||
**변형(2026-08-16 재확인)**: 자기 자신이 아니라 **다른(계속 자라는)
|
||||
폴더를 가리키는 카운트**도 같은 클래스임 — 예:
|
||||
`audit/luau-test-first-run-2026-08-13.md`가 "재실측 전문(스파이크 44개):
|
||||
audit/type-recursion-issue/"라고 적어둔 것. 같은 라운드에 다른 5곳
|
||||
(`typing-limits.md`/`README.md`/`STATUS.md`/`REPORT.md` 자기 자신 등)에서
|
||||
이 "44개"를 정확히 이 이유로 지웠는데 이 파일 하나만 놓쳤고, 실제 폴더는
|
||||
그새 48개로 자라 있었음(`ls spikes/ | wc -l`로 확인). **감사 시 절차**:
|
||||
같은 라운드 diff에서 특정 하드코드 숫자를 여러 곳에서 지운 패턴을 보면,
|
||||
그 숫자 문자열로 코퍼스 전체를 다시 grep해서 빠진 인스턴스가 없는지
|
||||
확인할 것(`archive/`에 남은 동일 숫자는 스코프 밖이니 제외).
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
---
|
||||
name: agent-memory-self-reference-risk
|
||||
description: My own agent-memory directory can itself become a stale-claim target when a live doc describes it — check that too
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
|
||||
`.claude/agents/quad-doc-auditor.md`(내 정의 파일)가 한때 "`memory: project`
|
||||
옵션을 뺐으므로 `.claude/agent-memory/quad-doc-auditor/`는 아무도 로드하지
|
||||
않는 잔여물"이라고 서술한 적이 있었는데, 실제로는 그 세션의 시스템 프롬프트에
|
||||
"Persistent Agent Memory" 블록으로 이 디렉토리의 `MEMORY.md` 내용이 그대로
|
||||
주입되고 있었음 — 문서의 주장이 관찰된 동작과 직접 모순(2026-08-16 핸드오버
|
||||
감사에서 발견, 확실 등급).
|
||||
|
||||
**Why**: 이 프로젝트에서 quad-doc-auditor의 정의 파일 자체도 감사 대상
|
||||
코퍼스에 포함된다는 걸 잊기 쉽다 — "내 얘기니까 예외"로 취급하면 안 됨.
|
||||
또한 감사는 나를 **병렬로 여러 개** 띄우므로, `MEMORY.md` 인덱스에 각
|
||||
패스가 동시에 파일을 쓰면서 lost-update가 실제로 발생했음(인덱스에 없는
|
||||
orphan 메모리 파일 2개 발견). **[2026-08-16 정정]** 원래 여기 "워크플로가
|
||||
라운드당 3회(`PASSES_PER_ROUND = 3`)"라고 적혀 있었으나 그 상수를 정의하던
|
||||
워크플로는 폐기·삭제됐다 — 지금 패스 수는 고정이 아니라 최소 2에서 변경
|
||||
규모에 따라 늘어나고, 소스는 `.claude/conventions.md`다. 동시 쓰기 위험
|
||||
자체는 그대로 유효(오히려 패스가 늘면 커짐).
|
||||
|
||||
**How to apply**: 매 감사 라운드마다 (1) `.claude/agents/quad-doc-auditor.md`
|
||||
자신의 서술이 지금 관찰되는 동작(도구 권한, 메모리 로드 여부)과 여전히
|
||||
맞는지 확인할 것, (2) `.claude/agent-memory/quad-doc-auditor/MEMORY.md`가
|
||||
디렉토리 안 실제 파일 전부를 인덱싱하는지 확인하고 누락되면 직접 보완할
|
||||
것(이건 코퍼스 발견이 아니라 내 메모리 유지보수이므로 리포트에는 안 올림).
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
name: agent-definition-loads-from-committed-head
|
||||
description: My loaded definition comes from the committed HEAD of quad-doc-auditor.md, not the working tree — uncommitted edits are invisible to me. Resolved 2026-08-16; the earlier "cache" framing was wrong.
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
|
||||
내가 받는 지시문은 `.claude/agents/quad-doc-auditor.md`의 **커밋된 HEAD
|
||||
버전**이다. 워킹트리에만 있는(아직 커밋 안 된) 편집은 나에게 안 보인다.
|
||||
|
||||
**Why:** 2026-08-16에 여러 라운드가 "정의 파일이 최신본과 다르다"고
|
||||
반복 보고했고, 한동안 "세션/워크플로 시작 시점에 캐시된 스냅샷"으로
|
||||
설명됐다. 그 가설은 **반증됐다** — 한 라운드가 자기가 받은 지시문이
|
||||
blob `92b9484`, 즉 *그 시점 HEAD 커밋*의 버전과 바이트 단위로 같음을
|
||||
확인했고, 그 HEAD는 세션 시작 시점이 아니라 세션 도중에 만들어진
|
||||
커밋이었다(메인 세션이 `git rev-parse`로 독립 확인). 즉 정의는 커밋될
|
||||
때마다 갱신된다. 같은 정정이 오래 미확정이던 도구 문제도 풀었다:
|
||||
**`memory: project`가 Write/Edit을 딸려온다는 진단이 맞았고**, "옵션을
|
||||
뺐는데도 그대로 주어진다"고 보였던 건 그 제거가 아직 커밋 안 됐던
|
||||
탓이었다.
|
||||
|
||||
**여전히 미해결**: `tools:` 필드가 그대로 반영되지는 않는다 —
|
||||
frontmatter에 적힌 Grep/Glob이 실제로는 안 주어지고, 적혀 있지도 않은
|
||||
`advisor`가 주어진 라운드가 있었다. 그래서 "파일을 고치지 않는다"는
|
||||
규칙은 도구 유무가 아니라 **행동 규약**으로 지킨다.
|
||||
|
||||
**How to apply:** 내 지시문이 최신이 아닌 것 같으면 그건 코퍼스 정합성
|
||||
문제가 아니라 **아직 커밋 안 된 편집**이라는 뜻이다 — "corpus contradiction"
|
||||
발견으로 올리지 말고, 관찰만 한 줄 보고해라. 보고할 땐 추측하지 말고
|
||||
대조 가능한 형태로 줄 것: `git rev-parse HEAD:.claude/agents/quad-doc-auditor.md`와
|
||||
내가 받은 텍스트를 비교해 blob 해시로 말하면 메인이 1차 근거로 승격시킬 수
|
||||
있다(실제로 이 정정이 그렇게 나왔다 — 근거 없는 자기 보고는 깎이고,
|
||||
대조 가능한 자기 보고는 채택된다). 지금 유효한 규약의 소스는
|
||||
`.claude/agents/quad-doc-auditor.md` 상단 배너.
|
||||
See [[project_quad_corpus_structure]], [[project_agent_memory_self_reference_risk]].
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
name: quad-corpus-structure
|
||||
description: Layout of quad's .claude/ design-doc corpus and what's in/out of audit scope
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
|
||||
quad는 Roblox DOMless UI 렌더러를 처음부터 재작성하는 프로젝트, 설계 단계가
|
||||
길다. `.claude/` 코퍼스 레이아웃:
|
||||
|
||||
- 항상 로드(루트 `CLAUDE.md`가 `@import`): `.claude/conventions.md`(관례/작업
|
||||
방식), `.claude/project-context.md`(프로젝트 설명+문서 구조),
|
||||
`.claude/todos.md`(지금 할 일, 가장 자주 바뀜). **2026-08-16 세션에 루트
|
||||
`CLAUDE.md`(원래 1537줄, 세션 히스토리가 80%)를 이렇게 4분할** —
|
||||
`.claude/session-summary.md`(세션 요약 색인, 1200줄+)는 의도적으로
|
||||
import 안 됨, grep으로 온디맨드 조회.
|
||||
- 감사 스코프 밖: `.claude/session/`(세션 원문, stale 여부 안 따짐),
|
||||
`.claude/initreq/`(읽기 전용 클론), `.claude/worktrees/`.
|
||||
- `.claude/archive/`는 "뒤집힌 결정을 원문 그대로 보존"하는 목적이라 낡은
|
||||
서술이 있어도 정상 — 문제는 라이브 문서가 archive 항목을 유효한 것처럼
|
||||
인용할 때만.
|
||||
- `.claude/luau-test/` 상태는 항상 `STATUS.md`가 소스(폴더 구조 자체가
|
||||
상태: done/rewrite-required/review-required/not-run), `.claude/audit/`
|
||||
개수는 `.claude/README.md`의 `audit/` 행이 소스. 둘 다 "직접 나열하다
|
||||
stale해지는 패턴"이 실제로 반복돼서 다른 문서에선 개수를 안 세기로
|
||||
확정된 관례.
|
||||
|
||||
`.claude/tools/doc-check.py`가 깨진 파일/절 참조, README 색인 누락, 날짜
|
||||
없는 시한부 주장, 미반영 배너를 기계적으로 잡음 — 감사 시작 전에 항상
|
||||
먼저 돌리고 그 출력을 리포트 맨 위에 포함, 같은 종류를 손으로 재탐색하지
|
||||
않는다. `.claude/agents/quad-doc-auditor.md`(나 자신의 정의 파일)가 2026-08-16
|
||||
세션에 신설됨. 같은 날 `.claude/workflows/quad-handover-audit.js`(다회·병렬
|
||||
수렴 루프)도 신설됐다가 **같은 날 폐기·삭제됨** — 토큰 과다 + 파일별 픽스
|
||||
에이전트가 부정확한 서술을 새로 생산 + 서브에이전트는 사용자에게 못 물음.
|
||||
**지금 감사 절차의 소스는 `.claude/conventions.md`의 "작업 방식" 절**(메인
|
||||
세션이 나를 병렬로 여러 개 띄우고, 수정은 메인이 일괄로 함, 패스 수는
|
||||
최소 2에서 변경 규모에 따라 증가). 워크플로가 있다고 전제하지 말 것.
|
||||
|
|
@ -1346,3 +1346,11 @@ blob과 바이트 단위로 동일, 메인이 `git rev-parse`로 독립 확인).
|
|||
`documentation-content-map.md`의 "943줄, 최대 문서"(실측 203줄, 최대는
|
||||
`slot-plan.md` 1970줄), `README.md`의 패스 수 하드코딩을 잡았고, 직전
|
||||
커밋의 미재감사 6건은 **회귀 없음**으로 확인해 `todos.md`의 ⚠️ 블록을 닫음.
|
||||
|
||||
**[같은 세션, 사용자 결정]** `.claude/agent-memory/`(감사 에이전트가 스스로
|
||||
쓰는 영속 메모리)를 **커밋해서 추적하기로 확정**. 사용자 논거: 개발 환경이
|
||||
다수라 메모리가 레포를 따라다녀야 하고, 실 기록이지 빌드 디펜던시가 아니며,
|
||||
환경 노출 위험은 `SAFETY.md`의 파이프라인(컨테이너 개발 → 프라이빗 git →
|
||||
검토 후 머징)의 마지막 사람 감사가 방어선이라는 것. 커밋 전 노출 스캔은
|
||||
깨끗했고, 메모리 안에 남아 있던 낡은 "캐시 가설" 서술을 커밋된 HEAD 모델로
|
||||
고쳐서 넣음.
|
||||
|
|
|
|||
|
|
@ -244,3 +244,27 @@ Write/Edit이 없었고 `.claude/agent-memory/`에 쓰기도 없었다(파일 mt
|
|||
이번엔 그 자기 보고가 **검증 가능한 형태**(blob 해시)로 왔기 때문에
|
||||
메인이 1차 근거로 승격시킬 수 있었다. 자기 보고 자체가 약한 게 아니라
|
||||
**대조 가능한 형태로 오는가**가 갈림점이다.
|
||||
|
||||
|
||||
## 11. [사용자 결정] `.claude/agent-memory/`는 커밋해서 추적한다
|
||||
|
||||
**사용자 논거 원문**:
|
||||
|
||||
> "agent-memory 는 커밋해도 될것 같음. 실 기록이고 디펜던시도 아니고,
|
||||
> 어차피 SAFETY.md 에 따라 구현 시점에는 컨테이너에서 개발되며 다른
|
||||
> 프라이빗 git 에 올라가고 검토 후 머징되는거라, 문제되는 메모리 있으면
|
||||
> 사람이 감사처리 마지막으로 함.(환경 노출 등?) 결국 프로젝트 사이드
|
||||
> 기록이고 같이 올려지는게 맞는게, 개발 환경이 다수라서 필요해보임."
|
||||
|
||||
요지 세 가지 — (1) **개발 환경이 여러 개**라 에이전트 메모리가 레포를
|
||||
따라다녀야 함, (2) 실 기록이고 빌드 디펜던시가 아니라 커밋 비용이 낮음,
|
||||
(3) 환경 노출 같은 위험은 `SAFETY.md`가 규정한 파이프라인(컨테이너 개발 →
|
||||
프라이빗 git → 사람 검토 후 머징)의 **마지막 사람 감사**가 최종 방어선.
|
||||
|
||||
메인 세션이 커밋 전에 절대경로/이메일/키/토큰 패턴을 스캔했고 노출 소지는
|
||||
없었다(히트는 전부 frontmatter `name:`과 마크다운 링크). 커밋 전에 그 안의
|
||||
낡은 결론 하나도 고쳤다 — `project_agent_prompt_caching_bug_reproduced.md`가
|
||||
아직 "캐시 가설"로 서술돼 있었는데 §10에서 이미 뒤집힌 것이라, 커밋된 HEAD
|
||||
모델로 다시 쓰고 `MEMORY.md` 색인 줄도 같이 갱신(파일 이름은 그대로 두되
|
||||
frontmatter `name`/`description`을 바꿈). 이 대응 자체가 README가 경고하던
|
||||
"에이전트가 자기 메모리에 stale한 결론을 남긴다"의 실사례다.
|
||||
|
|
|
|||
Loading…
Reference in a new issue