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 suitability_assessment_done false? pin respond with permitted investment answer = 1 (action) pin suitability_assessment_done = 0 (obligation) pin personal_recommendation = 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 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_57 = 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. $has_advising_permission context, policy.co:219, flow investment specific product | if not $firm_is_authorised or not $has_advising_permission x11 gate, policy.co:219, flow investment specific product | if not $firm_is_authorised or not $has_advising_permission defined as x11 + $firm_is_authorised + $has_advising_permission = 0 x12 gate, policy.co:219, flow investment specific product | if not $firm_is_authorised or not $has_advising_permission defined as x12 + $firm_is_authorised + $firm_is_authorised*$has_advising_permission + $has_advising_permission + x11 = 1 $is_targeted_support context, policy.co:220, flow investment specific product | if not $is_targeted_support x14 gate, policy.co:222, flow investment specific product | stop defined as x14 + x9 + $is_targeted_support*aux_59 + aux_59 = 0 x15 gate, policy.co:222, flow investment specific product | stop defined as x15 + x9*aux_60 + x14 = 0 $has_targeted_support_permission context, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made $consumer_segment_predefined context, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made x18 gate, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made defined as x18 + $has_targeted_support_permission + $consumer_segment_predefined = 0 x19 gate, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made defined as x19 + $has_targeted_support_permission + $has_targeted_support_permission*$consumer_segment_predefined + $consumer_segment_predefined + x18 = 1 $suggestion_is_ready_made context, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made x21 gate, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made defined as x21 + x19 + $suggestion_is_ready_made = 1 x22 gate, policy.co:225, flow investment specific product | if not $has_targeted_support_permission or not $consumer_segment_predefined or not $suggestion_is_ready_made defined as x22 + x19 + x19*$suggestion_is_ready_made + x21 = 0 x23 gate, policy.co:227, flow investment specific product | stop defined as x23 + x15 + x22*aux_61 = 0 x24 gate, policy.co:227, flow investment specific product | stop defined as x24 + x15*aux_62 + x23 = 0 x27 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 x27 = 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 x29 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 x29 + x27 + $capacity_for_loss_assessed = 1 x30 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 x30 + x27 + x27*$capacity_for_loss_assessed + x29 = 0 x31 gate, policy.co:231, flow investment specific product | stop defined as x31 + x24 + x30*aux_58 = 0 x32 gate, policy.co:231, flow investment specific product | stop defined as x32 + x24*aux_63 + x31 = 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 x35 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x35 + $foreseeable_harm_identified + $fair_value_assessed = 1 x36 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x36 + $foreseeable_harm_identified + $foreseeable_harm_identified*$fair_value_assessed + x35 = 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 x38 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x38 + x36 + $target_market_matches = 1 x39 gate, policy.co:233, flow investment specific product | if $foreseeable_harm_identified or not $fair_value_assessed or not $target_market_matches defined as x39 + x36 + x36*$target_market_matches + x38 = 0 x40 gate, policy.co:235, flow investment specific product | stop defined as x40 + x32 + x39*aux_58 = 0 x41 gate, policy.co:235, flow investment specific product | stop defined as x41 + x32*aux_64 + x40 = 0 $consultant_receives_higher_commission context, policy.co:237, flow investment specific product | if $consultant_receives_higher_commission and not $fair_value_assessed x43 gate, policy.co:239, flow investment specific product | stop defined as x43 + x41 + aux_58*aux_65 = 0 x44 gate, policy.co:239, flow investment specific product | stop defined as x44 + x41*aux_66 + x43 = 0 x45 gate, policy.co:241, flow investment specific product | bot respond with permitted investment answer defined as x45 + ask about specific fund + ask about specific fund*x44 = 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_67 = 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. x49 gate, policy.co:253, flow investment generic advice | stop defined as x49 + ask investment advice*aux_68 + respond with generic asset class commentary = 0 x50 gate, policy.co:253, flow investment generic advice | stop defined as x50 + respond with generic asset class commentary*aux_69 + x49 = 0 x51 gate, policy.co:255, flow investment generic advice | if not $suitability_assessment_done or not $capacity_for_loss_assessed defined as x51 = 1 x52 gate, policy.co:257, flow investment generic advice | stop defined as x52 + ask investment advice*x51 + x50 = 0 x53 gate, policy.co:257, flow investment generic advice | stop defined as x53 + x50*aux_70 + x52 = 0 x54 gate, policy.co:259, flow investment generic advice | bot respond with permitted investment answer defined as x54 + ask investment advice + ask investment advice*x53 + x45 = 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 + x45*aux_71 + x54 = 0 aux_56 aux defined as aux_56 + $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_57 aux defined as aux_57 + ask about specific fund*aux_56 = 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 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_59 aux defined as aux_59 + x12*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 + $is_targeted_support*aux_59 + aux_59 = 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 + $is_targeted_support*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_62 aux defined as aux_62 + x22*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 + x30*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_64 aux defined as aux_64 + x39*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_65 aux defined as aux_65 + $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_66 aux defined as aux_66 + aux_58*aux_65 = 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 + $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_68 aux defined as aux_68 + $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_69 aux defined as aux_69 + ask investment advice*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 + ask investment advice*x51 = 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 + ask investment advice + ask investment advice*x53 = 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 x51 = 1 reads as x51 holds policy.co:255, flow investment generic advice | if not $suitability_assessment_done or not $capacity_for_loss_assessed 2 multiply step 1 by ask investment advice 3 ask investment advice*x51 + x52 + x50 = 0 policy.co:257, flow investment generic advice | stop 4 add step 2 to step 3 5 multiply step 4 by x53 6 x50*aux_70 + x53 + x52 = 0 policy.co:257, flow investment generic advice | stop 7 multiply step 6 by aux_70 8 ask investment advice*x51 + aux_70 = 0 compiled from the policy; no position recorded 9 add step 8 to step 3 10 multiply step 9 by x53 11 add step 7 to step 10 12 multiply step 9 by x52 13 add step 11 to step 12 14 add step 5 to step 13 15 add step 14 to step 6 16 multiply step 9 by x50 17 add step 16 to step 6 18 add step 15 to step 17 19 ask investment advice*x53 + x54 + x45 + ask investment advice = 0 policy.co:259, flow investment generic advice | bot respond with permitted investment answer 20 add step 18 to step 19 21 multiply step 20 by x45 22 ask investment advice*x53 + aux_71 + ask investment advice = 0 compiled from the policy; no position recorded 23 add step 22 to step 19 24 multiply step 23 by x45 25 x45*aux_71 + respond with permitted investment answer + x54 = 0 policy.co:259, flow investment generic advice | bot respond with permitted investment answer 26 add step 24 to step 25 27 add step 21 to step 26 28 multiply step 4 by x45 29 add step 27 to step 28 30 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) 31 add step 29 to step 30 32 add step 31 to step 20 33 add step 32 to step 4 34 multiply step 33 by x44 35 ask about specific fund*x44 + x45 + ask about specific fund = 0 policy.co:241, flow investment specific product | bot respond with permitted investment answer 36 multiply step 35 by x44 37 add step 34 to step 36 38 multiply step 37 by x32 39 $personal_recommendation = 1 reads as $personal_recommendation holds pinned by this run: personal_recommendation = 1 (not a line of the policy) 40 multiply step 39 by ask about specific fund 41 ask about specific fund*$personal_recommendation + aux_58 = 0 compiled from the policy; no position recorded 42 add step 40 to step 41 43 multiply step 42 by x40 44 x39*aux_58 + x40 + x32 = 0 policy.co:235, flow investment specific product | stop 45 multiply step 44 by aux_58 46 add step 43 to step 45 47 add step 46 to step 44 48 multiply step 42 by x32 49 add step 47 to step 48 50 x27 = 1 reads as x27 holds policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed 51 multiply step 50 by $capacity_for_loss_assessed 52 x27*$capacity_for_loss_assessed + x30 + x29 + x27 = 0 policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed 53 add step 51 to step 52 54 multiply step 53 by aux_58 55 x30*aux_58 + x31 + x24 = 0 policy.co:231, flow investment specific product | stop 56 add step 54 to step 55 57 x29 + $capacity_for_loss_assessed + x27 = 1 policy.co:229, flow investment specific product | if not $suitability_assessment_done or not $risk_profile_assessed or not $capacity_for_loss_assessed 58 multiply step 57 by aux_58 59 add step 56 to step 58 60 add step 59 to step 42 61 multiply step 60 by x32 62 x24*aux_63 + x32 + x31 = 0 policy.co:231, flow investment specific product | stop 63 multiply step 62 by aux_63 64 x30*aux_58 + aux_63 = 0 compiled from the policy; no position recorded 65 add step 64 to step 55 66 multiply step 65 by x32 67 add step 63 to step 66 68 multiply step 65 by x31 69 add step 67 to step 68 70 add step 61 to step 69 71 add step 70 to step 62 72 multiply step 65 by x24 73 add step 72 to step 62 74 add step 71 to step 73 75 add step 49 to step 74 76 multiply step 75 by x40 77 x39*aux_58 + aux_64 = 0 compiled from the policy; no position recorded 78 add step 77 to step 44 79 multiply step 78 by x32 80 x32*aux_64 + x41 + x40 = 0 policy.co:235, flow investment specific product | stop 81 add step 79 to step 80 82 add step 76 to step 81 83 multiply step 60 by x40 84 add step 82 to step 83 85 multiply step 84 by x44 86 x41*aux_66 + x44 + x43 = 0 policy.co:239, flow investment specific product | stop 87 multiply step 86 by x41 88 add step 87 to step 86 89 add step 85 to step 88 90 aux_58*aux_65 + aux_66 = 0 compiled from the policy; no position recorded 91 aux_58*aux_65 + x43 + x41 = 0 policy.co:239, flow investment specific product | stop 92 add step 90 to step 91 93 multiply step 92 by x41 94 add step 93 to step 86 95 add step 89 to step 94 96 add step 38 to step 95 97 add step 96 to step 84 98 multiply step 33 by ask about specific fund 99 multiply step 35 by ask about specific fund 100 add step 98 to step 99 101 add step 100 to step 35 102 add step 101 to step 33 103 multiply step 102 by x24 104 multiply step 60 by x24 105 add step 104 to step 73 106 add step 103 to step 105 107 add step 97 to step 106 108 add step 107 to step 60 final add step 108 to step 102 -> 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.