Files
portfolio-hub/docs/batches/bat-015_20260601_rel-001-feedback-cleanup/verification.md
T

5.7 KiB

BAT-015 Verification

  • Status: confirmed
  • Batch: BAT-015

Acceptance Mapping

REQ-033: ledger_trades.asset_id → portfolio_id 컬럼명 정합화

  • AC-1 (\d ledger_trades에 portfolio_id 존재, asset_id 부재): Deferred to REL-002 staging — 로컬 DB에 ledger_trades 테이블이 미생성 상태(BAT-011 release-candidate는 mock 기반 verification으로 진행됨). 마이그레이션 20260601_0024는 has_table 가드로 안전 skip되며, 코드 작성은 완료(migrations/versions/20260601_0024_ledger_trades_portfolio_id_rename.py:36-40). 실 DB 검증은 REL-002 staging에서 수행.
  • AC-2 (INSERT/SELECT 회귀): tests/test_v1_portfolios_ledger.py 10 PASSED (mock 기반). insert_ledger_trade(portfolio_id=...) 시그니처 + 응답 schema LedgerTradeResponse.portfolio_id 일관 검증.
  • AC-3 (codebase grep ledger_trades\..*asset_id 0건): PASSED. grep -rn "ledger_trades\..*asset_id\|asset_id.*ledger_trades\|insert_ledger_trade.*asset_id\|trade\.asset_id" app/ → 0건 (2026-06-05 implementation smoke).
  • AC-4 (마이그레이션 lock < 1초, NFR-1): Deferred to REL-002 staging — workspace_purpose 메모리 정합(개발용 워크스페이스). staging dry-run으로 측정.
  • AC-5 (전체 pytest 회귀 통과): PASSED. 372 passed, 0 failed (5월 21일 base 368 → +4 누적: test_auth +2, test_app +2).

REQ-034: LoginRequest 추가 필드 거부 enforcement

  • AC-1 (정상 username/password → HTTP 200): tests/test_auth.py 기존 회귀 16 PASSED (정상 login flow는 기존 케이스로 회귀 보호).
  • AC-2 (no_expiry: true → HTTP 422 + extra_forbidden): tests/test_auth.py::test_login_rejects_no_expiry_extra_field PASSED. 로컬 smoke 응답 {"detail":[{"type":"extra_forbidden","loc":["body","no_expiry"],"msg":"Extra inputs are not permitted","input":true}]} 확인 (2026-06-05).
  • AC-3 (임의 추가 필드 → HTTP 422): tests/test_auth.py::test_login_rejects_arbitrary_extra_field PASSED.
  • AC-4 (grep extra.*forbid app/schemas/auth.py 매치): PASSED. app/schemas/auth.py:14 model_config = ConfigDict(extra="forbid") 매치.
  • AC-5 (전체 pytest 회귀 통과): PASSED. 372 passed, 0 failed.

REQ-035: GET /health 응답에 db_enabled 필드 추가

  • AC-1 (PORTFOLIOHUB_DB_ENABLED=true → db_enabled: true): tests/test_app.py::test_health_exposes_db_enabled_true PASSED. 로컬 smoke 응답 {"status":"ok","service":"portfolio-hub","version":"0.1.0","checked_at":"2026-06-05T13:44:04.724864+09:00","db_enabled":true} 확인 (2026-06-05).
  • AC-2 (PORTFOLIOHUB_DB_ENABLED=false → db_enabled: false): tests/test_app.py::test_health_exposes_db_enabled_false PASSED.
  • AC-3 (5필드 노출 + 기존 4필드 회귀): tests/test_app.py::test_healthcheck 갱신 PASSED (db_enabled 추가 검증 포함). 기존 status/service/version/checked_at 동작 회귀 유지.
  • AC-4 (baseline grep db_enabled.*설정값|setting value|ping|readiness docs/runtime-flows.md): PASSED. docs/runtime-flows.md:97에 의미 명문화 노트 1단락 추가.
  • AC-5 (interface-contract grep /health.*db_enabled docs/interface-contract.md): PASSED. docs/interface-contract.md:48 GET /health payload schema에 db_enabled 필드 추가.

Evidence

  • Test:
    • 전체 pytest: 372 passed, 0 failed, 3 warnings (2026-06-05, deprecation warnings는 starlette HTTP_422_UNPROCESSABLE_ENTITY alias, 기능 무관)
    • 신규 회귀 4건: test_login_rejects_no_expiry_extra_field, test_login_rejects_arbitrary_extra_field, test_health_exposes_db_enabled_true, test_health_exposes_db_enabled_false
    • 영향 받은 기존 회귀 갱신: test_v1_portfolios_ledger.py (portfolio_id 응답 필드), test_v1.py::test_v1_ledger_trade_* (_make_ledger_trade + body 키), test_daemon_assignment.py::test_ledger_trade_201_when_daemon_matches (mock attribute), test_app.py::test_healthcheck (db_enabled 필드 확인 추가)
  • Manual:
    • 2026-06-05 13:44 KST 로컬 smoke 5건 (implementation.md Execution Log step 5 참조):
      • GET /health → 200 + db_enabled: true
      • POST /auth/login + no_expiry: true → 422 + extra_forbidden
      • codebase grep ledger_trades.asset_id → 0건
      • docs/runtime-flows.md db_enabled 의미 노트 grep → 매치
      • docs/interface-contract.md /health payload db_enabled grep → 매치
  • Logs:
    • alembic upgrade head (2026-06-05): Running upgrade 20260521_0023 -> 20260601_0024, Rename ledger_trades.asset_id to portfolio_id for column-name semantic alignment (REQ-033) — has_table guard로 안전 skip 확인

Architecture Impact Synchronization (Baseline)

  • design.md Architecture Impact: runtime-flows
  • Reference Doc Update Plan 이행:
    • docs/project-structure.md: 갱신 불요 (영향 없음, 기존 모듈 한정 변경) — 변경 없음 확인 ✓
    • docs/runtime-flows.md: db_enabled 의미 명문화 노트 line 97 추가 ✓
  • 추가 baseline 갱신: docs/data-model.md LedgerTrade entity 컬럼명/제약 갱신, docs/interface-contract.md /health payload + LedgerTradeResponse schema 갱신

Result

  • Ready for Release: true
  • Blocking Issues:
    • 없음 (Deferred 2건은 blocker 아님, REL-002 staging에 이연 evidence)
  • Deferred Evidence (release execution 시 수집):
    • REQ-033 AC-1 (\d ledger_trades 실 DB 컬럼 검증) — REL-002 staging
    • REQ-033 AC-4 (마이그레이션 lock < 1초 staging dry-run) — REL-002 staging
    • 본 워크스페이스 ledger_trades 테이블 미생성 상태 자체는 본 batch 범위 밖 (BAT-011 mock 기반 verification의 후속 항목 후보)