Ballast · invited beta

Your rules. Your trades. Automated.All guidesOrder flow & controlsTrade Desk

Core and Trade inventory

0.4.15-beta accounting repair — local review candidate

Trade owns only the units still managed by that position. Confirmed profitable sales can move the configured, sale-funded share to Core at its original acquisition basis. A later trade, stop or trade-close never includes those Core units. The engine does not automatically sell Core or sell it to rebalance. There is no Core liquidation control in this patch; trade-close is not one.

Crypto orders record the intended quantity, downward-rounded submitted quantity, verified increment and terminal execution state. A complete fill of the rounded request is a full execution. Settlement moves earned retained units and any remaining terminal dust smaller than one increment to Core, then closes a trade only when its active quantity reaches zero. Core profit and dust are separate lot kinds. Partials, ownership clamps, unknown executions and unfunded sellable remainders stay in Trade. No reservation-only or zero-sale graduation is allowed.

Crypto and equity trade-sale settlement groups the execution, realized result, remaining Trade inventory, Core transfer and acknowledgement in one transaction. Paper cash participates in the same transaction. Core sleeve purchases also require actual fills and atomic lot/order recording. Equity entries, pyramids and reserve parking now use the same atomic cash/inventory/order boundary. Parking sales are capped to their own units after excluding Core and active Trade. Equity pending-order recovery remains conservative: ambiguous or interrupted live submissions stay held for reconciliation; this change does not implement automatic recovery.

Crypto positions offer Sell trade and Close & keep profits. Both leave existing Core protected. The second choice retains the configured share of confirmed profits, subject to fees and funding limits; a losing exit does not create retained profit. Requests are bound to the displayed mode and current trade revision. A changed trade requires a refresh. These are market requests; the displayed price is not a promised execution price.

Old residuals do not acquire execution evidence merely by installing an update. The dashboard identifies legacy reserved residuals that need reconciliation. Historical repair requires exact account/order/client-reference evidence, an unambiguous local position link, a verified private backup, stale-plan rejection and atomic application. The maintainer-only residual tool previews one position and preserves orders, cash and realized results; it is excluded from the archive.

GET /api/core additionally returns retained_qty and dust_qty. Old lots keep kind=legacy; no historical classification is invented. GET /api/positions adds dry_run, revision, quote_ts and settlement_note. Quantities retain up to 12 displayed decimal places. Unavailable marks remain unavailable. Confirmed orders alone contribute to crypto sellable ownership and its cash-flow ledger.

This describes the 0.4.15-beta local review candidate. Installation and publication are recorded separately; the published baseline at build review is 0.4.14-beta.

Published 0.4.14-beta display behavior

This maintenance update changes the Core display without changing trading rules.

The Core table combines all lots for the same asset in the selected paper/live mode. Quantity is the sum of lot quantities; blended basis is total recorded acquisition cost divided by quantity. Marked value uses that total quantity and the cached asset price. Missing prices stay unavailable. Individual lot records, source positions and acquisition dates remain in the ledger; this display is not a replacement for broker tax-lot records.

Only retained-profit units and terminal execution dust belong in protected Core. An active trade's principal or runner remains in Trade and keeps its captured risk policy. Core classification is never evidence of a broker buy, sell, cash profit or current tax-lot basis.

GET /api/core retains its list response shape but returns aggregate rows: symbol, qty, cost_basis (per-unit weighted basis), total_cost, value, quote_ts, earliest created_at, lot_count, sleeve_lots, source, dry_run. from_position remains a lot-level field and is not returned for the aggregate. value is unrounded so small nonzero holdings are not erased before formatting. Rows are separated by mode; this local app's ledger has no per-row account field. Do not interpret aggregation as support for combining multiple broker accounts.

This display does not automatically close residual positions or transfer active trades. Future automatic closure and runner time-decay policies are not part of this maintenance release. Cached marked values are not guaranteed sale proceeds.

0.4.16 display follow-up: owned crypto marks refresh while trading is paused. This does not change ownership, basis, retention settings or execution eligibility. Separate automatic Core-exit and asset-outlook controls remain proposed.