# Complete - 02+yaml_validation

## 완료 일시

2026-05-20

## 요약

YAML 기본 구조, command list, workflow node shape 검증을 DataBuild 파싱 전후의 명시 validation message로 정리했다. 총 3회 리뷰 루프 후 최종 PASS.

## 루프 이력

| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `plan_cloud_G07_0.log` | `code_review_cloud_G07_0.log` | FAIL | root/property/command id 타입 오류가 generated parser/type error로 노출되어 follow-up 필요 |
| `plan_cloud_G07_1.log` | `code_review_cloud_G07_1.log` | FAIL | non-string workflow task key가 jsonEncode raw error로 노출되어 follow-up 필요 |
| `plan_cloud_G07_2.log` | `code_review_cloud_G07_2.log` | PASS | nested YAML 변환 안전화와 workflow key validation test 확인 완료 |

## 구현/정리 내용

- `Application.build()`에서 `DataBuild.fromJson()` 전에 build map과 command list 기본 구조를 검증하도록 했다.
- `getMapFromYamlA()`를 nested `YamlMap`/`YamlList` 재귀 변환 방식으로 바꿔 JSON encoder raw error를 피했다.
- `Pipeline.pipelineInitialize()`에서 workflow item shape와 unsupported task 메시지에 index와 지원 task 목록을 포함하도록 했다.
- root non-map, property non-map, command id/type non-string, workflow numeric key invalid YAML 테스트를 추가했다.
- 코드 포맷을 적용했다.

## 최종 검증

- `dart analyze` - PASS; `Analyzing oto... No issues found!`
- `dart test test/oto_application_test.dart test/oto_core_test.dart` - PASS; `+12: All tests passed!`
- `dart test test/oto_command_catalog_test.dart` - PASS; `+5: All tests passed!`
- `dart run bin/main.dart exe -f assets/yaml/sample/01_basic.yaml` - PASS; `Build Successfully Complete`
- `dart run bin/main.dart exe -f assets/yaml/sample/02_pipeline_if.yaml` - PASS; `Build Successfully Complete`
- numeric workflow key smoke - PASS; expected failure path now reports `Validate Pipeline` with `workflow[0]` instead of raw encoder error.

## 잔여 Nit

- 없음

## 후속 작업

- 없음
