Answer a halt from a phone¶
When a run stops and waits for a person, the question can reach a phone in two ways: Flow's hosted lane through OpenAdapt Cloud, or the decision portal in OpenAdapt Desktop. In both, the phone sends back one answer. The runner then reads the live application again and repeats its checks before anything continues. An answer is never proof that a save happened.
| Hosted lane | Desktop decision portal | |
|---|---|---|
| The phone opens | app.openadapt.ai |
An HTTPS address your organization publishes |
| Network setup | None. The runner makes outbound HTTPS requests only | A reverse proxy or VPN that you run in front of the runner |
| The phone shows | Why the run stopped, which steps were tried, and what a continue rechecks, as fixed codes and counts | The same, plus screen crops from the run and the label of the control it couldn't find |
| Sent to OpenAdapt Cloud | A signed task with no screenshot, no free text, and no patient data | Nothing |
| Who can answer | A member of the Cloud organization, signed in with two-factor authentication | A phone paired with this computer |
Which to use¶
- Use the hosted lane if you don't run your own ingress, if the runner is behind NAT, or if staff answer from outside your network.
- Use the portal if the person needs to see the screen to decide, for example to compare two records, and your IT team can publish an HTTPS address for it.
The two are independent. A deployment can run either one, both, or neither.
Hosted lane¶
- Connect this computer to OpenAdapt Cloud from Desktop, so it holds a runner credential in the keychain.
-
Turn the lane on in the deployment file, with the tenant and runner IDs that Cloud issued for this computer:
human_decisions: remote: enabled: true tenant_id: <tenant ID> runner_id: <runner ID> # context_tier: remote_identifiers # optional: send only IDs and countsenabledmust be the booleantrue; a string or1leaves the lane off. Both IDs are required. The defaultcontext_tier,remote_closed_context, adds why the run stopped as fixed codes. Neither tier can carry a screenshot. -
Start the attended console with the lane on. Desktop does this when you start the portal under Advanced → Phone. By hand:
OPENADAPT_RUNNER_TOKEN=... openadapt flow console \ --attend --allow-actions --remote-decisions --config deployment.yamlThe console exits with an error instead of starting without the lane if the token is missing, the setting is off, the console is read-only, or the Cloud address isn't HTTPS. Desktop also refuses to start when this computer isn't registered with Cloud.
-
On the phone, open
app.openadapt.ai, sign in, and go to Attention. To get a notification, press Notify this browser there. On an iPhone or iPad, add the page to the Home Screen first, open it from there, and then press Notify this browser. See Get told when a run stops.
Each cycle, the runner publishes every open pause. When an answer comes back, the runner applies it only if it names a pause that is open now. An answer for a pause that has closed, or whose deadline has passed, is acknowledged and not carried out.
Desktop decision portal¶
The portal is a web page that Desktop serves from the runner. It binds to
127.0.0.1 by default, so a phone can't reach it until your organization
publishes it.
-
Set these before you start Desktop:
Variable Default Meaning OPENADAPT_PORTAL_INGRESS_MODEloopbackloopback(this computer only) orcustomer_ingressOPENADAPT_PORTAL_PUBLIC_ORIGINunset The exact https://origin your reverse proxy or VPN publishesOPENADAPT_PORTAL_INGRESS_ACKNOWLEDGEDfalseRecords that your organization runs that ingress OPENADAPT_PORTAL_BIND_HOSTunset A literal IP address, only if the proxy isn't on this computer OPENADAPT_PORTAL_PORT00picks a free portcustomer_ingressneeds both the origin and the acknowledgement. It still binds to127.0.0.1unless you set a bind address, so put the proxy on the runner and forward to loopback. The portal refuses to start with a wildcard bind address (0.0.0.0,::), a hostname as the bind address, or an origin that isn't plainhttps://host. -
In Desktop, open Advanced → Phone and start the portal.
- Press Pair a phone. Scan the QR code with the phone, then type the code the phone shows into Desktop. A QR code works once, for five minutes. Showing a new one cancels any unfinished pairing.
Paired phones are listed in Desktop and can be revoked. A phone session lasts twelve hours.
Pairing identifies the phone, not the person holding it. If your policy needs a named approver, the deployment must supply the signed-in operator; the phone can't set a name.
The portal serves screen crops as PNG, JPEG, or WebP only, and marks them and
every decision no-store, so the phone doesn't cache them. The phone never
receives the console's own credential.
What each answer does¶
The phone offers only the answers that fit the pause:
| Answer | Result |
|---|---|
| Check and continue | The runner rechecks the live application and continues this run only if every check passes |
| Skip | Skips the step, only where the workflow allows that step to be skipped |
| Stop | Ends the run. It can't be resumed |
| Teach | The run stays paused while the fix is taught in Desktop |
| Needs more help | The run stays paused for another authorized person |
| Reconcile | Shown only when an earlier save may have gone through. The runner checks the record and never sends the save again |
Desktop's own notifications say only how many items wait. They name no workflow, record, or step.