Skip to main content

Troubleshooting

Start with the splash screen, then verify from another machine with curl.

No Node URL Appears​

Expected splash states:

StateMeaning
starting LapEE...Network has not produced a primary interface yet.
network up; starting HyperBEAM...DHCP succeeded and PermawebOS is starting.
Running at http://HOST:8734/Use this URL from another machine.

If the screen appears stuck, probe the node anyway:

export NODE_URL=http://HOST:8734
curl -fsS -H 'accept: application/json' \
"$NODE_URL/~measurement@1.0/info"
curl -fsS -H 'accept: text/plain' \
"$NODE_URL/~meta@1.0/info/address"

If those return, the node is up.

WiFi File Rejected​

wifi.conf must contain exactly two lines:

SSID
WPA2-PSK

Rules enforced at boot:

  • SSID length: 1 to 32 bytes.
  • SSID characters: letters, digits, underscore, space, dot, apostrophe, dash.
  • PSK length: 8 to 63 bytes.
  • PSK characters: printable ASCII only.
  • PSK must not contain ", \, $, or backtick.
  • No NUL bytes or extra lines.

Prefer Ethernet when possible.

Verifier Cannot Reach The Node​

Use the exact URL from the splash:

curl -fsS -H 'accept: application/json' \
-H 'accept-bundle: true' \
"$NODE_URL/~measurement@1.0/boot"

If that fails, check local network routing, router client isolation, VPN state, and host firewall rules.

Secure Boot Fails​

Check which trust path the release expects:

  • release key enrolled;
  • exact UKI hash admitted;
  • or local operator key enrolled for a local build.

Adding config.json or wifi.conf changes the disk image hash, but it does not change EFI/Boot/BootX64.efi.

Memory-Encryption Halt​

The default physical LapEE image expects Intel TME or AMD SME. Use the no-TME release image only when the target hardware cannot satisfy that gate and the release policy allows that posture.

The no-TME image is still measured. It records the posture in the measured kernel command line.

Profile Did Not Load​

Check that the profile was staged as config.json beside the Makefile before running:

make operator-config-apply IMAGE=build/images/lapee-usb.img

The helper copies it into the image as EFI/boot/config.json. If you changed config.json after writing the USB, rerun:

make operator-config-apply IMAGE=build/images/lapee-usb.img
make write-image DEV=/dev/diskN IMAGE=build/images/lapee-usb.img

Then query the live node:

curl -fsS -H 'accept: text/plain' \
"$NODE_URL/~meta@1.0/info/lapee-profile"
curl -fsS -H 'accept: text/plain' \
"$NODE_URL/~meta@1.0/info/load-remote-devices"
curl -fsS \
-H 'accept: application/json' \
-H 'accept-bundle: true' \
"$NODE_URL/~meta@1.0/info/trusted-device-signers" \
| jq '[to_entries[] | select(.key | test("^[0-9]+$")) | .value]'

trusted-device-signers is an AO json@1.0 list. If you omit accept-bundle: true, a browser or plain curl may render HyperBuddy HTML or a linked AO message instead of the signer list.

If lapee-profile is missing, check JSON syntax and file size. Invalid config.json is replaced with {} at boot.

Measurement Fails​

Use the node-side replay check first:

curl -fsS -H 'accept: application/json' \
"$NODE_URL/~measurement@1.0/boot/~measurement@1.0/verify"

Common causes:

  • quote signature failure;
  • nonce or PCR digest mismatch;
  • AK policy mismatch;
  • PCR 15 replay failure;
  • profile/config did not match the verifier policy;
  • Secure Boot or memory-encryption posture differs from the accepted policy.

Use ~measurement@1.0/boot as the current boot evidence route. Older ~tpm@2.0a/boot-attestation references are stale.

Browser Shows HTML​

Browser requests often prefer HyperBuddy or explorer output. For probes, use explicit accept headers:

curl -fsS -H 'accept: application/json' "$NODE_URL/~measurement@1.0/info"
curl -fsS -H 'accept: text/plain' "$NODE_URL/~meta@1.0/info/address"