[Bug] update.sh 업데이트 후 version.txt·asset_hashes.txt 가 이전 버전 값으로 복원되는 문제 #8

Closed
opened 2026-09-11 15:52:08 +00:00 by Godopu · 2 comments
Owner

문제 개요 (Summary)

deploy/update.sh 로 업데이트하면, 인스톨러가 새로 기록한 .mam/version.txt 와 .mam/asset_hashes.txt 를 업데이트 전 백업본으로 다시 덮어씁니다. 그 결과 버전 기록이 실제 설치 버전과 달라지고, 다음 업데이트 때 원본 그대로인 파일이 "로컬 수정됨"으로 오판되어 불필요한 백업이 생성됩니다.


세부 원인 분석 (Detailed Root Causes)

  • 위치: deploy/update.sh 137행(백업), 168행(실패 시 롤백 복원), 232행(성공 후 복원)
  • 증상:
    • 인스톨러(deploy/install.sh)는 410행에서 asset_hashes.txt 를 새 파일 기준으로 재생성하고, 452행에서 version.txt 에 새 커밋을 기록합니다.
    • 그런데 update.sh 는 설치 성공 후(232행) .mam.update-tmp/ 의 이전 install_state, asset_hashes.txt, version.txt 를 .mam/ 에 다시 복사합니다.
    • 재현 결과(6c0b8b0 → 4d444ce):
      • 설치된 매니페스트 파일 83개는 upstream HEAD 와 모두 일치했지만, version.txt 는 commit=6c0b8b0… 로 남음
      • asset_hashes.txt 기준 해시 비교 시 39개 불일치
      • remove.sh 의 수정 파일 검사가 이 이전 해시로 비교하여, 원본 그대로인 파일 36개가 .mam-skill-backup.<ts>/ 로 백업됨 (36개 모두 upstream 이력에 존재하는 원본 blob 으로 확인)
  • 제안 해결책:
    • 성공 경로(232행)에서는 asset_hashes.txt, version.txt 를 복원 대상에서 제외하고 인스톨러가 새로 쓴 값을 유지
    • install_state 는 필요한 키(예: gitignore_created)만 병합
    • 실패 경로(168행)의 롤백 복원은 현행 유지

재현 절차 (Reproduction)

  1. 이전 커밋이 설치된 워크스페이스에서 bash .mam_deploy/update.sh --yes
  2. cat .mam/version.txt → 이전 커밋이 표시됨
  3. .mam/asset_hashes.txt 기준으로 현재 파일 해시 비교 → 업데이트된 파일 수만큼 불일치

환경 정보 (Environment)

  • OS: macOS (Darwin 25.6.0)
  • MAM Version: 6c0b8b0 → 4d444ce (main)
## 문제 개요 (Summary) `deploy/update.sh` 로 업데이트하면, 인스톨러가 새로 기록한 `.mam/version.txt` 와 `.mam/asset_hashes.txt` 를 업데이트 전 백업본으로 다시 덮어씁니다. 그 결과 버전 기록이 실제 설치 버전과 달라지고, 다음 업데이트 때 원본 그대로인 파일이 "로컬 수정됨"으로 오판되어 불필요한 백업이 생성됩니다. --- ## 세부 원인 분석 (Detailed Root Causes) * **위치**: `deploy/update.sh` 137행(백업), 168행(실패 시 롤백 복원), **232행(성공 후 복원)** * **증상**: * 인스톨러(`deploy/install.sh`)는 410행에서 `asset_hashes.txt` 를 새 파일 기준으로 재생성하고, 452행에서 `version.txt` 에 새 커밋을 기록합니다. * 그런데 `update.sh` 는 설치 성공 후(232행) `.mam.update-tmp/` 의 이전 `install_state`, `asset_hashes.txt`, `version.txt` 를 `.mam/` 에 다시 복사합니다. * 재현 결과(`6c0b8b0` → `4d444ce`): * 설치된 매니페스트 파일 83개는 upstream HEAD 와 모두 일치했지만, `version.txt` 는 `commit=6c0b8b0…` 로 남음 * `asset_hashes.txt` 기준 해시 비교 시 39개 불일치 * `remove.sh` 의 수정 파일 검사가 이 이전 해시로 비교하여, 원본 그대로인 파일 36개가 `.mam-skill-backup.<ts>/` 로 백업됨 (36개 모두 upstream 이력에 존재하는 원본 blob 으로 확인) * **제안 해결책**: * 성공 경로(232행)에서는 `asset_hashes.txt`, `version.txt` 를 복원 대상에서 제외하고 인스톨러가 새로 쓴 값을 유지 * `install_state` 는 필요한 키(예: `gitignore_created`)만 병합 * 실패 경로(168행)의 롤백 복원은 현행 유지 --- ## 재현 절차 (Reproduction) 1. 이전 커밋이 설치된 워크스페이스에서 `bash .mam_deploy/update.sh --yes` 2. `cat .mam/version.txt` → 이전 커밋이 표시됨 3. `.mam/asset_hashes.txt` 기준으로 현재 파일 해시 비교 → 업데이트된 파일 수만큼 불일치 ## 환경 정보 (Environment) * OS: macOS (Darwin 25.6.0) * MAM Version: `6c0b8b0` → `4d444ce` (main)
Author
Owner

추가 확인 사항 (How_To_Use_GENAI 작업 공간)

  • 업데이트 직전 파일은 6c0b8b0과 49/49 일치했으나, asset_hashes.txt 53개는 ac82f9b~4025623(8/17~8/20)과만 전부 일치했습니다. 업데이트 후에도 같은 기록이 복원되어, 해시 기록이 과거 설치 시점에 고정됩니다. 8/20 기록이 8/28 설치에 남은 경위는 미확인입니다.
  • remove.sh가 원본 파일 32개를 .mam-skill-backup.20260911T230240Z/에 백업했습니다. 32개 모두 upstream blob으로 확인했습니다.
  • install.sh를 직접 실행하면 해시가 틀린 파일이 PRESERVE_CUSTOM으로 분류되어 조용히 갱신되지 않습니다.
  • 수정 후 첫 업데이트는 로컬의 옛 update.sh로 실행되고, remove.sh도 기존 해시로 비교합니다. 기존 작업 공간에는 해시 재생성 마이그레이션이 필요합니다.
**추가 확인 사항 (How_To_Use_GENAI 작업 공간)** - 업데이트 직전 파일은 `6c0b8b0`과 49/49 일치했으나, `asset_hashes.txt` 53개는 `ac82f9b`\~`4025623`(8/17\~8/20)과만 전부 일치했습니다. 업데이트 후에도 같은 기록이 복원되어, 해시 기록이 과거 설치 시점에 고정됩니다. 8/20 기록이 8/28 설치에 남은 경위는 미확인입니다. - `remove.sh`가 원본 파일 32개를 `.mam-skill-backup.20260911T230240Z/`에 백업했습니다. 32개 모두 upstream blob으로 확인했습니다. - `install.sh`를 직접 실행하면 해시가 틀린 파일이 `PRESERVE_CUSTOM`으로 분류되어 조용히 갱신되지 않습니다. - 수정 후 첫 업데이트는 로컬의 옛 `update.sh`로 실행되고, `remove.sh`도 기존 해시로 비교합니다. 기존 작업 공간에는 해시 재생성 마이그레이션이 필요합니다.
Author
Owner

main 8e7282c 에 병합되어 해결되었습니다 (v4.4.4, 브랜치 fix/issue-12-8-7).

  • deploy/update.sh 성공 경로에서 version.txt·asset_hashes.txt 를 더 이상 이전 값으로 복원하지 않습니다. install_state 는 새 설치가 쓰지 않은 키만 병합합니다 (정확 키 매칭, key=value 아닌 줄 무시, 개행 보장).
  • 실패 경로(restore_on_failure)는 기존대로 전체 복원합니다.
  • 테스트: tests/test_issue8_update_state.py (실제 install→update 사이클).
  • 리뷰: claude·agy·grok·codex 4인 [VERDICT: PASS].
main `8e7282c` 에 병합되어 해결되었습니다 (v4.4.4, 브랜치 `fix/issue-12-8-7`). - `deploy/update.sh` 성공 경로에서 `version.txt`·`asset_hashes.txt` 를 더 이상 이전 값으로 복원하지 않습니다. `install_state` 는 새 설치가 쓰지 않은 키만 병합합니다 (정확 키 매칭, `key=value` 아닌 줄 무시, 개행 보장). - 실패 경로(`restore_on_failure`)는 기존대로 전체 복원합니다. - 테스트: `tests/test_issue8_update_state.py` (실제 install→update 사이클). - 리뷰: claude·agy·grok·codex 4인 `[VERDICT: PASS]`.
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#8