<!-- task=m-provider-adapter-foundation/02+01_postgres_provider_store plan=2 tag=REVIEW_REVIEW_API -->

# Plan - REVIEW_REVIEW_API

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

이 계획은 직전 코드리뷰 FAIL의 후속 루프다. 구현이 끝나도 task는 완료가 아니다. 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용, 검증 명령, stdout/stderr로 채우고 active 파일을 그대로 둔 뒤 리뷰 준비를 보고한다. 선택된 SDD 결정 또는 선택된 Milestone `구현 잠금 > 결정 필요` 항목 때문에 막히면 review stub의 `사용자 리뷰 요청` 섹션에 연결 대상과 근거를 채우고 멈춘다. 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 환경/secret/service 차단, 일반 범위 변경, 검증 증거 공백은 사용자 리뷰 요청이 아니라 검증 결과나 후속 계획으로 기록한다.

## 배경

직전 루프는 provider config PgStore/migration 구현을 추가했지만, `services/core/internal/storage/postgres_test.go`를 provider config 테스트 하나만 남긴 파일로 바꾸면서 기존 Postgres integration regression coverage를 제거했다. 또한 새 provider config test에는 DB가 있으면 실패할 timestamp assertion이 있고, 현재 local 환경에서는 `GITO_TEST_DATABASE_URL`이 없어 integration test가 skip됐는데 review evidence에는 skip과 잔여 위험이 기록되지 않았다. 이 루프는 구현 범위를 좁혀 테스트 복구와 검증 증거 신뢰도를 회복한다.

## 사용자 리뷰 요청 흐름

구현 중 직접 사용자 프롬프트는 금지된다. 선택된 SDD 결정 또는 Milestone `구현 잠금 > 결정 필요` 항목만 active review stub의 `사용자 리뷰 요청` 섹션에 기록하며, code-review가 검증 후 실제 `USER_REVIEW.md` 작성을 담당한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/provider-change-request-integration/milestones/provider-adapter-foundation.md`
- Task ids:
  - `provider-store`: provider config를 저장하고 조회하는 store boundary를 만든다.
- Completion mode: check-on-pass

## Archive Evidence Snapshot

- Archived plan: `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/plan_local_G05_1.log`
- Archived review: `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/code_review_local_G05_1.log`
- Previous loop logs:
  - `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/plan_local_G05_0.log`
  - `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/code_review_local_G05_0.log`
- Verdict: FAIL
- Required summary:
  - `services/core/internal/storage/postgres_test.go` removed the existing Postgres integration suite. `git show HEAD:services/core/internal/storage/postgres_test.go` has 1422 lines and 10 `TestPostgres...` tests; the current file has 227 lines and only `TestPostgresProviderConfigStoreSavesGetsListsAndValidates`.
  - `services/core/internal/storage/postgres_test.go:64` asserts `saved.CreatedAt` should be zero immediately after `SaveProviderConfig`, contradicting the SQL `RETURNING ... created_at, updated_at` behavior.
  - Active review evidence claimed PostgreSQL integration validation, but local `GITO_TEST_DATABASE_URL` was unset and `go test -count=1 -run TestPostgresProviderConfigStoreSavesGetsListsAndValidates -v ./internal/storage` skipped the integration test.
- Affected files:
  - `services/core/internal/storage/postgres_test.go`
  - `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/CODE_REVIEW-local-G05.md`
- Verification evidence:
  - `cd services/core && go test -count=1 ./internal/storage` exited 0, but did not show skip detail.
  - `cd services/core && go test ./...` exited 0.
  - `GITO_TEST_DATABASE_URL` was unset.
  - `cd services/core && go test -count=1 -run TestPostgresProviderConfigStoreSavesGetsListsAndValidates -v ./internal/storage` exited 0 with `--- SKIP` and `GITO_TEST_DATABASE_URL not set; skipping Postgres integration test`.
  - `cd services/core && go test -count=1 ./internal/storage -run TestInitialMigrationSupportsStoreBoundary -v` exited 0 and passed the migration snippet test.
- Roadmap/spec carryover:
  - Keep the Roadmap Targets above.
  - No Spec Targets were present.
- Allowed archive reread:
  - If exact prior wording is needed, read only `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/plan_local_G05_1.log`, `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/code_review_local_G05_1.log`, `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/plan_local_G05_0.log`, `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/code_review_local_G05_0.log`, and `agent-task/archive/2026/06/m-provider-adapter-foundation/01_provider_store_boundary/complete.log`.

## 구현 체크리스트

- [ ] `services/core/internal/storage/postgres_test.go`의 기존 Postgres integration tests를 복원하고 provider config test를 추가 형태로 병합한다.
- [ ] provider config test의 `CreatedAt`/`UpdatedAt` assertion을 실제 DB 반환 동작에 맞게 수정한다.
- [ ] `GITO_TEST_DATABASE_URL`이 unset인 경우 provider config integration test skip output과 남은 DB coverage risk를 review stub에 기록한다.
- [ ] `cd services/core && go test -count=1 ./internal/storage` 및 `cd services/core && go test ./...`를 실행하고 실제 stdout/stderr를 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

이 디렉터리 이름의 `02+01_...`가 runtime dependency source다. predecessor evidence는 이미 archive에 있으므로, 필요한 경우 위 `Allowed archive reread`의 complete.log 경로만 좁게 확인한다. 추가 의존성은 없다.

### [REVIEW_REVIEW_API-1] 삭제된 Postgres integration tests 복원

문제: [postgres_test.go](/config/workspace/gito/services/core/internal/storage/postgres_test.go:18)가 provider config test 하나만 포함하고, 기존 repo/lease/branch-event/migration/operation/event/agent-input/webhook delivery regression tests를 삭제했다. 이 변경은 provider config task 범위를 넘어 storage regression coverage를 잃게 만든다.

해결 방법: `git show HEAD:services/core/internal/storage/postgres_test.go`의 기존 테스트 파일 내용을 기준으로 기존 테스트와 helper를 되살리고, provider config test를 추가한다. 기존 helper(`isolatedPostgresDSN`, `postgresDSNWithSearchPath`)는 중복 정의하지 않는다. 필요한 imports는 gofmt가 정리하도록 둔다.

수정 파일 및 체크리스트:

- [ ] `services/core/internal/storage/postgres_test.go`: 기존 `TestPostgres...` suite 복원.
- [ ] `services/core/internal/storage/postgres_test.go`: provider config test를 기존 suite에 추가.
- [ ] `services/core/internal/storage/postgres_test.go`: helper 중복/삭제/불필요 import 정리.

테스트 결정: DB env가 없으면 integration tests는 skip될 수 있지만, 기존 테스트 함수들이 파일에 존재해야 하며 compile/package tests는 통과해야 한다.

중간 검증:

```bash
cd services/core && go test -count=1 ./internal/storage
```

### [REVIEW_REVIEW_API-2] provider config test timestamp assertion 수정

문제: [postgres_test.go](/config/workspace/gito/services/core/internal/storage/postgres_test.go:64)는 `SaveProviderConfig` 이후 `saved.CreatedAt`이 zero가 아니면 실패하도록 되어 있지만, SQL은 `RETURNING id, endpoint, credential_ref, capabilities, created_at, updated_at`를 반환한다. 실제 DB 실행 환경에서는 이 assertion이 실패한다.

해결 방법: 반대 assertion을 제거하고, 첫 save 후 `CreatedAt`과 `UpdatedAt`이 설정됐는지 확인한다. update save 후에도 returned config가 update된 endpoint/credential_ref/capabilities를 갖는지 확인하고, timestamp 비교는 flake가 없도록 최소한 zero 여부 또는 `UpdatedAt`이 zero가 아닌지만 확인한다.

수정 파일 및 체크리스트:

- [ ] `services/core/internal/storage/postgres_test.go`: `saved.CreatedAt` zero 기대 assertion 제거.
- [ ] `services/core/internal/storage/postgres_test.go`: timestamp assertions를 DB 반환 동작에 맞게 수정.

테스트 결정: 실제 DB env가 있으면 provider config integration test가 실패하지 않아야 한다. env가 없으면 skip output을 기록한다.

중간 검증:

```bash
cd services/core && go test -count=1 -run TestPostgresProviderConfigStoreSavesGetsListsAndValidates -v ./internal/storage
```

### [REVIEW_REVIEW_API-3] verification evidence와 skip risk 기록

문제: 직전 review stub은 PostgreSQL integration test가 검증됐다고 기록했지만, 실제 local 환경에서는 `GITO_TEST_DATABASE_URL`이 unset이라 provider config integration test가 skip됐다. `go test` 기본 출력은 skip을 숨기므로 evidence trust가 부족하다.

해결 방법: `GITO_TEST_DATABASE_URL` 존재 여부를 확인하고, unset이면 `go test -count=1 -run TestPostgresProviderConfigStoreSavesGetsListsAndValidates -v ./internal/storage`의 skip output과 "DB-backed provider config CRUD는 이 환경에서 실행 검증되지 않음"이라는 잔여 위험을 review stub에 기록한다. 가능하면 local rules에 맞는 DB env를 주입해 실제 integration test를 실행한다.

수정 파일 및 체크리스트:

- [ ] `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/CODE_REVIEW-local-G05.md`: 실제 명령 출력과 skip/잔여 위험 기록.

테스트 결정: 최종 검증은 plan의 고정 명령을 그대로 실행한다. DB env가 없을 때는 focused `-v` command도 추가로 기록한다.

최종 검증:

```bash
cd services/core && go test -count=1 ./internal/storage
cd services/core && go test ./...
```

## 수정 파일 요약

| 파일 | 항목 |
| --- | --- |
| `services/core/internal/storage/postgres_test.go` | REVIEW_REVIEW_API-1, REVIEW_REVIEW_API-2 |
| `agent-task/m-provider-adapter-foundation/02+01_postgres_provider_store/CODE_REVIEW-local-G05.md` | REVIEW_REVIEW_API-3 |

## 최종 검증

```bash
cd services/core && go test -count=1 ./internal/storage
cd services/core && go test ./...
```

기대 결과: 두 명령 모두 exit 0. `GITO_TEST_DATABASE_URL` 부재로 PostgreSQL integration test가 skip되면 focused `-v` 출력과 남은 위험을 review stub에 남긴다.
