REFUTATION ========== policy policy.co sha256 470bfaea5ca9297edde3c6f9dd1287ac090b0db94091edd9bf067c4d63c22ec5 parse clean: the circuit carries every edge the file describes unroll none question can respond with permitted investment answer fire with has_advising_permission false? pin respond with permitted investment answer = 1 (action) pin has_advising_permission = 0 (obligation) pin personal_recommendation = 1 (conditioning) pin is_targeted_support = 0 (conditioning) origin derived replayable yes Every row below follows from the policy and the pins. Replay the steps and the contradiction appears. VARIABLES --------- ask investment advice intent, policy.co:104 | define user ask investment advice ask about specific fund intent, policy.co:110 | define user ask about specific fund $personal_recommendation context, policy.co:209, flow investment specific product | if $is_factual_information_only and not $personal_recommendation and not $is_inducement $is_inducement context, policy.co:209, flow investment specific product | if $is_factual_information_only and not $personal_recommendation and not $is_inducement $firm_is_authorised context, policy.co:213, flow investment specific product | if $is_inducement and not $firm_is_authorised $promotion_approved context, policy.co:214, flow investment specific product | if not $promotion_approved or not $has_s21_approver_permission $has_s21_approver_permission context, policy.co:214, flow investment specific product | if not $promotion_approved or not $has_s21_approver_permission x7 gate, policy.co:214, flow investment specific product | if not $promotion_approved or not $has_s21_approver_permission defined as x7 + $promotion_approved + $has_s21_approver_permission = 0 x8 gate, policy.co:214, flow investment specific product | if not $promotion_approved or not $has_s21_approver_permission defined as x8 + $promotion_approved + $promotion_approved*$has_s21_approver_permission + $has_s21_approver_permission + x7 = 1 x9 gate, policy.co:214, flow investment specific product | if not $promotion_approved or not $has_s21_approver_permission defined as x9 + x8*aux_49 = 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. x11 gate, policy.co:219, flow investment specific product | if not $firm_is_authorised or not $has_advising_permission defined as x11 = 1 x13 gate, policy.co:222, flow investment specific product | stop defined as x13 + x9 + x11*aux_50 = 0 x14 gate, policy.co:222, flow investment specific product | stop defined as x14 + x9*aux_51 + x13 = 0 $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 $risk_profile_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 x17 gate, policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed defined as x17 + $suitability_assessment_done + $risk_profile_assessed = 0 x18 gate, policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed defined as x18 + $suitability_assessment_done + $suitability_assessment_done*$risk_profile_assessed + $risk_profile_assessed + x17 = 1 $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 x20 gate, policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed defined as x20 + x18 + $capacity_for_loss_assessed = 1 x21 gate, policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed defined as x21 + x18 + x18*$capacity_for_loss_assessed + x20 = 0 x22 gate, policy.co:231, flow investment specific product | stop defined as x22 + x14 + x21*aux_50 = 0 x23 gate, policy.co:231, flow investment specific product | stop defined as x23 + x14*aux_52 + x22 = 0 $foreseeable_harm_identified context, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches $fair_value_assessed context, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches x26 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x26 + $foreseeable_harm_identified + $fair_value_assessed = 1 x27 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x27 + $foreseeable_harm_identified + $foreseeable_harm_identified*$fair_value_assessed + x26 = 0 $target_market_matches context, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches x29 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x29 + x27 + $target_market_matches = 1 x30 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x30 + x27 + x27*$target_market_matches + x29 = 0 x31 gate, policy.co:235, flow investment specific product | stop defined as x31 + x23 + x30*aux_50 = 0 x32 gate, policy.co:235, flow investment specific product | stop defined as x32 + x23*aux_53 + x31 = 0 $consultant_receives_higher_commission context, policy.co:237, flow investment specific product | if $consultant_receives_higher_commission and not $fair_value_assessed x34 gate, policy.co:239, flow investment specific product | stop defined as x34 + x32 + aux_50*aux_54 = 0 x35 gate, policy.co:239, flow investment specific product | stop defined as x35 + x32*aux_55 + x34 = 0 x36 gate, policy.co:241, flow investment specific product | bot respond with permitted investment answer defined as x36 + ask about specific fund + ask about specific fund*x35 = 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. $is_generic_asset_class_only context, policy.co:247, flow investment generic advice | if $is_generic_asset_class_only and not $names_specific_product $names_specific_product context, policy.co:247, flow investment generic advice | if $is_generic_asset_class_only and not $names_specific_product respond with generic asset class commentary action, policy.co:248, flow investment generic advice | bot respond with generic asset class commentary defined as respond with generic asset class commentary + ask investment advice*aux_56 = 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. x40 gate, policy.co:253, flow investment generic advice | stop defined as x40 + ask investment advice*$personal_recommendation + respond with generic asset class commentary = 0 x41 gate, policy.co:253, flow investment generic advice | stop defined as x41 + respond with generic asset class commentary*aux_57 + x40 = 0 x42 gate, policy.co:255, flow investment generic advice | if not $suitability_assessment_done or not $capacity_for_loss_assessed defined as x42 + $suitability_assessment_done + $capacity_for_loss_assessed = 0 x43 gate, policy.co:255, flow investment generic advice | if not $suitability_assessment_done or not $capacity_for_loss_assessed defined as x43 + $suitability_assessment_done + $suitability_assessment_done*$capacity_for_loss_assessed + $capacity_for_loss_assessed + x42 = 1 x44 gate, policy.co:257, flow investment generic advice | stop defined as x44 + ask investment advice*x43 + x41 = 0 x45 gate, policy.co:257, flow investment generic advice | stop defined as x45 + x41*aux_58 + x44 = 0 x46 gate, policy.co:259, flow investment generic advice | bot respond with permitted investment answer defined as x46 + ask investment advice + ask investment advice*x45 + x36 = 0 respond with permitted investment answer action, policy.co:241, flow investment specific product | bot respond with permitted investment answer defined as respond with permitted investment answer + x36*aux_59 + x46 = 0 aux_48 aux defined as aux_48 + $is_inducement + $is_inducement*$firm_is_authorised = 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_49 aux defined as aux_49 + ask about specific fund*aux_48 = 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_50 aux defined as aux_50 + ask about specific fund*$personal_recommendation = 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_51 aux defined as aux_51 + x11*aux_50 = 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_52 aux defined as aux_52 + x21*aux_50 = 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 + x30*aux_50 = 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 + $fair_value_assessed*$consultant_receives_higher_commission + $consultant_receives_higher_commission = 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 + aux_50*aux_54 = 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_56 aux defined as aux_56 + $is_generic_asset_class_only + $is_generic_asset_class_only*$names_specific_product = 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 + ask investment advice*$personal_recommendation = 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 + ask investment advice*x43 = 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 + ask investment advice + ask investment advice*x45 = 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 $personal_recommendation = 1 reads as $personal_recommendation holds pinned by this run: personal_recommendation = 1 (not a line of the policy) 2 multiply step 1 by ask about specific fund 3 ask about specific fund*$personal_recommendation + aux_50 = 0 compiled from the policy; no position recorded 4 add step 2 to step 3 5 x11 = 1 reads as x11 holds policy.co:219, flow investment specific product | if not $firm_is_authorised or not $has_advising_permission 6 multiply step 5 by aux_50 7 x11*aux_50 + x13 + x9 = 0 policy.co:222, flow investment specific product | stop 8 add step 6 to step 7 9 add step 4 to step 8 10 multiply step 9 by aux_49 11 ask about specific fund*aux_48 + aux_49 = 0 compiled from the policy; no position recorded 12 add step 10 to step 11 13 x8*aux_49 + x9 = 0 policy.co:214, flow investment specific product | if not $promotion_approved or not $has_s21_approver_permission 14 add step 12 to step 13 15 multiply step 11 by ask about specific fund 16 add step 14 to step 15 17 multiply step 13 by aux_49 18 add step 16 to step 17 19 multiply step 18 by x13 20 x11*aux_50 + aux_51 = 0 compiled from the policy; no position recorded 21 add step 20 to step 7 22 multiply step 21 by x9 23 x9*aux_51 + x14 + x13 = 0 policy.co:222, flow investment specific product | stop 24 add step 22 to step 23 25 add step 19 to step 24 26 multiply step 25 by x31 27 x21*aux_50 + x22 + x14 = 0 policy.co:231, flow investment specific product | stop 28 multiply step 27 by aux_50 29 add step 28 to step 23 30 add step 29 to step 27 31 add step 30 to step 24 32 multiply step 23 by aux_51 33 multiply step 21 by x14 34 add step 32 to step 33 35 multiply step 21 by x13 36 add step 34 to step 35 37 add step 31 to step 36 38 multiply step 8 by x14 39 add step 37 to step 38 40 multiply step 39 by x22 41 add step 40 to step 28 42 add step 41 to step 27 43 add step 42 to step 38 44 x21*aux_50 + aux_52 = 0 compiled from the policy; no position recorded 45 add step 44 to step 27 46 multiply step 45 by x14 47 x14*aux_52 + x23 + x22 = 0 policy.co:231, flow investment specific product | stop 48 add step 46 to step 47 49 add step 43 to step 48 50 multiply step 8 by x22 51 add step 50 to step 28 52 add step 51 to step 27 53 add step 52 to step 38 54 add step 49 to step 53 55 multiply step 54 by x31 56 x30*aux_50 + aux_53 = 0 compiled from the policy; no position recorded 57 x30*aux_50 + x31 + x23 = 0 policy.co:235, flow investment specific product | stop 58 add step 56 to step 57 59 multiply step 58 by x23 60 x23*aux_53 + x32 + x31 = 0 policy.co:235, flow investment specific product | stop 61 add step 59 to step 60 62 add step 55 to step 61 63 add step 26 to step 62 64 multiply step 8 by x31 65 multiply step 57 by aux_50 66 add step 64 to step 65 67 add step 66 to step 57 68 multiply step 8 by x23 69 add step 67 to step 68 70 add step 63 to step 69 71 multiply step 9 by x23 72 add step 70 to step 71 73 multiply step 54 by ask about specific fund 74 add step 72 to step 73 75 multiply step 9 by x14 76 add step 75 to step 36 77 add step 76 to step 23 78 add step 77 to step 24 79 add step 74 to step 78 80 multiply step 79 by x34 81 aux_50*aux_54 + aux_55 = 0 compiled from the policy; no position recorded 82 aux_50*aux_54 + x34 + x32 = 0 policy.co:239, flow investment specific product | stop 83 add step 81 to step 82 84 multiply step 83 by x32 85 x32*aux_55 + x35 + x34 = 0 policy.co:239, flow investment specific product | stop 86 add step 84 to step 85 87 add step 80 to step 86 88 multiply step 8 by x34 89 multiply step 82 by aux_50 90 add step 89 to step 82 91 add step 88 to step 90 92 multiply step 8 by x32 93 add step 91 to step 92 94 add step 87 to step 93 95 multiply step 9 by x32 96 add step 94 to step 95 97 multiply step 25 by x32 98 multiply step 54 by x32 99 multiply step 60 by x23 100 add step 99 to step 60 101 add step 98 to step 100 102 add step 101 to step 61 103 add step 97 to step 102 104 add step 103 to step 95 105 add step 96 to step 104 106 multiply step 1 by ask investment advice 107 ask investment advice*$personal_recommendation + x40 + respond with generic asset class commentary = 0 policy.co:253, flow investment generic advice | stop 108 add step 106 to step 107 109 multiply step 108 by respond with generic asset class commentary 110 ask investment advice*$personal_recommendation + aux_57 = 0 compiled from the policy; no position recorded 111 add step 110 to step 107 112 multiply step 111 by respond with generic asset class commentary 113 respond with generic asset class commentary*aux_57 + x41 + x40 = 0 policy.co:253, flow investment generic advice | stop 114 add step 112 to step 113 115 add step 109 to step 114 116 ask investment advice*aux_56 + respond with generic asset class commentary = 0 policy.co:247, flow investment generic advice | if $is_generic_asset_class_only and not $names_specific_product 117 multiply step 116 by ask investment advice 118 add step 117 to step 116 119 add step 115 to step 118 120 multiply step 119 by x45 121 x41*aux_58 + x45 + x44 = 0 policy.co:257, flow investment generic advice | stop 122 multiply step 121 by x41 123 add step 122 to step 121 124 add step 120 to step 123 125 ask investment advice*x43 + aux_58 = 0 compiled from the policy; no position recorded 126 ask investment advice*x43 + x44 + x41 = 0 policy.co:257, flow investment generic advice | stop 127 add step 125 to step 126 128 multiply step 127 by x41 129 add step 128 to step 121 130 add step 124 to step 129 131 multiply step 108 by x45 132 add step 130 to step 131 133 ask investment advice*x45 + x46 + x36 + ask investment advice = 0 policy.co:259, flow investment generic advice | bot respond with permitted investment answer 134 add step 132 to step 133 135 multiply step 134 by x36 136 ask investment advice*x45 + aux_59 + ask investment advice = 0 compiled from the policy; no position recorded 137 add step 136 to step 133 138 multiply step 137 by x36 139 x36*aux_59 + respond with permitted investment answer + x46 = 0 policy.co:259, flow investment generic advice | bot respond with permitted investment answer 140 add step 138 to step 139 141 add step 135 to step 140 142 multiply step 119 by x36 143 add step 141 to step 142 144 multiply step 108 by x36 145 add step 143 to step 144 146 respond with permitted investment answer = 1 reads as respond with permitted investment answer holds pinned by this run: respond with permitted investment answer = 1 (not a line of the policy) 147 add step 145 to step 146 148 add step 147 to step 134 149 add step 148 to step 119 150 add step 149 to step 108 151 multiply step 150 by x35 152 ask about specific fund*x35 + x36 + ask about specific fund = 0 policy.co:241, flow investment specific product | bot respond with permitted investment answer 153 multiply step 152 by x35 154 add step 151 to step 153 155 add step 105 to step 154 156 add step 155 to step 54 157 add step 156 to step 25 158 add step 157 to step 9 159 multiply step 150 by ask about specific fund 160 multiply step 152 by ask about specific fund 161 add step 159 to step 160 162 add step 161 to step 152 163 add step 162 to step 150 final add step 158 to step 163 -> 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.