Thanks for the report! You're right — this is a bug.
When placing a tile ghost on top of an existing tile, the revive() API replaces the old tile but doesn't return it. The old tile gets destroyed instead of being returned to inventory.
This has been noted and will be fixed in the next version. The fix will check what tile exists before reviving the ghost and return it to the player's inventory.
Which tiles were you replacing? (e.g., stone brick → concrete, or landfill → refined concrete?)