<!-- task=01_setup_cli_core plan=3 tag=SETUPCORE-FIX3 -->

# Host Setup Core Follow-up Plan 3

## 이 파일을 읽는 구현 에이전트에게

직전 리뷰 `code_review_cloud_G07_2.log`의 FAIL 후속 작업이다. 범위는 `packages/hostsetup`의 기존 shared data parent 권한 교정과 해당 테스트 보강으로 제한한다. 구현 마지막에는 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다.

## 배경

현재 구현은 fresh host에서 data dir 부모를 `0755`로 만들지만, 이미 존재하는 부모 디렉터리의 mode는 `os.MkdirAll`이 교정하지 않는다. 이전 실패 구현이나 수동 설치로 `/var/lib/iop` 같은 shared parent가 root:root `0750`이면 setup 재실행 후에도 systemd `User=iop` 프로세스가 leaf data dir까지 traverse하지 못한다.

## 구현 체크리스트

- [x] [SETUPCORE-FIX3-1] 기존 data dir 부모가 존재해도 서비스 사용자가 traverse 가능하도록 권한 교정 정책을 구현한다.
- [x] [SETUPCORE-FIX3-2] 기존 `0750` parent를 setup 재실행으로 교정하는 단위 테스트를 추가한다.
- [x] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 수정 범위

- `packages/hostsetup/setup.go`
- `packages/hostsetup/setup_test.go`

## 요구 사항

- `/var/lib/iop/edge`, `/var/lib/iop/node` 같은 nested data dir에서 shared parent가 이미 존재해도 traverse bit가 보장되어야 한다.
- leaf data dir ownership, config ownership, unsafe data dir rejection, config no-overwrite, dry-run no-write/no-command 동작은 유지한다.
- 공통 패키지는 `apps/*/internal`을 import하지 않는다.

## 검증

```bash
gofmt -w packages/hostsetup
go test -count=1 ./packages/hostsetup
go test -count=1 ./packages/config ./packages/hostsetup
```
