Skip to main content

When a Runtime Kit feature breaks, do not guess. Identify which public link failed: package file, named data read, target request, reply decoding, local state, or activation.

What this is

Runtime Kit deliberately hides private implementation details from app code. That is good for product architecture, but it means debugging should follow the public chain instead of poking unpublished code.Use this chain:
01

Name what the user sees, not what you assume broke.

02

Pick boundary, read, request, reply, local state, or activation.

03

Capture the safe name, payload shape, state, or error.

04

Fix one link and prove the expected state appears.

Do not skip straight to private files. First prove which public link failed.

Start with the symptom

Find the link first. Then fix that link.

First five minutes

Do this before editing code:If you cannot fill in the contract, that is the bug. Write the contract first, then debug the link that does not match it.

Package file failures

Check the boundary file before blaming React.Valid packages have one boundary file:
The package should declare supported thing types:Fix package file problems in the package. Do not work around them in the app surface.Fast boundary checklist:
Verify the fix:

Named data read failures

If useBitfieldData(...) does not return the value you expected, check the input name and surface contract.
Ask:The correct fix is usually to repair the package/surface contract or the component states, not to create a private read path.Read failures split into two different problems:Do not solve either problem by reading local files from the component. That creates a second data path and hides the real broken link.Verify the fix:

Missing read scope errors

If you see an error like:
The component is trying to read a prepared input without the app surface that provides it.Do not fix this by importing private provider or scope code into the component. The surface owner must provide the read scope before the component renders, or the component must receive an input handle through the public shape that surface supports.

Target request failures

The request function needs a non-empty public action name.
Check:Do not import the target implementation to “make the button work.” That bypasses Runtime Kit.Request failures split into four common cases:Verify the fix:

Reply decoding failures

The reply is bytes:
Decode according to the action reply shape:
If JSON parsing fails, the request may still have succeeded. The problem may be that the target returned text, binary bytes, an error payload, or a different JSON shape than the app expected.Write the reply shape beside the caller:
Then decode to that contract only after the target promises JSON:
If the target returns binary data, do not force it through JSON. Keep the reply as bytes and document the binary format.Debug reply failures with this order:
  1. Decode the bytes as text only if the target promises text or JSON.
  2. Parse JSON only if the target promises JSON.
  3. Check whether the reply is an error payload with a different shape.
  4. Check whether the target changed its public reply shape.
  5. Update either the action reply shape or the decoder, not both blindly.

Payload conversion surprises

Runtime Kit converts payloads before sending:That last row is easy to miss. If your target needs a JSON null, send an object with an explicit field instead, such as { "value": null }.

A record reads back empty even though you just wrote it

A record’s address mode is part of its identity. Read it the same way it was written, or the engine will not find it — even though the bytes are present.A workflow write step that targets a :: address with no explicit address mode stores it label-hash. If a reader (or a producer poll) looks for that address in identity-text mode, it gets “not found” forever. When a value “won’t read back,” read it at both modes to discover which one the writer used, then make the reader match.

A surface I removed still shows in the sidebar

Removing a placeable-surface (or any current-state record) from things-to-store-and-run.json and redeploying with the live-log-only path does not remove it from the running app. That deploy is additive — it writes the records present in your source; it never retracts records you deleted from source.To retract an already-admitted record, add an explicit tombstone to your source and redeploy:
The deploy then emits a removal for that exact address. Verify the record is gone by reading the address directly (it should report not-found). Keep the tombstone in source — it is the durable record that this address is retired.

A loading card (AI producer) is stuck “Working…” forever

A board/producer surface dispatches an action, then polls a result address to know when it is done. If the poll’s address mode does not match where the action actually wrote its result, the surface never sees the result and shows its loading copy forever — even though the action finished successfully and wrote a real record.
This is the same root cause as “reads back empty”: the result was written one way and read another. It is not a stuck engine.

Local state confusion

Customer-visible Bitfield state lives under:
Use this meaning:Do not copy one device’s local state to another device as a fix. Device permission and package state need the right owner flow.Safe support note:

Boundary failures

Check for these violations before debugging private files:Code tends to connect things directly when the boundary is not repeated clearly. Use Build with AI agents only when the feature is being generated by an AI agent.Use this note when a change crosses the Runtime Kit boundary:

Escalation checklist

Before asking for support, capture the public facts:
  1. The package name.
  2. The package set name.
  3. The public input name that failed.
  4. The public action name that failed.
  5. The payload shape, without secrets or customer data.
  6. The visible error message.
  7. Whether the problem happens on one device or every device.
Do not paste local state contents, device permission files, private keys, tokens, or customer data into public support channels.

Quick reference

Now build the bigger version

Add a small public debug note beside every Runtime Kit feature.
When something breaks, compare the bug to that contract. If the prepared input is missing, fix the package/surface link. If the target reply has a different shape, fix the action reply shape or the decoder. If one device behaves differently, check activation and package-set state before touching the UI.That gives support and developers the same map without exposing local state contents or private implementation files.
Last modified on June 28, 2026