Skip to content

Activity

Every action sent to a device leaves a receipt: what was asked for, which lease and fencing token carried it, which frame it was bound to, and what happened. This is the record you reconcile against, not a log tail.

Data source
Fixture control— not product UI. Switches which of the five states the stream is rendering.

Complete and attributable — every value on screen comes from a named field of a receipt.

Receipt stream

One row per action sent to a device. Newest first, with anything needing attention lifted to the top.

  • 2 Outcome unknown
  • 1 Stale frame
  • 1 Device disconnected
  • 1 Device command failed
  • typeTextondev_pixel7_a19adb_real
    textLength 24 chars
    Outcome unknownaction_outcome_unknown

    The control plane lost the result of this action in transit; reconcile the device state manually.

    The physical effect is not knowable from here. Check the device. This always arrives together with Needs review.

    Receipt failure reason: Outcome unknown The result was lost in transit. Whether the device carried it out is not knowable from here — check the device and reconcile.

    requested
    2026-09-04T06:27:24.131Z
    failed
    2026-09-04T06:27:27.031Z
    lease
    lease_QmT4vR
    fencing
    114
    frame
    frm_38_02be
    agent:run_9fK2mQ:f38:44f0c1
    Receipt status: Needs review2900 ms
  • pressKeyondev_robotarm_r04robot_hand
    key KEYCODE_ENTER
    Outcome unknownaction_outcome_unknown

    The control plane restarted while this action was in flight; reconcile the device state manually.

    The physical effect is not knowable from here. Check the device. This always arrives together with Needs review.

    Receipt failure reason: Interrupted by restart The control plane restarted while this action was in flight. Whether the device carried it out is not knowable from here — check the device and reconcile.

    requested
    2026-09-04T06:15:50.131Z
    failed
    2026-09-04T06:15:54.731Z
    lease
    lease_Hg22nP
    fencing
    96
    agent:run_9fK2mQ:f31:9bd772
    Receipt status: Needs review4600 ms
  • tapondev_pixel7_a19adb_real
    x 264 · y 1602
    Stale framestale_frame· retryable

    Action was bound to frame frm_35_11ac, which is no longer the device's current frame.

    The worker decided from an out-of-date frame. That is a worker-side problem, not a broken device.

    requested
    2026-09-04T06:23:56.131Z
    failed
    2026-09-04T06:23:57.431Z
    lease
    lease_QmT4vR
    fencing
    112
    frame
    frm_35_11ac
    agent:run_9fK2mQ:f36:c7194e
    Receipt status: Failed1300 ms
  • swipeondev_cloudphone_c02adb_cloud
    from 540, 900 · to 540, 900 · durationMs 850Shown exactly as the API recorded it: a swipe whose start and end are the same point. How this should read is still an open glossary question.
    Device disconnecteddevice_disconnected· retryable

    The device dropped its transport mid-action.

    The device dropped mid-action. Wait for it to come back, or use a different device.

    requested
    2026-09-04T06:19:11.131Z
    failed
    2026-09-04T06:19:12.231Z
    lease
    lease_Wd91kZ
    fencing
    108
    agent:run_9fK2mQ:f34:3ff5a0
    Receipt status: Failed1100 ms
  • openAppondev_emulator_e01emulator
    appId com.example.missing
    Device command failedbackend_command_failed· retryable

    am start returned: Error type 3, Activity class does not exist.

    Read the message below. This one is retryable.

    requested
    2026-09-04T06:17:26.131Z
    failed
    2026-09-04T06:17:26.931Z
    lease
    lease_Yy73mB
    fencing
    104
    agent:run_9fK2mQ:f33:8a0d5c
    Receipt status: Failed800 ms
  • tapondev_pixel7_a19adb_real
    x 812 · y 244
    requested
    2026-09-04T06:13:36.131Z
    committed
    2026-09-04T06:13:37.013Z
    lease
    lease_QmT4vR
    fencing
    94
    frame
    frm_30_7710
    agent:run_9fK2mQ:f30:5d2b81
    Receipt status: Committed882 ms
  • swipeondev_pixel7_a19adb_real
    from 540, 900 · to 540, 900 · durationMs 850Shown exactly as the API recorded it: a swipe whose start and end are the same point. How this should read is still an open glossary question.
    requested
    2026-09-04T06:10:54.131Z
    committed
    2026-09-04T06:10:55.286Z
    lease
    lease_QmT4vR
    fencing
    91
    frame
    frm_29_44de
    agent:run_9fK2mQ:f29:e61a03
    Receipt status: Committed1155 ms
  • typeTextondev_cloudphone_c02adb_cloud
    textLength 11 chars
    requested
    2026-09-04T06:06:08.131Z
    committed
    2026-09-04T06:06:09.729Z
    lease
    lease_Wd91kZ
    fencing
    88
    agent:run_9fK2mQ:f27:0c47f9
    Receipt status: Committed1598 ms
  • pressKeyondev_emulator_e01emulator
    key KEYCODE_BACK
    requested
    2026-09-04T06:02:35.131Z
    committed
    2026-09-04T06:02:35.868Z
    lease
    lease_Yy73mB
    fencing
    81
    agent:run_9fK2mQ:f24:b9e250
    Receipt status: Committed737 ms

Wording still owned elsewhere

The glossary covers every status value on this screen. These are the adjacent strings it has not settled — none of them are invented here.

  • Availability — the derived “can I use this device right now” value
    gate glossary §7.3 / §5 disagreement 5, owner + API side
    until then Not shown. Online is never presented as leasable.
  • Device Unavailable Reason `leased`
    gate glossary §7.9, owner decision OD-04
    until then Not shown. Its natural label is “In use”, which is the undecided Availability word.
  • Error grouping headings (`Device error` / `API error`)
    gate glossary §5 disagreement 13, owner
    until then Failures group by their own error code, with no invented parent category.
  • How a zero-distance swipe (MCP `long_press`) should read
    gate glossary §5 disagreement 10
    until then The receipt's own value is shown unedited: action `swipe` with identical from/to. A tooltip states the value is as recorded.
  • Where `internal_error` and `backend_resolution_failed` send the user
    gate owner decision OD-04 (no support channel decided)
    until then The code and message are shown with no destination attached.
  • Fidelity tier values (`software` / `hid` / `physical`)
    gate glossary §7 has no table for them; §7 covers the status and error closed sets
    until then Printed as the API spells them, under a heading that names the field. D05's three tiers are shown as a badge; `hid` has no backend declaring it today.
  • Capability descriptor values (`per_key_visual`, `framebuffer`, `uiautomator`, …)
    gate glossary §7 has no table for them either
    until then The code value is printed and explained in the API's own words from `src/core/capabilities.ts`, rather than replaced by a label this console coined.
  • Key lifecycle — the derived “where is this key in its life” value
    gate glossary §7 has no table for API keys; the API has no status column on `api_keys` either
    until then Five values derived from `revokedAt`, `expiresAt` and the clock, shown under a heading that names the fields rather than as a status vocabulary. `Expiring soon` is this console's word for a distinction the API does not draw.
  • How many task tools `tasks:run` without `devices:act` silently loses
    gate HQ docs say four (`key-flows.md` BP-05, `state-matrix.md` §2.10); the API says five
    until then The count and the names are read from the mirrored `SCOPE_TOOLS`, so the form states five and lists them. `list_tasks` joined the scope after those documents were written.
  • Provisioning status values (`none` / `pending` / `active` / `revoked`)
    gate glossary §7 has no table for admission; D04 owns the surface
    until then Printed as the API spells them, under a heading that names the field. Each has a meaning line written here rather than a label, so nothing reads as an approved status word.
  • Retention class and delete mode values (`debug` / `audit_opt_in`, `hard_delete` / `crypto_shred`)
    gate glossary §7 has no table for them; ADR-011 D2 owns the vocabulary
    until then Printed raw under field-shaped headings, with ADR-011's own account beside each. Shown as platform policy, never as this organization's configured values — those are not readable from a browser at all (ADR-011 D4).
  • `frame_not_found` (API-85) — label and message
    gate glossary §7 has no row for it; the API registered the code after the table was written
    until then Carried in the code set (it is the API's wire contract) but deliberately unlabelled: a receipt bearing it renders the raw code via `errorCodeLabel()`, with no next-step advice, until §7 adds a row.