<!-- task=07_system_runtime_foundation plan=0 tag=SYSTEM_RUNTIME_FOUNDATION -->

# Plan - SYSTEM_RUNTIME_FOUNDATION

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

**구현의 마지막 단계는 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 모두 채우는 것이다. 이 파일이 채워지기 전에는 작업이 완료된 것이 아니다.**
아래 `구현 체크리스트` 순서대로 구현하고 중간/최종 검증을 실행한 뒤, 실제 구현 내용과 stdout/stderr를 `CODE_REVIEW-cloud-G07.md`에 기록한다.
리뷰 파일의 아카이브 지시와 `코드리뷰 전용 체크리스트`는 코드리뷰 에이전트 전용이므로 실행하거나 수정하지 않는다.

## 배경

Command 계층은 `CommandRuntime`으로 외부 프로세스 실행을 fake 가능하게 만들었지만 core/cli/scheduler에는 `ProcessExecutor`와 `Process` 직접 호출이 남아 있다.
다음 rollout들이 같은 포트 계약을 공유하도록 먼저 non-command process/runtime 포트를 작게 추가한다.

## 분석 결과

### 읽은 파일

- `lib/oto/commands/command_runtime.dart`
- `lib/oto/application.dart`
- `lib/oto/core/data_composer.dart`
- `lib/cli/printer.dart`
- `lib/cli/commands/install/regist_path.dart`
- `lib/cli/commands/scheduler/scheduler_manager.dart`
- `lib/cli/commands/scheduler/scheduler_linux.dart`
- `lib/cli/commands/scheduler/scheduler_osx.dart`
- `lib/cli/commands/scheduler/scheduler_windows.dart`
- `lib/cli/commands/command_scheduler.dart`
- `test/oto_application_test.dart`
- `test/oto_command_runtime_test.dart`

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

- 새 `SystemRuntime` 포트: 기존 테스트 없음. `test/oto_system_runtime_test.dart`에 fake runtime과 default contract의 shape 테스트를 추가한다.
- call-site rollout: 이 task에서는 수행하지 않는다. 후속 `08+07`, `09+07`, `10+07`에서 각 도메인별 테스트를 추가한다.

### 심볼 참조

none. 새 심볼 추가만 수행한다.

### 분할 판단

분할 정책을 먼저 평가했다.
공유 API/foundation과 core/cli/scheduler rollout이 섞이면 API 실패가 모든 도메인 diff를 오염시키므로 분할한다.
형제 task는 `07_system_runtime_foundation`(선행), `08+07_core_process_runtime_rollout`, `09+07_cli_process_runtime_rollout`, `10+07_scheduler_process_runtime_rollout`이다.

### 범위 결정 근거

포트 파일과 foundation 테스트만 포함한다.
`Application`, `DataComposer`, `Printer`, `RegistPath`, `SchedulerManager`의 직접 호출 이전은 후속 task 범위다.
기존 `CommandRuntime`은 command 도메인 계약이므로 이 task에서 통합하거나 rename하지 않는다.

### 빌드 등급

`cloud-G07`: 프로세스 실행 포트 API이며 후속 terminal/process-control 작업의 기반이다.

## 구현 체크리스트

- [ ] `SystemRuntime` foundation API와 default 구현을 추가한다.
- [ ] foundation API 테스트를 추가한다.
- [ ] 중간 검증과 최종 검증 명령을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [SYSTEM_RUNTIME_FOUNDATION-1] SystemRuntime foundation API 추가

#### 문제

`lib/oto/application.dart:169`, `lib/oto/core/data_composer.dart:67`, `lib/cli/printer.dart:153`, `lib/cli/commands/scheduler/scheduler_manager.dart:236`처럼 command 밖 process 호출이 각자 다른 API를 직접 사용한다.
후속 rollout이 일관된 fake runtime으로 검증되려면 공통 포트가 먼저 필요하다.

#### 해결 방법

`lib/oto/core/system_runtime.dart`를 추가한다.
`SystemRuntime`은 OS 정보와 environment, shell start/run, executable run/start, pid kill을 노출한다.
`DefaultSystemRuntime`은 `Platform`, `ProcessExecutor`, `Process.run`, `Process.start`, `Process.killPid`에 위임한다.

Before (`lib/oto/application.dart:169`):
```dart
var data = await ProcessExecutor.start(StringBuffer('chcp 65001'),
    logHandler: logWithType);
```

After:
```dart
final data = await systemRuntime.startShell(StringBuffer('chcp 65001'),
    logHandler: logWithType);
```

#### 수정 파일 및 체크리스트

- [ ] `lib/oto/core/system_runtime.dart`: `SystemRuntime` / `DefaultSystemRuntime` 추가.

#### 테스트 작성

작성한다.
`test/oto_system_runtime_test.dart`에 `fake system runtime records shell and executable calls`를 추가해 후속 task에서 쓸 fake fixture shape를 검증한다.
`DefaultSystemRuntime`은 실제 외부 명령 스모크를 강제하지 않고 API compile/analyze로 검증한다.

#### 중간 검증

```bash
dart format lib/oto/core/system_runtime.dart test/oto_system_runtime_test.dart
dart test test/oto_system_runtime_test.dart
```

기대 결과: 새 테스트 통과.

### [SYSTEM_RUNTIME_FOUNDATION-2] foundation API 테스트 추가

#### 문제

후속 task가 fake runtime fixture를 복붙하면 다시 drift가 생길 수 있다.
테스트 fixture를 한 파일에 고정해 API 변화가 즉시 드러나게 해야 한다.

#### 해결 방법

`test/oto_system_runtime_test.dart`에 fake implementation을 두고 `runShell`, `startShell`, `runExecutable`, `startExecutable`, `killPid`, OS getter 값을 캡처한다.

#### 수정 파일 및 체크리스트

- [ ] `test/oto_system_runtime_test.dart`: fake runtime과 API shape 테스트 추가.

#### 테스트 작성

작성한다.
테스트명: `fake system runtime records process calls`.
검증: shell buffer, executable/args, workingDirectory, detached mode, killed pid, OS flags.

#### 중간 검증

```bash
dart test test/oto_system_runtime_test.dart
```

기대 결과: 테스트 통과.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `lib/oto/core/system_runtime.dart` | SYSTEM_RUNTIME_FOUNDATION-1 |
| `test/oto_system_runtime_test.dart` | SYSTEM_RUNTIME_FOUNDATION-2 |

## 최종 검증

```bash
dart format --output=none --set-exit-if-changed lib/oto/core/system_runtime.dart test/oto_system_runtime_test.dart
dart analyze
dart test test/oto_system_runtime_test.dart
```

기대 결과: 모든 명령 성공.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
