Data quality • source review — Apply explicit required-field, identifier-uniqueness and allowed-value rules to the same rows, trace each failed rule to source records…

HTML for this example

Select the code and use your copy shortcut. Changes in this preview are temporary.

<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Data quality • source review</title><style>*{box-sizing:border-box}body{margin:0;background:var(--bg,#eef3f6);color:#172a39;font:16px/1.5 system-ui,sans-serif}main{max-width:1200px;margin:auto;padding:28px}h1{font-size:clamp(27px,4vw,42px);line-height:1.12;margin:8px 0 12px;letter-spacing:-.035em}h2{font-size:23px;line-height:1.2;margin:0 0 18px}h3{font-size:17px;margin:14px 0 8px}p{margin:8px 0 16px}.eyebrow{font-size:12px;text-transform:uppercase;letter-spacing:.15em;font-weight:800;color:var(--accent,#176b71)}.lead{max-width:75ch;color:#405568}.panel{background:#fff;border:1px solid #cdd9e1;border-radius:14px;padding:24px;margin:18px 0}.grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.wide{grid-template-columns:1.6fr 1fr}.metric-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.metric{border-left:4px solid var(--accent,#176b71);background:#f4f8fa;padding:18px}.big{display:block;font-size:36px;font-weight:800;line-height:1.2}.muted,small{color:#536879;font-size:14px}.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}button{background:var(--accent,#176b71);color:white;border:2px solid transparent;border-radius:8px;padding:10px 16px;min-height:44px;cursor:pointer;font:inherit;font-weight:650}button.secondary{background:#e8eff4;color:#172a39}button:disabled{opacity:.48;cursor:default}button[aria-pressed=true]{outline:3px solid #172a39;outline-offset:2px}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:3px solid #de7616;outline-offset:3px}label{display:block;font-weight:650;margin:12px 0 6px}input,select,textarea{font:inherit;color:inherit;border:1px solid #8b9eae;border-radius:6px;background:white;padding:10px;width:100%;min-height:44px}textarea{resize:vertical;min-height:110px}input[type=checkbox]{width:22px;min-height:22px;vertical-align:middle}table{border-collapse:collapse;width:100%;font-size:14px}th{text-align:left;background:#eff4f7;color:#3d5261}th,td{padding:12px;border-bottom:1px solid #dce5eb;vertical-align:top}.scroll{overflow-x:auto}caption{text-align:left;margin-bottom:12px;font-weight:700}.notice{background:#eef5f9;border-left:4px solid #628ba1;padding:14px;margin:14px 0}.error{color:#9c2924;font-weight:650}.pill{display:inline-block;border-radius:30px;padding:4px 10px;background:#e5f3ee;color:#17614f;font-size:13px;font-weight:750}.draft{white-space:pre-wrap;font:17px/1.65 Georgia,serif}.rule{display:block;width:100%;text-align:left;margin:10px 0}.rule strong{font-size:26px}details{margin:18px 0}summary{cursor:pointer;font-weight:700;padding:12px;background:#e9eff3;border-radius:6px;min-height:44px}footer{margin:30px 0;color:#536879;font-size:14px}ol,ul{padding-left:23px}.time-input{max-width:90px}.section-no{font-size:52px;color:#b5c8d5;font-weight:800;line-height:1}.tag{font-weight:700;color:var(--accent,#176b71)}[hidden]{display:none!important}@media(max-width:760px){main{padding:18px}.grid,.wide{grid-template-columns:1fr}.metric-grid{grid-template-columns:1fr}.panel{padding:18px}.big{font-size:30px}th,td{padding:9px}}:root{--accent:#14698a;--bg:#edf2f7}#rules{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}#rules .metric{padding:14px}#rules .big{font-size:30px}@media(max-width:760px){#rules{grid-template-columns:1fr}}</style></head><body><main>
<span class="eyebrow">Operations / fictional five-row specimen</span><h1>Data quality, with the evidence attached.</h1><p class="lead">Inspect each rule’s failures without changing the source records.</p>
<div class="grid wide"><section class="panel"><div class="row"><span class="pill" id="scope-label">5 rows evaluated</span><button type="button" id="full-data" class="secondary">Full specimen</button><button type="button" id="empty-data" class="secondary">Empty dataset</button></div><div id="rules"></div><div class="metric-grid"><div class="metric">Failure instances<strong class="big" id="instances"></strong></div><div class="metric">Distinct affected rows<strong class="big" id="affected"></strong></div><div class="metric">Evaluation denominator<strong class="big" id="denominator"></strong></div></div><p class="muted">A row can fail more than one rule. These are separate measures, not an average quality score.</p></section>
<section class="panel"><h2 id="detail-title"></h2><p id="detail-summary" aria-live="polite"></p><div id="failure-list"></div><div class="row"><button type="button" id="owner-rule">Inspect owner</button><button type="button" id="unique-rule" class="secondary">Inspect uniqueness</button><button type="button" id="status-rule" class="secondary">Inspect status</button><button type="button" id="affected-rule" class="secondary">All affected rows</button></div></section></div>
<section class="panel"><h2>Immutable source rows</h2><label for="display-filter">Display filter only — evaluation stays on the selected dataset</label><select id="display-filter"><option value="all">All source rows</option><option value="B">Business ID B only</option><option value="clean">Rows with no failed rules</option></select><div class="scroll"><table><thead><tr><th>Source row</th><th>Business ID</th><th>Owner</th><th>Status</th><th>Failed rules</th></tr></thead><tbody id="source-body"></tbody></table></div></section>
<section class="panel"><h2>Correction review, not a source edit</h2><p id="review-target"></p><label for="evidence">Evidence to seek</label><input id="evidence" type="text" value="Confirm the owner in the authorized source record."><label for="proposal">Proposed change (not applied)</label><input id="proposal" type="text" value=""><label for="decision">Actual authorized decision</label><input id="decision" type="text" value=""><label for="verification">Verification evidence</label><input id="verification" type="text" value=""><label for="review-text">Review note for manual copying</label><textarea id="review-text" readonly></textarea><button type="button" id="select-review-text" class="secondary">Select text</button><p id="review-text-status" class="muted">Select the text, then use your device’s copy command. Nothing is saved.</p></section>
<details><summary>Rule definitions and boundaries</summary><p>Owner must be nonblank. Business ID must occur exactly once in the evaluated dataset; both occurrences of B fail. Status must be exactly Open or Closed. All five rows are evaluated for each rule. A present owner is not proof that the name is accurate.</p><p>An empty evaluated dataset has an undefined pass rate. Display filters never change the evaluation denominator. This companion does not repair, delete, deduplicate or write to a workbook.</p></details></main><script>const $=id=>document.getElementById(id);const on=(id,fn)=>$(id).addEventListener('click',fn);const text=(id,value)=>$(id).textContent=value;const bind=(id,fn,event='input')=>$(id).addEventListener(event,fn);const selectText=id=>{if(!$(id).value){text(id+'-status','Complete the required fields before selecting text.');return;}$(id).focus();$(id).select();text(id+'-status','Text selected. Use your device’s copy command; nothing has been sent or saved.');};
const raw=Object.freeze([{sourceRow:1,businessID:'A',owner:'Kim',status:'Open'},{sourceRow:2,businessID:'B',owner:'Lee',status:'Open'},{sourceRow:3,businessID:'B',owner:'',status:'Closed'},{sourceRow:4,businessID:'D',owner:'Sam',status:'Hold'},{sourceRow:5,businessID:'E',owner:'Tay',status:'Closed'}].map(Object.freeze));let empty=false,chosen='owner';const labels={owner:'Owner present',unique:'Unique business ID',status:'Allowed status'};function evaluate(rows){const count={};rows.forEach(r=>count[r.businessID]=(count[r.businessID]||0)+1);return rows.map(r=>({...r,failed:[...(!r.owner.trim()?['owner']:[]),...(count[r.businessID]!==1?['unique']:[]),...(!['Open','Closed'].includes(r.status)?['status']:[])]}));}function summary(rows){const evaluated=evaluate(rows);return {rows:evaluated,n:rows.length,instances:evaluated.reduce((n,r)=>n+r.failed.length,0),affected:evaluated.filter(r=>r.failed.length),rules:Object.keys(labels).map(k=>({key:k,pass:evaluated.filter(r=>!r.failed.includes(k)).length,fail:evaluated.filter(r=>r.failed.includes(k))}))};}function review(){const s=summary(empty?[]:raw);const ids=(chosen==='affected'?s.affected:s.rules.find(r=>r.key===chosen).fail).map(r=>r.sourceRow);text('review-target','Source row(s): '+(ids.join(', ')||'none')+' · Rule: '+(labels[chosen]||'all failed rules'));$('review-text').value=$('review-target').textContent+'\nEvidence sought: '+$('evidence').value+'\nProposed change (not applied): '+($('proposal').value||'[not supplied]')+'\nActual decision: '+($('decision').value||'[not supplied]')+'\nVerification: '+($('verification').value||'[not supplied]');}function render(){const s=summary(empty?[]:raw);text('scope-label',s.n+' rows evaluated');text('instances',String(s.instances));text('affected',String(s.affected.length));text('denominator',String(s.n));$('rules').innerHTML=s.rules.map(r=>'<p class="metric"><b>'+labels[r.key]+'</b><strong class="big">'+(s.n?(100*r.pass/s.n).toFixed(0)+'%':'Undefined')+'</strong>'+r.pass+' of '+s.n+' pass</p>').join('');text('detail-title',labels[chosen]||'All affected rows');const failures=chosen==='affected'?s.affected:s.rules.find(r=>r.key===chosen).fail;text('detail-summary',!s.n?'No rows evaluated; pass rate undefined.':chosen==='affected'?s.affected.length+' distinct affected rows: '+s.affected.map(r=>r.sourceRow).join(', '):s.rules.find(r=>r.key===chosen).pass+' of '+s.n+' pass. Failed source rows: '+(failures.map(r=>r.sourceRow).join(', ')||'none')+'.');$('failure-list').innerHTML=failures.map(r=>'<p class="notice">Row '+r.sourceRow+' · '+r.businessID+'<br>All failed rules: '+r.failed.map(k=>labels[k]).join('; ')+'</p>').join('');const f=$('display-filter').value;const visible=s.rows.filter(r=>f==='all'||f==='B'&&r.businessID==='B'||f==='clean'&&!r.failed.length);$('source-body').innerHTML=visible.map(r=>'<tr><td>'+r.sourceRow+'</td><td>'+r.businessID+'</td><td>'+(r.owner||'[blank]')+'</td><td>'+r.status+'</td><td>'+(r.failed.map(k=>labels[k]).join('; ')||'None')+'</td></tr>').join('');review();}for(const k of Object.keys(labels))on(k+'-rule',()=>{chosen=k;render();});on('affected-rule',()=>{chosen='affected';render();});on('full-data',()=>{empty=false;render();});on('empty-data',()=>{empty=true;render();});bind('display-filter',render,'change');['evidence','proposal','decision','verification'].forEach(k=>bind(k,review));on('select-review-text',()=>selectText('review-text'));render();globalThis.app={evaluate,summary,raw,get:()=>({empty,chosen})};</script></body></html>