4.2 KiB
4.2 KiB
BAT-015 Implementation
- Status: completed
- Batch: BAT-015
Plan Summary
- 변경 순서: REQ-034 → REQ-035 → REQ-033 (planning 권장 순서대로 진행)
- 각 REQ 구현 후 부분 회귀 (pytest 전체 + 해당 영역 smoke)
- 최종 batch 통합 회귀 + 로컬 smoke
Changed Files
- REQ-034:
app/schemas/auth.py—LoginRequest.model_config = ConfigDict(extra="forbid")추가tests/test_auth.py—test_login_rejects_no_expiry_extra_field,test_login_rejects_arbitrary_extra_field신규
- REQ-035:
app/api/health.py—HealthResponse.db_enabled필드 추가 +healthcheck()핸들러가settings.db_enabled노출tests/test_app.py—test_healthcheck에 db_enabled 확인 추가,test_health_exposes_db_enabled_true,test_health_exposes_db_enabled_false신규docs/runtime-flows.md— health endpoint 섹션(line 97)에db_enabled의미 명문화 노트 추가docs/interface-contract.md—/healthpayload schema에db_enabled필드 추가 + 의미 노트
- REQ-033:
migrations/versions/20260601_0024_ledger_trades_portfolio_id_rename.py— 신규 alembic revision (ALTER COLUMN RENAME with has_table guard)app/domain/models.py—LedgerTrade.asset_id→portfolio_idapp/repositories/portfolio_repository.py—insert_ledger_tradeinterface 시그니처 갱신app/repositories/postgres.py—insert_ledger_tradeINSERT/SELECT/RETURNING SQL 컬럼명 +_row_to_ledger_trade매핑app/schemas/v1.py—LedgerTradeResponse.asset_id→portfolio_idapp/api/v1_portfolios.py— ledger handler에서insert_ledger_trade(portfolio_id=...)+ 응답 매핑tests/test_v1_portfolios_ledger.py—LedgerTrade(portfolio_id=...)+ 응답body["portfolio_id"]검증tests/test_v1.py—_make_ledger_trade+body["portfolio_id"]검증tests/test_daemon_assignment.py— mocktrade.portfolio_id갱신docs/data-model.md— LedgerTrade entity, Key Fields, Uniqueness Constraints, State Rules의asset_id표기 모두portfolio_id로 갱신 + revision 20260601_0024 명시docs/interface-contract.md—POST /v1/portfolios/{id}/ledger/trades응답 schema에portfolio_id명시 + REQ-033 cross-reference
Execution Log
- REQ-034:
LoginRequest에extra="forbid"적용 →tests/test_auth.py16 passed - REQ-035:
HealthResponse확장 + 핸들러 →tests/test_app.py9 passed → baseline 갱신 - REQ-033: alembic revision 20260601_0024 작성 →
alembic upgrade head적용(local DB에ledger_trades테이블 부재로has_tableguard에 의해 안전 skip) → repository/도메인/스키마/라우트 정합 →tests/test_v1_portfolios_ledger.py10 passed - 통합 회귀 1차: 5 failed 발견 (test_v1.py + test_daemon_assignment.py 잔존
asset_idmock) → 갱신 → 통합 회귀 2차: 372 passed, 0 failed - 로컬 smoke:
- GET /health → HTTP 200 +
db_enabled: true(REQ-035 AC-1) - POST /auth/login +
no_expiry: true→ HTTP 422 +extra_forbidden(REQ-034 AC-2) - codebase grep
ledger_trades.*asset_id→ 0건 (REQ-033 AC-3) docs/runtime-flows.mdbaseline 노트 grep → 매치 (REQ-035 AC-4)docs/interface-contract.md/health payload grep → 매치 (REQ-035 AC-5)
- GET /health → HTTP 200 +
Validation
- pytest 전체: 372 passed, 0 failed (BAT-015 base 368 → +4: test_auth 2건 + test_app 2건 신규)
- 로컬 smoke 5건 모두 통과
- AC 매핑은 verification.md에서 정리
- 실 DB AC (REQ-033 AC-1
\d ledger_trades, AC-4 staging dry-run lock 측정): 본 워크스페이스ledger_trades테이블 미생성 상태로 N/A. REL-002 staging 시점에 별도 수집.
Remaining Risks
- R-실 DB ledger_trades 테이블 미생성: REQ-033 마이그레이션은
has_tableguard로 안전하지만, 본 워크스페이스에서 ledger_trades 적재 흐름이 활용되지 않는 상태. BAT-011 release-candidate verification은 mock 기반이라 이 gap이 release 단계에서 발견되지 않았음. 본 batch 범위 밖, 별도 후속 항목으로 등록 후보(REL-002 또는 후속 Discovery). - (workspace_purpose 메모리: 본 워크스페이스 개발용 → prod 영향 검증 N/A)