release(v4.9.8): agy, codex and hermes read their databases read-only (Issue #64) - archive the review reports, bump the lockstep version

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
This commit is contained in:
GodopuandClaude Opus 5.5 committed 2026-10-20 09:37:53 +09:00
1 parent b0eccc5301
commit 38ea4f3b8e
24 files changed
+408 -26

No files matched your search

+38 -11
View File
@@ -6,8 +6,8 @@
## 📌 현재 버전 개요 (Current Release)
- **프레임워크 버전**: `v4.9.7`
- **최신 릴리스 일시**: 2026-10-19 (KST)
- **프레임워크 버전**: `v4.9.8`
- **최신 릴리스 일시**: 2026-10-20 (KST)
- **기준 브랜치**: `main`
- **핵심 아키텍처**:
- **Terminal 상태 단방향 불변성 (`engine.py`, Issue #6 Phase 1)**: `completed`, `error`, `cancelled` 터미널 상태 진입 후 후속 이벤트나 업데이트에 의한 덮어쓰기를 엄격히 차단(Terminal Immutability). `registry.py close` 서브커맨드 및 fail-closed 조기 종료 도입.
@@ -24,23 +24,50 @@
## 🧭 스킬 패키지 버전 매트릭스 (Skills Version Matrix)
모든 8개 스킬은 YAML frontmatter 메타데이터(`author`, `version`, `platforms`, `environments`) 표준화를 통해 `v4.9.7`로 동기화되어 배포됩니다.
모든 8개 스킬은 YAML frontmatter 메타데이터(`author`, `version`, `platforms`, `environments`) 표준화를 통해 `v4.9.8`로 동기화되어 배포됩니다.
| 스킬명 | 버전 | 역할 및 주요 책임 | 상태 |
| :--- | :---: | :--- | :---: |
| **`multi-agent-mux-create`** | `4.9.7` | 에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
| **`multi-agent-mux-stop`** | `4.9.7` | 대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
| **`multi-agent-mux-resume`** | `4.9.7` | 온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
| **`multi-agent-mux-status`** | `4.9.7` | 실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
| **`multi-agent-mux-monitor`** | `4.9.7` | YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
| **`multi-agent-mux-delegate-job`** | `4.9.7` | MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
| **`multi-agent-mux-loop`** | `4.9.7` | Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
| **`multi-agent-mux-orc-onboard`** | `4.9.7` | 오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
| **`multi-agent-mux-create`** | `4.9.8` | 에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
| **`multi-agent-mux-stop`** | `4.9.8` | 대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
| **`multi-agent-mux-resume`** | `4.9.8` | 온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
| **`multi-agent-mux-status`** | `4.9.8` | 실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
| **`multi-agent-mux-monitor`** | `4.9.8` | YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
| **`multi-agent-mux-delegate-job`** | `4.9.8` | MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
| **`multi-agent-mux-loop`** | `4.9.8` | Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
| **`multi-agent-mux-orc-onboard`** | `4.9.8` | 오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
---
## 📋 버전별 상세 변경 내역 (Changelog)
### 🚀 `v4.9.8` — agy·codex·hermes DB 조회도 읽기 전용 (Issue #64) (2026-10-20)
> **패치 (PATCH Release)**: v4.9.7 이 opencode 에 적용한 읽기 전용 열기(`_ro_connect`)를 agy·codex·hermes 의 조회에도 적용한다. macOS 의 시스템 SQLite 는 쓰기 가능으로 열었다 닫기만 해도 `-wal`·`-shm` 을 남긴다(persistent WAL). 그래서 MAM 의 조회가 다른 작업 공간의 agy 대화 DB 옆에 사이드카를 만들 수 있었다. Linux 는 닫을 때 지우므로 Linux 확인은 이슈에서 따로 한다.
#### 🌟 주요 개선 사항
1. **원인**: `reconcile.sh` 의 drift C(agy)는 고정되지 않은 agy 행이 있으면 대화 폴더(호스트 공용)의 모든 `*.db` 를 후보로 보고 `verify_session_uuid(..., mode="discover")` 를 부른다. 다른 작업 공간의 대화도 같은 작업 공간의 형제가 가진 것이 아니면 걸러지지 않는다. 이어지는 `AgyAgentAdapter.verify_artifact` 가 `SELECT count(*) FROM steps` 를 쓰기 가능 연결로 실행했다. `status.sh`·`create_session.sh` 도 reconcile 을 부르므로 같은 경로를 탄다.
2. **공용 `_ro_connect`**: opencode 어댑터에 있던 함수를 `lib_py/agents/base.py` 로 옮겼다. 사이드카 상태에 따른 열기 방식(둘 다 있으면 `mode=ro`, `-wal` 이 없으면 `mode=ro&immutable=1`, `-shm` 없는 `-wal` 은 임시 사본을 메모리로)은 그대로다. opencode 는 같은 함수를 import 한다.
3. **바뀐 조회**:
- agy `verify_artifact`
- codex `_find_rollout_via_db`·`discover`
- hermes `verify_artifact`·`discover`
- `status.sh` 의 hermes·codex 확인(두 출력 모드 모두)
- `reconcile.sh` drift C 의 hermes·codex
- `db_rows_naming` 의 기본 열기(codex residual)
purge 의 의도된 쓰기(codex·hermes DELETE, opencode 옛 행 정리)와 MAM 자신의 DB 는 그대로다.
#### ✅ 품질 검증
- **회귀**: `tests/test_issue64_ro_connect.py`(43개). 네 가지 사이드카 상태(clean·leftover·walonly·writer)에서 조회 결과와 DB 폴더 목록을 확인한다. 범위는 세 어댑터, `db_rows_naming`, `status.sh`·`reconcile.sh` 실행, 다른 작업 공간의 agy 대화 재현이다. base(v4.9.7)에서 23개가 실패한다.
- **리뷰 (`--all-reviewer`, 구현은 agy creator)**: 1회차(@b0eccc5) **4/4 PASS**. 리포트는 `.agents/reports/<session>/` 에 있다.
- **전체 스위트 (macOS, Python 3.9.6, @b0eccc5)**: 2044 passed, 56 skipped, 실패 0. 실제 `~/.claude`·`/private/tmp/claude-<uid>`·opencode 의 data·state·config 폴더·herdr 서버 pane 목록에 이 실행이 남긴 것은 없었다. agy·codex·hermes 홈의 사이드카 목록도 그대로였다.
- **알려진 비차단**:
- 새 런타임 테스트의 reconcile 단계는 mock herdr 에 pane 이 없어 drift C 까지 가지 않는다. drift C 의 hermes·codex 는 정적 검사가 지킨다.
- drift C(agy)는 `last_conversations.json` 이 다른 작업 공간에 기록한 대화도 후보로 받는다(기존 동작). 새 테스트가 이 동작을 단언하므로 그 결함을 고칠 때 함께 바꾼다.
- `-wal` 없음을 판단한 직후 쓰는 쪽이 생기면 immutable 읽기가 틀릴 수 있다(#60 에서 남긴 창이 세 에이전트로 넓어짐, ms 수준). 실행 중인 에이전트의 DB 는 사이드카가 있어 `mode=ro` 로 읽는다.
- MAM 밖의 프로세스(다른 작업 공간의 agy 등)는 계속 자기 사이드카를 만들고 지운다. 홈 가드가 그것을 볼 수 있다.
### 🚀 `v4.9.7` — opencode 2.x 의 Linux 확인 후속: 안내 문구, 읽기 전용 조회, 인증 확인 (Issue #60, PR #62) (2026-10-19)
> **패치 (PATCH Release)**: v4.9.6 을 Linux(Ubuntu, Python 3.14, opencode 2.0.32, herdr 0.9.3)에서 확인했다. 경로·XDG·`--standalone` 자식의 수명·거부되는 플래그·`/exit`·status 는 Mac 과 같았다. 아래는 그 확인에서 찾은 결함으로, 특정 OS 에 한정되지 않는다. Issue #60 은 이 릴리스로 닫힌다.