release(v4.9.5): a claude purge removes every path the session owns (Issue #31, PR #59) - archive the review reports, bump the lockstep version, load logroot eagerly
Review loop (--review-only, --all-reviewer, focused on this Mac: macOS, /usr/bin/python3 3.9.6, bash 3.2): round 1 (@6f4f40a) agy and grok PASS, claude and codex NOT PASS (a non-uuid id `memory` purged the auto-memory dir, a linked dir below a root was followed, a NaN startedAt counted as dead), sent as a PR comment and fixed by the author in eleven commits; round 2 (@2a8d738) confirmed all three fixed but 4/4 NOT PASS on one test holder (`sh -c "sleep 120" <uuid>` loses the uuid on macOS /bin/sh), fixed in de6f3fc; round 3 (@de6f3fc) 4/4 PASS. Full suite on macOS / Python 3.9.6 @de6f3fc: 1934 passed, 56 skipped, 1 error (the known #55 false positive: agy conversations of another workspace). The real ~/.claude, /private/tmp/claude-<uid> and herdr panes unchanged. Also names lib_py.delegation.logroot in eager.CORE_MODULES (the v4.9.4 review's non-blocking note). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
This commit is contained in:
1 parent
de6f3fc81f
commit
6fd417a7b7
32 files changed
+916
-26
No files matched your search
+46
-11
@@ -6,8 +6,8 @@
|
||||
|
||||
## 📌 현재 버전 개요 (Current Release)
|
||||
|
||||
- **프레임워크 버전**: `v4.9.4`
|
||||
- **최신 릴리스 일시**: 2026-10-15 (KST)
|
||||
- **프레임워크 버전**: `v4.9.5`
|
||||
- **최신 릴리스 일시**: 2026-10-18 (KST)
|
||||
- **기준 브랜치**: `main`
|
||||
- **핵심 아키텍처**:
|
||||
- **Terminal 상태 단방향 불변성 (`engine.py`, Issue #6 Phase 1)**: `completed`, `error`, `cancelled` 터미널 상태 진입 후 후속 이벤트나 업데이트에 의한 덮어쓰기를 엄격히 차단(Terminal Immutability). `registry.py close` 서브커맨드 및 fail-closed 조기 종료 도입.
|
||||
@@ -24,23 +24,58 @@
|
||||
|
||||
## 🧭 스킬 패키지 버전 매트릭스 (Skills Version Matrix)
|
||||
|
||||
모든 8개 스킬은 YAML frontmatter 메타데이터(`author`, `version`, `platforms`, `environments`) 표준화를 통해 `v4.9.4`로 동기화되어 배포됩니다.
|
||||
모든 8개 스킬은 YAML frontmatter 메타데이터(`author`, `version`, `platforms`, `environments`) 표준화를 통해 `v4.9.5`로 동기화되어 배포됩니다.
|
||||
|
||||
| 스킬명 | 버전 | 역할 및 주요 책임 | 상태 |
|
||||
| :--- | :---: | :--- | :---: |
|
||||
| **`multi-agent-mux-create`** | `4.9.4` | 에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
|
||||
| **`multi-agent-mux-stop`** | `4.9.4` | 대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
|
||||
| **`multi-agent-mux-resume`** | `4.9.4` | 온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
|
||||
| **`multi-agent-mux-status`** | `4.9.4` | 실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
|
||||
| **`multi-agent-mux-monitor`** | `4.9.4` | YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
|
||||
| **`multi-agent-mux-delegate-job`** | `4.9.4` | MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
|
||||
| **`multi-agent-mux-loop`** | `4.9.4` | Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
|
||||
| **`multi-agent-mux-orc-onboard`** | `4.9.4` | 오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
|
||||
| **`multi-agent-mux-create`** | `4.9.5` | 에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
|
||||
| **`multi-agent-mux-stop`** | `4.9.5` | 대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
|
||||
| **`multi-agent-mux-resume`** | `4.9.5` | 온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
|
||||
| **`multi-agent-mux-status`** | `4.9.5` | 실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
|
||||
| **`multi-agent-mux-monitor`** | `4.9.5` | YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
|
||||
| **`multi-agent-mux-delegate-job`** | `4.9.5` | MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
|
||||
| **`multi-agent-mux-loop`** | `4.9.5` | Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
|
||||
| **`multi-agent-mux-orc-onboard`** | `4.9.5` | 오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
|
||||
|
||||
---
|
||||
|
||||
## 📋 버전별 상세 변경 내역 (Changelog)
|
||||
|
||||
### 🚀 `v4.9.5` — claude purge 가 세션이 소유한 경로를 모두 지우고 남은 것을 보고한다 (Issue #31, PR #59) (2026-10-18)
|
||||
|
||||
> **패치 (PATCH Release)**: claude `--purge-conversation` 이 `.jsonl` 만 지우고 `file-history`·`session-env` 등을 남기면서 `residual: none` 으로 보고하던 결함. purge 범위는 정규형 UUID 가 가리키는 세션 소유 경로로 한정된다.
|
||||
|
||||
#### 🌟 주요 개선 사항
|
||||
1. **소유 경로 하나의 목록**: claude 어댑터의 `_owned_paths` 를 purge·`has_artifacts`·residual 이 함께 쓴다. 대상은 다음과 같다.
|
||||
- `projects/<key>/<uuid>.jsonl` 과 `projects/<key>/<uuid>/`
|
||||
- `file-history/<uuid>/`, `session-env/<uuid>/`
|
||||
- `state.json` 이 이 세션을 가리키는 `jobs/<uuid[:8]>/`
|
||||
- 죽은 프로세스의 `sessions/<pid>.json`·`<pid>.<hex>.key`
|
||||
- `<tmp>/claude-<uid>/<key>/<uuid>/` 스크래치패드(`CLAUDE_CODE_TMPDIR`·`TMPDIR`·`/tmp`)
|
||||
|
||||
공유 파일(`history.jsonl` 등)은 건드리지 않는다. 세션과의 연결 근거는 마지막에 지운다.
|
||||
2. **삭제 범위 안전장치 (Mac 리뷰)**:
|
||||
- 정규형 UUID 만 어떤 경로에든 닿는다. 그래서 `memory` 같은 id 가 `projects/<key>/memory/` 를 지우지 않는다. 대소문자 표기는 소문자로 정규화한다.
|
||||
- 루트 아래 경로 구성요소가 심볼릭 링크면 그 아래는 지우지 않고 residual 로만 보고한다. 루트 자체의 링크(`/tmp → /private/tmp`)는 허용한다.
|
||||
3. **residual 보고**: claude 에 `residual_artifacts` 를 신설했다. `stop_session.sh` 는 purge 뒤 residual 을 출력한다. codex·grok·opencode 도 residual 을 보고한다(purge 범위는 그대로).
|
||||
4. **살아 있는 프로세스 대기**:
|
||||
- 새 CLI `python -m lib_py.agents in-use <agent> <uuid> [--wait N]` 를 추가했다. 판정은 `sessions/<pid>.json` 과 `ps -o lstart=`(`LC_ALL=C`, `TZ=UTC0`)의 시작 시각 비교이며, pid 재사용을 구분한다. `startedAt` 이 유한한 시각이 아니거나 판정할 수 없으면 live 로 본다.
|
||||
- `stop --purge-conversation` 은 대화가 아직 쓰이고 있으면 exit 4 로 아무것도 바꾸지 않고, 보유자가 있을 만한 곳을 안내한다.
|
||||
5. **`CLAUDE_CONFIG_DIR`**: purge·liveness·residual·projects 루트가 이 값을 따른다. 명시적 `CLAUDE_PROJECT_DIR` 가 우선한다. stop `SKILL.md` 는 purge 가 레지스트리 행을 지운다고 정정했다.
|
||||
6. **eager 로드**: `lib_py.delegation.logroot` 를 `eager.CORE_MODULES` 에 명시했다(v4.9.4 리뷰의 비차단 메모).
|
||||
|
||||
#### ✅ 품질 검증
|
||||
- **회귀**: `tests/test_issue31_purge_residual.py`(67 tests). 리뷰어들이 수정 직전 커밋이나 변형 사본에서 실패를 확인했다. 대상은 비-UUID id, 링크 경계, 유한하지 않은 `startedAt`, UTC lstart, 철자 정규화이다.
|
||||
- **리뷰 (`--review-only`, `--all-reviewer`, 이 Mac 정합성 중심)**:
|
||||
- 1회차(@6f4f40a): agy·grok PASS, claude·codex NOT PASS. 지적은 비-UUID `memory` 가 자동 메모리 폴더를 지움(차단), 상위 링크를 따라 범위 밖 삭제(P1), NaN `startedAt`(P2)이다. PR 댓글로 전달했고 작성자가 커밋 11개로 수정했다.
|
||||
- 2회차(@2a8d738): 4/4 가 세 지적 모두 해결을 확인했다. 그러나 새 테스트의 보유자 `sh -c "sleep 120" <uuid>` 가 macOS `/bin/sh`(bash 3.2)의 단일 명령 exec 로 uuid 를 잃어 `[upper|mixed]` 가 이 Mac 에서 항상 실패해 NOT PASS 였다. 오케스트레이터가 이 한 줄을 Python 보유자로 바꿨다(de6f3fc).
|
||||
- 3회차(@de6f3fc): **4/4 PASS**. 리포트는 `.agents/reports/<session>/` 에 있다.
|
||||
- **전체 스위트 (macOS, Python 3.9.6, @de6f3fc)**: 1934 passed, 56 skipped(tomllib·서브모듈·Linux 전용), 1 error. error 는 #55 가드가 다른 워크스페이스에서 돌던 agy 의 대화 파일을 잡은 알려진 오탐이다. 실제 `~/.claude`(projects·file-history·session-env·sessions·jobs)·`/private/tmp/claude-<uid>`·herdr 서버 pane 목록은 바뀌지 않았다.
|
||||
- **알려진 비차단**:
|
||||
- `projects/<key>` 자체가 링크인 경우, transcript 는 purge 되지 않고 residual 로만 보고된다.
|
||||
- 소문자 질의는 대문자 argv 보유자를 보지 못한다.
|
||||
- `purge_artifacts` 를 직접 호출하면 in-use 게이트가 없다(CLI·stop 은 먼저 확인한다).
|
||||
|
||||
### 🚀 `v4.9.4` — 감사 로그가 옮긴 레지스트리를 따라간다 (Issue #57, PR #58) (2026-10-15)
|
||||
|
||||
> **패치 (PATCH Release)**: `--registry-dir`·`MAM_JOBS_DIR` 로 레지스트리만 옮긴 실행이 실제 `.mam/delegate_job_logs` 에 레지스트리 없는 감사 로그를 남기던 결함. 레지스트리를 옮기지 않은 평소 실행의 경로는 바뀌지 않는다.
|
||||
|
||||
Reference in new issue
Block a user