Reviewing an incident, end to end
Start from the records rather than from memory. Connect keeps three of itself — activity, the story a person reads; ops_events, the diagnostic trail; and the audit trail, which answers who did this, in what capacity, to what, and whether it worked. Everything else in a review is the two questions those records exist to settle: what completed, and what did not.
The records, and what each one answers#
| Record | Answers | Does not answer |
|---|---|---|
activity | What Connect did, in the words a customer would use | Why it failed |
ops_events | What failed, with the diagnostic detail | Who authorised the action |
| The audit trail | Workspace, actor and role, action, target, before and after, result — plus a correlation id that pulls one decision and everything it caused back together | Anything unconsequential: it records what has money, data, access or irreversibility attached |
The provider's own log beside calls | Whether the outside world agrees with your record | Anything about intent |
GET /api/usage/voice | What one call cost, and explicitly what was not measured | Anything outside the phone |
The chain a review runs through#
- TRIGGER — a report: a customer complains, a probe fires, a number on a screen is wrong, or a call went silent.
- USER / EXTERNAL EVENT — establish what the person outside actually experienced, in their words, before touching any record.
- AUTH / WORKSPACE RESOLUTION — establish which workspace and which audience. A report about one account is a question about both: an Owner path and a customer path differ, and a capability the customer facade does not recognise becomes a 403 rather than an error anyone can read.
- INGEST / REQUEST — find the request or the event. On the phone that means
call_events, which stores every normalised provider event once under a partial unique index. - CANONICAL RECORD — open the row itself: the
callsrow, the thread, the follow-up. Noteoutcomeanddispositionseparately; they are kept apart so a late webhook cannot overwrite what a person decided. - CLASSIFICATION / RESEARCH / REASONING — read what Connect concluded, not what you assume it concluded. A summary written from too little input is its own failure mode.
- KNOWLEDGE + MEMORY + RULES — check whether the answer came from a grounded fact, from memory, or from neither. A wrong answer with a right source is a different fix from a wrong answer with no source.
- AUTONOMY / APPROVAL — check whether the action was permitted, held or refused. A refusal is a decision and is recorded as one.
- ACTION / PROVIDER — compare your record with the provider's. A completed call on their side with no row on yours is a bug every time.
- RESULT — attribute the ending.
hangup_bynames one of caller, model, owner, engine, carrier or agent; before that existed, everything that was not the caller read 'agent'. - RELATIONSHIP / TIMELINE / MEMORY — check what the incident wrote into the relationship. A wrong fact remembered outlives the incident and needs forgetting explicitly.
- AUDIT / USAGE / NEEDS YOU — take the correlation id. It is what turns a single bad outcome into the sequence that produced it.
- NEXT — write the finding down, and add the assertion that would have caught it.
The questions worth answering#
- What did Connect complete? Name it precisely. 'The reply was drafted and held' and 'the reply was sent' are different incidents with different obligations to the customer.
- What did Connect not complete? This is the half that gets skipped, and it is the half the customer is waiting on.
- Was it silent? Silence is the worst class here. Five inbound calls on one day in September 2026 sat in silence and were recorded as 'the caller hung up before speaking'; the record was confidently wrong, which is harder to notice than an error.
- Is it new? Reading the diff answers 'is this mine' in seconds and is the first move, not the last. Building a second environment to compare against is the last one.
- Which audience? Check the other one before concluding. An asymmetry between the Owner's path and a customer's is the single most common shape of 'it works for me'.
What to write down#
- The correlation id
- One id ties the decision to everything it caused. Without it a reviewer months later is reading coincidences.
- What the outside world saw
- The caller's experience, the recipient's inbox, the screen the person was on. Not the exception.
- The cause, not the symptom
- A patch that swallows an error or defaults a bad value ends the incident and keeps the defect.
- The proof
- The command, the test, the row, the provider log line. A fix asserted without evidence is a fix nobody can re-check.
- The assertion that would have caught it
- Written as a test, and shown to fail once with the fix disabled. An assertion that has never been red has proved nothing.
Closing it#
An incident is closed when the cause is named, the fix is proved, the record says what completed and what did not, and there is an assertion that fails without the fix. A probe that fires on a correct release is worse than no probe, so if the incident produced an alert, check that the alert would not now fire on a healthy day.
Queue entries settle by themselves. Line health and the operational problems raised into Needs You drain as their cause clears, so a queue that is still full an hour after the fix is telling you the cause has not cleared — not that the queue is stale.
Questions#
Where do I start when the only symptom is 'a call went wrong'?
With the calls row and the carrier's own log for the same minute, side by side. That comparison separates 'never reached us' from 'reached us and we mishandled it' before any code is read, and the two have nothing in common.
The audit trail has no entry. Does that mean nothing happened?
No. It records the consequential things — money, data, access, irreversibility — and an audit write that fails is deliberately swallowed rather than allowed to fail the action. Check activity and ops_events before drawing any conclusion from an absence.
How do I know a fix is real rather than a patch over the symptom?
Disable it once and watch the test go red. If nothing goes red when the fix is removed, the fix is not being tested by anything, whatever the suite says.