2be6cf8860
persist_taps_from now filters the tap vocabulary through campaign_run's own tap_channel classification (exposed pub(crate)) and drops the net channel: every generated sugar campaign carries an empty cost section by construction, so net_r_equity was unproducible there and the executor's skip notice named a remedy (add a cost block to the campaign document) unreachable from the sweep/walkforward verb. The authored-campaign path keeps the notice verbatim — there the user wrote the document and the remedy is reachable. The two full-vocabulary pins move to the producible subset (deliberate pin move, documented in their doc comments). closes #240