115 Commits
Author SHA1 Message Date
genichin 21f268ac53 chore(release): v0.4.0
Verify container release contracts / verify (push) Canceled after 0s
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-09-19 21:32:21 +09:00
genichin deaaa96c46 feat: add service token rename command (#40)
* docs: preserve original issue 5 body

* feat: add service token rename command

* test: normalize rich option errors
2026-09-19 21:19:39 +09:00
genichin 996127f215 Preserve ledger venue provenance (#39)
* feat: preserve ledger venue provenance

* fix: satisfy ledger test lint ratchet

* fix: advance image migration inventory
2026-09-19 19:30:32 +09:00
genichin 567d662913 fix(portfolios): replay corporate-action cost basis (#38) 2026-09-19 17:07:14 +09:00
genichin f79f3c79b5 chore(release): prepare v0.3.4
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-09-13 23:08:22 +09:00
genichin 8841bdd441 fix: qualify corporate-action ledger reads (#36) 2026-09-13 22:02:43 +09:00
genichin c7d8235bde fix: make corporate actions atomic and recoverable
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-09-13 19:33:07 +09:00
genichin 2b470c735f fix(portfolio): tolerate consolidation WAC residue
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-09-13 18:36:00 +09:00
genichin 1010d257ad chore(release): prepare v0.3.1 2026-09-13 15:32:27 +09:00
genichin 5b443f718e chore(release): prepare v0.3.0
Publish verified PortfolioHub image / verify (push) Canceled after 0s
Publish verified PortfolioHub image / publish (push) Canceled after 0s
2026-09-13 15:03:06 +09:00
genichin fa824dfd36 fix corporate action runtime blockers 2026-09-13 14:22:41 +09:00
genichin 925c6b4fa4 fix corporate action replay and trade filtering 2026-09-13 14:17:32 +09:00
genichin cb19c35d23 fix corporate action replay invariants 2026-09-13 14:12:04 +09:00
genichin 14c118f503 fix corporate action ledger replay invariants 2026-09-13 14:04:30 +09:00
genichin 48735bbb4a fix(portfolio): align corporate action schema definitions 2026-09-13 13:55:49 +09:00
genichin a4664f5991 feat(portfolio): expose corporate actions in unified ledger 2026-09-13 13:52:50 +09:00
genichin 77468631b1 feat(portfolio): expose corporate action and replay consolidation 2026-09-13 13:47:46 +09:00
genichin 7a45bec3cb feat(portfolio): add atomic corporate action persistence 2026-09-13 13:43:21 +09:00
genichin dc755889b3 feat(portfolio): add stock consolidation domain and schema 2026-09-13 13:40:08 +09:00
copilot-swe-agent[bot]andgenichin 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]andgenichin 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]andgenichin 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]andgenichin 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]andgenichin 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]andgenichin 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]andgenichin 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]andgenichin 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]andgenichin 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 75e55fde9c feat(api): expose strategy nick on portfolio items 2026-08-16 13:13:39 +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 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 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 b3447f699e feat(api): add owner-scoped manual ledger endpoint 2026-07-14 19:49:03 +09:00
genichinandClaude Fable 5 8a07742049 feat(req-055): expose strategy & market meta fields in PortfolioItem response (additive)
Adds 4 additive fields to GET /v1/portfolios (and single-portfolio) response:
- active_strategy_id (str|null): portfolios.active_strategy_id raw value
- strategy_name (str|null): strategy_sets.name via LEFT JOIN
- strategy_params (dict): strategy_sets.config JSON parsed; {} on missing/invalid
- markets (list[str]): assets.markets; [] on missing/empty

_SELECT_PORTFOLIO extended with LEFT JOIN strategy_sets; _row_to_portfolio
parses new columns (row[19-21]) with JSON error isolation (WARNING log, no 500).
_portfolio_to_item maps all 4 new fields. Existing 16 fields unchanged.
N+1 prevented: single SQL JOIN for both list and single-item paths.

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
genichinandClaude 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
genichinandClaude 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
genichinandClaude 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