<!-- task=01_test_baseline plan=0 tag=TEST -->

# Test Baseline Plan

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

**필수 경고: 구현 마지막 단계에서 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 모두 채워야 한다. 이 파일이 채워지기 전에는 작업이 완료된 것이 아니다.**
구현 체크리스트를 끝까지 수행하고, 중간/최종 검증의 실제 stdout/stderr를 review stub에 붙여 넣는다.
review 파일의 아카이브 지시와 `코드리뷰 전용 체크리스트`는 리뷰 에이전트 전용이다.

## 배경

현재 `dart test`는 테스트 파일을 발견하지 못하고, 직접 지정한 `test/test.dart`는 더미 실패를 낸다.
AI-first 리팩토링의 첫 단계는 실제 동작을 검증하는 테스트 기준선을 만드는 것이다.

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/plan/SKILL.md`
- `test/test.dart`
- `lib/oto/application.dart`
- `lib/oto/core/tag_system.dart`
- `lib/oto/data/command_data.dart`
- `lib/oto/pipeline/pipeline.dart`
- `lib/oto/pipeline/pipeline_exe.dart`

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

- YAML 파싱과 `DataBuild.fromJson()` 동작: 기존 테스트 없음.
- 단일 태그가 List/Map 원본 타입을 보존하는 동작: 기존 테스트 없음.
- pipeline validate가 누락 command id를 거부하는 동작: 기존 테스트 없음.
- `dart test` 파일 발견 기준선: 기존 파일명이 `*_test.dart`가 아니라 없음.

### 심볼 참조

- renamed/removed symbols: none.
- 삭제 대상 파일: `test/test.dart`.

### 범위 결정 근거

- 이 plan은 테스트 기준선만 다룬다.
- `Application.build()`의 `exit()` 제거, context 도입, IO 추상화는 후속 task에서 처리한다.

### 빌드 등급

- build lane: `local-G05` — 단일 테스트 정리와 외부 IO 없는 core/pipeline 테스트 추가다.
- review lane: `local-G05` — 테스트 발견/실패 기준이 명확하다.

## 구현 체크리스트

- [ ] [TEST-1] 더미 테스트를 제거하고 실제 core/pipeline 테스트 기준선을 만든다.
- [ ] 모든 중간 검증과 최종 검증을 실행하고 실제 출력을 `CODE_REVIEW-*-G??.md`에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

- 선행 task 없음.
- 이 task가 PASS되어 `complete.log`가 생긴 뒤 후속 task를 시작한다.

### [TEST-1] 테스트 기준선 복구

#### 문제

`test/test.dart:9-15`는 실제 기능과 무관한 산술 테스트이며 하나는 실패한다.

```dart
// test/test.dart:13
test('calculate2', () {
  expect(2 + 3, equals(6));
});
```

#### 해결 방법

`test/test.dart`를 삭제하고 `test/oto_core_test.dart`를 추가한다.
테스트는 외부 프로세스/파일 IO 없이 `Application.getMapFromYamlA`, `DataBuild.fromJson`, `Command.replaceTagValue`, `Pipeline.pipelineInitialize`를 검증한다.

```dart
// test/oto_core_test.dart
import 'package:oto/oto/application.dart';
import 'package:oto/oto/commands/command.dart';
import 'package:oto/oto/data/command_data.dart';
import 'package:oto/oto/pipeline/pipeline.dart';
import 'package:test/test.dart';
```

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

- [ ] `test/test.dart` 삭제
- [ ] `test/oto_core_test.dart` 추가
- [ ] `setUp()`에서 `Application.instance.property`, `commandStates`, `dataCommandMap` 초기화
- [ ] 외부 IO가 필요한 테스트는 추가하지 않음

#### 테스트 작성

- 작성: `test/oto_core_test.dart`
- 테스트명: `parses minimal build yaml into DataBuild`, `tag system preserves single tag object values`, `pipeline validation rejects missing command id`
- 목적: 테스트 발견 기준선과 core/pipeline 최소 동작 검증

#### 중간 검증

```bash
dart test
```

예상: 모든 테스트 통과. `No tests were found` 금지.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `test/test.dart` | TEST-1 |
| `test/oto_core_test.dart` | TEST-1 |

## 최종 검증

```bash
dart analyze
```

예상: `No issues found!`

```bash
dart test
```

예상: 모든 테스트 통과.

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