`plan_file: null`과 `review_file: ~`은 YAML에 실제로 존재하는 키인데
mapstructure가 present nil을 생략과 같은 nil pointer로 접어버려, 승인 경계가
빈 문자열과 공백만 거부하고 null 형태는 조용히 built-in default로 떨어뜨렸다.
Viper가 돌려주는 raw preset 구조에는 두 키가 nil 값으로 남아 있으므로, strict
decode 전에 그 presence를 검사해 필드 경로와 함께 거부하고 실제로 없는 키만
fallback 신호로 남긴다.
두 필드와 두 가지 YAML null 표기를 모두 회귀로 고정하고, 기존 빈/공백, 생략,
상대 경로, clone 독립성, refresh redaction 근거는 그대로 유지한다.
Refs: agent-task/single_request_plan_review_templates/PLAN-cloud-G08.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
원격 evidence는 push된 commit이 있어야 만들 수 있으므로 구현 commit을 먼저
올린 뒤 그 commit으로 원격을 검증했다. 검증 대상 commit, 로컬 전체 suite와
race/full/self-test 결과, Darwin/arm64 재빌드 결과를 남긴다. 승인된 operator
설정 파일 두 개가 여전히 없어 live API 검증은 외부 차단 상태이며, 이를 통과로
기록하지 않고 정확한 복구 조건과 열두 개 입력 목록을 함께 남긴다.
직전 루프의 plan/review 로그와 이번 루프 pair도 함께 보존한다.
Refs: agent-task/single_request_plan_review_templates/PLAN-cloud-G08.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`plan_file`/`review_file`이 평범한 문자열이라 decode 직후 trim-empty가 곧
생략으로 취급되었고, 그 결과 loader의 빈 경로 거부가 설정값에 대해 도달할 수
없었다. 명시적으로 설정한 빈 값과 공백 값이 조용히 built-in default로
떨어지는 승인 경계 결함이므로 optional 표현으로 바꿔 생략만 fallback 신호가
되게 한다. 설정된 값은 파일 접근 전에 trim 후 빈 경로 거부까지 도달한다.
pointer cell이 snapshot 사이에서 aliasing되지 않도록 Templates 전용 deep
clone을 두고, 네 가지 명시 빈/공백 경계와 clone 독립성, 그리고 refresh가
경로나 본문을 노출하지 않는다는 기존 근거를 함께 회귀로 고정한다.
Refs: agent-task/single_request_plan_review_templates/PLAN-cloud-G08.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
원격 evidence는 push된 commit이 있어야 만들 수 있으므로 구현 commit을
먼저 올린 뒤 그 commit으로 원격을 검증했다. 검증 대상 commit, 원격 재빌드
결과, 그리고 승인된 smoke 입력 파일 부재로 live API 검증이 외부 차단된
사실과 정확한 재개 조건을 남긴다.
Refs: agent-task/single_request_plan_review_templates/PLAN-cloud-G08.md