In Red Hat BZ 1272238 Foreman was modified so that Puppet facts don't have to be lost when a host is set to the build state. This is a request for the same functionality to be added to Satellite 6.x.
As per Lukas Zapletal's comment  in BZ 1272238 an upstream issue  exists to track this, though I understand that the codebase is now a little different and the correct method to put the code in has changed.
For the record, in the latest Discovery 4.1 (part of Foreman 1.10 and Satellite 6.1.5) we do not delete facts with "discovery_" prefix. This can be used as a workaround (report all facts which must be preserved as discovery_xyz).
Valid RFE, we are tracking this already as http://projects.theforeman.org/issues/12244 upstream.
This is a future RFE, we are discussing redesigning discovered hosts which should provide this feature.
this is already implemented in Satellite 6.2. There is a new setting called "Clean all facts" which can be set to false to prevent the unwanted behavior. If you want to delete just some facts, set it to true and name all facts to be kept "discovery_*" and they will survive provisioning (but will be deleted on puppet checkin).
This behavior will be the same in Satellite 6.3 (where Discovery 9.0 is planned).
Correction, this was implemented upstream and it will be available in Satellite 6.3.
since there is still no 6.3 and several customers hit this, I am requesting this into 6.2.14.
Will consider for 6.2.15
This is resolved in Satellite 6.3. If you have upgraded and are still
seeing this issue, please feel free to re-open and provide additional
information about the issue.