@cfxlabsinc/b2b-services
    Preparing search index...

    What a retry would do, and whether it is allowed. Resolved when the operator opens the dialog rather than at page load: live workflow state is the whole point, and describing every pending org on every render would cost a Temporal round trip per row.

    type RfRetryPreflight = {
        blockedReason?: string;
        blockers: RfRequirement[];
        lastFinalizeError?: RfFinalizeError;
        organizationId: string;
        run: RfRetryRunState;
        startedAt: string | null;
        willReuploadDocuments: boolean;
    }
    Index
    blockedReason?: string

    Set when the org is hard-ineligible (not verified / no session / no program).

    blockers: RfRequirement[]

    Unmet prerequisites. Non-empty ⇒ retry is refused.

    lastFinalizeError?: RfFinalizeError

    Why RouteFusion refused the last submission, when it did. Shown in the retry dialog so the operator sees what the previous attempt actually hit before re-driving it — a retry that fixes nothing will hit the same wall.

    organizationId: string
    startedAt: string | null

    ISO-8601 start of the current run; null when there is none.

    willReuploadDocuments: boolean

    True when the entity-level documentsUploadedAt stamp is absent, so a fresh run re-enters the upload loop and re-uploads the whole document set to RouteFusion. The stamp covers the set, not individual files, so there is no partial protection — the operator is warned before confirming.