// VG laboratory demonstration. Synthetic data; no AI service or CRM connection. const cases = [ {id:'D01',email:'a@example.test',company:'Ornek A',topic:'ai-agent',expected:'draft'}, {id:'D02',email:'b@example.test',company:'Ornek B',topic:'crm',expected:'draft'}, {id:'D03',email:'c@example.test',company:'Ornek C',topic:'knowledge',expected:'draft'}, {id:'D04',email:'',company:'Ornek D',topic:'crm',expected:'review'}, {id:'D05',email:'not-an-email',company:'Ornek E',topic:'crm',expected:'review'}, {id:'D06',email:'f@example.test',company:'',topic:'knowledge',expected:'review'}, {id:'D07',email:'existing@example.test',company:'Ornek G',topic:'ai-agent',expected:'review'}, {id:'D08',email:'UPPER@EXAMPLE.TEST',company:'Ornek H',topic:'crm',expected:'draft'}, {id:'D09',email:' trim@example.test ',company:' Ornek I ',topic:'knowledge',expected:'draft'}, {id:'D10',email:'j@example.test',company:'Ornek J',topic:'other',expected:'draft'}, {id:'D11',email:'k@example.test',company:'Ornek K',topic:'ai-agent',expected:'draft'}, {id:'D12',email:'l@example.test',company:'Ornek L',topic:'crm',expected:'draft'} ]; function prepare(input, existing) { const email=input.email.trim().toLowerCase(); if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return {decision:'review',reason:'missing_or_invalid_email'}; if (!input.company.trim()) return {decision:'review',reason:'missing_company'}; if (existing.has(email)) return {decision:'review',reason:'duplicate'}; const queue={'ai-agent':'ai-agent',crm:'crm-otomasyon',knowledge:'kurumsal-bilgi'}[input.topic] || 'genel'; return {decision:'draft',email,company:input.company.trim(),queue}; } function mayCommit(draft, approvedByHuman, hasWritePermission) { return draft.decision==='draft' && approvedByHuman===true && hasWritePermission===true; } const existing=new Set(['existing@example.test']); const results=cases.map(c=>({id:c.id,expected:c.expected,...prepare(c,existing)})); const good=prepare(cases[0],existing), review=prepare(cases[3],existing); const controls=[ {name:'no_human_approval',actual:mayCommit(good,false,true),expected:false}, {name:'no_write_permission',actual:mayCommit(good,true,false),expected:false}, {name:'approved_and_permitted',actual:mayCommit(good,true,true),expected:true}, {name:'invalid_record_with_approval',actual:mayCommit(review,true,true),expected:false} ]; const checks=results.map(r=>r.expected===r.decision).concat(controls.map(c=>c.actual===c.expected)); const report={type:'synthetic_rule_demo',version:'2026-10-04',sample_size:cases.length,draft:results.filter(r=>r.decision==='draft').length,review:results.filter(r=>r.decision==='review').length,checks:checks.length,passed:checks.filter(Boolean).length,results,controls,limits:['Synthetic inputs, no customer data','Deterministic rules, no AI model benchmark','CRM adapter and production performance are not tested']}; console.log(JSON.stringify(report,null,2)); if(checks.some(x=>!x)) process.exitCode=1;