const fields=new Set(['itemsAndSpecs','documentChecklist','qualificationCriteria','criticalRequirements','risksAndPenalties','criticalDetails','disqualificationRisks','deadlines','roadmap']); export function verifyAnalysisCitations(result,source) { const evidence=[]; for(const citation of Array.isArray(result.citations)?result.citations:[]) { const match=/^([A-Za-z]+)\.(\d+)$/.exec(String(citation?.path || '')); if(!match || !fields.has(match[1]) || !Array.isArray(result[match[1]]) || Number(match[2])>=result[match[1]].length)continue; const quote=String(citation.quote || '').trim(); if(quote.length<12 || quote.length>1500)continue; const start=source.indexOf(quote); evidence.push({path:citation.path,quote,status:start<0?'not_found':source.indexOf(quote,start+1)>=0?'ambiguous':'located', start:start<0?null:start,end:start<0?null:start+quote.length}); } const missing=[]; for(const field of fields)for(let i=0;i<(Array.isArray(result[field])?result[field].length:0);i++) if(!evidence.some(e=>e.path===`${field}.${i}` && e.status==='located'))missing.push(`${field}.${i}`); return {evidence,missing}; }