feat(core-B): 운영자 sync/verify CLI + cold-start onboarding (BAT-051, REQ-105/106, PR #32)

dcy-034 마지막 조각. sync(슬롯 qty←브로커+warning해제+OQ-A 전이엣지+FR-7 평단seed)/verify(C 재대조·강제해제없음). core-A QC minor 2건 정리 동봉. QC(opus) PASS, 683 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
This commit is contained in:
2026-06-26 09:53:49 +09:00
committed by GitHub
co-authored by Claude Opus 4.8
parent ced7eda682
commit 07b393d27d
19 changed files with 1948 additions and 39 deletions
+17
View File
@@ -47,3 +47,20 @@ class IntentRecord:
status: str
slot_id: Optional[UUID]
reason: Optional[str]
class PortfolioHubCostBasisPort(Protocol):
"""FR-7 (dcy-034 / REQ-105): portfolio-hub WAC (weighted average cost) read port.
Wraps `GET /v1/portfolios/{id}/holdings/cost-basis` from portfolio-hub REQ-043.
When unavailable or when the portfolio has no holding, implementations return None.
sync() degrades gracefully: None => skip avg_price seed + WARN log.
"""
def get_cost_basis(self, portfolio_id: str) -> Optional[float]:
"""Return the weighted average cost (WAC) for the portfolio's current holding.
Returns None when the portfolio has no holding, the endpoint is unavailable,
or any error occurs. The caller must handle None as a graceful-degrade signal.
"""
...