REFUTATION ========== policy policy.co sha256 470bfaea5ca9297edde3c6f9dd1287ac090b0db94091edd9bf067c4d63c22ec5 parse clean: the circuit carries every edge the file describes unroll none question can respond with permitted high risk answer fire with categorisation_verified false? pin respond with permitted high risk answer = 1 (action) pin categorisation_verified = 0 (obligation) pin product_is_nmmi = 1 (conditioning) pin client_is_retail = 1 (conditioning) origin derived replayable yes Every row below follows from the policy and the pins. Replay the steps and the contradiction appears. VARIABLES --------- ask about high risk investment intent, policy.co:116 | define user ask about high risk investment $personal_recommendation context, policy.co:209, flow investment specific product | if $is_factual_information_only and not $personal_recommendation and not $is_inducement $has_advising_permission context, policy.co:219, flow investment specific product | if not $firm_is_authorised or not $has_advising_permission $suitability_assessment_done context, policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed $capacity_for_loss_assessed context, policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed $hnw_signed_prescribed_statement context, policy.co:273, flow self certification gate | if not $hnw_signed_prescribed_statement $hnw_income_over_100k context, policy.co:277, flow self certification gate | if not $hnw_income_over_100k and not $hnw_net_assets_over_250k $hnw_net_assets_over_250k context, policy.co:277, flow self certification gate | if not $hnw_income_over_100k and not $hnw_net_assets_over_250k $hnw_excludes_residence_pension_insurance context, policy.co:282, flow self certification gate | if not $hnw_excludes_residence_pension_insurance $hnw_statement_within_12_months context, policy.co:286, flow self certification gate | if not $hnw_statement_within_12_months $incentive_offered context, policy.co:298, flow high risk investment gate | if $incentive_offered block incentive action, policy.co:299, flow high risk investment gate | bot block incentive defined as block incentive + ask about high risk investment*$incentive_offered = 0 introduced quadratic-split note Both inputs of an XOR were AND gates, which would have put two quadratic terms in one equation; the first was split into its own variable to keep exactly one. $client_claims_high_net_worth context, policy.co:305, flow high risk investment gate | if $client_claims_high_net_worth and not $client_is_certified_high_net_worth $client_is_certified_high_net_worth context, policy.co:305, flow high risk investment gate | if $client_claims_high_net_worth and not $client_is_certified_high_net_worth x14 gate, policy.co:306, flow high risk investment gate | if not $hnw_signed_prescribed_statement or not $hnw_statement_within_12_months defined as x14 + $hnw_signed_prescribed_statement + $hnw_statement_within_12_months = 0 x15 gate, policy.co:306, flow high risk investment gate | if not $hnw_signed_prescribed_statement or not $hnw_statement_within_12_months defined as x15 + $hnw_signed_prescribed_statement + $hnw_signed_prescribed_statement*$hnw_statement_within_12_months + $hnw_statement_within_12_months + x14 = 1 x16 gate, policy.co:308, flow high risk investment gate | stop defined as x16 + block incentive + x15*aux_53 = 0 x17 gate, policy.co:308, flow high risk investment gate | stop defined as x17 + block incentive*aux_54 + x16 = 0 x18 gate, policy.co:312, flow high risk investment gate | stop defined as x18 + x17 + aux_53*aux_55 = 0 x19 gate, policy.co:312, flow high risk investment gate | stop defined as x19 + x17*aux_56 + x18 = 0 x20 gate, policy.co:316, flow high risk investment gate | stop defined as x20 + x19 + aux_53*aux_58 = 0 x21 gate, policy.co:316, flow high risk investment gate | stop defined as x21 + x19*aux_59 + x20 = 0 $product_is_nmmi context, policy.co:318, flow high risk investment gate | if $product_is_nmmi $client_is_retail context, policy.co:319, flow high risk investment gate | if $client_is_retail and not $client_is_certified_high_net_worth and not $client_is_certified_sophisticated and not $client_is_self_certified_sophisticated and not $client_is_professional $client_is_certified_sophisticated context, policy.co:319, flow high risk investment gate | if $client_is_retail and not $client_is_certified_high_net_worth and not $client_is_certified_sophisticated and not $client_is_self_certified_sophisticated and not $client_is_professional $client_is_self_certified_sophisticated context, policy.co:319, flow high risk investment gate | if $client_is_retail and not $client_is_certified_high_net_worth and not $client_is_certified_sophisticated and not $client_is_self_certified_sophisticated and not $client_is_professional $client_is_professional context, policy.co:319, flow high risk investment gate | if $client_is_retail and not $client_is_certified_high_net_worth and not $client_is_certified_sophisticated and not $client_is_self_certified_sophisticated and not $client_is_professional x27 gate, policy.co:321, flow high risk investment gate | stop defined as x27 + x21 + aux_63*aux_64 = 0 x28 gate, policy.co:321, flow high risk investment gate | stop defined as x28 + x21*aux_65 + x27 = 0 x30 gate, policy.co:325, flow high risk investment gate | stop defined as x30 + ask about high risk investment*$product_is_nmmi + x28 = 0 x31 gate, policy.co:325, flow high risk investment gate | stop defined as x31 + x28*aux_63 + x30 = 0 $risk_warning_given context, policy.co:327, flow high risk investment gate | if not $risk_warning_given x33 gate, policy.co:329, flow high risk investment gate | stop defined as x33 + x31 + $risk_warning_given*aux_63 + aux_63 = 0 x34 gate, policy.co:329, flow high risk investment gate | stop defined as x34 + x31*aux_66 + x33 = 0 $fscs_fos_loss_warning_given context, policy.co:334, flow high risk investment gate | if not $fscs_fos_loss_warning_given x36 gate, policy.co:336, flow high risk investment gate | stop defined as x36 + x34 + $fscs_fos_loss_warning_given*aux_63 + aux_63 = 0 x37 gate, policy.co:336, flow high risk investment gate | stop defined as x37 + x34*aux_67 + x36 = 0 $product_is_rmmi context, policy.co:338, flow high risk investment gate | if $product_is_rmmi x39 gate, policy.co:341, flow high risk investment gate | stop defined as x39 + $risk_warning_given*aux_68 + x37 + aux_68 = 0 x40 gate, policy.co:341, flow high risk investment gate | stop defined as x40 + x37*aux_69 + x39 = 0 $client_is_first_time_investor context, policy.co:345, flow high risk investment gate | if $client_is_first_time_investor and not $cooling_off_completed $cooling_off_completed context, policy.co:345, flow high risk investment gate | if $client_is_first_time_investor and not $cooling_off_completed x43 gate, policy.co:348, flow high risk investment gate | stop defined as x43 + x40 + aux_71*aux_72 = 0 x44 gate, policy.co:348, flow high risk investment gate | stop defined as x44 + x40*aux_73 + x43 = 0 x45 gate, policy.co:355, flow high risk investment gate | stop defined as x45 + ask about high risk investment*aux_74 + x44 = 0 x46 gate, policy.co:355, flow high risk investment gate | stop defined as x46 + x44*aux_75 + x45 = 0 x47 gate, policy.co:360, flow high risk investment gate | if not $suitability_assessment_done or not $capacity_for_loss_assessed defined as x47 + $suitability_assessment_done + $capacity_for_loss_assessed = 0 x48 gate, policy.co:360, flow high risk investment gate | if not $suitability_assessment_done or not $capacity_for_loss_assessed defined as x48 + $suitability_assessment_done + $suitability_assessment_done*$capacity_for_loss_assessed + $capacity_for_loss_assessed + x47 = 1 x49 gate, policy.co:362, flow high risk investment gate | stop defined as x49 + x46 + x48*aux_77 = 0 x50 gate, policy.co:362, flow high risk investment gate | stop defined as x50 + x46*aux_78 + x49 = 0 respond with permitted high risk answer action, policy.co:364, flow high risk investment gate | bot respond with permitted high risk answer defined as respond with permitted high risk answer + ask about high risk investment + ask about high risk investment*x50 = 0 introduced forced-materialisation note This wire is protected or pinned, so it could not be absorbed into the equation that uses it; it stayed an explicit variable with a defining equation of its own. aux_52 aux defined as aux_52 + $client_claims_high_net_worth + $client_claims_high_net_worth*$client_is_certified_high_net_worth = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_53 aux defined as aux_53 + ask about high risk investment*aux_52 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_54 aux defined as aux_54 + x15*aux_53 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_55 aux defined as aux_55 + $hnw_income_over_100k + $hnw_income_over_100k*$hnw_net_assets_over_250k + $hnw_net_assets_over_250k = 1 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_56 aux defined as aux_56 + aux_53*aux_55 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_57 aux defined as aux_57 + $hnw_income_over_100k*$hnw_net_assets_over_250k + $hnw_net_assets_over_250k = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_58 aux defined as aux_58 + $hnw_excludes_residence_pension_insurance*aux_57 + aux_57 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_59 aux defined as aux_59 + aux_53*aux_58 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_60 aux defined as aux_60 + $client_is_certified_high_net_worth*$client_is_retail + $client_is_retail = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_61 aux defined as aux_61 + $client_is_certified_sophisticated*aux_60 + aux_60 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_62 aux defined as aux_62 + $client_is_self_certified_sophisticated*aux_61 + aux_61 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_63 aux defined as aux_63 + ask about high risk investment*$product_is_nmmi = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_64 aux defined as aux_64 + $client_is_professional*aux_62 + aux_62 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_65 aux defined as aux_65 + aux_63*aux_64 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_66 aux defined as aux_66 + $risk_warning_given*aux_63 + aux_63 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_67 aux defined as aux_67 + $fscs_fos_loss_warning_given*aux_63 + aux_63 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_68 aux defined as aux_68 + ask about high risk investment*$product_is_rmmi = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_69 aux defined as aux_69 + $risk_warning_given*aux_68 + aux_68 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_70 aux defined as aux_70 + $client_is_first_time_investor + $client_is_first_time_investor*$cooling_off_completed = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_71 aux defined as aux_71 + aux_68*aux_70 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_72 aux defined as aux_72 + $client_is_certified_high_net_worth + $client_is_certified_high_net_worth*$client_is_professional + $client_is_professional = 1 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_73 aux defined as aux_73 + aux_71*aux_72 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_74 aux defined as aux_74 + $personal_recommendation + $personal_recommendation*$has_advising_permission = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_75 aux defined as aux_75 + ask about high risk investment*aux_74 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_76 aux defined as aux_76 + $personal_recommendation*$has_advising_permission = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_77 aux defined as aux_77 + ask about high risk investment*aux_76 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. aux_78 aux defined as aux_78 + x48*aux_77 = 0 introduced degree3-materialisation because An AND gate fed another AND gate, which would have made the equation cubic; the inner one was given its own variable to keep the system quasilinear. DERIVATION ---------- 1 ask about high risk investment*x50 + respond with permitted high risk answer + ask about high risk investment = 0 policy.co:364, flow high risk investment gate | bot respond with permitted high risk answer 2 multiply step 1 by x50 3 respond with permitted high risk answer = 1 reads as respond with permitted high risk answer holds pinned by this run: respond with permitted high risk answer = 1 (not a line of the policy) 4 multiply step 3 by x50 5 add step 2 to step 4 6 multiply step 5 by x46 7 x46*aux_78 + x50 + x49 = 0 policy.co:362, flow high risk investment gate | stop 8 multiply step 7 by x46 9 add step 8 to step 7 10 add step 6 to step 9 11 x48*aux_77 + aux_78 = 0 compiled from the policy; no position recorded 12 x48*aux_77 + x49 + x46 = 0 policy.co:362, flow high risk investment gate | stop 13 add step 11 to step 12 14 multiply step 13 by x46 15 add step 14 to step 7 16 add step 10 to step 15 17 multiply step 16 by x44 18 x44*aux_75 + x46 + x45 = 0 policy.co:355, flow high risk investment gate | stop 19 multiply step 18 by x44 20 add step 19 to step 18 21 add step 17 to step 20 22 ask about high risk investment*aux_74 + aux_75 = 0 compiled from the policy; no position recorded 23 ask about high risk investment*aux_74 + x45 + x44 = 0 policy.co:355, flow high risk investment gate | stop 24 add step 22 to step 23 25 multiply step 24 by x44 26 add step 25 to step 18 27 add step 21 to step 26 28 multiply step 27 by x40 29 x40*aux_73 + x44 + x43 = 0 policy.co:348, flow high risk investment gate | stop 30 multiply step 29 by x40 31 add step 30 to step 29 32 add step 28 to step 31 33 aux_71*aux_72 + aux_73 = 0 compiled from the policy; no position recorded 34 aux_71*aux_72 + x43 + x40 = 0 policy.co:348, flow high risk investment gate | stop 35 add step 33 to step 34 36 multiply step 35 by x40 37 add step 36 to step 29 38 add step 32 to step 37 39 multiply step 1 by ask about high risk investment 40 multiply step 3 by ask about high risk investment 41 add step 39 to step 40 42 add step 41 to step 1 43 add step 42 to step 3 44 multiply step 43 by x28 45 $product_is_nmmi = 1 reads as $product_is_nmmi holds pinned by this run: product_is_nmmi = 1 (not a line of the policy) 46 multiply step 45 by ask about high risk investment 47 ask about high risk investment*$product_is_nmmi + aux_63 = 0 compiled from the policy; no position recorded 48 add step 46 to step 47 49 ask about high risk investment*$product_is_nmmi + x30 + x28 = 0 policy.co:325, flow high risk investment gate | stop 50 add step 49 to step 47 51 add step 48 to step 50 52 multiply step 51 by x28 53 multiply step 50 by x28 54 x28*aux_63 + x31 + x30 = 0 policy.co:325, flow high risk investment gate | stop 55 add step 53 to step 54 56 add step 52 to step 55 57 add step 44 to step 56 58 multiply step 57 by x36 59 $risk_warning_given*aux_63 + aux_63 + x33 + x31 = 0 policy.co:329, flow high risk investment gate | stop 60 multiply step 59 by aux_63 61 multiply step 50 by x33 62 add step 60 to step 61 63 add step 62 to step 59 64 multiply step 50 by x31 65 add step 63 to step 64 66 add step 65 to step 54 67 add step 66 to step 55 68 multiply step 54 by aux_63 69 add step 68 to step 64 70 multiply step 50 by x30 71 add step 69 to step 70 72 add step 67 to step 71 73 multiply step 72 by x33 74 $risk_warning_given*aux_63 + aux_66 + aux_63 = 0 compiled from the policy; no position recorded 75 add step 74 to step 59 76 multiply step 75 by x31 77 x31*aux_66 + x34 + x33 = 0 policy.co:329, flow high risk investment gate | stop 78 add step 76 to step 77 79 add step 73 to step 78 80 multiply step 79 by x36 81 $fscs_fos_loss_warning_given*aux_63 + aux_67 + aux_63 = 0 compiled from the policy; no position recorded 82 $fscs_fos_loss_warning_given*aux_63 + aux_63 + x36 + x34 = 0 policy.co:336, flow high risk investment gate | stop 83 add step 81 to step 82 84 multiply step 83 by x34 85 x34*aux_67 + x37 + x36 = 0 policy.co:336, flow high risk investment gate | stop 86 add step 84 to step 85 87 add step 80 to step 86 88 add step 58 to step 87 89 multiply step 82 by aux_63 90 multiply step 50 by x36 91 add step 89 to step 90 92 add step 91 to step 82 93 multiply step 50 by x34 94 add step 92 to step 93 95 add step 88 to step 94 96 multiply step 51 by x34 97 add step 95 to step 96 98 multiply step 43 by x34 99 add step 97 to step 98 100 multiply step 99 by x39 101 $risk_warning_given*aux_68 + aux_69 + aux_68 = 0 compiled from the policy; no position recorded 102 $risk_warning_given*aux_68 + aux_68 + x39 + x37 = 0 policy.co:341, flow high risk investment gate | stop 103 add step 101 to step 102 104 multiply step 103 by x37 105 x37*aux_69 + x40 + x39 = 0 policy.co:341, flow high risk investment gate | stop 106 add step 104 to step 105 107 add step 100 to step 106 108 multiply step 79 by x39 109 add step 107 to step 108 110 multiply step 57 by x39 111 add step 109 to step 110 112 multiply step 51 by x39 113 add step 111 to step 112 114 multiply step 43 by x39 115 add step 113 to step 114 116 add step 38 to step 115 117 add step 116 to step 99 118 add step 117 to step 79 119 add step 118 to step 57 120 add step 119 to step 51 final add step 120 to step 43 -> 0 = 1 WHAT THIS ESTABLISHES --------------------- The derivation is valid: the listed steps really do combine the listed rows into 0 = 1. It does not establish that those rows are the policy. The citations above say where each row was compiled from, and they are the compiler's own record rather than an independent check of it -- closing that second hop means re-deriving the circuit and comparing.