[Feature] 네트워크 파일 시스템 위의 .mam 을 코드로 거부한다 — NFS·SMB·SSHFS 미지원 (#71 리뷰에서 분리) #74

Open
opened 2026-10-26 13:11:03 +00:00 by Godopu · 0 comments
Owner

배경

MAM 은 에이전트와 그 상태(.mam/ 의 레지스트리·잡 기록·로그)를 그 컴퓨터의 로컬 파일로만 관리합니다. NFS·SMB(CIFS)·SSHFS 같은 네트워크 파일 시스템 위의 .mam/ 은 공식 지원하지 않습니다. 다른 컴퓨터에 닿아야 하는 일은 별도 MCP·인터페이스나 원격 에이전트로 풉니다(원격 지원에서 따로 다룹니다).

그런데 지금 코드는 네트워크 파일 시스템을 "지원하되 조심하는" 쪽으로 되어 있습니다.

지금의 동작

  • lib.sh 의 _check_is_nfs 가 .mam/ 의 마운트를 df·mount 출력으로 판정합니다.
  • 레지스트리 쓰기(atomic_dump_yaml) 때 네트워크 파일 시스템이면 경고를 두 줄 출력하고, MAM_IS_NFS=true 를 넘겨 SQLite 저널을 WAL 대신 DELETE 로 씁니다(lib_py/atomic_yaml.py). 동작은 그대로 계속합니다.
  • 이 판정은 lib.sh 를 거치는 쓰기에만 있습니다. Python 으로 바로 레지스트리를 쓰는 경로(예: #71 의 python -m lib_py.registry_format)는 판정하지 않고 WAL 로 씁니다.
  • 잡 기록(.mam/jobs)의 flock 잠금도 네트워크 파일 시스템에서는 믿을 수 없지만 판정하지 않습니다.
  • mount | grep -E "$mountpoint..." 는 마운트 경로를 이스케이프 없이 정규식에 넣습니다(IMPROVEMENTS.md B-5 잔여).
  • README 는 "네트워크 파일 시스템이면 경고하고 DELETE 로 바꾼다" 고 안내합니다(README.md:99, README.ko.md:99).

제안

지원하지 않는 환경은 문서가 아니라 코드로 거부합니다.

  1. 판정 한 곳: lib_py 에 "이 경로가 네트워크 파일 시스템 위인가" 를 판정하는 함수를 하나 둡니다. Linux 와 macOS 를 모두 지원하고, 정규식 보간 없이 판정합니다. lib.sh 의 _check_is_nfs 는 이 함수를 부르거나 지웁니다.
  2. 거부 지점:
    • 레지스트리 쓰기 함수(lib_py/atomic_yaml.py) 안에서 판정하고, 네트워크 파일 시스템이면 아무것도 쓰지 않고 오류로 멈춥니다. lib.sh 를 거치든 Python 으로 바로 부르든 같은 결과가 됩니다.
    • 잡 기록을 쓰는 곳도 같은 판정을 거칠지 정합니다.
    • 처음 실행하는 단계(설치 deploy/install.sh, multi-agent-mux-orc-onboard)에서 미리 거부해, 쓰는 도중이 아니라 시작할 때 알게 합니다.
  3. DELETE 대체 경로 삭제: 거부하므로 MAM_IS_NFS 와 journal_mode=DELETE 분기는 지웁니다.
  4. 문서: README 의 네트워크 파일 시스템 항목을 "지원하지 않으며 거부한다" 로 고칩니다. 바꾸는 줄은 최소로 합니다.

정한 것

  • 우회 수단은 두지 않습니다. 환경 변수 등으로 거부를 끄는 방법을 만들지 않습니다. 공식 지원하지 않는 환경이기 때문입니다.
  • 읽기 전용 명령(status 등)은 거부하지 않습니다. 거부는 쓰기에만 둡니다.
    • 읽기는 아무것도 바꾸지 않으므로 레지스트리를 망가뜨리지 않습니다.
    • 쓰기를 거부하면 create·resume·stop·모니터가 모두 시작부터 멈추므로, 사용자는 바로 알게 됩니다.
    • 네트워크 파일 시스템 위의 레지스트리는 로컬에서 만든 것을 옮긴 경우뿐입니다. 그때 status 로 상태를 볼 수 있으면 로컬로 되돌리는 데 도움이 됩니다.

완료 조건 (회귀 테스트로)

  1. .mam/ 이 네트워크 파일 시스템으로 판정되면 레지스트리 쓰기가 아무것도 바꾸지 않고 0 이 아닌 값으로 끝난다. lib.sh 경로와 Python 직접 호출 경로 모두.
  2. 설치와 orc-onboard 가 같은 경우 시작 단계에서 거부한다.
  3. 로컬 파일 시스템에서는 동작이 그대로다(WAL).
  4. 마운트 경로에 정규식 특수 문자(. 등)가 있어도 판정이 맞다.
  5. journal_mode=DELETE 분기와 MAM_IS_NFS 가 코드에 남지 않고, 거부를 끄는 환경 변수나 옵션이 없다.
  6. 같은 경우에도 status 같은 읽기 전용 명령은 거부하지 않는다.
  7. Linux 와 macOS(bash 3.2, Python 3.9)에서 통과한다.

관련

  • #71: 레지스트리 형식 진입점(python -m lib_py.registry_format)이 이 판정을 거치지 않는다는 리뷰 메모에서 나왔습니다.
  • #72: 업데이트 스킬이 이 진입점을 부릅니다.
  • #42: 정해진 절차는 문서보다 코드로.
## 배경 MAM 은 에이전트와 그 상태(`.mam/` 의 레지스트리·잡 기록·로그)를 **그 컴퓨터의 로컬 파일로만** 관리합니다. NFS·SMB(CIFS)·SSHFS 같은 네트워크 파일 시스템 위의 `.mam/` 은 공식 지원하지 않습니다. 다른 컴퓨터에 닿아야 하는 일은 별도 MCP·인터페이스나 원격 에이전트로 풉니다(원격 지원에서 따로 다룹니다). 그런데 지금 코드는 네트워크 파일 시스템을 "지원하되 조심하는" 쪽으로 되어 있습니다. ## 지금의 동작 - `lib.sh` 의 `_check_is_nfs` 가 `.mam/` 의 마운트를 `df`·`mount` 출력으로 판정합니다. - 레지스트리 쓰기(`atomic_dump_yaml`) 때 네트워크 파일 시스템이면 경고를 두 줄 출력하고, `MAM_IS_NFS=true` 를 넘겨 SQLite 저널을 `WAL` 대신 `DELETE` 로 씁니다(`lib_py/atomic_yaml.py`). 동작은 그대로 계속합니다. - 이 판정은 lib.sh 를 거치는 쓰기에만 있습니다. Python 으로 바로 레지스트리를 쓰는 경로(예: #71 의 `python -m lib_py.registry_format`)는 판정하지 않고 `WAL` 로 씁니다. - 잡 기록(`.mam/jobs`)의 `flock` 잠금도 네트워크 파일 시스템에서는 믿을 수 없지만 판정하지 않습니다. - `mount | grep -E "$mountpoint..."` 는 마운트 경로를 이스케이프 없이 정규식에 넣습니다(IMPROVEMENTS.md B-5 잔여). - README 는 "네트워크 파일 시스템이면 경고하고 DELETE 로 바꾼다" 고 안내합니다(`README.md:99`, `README.ko.md:99`). ## 제안 지원하지 않는 환경은 문서가 아니라 코드로 거부합니다. 1. **판정 한 곳**: `lib_py` 에 "이 경로가 네트워크 파일 시스템 위인가" 를 판정하는 함수를 하나 둡니다. Linux 와 macOS 를 모두 지원하고, 정규식 보간 없이 판정합니다. lib.sh 의 `_check_is_nfs` 는 이 함수를 부르거나 지웁니다. 2. **거부 지점**: - 레지스트리 쓰기 함수(`lib_py/atomic_yaml.py`) 안에서 판정하고, 네트워크 파일 시스템이면 아무것도 쓰지 않고 오류로 멈춥니다. lib.sh 를 거치든 Python 으로 바로 부르든 같은 결과가 됩니다. - 잡 기록을 쓰는 곳도 같은 판정을 거칠지 정합니다. - 처음 실행하는 단계(설치 `deploy/install.sh`, `multi-agent-mux-orc-onboard`)에서 미리 거부해, 쓰는 도중이 아니라 시작할 때 알게 합니다. 3. **`DELETE` 대체 경로 삭제**: 거부하므로 `MAM_IS_NFS` 와 `journal_mode=DELETE` 분기는 지웁니다. 4. **문서**: README 의 네트워크 파일 시스템 항목을 "지원하지 않으며 거부한다" 로 고칩니다. 바꾸는 줄은 최소로 합니다. ## 정한 것 - **우회 수단은 두지 않습니다.** 환경 변수 등으로 거부를 끄는 방법을 만들지 않습니다. 공식 지원하지 않는 환경이기 때문입니다. - **읽기 전용 명령(status 등)은 거부하지 않습니다.** 거부는 쓰기에만 둡니다. - 읽기는 아무것도 바꾸지 않으므로 레지스트리를 망가뜨리지 않습니다. - 쓰기를 거부하면 create·resume·stop·모니터가 모두 시작부터 멈추므로, 사용자는 바로 알게 됩니다. - 네트워크 파일 시스템 위의 레지스트리는 로컬에서 만든 것을 옮긴 경우뿐입니다. 그때 status 로 상태를 볼 수 있으면 로컬로 되돌리는 데 도움이 됩니다. ## 완료 조건 (회귀 테스트로) 1. `.mam/` 이 네트워크 파일 시스템으로 판정되면 레지스트리 쓰기가 아무것도 바꾸지 않고 0 이 아닌 값으로 끝난다. lib.sh 경로와 Python 직접 호출 경로 모두. 2. 설치와 orc-onboard 가 같은 경우 시작 단계에서 거부한다. 3. 로컬 파일 시스템에서는 동작이 그대로다(`WAL`). 4. 마운트 경로에 정규식 특수 문자(`.` 등)가 있어도 판정이 맞다. 5. `journal_mode=DELETE` 분기와 `MAM_IS_NFS` 가 코드에 남지 않고, 거부를 끄는 환경 변수나 옵션이 없다. 6. 같은 경우에도 status 같은 읽기 전용 명령은 거부하지 않는다. 7. Linux 와 macOS(bash 3.2, Python 3.9)에서 통과한다. ## 관련 - #71: 레지스트리 형식 진입점(`python -m lib_py.registry_format`)이 이 판정을 거치지 않는다는 리뷰 메모에서 나왔습니다. - #72: 업데이트 스킬이 이 진입점을 부릅니다. - #42: 정해진 절차는 문서보다 코드로.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tmpl/multi-agent-mux#74