fix(agents): agy·codex·hermes DB 조회를 읽기 전용으로 (Issue #64, v4.9.8) #65

Merged
Godopu merged 2 commits from fix/issue-64-ro-connect into main 2026-10-20 00:38:12 +00:00
Owner

요약

Refs #64 (macOS 확인분. Linux 확인은 이슈에서 계속)

agy·codex·hermes 의 조회 전용 SQLite 열기를 공용 _ro_connect 로 바꿨다. macOS 시스템 SQLite 는 쓰기 가능으로 열었다 닫기만 해도 -wal·-shm 을 남긴다. 그래서 MAM 의 조회가 다른 작업 공간의 agy 대화 DB 옆에 사이드카를 만들 수 있었다.

  • 원인: reconcile.sh drift C(agy)는 고정되지 않은 agy 행이 있으면 호스트 공용 대화 폴더의 모든 *.db 를 후보로 본다. 이어지는 AgyAgentAdapter.verify_artifact 가 SELECT count(*) FROM steps 를 쓰기 가능 연결로 실행했다. status.sh·create_session.sh 도 reconcile 을 부른다.
  • 공용 helper: _ro_connect 를 opencode 어댑터에서 lib_py/agents/base.py 로 옮겼다. 동작은 그대로이고, opencode 는 같은 함수를 import 한다.
  • 바뀐 조회:
    • 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 기본 열기
  • 그대로 둔 것: purge 의 의도된 쓰기와 MAM 자신의 DB.

검증

  • 회귀 테스트: tests/test_issue64_ro_connect.py(43개). 사이드카 4상태(clean·leftover·walonly·writer)에서 조회 결과와 DB 폴더 목록이 바뀌지 않는지 본다. base(v4.9.7)에서는 23개가 실패한다.
  • 리뷰: --all-reviewer 1회차(@b0eccc5) 4/4 PASS. 구현은 agy creator 가 맡았다.
  • 전체 스위트 (macOS, Python 3.9.6, @b0eccc5): 2044 passed, 56 skipped, 실패 0.
  • 흔적 점검: 실제 홈의 claude·opencode 폴더, herdr 서버 pane 목록, agy·codex·hermes 홈의 사이드카에 이 실행이 남긴 것은 없었다.

비차단 (리뷰어 지적)

  • 새 런타임 테스트의 reconcile 단계는 mock herdr 에 pane 이 없어 drift C 까지 가지 않는다. hermes·codex drift C 는 정적 검사가 지킨다.
  • drift C(agy)는 다른 작업 공간에 기록된 대화도 후보로 받는다. 기존 동작이고, 새 테스트가 이를 단언하므로 그 결함을 고칠 때 함께 바꾼다.
  • immutable 읽기의 경쟁 창(ms 수준)은 #60 에서 남긴 것이 세 에이전트로 넓어졌다.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff

## 요약 Refs #64 (macOS 확인분. Linux 확인은 이슈에서 계속) agy·codex·hermes 의 조회 전용 SQLite 열기를 공용 `_ro_connect` 로 바꿨다. macOS 시스템 SQLite 는 쓰기 가능으로 열었다 닫기만 해도 `-wal`·`-shm` 을 남긴다. 그래서 MAM 의 조회가 다른 작업 공간의 agy 대화 DB 옆에 사이드카를 만들 수 있었다. - **원인**: `reconcile.sh` drift C(agy)는 고정되지 않은 agy 행이 있으면 호스트 공용 대화 폴더의 모든 `*.db` 를 후보로 본다. 이어지는 `AgyAgentAdapter.verify_artifact` 가 `SELECT count(*) FROM steps` 를 쓰기 가능 연결로 실행했다. `status.sh`·`create_session.sh` 도 reconcile 을 부른다. - **공용 helper**: `_ro_connect` 를 opencode 어댑터에서 `lib_py/agents/base.py` 로 옮겼다. 동작은 그대로이고, opencode 는 같은 함수를 import 한다. - **바뀐 조회**: - 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` 기본 열기 - **그대로 둔 것**: purge 의 의도된 쓰기와 MAM 자신의 DB. ## 검증 - **회귀 테스트**: `tests/test_issue64_ro_connect.py`(43개). 사이드카 4상태(clean·leftover·walonly·writer)에서 조회 결과와 DB 폴더 목록이 바뀌지 않는지 본다. base(v4.9.7)에서는 23개가 실패한다. - **리뷰**: `--all-reviewer` 1회차(@b0eccc5) 4/4 PASS. 구현은 agy creator 가 맡았다. - **전체 스위트 (macOS, Python 3.9.6, @b0eccc5)**: 2044 passed, 56 skipped, 실패 0. - **흔적 점검**: 실제 홈의 claude·opencode 폴더, herdr 서버 pane 목록, agy·codex·hermes 홈의 사이드카에 이 실행이 남긴 것은 없었다. ## 비차단 (리뷰어 지적) - 새 런타임 테스트의 reconcile 단계는 mock herdr 에 pane 이 없어 drift C 까지 가지 않는다. hermes·codex drift C 는 정적 검사가 지킨다. - drift C(agy)는 다른 작업 공간에 기록된 대화도 후보로 받는다. 기존 동작이고, 새 테스트가 이를 단언하므로 그 결함을 고칠 때 함께 바꾼다. - immutable 읽기의 경쟁 창(ms 수준)은 #60 에서 남긴 것이 세 에이전트로 넓어졌다. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
Godopu added 2 commits 2026-10-20 00:38:08 +00:00
Godopu merged commit ff8b381520 into main 2026-10-20 00:38:12 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tmpl/multi-agent-mux#65