Beyond the page

AI RAG + Grounding Readiness Questionnaire

Who this questionnaire is for
AI builders, ML/engineering teams, knowledge/platform owners, and governance stakeholders shipping retrieval-augmented generation (RAG) or evidence-based assistants.

What it assesses
Whether your system can reliably ground outputs in permitted sources: retrieval quality, source allowlists, freshness/metadata controls, citation correctness, contradiction handling, refusal/partial answering, and exportable audit trails.

How it helps
Prevents the two classic RAG failures: confident nonsense and unclear provenance. Results show whether you can (1) retrieve the right evidence, (2) cite it correctly, and (3) refuse when evidence is missing — with logs that stand up to audit and incident review.

Best used when

  • Building a RAG assistant for teams/customers
  • Moving from “demo RAG” to production
  • Adding policy constraints (allowed sources, jurisdictions, recency)
  • Experiencing citation errors or drifting answers
/* Clickability + theme safety */ #oyez-rag-readiness{ position:relative !important; z-index:2147483647 !important; pointer-events:auto !important; isolation:isolate; max-width:980px;margin:0 auto; } #oyez-rag-readiness, #oyez-rag-readiness *{box-sizing:border-box;pointer-events:auto !important} #oyez-rag-readiness .wrap{ border:1px solid rgba(0,0,0,.12); border-radius:18px; padding:18px 18px 12px; background:rgba(255,255,255,.82); backdrop-filter:saturate(1.15) blur(10px); box-shadow:0 18px 55px rgba(0,0,0,.10); } #oyez-rag-readiness h1{font-size:28px;line-height:1.15;margin:0 0 6px;letter-spacing:-.02em} #oyez-rag-readiness .sub{opacity:.82;margin:0 0 14px;font-size:14px;line-height:1.45} /* Coverage bar */ #oyez-rag-readiness .bar{ height:10px;border-radius:999px;border:1px solid rgba(0,0,0,.14); overflow:hidden;background:rgba(0,0,0,.04); margin:10px 0 14px } #oyez-rag-readiness .bar > div{ height:100%;width:0%; background:linear-gradient(90deg, rgba(0,0,0,.88), rgba(0,0,0,.62)); transition:width .22s ease } /* Pills */ #oyez-rag-readiness .pillrow{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0 12px} #oyez-rag-readiness .pill{ display:inline-flex;align-items:center;gap:8px;padding:7px 10px;border-radius:999px; border:1px solid rgba(0,0,0,.14);background:rgba(255,255,255,.94); font-size:12px;white-space:nowrap;box-shadow:0 10px 24px rgba(0,0,0,.07) } #oyez-rag-readiness .pill b{font-weight:750} /* Meta grid */ #oyez-rag-readiness .meta{display:grid;grid-template-columns:repeat(12,1fr);gap:10px;margin:14px 0 10px} #oyez-rag-readiness label{display:block;font-weight:650;font-size:13px;margin:0 0 6px} #oyez-rag-readiness input[type=”text”], #oyez-rag-readiness select{ width:100%;padding:10px 10px;border-radius:12px;border:1px solid rgba(0,0,0,.16); background:rgba(255,255,255,.96);font:inherit;font-size:14px;line-height:1.35;outline:none; box-shadow:0 10px 22px rgba(0,0,0,.06) } #oyez-rag-readiness .span-4{grid-column:span 4} #oyez-rag-readiness .span-8{grid-column:span 8} @media (max-width:860px){ #oyez-rag-readiness .meta{grid-template-columns:repeat(6,1fr)} #oyez-rag-readiness .span-4, #oyez-rag-readiness .span-8{grid-column:span 6} } /* Score row */ #oyez-rag-readiness .scoreRow{display:flex;gap:12px;flex-wrap:wrap;align-items:stretch;margin:12px 0 6px} #oyez-rag-readiness .scoreBox{ flex:0 0 auto;min-width:240px; border:1px solid rgba(0,0,0,.12);border-radius:16px;background:#fff; padding:12px;box-shadow:0 16px 40px rgba(0,0,0,.09) } #oyez-rag-readiness .scoreLabel{font-size:13px;opacity:.78} #oyez-rag-readiness .scoreBig{font-size:42px;font-weight:900;line-height:1;margin-top:6px} #oyez-rag-readiness .scoreMax{font-size:13px;opacity:.78;margin-top:4px} #oyez-rag-readiness .answered{font-size:13px;opacity:.82;margin-top:8px} #oyez-rag-readiness .tierBox{ flex:1;min-width:260px; border:1px solid rgba(0,0,0,.12);border-radius:16px;background:#fff; padding:12px;box-shadow:0 16px 40px rgba(0,0,0,.09) } #oyez-rag-readiness .tierLabel{font-size:13px;opacity:.78} #oyez-rag-readiness .tierVal{font-size:18px;font-weight:900;margin-top:6px} #oyez-rag-readiness .tierNote{font-size:13px;opacity:.82;line-height:1.45;margin-top:6px} /* Sections + Qs */ #oyez-rag-readiness .sec{border-top:1px solid rgba(0,0,0,.12);padding:14px 0 6px} #oyez-rag-readiness .sec h2{font-size:18px;margin:0 0 8px} #oyez-rag-readiness .q{ border:1px solid rgba(0,0,0,.12); border-radius:16px; padding:12px; background:rgba(255,255,255,.97); margin:10px 0; box-shadow:0 14px 34px rgba(0,0,0,.07) } #oyez-rag-readiness .qtitle h3{font-size:15px;margin:0;line-height:1.35} #oyez-rag-readiness .opts{display:grid;grid-template-columns:repeat(12,1fr);gap:10px;margin-top:10px} #oyez-rag-readiness .opt{ grid-column:span 6; border:1px solid rgba(0,0,0,.12); border-radius:16px; padding:12px; background:#fff; box-shadow:0 14px 34px rgba(0,0,0,.06); cursor:pointer; display:flex;gap:10px;align-items:flex-start; transition:transform .06s ease, box-shadow .12s ease, border-color .12s ease; } #oyez-rag-readiness .opt:hover{transform:translateY(-1px);box-shadow:0 18px 42px rgba(0,0,0,.10)} #oyez-rag-readiness .opt input[type=”radio”]{margin-top:3px;transform:scale(1.05);flex:0 0 auto} #oyez-rag-readiness .opt .txt strong{display:block;font-size:13px} #oyez-rag-readiness .opt.selected{border-color:rgba(0,0,0,.35);box-shadow:0 22px 55px rgba(0,0,0,.13)} @media (max-width:860px){#oyez-rag-readiness .opt{grid-column:span 12}} /* Actions + results */ #oyez-rag-readiness .actions{display:flex;flex-wrap:wrap;gap:10px;margin:14px 0 6px;position:relative;z-index:2147483647} #oyez-rag-readiness button{ border-radius:12px;border:1px solid rgba(0,0,0,.18); padding:10px 12px;background:#fff;cursor:pointer; font:inherit;font-weight:850;font-size:14px; box-shadow:0 14px 34px rgba(0,0,0,.09) } #oyez-rag-readiness button.primary{background:rgba(0,0,0,.9);color:#fff;border-color:rgba(0,0,0,.9)} #oyez-rag-readiness button:disabled{opacity:.55;cursor:not-allowed;box-shadow:none} #oyez-rag-readiness .results{border-top:1px solid rgba(0,0,0,.12);margin-top:10px;padding-top:14px;display:none} #oyez-rag-readiness .rgrid{display:grid;grid-template-columns:repeat(12,1fr);gap:10px} #oyez-rag-readiness .card{grid-column:span 6;border:1px solid rgba(0,0,0,.12);border-radius:16px;background:#fff;padding:12px;box-shadow:0 16px 40px rgba(0,0,0,.09)} #oyez-rag-readiness .card.full{grid-column:span 12} #oyez-rag-readiness .card h4{margin:0 0 6px;font-size:14px} #oyez-rag-readiness .big{font-size:22px;font-weight:900;line-height:1.2;margin:0} #oyez-rag-readiness .muted{font-size:13px;opacity:.78;line-height:1.45;margin:6px 0 0} #oyez-rag-readiness .list{margin:8px 0 0;padding-left:18px;font-size:13px;line-height:1.45} #oyez-rag-readiness .footer{margin:10px 0 6px;font-size:12px;opacity:.7;line-height:1.45}

AI RAG & Grounding Readiness

This assessment checks whether your Retrieval-Augmented Generation system is governable: sources are controlled, retrieval is logged, answers are consistent with evidence, and failures are detectable.

Status: Not scored Coverage: 0% Score: — Decision: —
Your role (optional) — Select role — Engineering / Platform ML / Applied AI Security Risk / Legal / Compliance Product / Operations Research Other
Company or project identifier (optional)
Your score
0
out of 45
Answered 0/15
Posture
—
Answer the questions to see your posture.

Section A — Source Control

1) Do you have an explicit allowed-source policy (domains/corpora) that the system enforces?

No — open web / undefined sources
Partial — documented but not enforced
Mostly — enforced in many paths
Enforced — allowlist + audits + exceptions logged

2) Are document owners, rights, and retention rules known for every corpus?

No
Partial
Mostly
Enforced — mapped + reviewed

3) Can you control freshness (update cadence, re-indexing rules, and stale-doc handling)?

No — unknown freshness
Partial — ad-hoc updates
Mostly — cadence exists
Enforced — freshness policy + monitoring

4) Are ingestion steps deterministic and versioned (chunking, cleaning, metadata, embeddings model/version)?

No
Partial
Mostly
Enforced — versioned pipeline + change control

5) Can you prevent retrieval from unsafe corpora (PII, restricted, unreviewed) by design?

No
Partial — policy only
Mostly — filtered in many paths
Enforced — tagging + access controls + audits

Section B — Retrieval Quality & Evidence

6) Do you log retrieval evidence per response (top-k IDs, scores, timestamps, corpus/version)?

No logs
Partial — some logs
Mostly — logged for most responses
Enforced — always logged + exportable schema

7) Do you measure retrieval performance (coverage, precision, empty-retrieval rate, drift) over time?

No
Occasional checks
Regular metrics
Enforced — monitored + alert ownership

8) Do you handle empty/low-confidence retrieval safely (refuse, ask clarifying questions, or return partial with sources)?

No — still answers
Sometimes
Usually
Enforced — deterministic behaviour + tests

9) Do you have defenses against prompt injection via retrieved content (filters, tool restrictions, policy gates)?

No
Partial
Mostly
Enforced — tests + monitoring

10) Do you provide user-facing citations or evidence trails that are auditable (not cosmetic)?

No
Cosmetic citations
Mostly auditable
Enforced — citations map to logged evidence

Section C — Consistency, Testing & Operations

11) Do you run groundedness checks (answer must match retrieved evidence) and block contradictions?

No
Partial — manual reviews
Mostly — some automated checks
Enforced — automated + logged + tested

12) Do you maintain a regression suite for RAG failure paths (stale docs, empty retrieval, conflicting sources)?

No
Ad-hoc
Regular tests exist
Enforced — CI gates + coverage tracked

13) Can you reconstruct “what happened” after an incident (inputs, retrieval, versions, tool actions)?

No
Partial reconstruction
Mostly reconstructable
Enforced — deterministic reconstruction

14) Do you have alert ownership for retrieval outages, index drift, and quality drops?

No
Some alerts
Owned alerts
Enforced — SLOs + on-call + drills

15) Are changes to corpora, prompts, embedding models, and retrieval settings controlled and approved?

No
Some tracking
Mostly controlled
Enforced — change logs + approvals + rollback

Tip: A RAG system is only “trustworthy” if you can show the evidence and prove the answer is consistent with it.

Posture

—

—

Decision

—

—

Recommended next steps

    Top risks

      (function(){ function init(){ const root = document.getElementById(‘oyez-rag-readiness’); if(!root) return false; if(root.__oyezInit) return true; root.__oyezInit = true; const TOTAL=15; const bar = root.querySelector(‘#oyezRagBar’); const statusEl = root.querySelector(‘#oyezRagStatus’); const coverageEl = root.querySelector(‘#oyezRagCoverage’); const scorePillEl = root.querySelector(‘#oyezRagScorePill’); const decisionPillEl = root.querySelector(‘#oyezRagDecision’); const scoreBigEl = root.querySelector(‘#oyezRagScoreBig’); const answeredEl = root.querySelector(‘#oyezRagAnswered’); const postureTopEl = root.querySelector(‘#oyezRagPosture’); const postureTopNoteEl = root.querySelector(‘#oyezRagPostureNote’); const roleEl = root.querySelector(‘#oyezRagRole’); const orgEl = root.querySelector(‘#oyezRagOrg’); const calcBtn = root.querySelector(‘#oyezRagCalc’); const copyBtn = root.querySelector(‘#oyezRagCopy’); const emailBtn = root.querySelector(‘#oyezRagEmail’); const resetBtn = root.querySelector(‘#oyezRagReset’); const results = root.querySelector(‘#oyezRagResults’); const postureOut = root.querySelector(‘#oyezRagPostureOut’); const postureNoteOut = root.querySelector(‘#oyezRagPostureNoteOut’); const decisionOut = root.querySelector(‘#oyezRagDecisionOut’); const decisionDesc = root.querySelector(‘#oyezRagDecisionDesc’); const nextEl = root.querySelector(‘#oyezRagNext’); const risksEl = root.querySelector(‘#oyezRagRisks’); function updateSelected(){ root.querySelectorAll(‘.opt’).forEach(opt=>{ const r = opt.querySelector(‘input[type=”radio”]’); opt.classList.toggle(‘selected’, !!(r && r.checked)); }); } function answeredCount(){ let n=0; for(let i=1;i<=TOTAL;i++){ if(root.querySelector(`input[name="q${i}r"]:checked`)) n++; } return n; } function score(){ let s=0; for(let i=1;i<=TOTAL;i++){ const picked = root.querySelector(`input[name="q${i}r"]:checked`); if(picked) s += parseInt(picked.value,10); } return s; } function postureFromScore(s){ if(s<=15) return 'Ungrounded'; if(s<=30) return 'Partly grounded'; return 'Grounded'; } function pack(posture){ const packs={ "Ungrounded":{ note:"High concern. The system can produce confident answers without trustworthy evidence, and you may not be able to reconstruct failures.", decision:"Do not scale (add enforceable grounding)", decisionDesc:"Treat this as unsafe-to-scale until source controls, retrieval logging, and consistency gates are enforced and tested.", risks:[ "Answers can be produced without reliable retrieval (empty/low-confidence retrieval).", "Citations may be cosmetic and not linked to logged evidence.", "Injection or stale docs can silently steer outputs." ], next:[ "Enforce allowed sources and block unsafe corpora by design.", "Log retrieval evidence per response (top-k IDs, scores, timestamps, corpus/version).", "Add groundedness checks that refuse/return partial when evidence is weak or contradictory." ] }, "Partly grounded":{ note:"Workable posture. Main risk: enforcement gaps and weak regression testing allow silent drift and inconsistent evidence trails.", decision:"Proceed with gates + regression suite", decisionDesc:"You can proceed, but only with testable gates, failure-path regression coverage, and owned alerts for retrieval health.", risks:[ "Controls exist but aren’t consistently enforced across all paths.", "Monitoring exists without alert ownership or SLOs.", "Change control for corpora/embeddings/prompts may be incomplete." ], next:[ "Build a RAG regression suite (stale docs, conflicts, empty retrieval, injection, tool failure).", "Separate retrieval metrics vs reasoning metrics and track both over time.", "Add change logs + approvals for corpora, embedding versions, and retrieval settings." ] }, "Grounded":{ note:"Positioned to scale responsibly. Main risk: governance becoming static while corpora, retrieval settings, and threat models evolve.", decision:"Scale responsibly + continuous evaluation", decisionDesc:"Scale is appropriate — keep evaluations continuous, run periodic control reviews, and keep evidence trails exportable by default.", risks:[ "Corpus updates can change behaviour without explicit review.", "Threats evolve (injection, poisoning) faster than tests unless updated.", "Audit readiness degrades without retention/access reviews." ], next:[ "Operationalise continuous evaluation before/after changes and at fixed intervals.", "Run quarterly reviews of source allowlists, retention, and access control boundaries.", "Keep evidence trails exportable and tied to user-facing citations." ] } }; return packs[posture]; } function compute(){ updateSelected(); const ans = answeredCount(); const cov = Math.round((ans/TOTAL)*100); const s = score(); bar.style.width = cov + '%'; statusEl.textContent = ans===0 ? 'Not scored' : (ans{ const li=document.createElement(‘li’); li.textContent=x; nextEl.appendChild(li); }); risksEl.innerHTML=”; p.risks.forEach(x=>{ const li=document.createElement(‘li’); li.textContent=x; risksEl.appendChild(li); }); results.style.display=’block’; copyBtn.disabled=false; emailBtn.disabled=false; return {ans,cov,s,posture,pack:p,role:roleEl.value||’—’,org:orgEl.value||’—’}; } function summaryText(state){ const lines=[]; lines.push(‘OYEZ — AI RAG & Grounding Readiness’); lines.push(‘———————————-‘); lines.push(`Role: ${state.role}`); lines.push(`Company / Project: ${state.org}`); lines.push(”); lines.push(`Status: ${state.ans===TOTAL ? ‘Completed’ : ‘In progress’}`); lines.push(`Coverage: ${state.cov}% (${state.ans}/${TOTAL})`); lines.push(`Score: ${state.s}/45`); lines.push(`Posture: ${state.posture}`); lines.push(`Decision: ${state.pack.decision}`); lines.push(”); lines.push(state.pack.note); lines.push(”); lines.push(‘Top risks:’); state.pack.risks.forEach((r,i)=>lines.push(`${i+1}. ${r}`)); lines.push(”); lines.push(‘Recommended next steps:’); state.pack.next.forEach((n,i)=>lines.push(`${i+1}. ${n}`)); return lines.join(‘\n’); } root.addEventListener(‘change’, (e)=>{ if(e.target && e.target.matches(‘input[type=”radio”]’)) compute(); }); calcBtn.addEventListener(‘click’, (e)=>{ e.preventDefault(); compute(); }); copyBtn.addEventListener(‘click’, async (e)=>{ e.preventDefault(); const state = compute(); if(!state) return; const text = summaryText(state); try{ await navigator.clipboard.writeText(text); copyBtn.textContent=’Copied’; setTimeout(()=>copyBtn.textContent=’Copy Results’, 900); }catch(err){ const ta=document.createElement(‘textarea’); ta.value=text; document.body.appendChild(ta); ta.select(); document.execCommand(‘copy’); document.body.removeChild(ta); copyBtn.textContent=’Copied’; setTimeout(()=>copyBtn.textContent=’Copy Results’, 900); } }); emailBtn.addEventListener(‘click’, (e)=>{ e.preventDefault(); const state = compute(); if(!state) return; const subject = encodeURIComponent(`Oyez — RAG Readiness (${state.posture}, ${state.s}/45)`); const body = encodeURIComponent(summaryText(state)); window.location.href = `mailto:?subject=${subject}&body=${body}`; }); resetBtn.addEventListener(‘click’, (e)=>{ e.preventDefault(); root.querySelectorAll(‘input[type=”radio”]’).forEach(r=>r.checked=false); roleEl.value=”; orgEl.value=”; compute(); root.scrollIntoView({behavior:’smooth’, block:’start’}); }); compute(); return true; } if(!init()){ let tries=0; const t=setInterval(()=>{ tries++; if(init() || tries>=50) clearInterval(t); }, 100); } })();