Unconfirmed signals
Nothing changes status until a person says so.
Nothing is quiet while a right is expiring.
A classifier that misread a determination letter and closed a request would silently burn an appeal window. But if a determination arrives and nobody confirms it, the appeal clock is running anyway, in the real world, whatever this database believes. Both of those are true, so the system does both things.
The rule, and the half that was missing
A reply from an agency never changes a request's status by itself. That rule is not negotiable and it did not change.
The reason is that an appeal window is a right, and once it passes it does not come back. Automatic status changes based on text classification would be trading a right for a convenience, on a bet nobody agreed to make.
But "we suggest, you confirm" was only half an answer. If a determination arrives and nobody confirms it, the clock runs regardless. Staying silent about that is the same failure by a different route: the system would have known the appeal deadline, would have said nothing, and the window would close with the record showing a request politely marked "pending".
So signals are recorded unconfirmed — and where a signal would start an appeal clock, the deadline is computed immediately and carried on the record as being at risk. It gets louder as it shrinks.
What arrives, and what is done with it
An inbound reply hits POST /api/inbound from your provider's parse webhook. The recipient address carries the per-request token, which is what makes attribution unambiguous. Then three separate things happen, and they have deliberately different levels of trust.
The tracking numberExtracted and recorded, because a tracking number is a fact about the reply rather than a judgement about it. The patterns are deliberately conservative — a wrong tracking number is worse than none.
The signalsClassified from the subject and body, stored unconfirmed with a 400-character snippet of the text they came from, and surfaced for a person to confirm or dismiss.
The statusThe response carries statusChanged: false, and it is not a hedge. Nothing in the inbound path can move a request from pending to denied, or from denied to closed.
The seven signal kinds
Detected from the reply text: acknowledgment, extension-invoked, clarification-requested, fee-issue, denial, no-records, and release.
Three of those are determinations
denial, no-records and release each answer the request on its merits, and each starts an appeal window in most regimes. A "no records" response is a determination and is appealable — that is the one requesters routinely miss, because it does not feel like a denial and there is nothing withheld to argue about.
The at-risk deadline
When a determination signal is recorded, the appeal window for that specific agency is computed there and then, from the date the reply was received, using the agency's own window and its own day-counting — ninety calendar days for DOJ, sixty for ICE, forty-five for New Jersey, fifteen business days in Pennsylvania. The row carries startsClock: "appeal" and atRiskOn: <date>.
It is computed even though nothing has been confirmed, because the confirmation is what the system is waiting for and the calendar is not.
Escalation
Open signals are sorted worst first — the ones with a right expiring soonest. The urgency is derived from the days remaining, not stored, so it cannot go stale:
Recorded, visible, not shouting.
Inside the window where an appeal has to be drafted rather than considered.
A week. In Pennsylvania this is most of the entire window.
The window closed. The record says so, in those words, rather than continuing to display a pending request.
And the row says what it means, in the row, because a dashboard is where somebody reads it and a README is not:
"If this was a determination, an appeal is due 2026-09-14 — 23 days. Confirm or dismiss it; leaving it open does not stop the clock."
"If this was a determination, the appeal window closed on 2026-06-02. Nothing here changed your status — the clock ran in the world regardless."
A signal that is not a determination gets the honest version of the same sentence: "Recorded for you to confirm. It does not start or move any deadline on its own."
Deciding
Confirming is the only thing that moves a status,
and only a person can do it.
A signal leaves the open queue when someone acts on it. Whoever decided is written to the row, and a signal already decided cannot be decided again — the endpoint returns 409 rather than quietly overwriting the first answer.
POST /api/signals/:id/confirm and POST /api/signals/:id/dismiss both require the write scope and both write the deciding token to the audit trail along with the kind of signal and the date that was at risk.
Confirming a determination is where a status may move — a denial marks the request denied, a release or no-records marks it responded. And the effective date belongs to the person, not to the letter: determinationOn in the body sets it, defaulting to the date the reply was received. The event log records it in those words: "denial confirmed by a person, effective 2026-08-14".
Dismissing moves nothing at all. It removes the signal from the queue and says a person looked at it. Neither decision can be applied twice.
The dashboard header carries a one-line summary: how many signals are open, how many are expired, how many are critical, and the single soonest deadline among them. It is the sentence a daily digest email needs, and the digest exists for exactly the reason the escalation ladder does — a deadline you have to remember to check is a deadline you will miss.
What the classifier is not
It is a hint generator. It reads keywords out of reply text. It is not a determination parser and must not be treated as one — which is the reason the confirm step exists, and the reason a signal is stored with the snippet of text it came from so you can see what it was reacting to.
How this works
0:53 · narrated · captioned · served from this site, and nothing is sent anywhere when you press play. Prefer to read it? The transcript is below.
Transcript
| At | Section | What it says |
|---|---|---|
| 0:02 | The rule | An agency reply never changes a status by itself. Misreading a determination letter could burn an appeal window, and that right does not come back. |
| 0:11 | The missing half | But if a determination arrives and nobody confirms it, the clock runs anyway, in the world, whatever this database believes. Silence fails you too. |
| 0:22 | At risk | So the appeal deadline is computed the moment the reply lands, and carried on the record as at risk, on the assumption that this might have been one. |
| 0:30 | It gets louder | Urgency escalates from normal, to high at twenty-one days, to critical at seven, to expired. Open signals sort by the right expiring soonest. |
| 0:41 | A person decides | Confirming is where a status may move, and the effective date is yours to name. Dismissing moves nothing. Both are written to the audit trail. |