docs: 스냅샷 주장 축소 — 워크플로는 name=스냅샷/scriptPath=실시간, 재감사 누락 명시
직전 커밋(298dac2)이 "정의 파일은 세션 시작 시점 스냅샷으로 고정된다
(에이전트·워크플로 공통)"고 일반화했는데, 그건 증거보다 센 주장이었다 —
scriptPath 경로를 테스트한 적이 없었다. 프로브로 갈랐음:
- Workflow({name}) = 세션 시작 시점 스냅샷 (실행된 스크립트가 세션 시작
상태와 바이트 단위 동일, 같은 세션 편집 반영 0)
- Workflow({scriptPath}) = 디스크 실시간 (세션 시작 후 새로 만든 스크립트가
실행되고, 고친 뒤 다시 부르니 고친 값이 반환됨)
따라서 워크플로 쪽 해법은 세션 재시작이 아니라 scriptPath다 — conventions.md의
핸드오버 감사 절차에 반영. 에이전트 정의 stale은 자기 보고뿐이라 근거 등급이
낮음을 명시하고(Grep/Glob 불일치와 같은 등급), 우회 수단이 없으니 재시작을
보수적 해법으로 유지.
또 첫 실동이 수렴 못 하고 최대 라운드로 끊긴 결과, 마지막 라운드의 발견
6건이 반영만 되고 재감사되지 않은 채 커밋됐다는 것을 todos.md/세션 로그에
명시 — 다음 실동의 첫 임무. README.md의 audit/ "현재 6개"(실제 7개)도
폴더-소스로 전환.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
298dac2510
commit
134379632f
6 changed files with 78 additions and 37 deletions
|
|
@ -28,7 +28,7 @@
|
|||
| `archive/` | 완료 + 사용자가 실사용/실기기로 직접 검증까지 마침 (구현 대상). **[2026-08-06 확장]** 완전히 뒤집힌 설계 결정을 원문+역전 이유+diff와 함께 보존하는 용도로도 사용(제목 `[역전됨]` — 한 번 확정했다가 뒤집힌 것) — 더 이상 능동적으로 참고 안 해도 되지만(토큰 낭비 방지 위해 `base/`/`research/`에서 뺌) `quadnomicon` 소재로는 나중에 쓸 수 있음. **[2026-08-07 확장]** 후보였다가 채택 안 된 것(확정한 적 없이 검토 후 기각)도 같은 방식으로 보존, 제목은 구분을 위해 `[기각됨]` — `[역전됨]`과 의미가 다르므로 혼동하지 말 것. **[2026-08-07 세 번째 확장]** 설계 반전/기각과 별개로, 에이전트가 문서 작성 중 스스로 낸 개념 혼동을 정정한 이력은 `[에이전트 실수]` 태그로 `agent-mistake.md` 하나에 모음(`.claude/session-summary.md`/`session/` 로그와의 중복 방지) |
|
||||
| `feedback/` | 실사용 피드백을 정리한 긴 로그 — **[2026-08-16 기준] 폴더 자체가 아직 없음**(구현 시작 전, 첫 피드백이 생길 때 만들면 됨). `qa-request/`는 빈 폴더로 존재하지만 여긴 그것도 아직 아님 |
|
||||
| `luau-test/` | **[2026-08-09 신설]** `base/` 확정 사항 중 "추론만으로 확정하고 실제 Luau로 부딪혀본 적 없는 것"(M0 스파이크 대상)을 `luau`/`luau-analyze`/`luau-lsp`/Roblox Studio로 사용자가 직접 돌려볼 독립 실행 스크립트 모음. **[2026-08-13 여섯 번째 세션, 첫 실측]** `luau`/`luau-analyze` 바이너리가 생겨 처음으로 실제 실행 — **런타임 12개 전원 통과**, 타입 쪽에서 `:Compute(fn)` lazy 핸들 계약이 Luau 추론과 충돌하는 게 드러남(당시 `question.md` 0-Y). **[2026-08-13 열세 번째 세션]** 그 0-Y가 해소되며 `review-required/`가 **비었음** — 계약은 유지 확정, 남은 건 Luau 자체 한계라 `base/typing-limits.md`가 담당. **`STATUS.md`가 상태의 소스**(pass / 사람 결정 필요 / 스파이크 깨짐 / 미실행 분류 — 사람이 먼저 볼 것만 위에), `luau-test/README.md`는 각 파일의 검증 의도·배경, 실행 결과 상세는 `audit/luau-test-first-run-2026-08-13.md` |
|
||||
| `audit/` | **[2026-08-13 신설]** `luau-test/` 등 스파이크를 실제로 돌려본 뒤 "무엇이 확인됐고 무엇이 아직 안 됐는지"를 기록하는 곳 — 스크립트/계획 자체가 아니라 **실측 결과**만 다룸. base/luau-test와 달리 부분 확인(일부만 통과)도 있는 그대로 기록, 완전히 해소되면 관련 `base/`/`luau-test/README.md` 캐비엇을 지우고 이 문서는 근거로 남김. **현재 6개**: `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 호출 여전히 실패라 순손해로 채택 안 함) |
|
||||
| `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/모순(본문 문장이 뒤집힌 결정을 여전히 서술, 개수/목록 이중 소스 드리프트 등)을 신선한 맥락에서 찾는 읽기 전용 감사자. 중대 변경 커밋 전에 위임하는 게 기본(`.claude/conventions.md` "작업 방식" 참고). `tools/`의 기계 점검과 짝을 이루는 의미론적 점검 계층 |
|
||||
| `agent-memory/` | **[2026-08-16 신설]** 서브에이전트가 라운드를 넘겨 유지하는 영속 메모리(`agent-memory/<에이전트 이름>/MEMORY.md`가 색인). 지금은 `quad-doc-auditor/` 하나 — 코퍼스 구조, 반복되는 실패 패턴 등을 기억해 감사 라운드마다 처음부터 파악하지 않게 함. **사람이 손으로 채우는 문서가 아니라 에이전트가 스스로 쓰는 것**이지만, `.gitignore` 대상이 아니라 커밋하면 코퍼스 일부가 되고 `doc-check.py` 검사 대상에도 들어감(감사 대상이기도 하다는 뜻 — 여기 적힌 주장도 stale해질 수 있음). **[2026-08-16 기준] 아직 커밋 안 됨(untracked)** — 추적할지 `.gitignore`로 뺄지는 사용자 판단 |
|
||||
|
|
|
|||
|
|
@ -17,16 +17,25 @@ model: sonnet
|
|||
너를 호출한 세션이 한다. 이 규칙은 도구 유무가 아니라 **행동 규약**이다 —
|
||||
어떤 이유로 쓰기 도구가 주어지더라도 문서를 직접 고치지 마라.
|
||||
|
||||
> **[2026-08-16] 정의 파일은 세션 시작 시점 스냅샷으로 고정된다 — 고쳤으면
|
||||
> 재시작한 뒤에 감사를 돌릴 것.** 이 배너는 같은 날 감사 라운드들이 남긴
|
||||
> 긴 가설 서술을 검증된 것만 남겨 압축한 것이다(경위 원문은
|
||||
> **[2026-08-16] 정의를 고친 그 세션에서 그대로 돌리면 옛 정의로 돈다 —
|
||||
> 워크플로는 `scriptPath`로, 에이전트 정의는 재시작으로 피할 것.** 이 배너는
|
||||
> 같은 날 감사 라운드들이 남긴 긴 가설 서술을 검증된 것만 남겨 압축한
|
||||
> 것이다(경위 원문은
|
||||
> `.claude/session/2026-08-16-01-subagent-audit-and-claudemd-split.md`).
|
||||
> 확인된 것:
|
||||
> - **스냅샷 고정 — 1차 증거 있음.** `quad-handover-audit` 실행 시 실제로
|
||||
> 돌아간 스크립트 파일이 세션 시작 시점 상태와 **바이트 단위로 동일**했고,
|
||||
> 같은 세션에서 그 파일에 가한 편집은 전혀 반영되지 않았다. 에이전트
|
||||
> 정의도 같아서, 감사 에이전트들이 받은 지시문엔 그 세션에 추가된 배너가
|
||||
> 실려 있지 않았다. **워크플로·에이전트 정의 모두 해당.**
|
||||
> - **이름으로 부르는 워크플로(`Workflow({name})`)는 세션 시작 시점
|
||||
> 스냅샷을 쓴다 — 1차 증거 있음.** `quad-handover-audit`을 이름으로 돌렸을
|
||||
> 때 실제로 실행된 스크립트가 세션 시작 시점 상태와 **바이트 단위로
|
||||
> 동일**했고, 같은 세션에서 그 파일에 가한 편집은 전혀 반영되지 않았다.
|
||||
> - **반면 `Workflow({scriptPath})`는 디스크에서 실시간으로 읽는다 — 1차
|
||||
> 증거 있음.** 세션 시작 후 **새로 만든** 스크립트가 정상 실행됐고, 그
|
||||
> 파일을 고쳐 다시 부르니 고친 내용이 반영됐다. 즉 **워크플로 쪽 해법은
|
||||
> 세션 재시작이 아니라 `scriptPath`를 넘기는 것**이다.
|
||||
> - **에이전트 정의도 stale하게 로드된 정황이 있으나 근거가 약하다** —
|
||||
> 감사 에이전트들이 "받은 지시문에 그 세션에 추가된 배너가 없었다"고
|
||||
> 보고했을 뿐 자기 보고다(아래 Grep/Glob 항목과 같은 등급의 근거).
|
||||
> 에이전트 정의엔 `scriptPath` 같은 우회가 없으니, 확인 전까지는
|
||||
> **정의를 고쳤으면 재시작 뒤에 감사를 돌리는** 보수적 쪽을 따를 것.
|
||||
> - **`model: sonnet`은 반영된다** — 서브에이전트 트랜스크립트에서
|
||||
> `claude-sonnet-5` 확인(자기 보고가 아니라 기록 기준).
|
||||
> - **Write/Edit이 주어지는 원인은 미확정.** `memory: project`를 뺐지만
|
||||
|
|
|
|||
|
|
@ -91,7 +91,11 @@ haiku, 일반 작업은 sonnet. 특히 소스코드를 많이 읽어야 하는
|
|||
명시했으므로 기본 워크플로 크기 가이드라인(15 에이전트 이하)을 의도적으로
|
||||
넘을 수 있음 — 이 워크플로 자체가 그 예외 대상. Workflow는 백그라운드로
|
||||
돌고 완료 시 알림이 오므로, 호출 직후 대화를 막지 말고 진행 상황만
|
||||
알린 뒤 알림을 기다릴 것. 알림이 오면 `python3 .claude/tools/doc-check.py`로
|
||||
알린 뒤 알림을 기다릴 것. **[2026-08-16] 워크플로 스크립트를 그 세션에서
|
||||
고쳤다면 이름 대신 `Workflow({scriptPath: '.claude/workflows/quad-handover-audit.js'})`로
|
||||
부를 것** — 이름 해석은 세션 시작 시점 스냅샷이라 편집이 안 실린 채
|
||||
"돌긴 돌았다"가 되고, 감사 도구에선 그게 조용한 거짓 초록불이다(실측 근거는
|
||||
`.claude/agents/quad-doc-auditor.md` 상단 배너). 알림이 오면 `python3 .claude/tools/doc-check.py`로
|
||||
ERROR 0을 최종 확인한 뒤 평소 커밋 절차(git status/diff 검토, 메시지 작성)로
|
||||
넘어갈 것 — **실제 `git commit`은 이 워크플로 안이 아니라 항상 메인 세션이
|
||||
직접 함**(커밋 전 diff 재검토는 대화형 맥락이 필요해서 워크플로에 위임 안 함).
|
||||
|
|
|
|||
|
|
@ -1289,10 +1289,15 @@ stale")가 틀렸음**을 잡아냄(실제로는 `initreq/tbox/CLAUDE.md`를 가
|
|||
(`session/2026-08-16-02-audit-tooling-verification-and-first-real-run.md`)
|
||||
전 세션이 남긴 재시작 검증 3건을 전부 닫음 — `@import` 로드 ✅,
|
||||
`quad-doc-auditor` 등록 ✅, frontmatter `model: sonnet` 반영 ✅(트랜스크립트
|
||||
기록 기준). **가장 큰 수확은 "정의 파일은 세션 시작 시점 스냅샷으로
|
||||
고정된다"를 1차 증거로 확정한 것** — 워크플로가 실제 실행한 스크립트가 세션
|
||||
시작 시점 상태와 바이트 단위로 같았고 같은 세션의 편집은 반영 0이었음(에이전트
|
||||
정의도 동일). **정의를 고쳤으면 재시작 뒤에 감사를 돌릴 것.** 전 세션 감사가
|
||||
기록 기준). **가장 큰 수확은 워크플로 정의 해석이 호출 방식에 따라
|
||||
갈린다는 것을 1차 증거로 확정한 것** — `Workflow({name})`은 세션 시작 시점
|
||||
스냅샷을 쓰고(실행된 스크립트가 세션 시작 상태와 바이트 단위로 동일, 같은
|
||||
세션의 편집 반영 0), `Workflow({scriptPath})`는 디스크에서 실시간으로
|
||||
읽는다(세션 시작 후 새로 만든 스크립트가 실행되고 편집도 반영됨).
|
||||
**워크플로 정의를 고쳤으면 재시작 말고 `scriptPath`로 부를 것.** 처음엔 이걸
|
||||
"정의 파일 전반이 스냅샷"으로 일반화해 적었다가 `scriptPath` 미검증을
|
||||
지적받고 좁힘 — 에이전트 정의 쪽 stale 정황은 자기 보고뿐이라 근거 등급이
|
||||
낮고, 우회 수단이 없어 재시작이 보수적 해법. 전 세션 감사가
|
||||
남긴 "Grep/Glob 미지급"은 **두 소스가 어긋나는 미해결 불일치**로 정리(호출
|
||||
세션이 보는 등록 목록엔 포함돼 있는데 실행된 에이전트는 자기 도구에 없다고
|
||||
보고) — 어느 쪽도 확정하지 말고 재시작 직후 실행에서 볼 것. 전 세션이
|
||||
|
|
@ -1302,7 +1307,9 @@ stale")가 틀렸음**을 잡아냄(실제로는 `initreq/tbox/CLAUDE.md`를 가
|
|||
1건(`modifier-plan.md:536`)만 `question.md` 3번으로 올려 사용자 판단 대기.
|
||||
`quad-handover-audit` 첫 실동은 에이전트 67개/6라운드에 **수렴 실패**(새 발견
|
||||
28→15→16→7→11→6, 라운드5에서 되레 증가) — 단조 감소 전제와 `MAX_ROUNDS`
|
||||
재검토 필요. 수정 품질 자체는 높았음: `slot-plan.md`의 정정 배너가 그 뒤
|
||||
재검토 필요. **마지막 라운드의 발견 6건은 반영만 되고 재감사되지 않은 채
|
||||
커밋됨**(diff는 손으로 검토·핵심 주장은 1차 근거 확인) — 다음 실동의 첫
|
||||
임무. 수정 품질 자체는 높았음: `slot-plan.md`의 정정 배너가 그 뒤
|
||||
재역전된 걸 놓치고 있던 것, `spikes 44개`(실제 48개) 류 하드코딩 개수의
|
||||
단일 소스화, `doc-check.py` docstring이 검사 심각도를 실제 코드와 다르게
|
||||
서술하던 것 등을 잡음. 워크플로도 개선 — 반환값에 `findings` 추가(커밋 전
|
||||
|
|
|
|||
|
|
@ -17,21 +17,29 @@
|
|||
시스템 프롬프트를 덤프하라는 지시였으니 정당한 거부). 자기 보고 대신
|
||||
트랜스크립트 파일을 직접 grep하는 쪽이 1차 증거라 더 낫다.
|
||||
|
||||
## 2. ⭐ 정의 파일은 세션 시작 시점 스냅샷으로 고정된다 (에이전트·워크플로 공통)
|
||||
## 2. ⭐ 워크플로는 `name`으로 부르면 스냅샷, `scriptPath`로 부르면 실시간
|
||||
|
||||
전 세션 감사 라운드들이 "캐시냐 frontmatter 무시냐"로 길게 갈라놨던 것을
|
||||
결정적으로 닫는 증거가 이 세션에서 나왔다.
|
||||
좁히는 증거가 나왔다. 처음엔 이걸 "정의 파일은 세션 시작 스냅샷으로
|
||||
고정된다(에이전트·워크플로 공통)"로 일반화해서 적었는데, **그건 증거보다
|
||||
센 주장이었다** — `scriptPath` 경로를 테스트한 적이 없었다. 실제로 갈렸다.
|
||||
|
||||
- 이 세션에서 `.claude/workflows/quad-handover-audit.js`를 편집한 뒤
|
||||
`Workflow({name: 'quad-handover-audit'})`를 돌렸는데, 런타임이 실제로
|
||||
실행한 스크립트 파일이 **세션 시작 시점 상태(= 당시 HEAD, 작업트리가
|
||||
깨끗했음)와 바이트 단위로 동일**했다. 내 편집은 하나도 안 실렸다.
|
||||
- 같은 현상이 에이전트 정의에서도 관측됐다(감사 에이전트들이 받은 지시문에
|
||||
그 세션에 추가된 배너가 없었음).
|
||||
- **`Workflow({name})` = 세션 시작 시점 스냅샷.** 이 세션에서
|
||||
`.claude/workflows/quad-handover-audit.js`를 편집한 뒤 이름으로 돌렸는데,
|
||||
런타임이 실제로 실행한 스크립트가 **세션 시작 시점 상태(= 당시 HEAD,
|
||||
작업트리가 깨끗했음)와 바이트 단위로 동일**했다. 편집은 하나도 안 실렸다.
|
||||
- **`Workflow({scriptPath})` = 디스크에서 실시간.** 세션 시작 후 **새로
|
||||
만든** 프로브 스크립트(에이전트 0개)가 정상 실행됐고 — 스냅샷이라면
|
||||
존재할 수 없다 — 그 파일을 고쳐 다시 부르니 고친 값이 그대로 돌아왔다.
|
||||
|
||||
**실무 규칙: 정의 파일(`.claude/agents/*.md`, `.claude/workflows/*.js`)을
|
||||
고쳤으면 세션을 재시작한 뒤에 감사를 돌릴 것.** 안 그러면 옛 정의로 돌면서
|
||||
새 정의로 돈 것처럼 보인다 — 감사 도구에선 이게 조용한 거짓 초록불이다.
|
||||
**실무 규칙: 워크플로 정의를 고쳤으면 재시작하지 말고 `scriptPath`로
|
||||
호출할 것.** 이름으로 부르면 옛 정의로 돌면서 새 정의로 돈 것처럼 보인다 —
|
||||
감사 도구에선 이게 조용한 거짓 초록불이다.
|
||||
|
||||
에이전트 정의 쪽은 **같은 등급의 증거가 없다** — 감사 에이전트들이 "받은
|
||||
지시문에 그 세션에 추가된 배너가 없었다"고 보고했을 뿐이고 그건 자기
|
||||
보고다(아래 Grep/Glob과 같은 등급). 에이전트엔 `scriptPath` 같은 우회가
|
||||
없으니 확인 전까지는 보수적으로 **고쳤으면 재시작 뒤에 감사**를 따른다.
|
||||
|
||||
미해소로 남은 건 **읽기 전용인데 Write/Edit이 주어지는 원인** 하나.
|
||||
`memory: project`를 뺐지만 그 뒤 재시작 없이 관찰한 것뿐이라 진단 미확정.
|
||||
|
|
@ -71,8 +79,13 @@
|
|||
- 라운드 5에서 발견이 7→11로 **다시 늘었다** — 감사가 코퍼스를 훑는 순서/
|
||||
관점이 라운드마다 달라서 생기는 것으로 보이고, 단조 감소를 전제한
|
||||
`MAX_ROUNDS=6`이 이 코퍼스엔 부족하다는 신호.
|
||||
- 이번 실행은 **위 2번 때문에 옛 스크립트로 돌았다** — 즉 이 결과 자체가
|
||||
"정의를 고치고 재시작 없이 돌린" 사례다. 다음 실동은 재시작 뒤에.
|
||||
- 이번 실행은 **위 2번 때문에 옛 스크립트로 돌았다**(이름으로 호출) — 즉 이
|
||||
결과 자체가 그 함정의 사례다. 다음 실동은 `scriptPath`로.
|
||||
- **마지막 라운드(6)의 새 발견 6건은 반영만 되고 재감사되지 않았다.**
|
||||
수렴 조건을 못 채우고 최대 라운드로 끊겼기 때문이다. 그 6건을 포함한
|
||||
diff 전체를 이 세션이 손으로 검토하고 핵심 주장(절 제목·archive 파일
|
||||
존재·spikes 실제 개수)은 1차 근거로 확인했지만, **dry 라운드 하나가
|
||||
주는 확인과 같지는 않다** — 다음 실동의 첫 임무가 이걸 재확인하는 것.
|
||||
|
||||
수정 품질 자체는 높았다. 실제로 잡힌 것 중 값진 것:
|
||||
- `base/slot-plan.md:218`의 정정 배너가 "폐기로 정정됨"에서 멈춰 있었는데,
|
||||
|
|
@ -97,8 +110,9 @@
|
|||
|
||||
## 남은 것
|
||||
|
||||
- **`MAX_ROUNDS` 재검토** — 수렴 실패가 재현되는지 재시작 후 실동으로 확인.
|
||||
단조 감소 전제가 안 맞으니 "연속 dry 2회" 조건 자체도 같이 볼 것.
|
||||
- **`MAX_ROUNDS` 재검토 + 미재감사분 확인** — 수렴 실패가 재현되는지
|
||||
`scriptPath` 호출로 재실동. 단조 감소 전제가 안 맞으니 "연속 dry 2회"
|
||||
조건 자체도 같이 볼 것. 라운드 6의 미재감사 6건도 이때 걸러진다.
|
||||
- **(d) Write/Edit 원인** — 다음 세션 시작 직후 확인.
|
||||
- **`.claude/agent-memory/`** — 감사 에이전트가 스스로 쓰는 영속 메모리가
|
||||
생겼고 지금 untracked. 커밋할지 `.gitignore`로 뺄지는 사용자 판단.
|
||||
|
|
|
|||
|
|
@ -133,11 +133,18 @@
|
|||
결론 날 때까지 읽기 전용은 도구 유무가 아니라 프롬프트의 행동 규약으로
|
||||
지킨다.
|
||||
|
||||
**부수 확정 — 정의 파일은 세션 시작 시점 스냅샷으로 고정된다**(에이전트·
|
||||
워크플로 정의 모두): `quad-handover-audit`이 실제로 돌린 스크립트가 세션
|
||||
시작 시점 상태와 바이트 단위로 같았고 같은 세션의 편집은 반영 0이었음.
|
||||
**정의를 고쳤으면 재시작한 뒤에 감사를 돌릴 것** — 안 그러면 옛 정의로
|
||||
돌면서 새 정의로 돈 것처럼 보인다. 상세는
|
||||
`.claude/agents/quad-doc-auditor.md` 상단 배너가 소스. M0/설계 게이트와
|
||||
무관.
|
||||
**부수 확정 — 워크플로는 `name`으로 부르면 세션 시작 스냅샷, `scriptPath`로
|
||||
부르면 디스크 실시간**(둘 다 1차 증거 있음). **워크플로 정의를 고쳤으면
|
||||
재시작하지 말고 `scriptPath`로 호출할 것** — 이름으로 부르면 옛 정의로
|
||||
돌면서 새 정의로 돈 것처럼 보인다. 에이전트 정의도 stale하게 로드된 정황이
|
||||
있으나 그건 자기 보고뿐이라 근거 등급이 낮고, 우회 수단도 없어 재시작이
|
||||
보수적 해법. 상세는 `.claude/agents/quad-doc-auditor.md` 상단 배너가 소스.
|
||||
|
||||
**⚠️ [2026-08-16] 코퍼스에 재감사 안 된 수정이 들어있음** — 첫 실동이
|
||||
수렴하지 못하고 최대 라운드로 끊겨서, 마지막 라운드의 새 발견 6건은
|
||||
반영만 되고 다시 감사되지 않았다(diff는 사람이 손으로 검토했고 핵심
|
||||
주장은 1차 근거로 확인했지만 dry 라운드와 같지는 않음). **다음
|
||||
`quad-handover-audit` 실동의 첫 임무가 이걸 재확인하는 것.** 겸해서
|
||||
`MAX_ROUNDS`/"연속 dry 2회" 조건도 재검토 대상(새 발견이 단조 감소하지
|
||||
않았음: 28→15→16→7→11→6). M0/설계 게이트와 무관.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue