<!-- task=01_setup_cli_core plan=1 tag=SETUPCORE-FIX -->

# Host Setup Core Follow-up Plan

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

직전 리뷰 `code_review_cloud_G07_0.log`의 FAIL 후속 작업이다. 범위는 `packages/hostsetup` 설치 산출물의 서비스 사용자 접근 권한 수정으로 제한한다. 구현 마지막에는 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 변경 내용과 검증 출력으로 채운다.

## 배경

1차 구현은 systemd unit을 `User=iop`, `Group=iop`로 렌더링하지만, config/data dir을 root 소유로 둔다. 일반적인 `sudo iop-edge setup --enable --start` 흐름에서 서비스 프로세스가 config를 읽거나 data dir로 진입하지 못할 수 있다.

## 구현 체크리스트

- [x] [SETUPCORE-FIX-1] 서비스 사용자가 config와 data dir에 접근할 수 있게 ownership/권한 처리를 수정한다.
- [x] [SETUPCORE-FIX-2] hostsetup 단위 테스트로 ownership/권한 처리를 검증한다.
- [x] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 수정 범위

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

## 요구 사항

- `ensureUserGroup` 이후 서비스 사용자/그룹의 uid/gid를 결정해 data dir과 새로 쓰는 config 파일이 systemd 서비스 사용자 기준으로 접근 가능해야 한다.
- 기존 config를 `OverwriteConfig=false`로 보존할 때는 내용을 덮어쓰지 않는다. 다만 접근 권한 조정이 필요한지 여부는 구현자가 안전하게 판단해 코드와 테스트에 명시한다.
- dry-run은 기존처럼 파일 시스템과 외부 명령을 변경하지 않아야 한다.
- 공통 패키지는 `apps/*/internal`을 import하지 않는다.

## 검증

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