REFUTATION ========== policy policy.co sha256 470bfaea5ca9297edde3c6f9dd1287ac090b0db94091edd9bf067c4d63c22ec5 parse clean: the circuit carries every edge the file describes unroll none question can respond with permitted mortgage answer fire with has_mortgage_permission false? pin respond with permitted mortgage answer = 1 (action) pin has_mortgage_permission = 0 (obligation) pin names_specific_product = 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 mortgage advice intent, policy.co:133 | define user ask mortgage advice $personal_recommendation context, policy.co:209, flow investment specific product | if $is_factual_information_only and not $personal_recommendation and not $is_inducement $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 $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 $names_specific_product context, policy.co:247, flow investment generic advice | if $is_generic_asset_class_only and not $names_specific_product x6 gate, policy.co:416, flow mortgage gate | if $personal_recommendation or $names_specific_product defined as x6 + $personal_recommendation + $names_specific_product = 0 x7 gate, policy.co:416, flow mortgage gate | if $personal_recommendation or $names_specific_product defined as x7 + $personal_recommendation*$names_specific_product + x6 = 0 x9 gate, policy.co:417, flow mortgage gate | if not $firm_is_authorised or not $has_mortgage_permission defined as x9 = 1 x10 gate, policy.co:417, flow mortgage gate | if not $firm_is_authorised or not $has_mortgage_permission defined as x10 + x9*aux_20 = 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:424, flow mortgage gate | stop defined as x11 + $suitability_assessment_done*aux_21 + x10 + aux_21 = 0 x12 gate, policy.co:424, flow mortgage gate | stop defined as x12 + x10*aux_22 + x11 = 0 $vulnerability_identified context, policy.co:426, flow mortgage gate | if $vulnerability_identified and not $fair_value_assessed x14 gate, policy.co:428, flow mortgage gate | stop defined as x14 + x12 + aux_21*aux_23 = 0 x15 gate, policy.co:428, flow mortgage gate | stop defined as x15 + x12*aux_24 + x14 = 0 $execution_only_positive_election context, policy.co:430, flow mortgage gate | if not $personal_recommendation and not $execution_only_positive_election x17 gate, policy.co:433, flow mortgage gate | stop defined as x17 + $names_specific_product*aux_26 + x15 = 0 x18 gate, policy.co:433, flow mortgage gate | stop defined as x18 + x15*aux_27 + x17 = 0 respond with permitted mortgage answer action, policy.co:435, flow mortgage gate | bot respond with permitted mortgage answer defined as respond with permitted mortgage answer + ask mortgage advice + ask mortgage advice*x18 = 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_20 aux defined as aux_20 + ask mortgage advice*x7 = 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_21 aux defined as aux_21 + ask mortgage 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_22 aux defined as aux_22 + $suitability_assessment_done*aux_21 + aux_21 = 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_23 aux defined as aux_23 + $fair_value_assessed*$vulnerability_identified + $vulnerability_identified = 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_24 aux defined as aux_24 + aux_21*aux_23 = 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_25 aux defined as aux_25 + $personal_recommendation + $personal_recommendation*$execution_only_positive_election + $execution_only_positive_election = 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_26 aux defined as aux_26 + ask mortgage advice*aux_25 = 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_27 aux defined as aux_27 + $names_specific_product*aux_26 = 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 mortgage advice*x18 + respond with permitted mortgage answer + ask mortgage advice = 0 policy.co:435, flow mortgage gate | bot respond with permitted mortgage answer 2 multiply step 1 by x18 3 respond with permitted mortgage answer = 1 reads as respond with permitted mortgage answer holds pinned by this run: respond with permitted mortgage answer = 1 (not a line of the policy) 4 multiply step 3 by x18 5 add step 2 to step 4 6 multiply step 5 by x15 7 x15*aux_27 + x18 + x17 = 0 policy.co:433, flow mortgage gate | stop 8 multiply step 7 by x15 9 add step 8 to step 7 10 add step 6 to step 9 11 $names_specific_product*aux_26 + aux_27 = 0 compiled from the policy; no position recorded 12 $names_specific_product*aux_26 + x17 + x15 = 0 policy.co:433, flow mortgage gate | stop 13 add step 11 to step 12 14 multiply step 13 by x15 15 add step 14 to step 7 16 add step 10 to step 15 17 multiply step 16 by x12 18 x12*aux_24 + x15 + x14 = 0 policy.co:428, flow mortgage gate | stop 19 multiply step 18 by x12 20 add step 19 to step 18 21 add step 17 to step 20 22 aux_21*aux_23 + aux_24 = 0 compiled from the policy; no position recorded 23 aux_21*aux_23 + x14 + x12 = 0 policy.co:428, flow mortgage gate | stop 24 add step 22 to step 23 25 multiply step 24 by x12 26 add step 25 to step 18 27 add step 21 to step 26 28 $names_specific_product = 1 reads as $names_specific_product holds pinned by this run: names_specific_product = 1 (not a line of the policy) 29 multiply step 28 by $personal_recommendation 30 $personal_recommendation*$names_specific_product + x7 + x6 = 0 policy.co:416, flow mortgage gate | if $personal_recommendation or $names_specific_product 31 add step 29 to step 30 32 multiply step 31 by ask mortgage advice 33 ask mortgage advice*x7 + aux_20 = 0 compiled from the policy; no position recorded 34 add step 32 to step 33 35 x6 + $names_specific_product + $personal_recommendation = 0 policy.co:416, flow mortgage gate | if $personal_recommendation or $names_specific_product 36 multiply step 35 by ask mortgage advice 37 add step 34 to step 36 38 multiply step 28 by ask mortgage advice 39 add step 37 to step 38 40 x9 = 1 reads as x9 holds policy.co:417, flow mortgage gate | if not $firm_is_authorised or not $has_mortgage_permission 41 multiply step 40 by aux_20 42 x9*aux_20 + x10 = 0 policy.co:417, flow mortgage gate | if not $firm_is_authorised or not $has_mortgage_permission 43 add step 41 to step 42 44 add step 39 to step 43 45 multiply step 44 by x11 46 $suitability_assessment_done*aux_21 + aux_22 + aux_21 = 0 compiled from the policy; no position recorded 47 $suitability_assessment_done*aux_21 + aux_21 + x11 + x10 = 0 policy.co:424, flow mortgage gate | stop 48 add step 46 to step 47 49 multiply step 48 by x10 50 x10*aux_22 + x12 + x11 = 0 policy.co:424, flow mortgage gate | stop 51 add step 49 to step 50 52 add step 45 to step 51 53 multiply step 1 by ask mortgage advice 54 multiply step 3 by ask mortgage advice 55 add step 53 to step 54 56 add step 55 to step 1 57 add step 56 to step 3 58 multiply step 57 by x11 59 add step 52 to step 58 60 add step 27 to step 59 61 add step 60 to step 44 final add step 61 to step 57 -> 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.