@adcp/sdk API Reference - v14.3.0
    Preparing search index...

    Interface ReportingConsumerStatusPlanV1

    One consumer status the buyer owes for an expected period, with the deadline that makes it owed.

    rc.3 moves the buyer's duty off "before you close the scope" and onto a clock: a current status is owed by expected_at plus the seller's advertised automated_recovery_window_seconds. A buyer still retrying at that point posts revision_missing or unreadable and supersedes it later rather than staying silent, because silence is what the seller counts in obligation_counts.consumer_status_pending.

    interface ReportingConsumerStatusPlanV1 {
        deliveryConfigId: string;
        deliveryConfigVersion: number;
        reportDefinitionId: string;
        period: { start: string; end: string; source_timezone: string };
        reportingObligationId?: string;
        reportingRevisionId?: string;
        observedRevisionContentSha256?: string;
        supersedesReportingStatusId?: string;
        consumerStatus:
            | "received"
            | "obligation_missing"
            | "revision_missing"
            | "unreadable"
            | "content_mismatch";
        mismatchCode?: ReportingMismatchCodeV1;
        failureCode?: | "access_denied"
        | "resource_not_found"
        | "integrity_mismatch"
        | "reader_incompatible"
        | "transport_failed";
        deadline?: string;
        overdue: boolean;
        statusAsOf?: string;
        statusAsOfFloor: string;
        requiresConsumption?: boolean;
        suppressed?: | "unchanged"
        | "leaf_undisclosed"
        | "consumption_unavailable"
        | "local_budget_exhausted"
        | "deadline_unknown"
        | "chain_indeterminate"
        | "posting_unavailable"
        | "period_identity_unknown";
        deadlineBeyondPin?: { declared: string; pinned: string };
        reason: string;
    }
    Index
    deliveryConfigId: string
    deliveryConfigVersion: number
    reportDefinitionId: string
    period: { start: string; end: string; source_timezone: string }
    reportingObligationId?: string
    reportingRevisionId?: string
    observedRevisionContentSha256?: string
    supersedesReportingStatusId?: string

    The caller's current unsuperseded leaf, when the seller published one. A new statement must name it; omitting it on a chain that already has a leaf fails atomically rather than forking.

    consumerStatus:
        | "received"
        | "obligation_missing"
        | "revision_missing"
        | "unreadable"
        | "content_mismatch"
    failureCode?:
        | "access_denied"
        | "resource_not_found"
        | "integrity_mismatch"
        | "reader_incompatible"
        | "transport_failed"
    deadline?: string

    expected_at + automated_recovery_window_seconds, when both are known.

    overdue: boolean

    True once the deadline has passed — the status is owed now, not at scope close.

    statusAsOf?: string

    When the consumer established this status.

    undefined while requiresConsumption is still true: a received statement is dated from when the revision became consumable to this consumer, which is not knowable until the buyer has actually read it.

    statusAsOfFloor: string

    Earliest instant this statement may legally carry: the later of the instant it became true and the superseded leaf's own status_as_of, since time forbids a chain from moving backwards.

    requiresConsumption?: boolean

    True until the buyer has consumed the named revision and recomputed its binding digest. received and content_mismatch both require that recomputation, so neither may be posted while this is set.

    suppressed?:
        | "unchanged"
        | "leaf_undisclosed"
        | "consumption_unavailable"
        | "local_budget_exhausted"
        | "deadline_unknown"
        | "chain_indeterminate"
        | "posting_unavailable"
        | "period_identity_unknown"

    Why this status was planned but not posted.

    • unchanged — the caller's current leaf already says exactly this. Posting it again would supersede a statement with its own duplicate, forever; retention_and_limits calls that pathological churn.
    • leaf_undisclosed — the seller named a current leaf it did not return, so the buyer cannot tell whether it has anything new to say and declines to guess.
    • consumption_unavailable — no exact-revision reader is wired, so the buyer cannot honestly attest consumption.
    • posting_unavailable — no syncReportingStatus is wired, so there is nothing to append to. Without this the plan reads as live, due and unsuppressed while silently going nowhere.
    • period_identity_unknown — the seller supplied a period.source_timezone that is not a recognized IANA zone. That value is part of the chain's logical key, so substituting one produces a statement the seller refuses on every run; iana_timezone forbids the substitution by name.
    • local_budget_exhausted — the buyer's own read budget ran out before it could consume the revision. Self-inflicted, so it is silence rather than an unreadable claim against a seller that did nothing wrong.
    • deadline_unknown — no posting deadline could be derived, so this period will never post. Two causes, both named in reason: a pin the buyer has to supply is missing, or the seller's own obligation.expected_at is unreadable and its schedule.delivery_sla did not resolve one either. Without this value a permanent misconfiguration renders exactly like a period that is simply not due yet.
    • chain_indeterminate — the seller's revision chain forked, or the buyer could not walk it. That is the buyer failing to read, not the seller failing to publish, and revision_missing would blame the wrong party.
    deadlineBeyondPin?: { declared: string; pinned: string }

    Set when the seller's own expected_at is later than the buyer's pinned expectation by more than its recovery window.

    The statement is still not posted — expected_period makes the seller's instant authoritative, and a locally derived one would be refused. But without this the period sits at overdue: false with suppressed unset, indistinguishable from one that is simply not due yet, which is a silent kill switch for the whole loop. Alert on it.

    reason: string

    Why this status, in adopter-readable terms. Never a measurement claim.