genichin
fa824dfd36
fix corporate action runtime blockers
2026-09-13 14:22:41 +09:00
genichin
cb19c35d23
fix corporate action replay invariants
2026-09-13 14:12:04 +09:00
genichin
a4664f5991
feat(portfolio): expose corporate actions in unified ledger
2026-09-13 13:52:50 +09:00
genichin
dc755889b3
feat(portfolio): add stock consolidation domain and schema
2026-09-13 13:40:08 +09:00
genichin
caaf7ce68c
fix(release): align image smoke with migration 0030
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-09-10 00:51:27 +09:00
copilot-swe-agent[bot] and genichin
8368e7ba16
test(ledger): cover amount-missing reject and real-postgres alias amount API path
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 14:05:19 +00:00
copilot-swe-agent[bot] and genichin
42297030ca
fix(ledger): disjoint unified action schema and refresh req-001 traceability docs
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 13:34:50 +00:00
copilot-swe-agent[bot] and genichin
e261a41b7f
fix(ledger): split dividend response schema and harden decimal tests
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 13:21:24 +00:00
copilot-swe-agent[bot] and genichin
d3601d32dc
fix(ledger): keep legacy amount wire type and preserve dividend tax decimals
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 13:00:23 +00:00
copilot-swe-agent[bot] and genichin
fde5b33f05
fix(ledger): preserve exact decimal amount in manual and unified responses
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 12:41:36 +00:00
copilot-swe-agent[bot] and genichin
7aa3de524a
test(req-001): tighten AC coverage and remove markdown trailing whitespace
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 12:20:11 +00:00
copilot-swe-agent[bot] and genichin
1015b465bb
test(req-001): add missing dividend verification regressions and tighten catalog mappings
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 12:08:31 +00:00
copilot-swe-agent[bot] and genichin
a36b451a3d
fix(manual-ledger): harden schema init race and sanitize error responses
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 11:38:32 +00:00
copilot-swe-agent[bot] and genichin
6df3e4ba02
test: align postgres precision error assertion text
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 04:07:30 +00:00
copilot-swe-agent[bot] and genichin
b74284e626
fix: enforce snapshot-consistent precision checks for manual ledger
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 03:08:46 +00:00
copilot-swe-agent[bot] and genichin
aa40c7fdff
fix: restore manual confirm_duplicate compatibility and precision safeguards
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 02:53:15 +00:00
copilot-swe-agent[bot] and genichin
a71c91f6ef
fix: add unified ledger amount and enforce manual decimal precision
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 02:23:32 +00:00
copilot-swe-agent[bot] and genichin
ccde81b7a0
feat: support manual dividend ledger entries
...
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com >
2026-09-09 02:04:02 +00:00
genichin
5d6a0ad013
feat(portfolios): allow unassigned strategy creation
2026-08-22 21:21:24 +09:00
genichin
6e17a53b17
chore(release): prepare portfolio-hub v0.2.0
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-08-21 17:13:34 +09:00
genichin
ac742b1150
feat(portfolios): add unified ledger history API
2026-08-20 12:01:28 +09:00
genichin
5eb8c04266
fix: aggregate investment totals across ledger sources
2026-08-19 17:34:13 +09:00
genichin
02bfa60299
chore(release): prepare portfolio-hub v0.1.3
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-08-16 16:57:26 +09:00
genichin
ee1af6ef49
fix(api): reject explicit null strategy nick
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-08-16 00:03:25 +09:00
genichin
fe2dd3d15e
test(postgres): use runtime migration command
2026-08-15 23:51:17 +09:00
genichin
c292df0a4b
chore(release): harden nick contract for v0.1.2
2026-08-15 23:46:57 +09:00
genichin
e6a90800ec
feat(strategy): expose configurable nick contract
2026-08-15 23:38:18 +09:00
genichin
d64079f583
test(cli): assert missing owner side effect
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-08-15 15:31:00 +09:00
genichin
63ff4881b0
test(cli): stabilize required option assertion
2026-08-15 15:29:33 +09:00
genichin
9c8baac70b
feat(container): harden v0.1.1 publication
2026-08-15 15:14:36 +09:00
genichin
fd080496b3
feat(release): add verified image publication pipeline
2026-08-15 14:52:01 +09:00
genichin
e90519ad39
fix(daemons): block owner transfer while assigned
2026-08-15 13:20:02 +09:00
genichin
e2102b6f2b
feat(portfolios): persist and validate daemon assignment on create/update
...
POST /v1/portfolios now forwards a non-null managed_by_daemon_id into
create persistence, and both create and PATCH apply the same daemon
validation contract (UUID format -> 422, missing/foreign -> 404,
inactive -> 409, admin target-owner basis). Daemon validation locks the
daemon row FOR SHARE inside the portfolio write transaction so
validation and write form one atomic decision boundary.
Adds domain errors, repository protocol/signature updates, API/PostgreSQL
tests (POST->GET persistence, no partial state on failure, assignment vs
deactivation race), and contract/data-model documentation.
2026-08-15 12:56:53 +09:00
genichin
6e02d92282
Add ProofLine criteria documentation and Strategy Catalog v1 implementation
...
- Add acceptance criteria documentation (AC-0013 through AC-0023)
- Add Line-0003 discovery documentation
- Implement Strategy Catalog v1 with new database migration
- Update portfolio API endpoints and schemas
- Refactor strategy and portfolio services
- Add strategy management CLI commands
- Update domain models with strategy catalog support
- Add comprehensive tests for v1 strategies
- Update design documentation (data model, interfaces, runtime flows)
2026-08-15 11:18:31 +09:00
genichin
93840800fa
feat(portfolios): expose ledger investment aggregates
...
Add reversal-aware grouped manual-ledger aggregates to portfolio list responses and align the single-portfolio return summary with the same semantics.\n\nRefs #23
2026-08-13 13:23:31 +09:00
Hermes Agent
d48279f7ab
fix(migrations): harden BAT-025 PostgreSQL verification
2026-07-15 17:58:18 +09:00
genichin
1909caa22c
feat: BAT-025 add portfolio ledger manual metadata migration
2026-07-15 17:58:18 +09:00
genichin
b3447f699e
feat(api): add owner-scoped manual ledger endpoint
2026-07-14 19:49:03 +09:00
genichin and Claude Fable 5
7dba160c0f
test(bat-023): add REQ-055 AC-1~10 tests for strategy+market meta fields
...
10 test cases covering:
- AC-1: bound portfolio returns strategy_name/params
- AC-2: unbound → null/{}
- AC-3: dangling FK → keeps active_strategy_id, null strategy fields
- AC-4: invalid JSON config → strategy_params={} + WARNING log (caplog)
- AC-5/6: markets with values / empty
- AC-7: existing 16-field regression
- AC-8: token-branch invariant (service token)
- AC-9: strategy_params exact key-value match
- AC-10: mixed list individual accuracy
583 passed total (0 failures, 18 new tests).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-07-04 11:05:51 +09:00
genichin and Claude Opus 4.8
2dcbafb7a8
fix(dcy-011/bat-022): GET /v1/admin/daemons 목록 엔드포인트 추가 — UI 계약 누락(405) 해소 (라이브 통합테스트 결함)
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-28 18:20:13 +09:00
genichin and Claude Sonnet 4.6
83e6ddead4
fix(bat-022): owner 재할당 credential 무효화 원자화 — leak 방지 (QC Major)
...
update_daemon_owner()에서 owner UPDATE + credential DELETE를 단일
conn.transaction() 블록으로 묶어 원자성 보장. 실패 시 두 연산 모두
롤백되므로 "새 owner + 이전 credential 잔류" leak 상태(dcy-011 OQ-3)
가 불가능해짐. 실행 순서도 DELETE-first(안전 순서)로 고정.
단위 테스트 3종 추가:
- DELETE-before-UPDATE 실행 순서 검증
- UPDATE 실패 시 rollback(commit 미호출) 검증
- 단일 transaction() 블록 안에서 두 연산 실행 검증
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-28 14:31:00 +09:00
genichin and Claude Sonnet 4.6
d24058d863
feat(bat-022): daemon CRUD admin API + self-service credential management (REQ-052/053/054)
...
- POST/PATCH/deactivate/activate /v1/admin/daemons — admin-only daemon CRUD (REQ-053)
- GET/PUT/DELETE /v1/daemons/{daemon_id}/credential — user-owned scoped credential management (REQ-052)
- Owner re-assignment auto-invalidates BrokerCredential via update_daemon_owner() (REQ-053 AC-4)
- Deactivation auto-revokes service tokens via revoke_tokens_by_daemon_id() (REQ-022 reuse, REQ-053 AC-6)
- DELETE /v1/admin/daemons/{id} → 405 (hard delete not provided, REQ-053 AC-8)
- All responses exclude app_key/app_secret; Fernet encryption at rest (REQ-054)
- Service-token → 403 on credential endpoints (REQ-052 AC-10)
- Admin ownership scope enforced: admin cannot write other user's credential (REQ-052 AC-9)
- REQ-051 regression: 4 service-token guard tests pass (REQ-054 AC-7)
- 44 new tests, 565 total passed (521 baseline + 44 new), 0 failures
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-28 14:18:37 +09:00
genichin
3e1b571906
feat(bat-021): REQ-047 Step2 동반 코드 수정 + 실 DB 통합검증 + 런북
...
- ensure_schema() broker_credentials: daemon_id NOT NULL, PK=(daemon_id,broker)로 갱신
- _row_to_broker_credential: Step2 컬럼 순서(daemon_id 선두)로 갱신
- upsert_broker_credential: ON CONFLICT (daemon_id,broker)로 수정, fallback try/except 제거
- list_broker_credentials: fallback 제거, SELECT 컬럼 순서 갱신
- test_bat020_broker_credential_domain.py: AC-3/AC-4 행 순서를 Step2 포맷으로 갱신
- tests/test_bat021_step2_ensure_schema_and_upsert.py: 12개 신규 테스트
- docs/runbooks/bat-021-req047-step2-migration-runbook.md: 운영 적용 런북
- docs/batches/bat-021: batch 문서(index/planning/design/implementation/verification)
실 PostgreSQL 통합검증(AC-1~7 전건 PASS):
Step1 upgrade → backfill → Step2 upgrade → downgrade 시나리오 포함
NULL 사전검증(upgrade 거부) 및 downgrade 안전장치(중복 시 RuntimeError) 확인
521 passed, 0 failed (기존 509 + 신규 12)
2026-06-28 10:19:27 +09:00
genichin and Claude Sonnet 4.6
51b7cbee35
feat(bat-020): daemon-scoped 브로커 인증정보 (REQ-046~051)
...
- REQ-046: BrokerCredential.daemon_id 필드 추가, repository 시그니처 갱신
- REQ-047: alembic revision Step1(daemon_id NULL 컬럼 추가), Step2(PK 전환, dev/test DB 한정)
- REQ-048: backfill-daemon-id CLI subcommand (--dry-run/--force/--broker 지원)
- REQ-049: GET /v1/user_info daemon-scoped 단일 broker 전달 (brokers→broker, daemon_id 없으면 403)
- REQ-050: credential set/list/remove --daemon-id 옵션 추가 (daemon_slug 해석)
- REQ-051: 보안 격리 - service-token 전용, web 토큰 차단, 로그 app_secret 비노출, graceful degrade
비가역 결재 게이트: REQ-047 Step2(PK 전환)는 사장님 결재 후 실DB 적용 예정(이 batch는 revision 코드만)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-28 00:45:46 +09:00
genichin and Claude Opus 4.8
233cbc3df6
fix(portfolio): name 검증에 한글+공백 허용 (minor-change, CHG-20260627-03)
...
_PORTFOLIO_NAME_RE + CLI _NAME_RE를 ^[a-zA-Z0-9가-힣 ._:-]{1,100}$로 완화. name은 (owner,name) 조회 키일 뿐 wire 식별자 아님. 475 passed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-27 12:03:33 +09:00
genichin and Claude Sonnet 4.6
c5288a8c42
feat(bat-019): REQ-044 GET /v1/assets require_read + REQ-045 GET /v1/daemons caller-scope
...
REQ-044: list_catalog_assets 의존성을 require_admin → require_read로 완화.
asset 쓰기(POST/PATCH/DELETE)는 require_admin 유지.
REQ-045: GET /v1/daemons 신규 엔드포인트 — caller 소유 데몬만 반환(require_read).
user_id=None(env 토큰)은 빈 목록 200. DaemonResponse/DaemonListResponse 스키마 추가.
기존 테스트(test_v1.py, test_asset_catalog.py, test_daemon_assignment.py, test_tags_master.py)
REQ-044 권한 완화에 맞게 업데이트. test_v1_daemons.py 신규 추가(13 케이스).
pytest 472 passed, 0 failed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-27 10:36:04 +09:00
genichin and Claude Sonnet 4.6
d224d716f6
fix(holdings): /holdings/cost-basis WAC row에 fee_amount 편입 (QC보정)
...
get_holdings_cost_basis 핸들러의 row dict에 fee_amount 누락으로
/holdings/cost-basis의 cost_basis_per_unit이 매수 수수료 미편입값을
반환하던 버그 수정. /pnl/realized 핸들러와 동일하게 e.fee_amount 포함.
테스트: buy fee>0 케이스(1000.5 단언) + fee=0 회귀 케이스 추가.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-26 20:34:03 +09:00
genichin and Claude Sonnet 4.6
73414817e0
fix(pnl): 매수 수수료를 WAC cost basis에 편입 (REQ-041 CHG-20260626-01)
...
WAC 공식에 buy row의 fee_amount를 분자에 포함해 실현 PnL이 당일 net과 정확히 일치하도록 수정.
calculate_realized_pnl + calculate_current_wac 양 함수 동일 적용.
신규 단위 테스트 9개(TestBuyFeeInCostBasis 5 + TestCurrentWacBuyFeeInCostBasis 4) 추가.
change-req: REQ-041 AC-9/AC-10 추가, REQ-040/REQ-043 Notes 갱신, index 갱신.
전체 456 passed / 0 failed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-26 20:34:03 +09:00
genichin and Claude Opus 4.8
d93c0bcaf5
feat(holdings): REQ-043 현재 보유 평단(WAC) read — GET /v1/portfolios/{id}/holdings/cost-basis (BAT-018, PR #14 )
...
dcy-008(confirmed)/REQ-043(Approved)/BAT-018. trex-core dcy-034 FR-7 cold-start seed 의존. AC 11/11, QC PASS. worktree+PR 워크플로 첫 파일럿.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-26 00:07:43 +09:00
genichin and Claude Opus 4.8
bd34450ee9
feat(pnl): trade history + realized PnL API (WAC) — BAT-017, REQ-039~042 Implemented
...
- GET /v1/portfolios/{id}/trades and GET /v1/portfolios/{id}/pnl/realized endpoints
- Weighted Average Cost (WAC) realized PnL calculation in app/domain/pnl.py
- cost_basis and data_completeness_warning returned in pnl API response
- Test coverage: 50 passed (WAC 20 + trades 12 + pnl 18), full 427 passed regression ✓
- WAC validated against 199,300 unit e2e test cases
- DB migration: none required
- QC: qc-reviewer PASS-WITH-NOTES; team lead confirm-batch-verification → release-candidate
- Remaining non-blocking: symbol filter edge case testing, HTTP_422 deprecation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-18 16:45:01 +09:00