# 아키텍처 ## 목표 이 저장소의 현재 책임은 C#/.NET SDK 프로젝트를 위한 Codex Harness scaffold를 제공하는 것이다. Harness는 phase execution, edit guard, commit validation, workspace validation을 분리해서 관리한다. Application과 test target은 C#/.NET SDK를 사용하고 Harness script는 Python 3으로 실행한다. Harness는 PATH에 설치된 `dotnet`을 그대로 사용한다. .NET SDK 버전을 선택하거나 설치하지 않으며 `global.json`을 생성하거나 고정하지 않는다. ## 디렉토리 구조 ```text .codex/ ├── hooks/ # Codex hook scripts └── skills/ # Harness planning/review instructions docs/ # Project and Harness guidance scripts/ ├── execute.py # Phase step executor ├── validate_workspace.py └── test_*.py # Harness self-tests phases/ # Optional generated phase plans ``` ## 데이터 흐름 ```text User-approved task -> Harness phase files under phases/ -> scripts/execute.py injects AGENTS.md and docs/*.md -> Codex executes one step at a time -> step updates phases/{phase}/index.json -> validation runs through scripts/validate_workspace.py ``` ## Hook 흐름 ```text apply_patch/Edit/Write -> .codex/hooks/tdd-guard.py -> C# production .cs changes require related C# test files git commit command -> .codex/hooks/pre_commit_checks.py -> Python Harness self-tests -> scripts/validate_workspace.py ``` ## Validation 흐름 ```text python scripts/validate_workspace.py -> HARNESS_VALIDATION_COMMANDS set? -> yes: run the exact override commands; skip automatic target discovery -> no: inspect repository-root targets Exactly one root .sln exists -> select that solution, even when root .csproj files also exist No root .sln exists and exactly one root SDK-style .csproj exists -> select that project as the single-project fallback Multiple targets exist at the same active priority -> report ambiguity and exit with an error; never choose arbitrarily No root solution or SDK-style project exists -> print guidance and exit successfully Selected target -> dotnet restore -> dotnet build --configuration Debug --no-restore -> dotnet test --configuration Debug --no-build --no-restore ``` 다중 project 저장소는 루트 solution에 모든 build/test 대상을 포함해야 한다. 루트의 단일 SDK-style `.csproj` fallback은 단일-project 저장소만을 위한 경로다.