The decision: reconcile the invoice before the call

If a voice agent is about to remind someone about an overdue invoice, the first safe question is not what sentence the agent should say. It is whether the account is still eligible for that call. A payment may have arrived after the reminder list was exported. A bank transfer may be visible in a payment processor but not yet reconciled in the accounting ledger. A credit note may have reduced the amount. A dispute, a wrong contact, an opt-out, or a promise-to-pay may have changed what the next action should be. A voice model cannot infer those facts from a polished conversation.

The practical recommendation is a fail-closed gate: fetch the current receivable state immediately before dialing, compare its version with the version that generated the work item, and suppress the call whenever the source is stale, incomplete, disputed, paid, pending reconciliation, or not authorized for the intended contact and channel. If the invoice is eligible, place one bounded call attempt. If the conversation changes the account state, record a proposed outcome and reconcile it against the ledger before creating another action. If the call does not finish, do not pretend that it did.

This article supplies a reusable 14-case synthetic acceptance matrix, a small executable validator, a Mermaid flow, and a measurement plan. The cases are test design, not test results. No real call, vendor, debtor, invoice, payment, customer dataset, or production system was tested here. The article does not estimate recovery rates or recommend a collection tactic. It helps an operations or engineering team decide whether a voice workflow should be permitted to attempt an account-specific reminder at all.

The primary source page describes a three-step reminder sequence and advertises a 40% reduction and a 40% resolution figure at day 14. Those are the publisher's claims; the page does not expose the sample, comparator, denominator, exclusions, or measurement method needed to treat the figures as independently verified evidence. Its useful contribution here is only the workflow premise: a call may be one step in a broader sequence. For a concrete example of that premise, see the described reminder workflow. The source page is not evidence that this particular sequence is lawful, effective, or suitable for any reader.

What is already covered, and what remains unresolved

Search results and vendor material commonly describe cadence, channels, scripts, integrations, and headline outcomes. A setup guide can tell a team when an email or call is scheduled. It often does not specify what happens when the ledger changes between export and dial, when settlement is merely pending, when a second worker retries the same task, or when an agent reports a result but the accounting API times out. Those are not copywriting problems. They are state-consistency problems.

That distinction makes the reader's decision narrow and testable: can the system prove that the account is still eligible at the time of the attempt, and can it prove what happened after the attempt? A workflow that cannot answer both questions should remain a human-reviewed queue or a non-calling reminder. “The model understood the customer” is not an answer to either one.

A real discussion can reveal a missing acceptance case without establishing how common it is. In one RingCentral community thread, a user described an AI receptionist interrupting while a caller gave an email address and failing to end a call after an appointment was scheduled. That single report is anecdotal. It supplies no prevalence estimate, controlled comparison, or evidence about invoice reminders. It does, however, translate into concrete tests: can a caller finish spelling an identifier without repeated interruption, and does the system close or hand off the interaction after the intended outcome? A team should test those behaviors in its own stack rather than repeat the report as a general product fact.

The research evidence also argues against treating “voice AI” as one stable category. Wang and colleagues report a natural field experiment in a large telecommunications company where an inbound voice AI replaced an IVR. The abstract describes a temporary increase in service duration and demand for human assistance, alongside a persistent reduction in complaints; speech recognition failures increased transfer demand and complaints. That is a different task, population, direction of contact, and system from outbound receivables reminders. The useful inference is limited: interface quality can move workload between automation and people, and recognition failures matter. It does not establish a collection outcome or a business case for outbound calls.

Define an account snapshot, not a list row

A dialer commonly receives a row containing an invoice identifier, contact number, amount, and due date. That row is a pointer to the account, not a sufficient authority to act. Treat every exported row as a request to re-evaluate the account. The read should return an immutable snapshot identifier or version, the current open balance, currency, due state, settlement state, dispute state, contact identity, channel permissions supplied by the organization, stop reasons, and an expiry time. If the source cannot supply one of those fields, the caller should receive an explicit unknown state instead of a guessed default.

The critical comparison is between the queued version and the current version. If they differ, the system should not simply overwrite the old values and proceed. It should recompute eligibility and preserve both versions in the audit record. A changed amount may still be callable under a properly reviewed policy, but the earlier script or amount is no longer safe to reuse. A changed contact may require verification or human review. A changed status from open to paid or disputed is a suppression, not a prompt to persuade.

A useful policy separates can-attempt from what-to-say. The first is a deterministic rule over trusted business state. The second is a constrained conversation that may explain the reason for contact, answer bounded questions, and route exceptions. A language model should never manufacture a balance from conversation context, infer that a payment has cleared, or convert a customer's uncertain statement into a recorded settlement. Those facts belong to the source system and its reconciliation process.

The decision can be represented as:

eligible = fresh(snapshot) AND open_balance(snapshot) > 0 AND settlement(snapshot) == "confirmed_open" AND dispute(snapshot) == "none" AND contact(snapshot) == "verified" AND permission(snapshot, intended_channel) == "allowed" AND stop_reasons(snapshot) == [] AND attempt_budget_remaining(snapshot) 

If any input is missing, stale, conflicting, or outside the policy's allowed values, eligibility is false. This is a conservative engineering rule for the proposed workflow, not a statement of law. The exact fields and permissions must come from the organization's approved data and policy owners.

The 14-case acceptance matrix

Run these cases against a simulator or a controlled test tenant before enabling calls. Expected outcomes are deliberately binary at the action boundary. Human review means the automation must not dial until an authorized person resolves the state. It does not mean that a human must collect money or accept a particular outcome.

Case Input condition at decision time Expected action Evidence to retain
1. Current and open Fresh snapshot, positive open amount, verified contact, no stop reason Permit one bounded attempt Snapshot version, eligibility result, attempt ID
2. Paid before dial Ledger marks settled after queue creation Suppress Old and new versions, settlement timestamp
3. Payment pending Processor reports submitted, ledger has not confirmed Suppress or human review Pending status and reconciliation reference
4. Partial settlement Current open amount differs from queued amount Recompute; do not read the old amount Both amounts, currency, new version
5. Credit note posted Credit changes the remaining balance Recompute; suppress if no open balance Credit reference and calculation
6. Dispute opened Active dispute or hold flag exists Suppress and route to approved queue Dispute identifier and stop reason
7. Promise-to-pay recorded A future commitment is already active Suppress duplicate reminder until policy says otherwise Commitment date and source
8. Wrong party Contact cannot be matched to approved account contact Stop; do not disclose account details Verification failure, no sensitive script
9. Permission absent Intended channel is not allowed or cannot be established Suppress Permission source, timestamp, policy version
10. Opt-out or stop request A valid stop signal is present Stop future attempts and propagate suppression Signal, scope, propagation result
11. Stale source Snapshot expired or version cannot be read Fail closed Read failure, age, retry eligibility
12. Duplicate worker Same logical action is claimed twice One idempotent attempt at most Shared idempotency key and conflict result
13. Transfer uncertain Agent requests a person but transfer status is unknown Keep outcome pending; never claim transfer succeeded Transfer request and acknowledgement state
14. Call outcome ambiguous Network ends after answer or tool timeout Reconcile before retry; do not invent disposition Call ID, last confirmed event, retry decision

The matrix is reusable because it focuses on transitions rather than vendor features. Teams can add local rules, such as separate queues for a particular contract type, but should not remove the common failure states merely because the first demo did not encounter them. Case 13 is especially easy to miss: a transfer requested event is not the same as a human accepted event. The SIP call-transfer guidance in RFC 5589 discusses transfer signaling and the transferor's knowledge of whether a transfer succeeded. Your application still needs to map its provider events to a truthful business state.

A three-state workflow for retries

Use three distinct states for every attempted action: not started, in progress, and outcome confirmed. A timeout is not a fourth synonym for failure. It means the caller does not yet know the outcome. The safest recovery path reads the authoritative call and ledger records, checks whether the action already happened, and only then decides whether a new attempt is allowed.

A separate attempt ID should identify one logical reminder action. Generate it when policy authorizes the attempt and pass it through the queue, dialer, call event stream, and result writer. A retry after an HTTP timeout must reuse the idempotency key for the same logical write. If the downstream system cannot enforce idempotency, a coordinator should reserve the action before dialing and reconcile a lost acknowledgement before releasing another one. Otherwise two workers can create duplicate calls even though each worker individually believes it is behaving correctly.

The call outcome should be a constrained enum such as connected without resolution, information requested, dispute reported, promise reported, wrong party, opt out, human transfer pending, human transfer confirmed, no answer, technical failure, or unknown. Keep the caller's words in a separately governed transcript or note only where the organization has an approved basis and retention policy. Do not store an unreviewed generated summary as if it were a ledger fact. A statement like “I paid yesterday” is an assertion to reconcile, not proof of settlement.

When an outcome changes eligibility, write it as a proposed transition with provenance. For example, promise reported can request a follow-up hold but should not set a bank receipt. Dispute reported can request a stop and review; it should not silently rewrite the contractual account. Opt out should trigger a defined suppression propagation path and a confirmed acknowledgement to the caller only after that write has succeeded. The exact scope, duration, and downstream propagation are policy decisions requiring legal and operational review.

Mermaid: from queue to reconciled result

flowchart TD A[Queued reminder request] --> B[Fetch current account snapshot] B --> C{Fresh and complete?} C -- No --> H[Suppress or human review] C -- Yes --> D{Open, undisputed, verified, allowed?} D -- No --> H D -- Yes --> E{Attempt budget and idempotency claim available?} E -- No --> H E -- Yes --> F[Place one bounded call attempt] F --> G{Outcome confirmed?} G -- No --> I[Keep pending; reconcile call and ledger] I --> B G -- Yes --> J[Record constrained outcome and evidence] J --> K[Recompute next action from current snapshot] H --> L[Record reason, version, and owner]

This flow intentionally puts the authoritative read after queue creation. If the account changes during a call, the agent should not keep talking as though its original amount is current. The safe response is to stop the amount-specific conversation, explain that the account needs checking without disclosing an unverified number, and route the issue through the approved human or digital channel. The application should persist the transition and its owner, not only a transcript.

Executable synthetic validator

The following Python example validates a supplied snapshot and expected queue version. It accepts no natural-language judgment, never calls a provider, and makes no network request. It is an instructional asset, not production software. Its allow-list values are examples; replace them with versioned, reviewed policy in the system that owns the accounts. The test cases that follow are synthetic inputs and expected outputs, not observed performance.

from datetime import datetime, timezone def eligible(snapshot, queued_version, now=None): now = now or datetime.now(timezone.utc) required = { "version", "expires_at", "open_amount_minor", "currency", "settlement", "dispute", "contact_verified", "channel_allowed", "stop_reasons", "attempts_remaining", } if not required.issubset(snapshot): return False, "incomplete_snapshot" try: expiry = datetime.fromisoformat(snapshot["expires_at"].replace("Z", "+00:00")) except (TypeError, ValueError): return False, "invalid_expiry" if snapshot["version"] != queued_version: return False, "version_changed" if expiry.tzinfo is None or expiry <= now: return False, "stale_snapshot" if snapshot["currency"] not in {"EUR", "CHF", "GBP", "USD"}: return False, "unsupported_currency" if not isinstance(snapshot["open_amount_minor"], int) or snapshot["open_amount_minor"] <= 0: return False, "no_positive_open_balance" if snapshot["settlement"] != "confirmed_open": return False, "settlement_not_confirmed_open" if snapshot["dispute"] != "none": return False, "dispute_or_hold" if snapshot["contact_verified"] is not True: return False, "contact_unverified" if snapshot["channel_allowed"] is not True: return False, "channel_not_allowed" if snapshot["stop_reasons"]: return False, "stop_reason_present" if not isinstance(snapshot["attempts_remaining"], int) or snapshot["attempts_remaining"] < 1: return False, "attempt_budget_exhausted" return True, "one_attempt_may_be_claimed" def synthetic_cases(): base = { "version": "v7", "expires_at": "2030-01-01T00:00:00Z", "open_amount_minor": 12500, "currency": "EUR", "settlement": "confirmed_open", "dispute": "none", "contact_verified": True, "channel_allowed": True, "stop_reasons": [], "attempts_remaining": 1, } return [ ("fresh_open", base, "v7", True), ("changed_version", {**base, "version": "v8"}, "v7", False), ("pending_payment", {**base, "settlement": "pending"}, "v7", False), ("disputed", {**base, "dispute": "active"}, "v7", False), ("unverified_contact", {**base, "contact_verified": False}, "v7", False), ("stopped", {**base, "stop_reasons": ["opt_out"]}, "v7", False), ("no_attempt_budget", {**base, "attempts_remaining": 0}, "v7", False), ("missing_field", {k: v for k, v in base.items() if k != "currency"}, "v7", False), ] def run_synthetic_suite(): now = datetime(2026, 11, 10, tzinfo=timezone.utc) failures = [] for name, snapshot, version, expected in synthetic_cases(): actual, reason = eligible(snapshot, version, now) if actual != expected: failures.append((name, expected, actual, reason)) return failures if __name__ == "__main__": failures = run_synthetic_suite() print("synthetic cases:", len(synthetic_cases())) print("failures:", failures) raise SystemExit(bool(failures)) 

The snippet omits a network boundary, authorization store, concurrency lock, signature verification, audit sink, privacy controls, local timezone handling, and integration tests. It is intentionally not a drop-in dialer. It demonstrates one decision boundary: all required fields must be present, fresh, and consistent before a call can be claimed. A production implementation should enforce the attempt claim transactionally so two workers cannot both pass the same one-attempt check.

The date in the synthetic runner is fixed to keep the example deterministic. It does not prove that a production clock is correct, that a snapshot was issued by a trusted source, or that a timestamp was parsed with the same semantics as the account system. A real implementation should validate signatures or transport identity as appropriate, use a single time source, check clock skew, and test daylight-saving transitions. The current example's simplistic allowed-currency list is a guard against accidental unsupported values, not a declaration of currencies accepted by any particular provider.

Method, sample, and limits of the asset

The 14 rows were authored on 10 November 2026 as a buyer-run failure-mode matrix. The sample is 14 designed cases, not 14 customers, calls, invoices, accounts, vendors, or production incidents. The evidence method was a source review plus state-transition analysis: start from a stale queue row, enumerate payment, dispute, contact, permission, retry, transfer, and outcome transitions, then define the safer expected action. The Python code contains eight additional deterministic examples to illustrate the core eligibility predicate. None of these cases were executed against a live service.

The asset therefore supports a limited conclusion: these conditions can be converted into testable requirements before a system is given permission to dial. It cannot show how often any condition occurs, how accurate a vendor is, whether calls improve recovery, whether reminders reduce delinquency, or what a particular organization is legally allowed to do. Teams should add cases from their own support records only after removing personal and account identifiers, checking the data's permitted use, and recording the sample window and selection method.

A useful pilot begins offline. Load a fixed synthetic account fixture into the decision service, run each case, and inspect both the returned action and the audit record. Then run concurrency tests with two workers attempting the same idempotency key. Then test timeouts at every boundary: after reservation but before dialing, during call setup, after the customer hangs up, after a transfer request, and after the result write. The expected behavior should be described in advance. If a result is “we hope the vendor handles it,” the test is incomplete.

Privacy and contact permissions need jurisdiction-specific review

A voice workflow should not infer channel permission from the existence of a phone number. The French data protection authority's guidance on commercial prospecting by email, SMS, and automated calling describes different rules for individuals and professionals and discusses prior consent and the ability to object. The exact requirements depend on the type of recipient, the message, the technology, and the context. The CNIL page on prerecorded automated commercial messages is narrower: it addresses automated calls with prerecorded messages and says people must be informed when the number is collected and provide prior express consent, subject to applicable exceptions. Do not silently extend that page's scope to every interactive AI conversation.

For an organization operating in France, have counsel or the privacy owner classify the call before implementation: consumer or professional contact; live person, interactive AI, or prerecorded message; existing relationship or prospecting; informational service message or commercial solicitation; inbound or outbound; human-initiated or automated; and the applicable objection and suppression records. The routing service should consume a decision already made by that policy process. It should not attempt to interpret national law from a prompt, a script, or the customer's answer.

The UK Competition and Markets Authority's AI agents guidance is useful for a different jurisdiction and a different legal scope. It states that consumer law applies regardless of whether an interaction is handled by a human or an AI agent, and discusses business responsibility, disclosure where AI identity could affect choices, testing, and human monitoring. This is not French legal advice and should not be presented as applying outside the UK. It supports a governance pattern: identify the organization responsible for the agent, specify what the agent may do, and test consumer-facing behavior before deployment.

Distinguish four controls in the data model: contact identity, channel eligibility, message-purpose eligibility, and stop status. A verified phone number does not establish permission for this purpose. Permission for one message does not automatically prove permission for another purpose. A stop request should be applied to the scope defined by policy and propagated to each system that can schedule a future contact. The test should verify propagation, not just a success toast in the calling interface.

Human handoff must be a state transition

A voice system can sound confident while a transfer is still ringing, has failed, or has landed in a queue with nobody available. Treat transfer requested, transfer ringing, transfer accepted, and transfer failed as separate states. Tell the caller only what the event confirms. If a human has not accepted, “I have connected you” is false. If the call drops, the system needs a documented recovery path that does not leave the account in a phantom state.

The handoff must carry enough context for the next person to continue without re-asking sensitive details. That does not mean copying an entire transcript by default. Send the minimal permitted identifiers and a short, source-attributed summary such as “caller disputes the invoice; current ledger snapshot is version v8; no amount was stated by the agent.” Preserve the difference between a customer assertion and a verified ledger fact. Set an owner and a queue deadline so an unresolved handoff does not disappear between systems.

This design also protects against an incentive mismatch. A platform may report transfers as successful when it only attempted to route them. The buyer should define success at the point that matters operationally: a named queue accepted the call, the customer stayed connected, and a responsible person had access to the necessary context. Track each event separately. The RFC describes a SIP-level transfer mechanism, but the business acceptance condition belongs to the organization and its communications stack.

Contradictory evidence changes the recommendation

It would be too strong to say that automation always reduces workload. The field experiment by Wang and colleagues describes an increase in service duration and human assistance demand during the transition period. It also reports lower complaints over time in that inbound telecom setting. Both results can be true: a new interface can initially move more difficult interactions to people while later changing complaint behavior. Neither result tells an accounts-receivable team what its own workload or outcomes will be.

The inference for this workflow is to measure unresolved exceptions and human minutes alongside completed calls. If a system increases the number of people needed for disputes, wrong-party contacts, recognition repair, or transfer failure, a top-line call-completion metric can hide the operational cost. Conversely, a longer conversation could be valuable if it reduces repeated contacts or gets the caller to the correct team. Measure the task that matters, not call duration in isolation.

KPMG's agentic AI governance discussion is a consulting perspective rather than a controlled experiment. It emphasizes bounded scope, oversight, logs, fallback behavior, and ongoing evaluation. These are reasonable design prompts but do not prove that a particular control prevents an incident. Turn each recommendation into a requirement with an owner and a test: scope boundary means a denied action has a recorded reason; human oversight means someone receives exceptions and can act; logging means an event can be reconstructed; fallback means the system stops safely when the dependency is unavailable.

The recommendation fails if the data source cannot provide a reliable version, if the organization cannot establish permission, if the call results cannot be reconciled, if exceptions have no accountable queue, or if the automation is being used to increase pressure on a person rather than deliver a clear and reviewable account update. In those cases, do not solve the gap by adding more persuasive language. Narrow the workflow, use a non-calling channel already approved for the situation, or keep the action human-reviewed.

Measurement plan: distinguish safety from business outcome

Start with safety and correctness measures. For each eligible and suppressed decision, record the snapshot version, freshness, reason, policy version, channel, account action ID, and source of each material field. Count stale-read suppression, state-change suppression, duplicate-attempt prevention, missing-permission suppression, wrong-party stop, pending outcome, and confirmed handoff. The denominator should be all scheduled requests, not only calls that connected. Otherwise the system can appear reliable by hiding the requests it declined to process.

Next measure operational load: human review minutes per request, exception queue age, transfer acceptance, time to close an exception, duplicate contacts, and the share of outcomes that remain unknown after the reconciliation window. Define a confirmed outcome before collection begins. For example, promise reported and payment posted are not interchangeable. The first comes from conversation; the second from the ledger. Include the reconciliation delay and late-arriving updates in the protocol.

Only after those controls are stable should a team estimate business outcomes such as payment timing or cost per resolved account. Use a prespecified comparison group or a staged rollout that gives comparable groups the same eligibility rules. Record exclusions and missing data. Separate accounts the system suppressed from accounts it attempted; comparing only completed calls would create selection bias. If call timing, balance band, prior contact, or dispute status differs across groups, stratify or adjust before interpreting the result.

Do not publish an improvement percentage unless the method and denominator can be independently described. A suitable report would state the observation period, number of eligible accounts, number assigned to each group, number suppressed and why, missing outcome rate, outcome definition, reconciliation cutoff, and uncertainty interval. If those records are unavailable, report that the outcome was not measured. A vendor headline or one anecdote cannot fill that gap.

Proof pack

Claim used in this article Source What it supports Boundary
The source page describes a staged reminder workflow and advertises two outcome figures Primary source linked in the opening section What the publisher says about its own workflow The page does not provide the method or denominator needed to verify the figures; they are not treated as evidence
French commercial prospecting and automated calls require context-specific review CNIL commercial prospecting guidance French regulator guidance for the described channels and recipient categories Scope depends on the exact message, recipient, technology, and legal context; obtain case-specific review
Prerecorded commercial automated calls have a narrower consent and information discussion CNIL guidance on prerecorded calls The authority's answer for prerecorded automated messages Do not generalize it to every interactive voice agent
An inbound telecom field experiment found both transition costs and later complaint changes Wang et al., 2023 The study's setting and reported abstract findings One organization and task; not outbound invoice reminders or a universal effect
Consumer-law accountability and AI-agent testing need governance UK CMA guidance UK-specific consumer-law guidance and governance prompts UK scope only; not French law
Transfer outcomes must be represented as distinct signaling states IETF RFC 5589 SIP transfer signaling context Does not define the buyer's business acceptance criteria
Bounded scope, oversight, logging, fallback, and evaluation are governance design prompts KPMG discussion A consulting firm's governance recommendations Consulting perspective, not performance evidence
One user report described interruption and failure to end an AI receptionist call RingCentral community thread An anecdotal acceptance-test prompt One report; no prevalence or independent product evaluation

The source table is not a legal checklist or vendor ranking. Its purpose is to keep each claim attached to what the evidence actually says. Primary-source text may describe a product or workflow; regulator pages support jurisdiction-specific descriptions; a field study supports its own setting; a standard supports protocol-level behavior; and a forum thread supports only the existence of an anecdotal concern.

Failure modes to rehearse before a pilot

The list row is treated as truth. A nightly export labels an account overdue, but payment posts before the call. Prevent this by rereading current state immediately before the attempt. Test a status update that lands between eligibility and dial reservation. If the system cannot safely bind the authorization to a version, stop the attempt.

Pending is collapsed into paid or unpaid. A submitted transfer, card authorization, or bank notification may not match the organization's definition of settlement. Use explicit states and send unknown values to reconciliation. Do not let the language model decide whether a payment counts.

Retry creates a second call. The first attempt may have reached the customer while the acknowledgement was lost. Before retrying, reconcile using the logical attempt ID and call provider record. When the provider cannot answer, keep the action pending and route it to a human rather than assuming the first attempt failed.

A summary writes a business fact. An agent's summary may say resolved although the caller only asked for a receipt or disputed an amount. Store the original constrained disposition and the source event. Ledger changes should come from the accounting workflow, not from generated prose.

The contact is not the intended person. The caller may answer a shared office line or number reassigned to someone else. Use a verification step before disclosing account-specific details. A wrong-party result should suppress the current contact route and produce a policy-owned review item.

A stop signal is acknowledged but not propagated. A local call UI may confirm an opt-out while another scheduler still holds the number. Test each integration and record a propagated suppression acknowledgement. If propagation cannot be confirmed, do not schedule another attempt.

A handoff is reported before acceptance. The transfer request may ring, time out, or return to the bot. Tell the person only what the system knows. Distinguish requested, accepted, failed, and unknown states in both user-facing language and audit data.

The conversation continues with stale facts. A customer says the balance was paid while the agent is reading a previous snapshot. The agent should pause amount-specific discussion, capture the statement as a report, and direct the account to reconciliation. It should not argue from the old snapshot or promise that the ledger will update by a particular time.

The metric rewards the wrong outcome. A high connected-call count can coexist with high human rework, repeated contacts, or unresolved disputes. Pair activity measures with independently sourced account outcomes and exception costs. A call is not a resolution merely because the call ended.

Buyer checklist and go/no-go rule

Before any outbound pilot, an accountable owner should be able to answer each item with evidence:

  • Is the business purpose defined in policy, and has the intended contact and message been classified for the applicable jurisdiction?
  • Is the current snapshot fetched after queue creation, versioned, time-bounded, and traceable to the authoritative account system?
  • Does every missing, stale, conflicting, pending, disputed, stopped, or unsupported state fail closed?
  • Can two workers be prevented from claiming the same logical attempt?
  • Can the team distinguish attempt requested, call started, person reached, transfer accepted, outcome written, and ledger reconciled?
  • Does a wrong-party path a...