Scope: 35 failed integration_test CI runs, ~2 days (April 15–16, 2026)
Total tests in suite: ~674
TL;DR: One data race is responsible for roughly 75% of all failures. Fix it and most of the CI pain goes away.
When a patient sends a message exceeding the 30,000-byte backend limit, the threading service returns codes.InvalidArgument. The PostMessage GraphQL resolver doesn't handle this error — it falls through as an unhandled internal error, returning data: null to the client. This causes the webapp to retry the request non-stop (1,564 times in the reported case). The fix is to catch this error and return a proper PostMessagePayload { success: false }.
You are an internal documentation writer for Spruce Health. Your job is to produce comprehensive internal product documentation for any Spruce feature. The documentation targets internal teams — support, TSE (Technical Solutions Engineering), sales, engineering, and product — and must be thorough enough that any team member can understand how the feature works, who it's for, how to configure it, and how to troubleshoot it.
Spruce Health is a healthcare communication platform used by medical practices. Key concepts you must understand:
| { | |
| "page": { | |
| "id": "qvq7h8gxchl0", | |
| "name": "Spruce Health", | |
| "url": "https://status.sprucehealth.com", | |
| "time_zone": "America/Los_Angeles", | |
| "updated_at": "2025-11-10T23:41:11.268-08:00" | |
| }, | |
| "components": [ | |
| { |
| // Available variables: | |
| // - Machine | |
| // - interpret | |
| // - assign | |
| // - send | |
| // - sendParent | |
| // - spawn | |
| // - raise | |
| // - actions | |
| // - XState (all XState exports) |
| // Available variables: | |
| // - Machine | |
| // - interpret | |
| // - assign | |
| // - send | |
| // - sendParent | |
| // - spawn | |
| // - raise | |
| // - actions | |
| // - XState (all XState exports) |
| // Available variables: | |
| // - Machine | |
| // - interpret | |
| // - assign | |
| // - send | |
| // - sendParent | |
| // - spawn | |
| // - raise | |
| // - actions |
| const exportedGoogleContacts = [...] | |
| const updatedContacts = jonsContacts.map(contact => { | |
| let modifiedContact = {} | |
| Object.keys(contact).forEach(key => { | |
| const value = contact[key] | |
| if (!value) { | |
| return | |
| } else if (String(value).length > 10 && String(value).replace(/[^0-9\+]/g, '').length >= 10 && value.length < 20) { | |
| const formattedPhone = formatNumber(value); |
| { | |
| "AL": "Alabama", | |
| "AK": "Alaska", | |
| "AS": "American Samoa", | |
| "AZ": "Arizona", | |
| "AR": "Arkansas", | |
| "CA": "California", | |
| "CO": "Colorado", | |
| "CT": "Connecticut", | |
| "DE": "Delaware", |