pub enum Reconcile {
Show 27 variants
LinkTransfer {
out: String,
to_event: Option<String>,
to_wallet: Option<String>,
},
ClassifyInboundIncome {
in_ref: String,
kind: String,
fmv: Option<String>,
business: bool,
},
ClassifyInboundGift {
in_ref: String,
fmv_at_gift: String,
donor_basis: Option<String>,
donor_acquired: Option<String>,
},
ClassifyInboundSelfTransfer {
in_ref: String,
basis: Option<String>,
acquired: Option<String>,
},
ReclassifyOutflow {
out: String,
as_kind: OutKindArg,
amount: String,
fee: Option<String>,
appraisal: bool,
donee: Option<String>,
},
SetFmv {
event: String,
fmv: String,
},
Void {
target: String,
},
ClassifyRaw {
target: String,
payload_json: String,
},
AcceptConflict {
conflict: String,
},
RejectConflict {
conflict: String,
},
SafeHarborAllocate {
method: MethodArg,
attest: bool,
},
SafeHarborAttest,
SelectLots {
disposal: String,
from: Vec<String>,
},
ImportSelections {
csv: PathBuf,
},
ReclassifyIncome {
income_event: String,
business: bool,
kind: Option<String>,
},
SetDonationDetails {
out_event_ref: String,
donee_name: String,
donee_address: Option<String>,
donee_ein: Option<String>,
appraiser_name: String,
appraiser_address: Option<String>,
appraiser_tin: Option<String>,
appraiser_ptin: Option<String>,
appraiser_qualifications: Option<String>,
appraisal_date: Option<String>,
fmv_method: Option<String>,
},
ShowDonationDetails {
out_event_ref: String,
},
BulkLinkTransfer {
to_wallet: String,
year: Option<i32>,
from: Option<String>,
to: Option<String>,
from_wallet: Option<String>,
dry_run: bool,
yes: bool,
},
BulkClassifyInboundSelfTransfer {
year: Option<i32>,
from: Option<String>,
to: Option<String>,
wallet: Option<String>,
dry_run: bool,
yes: bool,
},
BulkClassifyInboundIncome {
kind: String,
business: bool,
year: Option<i32>,
from: Option<String>,
to: Option<String>,
wallet: Option<String>,
dry_run: bool,
yes: bool,
},
BulkReclassifyOutflow {
kind: String,
year: Option<i32>,
from: Option<String>,
to: Option<String>,
wallet: Option<String>,
dry_run: bool,
yes: bool,
},
BulkResolveConflict {
accept: bool,
reject: bool,
dry_run: bool,
yes: bool,
},
BulkVoid {
dry_run: bool,
yes: bool,
},
MatchSelfTransfers {
in_ref: Option<String>,
out_ref: Option<String>,
action: Option<SelfTransferActionArg>,
dry_run: bool,
},
Pseudo(Pseudo),
DeclareTranche {
amount: String,
wallet: String,
window_start: String,
window_end: String,
},
PromoteTranche {
target: String,
provenance: ProvenanceKind,
part_ii_file: PathBuf,
i_acknowledge: Option<String>,
},
}Variants§
LinkTransfer
Confirm a self-transfer (TransferLink).
ClassifyInboundIncome
Classify an inbound TransferIn as income.
Fields
fmv: Option<String>Fair-market value of the received BTC at receipt — USD dollars, NOT sats. On this
single-event command there is NO auto-valuation: omitting --fmv records a Hard
“FMV missing” blocker. To supply it, reconcile void <decision-ref> then re-classify with
--fmv (classify-inbound is first-wins — re-running without voiding first is refused). To
value automatically from the bundled daily close, use reconcile bulk-classify-inbound-income.
ClassifyInboundGift
Classify an inbound TransferIn as a received gift.
Fields
ClassifyInboundSelfTransfer
Classify an inbound TransferIn as an inbound self-transfer (“my own coins” returning) —
non-taxable, creates a fresh lot. --basis defaults to $0 (conservative; fires the honest
zero-basis advisory when omitted); --acquired defaults to 1 year + 1 day before receipt
(assumed long-term for a cold-storage deposit; discloses an advisory so you can correct it).
ReclassifyOutflow
Reclassify a pending TransferOut.
Fields
as_kind: OutKindArgamount: StringUSD fair-market value of the disposed BTC at the transfer date — dollars, NOT sats. For a sell/spend this is the gross proceeds; for a gift/donation it is the FMV at the contribution date (26 CFR 1.170A-1(c)(1)). Entering the sats amount here is a common error and draws a non-fatal warning when it exceeds 100x the market value.
SetFmv
Set a manual FMV on an event.
Fields
Void
Void a revocable decision.
ClassifyRaw
Resolve an Unclassified row from a JSON imported payload.
Fields
payload_json: StringA JSON-encoded imported EventPayload (serde externally-tagged: {"Variant":{...}}) to
resolve the Unclassified target as. Must be an IMPORTED variant — Acquire, Income,
Dispose, TransferOut, TransferIn, or Unclassified. USD fields (usd_cost, fee_usd, …) are
decimal STRINGS; sat is an integer.
FORMAT (Acquire example): {“Acquire”:{“sat”:2000000,“usd_cost”:“1680.00”,“fee_usd”:“5.00”,“basis_source”:“ExchangeProvided”}}
AcceptConflict
Accept an import conflict.
RejectConflict
Reject an import conflict.
SafeHarborAllocate
Path-B safe-harbor allocate (from the actual pre-2025 position).
SafeHarborAttest
Attest an existing allocation as timely.
SelectLots
§A.4 Specific-ID: pick the exact lots a disposal consumes.
Fields
from: Vec<String>One lot pick per –from flag (repeatable). Each PICK is
<origin_event_id>#<split_sequence>:<sat>. The origin_event_id + split come from the
lot column of disposals.csv or the origin_event/split columns of lots.csv
(export-snapshot). The total sat across the picks must equal the disposal’s principal
(validated in the fold).
FORMAT (two picks): –from import|coinbase|X#0:25000 –from import|river|Y#1:5000
ImportSelections
§A.4 Batch import LotSelections from a CSV (disposal_ref,origin_event_id,split_sequence,sat).
Fields
csv: PathBufCSV of lot picks imported as LotSelection decisions (§A.4). The header is REQUIRED and
validated loudly; rows sharing a disposal_ref are grouped into a single decision.
disposal_ref is the disposal event’s ref (disposals.csv event column); origin_event_id
is the lot’s origin (lots.csv origin_event column).
FORMAT (header + one sample row): disposal_ref,origin_event_id,split_sequence,sat import|gemini|trade|T-2.O-2,import|coinbase|X,0,1000000
ReclassifyIncome
SE-completion Chunk C: flip business (and optionally kind) on an already-imported Income event.
Corrects the business: false hard-code that River (and other adapters) emit at ingest time,
enabling SE-tax treatment for professional miners / stakers. The target is validated at RECORD
TIME (UX-P4-3): a missing or non-Income event ref is REFUSED — nothing is recorded — and a
duplicate re-decide is refused too; void the prior decision first, then re-issue. For TransferIn
rows use classify-inbound-income instead.
Fields
income_event: StringThe Income event reference (from report or income_recognized.csv ‘event’ column).
SetDonationDetails
Store Form 8283 Section-B donation + appraiser details for a donation event. The event ref is the TransferOut EventId from the removals.csv ‘event’ column.
Fields
out_event_ref: StringTransferOut event reference for the donation (from removals.csv ‘event’ column).
appraiser_tin: Option<String>Appraiser TIN/SSN/EIN (Part III §6695A; satisfies the TIN-or-PTIN requirement).
ShowDonationDetails
Show stored Form 8283 donation details for a donation event.
Fields
BulkLinkTransfer
Bulk-confirm self-transfers: link every PENDING outbound transfer in a time frame to one destination wallet (non-taxable). Shows a preview + requires –yes (or interactive y/N).
Fields
BulkClassifyInboundSelfTransfer
Bulk-classify unknown-basis inbound deposits as self-transfer-ins (“my own coins”): apply
Cycle A’s SelfTransferMine ($0 conservative basis, non-taxable) to MANY pending inbounds in a
time frame at once. Shows a preview surfacing the total USD given $0 basis (the over-tax
exposure) + requires –yes (or interactive y/N). Each is a voidable decision; for a deposit
whose real cost you can substantiate, classify it single-item with classify-inbound-self-transfer --basis.
Fields
BulkClassifyInboundIncome
Bulk-classify unknown-basis inbound deposits as INCOME (mining|staking|interest|airdrop|reward):
recognize MANY pending inbounds as ordinary income at their auto-FMV (the daily-close market
value at receipt) in one confirmed batch, with a UNIFORM --kind + --business flag. Shows a
preview surfacing the total income recognized + the count of inbounds EXCLUDED because no price
was available for their date (those stay pending — an income row with no FMV would year-gate).
Each is a voidable decision; for a single deposit use classify-inbound-income.
Fields
BulkReclassifyOutflow
Bulk-reclassify unknown pending OUTFLOWS as dispositions (Sell|Spend): reclassify MANY pending
TransferOuts as a Dispose in one confirmed batch, with the daily-close market value at the
outflow date as the ESTIMATED proceeds. Shows a preview surfacing the total ESTIMATED proceeds
AND the total ESTIMATED gain (sum(fmv) - sum(basis)) + the count of outflows EXCLUDED because no price
was available for their date (those stay pending — a Sell with fabricated proceeds would be a
SILENT misreport). --kind is UNIFORM and accepts ONLY sell|spend (gift/donate are out of
scope). Each is a voidable decision; for a single outflow use reclassify-outflow.
Fields
BulkResolveConflict
Bulk-resolve import conflicts: ACCEPT (adopt each new payload) or REJECT (keep each current
payload) MANY flagged ImportConflicts in one confirmed batch. Shows a current → new preview,
then requires –yes (or interactive y/N). Exactly one of –accept / –reject is required. Each
resolution is NON-REVOCABLE (SupersedeImport/RejectImport cannot be voided); to resolve a
conflict differently, exclude it and use single-item accept-conflict/reject-conflict.
Fields
BulkVoid
Bulk-void MANY revocable reconcile decisions in one confirmed batch (bulk-void). Shows a preview
of every voidable decision (the SHARED voidable_decisions predicate — effective safe-harbor
allocations are OMITTED, #7), then requires –yes (or interactive y/N). Each void is
NON-REVOCABLE (a VoidDecisionEvent cannot itself be voided — re-apply the original decision to
restore). Voiding a LotSelection also re-exposes its disposal to the default method and clears
its optimizer attestation.
Fields
MatchSelfTransfers
Match unreconciled inbound + outbound legs as self-transfers (self-transfer-passthrough C3). With no –in/–out: PREVIEW the proposed pairs (read-only). With –in and –out: confirm ONE pair (DROP for a same-wallet passthrough, RELOCATE for a cross-wallet transfer). NEVER automatic.
Fields
action: Option<SelfTransferActionArg>Override the suggested action (else the proposal’s topology-derived action is used).
Pseudo(Pseudo)
Pseudo-reconcile MODE (sub-project 2): fill deliberately-fictional default decisions at
projection time (NEVER persisted) to clear the Hard classification blockers — a loudly-flagged
[PSEUDO] on-screen estimate you correct toward truth. on/off toggle the mode; approve
promotes chosen defaults to real (attested) decisions.
DeclareTranche
Conservative-filing (D-8): declare undocumented BTC at $0 basis — the IRS fallback for
unprovable basis. Folds to a single EstimatedConservative lot homed at --window-end
(the latest plausible acquisition → conservative holding period). Filing-ready, NOT pseudo.
v1 makes a pre-2025 tranche and a safe-harbor allocation mutually exclusive.
Fields
PromoteTranche
Approach-B: promote an already-declared DeclareTranche (D-8’s $0 IRS fallback) to a filed >$0
basis floor (the minimum daily closing price over the attested acquisition window), behind a
mandatory purchase-provenance attestation (BG-D5), a two-sided informed-consent screen (BG-D6),
and a Form 8275 Part II narrative (BG-D7). Mitigates penalty exposure; does not eliminate it or
guarantee immunity — read the consent screen this verb prints before acknowledging.
Fields
provenance: ProvenanceKindThe units’ real acquisition provenance. Promotion requires purchase; every other value is
refused and pointed at modeling the real acquisition instead (BG-D5).
Trait Implementations§
Source§impl FromArgMatches for Reconcile
impl FromArgMatches for Reconcile
Source§fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>
fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>
Source§fn from_arg_matches_mut(
__clap_arg_matches: &mut ArgMatches,
) -> Result<Self, Error>
fn from_arg_matches_mut( __clap_arg_matches: &mut ArgMatches, ) -> Result<Self, Error>
Source§fn update_from_arg_matches(
&mut self,
__clap_arg_matches: &ArgMatches,
) -> Result<(), Error>
fn update_from_arg_matches( &mut self, __clap_arg_matches: &ArgMatches, ) -> Result<(), Error>
ArgMatches to self.Source§fn update_from_arg_matches_mut<'b>(
&mut self,
__clap_arg_matches: &mut ArgMatches,
) -> Result<(), Error>
fn update_from_arg_matches_mut<'b>( &mut self, __clap_arg_matches: &mut ArgMatches, ) -> Result<(), Error>
ArgMatches to self.Source§impl Subcommand for Reconcile
impl Subcommand for Reconcile
Source§fn augment_subcommands<'b>(__clap_app: Command) -> Command
fn augment_subcommands<'b>(__clap_app: Command) -> Command
Source§fn augment_subcommands_for_update<'b>(__clap_app: Command) -> Command
fn augment_subcommands_for_update<'b>(__clap_app: Command) -> Command
Command so it can instantiate self via
FromArgMatches::update_from_arg_matches_mut Read moreSource§fn has_subcommand(__clap_name: &str) -> bool
fn has_subcommand(__clap_name: &str) -> bool
Self can parse a specific subcommand