BNO055 calibration is not one ready/not-ready flag. The calibration-status byte contains four independent two-bit values for system, gyroscope, accelerometer and magnetometer, each ranging from 0 to 3. Save offsets only when the intended fusion mode is running and all four report 3.
The Adafruit BNO055 guide presents the values as a four-item tuple. Treat that tuple as evidence about the current installation, not as a permanent certificate for the sensor.
Read the four fields separately
The calibration-status register is CALIB_STAT at 0x35. Bits 7:6 hold system status, 5:4 gyroscope, 3:2 accelerometer and 1:0 magnetometer. A hexadecimal value of 0xFF therefore represents 3/3/3/3, while a nonzero byte can still contain an uncalibrated component.
The movement needed depends on the component. Gyroscope calibration requires stillness; accelerometer calibration uses stable orientations; magnetometer calibration needs motion through multiple headings. System status reflects the fusion result and may remain below 3 until the contributing sensors satisfy the active mode.

Capture offsets in CONFIG mode
Bosch places calibration offsets and radius values in a block beginning at register 0x55. The block contains accelerometer, magnetometer and gyroscope offsets plus accelerometer and magnetometer radius values. Libraries commonly expose this as 22 bytes.
Switch to CONFIGMODE before reading or writing that block, preserve the current operating mode, and restore the mode afterward. Mode changes need the delays specified by the data sheet; immediately reading fusion output after a transition can return stale or unavailable data.

Restore only into the matching installation
Saved offsets can shorten startup calibration, but their validity depends on the sensor’s physical mounting, axis remap and magnetic surroundings. Moving the board near a steel bracket, motor, speaker or high-current cable can invalidate the magnetometer portion even though the stored bytes load successfully.
After restoring, return to the same fusion mode used during capture and monitor the four status values again. A restored 3/3/3/3 state that quickly degrades when a motor starts points to a changed magnetic environment, not a file-format problem.
Do not use system status as the only gate
Some operating modes do not use all three physical sensors in the same way. Code should log the active operation mode alongside calibration status and reject an offset package when axis mapping or mounting identity differs. Store a small version record with the 22-byte block: mode, axis-map configuration, sign configuration and a hardware or installation identifier.
The practical stop condition is explicit: intended mode active, stable installation, and system/gyro/accel/mag all at 3 before capture. On restore, verify the same configuration and watch the tuple under the machine’s real magnetic load before trusting fused orientation.

