What happened is that Oracle mixed up chained and migrated rows ... the CHAINED_ROWS column refers to both chained and migrated rows.

Migrated = rows that were updated to be longer and didn't have room in their current block, so the data got moved and a pointer was left in the original block to show where the row migrated to.

Chained = rows that were too big to fit into any single block (eg. a row of 3kb in a table of block size 2kb). They get "chained" over multiple rows.

The only fix for chained rows is to move the table to a tablespace of larger block size. Migrated rows are the ones that get fixed through delete/insert.