bb1f6c8bdd
cost_nodes_for (beside stop_rule_for_regime) is the one CostSpec -> bound-builder binding — every component fully bound, so the wrapped param space stays cost-invariant. run_blueprint_member joins the cost rows into summarize_r (member metrics genuinely net) and stamps the cost components into the manifest params; CliMemberRunner threads the doc's cost. The re-run sides re-derive the model from the manifest: reproduce via cost_specs_from_params (the #233 stop pattern — a costed family reproduces bit-identically) and persist_campaign_traces binds the same model so the C1 drift alarm compares like with like. Hand-computed pin: a constant cost model yields net_expectancy_r == expectancy_r - cost_per_trade/|entry-stop| on a synthetic member. Verified: full workspace suite green, clippy -D warnings clean; in-loop spec + quality gates passed per task. refs #234