fad4006f60
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.9 KiB
2.9 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0088d | Trading: app `portfolio_tracker` (ledger INSERT-only) | pendiente | feature |
|
app-scoped | alta | 2026-05-17 | 2026-05-17 |
0088d — Trading: app portfolio_tracker (ledger INSERT-only)
Status: pendiente Created: 2026-05-14 Type: feature Parent: 0088 Depends: 0088a Blocks: 0088c, 0088h
Problema
Necesitamos un ledger inmutable multi-account, multi-currency, multi-asset desde el dia 1 + UI minima para inspeccionarlo. Es la fuente de verdad del estado de cuentas; cualquier broker (paper o real) escribe contra este ledger.
Piezas
- App Go en
projects/trading/apps/portfolio_tracker/(service + sqlite_api + Mantine UI). - Schema (en
migrations/*.sql, aditivo):accounts(id, label, currency_base, broker_kind, created_at).instruments(id, symbol, kind, currency_quote).transactions(id, account_id, instrument_id, ts, side, qty, price, fee, fee_currency, client_order_id, broker_fill_id, raw_json, source). INSERT-only, indice por(account_id, ts)y unique sobreclient_order_id.equity_snapshots(id, account_id, ts, equity_quote_currency, unrealized_pnl, realized_pnl_delta).valuation_marks(id, instrument_id, ts, price, source). Marca de precio para valoracion.
- Funciones puras del registry (no inline en la app):
reduce_positions_from_transactions_py_finance(txs) -> list[Position].compute_realized_pnl_py_finance(txs) -> float.compute_unrealized_pnl_py_finance(positions, marks) -> float.compute_equity_py_finance(balance, positions, marks) -> float.
- API HTTP via sqlite_api/CRUD generator sobre las 5 tablas. Endpoint custom
/api/equity_curve?account_id=X. - UI Mantine con @fn_library:
- Lista de cuentas con balance + equity actual.
- Detalle de cuenta: tabla de transactions, grafico equity curve, posiciones abiertas.
- Form de transaction manual (para depositos/retiradas/ajustes que no vienen de broker).
e2e_checksenapp.md:build_frontend,build_backend,smoke(arranca puerto efimero + GET/api/health).ledger_immutable: intenta UPDATE/DELETE sobretransactionsy espera fallo (constraint trigger).reconciliation: tras insertar N transactions sinteticas,reduce_positionsretorna lo esperado.
- Tag
serviceenapp.md. Tag de grupojournal/trading.
Aceptacion
- Ledger no permite UPDATE/DELETE de transactions (trigger SQLite).
- Reconciliacion determinista: dadas las mismas transactions, mismo resultado de posiciones/balance/equity.
fn doctor artefactsyfn doctor cpp-apps(n/a aqui) sin errores.- App lanzable como service con
deploy_server(no obligatorio para cerrar el issue, peroapp.mddebe declarar deploy target).
No-objetivos
- Integracion broker. Eso entra en 0088c.
- Computo de impuestos/FIFO fiscal. Solo PnL operativo.