docs: 감사 3라운드 반영 — agent-memory가 재재정정을 안 따라온 사각지대

두 감사자가 독립적으로 같은 확실 발견: agent-memory의 caching 메모리가
"커밋된 HEAD에서 읽힌다"를 여전히 확정 사실로 서술. 그 결론을 반증한 커밋
1935dd4가 agent-memory/ 아래를 하나도 안 건드린 탓 — "변경한 세션 자신은
자기가 뭘 안 건드렸는지 모른다"의 교과서적 사례이고, 같은 파일이 한 세션에
두 번 연속 stale이 된 것이기도 함.

고치면서 그 메모리가 결론을 복제하지 않고 정의 배너를 가리키게만 바꿈 —
같은 사실이 두 곳에 있어 두 번 갈라졌으므로 근본 원인 제거.

그 외:
- todos.md의 매달린 포인터("아래 부수 확정 참고" → 그 헤딩이 직전 라운드에
  "미해결 1/2"로 개명됨)를 정의 배너 참조로 교체
- 관측표에 3라운드 행 추가: 감사자 2개가 마커로 확인한 결과 디스크 현재
  내용과 바이트 동일 → 일관되게 낡은 게 아님이 확인돼 "모른다" 유지 근거가
  늘고, 마커 확인 방식이 작동한다는 것도 재확인

감사자 둘 다 자기 모델을 claude-sonnet-5로 보고 — 트랜스크립트 실측과 일치.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
qwreey 2026-08-16 03:50:38 +09:00
parent e0b6c992fa
commit ebb1fd0f5a
Signed by: qwreey
GPG key ID: D28DB79297A214BD
5 changed files with 62 additions and 29 deletions

View file

@ -4,4 +4,4 @@
- [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.
- [Definition freshness is unknown](project_agent_prompt_caching_bug_reproduced.md) — the text I receive sometimes lags disk and has matched no commit at all; three explanations were tried and two refuted, so report a mismatch as a concrete comparison, never as a mechanism claim.

View file

@ -1,35 +1,34 @@
---
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.
name: definition-freshness-is-unknown
description: The definition text I receive sometimes lags the file on disk and has matched no commit at all. Mechanism unknown as of 2026-08-16 — do not adopt any of the three refuted explanations.
metadata:
type: project
---
내가 받는 지시문은 `.claude/agents/quad-doc-auditor.md`의 **커밋된 HEAD
버전**이다. 워킹트리에만 있는(아직 커밋 안 된) 편집은 나에게 안 보인다.
내가 받는 지시문(`.claude/agents/quad-doc-auditor.md`)이 **디스크의 현재
파일과 다를 수 있고, 어느 커밋과도 일치하지 않을 수도 있다.** 무엇이 갱신을
트리거하는지는 2026-08-16 기준 **모른다**.
**Why:** 2026-08-16에 여러 라운드가 "정의 파일이 최신본과 다르다"고
반복 보고했고, 한동안 "세션/워크플로 시작 시점에 캐시된 스냅샷"으로
설명됐다. 그 가설은 **반증됐다** — 한 라운드가 자기가 받은 지시문이
blob `92b9484`, 즉 *그 시점 HEAD 커밋*의 버전과 바이트 단위로 같음을
확인했고, 그 HEAD는 세션 시작 시점이 아니라 세션 도중에 만들어진
커밋이었다(메인 세션이 `git rev-parse`로 독립 확인). 즉 정의는 커밋될
때마다 갱신된다. 같은 정정이 오래 미확정이던 도구 문제도 풀었다:
**`memory: project`가 Write/Edit을 딸려온다는 진단이 맞았고**, "옵션을
뺐는데도 그대로 주어진다"고 보였던 건 그 제거가 아직 커밋 안 됐던
탓이었다.
**Why:** 같은 날 이 문제에 결론이 세 번 나왔고 앞의 둘이 반증됐다 —
(1) "세션 시작 시점 스냅샷" → 반증, (2) "커밋된 HEAD에서 읽힌다" → 반증.
결정타는 한 라운드가 받은 텍스트가 **배너는 구버전인데 출력 형식 절은
신버전인 하이브리드**였고, 그 조합이 커밋된 적 없는 중간 워킹트리 상태와
일치한 것이다(`git log -S`로 확인). 반면 그 다음 라운드는 디스크 현재
내용과 바이트 단위로 같은 걸 받았다. 즉 **일관되게 낡은 것도 아니다.**
관측표와 지금 유효한 서술은 `.claude/agents/quad-doc-auditor.md` 상단
배너가 소스 — 이 메모리는 그걸 가리키기만 하고 결론을 복제하지 않는다.
**여전히 미해결**: `tools:` 필드가 그대로 반영되지는 않는다 —
frontmatter에 적힌 Grep/Glob이 실제로는 안 주어지고, 적혀 있지도 않은
`advisor`가 주어진 라운드가 있었다. 그래서 "파일을 고치지 않는다"는
규칙은 도구 유무가 아니라 **행동 규약**으로 지킨다.
**⚠️ 이 파일은 두 번이나 stale 상태로 방치됐다.** 캐시 가설로 썼다가
"커밋된 HEAD"로 고쳤는데(2026-08-16), 바로 다음 커밋이 그 결론을 뒤집었는데도
여기만 안 따라와서 감사 3라운드가 다시 잡아냈다. 라이브 문서를 고치는 세션은
`agent-memory/`가 자기 수정 범위에 있다는 걸 자꾸 잊는다 — **내 메모리도
코퍼스이고 감사 대상이다**([[project_agent_memory_self_reference_risk]]).
**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]].
**How to apply:** 내 지시문이 최신이 아닌 것 같아도 **코퍼스 정합성 발견으로
올리지 마라** — 코퍼스 문서끼리 모순된 게 아니라 도구 쪽 현상이다. 대신
**대조 가능한 형태로 관찰만 보고해라**: `git rev-parse HEAD:.claude/agents/quad-doc-auditor.md`,
디스크 파일, 내가 받은 텍스트 셋을 비교해 어느 것과 일치하는지(또는 어느
것과도 불일치하는지) 말할 것. 추측으로 메커니즘을 단정하지 마라 — 그렇게
해서 두 번 틀렸다. 반영 여부가 중요한 상황이면 메인 세션이 정의에 마커
문구를 넣고 나에게 그 문구가 보이는지 묻는 방식이 실제로 작동했다.
See [[project_quad_corpus_structure]].

View file

@ -28,6 +28,9 @@ model: sonnet
> | 폐기된 워크플로 실행 | 세션 시작 시점 상태 |
> | 감사 1라운드 | 그 시점 HEAD 커밋(`1343796`)과 바이트 단위 동일 |
> | 감사 2라운드 | **어느 커밋과도 불일치** — 배너는 구버전인데 "출력 형식"의 `사용자 판단` 문단은 신버전인 하이브리드 |
> | 감사 3라운드 | 디스크 현재 내용과 바이트 동일(감사자 2개가 마커 문구로 각각 확인) |
>
> **일관되게 낡은 것도 아니다** — 3라운드는 현재 내용을 그대로 받았다.
>
> 2라운드가 받은 텍스트는 메인 세션이 이 파일을 **여러 번에 나눠 편집하던
> 중간의 워킹트리 상태**와 일치했고, 그 상태는 커밋된 적이 없다(`git log -S`로

View file

@ -368,3 +368,34 @@ Claude Code 세션 헤더**다:
**신뢰할 소스는 하나**: 트랜스크립트의 최상위 `message.model`(원하면
`attributionAgent`로 어느 에이전트 몫인지까지 확인).
## 15. 감사 3라운드 — `agent-memory`가 정확히 사각지대였음
두 감사자가 **독립적으로 같은 확실 발견**을 가져왔다: `agent-memory/`
`project_agent_prompt_caching_bug_reproduced.md`가 "커밋된 HEAD에서 읽힌다"를
여전히 **확정 사실로** 서술하고 있었다. §12에서 그 결론을 반증해놓고,
그 정정을 담은 커밋(`1935dd4`)이 `agent-memory/` 아래를 **하나도 안 건드린**
것이다(`git show --stat`으로 감사자가 확인).
이건 이 감사 체계가 설계상 노리던 사각지대의 교과서적 사례다 —
`conventions.md`가 말하는 "변경한 세션 자신은 자기가 뭘 안 건드렸는지
모른다". 게다가 이 파일은 **같은 세션에 두 번 연속으로** stale이 됐다:
캐시 가설로 썼다가 → "커밋된 HEAD"로 고쳤는데 → 바로 다음 커밋이 그걸
뒤집었는데 또 안 따라옴. `agent-memory/`가 2026-08-16에 막 추적 대상이
돼서 아직 "이것도 코퍼스"라는 습관이 안 잡힌 탓이다.
고치면서 그 메모리가 **결론을 복제하지 않고 배너를 가리키게만** 바꿨다 —
같은 사실이 두 곳에 적혀 있으니 두 번 갈라진 것이라, 근본 원인을 없애는
쪽으로. 3라운드 A는 그 외에 `todos.md`의 매달린 포인터도 잡았다("아래 부수
확정 참고"인데 그 헤딩이 직전 라운드에 "미해결 1/2"로 개명됨).
**마커 확인 결과 — 관측표에 새 행**: 3라운드 감사자 **둘 다** 배너의
"재재정정" 낱말과 관측표를 받았고 디스크 현재 내용과 바이트 동일이라고
보고했다. 즉 **일관되게 낡은 게 아니다** — 어떤 실행은 최신을 받고 어떤
실행은 안 받는다. "모른다"를 유지할 근거가 하나 더 늘었고, 동시에
**마커 확인 방식이 실제로 작동한다**는 것도 재확인됐다.
부수적으로 둘 다 자기 모델을 "You are powered by the model named Sonnet 5.
The exact model ID is claude-sonnet-5."로 보고 — §13/§14의 트랜스크립트
실측과 일치.

View file

@ -128,7 +128,7 @@
세션 도중 생긴 디렉토리였기 때문, 재시작으로 해소), (c) frontmatter
`model: sonnet` 반영 — **확인됨**(서브에이전트 트랜스크립트에
`claude-sonnet-5` 기록), (d) **해소** — 읽기 전용인데 Write/Edit이
주어지던 원인은 `memory: project`가 맞았음(아래 부수 확정 참고). 다만
주어지던 원인은 `memory: project`가 맞았음(근거는 `.claude/agents/quad-doc-auditor.md` 상단 배너). 다만
`tools:` 필드가 그대로 반영되지 않는 건 **여전히 미해결**이라, 읽기
전용은 도구 유무가 아니라 프롬프트의 행동 규약으로 계속 지킨다.