> ## Documentation Index
> Fetch the complete documentation index at: https://docs.soundchecklive.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Async workflow assessment and roadmap

> Source-backed assessment of Soundcheck workflows and the target for durability, execution isolation, and recovery.

**Assessment baseline:** `dev` commit `fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a`, inspected September 12, 2026. Source links below pin that revision. This is a representative assessment across current feature families, not a production configuration, load, or disaster-recovery certification. Runtime/provider behavior and capacity remain to be verified in deployment. The [durable workflow contract](./async-durability-patterns) defines the target invariants; this page distinguishes current evidence from recommendations.

## Findings that change the architecture decision

* There is **no shared transactional outbox in this baseline**. The [API README][api-readme] explicitly says so. Producers include both detached and awaited publications; neither makes a separate business DB commit atomic with Pub/Sub. The old Go outbox service-account names in Terraform do not establish a running TypeScript outbox.
* Pub/Sub and some useful consumer patterns already exist. Availability fan-out awaits child publication, uses stable per-device identities, and records terminal outcomes. This is a foundation to preserve, not a reason to replace the broker.
* Consumer guarantees differ. Invitation and crew-offer consumers can seal completion after caught delivery failures. Checklist push deliberately favors avoiding duplicates after an expired claim, accepting possible loss. An outbox alone does not change those policies.
* The earlier Twilio PR #1703 discussion described pending close/delete/participant queues and chat-push subscribers. Those artifacts are **absent from this baseline**. This assessment evaluates current direct Twilio operations, not that proposed branch. Reassess the relevant row when that work lands.
* Some durable domain state is already mature: payment instructions and provider keys, prerequisite webhook queues, import previews/jobs, CRM ingestion claims, and targeted reconciliation sweeps. Reuse them rather than flattening every workflow into `ProcessedEvent`.

## Messaging, staffing, and chat

| Feature and evidence | Current behavior and implication | Recommended end-state / constraint |
| - | - | - |
| Availability requests, responses and channel/device fan-out: [producer][availability-producer], [orchestrator][availability-parent], [SMS leaf][availability-leaf], [push fan-out][availability-push] | Initial publication can be detached after domain writes. Parents await child publications; device IDs are deterministic; leaves persist audit plus terminal inbox and throw on failure. The provider call still precedes completion recording. | A contained first outbox migration: atomically record the initial notification decision; preserve existing leaf isolation and child identities. Test partial fan-out and provider-success/crash duplicates. Add claims/provider-specific duplicate policy; inbox presence checks alone are insufficient. |
| Invitation notifications and explicit send: [dispatcher][invitation-dispatch], [consumer][invitation-consumer], [send operation][invitation-send] | Automatic publication can fail after membership/status changes. The consumer can catch channel failures and mark the parent processed. Explicit send calls the processor directly and reports channel attempt results in HTTP. | Outbox for automatic notifications plus retryable per-channel work. Define stale/cancelled notification policy. Preserve explicit send's actual-result response or deliberately redesign it to accepted/pending with UI progress; worker-only execution is not contract-preserving by default. |
| Crew-offer responses and notifications: [response side effects][crew-response], [side-effect implementation][crew-side-effects], [notification consumer][crew-consumer] | Detached response work includes event membership, availability, payable and calendar changes. Notification helpers swallow send and persistence failures before parent completion. | High business-impact recovery priority. First classify which same-DB staffing/accounting invariants must commit with the response. Persist permitted asynchronous follow-on work, then split retryable delivery units. Do not make local ledger/capacity decisions eventually consistent just to add a bus. |
| Checklist assignment push: [notifier][checklist-notifier], [consumer][checklist-consumer] | Publish is awaited with a detached direct-send fallback. Per-token claims/receipts exist; expired/reclaimed claims are deliberately treated as sent to limit duplicate noise. | Outbox can close dispatch loss, while the current at-most-once preference requires an explicit product decision. Keep it local to optional push; never reuse this suppression policy for access changes, money, or required cleanup. |
| Twilio archive/close: [archive][chat-archive], [event close][chat-close] | DB archive precedes provider close; provider errors are caught. Already-archived conversations can be retried when another caller invokes lifecycle close. There is no autonomous pending queue here. | Persist desired terminal-state work and dispatch independently. Preserve DB-first ordering and whatever archive/lifecycle coordination the implementation requires. A durable queue with a cron is a valid immediate fix; an outbox subscriber is the shared target. |
| Twilio delete/cleanup: [purge][chat-purge], [create rollback][chat-rollback] | Some paths log provider delete failure and then delete local chat state. Organization purge has different retry/failure behavior and uses pre-delete snapshots. | Persist provider SID/tombstone and cleanup intent before losing the business row. Cleanup must survive deletion and distinguish provider absence from a transient failure. A worker that only reloads the now-deleted chat cannot repair this. |
| Twilio access and membership: [add/persist][chat-persist], [remove member][chat-remove], [user revocation][chat-revoke] | Provider add can precede local membership insert with best-effort compensation. Removal/revocation requires provider success or absence before local deletion. The SMS-to-chat claim implementation from the earlier plan is absent. | Use durable reconciliation/compensation for recoverable membership transitions. Preserve current fail-closed access removal until an explicit authorization/enforcement contract permits asynchronous revocation. Do not apply notification-style swallow-and-200 behavior universally. |
| Twilio message push ingress: [webhook][chat-webhook], [push processing][chat-push] | The signature-verified webhook returns `200` before detached processing; processing calls Expo directly and logs failures. Current path lacks the later plan's durable push-event identity and receipts. | Verify → durably accept provider event identity/content → acknowledge → fan out to device workers. Keep business message acceptance distinct from optional push-delivery guarantees and preserve recipient/tenant eligibility. |

## External integrations and business workflows

| Feature and evidence | Current behavior and implication | Recommended end-state / constraint |
| - | - | - |
| Cleo ACH submit: [instruction creation][cleo-instruction], [payment processor][cleo-processor], [provider submission][cleo-submit] | Persists a pending instruction with frozen bank/contact/funding IDs, claims submission, and uses transaction ID as provider idempotency key. Ambiguous publish acknowledgement retains pending work. | Preserve the domain state machine and frozen amount/currency/destination. An outbox can reliably wake the existing processor; it must not substitute current default bank details or mint a new provider key on retry. |
| Cleo recovery and incoming events: [sweep][cleo-sweep], [webhook][cleo-webhook], [ingress handoff][cleo-ingress] | Sweep both republishes unsubmitted instructions and polls submitted payables. HMAC-verified ingress awaits broker publication before `200`, then may eagerly apply; a distinct ingress marker records acceptance. | An outbox can replace publication recovery, not provider settlement polling. Direct awaited webhook-to-broker handoff can remain valid when no business DB transaction must commit alongside it; acceptance dedup and final execution dedup remain separate. |
| Stripe charge/SCA and webhook projection: [charge][stripe-charge], [webhook][stripe-webhook], [prerequisite queue][stripe-pending] | Provider idempotency is tied to the transaction. Uncertain outcomes intentionally remain pending/processing. Single-item SCA can require a provider result in the normal HTTP response. Incoming events have classified retry behavior and deferral when the organization is missing. | Bounded synchronous initiation where required, durable financial operation state, and asynchronous final reconciliation. Audit webhook event classes before changing acknowledgement. Preserve SCA, financial guards and pending prerequisite replay; no generic retry may turn uncertainty into a second charge. |
| Clerk projection and downstream profile sync: [webhook projection][clerk-projection], [Stripe profile sync][clerk-stripe] | Synchronous verified webhook applies identity, replays pending relationships and provider events, and marks completion. Some downstream customer synchronization errors are logged and swallowed. | Keep authoritative identity/auth mutation and required revocation guarantees. Atomically record downstream facts/intents with projection; independent consumers own CRM/customer convergence and notifications. Preserve out-of-order parent handling and deletion tombstones. |
| HubSpot/Flex/n8n ingest: [CRM ingress][crm-ingress], [claims][crm-claims], [Flex stages][flex-stages] | Stable external IDs, failed/stale claim recovery and transactional core upserts exist. Staffing/link work follows the core transaction; cancellation has explicit retry gates. A changed payload can reopen the same input ID. | Durable ingest job or staged state machine, with source revision/hash and field ownership. Outbox records work between stages. Distinguish immutable revisions from intentionally coalesced latest-state sync; preserve cancellation/accounting dependencies. |
| Outbound CRM settlement and manual sync: [settlement notification][crm-settle], [manual trigger][crm-trigger] | Automatic n8n settlement notification catches failures. Manual sync returns the provider trigger result; it does not establish a local independently drained job. | Automatic outbound updates are a useful outbox/desired-state pilot. For manual long syncs, introduce durable job acceptance and progress only with an explicit API/UI contract. A provider's `202` is not proof of completed synchronization. |
| Large imports and approved previews: [commit][import-commit], [retry state][import-retry] | Preview/job state, conditional committing status, batched row outcomes, and retry of committing/failed work exist, but execution is awaited by the request. | Strong scalability candidate: durable dispatch of an immutable approved preview revision to bounded resumable workers. Preserve per-record identities/results and authorization; outbox delivery alone is not the import orchestrator. |

Specific provider policies continue to govern. Stripe's normal SCA response and Cleo's fail-closed org/user revocation sequence are intentional constraints, not incidental synchronous code to delete. Preserve financial instruction and provider identity guards; provider acceptance, execution, and settlement are different milestones.

## CheckAI, MCP, and time-driven work

| Feature and evidence | Current behavior and implication | Recommended end-state / constraint |
| - | - | - |
| Slack/SMS agent turns: [Slack][agent-slack], [SMS][agent-sms] | Adapters delegate dispatch and replies to eve. Source wrappers alone do not prove the deployed runtime's durable acceptance, message deduplication or crash resume. | Verify eve's actual runtime/backend before adding another queue. Persist accepted runs under one owner and serialize conflicting session turns where needed. Reuse a proven workflow runtime rather than duplicating it. |
| Email agent turns and replies: [email channel][agent-email] | Root message ID routes the conversation; outbound send failures can become a false result without a delivery job. Thread continuity does not prove individual inbound delivery or tool-action deduplication. | Separate conversation, provider-message, turn/run and outbound-action identities. If replies are required, persist delivery work independently of agent-turn completion. |
| Agent actions and MCP: [HTTP backend][mcp-http], [confirmation gate][mcp-confirm], [tool audit][mcp-audit] | APIs/MCP provide direct authenticated calls. Confirmation token consumption uses an in-memory map; tool idempotency hints are annotations. Invocation reporting is awaited. | Approval authorizes an exact action; it does not make that action retry-safe. Consequential operations need server-owned durable action keys/results. Keep ordinary reads/validation synchronous; return operation status for intentionally asynchronous tools. Replace awaited audit only with a durable handoff. |
| Scheduled attention digests: [org sweep][agent-sweep] | Weekday scheduler with opt-in dispatch and autonomous-write restrictions. | Keep scheduling. Add stable occurrence identity and durable run acceptance if completion is required; events may trigger/coalesce additional work. Human approvals and autonomous-write restrictions remain binding. |
| Structured ingestion compute: [ingest endpoint][agent-ingest] | HMAC-authenticated, synchronous, zero-session bounded compute called by another service. | It can remain a bounded RPC inside an api-events-owned durable ingestion workflow. Persist source/proposal/progress and approved commits in the system of record; no topic is needed for every function boundary. |

Ordinary CRUD/read paths, validation, auth, capacity decisions and transactional local invariants do not benefit from a broker simply because it is available. Optional telemetry/demo delivery may retain explicit best-effort semantics. Long-running approvals, waits and cancellation need persisted workflow checkpoints; a series of subscriptions is not itself resumable execution.

## Lifecycle, intake, storage, and scheduled consequences

These producers and workflows need distinct recovery contracts even where they share notification, import or payment infrastructure.

| Feature and evidence | Current behavior and implication | Recommended end-state / constraint |
| - | - | - |
| Event rescheduling, range reduction, cancellation and deletion: [post-commit effects][event-update-effects], [range snapshots][event-range-effects], [cancellation][event-cancel], [deletion][event-delete] | Updates order detached tails through a process-local map. Range reduction needs snapshots of removed resources that cannot be reconstructed later. Cancellation has useful state-based retries and final release verification; deletion performs several provider cleanups/notices after local deletion. | High-priority persisted per-event workflow, with versions, durable removed-resource/recipient snapshots and step outcomes. Preserve date/capacity/financial gates and cancellation-before-reschedule ordering. “Event status cancelled” and “crew release completed” remain distinct; in-memory ordering is not cross-instance recovery. |
| Google Calendar topology, attendees and cleanup: [sync][google-calendar-sync], [provider insert][google-calendar-insert] | Real provider events are created before mappings are persisted. Some delete failures are caught before removing local mappings. Provider inserts can send attendee invitations. | Desired-state reconciliation by event/day with generation protection and durable provider cleanup identity. Resolve ambiguous creation before retrying so a crash does not produce duplicate calendar events/invitations. Preserve attendee/RSVP behavior and kill switches. Authenticated calendar feeds are a separate read path, not pushed synchronization. |
| QuickBooks accounting documents and voids: [ledger side effects][quickbooks-effects], [provider sync][quickbooks-sync] | Sync/void work is detached. A provider document can be created before external-ID persistence fails and only logs; the create fast path depends on having that ID. The production client is implemented, with a separate explicit stub mode. | Durable accounting operations with ordered create/void instructions and reconciliation of provider-success/local-write ambiguity. Adding blind retries can create duplicate accounting documents. Keep OAuth and required chart-of-accounts validation synchronous; do not substitute fallback accounts after a connected-provider failure. |
| Event-file ingestion and AI merge: [upload acceptance][ingestion-upload], [unstarted/lease query][ingestion-record], [pipeline][ingestion-dispatch], [recovery][ingestion-recovery], [merge coordination][ingestion-merge] | Upload persists `UPLOADED`, starts detached work and returns `202`; a process-local three-slot limiter precedes the active lease. Recovery scans expired active stages, excluding accepted unstarted `UPLOADED` files, and marks stalled files failed for manual retry. Merge dispatch also uses local timers alongside persisted merge state. | High-priority durable acceptance/dispatch, distinct from CSV/import commit. Discover every accepted unstarted item; persist responsibility between analysis/merge stages and fence stale completions. Reuse file/batch/proposal records and approved versions. Coordinate AI concurrency across instances; distinguish manual retry from automatic resume. |
| Attachments, org/onboarding documents and orphan cleanup: [attachment upload/delete][attachment-lifecycle], [org-document deletion][org-doc-lifecycle], [contract sweep][contract-orphans] | Object-store upload and metadata writes are separate, with best-effort compensation. Deletion/replacement can lose references while blob cleanup fails. Contract PDF cleanup already pages with a persisted cursor, minimum age, reference checks and ETag-conditional deletion. | Persist cleanup identity/intent before deleting or replacing metadata; use upload operation state and orphan detection for object-first failures. Keep the contract sweep as orphan detection even after outbox adoption. Do not copy its contract-specific reference/age predicates blindly to other document types. |
| Automated closeout tasks, offer expiry and reminders: [closeout producer][closeout-tasks], [offer expiry][offer-expiry], [manual reminders][offer-reminder] | Closeout tasks have a unique source key, but later sweeps skip notification when the task already exists. Offer expiry changes status before dispatch, so a missed notice is no longer selected as overdue/open. Reminder endpoints create distinct user-requested sends. | Keep schedulers for elapsed-time discovery. Atomically couple required task/expiry notices to their state transitions, with bounded scans. Each new reminder occurrence needs a new logical identity, while retries of that occurrence keep it. Preserve optional-push policy where intentional. |
| Direct bulk/team notification sends: [direct sends][direct-send] | Actual SMS/email sends and event-template fan-out run in the request and report results. Pending notification audit can fail to persist without preventing the provider call; it is not an independently drained queue. | Immutable batch/send command plus per-recipient/channel jobs can improve burst handling. Preserve actual-result HTTP behavior or explicitly introduce accepted/pending batch status. Do not assume a `PENDING` audit row implies retry ownership. |
| User/account deletion and organization provisioning: [user deletion][user-deletion], [org lifecycle][org-lifecycle] | User deletion revokes Cleo, removes local state and then calls Clerk; Clerk failure returns an explicit error because provisioning could recreate the row. When Clerk is configured, org creation calls Clerk and returns accepted while awaiting webhook projection; the alternate path creates locally. | Persist unresolved deletion/provisioning lifecycle and tombstones if stronger recovery is required. Prevent reprovisioning during pending deletion; keep financial/revocation gates and honest response semantics. Verify the existing webhook handoff before adding redundant acceptance layers. |
| Resend contacts and email lifecycle analytics: [contact sweep][resend-contacts], [analytics ingress][resend-ingress], [analytics consumer][resend-consumer] | Contacts use bounded hourly rotation and enrichment. Delivery analytics already awaits broker acceptance and uses a leased, retrying consumer; it is not a missing event bus. | Incremental dirty-contact reconciliation can improve freshness and reduce repeated scans, while a periodic sweep still covers time-derived/enrichment changes. Preserve rate limits and safe failed-fact handling. Keep lifecycle analytics' required acceptance semantics and verify capture-success/before-seal duplicate policy. |

### Assessed boundaries that do not automatically need a broker

* **Calendar feeds and entitlements:** [feed rendering][calendar-feed] validates current token/access; [subscription sessions][subscription-sessions] must return usable Checkout/portal URLs, and [entitlement enforcement][entitlement-read] belongs on the request path. Asynchronous billing/profile consequences must not delay revocation or authorize stale access. Some subscription-webhook helper exports lack a production caller in this baseline; routed behavior remains the Stripe webhook assessed above.
* **Availability autoclose:** the [existing sweep][availability-autoclose] makes guarded local state transitions. Keep the timer and local transaction; it has no required provider worker merely because other expiry flows send notifications.
* **Workspace/audit exports and generated PDFs:** [workspace ZIP export][workspace-export], [streaming audit export][audit-export], and [call-sheet PDF][call-sheet-pdf] are implemented synchronous paths; workspace and audit exports enforce explicit limits. Larger/bulk/repeated jobs can benefit from durable artifact generation, checkpoints and shared admission control. Preserve snapshot/filter, tenant/role and cancellation semantics, and define expiry/download authorization for stored artifacts; an interrupted download is not a lost business mutation.
* **AI normalization and Wrapped statistics:** [normalization][public-normalize] returns a review-required draft without committing business data; [Wrapped][wrapped-read] computes DB aggregates. Keep bounded synchronous behavior until measured latency or read load justifies job UX or a materialized projection with an explicit freshness/rebuild contract.
* **Team notification inbox:** [the inbox][team-inbox] is an authenticated read/enrichment surface. No api-events runtime writer was found for its message table in this baseline. A desired send-to-inbox history feature needs a defined producer; do not claim current direct sends already populate it durably.

High-priority recovery work includes event lifecycle orchestration, accepted-but-unstarted AI ingestion, calendar/accounting provider identity recovery, and form intake stages. Contact freshness, materialized statistics and bulk artifact generation are performance/product choices rather than evidence every current synchronous path is defective.

## Broker and runtime evidence

The [Terraform events module][broker-config] configures subscription backoff of 10 seconds to 10 minutes, a default approximately five delivery attempts before dead lettering, seven-day source retention and fourteen-day DLQ topic retention in [defaults][broker-defaults]. [Alert configuration][broker-alerts] pages Slack on Cleo, Brevo, scheduled-maintenance, availability, invitation, and crew-offer DLQs. Remaining fan-out keys (checklist assignment, event assignment, event chat, Twilio reconcile, Resend lifecycle, Slack channel sync, lead discovery) still have no equivalent policy. Topic retention is not a staffed replay process.

[Encore handlers][handler-policy] also declare retry and acknowledgement settings. The effective SDK/provider behavior, permission grants, subscriptions, retention and replay must be tested together. Configuration committed to Git is not proof it is applied in production; the attempt limit is approximate by [Pub/Sub design](https://docs.cloud.google.com/pubsub/docs/dead-letter-topics).

The [Cloud Run configuration][worker-runtime] keeps CPU allocated for background pull loops and one or two warm instances according to HA configuration. Its default maximum is five instances. HTTP and consumers share the api-events deployment. This supplies a running consumer but does not prove backlog-aware autoscaling, sufficient provider/DB capacity, per-tenant fairness, or isolation from long integration work. No throughput or latency measurements were taken for this assessment.

## Recommended end-goal

Keep PostgreSQL, Encore and Pub/Sub. Establish one reusable, tested durable handoff and recovery capability, with domain-specific semantics:

1. **Transaction owners record required work.** An indexed outbox stores immutable versioned events beside the state change. Existing operation ledgers remain authoritative for payments, imports and desired-state work. Verified webhook ingress may publish directly if confirmed broker acceptance is the only handoff required.
2. **Relays and consumers have explicit ownership.** Stable event IDs, bounded claims, generation-safe completion, repeatable partial fan-out, and measured dispatch/completion age. Consumption that emits more required work preserves durability at that boundary too.
3. **Workers isolate resource use.** Separate execution by provider/workload when needed, with global/provider limits, tenant fairness and bounded DB connections. Scale using measured throughput and oldest-work age. Start with a small deployment and indexed polling; CDC or more services require evidence, not a branding preference.
4. **Domains preserve their meaning.** Notifications replay a delivery decision; reconciliation follows current desired state; financial/document commands execute an immutable authorized instruction; long jobs/sagas persist steps and outcomes. Authorization and approval survive delayed execution.
5. **Recovery is a product of operations.** Every required workflow has an owner, alertable unfinished state, retention policy, replay/runbook, and a tested unknown-outcome path. Scheduled reminders, settlement polling and drift repair remain where they add independent coverage.

The desired guarantee is: **a successfully accepted required operation has a durable owner until completion, an explicit terminal outcome, or visible manual recovery**. It is not an unqualified exactly-once or infinite-retention guarantee. Agree per-workload completion SLOs, outage/replay windows and duplicate tolerance before implementation; database disaster recovery is a separate obligation.

## Sequenced implementation roadmap

| Step | Scope and outcome | Exit evidence |
| - | - | - |
| 1. Adopt this contract and inventory | Correct existing outbox claims; classify required effects and synchronous contracts. Prioritize known lost staffing/access/cleanup work on business impact even before the shared platform is ready. | Each selected workflow has a durable fact, failure policy, owner, and explicit HTTP/approval contract. |
| 2. Build one vertical outbox slice | Use availability automatic notifications as the first representative path, or a narrower automatic CRM convergence path if scope demands. Include relay, safe worker execution, metrics and DLQ recovery—not just a table. | Commit/publish crash tests, duplicate publication and provider-outcome recovery, deployed redelivery/DLQ replay, bounded resource use. |
| 3. Migrate other required delivery and lifecycle paths | Fix invitation/crew consumer swallowing before promising delivery retries. Persist event lifecycle, Twilio/calendar and blob cleanup intent while preserving revocation contracts. Couple form, expiry and closeout consequences to their durable state. Database queue fixes can ship independently. | Per-domain concurrency, partial fan-out, stale-generation and cleanup-after-delete tests; existing pending work drains. |
| 4. Move long work to resumable execution | AI file ingestion, imports, CRM stages and verified CheckAI workflows gain durable acceptance, operation status and checkpoints. Bulk exports/artifacts join only where measured demand warrants it. | Accepted-but-unstarted recovery, restart/resume, cancellation, approval, ordering and per-record idempotency tests; measured API latency/resource improvement. |
| 5. Consolidate financial publication conservatively | Reuse Cleo/Stripe ledgers and provider keys; replace publication plumbing only after recovery is equivalent. Give QuickBooks create/void work durable ownership and provider-identity recovery before enabling retries. | Ambiguous submit, SCA, settlement and fail-closed deletion behavior remain intact; replay cannot create a second instruction or accounting document. |
| 6. Retire redundant retry scans selectively | Remove a domain dispatch/retry cron only after outbox, worker and DLQ recovery cover its responsibility. Keep schedules, settlement polling and useful drift repair. | Empty/migrated pending inventory, failure drills, agreed alert ownership, rollback that resumes without repeating completed irreversible actions. |

This PR records architecture and guidance only. Runtime outbox tables, relays, topic/subscription changes and feature migrations are separate implementation work. B-for-all-four Twilio operations is a possible intermediate layout, not a required milestone; keeping both a full database queue and a broker should have a stated operational benefit.

## Evidence index

Links identify representative decision points rather than asserting every caller in a feature behaves identically. Re-read the implementation and applicable provider skills when making a change; update this assessment when ownership or guarantees change.

[api-readme]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/README.md#L5

[availability-producer]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/availability-requests/dispatchAvailabilityRequestNotifications.ts#L265

[availability-parent]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/processors/availabilityRequestProcessor.ts#L262

[availability-leaf]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/processors/availabilitySmsProcessor.ts#L56

[availability-push]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/processors/availabilityPushProcessor.ts#L69

[invitation-dispatch]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/invitations/dispatchInvitationNotifications.ts#L173

[invitation-consumer]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/invitations/invitationNotificationProcessor.ts#L639

[invitation-send]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/invitations/sendEventInvitationsOperation.ts#L305

[crew-response]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/crew-offers/crewOffersOperations.ts#L1194

[crew-side-effects]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/crew-offers/crewOfferSideEffects.ts#L1744

[crew-consumer]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/crew-offers/crewOfferNotificationProcessor.ts#L750

[checklist-notifier]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-checklist/checklistTaskAssignmentNotifier.ts#L129

[checklist-consumer]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-checklist/checklistTaskAssignedProcessor.ts#L39

[chat-archive]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L849

[chat-close]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L1223

[chat-purge]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L1272

[chat-rollback]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L477

[chat-persist]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L334

[chat-remove]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L984

[chat-revoke]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L1312

[chat-webhook]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/webhooks/twilioConversationsWebhook.ts#L24

[chat-push]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-chats/eventChatsOperations.ts#L1119

[cleo-instruction]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/ledger/ledgerAch.ts#L242

[cleo-processor]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/processors/cleoPaymentProcessor.ts#L26

[cleo-submit]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/cleo-pay/cleoPayment.ts#L44

[cleo-sweep]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/cleo-pay/cleoPaymentSweep.ts#L159

[cleo-webhook]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/webhooks/cleoWebhook.ts#L70

[cleo-ingress]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/cleo-pay/cleoWebhookOperation.ts#L62

[stripe-charge]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/stripe/stripeDestinationCharge.ts#L58

[stripe-webhook]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/webhooks/stripeWebhookOperations.ts#L204

[stripe-pending]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/db/stripePendingEvent.ts#L25

[clerk-projection]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/clerk-webhook/clerkWebhookOperation.ts#L1866

[clerk-stripe]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/clerk-webhook/clerkStripeCustomerSync.ts#L42

[crm-ingress]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/n8n-crm-sync/n8nCrmSyncOperation.ts#L637

[crm-claims]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/db/crmSync.ts#L100

[flex-stages]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/n8n-flex-quote-sync/n8nFlexQuoteSyncOperation.ts#L532

[crm-settle]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/events/eventsOperations.ts#L3143

[crm-trigger]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/integrations-sync/integrationsSyncOperations.ts#L123

[import-commit]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/imports/importsOperations.ts#L1053

[import-retry]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/imports/importsOperations.ts#L936

[agent-slack]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/checkai/agent/channels/slack.ts#L8

[agent-sms]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/checkai/agent/channels/twilio.ts#L6

[agent-email]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/checkai/agent/channels/email.ts#L122

[mcp-http]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/mcp-ts/src/httpBackend.ts#L14

[mcp-confirm]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/mcp-ts/src/confirm.ts#L19

[mcp-audit]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/mcp-ts/src/tools/register.ts#L42

[agent-sweep]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/checkai/agent/schedules/org-sweep.ts#L22

[agent-ingest]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/checkai/agent/channels/ingest.ts#L14

[broker-config]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/infra-gcp/modules/events/main.tf#L273

[broker-defaults]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/infra-gcp/modules/events/variables.tf#L171

[broker-alerts]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/infra-gcp/modules/events/alerts.tf#L10

[handler-policy]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/handlers/availabilitySmsHandler.ts#L17

[worker-runtime]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/infra-gcp/modules/events/main.tf#L1060

[event-update-effects]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/events/eventsOperations.ts#L2088

[event-range-effects]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/events/eventRangeReductionEffects.ts#L66

[event-cancel]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/events/eventLifecycleCascade.ts#L481

[event-delete]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/events/eventDeletionLifecycle.ts#L354

[google-calendar-sync]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/calendar-sync/calendarSyncOperations.ts#L551

[google-calendar-insert]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/clients/googleCalendarClient.ts#L286

[quickbooks-effects]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/ledger/ledgerAccountingSideEffects.ts#L83

[quickbooks-sync]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/quickbooks/quickbooksLedgerSync.ts#L761

[ingestion-upload]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-ingestions/eventIngestionsFileOperations.ts#L295

[ingestion-record]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/db/ingestionFile.ts#L127

[ingestion-dispatch]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-ingestions/ingestionPipeline.ts#L140

[ingestion-recovery]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-ingestions/ingestionRecovery.ts#L22

[ingestion-merge]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-ingestions/mergeCoordinator.ts#L26

[attachment-lifecycle]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/event-attachments/eventAttachmentsOperations.ts#L220

[org-doc-lifecycle]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/org-docs-onboarding/orgDocsOnboardingOperations.ts#L1248

[contract-orphans]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/contracts/contractBlobCleanupSweep.ts#L14

[closeout-tasks]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/events/closeoutAutoTaskSweeper.ts#L150

[offer-expiry]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/crew-offers/expireCrewOfferWithNotification.ts#L14

[offer-reminder]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/crew-offers/crewOffersOperations.ts#L2979

[direct-send]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/notifications-direct/notificationsDirectOperations.ts#L739

[user-deletion]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/users/usersOperations.ts#L608

[org-lifecycle]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/organizations/organizationsOperations.ts#L289

[resend-contacts]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/resend-contacts/resendContactSync.ts#L204

[resend-ingress]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/resend-webhook/resendWebhookOperation.ts#L63

[resend-consumer]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/processors/resendEmailAnalyticsProcessor.ts#L41

[calendar-feed]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/calendar-feeds/renderCalendarFeedOperation.ts#L148

[subscription-sessions]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/subscriptions/subscriptionsOperations.ts#L458

[entitlement-read]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/white-label/whiteLabelAccess.ts#L54

[availability-autoclose]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/availability-requests/availabilityRequestAutoCloseSweep.ts#L27

[workspace-export]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/imports/exportWorkspaceOperations.ts#L389

[audit-export]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/audit/orgActivityExportOperation.ts#L705

[call-sheet-pdf]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/call-sheet/callSheetOperations.ts#L185

[public-normalize]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/public-normalizer/normalizeEventDataOperation.ts#L870

[wrapped-read]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/wrapped/wrappedOperations.ts#L371

[team-inbox]: https://github.com/soundchecklive/soundcheck-mobile-app/blob/fde0a61e1de4f5b31ddb4d7c44dbb4a6b1e3c51a/api-events/src/systems/team-notify-inbox/teamNotifyInboxOperations.ts#L203


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.