Device Migration

1. What is device migration?

Device migration moves an existing Unit of an active Paid License from an old ODRE PQC installation to a new installation. The new device creates its own identity and device keys. Do not copy private keys, device.json, DPAPI state, or Gateway identity from the old device. Trial migration is unsupported.

2. When is it needed?

An update that preserves the existing state and identity is not a device migration.

3. Before migration

Run register with the installed OS launcher on the new device. Enter its Device Code at the Native registration and transfer portal, verify the License ID/Key, then choose Transfer an existing Unit, the source installation, and the replacement reason. Keep the same operation and state directory throughout.

New Windows device

$state = 'C:\ProgramData\ODRE\native-commercial'
$trust = '<APPROVED_TRUST_JSON_ABSOLUTE_PATH>'
$trustPin = '<INDEPENDENT_TRUST_SHA256>'
& .\runtime\python.exe .\odre-native.py register `
  --state-directory $state `
  --trust-config $trust --trust-pin $trustPin

New Linux device

state="$HOME/.local/state/odre-pqc/native-commercial"
trust='<APPROVED_TRUST_JSON_ABSOLUTE_PATH>'
trust_pin='<INDEPENDENT_TRUST_SHA256>'
python3.12 ./odre-native-ubuntu.py register \
  --state-directory "$state" \
  --trust-config "$trust" --trust-pin "$trust_pin"

4. Handle the old device

Normal replacement: stop new business traffic but keep Native running until drain confirmation completes. Download odre-device-transfer-request.json from the portal, move it to the old device, and run:

Old Windows device

& .\runtime\python.exe .\odre-native.py transfer-release `
  --state-directory $state `
  --trust-config $trust --trust-pin $trustPin `
  --transfer-request ".\odre-device-transfer-request.json" --confirm-stop

Old Linux device

python3.12 ./odre-native-ubuntu.py transfer-release \
  --state-directory "$state" \
  --trust-config "$trust" --trust-pin "$trust_pin" \
  --transfer-request "./odre-device-transfer-request.json" --confirm-stop

Do not restart the old device after release. New authority may wait for all old Offline Leases to expire.

Old device unavailable: request source recovery in the same portal operation. Continue the same register operation on the new device to confirm consent, then wait for support approval and old Lease expiry.

5. Activate the new device

Continue with the same register command and state directory. If it times out, do not reset identity or create another operation; run the same command again. After the server commit and destination binding pass, Native stores the Lease atomically on the new device.

6. Confirm completion

Wait for portal state APPLIED and Native confirmation of local Lease storage, then check the installed product's status. Verify a Gateway → Core → Protected Handler request and one Handler execution per request before opening traffic. COMMITTED alone is not migration completion or application-integration proof.

7. Failures and cautions