@cfxlabsinc/b2b-services
    Preparing search index...
    BankTransactionReconciliationPlan:
        | { action: "ALREADY_RECONCILED"; reason: string }
        | { action: "NOT_APPLICABLE"; reason: string }
        | { action: "INBOUND_ACH_DEBIT"; awaitAchEntryDetailUntilEpochMs?: number }
        | { action: "ACH_DEBIT_DEPOSIT" }
        | { action: "OUTBOUND_WITHDRAWAL" }
        | { action: "INBOUND_DEPOSIT"; awaitAchEntryDetailUntilEpochMs?: number }
        | { action: "BOOK_TRANSFER" }
        | {
            action: "INTERNAL_TRANSFER_LEG";
            bankInternalTransferId: BankInternalTransfer["id"];
        }
        | { action: "UNSUPPORTED"; reason: string }

    Which reconciliation a bank_transaction row is owed, decided from the row alone.

    A separate step from doing the work so the decision lands in workflow history: "this row was classified UNSUPPORTED because it is a FedNow debit" is the question an operator asks first, and before this workflow existed the answer was a log line on a Lambda that had already returned 200.