# BAT-005 Verification - Status: passed - Batch: BAT-005 - Profile: batch-lite - Verified: 2026-05-03 ## REQ Coverage ### REQ-015: CLI `credential` 명령 그룹 구현 (브로커 인증 정보 관리) | AC # | 기준 | 검증 방법 | 결과 | |------|------|-----------|------| | AC-1 | alice 사용자 + 유효 enc key → `credential set` 실행 시 broker_credentials 레코드 생성(upsert) | `test_cli_credential_set_creates_record` | ✅ passed | | AC-2 | `credential list` 출력에 broker, account_ref, credential_version 포함 / encrypted_payload 미포함 | `test_cli_credential_list_hides_payload` | ✅ passed | | AC-3 | 존재하지 않는 username → exit code 1 + 에러 메시지 | `test_cli_credential_set_with_unknown_user_exits_error` | ✅ passed | | AC-4 | `credential remove --force` 후 list에서 사라짐 | `test_cli_credential_remove_deletes_record` | ✅ passed | | AC-5 | CREDENTIAL_ENCRYPTION_KEY 미설정 → exit code 1 + 에러 메시지 포함 | `test_cli_credential_set_requires_encryption_key` | ✅ passed | ## Test Evidence ### 실행 명령 ```bash python -m pytest tests/test_cli.py -q ``` ### 결과 ``` 49 passed in 1.49s ``` - 신규 테스트 5개 모두 passed - 기존 테스트 44개 regression 없음 ### 신규 테스트 목록 | 테스트 | AC | |--------|----| | `test_cli_credential_set_creates_record` | AC-1 | | `test_cli_credential_list_hides_payload` | AC-2 | | `test_cli_credential_set_with_unknown_user_exits_error` | AC-3 | | `test_cli_credential_remove_deletes_record` | AC-4 | | `test_cli_credential_set_requires_encryption_key` | AC-5 | ## Implementation Summary | 파일 | 변경 내용 | |------|-----------| | `app/cli/commands/credential.py` | 신규 생성 — `credential_app`, `set`/`list`/`remove` 명령 | | `app/cli/main.py` | `credential_app` import 및 `app.add_typer(credential_app, name="credential")` 등록 | | `app/repositories/postgres.py` | `delete_broker_credential(user_id, broker) -> bool` 메서드 추가 | | `tests/test_cli.py` | `FakeRepo.upsert/list/get/delete_broker_credential`, 신규 테스트 5개 추가 | | `docs/project-structure.md` | CLI 명령 그룹 목록에 `credential` 추가 | ## Baseline Document Sync - `docs/project-structure.md`: `app/cli/` 섹션에 `credential` 명령 그룹 추가 완료 - 구조/런타임 흐름/인터페이스 계약 변경 없음 → `runtime-flows.md`, `interface-contract.md` 갱신 불필요 ## Residual Risk - 없음