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

# Plan - CHECK

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

이 작업은 `03+01,02_remote_smoke_evidence` 완료 뒤 남긴 확인용 후속 plan이다. 원격 `code-server` container를 stop/start/restart/recreate하지 않는다. 사용자가 별도로 재시작/재생성을 완료한 뒤에만 표준 포트 실기동 검증을 수행한다. 아직 `code-server`가 `13000` 또는 `19080`을 publish하고 있으면 검증을 강행하지 말고 `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청`에 evidence를 기록한다.

## 배경

`03+01,02_remote_smoke_evidence`는 사용자 결정으로 완료 처리됐다. 당시 repo-owned Dockerfile build blocker는 해소됐고, 원격 `/Users/toki/docker/services/code-server/compose/docker-compose.yml`은 `13000`과 `19080` publish를 비우도록 수정됐다. 다만 running container에는 새 mapping이 적용되지 않았고, 사용자가 재부팅/재생성을 나중에 처리하기로 했다. 이 plan은 그 이후 실제 표준 slot compose health evidence만 수집한다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. 구현 에이전트는 사용자에게 직접 질문하거나 원격 `code-server`를 직접 재시작하지 않는다.

## 분석 결과

### 읽은 파일

- `agent-task/archive/2026/06/m-workspace-port-env-standardization/03+01,02_remote_smoke_evidence/complete.log`
- `agent-task/archive/2026/06/m-workspace-port-env-standardization/03+01,02_remote_smoke_evidence/USER_REVIEW.md`
- `apps/client/Dockerfile`
- `.env.example`
- `docker-compose.yml`
- `agent-test/local/rules.md`
- `agent-test/local/testing-smoke.md`
- `agent-test/local/client-smoke.md`
- `agent-test/local/control-plane-smoke.md`

### 테스트 환경 규칙

- 선택 test_env: `local`
- `agent-test/local/rules.md`를 읽었다.
- 적용 profile: `testing-smoke`, `client-smoke`, `control-plane-smoke`
- Docker compose와 Flutter/runtime evidence는 원격 runner/code-server 환경에서 확인한다.
- token/secret 원문은 tracked 파일과 review output에 기록하지 않는다.
- 원격 `code-server` stop/start/restart/recreate는 이 plan 범위에서 금지한다.

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

- unit/client build는 이전 작업에서 통과했다.
- 아직 남은 공백은 수정된 `code-server` compose config가 실제 running port mapping에 적용된 뒤, IOP standard slot `13000`/`19080`/`19090` 기반 compose stack이 health/readiness까지 통과하는지 여부다.

### 심볼 참조

- none

### 분할 판단

- split decision policy를 평가했다.
- 이 작업은 기존 split task `03` 완료 뒤 확인만 수행하는 독립 후속 검증이다.
- 선행 `03`: `agent-task/archive/2026/06/m-workspace-port-env-standardization/03+01,02_remote_smoke_evidence/complete.log`로 충족됐다.
- 추가 코드 변경 단위가 없으므로 단일 plan으로 둔다.

### 범위 결정 근거

- 이 plan은 source 수정 없이 검증 evidence만 수집한다.
- 원격 `/Users/toki/docker/services/code-server/compose/docker-compose.yml` 추가 수정, `code-server` 재시작/재생성, 임시 override port 검증은 제외한다.
- `Roadmap Targets`는 의도적으로 포함하지 않는다. `port-default-rollout`은 이전 완료 로그에서 사용자 결정으로 완료 처리됐고, 이 plan은 중복 roadmap completion을 발생시키지 않는 확인 작업이다.

### 빌드 등급

- `cloud-G07`: 원격 Docker compose, long-running image/service startup, stdout/stderr evidence, host port mapping 판정이 중심이다.

## 구현 체크리스트

- [ ] 원격 `code-server`가 더 이상 `13000`과 `19080`을 publish하지 않는지 확인한다.
- [ ] 표준 slot compose config render와 service health/readiness를 원격 isolated context에서 확인한다.
- [ ] smoke project cleanup과 `code-server` running 상태를 확인한다.
- [ ] 검증 결과에 host/token/credential 원문이 남지 않도록 출력 sanitization 여부를 확인한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [CHECK-1] Confirm standard slots are free after user-managed code-server restart

문제: 이전 완료 시점에는 `code-server` running container가 `13000`과 `19080`을 계속 publish하고 있었다.

해결 방법:

- 원격 Docker 상태를 읽기 전용으로 확인한다.
- `code-server`가 여전히 `13000` 또는 `19080`을 publish하면 검증을 중단하고 `사용자 리뷰 요청`에 기록한다.

수정 파일 및 체크리스트:

- [ ] source 수정 없음
- [ ] `CODE_REVIEW-cloud-G07.md`: port mapping 확인 결과 기록

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

중간 검증:

```bash
ssh toki@toki-labs.com '/usr/local/bin/docker inspect code-server --format "{{.State.Status}}" && /usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep -E "code-server|13000|19080" || true'
```

기대 결과: `code-server`는 running이고, 출력에 `13000`과 `19080` publish가 없어야 한다. 여전히 보이면 사용자 리뷰 요청으로 멈춘다.

### [CHECK-2] Verify standard-slot compose health

문제: `port-default-rollout`의 최종 확인은 표준 host slot compose service health evidence다.

해결 방법:

- 기존 dirty remote checkout을 사용하지 않고 isolated context를 사용한다.
- `IOP_EDGE_NODE_TOKEN`은 명령 환경에만 두고 output에는 `<sanitized-smoke-token>`으로 기록한다.
- `iop-g07-port-smoke` project만 생성하고 cleanup한다.

수정 파일 및 체크리스트:

- [ ] source 수정 없음
- [ ] `CODE_REVIEW-cloud-G07.md`: compose config/up/health/ps/down output 기록

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

중간 검증:

```bash
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && IOP_EDGE_NODE_TOKEN=<sanitized-smoke-token> /usr/local/bin/docker compose --project-name iop-g07-port-smoke --env-file .env.example config >/tmp/iop-compose-config-g07-standard.out && grep -E "18000|13000|15400|16300|19080|19081|19090" /tmp/iop-compose-config-g07-standard.out'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && IOP_EDGE_NODE_TOKEN=<sanitized-smoke-token> /usr/local/bin/docker compose --project-name iop-g07-port-smoke --env-file .env.example up --build -d postgres redis control-plane edge web'
ssh toki@toki-labs.com 'curl -fsS http://127.0.0.1:18000/healthz && curl -fsS http://127.0.0.1:18000/readyz'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && /usr/local/bin/docker compose --project-name iop-g07-port-smoke ps'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && IOP_EDGE_NODE_TOKEN=<sanitized-smoke-token> /usr/local/bin/docker compose --project-name iop-g07-port-smoke --env-file .env.example down'
```

기대 결과: config render, full build/start, `/healthz`, `/readyz`, compose ps, cleanup이 모두 성공한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `CODE_REVIEW-cloud-G07.md` | CHECK-1, CHECK-2 |

## 최종 검증

```bash
ssh toki@toki-labs.com '/usr/local/bin/docker inspect code-server --format "{{.State.Status}}" && /usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep -E "code-server|13000|19080" || true'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && IOP_EDGE_NODE_TOKEN=<sanitized-smoke-token> /usr/local/bin/docker compose --project-name iop-g07-port-smoke --env-file .env.example config >/tmp/iop-compose-config-g07-standard.out && grep -E "18000|13000|15400|16300|19080|19081|19090" /tmp/iop-compose-config-g07-standard.out'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && IOP_EDGE_NODE_TOKEN=<sanitized-smoke-token> /usr/local/bin/docker compose --project-name iop-g07-port-smoke --env-file .env.example up --build -d postgres redis control-plane edge web'
ssh toki@toki-labs.com 'curl -fsS http://127.0.0.1:18000/healthz && curl -fsS http://127.0.0.1:18000/readyz'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && /usr/local/bin/docker compose --project-name iop-g07-port-smoke ps'
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-g07-standard-20260607200222/iop && IOP_EDGE_NODE_TOKEN=<sanitized-smoke-token> /usr/local/bin/docker compose --project-name iop-g07-port-smoke --env-file .env.example down'
```

기대 결과: user-managed restart 이후 standard slots가 비어 있고 compose health/readiness가 통과한다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
