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) 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_58 = 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 = 1 $is_targeted_support context, policy.co:220, flow investment specific product | if not $is_targeted_support x13 gate, policy.co:222, flow investment specific product | stop defined as x13 + x9 + $is_targeted_support*aux_60 + aux_60 = 0 x14 gate, policy.co:222, flow investment specific product | stop defined as x14 + x9*aux_61 + x13 = 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 x17 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 x17 + $has_targeted_support_permission + $consumer_segment_predefined = 0 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 + $has_targeted_support_permission*$consumer_segment_predefined + $consumer_segment_predefined + x17 = 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 x20 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 x20 + x18 + $suggestion_is_ready_made = 1 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 + x18 + x18*$suggestion_is_ready_made + x20 = 0 x22 gate, policy.co:227, flow investment specific product | stop defined as x22 + x14 + x21*aux_62 = 0 x23 gate, policy.co:227, flow investment specific product | stop defined as x23 + x14*aux_63 + x22 = 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 x26 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 x26 + $suitability_assessment_done + $risk_profile_assessed = 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 + $suitability_assessment_done + $suitability_assessment_done*$risk_profile_assessed + $risk_profile_assessed + x26 = 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 + x23 + x30*aux_59 = 0 x32 gate, policy.co:231, flow investment specific product | stop defined as x32 + x23*aux_64 + 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_59 = 0 x41 gate, policy.co:235, flow investment specific product | stop defined as x41 + x32*aux_65 + 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_59*aux_66 = 0 x44 gate, policy.co:239, flow investment specific product | stop defined as x44 + x41*aux_67 + 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_68 = 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*$personal_recommendation + 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 + $suitability_assessment_done + $capacity_for_loss_assessed = 0 x52 gate, policy.co:255, flow investment generic advice | if not $suitability_assessment_done or not $capacity_for_loss_assessed defined as x52 + $suitability_assessment_done + $suitability_assessment_done*$capacity_for_loss_assessed + $capacity_for_loss_assessed + x51 = 1 x53 gate, policy.co:257, flow investment generic advice | stop defined as x53 + ask investment advice*x52 + x50 = 0 x54 gate, policy.co:257, flow investment generic advice | stop defined as x54 + x50*aux_70 + x53 = 0 x55 gate, policy.co:259, flow investment generic advice | bot respond with permitted investment answer defined as x55 + ask investment advice + ask investment advice*x54 + 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 + x55 = 0 aux_57 aux defined as aux_57 + $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_58 aux defined as aux_58 + ask about specific fund*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 + 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_60 aux defined as aux_60 + x11*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_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 + $is_targeted_support*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_63 aux defined as aux_63 + x21*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_64 aux defined as aux_64 + x30*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_65 aux defined as aux_65 + x39*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_66 aux defined as aux_66 + $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_67 aux defined as aux_67 + aux_59*aux_66 = 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 + $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_69 aux defined as aux_69 + 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_70 aux defined as aux_70 + ask investment advice*x52 = 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*x54 = 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 $has_advising_permission = 0 reads as $has_advising_permission does not hold pinned by this run: has_advising_permission = 0 (not a line of the policy) 2 multiply step 1 by respond with permitted investment answer 3 $has_advising_permission*respond with permitted investment answer = 1 the proposed repair, appended by this check final add step 2 to step 3 -> 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.