<!-- task=m-workspace-port-env-standardization/04+03_standard_slot_runtime_check plan=3 tag=REVIEW_ENV -->

# Plan - REVIEW_ENV

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

사용자 결정으로 원격 `code-server` compose 파일 수정은 허용됐다. 단, `code-server` container 재부팅, stop/start, restart, recreate는 금지다. 이번 plan은 remote compose config-only 수정과 검증만 수행한다. running container port mapping 반영은 사용자 재생성 이후 별도 검증한다.

구현 중 사용자 결정이 다시 필요하면 `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청`에 evidence를 기록하고 멈춘다. 구현 에이전트는 사용자에게 직접 질문하지 않고, `USER_REVIEW.md`, `complete.log`, log archive를 만들지 않는다.

## 배경

`user_review_0.log` 이후 사용자가 `code-server` compose 수정은 가능하지만 재부팅은 금지한다고 결정했다. 설정 확인 결과 원격 `/Users/toki/docker/services/code-server/compose/docker-compose.yml`에는 `19090`, `19092`, `19190` publish가 아직 남아 있었다. `toki-labs.com` public port open은 사용자 소유 영역이므로 container/host port 확인은 LAN IP `192.168.0.97` 기준으로 다룬다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. evidence gap은 명령 재실행으로 해소하고, user-managed `code-server` 재생성이 필요해지는 경우에만 사용자 리뷰 요청으로 멈춘다.

## 분석 결과

### 읽은 파일

- `agent-task/m-workspace-port-env-standardization/04+03_standard_slot_runtime_check/user_review_0.log`
- `agent-task/m-workspace-port-env-standardization/04+03_standard_slot_runtime_check/code_review_cloud_G07_1.log`
- `agent-task/m-workspace-port-env-standardization/04+03_standard_slot_runtime_check/plan_cloud_G07_1.log`
- `agent-roadmap/phase/automation-runtime-bridge/PHASE.md`
- `agent-roadmap/phase/automation-runtime-bridge/milestones/workspace-port-env-standardization.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/testing-smoke.md`
- `agent-test/local/client-smoke.md`
- `agent-test/local/control-plane-smoke.md`
- 원격 `/Users/toki/docker/services/code-server/compose/docker-compose.yml`

### 테스트 환경 규칙

- 선택 test_env: `local`
- 적용 profile: `testing-smoke`, `client-smoke`, `control-plane-smoke`
- Docker compose와 code-server 검증은 원격 runner에서 수행한다.
- 현재 작업 컨테이너에서는 Docker-in-Docker를 사용하지 않는다.
- token/secret 원문은 tracked 파일과 review output에 기록하지 않는다.
- user-managed `code-server` container 재부팅, stop/start, restart, recreate는 금지한다.
- `toki-labs.com` public port open 검증은 제외한다. container/host port 접근 확인이 필요하면 `192.168.0.97`을 사용한다.

### 테스트 커버리지 공백

- repo source 변경 없음. 새 단위 테스트는 없다.
- 이번 plan의 검증 범위는 remote compose config render와 running container stale mapping 확인이다.
- standard-slot full runtime compose up은 running `code-server` 재생성 전까지 의도적으로 제외한다.

### 심볼 참조

- none

### 분할 판단

- split decision policy를 평가했다.
- 기존 split subtask `04+03_standard_slot_runtime_check` 안의 USER_REVIEW 재개 작업이다.
- 변경 단위는 원격 compose config-only 수정 하나이고, 재생성/런타임 smoke는 사용자 후속 작업이므로 별도 split을 만들지 않는다.

### 범위 결정 근거

- 포함: 원격 `code-server` compose file에서 `19090`, `19092`, `19190` publish 제거, comment 정리, `docker compose config` 확인.
- 제외: `code-server` 재부팅/재생성, public DNS `toki-labs.com` port open 확인, IOP standard-slot full runtime smoke.
- `Roadmap Targets`는 포함하지 않는다. 이 작업은 milestone task completion을 새로 체크하지 않는 후속 환경 정리다.

### 빌드 등급

- `cloud-G07`: 원격 compose 파일 수정, external runtime 환경, stdout/stderr evidence, 사용자 소유 컨테이너 재생성 금지 조건이 중심이다.

## 구현 체크리스트

- [ ] 원격 `code-server` compose 파일에서 `19090`, `19092`, `19190` host publish가 남아 있는지 확인한다.
- [ ] 원격 `code-server` compose 파일에서 `19090:9090`, `19092:9092`, `19190:9190` publish를 제거하고 관련 comment를 표준 슬롯 보존 기준으로 정리한다.
- [ ] `docker compose -f /Users/toki/docker/services/code-server/compose/docker-compose.yml config`에서 `19090`, `19092`, `19190` published port가 사라졌는지 확인한다.
- [ ] running `code-server` container는 재생성하지 않고, `docker ps`와 `192.168.0.97` 기준 포트 확인으로 running mapping은 아직 stale일 수 있음을 기록한다.
- [ ] CODE_REVIEW-cloud-G07.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_ENV-1] Remove missing standard-slot publish entries from code-server compose

문제: 원격 `code-server` compose config가 `19090`, `19092`, `19190`을 publish하고 있어 IOP standard slot runtime smoke의 `edge` service와 충돌한다.

해결 방법:

- `/Users/toki/docker/services/code-server/compose/docker-compose.yml`의 `ports:` 목록에서 아래 publish 항목을 제거한다.
  ```yaml
  - "19090:9090"
  - "19092:9092"
  - "19190:9190"
  ```
- comment는 `13000`, `19080`, `19090`, `19092`, `19190`을 IOP standard-slot smoke용으로 비워 둔다는 기준으로 정리한다.
- 수정 전 remote backup을 남긴다.
- `code-server` container는 재시작하거나 재생성하지 않는다.

수정 파일 및 체크리스트:

- [ ] 원격 `/Users/toki/docker/services/code-server/compose/docker-compose.yml`: `19090`, `19092`, `19190` publish 제거
- [ ] 원격 backup path 기록

테스트 작성: remote environment config-only 작업이므로 새 테스트 파일은 작성하지 않는다.

중간 검증:

```bash
ssh toki@toki-labs.com 'nl -ba /Users/toki/docker/services/code-server/compose/docker-compose.yml | sed -n "29,44p"'
ssh toki@toki-labs.com '/usr/local/bin/docker compose -f /Users/toki/docker/services/code-server/compose/docker-compose.yml config | grep -E "published: \"(19090|19092|19190)\"" && exit 1 || echo "standard slots absent from code-server compose config"'
```

기대 결과: compose file/config render에서 `19090`, `19092`, `19190` published port가 없어야 한다.

### [REVIEW_ENV-2] Record no-recreate runtime boundary and LAN-IP verification rule

문제: compose file 수정만으로 running `code-server` container port mapping은 바뀌지 않는다. 또한 `toki-labs.com` public port open은 사용자 소유 영역이라 agent가 검증할 수 없다.

해결 방법:

- `docker ps`로 running mapping이 아직 stale일 수 있음을 기록한다.
- container/host port 접근 확인은 `192.168.0.97` 기준으로만 기록한다.
- full runtime smoke는 user-managed recreate 이후 후속 작업으로 남긴다.

수정 파일 및 체크리스트:

- [ ] `CODE_REVIEW-cloud-G07.md`: no-recreate boundary 기록
- [ ] `CODE_REVIEW-cloud-G07.md`: `192.168.0.97` verification rule 기록

테스트 작성: 새 테스트 파일은 작성하지 않는다.

중간 검증:

```bash
ssh toki@toki-labs.com '/usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep "^code-server " || true'
ssh toki@toki-labs.com 'for p in 19090 19092 19190; do (echo >/dev/tcp/192.168.0.97/$p) >/dev/null 2>&1 && echo "$p open on 192.168.0.97" || echo "$p closed on 192.168.0.97"; done'
```

기대 결과: `docker ps`는 재생성 전 stale mapping을 보일 수 있다. `192.168.0.97` 결과는 현재 running container 상태 기록용이며, public `toki-labs.com` open 여부로 해석하지 않는다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| 원격 `/Users/toki/docker/services/code-server/compose/docker-compose.yml` | REVIEW_ENV-1 |
| `CODE_REVIEW-cloud-G07.md` | REVIEW_ENV-2 |

## 최종 검증

```bash
ssh toki@toki-labs.com 'nl -ba /Users/toki/docker/services/code-server/compose/docker-compose.yml | sed -n "29,44p"'
ssh toki@toki-labs.com '/usr/local/bin/docker compose -f /Users/toki/docker/services/code-server/compose/docker-compose.yml config | grep -E "published: \"(19090|19092|19190)\"" && exit 1 || echo "standard slots absent from code-server compose config"'
ssh toki@toki-labs.com '/usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep "^code-server " || true'
ssh toki@toki-labs.com 'for p in 19090 19092 19190; do (echo >/dev/tcp/192.168.0.97/$p) >/dev/null 2>&1 && echo "$p open on 192.168.0.97" || echo "$p closed on 192.168.0.97"; done'
```

기대 결과: compose file/config render에서는 `19090`, `19092`, `19190` publish가 제거된다. running container와 `192.168.0.97` 결과는 재생성 전 stale 상태 기록으로만 남긴다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
