Beyond the page

AI Change, Drift & Incident Review Questionnaire

Who this questionnaire is for
Operational teams, AI platform owners, incident response leads, SREs, and governance teams reviewing live systems or post-incident behaviour.

What it assesses
Operational risk in deployed AI systems — including drift detection, incident handling, rollback authority, escalation paths, evidence retention, and post-incident learning.

How it helps
This questionnaire functions as a live operational review tool. It supports decisions to continue, pause, rollback, or re-approve AI systems after changes, incidents, or observed drift. Outputs are designed to be recorded, shared, and referenced as part of operational governance.

Best used when

  • Reviewing incidents or near-misses
  • Assessing readiness after model or data changes
  • Determining whether systems can safely remain in production
/* Make the entire block clickable even under aggressive themes */ #oyez-change-drift-incident-review{ position:relative !important; z-index:2147483647 !important; pointer-events:auto !important; isolation:isolate; } #oyez-change-drift-incident-review, #oyez-change-drift-incident-review *{ pointer-events:auto !important; } #oyez-change-drift-incident-review{font:inherit;color:inherit;max-width:980px;margin:0 auto} #oyez-change-drift-incident-review *{box-sizing:border-box} #oyez-change-drift-incident-review .q-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); position:relative; } #oyez-change-drift-incident-review h1{font-size:28px;line-height:1.15;margin:0 0 6px;letter-spacing:-.02em} #oyez-change-drift-incident-review .sub{opacity:.82;margin:0 0 14px;font-size:14px;line-height:1.45} #oyez-change-drift-incident-review .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-change-drift-incident-review .bar > div{height:100%;width:0%;background:linear-gradient(90deg, rgba(0,0,0,.88), rgba(0,0,0,.62));transition:width .22s ease} #oyez-change-drift-incident-review .pillrow{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0 12px} #oyez-change-drift-incident-review .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-change-drift-incident-review .pill b{font-weight:750} #oyez-change-drift-incident-review .note{font-size:13px;opacity:.85;line-height:1.5;margin:0 0 10px} #oyez-change-drift-incident-review .meta{display:grid;grid-template-columns:repeat(12,1fr);gap:10px;margin:14px 0 10px} #oyez-change-drift-incident-review label{display:block;font-weight:650;font-size:13px;margin:0 0 6px} #oyez-change-drift-incident-review input[type=”text”], #oyez-change-drift-incident-review select, #oyez-change-drift-incident-review textarea{ 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-change-drift-incident-review textarea{min-height:84px;resize:vertical} #oyez-change-drift-incident-review .span-3{grid-column:span 3} #oyez-change-drift-incident-review .span-4{grid-column:span 4} #oyez-change-drift-incident-review .span-6{grid-column:span 6} #oyez-change-drift-incident-review .span-12{grid-column:span 12} @media (max-width:860px){ #oyez-change-drift-incident-review .meta{grid-template-columns:repeat(6,1fr)} #oyez-change-drift-incident-review .span-3, #oyez-change-drift-incident-review .span-4, #oyez-change-drift-incident-review .span-6{grid-column:span 6} } #oyez-change-drift-incident-review .sec{border-top:1px solid rgba(0,0,0,.12);padding:14px 0 6px} #oyez-change-drift-incident-review .sec h2{font-size:18px;margin:0 0 8px} #oyez-change-drift-incident-review .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-change-drift-incident-review .qtitle{display:flex;gap:10px;align-items:flex-start;justify-content:space-between} #oyez-change-drift-incident-review .qtitle h3{font-size:15px;margin:0;line-height:1.35} #oyez-change-drift-incident-review .tag{ font-size:11px;opacity:.72;border:1px solid rgba(0,0,0,.12); padding:4px 8px;border-radius:999px;white-space:nowrap;background:#fff } #oyez-change-drift-incident-review .help{font-size:13px;opacity:.78;margin:6px 0 10px;line-height:1.45} /* Options: polished cards, BUT keep native radios visible */ #oyez-change-drift-incident-review .opts{display:grid;grid-template-columns:repeat(12,1fr);gap:10px} #oyez-change-drift-incident-review .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); transition:transform .06s ease, box-shadow .12s ease, border-color .12s ease; cursor:pointer; display:flex; gap:10px; align-items:flex-start; } #oyez-change-drift-incident-review .opt:hover{transform:translateY(-1px);box-shadow:0 18px 42px rgba(0,0,0,.10)} #oyez-change-drift-incident-review .opt input[type=”radio”]{ margin-top:3px; transform:scale(1.05); flex:0 0 auto; } #oyez-change-drift-incident-review .opt .txt strong{display:block;font-size:13px} #oyez-change-drift-incident-review .opt .txt span{display:block;font-size:12px;opacity:.78;margin-top:4px;line-height:1.35} #oyez-change-drift-incident-review .opt.selected{border-color:rgba(0,0,0,.35);box-shadow:0 22px 55px rgba(0,0,0,.13)} @media (max-width:860px){#oyez-change-drift-incident-review .opt{grid-column:span 12}} #oyez-change-drift-incident-review .actions{ display:flex;flex-wrap:wrap;gap:10px;margin:14px 0 6px; position:relative; z-index:2147483647; } #oyez-change-drift-incident-review 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-change-drift-incident-review button.primary{background:rgba(0,0,0,.9);color:#fff;border-color:rgba(0,0,0,.9)} #oyez-change-drift-incident-review button:disabled{opacity:.55;cursor:not-allowed;box-shadow:none} #oyez-change-drift-incident-review .results{border-top:1px solid rgba(0,0,0,.12);margin-top:10px;padding-top:14px} #oyez-change-drift-incident-review .rgrid{display:grid;grid-template-columns:repeat(12,1fr);gap:10px} #oyez-change-drift-incident-review .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-change-drift-incident-review .card.full{grid-column:span 12} #oyez-change-drift-incident-review .card h4{margin:0 0 6px;font-size:14px} #oyez-change-drift-incident-review .big{font-size:22px;font-weight:900;line-height:1.2;margin:0} #oyez-change-drift-incident-review .muted{font-size:13px;opacity:.78;line-height:1.45;margin:6px 0 0} #oyez-change-drift-incident-review .list{margin:8px 0 0;padding-left:18px;font-size:13px;line-height:1.45} #oyez-change-drift-incident-review .footer{margin:10px 0 6px;font-size:12px;opacity:.7;line-height:1.45}

AI Change, Drift & Incident Review

Scores automatically as you click. The top fields are optional — only the questions affect scoring.

Status: Not scored Coverage: 0% Score: — Decision: —

Optional fields: these improve your governance record, but are not required to score.

System / Product name (optional)
System owner (optional)
Review date (optional)
Risk tier (optional) SelectLowMediumHighCritical
Review trigger (optional) SelectScheduled cadenceModel updateData / source updatePrompt / policy changeTooling / workflow changeIncident / near-miss
Change / incident summary (optional)
Notes (optional)

1) Change Classification & Re-approval Triggers

Is there a clear classification of the change (minor vs material), with a documented decision and owner?

Change gating
Material changes should trigger re-evaluation and possibly re-approval.
YesChange class, owner, and rationale documented.
PartialInformal classification or missing rationale/owner.
NoNo clear classification or governance gating.

Are re-approval triggers defined (and actually used) for the system?

Release control
Examples: new model, new retrieval domains, new tools/actions, new user groups.
YesTriggers exist and were applied for this change.
PartialTriggers exist but inconsistently applied.
NoNo defined re-approval triggers.

2) Drift Monitoring & Post-Deployment Signals

Do you measure drift with concrete signals (quality, safety, grounding, latency/cost) on an ongoing basis?

Monitoring
Drift includes retrieval/policy/prompt drift and user behaviour drift — not only model drift.
YesDashboards/alerts exist and are reviewed regularly.
PartialSome signals tracked; cadence inconsistent.
NoNo meaningful drift monitoring in production.

Are thresholds defined for “stop / rollback / investigate” and connected to operational actions?

Actionability
Monitoring without action thresholds is not governance.
YesThresholds trigger playbooks/alerts with owners.
PartialSome thresholds; actions/owners unclear.
NoNo operational thresholds for intervention.

3) Incident Response & Escalation

Is there an incident playbook specific to this AI system, including escalation paths and authority?

IR
Include who can pause the system and how evidence is preserved.
YesSystem-specific playbook + escalation paths exist.
PartialGeneral playbook exists; AI specifics incomplete.
NoNo usable incident playbook for this system.

After incidents/near-misses, do you complete a post-incident review with tracked follow-through?

Learning loop
A governance system that cannot learn from incidents will repeat them.
YesReviews are standard; actions tracked to completion.
PartialReviews happen; follow-through inconsistent.
NoNo consistent post-incident review process.

4) Evidence, Logging & Auditability

Can you reconstruct what the system did for a given event (inputs, context, outputs, tool actions)?

Evidence
Logging should be privacy-aware and access controlled.
YesEvent reconstruction is possible with logs + access controls.
PartialSome logs exist; reconstruction incomplete.
NoNo reliable reconstruction capability.

If the system uses retrieval (RAG), do you capture retrieval evidence (sources, top-k, scores) per response?

RAG
Governed RAG requires evidence of what was retrieved.
YesRetrieval evidence is captured and reviewable.
PartialSome retrieval logging; missing detail/checks.
NoNo retrieval evidence in practice.

5) Access, Permissions & Operational Boundaries

Are access permissions and tool/action boundaries documented and enforced (least privilege)?

Permissions
Over-permissioning is a common governance failure.
YesLeast privilege enforced; access reviewed periodically.
PartialSome controls; reviews/boundaries incomplete.
NoPermissions/boundaries unclear or not enforced.

Are operational limits documented (rate limits, cost caps, latency SLOs) with escalation when exceeded?

Ops limits
Operational limits prevent silent failure modes.
YesLimits monitored with escalation paths.
PartialSome limits; monitoring/escalation incomplete.
NoNo operational limits or escalation.

6) Decision & Required Actions

Can you justify “continue / monitor / re-approve / pause / rollback” with documented owners?

Decision
A governance review should end in an explicit decision and ownership.
YesDecision documented with owners and deadlines.
PartialDecision implied; owners/deadlines unclear.
NoNo clear operational decision or ownership.

Are remediation actions tracked (ticketed) and verified before the next major release/change?

Follow-through
Governance fails when remediation is not executed.
YesActions ticketed, assigned, and verified.
PartialTracked informally; verification inconsistent.
NoNo tracking/verification of remediation.
(function(){ const qRoot = document.getElementById(‘oyez-change-drift-incident-review’); if(!qRoot || qRoot.__oyezInit) return; qRoot.__oyezInit = true; const calcBtn = qRoot.querySelector(‘#oyezCalc’); const copyBtn = qRoot.querySelector(‘#oyezCopy’); const emailBtn = qRoot.querySelector(‘#oyezEmail’); const resetBtn = qRoot.querySelector(‘#oyezReset’); const bar = qRoot.querySelector(‘#oyezBar’); const statusEl = qRoot.querySelector(‘#oyezStatus’); const coverageEl = qRoot.querySelector(‘#oyezCoverage’); const scoreEl = qRoot.querySelector(‘#oyezScore’); const decisionEl = qRoot.querySelector(‘#oyezDecision’); const results = qRoot.querySelector(‘#oyezResults’); const overall = qRoot.querySelector(‘#oyezOverall’); const overallDesc = qRoot.querySelector(‘#oyezOverallDesc’); const rec = qRoot.querySelector(‘#oyezRec’); const recDesc = qRoot.querySelector(‘#oyezRecDesc’); const actionsEl = qRoot.querySelector(‘#oyezActions’); const noActionsEl = qRoot.querySelector(‘#oyezNoActions’); const meta = { riskTier: qRoot.querySelector(‘#riskTier’), sysName: qRoot.querySelector(‘#sysName’), sysOwner: qRoot.querySelector(‘#sysOwner’), reviewDate: qRoot.querySelector(‘#reviewDate’), reviewType: qRoot.querySelector(‘#reviewType’), changeSummary: qRoot.querySelector(‘#changeSummary’), notes: qRoot.querySelector(‘#notes’), }; const questions = Array.from(qRoot.querySelectorAll(‘.q[data-q]’)).map(q => q.getAttribute(‘data-q’)); function updateSelected(){ qRoot.querySelectorAll(‘.opt’).forEach(opt=>{ const r = opt.querySelector(‘input[type=”radio”]’); opt.classList.toggle(‘selected’, !!(r && r.checked)); }); } function getAnsweredCount(){ let n=0; for(const q of questions){ const picked = qRoot.querySelector(`input[name=”${q}”]:checked`); if(picked) n++; } return n; } function compute(){ updateSelected(); const answered = getAnsweredCount(); const total = questions.length; const coverage = total ? Math.round((answered/total)*100) : 0; let sum=0, reds=0, partials=0; for(const q of questions){ const picked = qRoot.querySelector(`input[name=”${q}”]:checked`); if(!picked) continue; const v = parseInt(picked.value,10); sum += v; if(v===0) reds++; if(v===1) partials++; } const pct = total ? Math.round((sum/(total*2))*100) : 0; const risk = (meta.riskTier.value || ”).toLowerCase(); const highRisk = (risk===’high’ || risk===’critical’); let status=’Not scored’, decision=’—’, overallLabel=’—’, overallText=’Answer questions to score.’, recLabel=’—’, recText=’—’; if(answered>0){ const severe = (reds>=2) || (reds>=1 && highRisk) || (pct=3) || (pct<80)); if(severe){ status='High concern'; decision='Pause / rollback / re-approve'; overallLabel='High concern'; overallText='Controls are insufficient for ongoing operation after this change/incident.'; recLabel='Pause or rollback'; recText='Pause, rollback, or require full re-approval before continuing; preserve evidence and execute the playbook.'; } else if(moderate){ status='Needs remediation'; decision='Continue with remediation + deadlines'; overallLabel='Needs remediation'; overallText='Core controls exist, but meaningful gaps increase operational and audit risk.'; recLabel='Continue with remediation'; recText='Continue only with remediation actions, owners, and deadlines; re-review after fixes.'; } else { status='Good standing'; decision='Continue operating'; overallLabel='Good standing'; overallText='Controls support continued operation. Maintain monitoring and keep evidence current.'; recLabel='Continue operating'; recText='Continue with standard monitoring, periodic review cadence, and documented outcomes.'; } } const actionMap = { q1:'Document change classification (minor vs material), owner, and rationale in the governance record/change ticket.', q2:'Define and apply re-approval triggers for this system; document which trigger applies to this change.', q3:'Implement/strengthen drift monitoring (quality, safety, grounding, latency/cost) with a regular review cadence.', q4:'Set operational thresholds for intervention (stop/rollback/investigate) and connect them to playbooks and owner alerts.', q5:'Create a system-specific incident playbook with escalation paths and authority (pause/kill-switch).', q6:'Formalize post-incident reviews with tracked remediation actions and verification before the next release.', q7:'Ensure event reconstruction is possible: retain inputs, context, outputs, and tool actions with access controls and retention policy.', q8:'Capture retrieval evidence per response (sources, top-k, scores) and support audit review and consistency checks.', q9:'Enforce least privilege: document and review access permissions and tool/action boundaries periodically.', q10:'Define operational limits (rate, cost, latency/SLOs) and escalation paths when exceeded.', q11:'Document the operational decision (continue/monitor/re-approve/pause/rollback) with owners and deadlines.', q12:'Track remediation actions in tickets; assign owners; verify completion before next major change.', }; const requiredActions=[]; for(const q of questions){ const picked = qRoot.querySelector(`input[name="${q}"]:checked`); if(!picked) continue; const v = parseInt(picked.value,10); if(v{ const li=document.createElement(‘li’); li.textContent=a; actionsEl.appendChild(li); }); } else { noActionsEl.style.display=’block’; } results.style.display = answered ? ‘block’ : ‘none’; copyBtn.disabled = (answered===0); emailBtn.disabled = (answered===0); return {answered,total,coverage,pct,status,decision,requiredActions}; } function buildSummary(state){ const lines=[]; lines.push(‘OYEZ — AI Change, Drift & Incident Review (Operational)’); lines.push(‘——————————————————‘); lines.push(`System: ${meta.sysName.value || ‘—’}`); lines.push(`Owner: ${meta.sysOwner.value || ‘—’}`); lines.push(`Review date: ${meta.reviewDate.value || ‘—’}`); lines.push(`Risk tier: ${meta.riskTier.value || ‘—’}`); lines.push(`Trigger: ${meta.reviewType.value || ‘—’}`); lines.push(`Summary: ${meta.changeSummary.value || ‘—’}`); lines.push(”); lines.push(`Coverage: ${state.coverage}% (${state.answered}/${state.total})`); lines.push(`Score: ${state.pct}%`); lines.push(`Status: ${state.status}`); lines.push(`Decision: ${state.decision}`); lines.push(”); lines.push(‘Required actions:’); if(state.requiredActions.length){ state.requiredActions.forEach((a,i)=>lines.push(`${i+1}. ${a}`)); } else { lines.push(‘None generated. Continue monitoring and document the outcome.’); } if(meta.notes.value && meta.notes.value.trim()){ lines.push(”); lines.push(‘Notes:’); lines.push(meta.notes.value.trim()); } return lines.join(‘\n’); } // Auto-score on every answer qRoot.addEventListener(‘change’, function(e){ if(e.target && e.target.type === ‘radio’) compute(); }); calcBtn.addEventListener(‘click’, function(e){ e.preventDefault(); compute(); }); copyBtn.addEventListener(‘click’, async function(e){ e.preventDefault(); const state = compute(); if(!state.answered) return; const text = buildSummary(state); try{ await navigator.clipboard.writeText(text); copyBtn.textContent=’Copied’; setTimeout(()=>copyBtn.textContent=’Copy Summary’, 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 Summary’, 900); } }); emailBtn.addEventListener(‘click’, function(e){ e.preventDefault(); const state = compute(); if(!state.answered) return; const subject = encodeURIComponent(‘Oyez — AI Change, Drift & Incident Review (Operational)’); const body = encodeURIComponent(buildSummary(state)); window.location.href = `mailto:?subject=${subject}&body=${body}`; }); resetBtn.addEventListener(‘click’, function(e){ e.preventDefault(); questions.forEach(q=>{ const checked = qRoot.querySelector(`input[name=”${q}”]:checked`); if(checked) checked.checked=false; }); Object.values(meta).forEach(el=>{ if(el){ el.value=”; }}); bar.style.width=’0%’; statusEl.textContent=’Not scored’; coverageEl.textContent=’0%’; scoreEl.textContent=’—’; decisionEl.textContent=’—’; results.style.display=’none’; copyBtn.disabled=true; emailBtn.disabled=true; updateSelected(); }); // First paint compute(); })();