Skip links

✦ CAF Checklist

Apply CAF to Your Content Strategy

Find the layer that’s breaking your content, ensure your brand, product, and content get cited and mentioned by AI systems like Google's AI Mode & Overview, ChatGPT, Gemini, Perplexity, Claude, and more.

CAF Checklist — Missive Digital
0 / 45
Not scored
CAF Checklist
45 Structural Signals for AI-Citable Content
The operational version of the Citation Architecture Framework. Apply it to any page, layer by layer, in under 20 minutes.
This checklist is derived from Missive Digital's Citation Architecture Framework. Read the framework at missivedigital.com/citation-architecture-framework/ before your first pass.
5Layers
45Signals
4Score tiers
  1. Work through one layer at a time. Each tab is a complete audit for that layer.
  2. High-priority signals first. Fix High before Medium. Low signals are improvements, not blockers.
  3. Pass only. Check a signal only when it is fully met. Partial compliance is a fail.
  4. Start with your highest-traffic page, then cascade to the next two or three in the same topic cluster.
  5. Revisit quarterly. AI citation criteria evolve. A page that passes today may need a recheck in six months.
If your page scores below 28, start a GEO Audit before investing further in content production.
Complete all layers to see your tier
Answer questions above to generate your score
Work through each layer tab and check every signal that fully passes.
0
/ 45
Score by layer
Signal map Teal = Pass
Scoring guide
38–45
Citation-Ready
Strong foundation. Monitor, maintain, and extend to the next page in the cluster.
28–37
Contender
Most layers are functioning. Two or three High-priority signals are likely failing. Fix those first.
18–27
Structurally Weak
Multiple layers need work. Prioritise Claim and Answer layers first, fastest fix time, highest citation impact.
0–17
Not Citable
The page is not structured for AI citation at any layer. A full CAF audit and retrofit is required before further content investment.
Score below 28?
A GEO Audit from Missive identifies which layers are failing across your full content library, and what to fix first. In our audits, the Claim and Answer layers fail most frequently. Both have the fastest fix time.
Get a Free GEO Audit missivedigital.com
${l.name.replace('The ','').replace(' Layer','')}0/${l.total}`; tabNav.appendChild(t); });// Score tab const st = document.createElement('button'); st.className = 'tab'; st.id = 'caftab-score'; st.setAttribute('onclick', 'cafSwitchTab("score")'); st.innerHTML = `
Score0/45`; tabNav.appendChild(st);// Build layer pages LAYERS.forEach(l => { const pg = document.createElement('div'); pg.className = 'layer-page' + (l.id===1?' active':''); pg.id = `cafpage-${l.id}`;const priClass = {High:'pri-high', Medium:'pri-med', Low:'pri-low'};let signals = l.signals.map(s => `
${String(s.n).padStart(2,'0')}
${s.t}
${s.p}
If failing
${s.f}
`).join('');pg.innerHTML = `
${l.id}
${l.name}
${l.tagline}
0 / ${l.total}
${l.remember ? `
Remember
${l.remember}
` : ''}
#
Signal
Priority
Pass
${signals}
${l.closing ? `
${l.closing}
` : ''}
`;layerPages.appendChild(pg);// Build bottom tab nav (mirror of top tabs) const bottomNav = pg.querySelector(`#cafBottomNav-${l.id}`); if(bottomNav){ LAYERS.forEach(bl => { const bt = document.createElement('button'); bt.className = 'tab' + (bl.id===l.id?' active':''); bt.id = `cafbtab-${l.id}-${bl.id}`; bt.setAttribute('onclick', `cafSwitchTab(${bl.id})`); bt.innerHTML = `
${bl.id}
${bl.name.replace('The ','').replace(' Layer','')}0/${bl.total}`; bottomNav.appendChild(bt); }); const bst = document.createElement('button'); bst.className = 'tab'; bst.setAttribute('onclick', 'cafSwitchTab("score")'); bst.innerHTML = `
Score0/45`; bottomNav.appendChild(bst); } });// Build score page layer rows const lsr = document.getElementById('cafLayerScoreRows'); LAYERS.forEach((l,i) => { const row = document.createElement('div'); row.className = 'ls-row'; row.innerHTML = `
${l.name.replace('The ','')}
0/${l.total}
`; lsr.appendChild(row); });cafBuildSignalMap(); }function cafBuildSignalMap(){ const sm = document.getElementById('cafSignalMap'); sm.innerHTML = ''; LAYERS.forEach((l) => { const lbl = document.createElement('div'); lbl.className = 'ssl-dot layer-label'; lbl.textContent = 'L'+l.id; sm.appendChild(lbl); l.signals.forEach(s => { const d = document.createElement('div'); d.className = 'ssl-dot' + (cafChecks[s.n] ? ' passed' : ''); d.id = `cafsm-${s.n}`; d.textContent = String(s.n).padStart(2,'0'); sm.appendChild(d); }); }); }window.cafSwitchTab = function(id){// REMOVE ACTIVE FROM ALL PAGES document.querySelectorAll('.layer-page').forEach(page=>{ page.classList.remove('active'); });// REMOVE ACTIVE FROM ALL TOP TABS document.querySelectorAll('#cafTabNav .tab').forEach(tab=>{ tab.classList.remove('active'); });// REMOVE ACTIVE FROM ALL BOTTOM TABS document.querySelectorAll('.bottom-tabs .tab').forEach(tab=>{ tab.classList.remove('active'); });// IF SCORE TAB if(id === 'score'){// SHOW SCORE PAGE document.getElementById('cafPageScore').classList.add('active');// ACTIVATE TOP SCORE TAB document.getElementById('caftab-score').classList.add('active');// ACTIVATE ALL BOTTOM SCORE TABS document.querySelectorAll('.bottom-tabs').forEach(nav=>{ const lastTab = nav.lastElementChild; if(lastTab){ lastTab.classList.add('active'); } });// UPDATE SCORE PAGE cafUpdateScorePage();} else {// SHOW SELECTED PAGE document.getElementById(`cafpage-${id}`).classList.add('active');// ACTIVATE TOP TAB document.getElementById(`caftab-${id}`).classList.add('active');// ACTIVATE ALL MATCHING BOTTOM TABS document.querySelectorAll(`[id^="cafbtab-"][id$="-${id}"]`).forEach(tab=>{ tab.classList.add('active'); }); }// SAVE ACTIVE TAB cafActiveTab = id; };window.cafToggle = function(num, cb){ cafChecks[num] = cb.checked; const mainRow = document.getElementById(`cafmain-${num}`); const sigText = document.getElementById(`cafst-${num}`); const row = document.getElementById(`cafrow-${num}`);if(cb.checked){ mainRow.classList.add('checked'); sigText.classList.add('checked'); row.classList.add('passed'); } else { mainRow.classList.remove('checked'); sigText.classList.remove('checked'); row.classList.remove('passed'); } cafUpdateScores(); };function cafUpdateScores(){let total = 0;LAYERS.forEach(l => {let layerScore = 0;l.signals.forEach(s => { if(cafChecks[s.n]) layerScore++; });total += layerScore;const pct = Math.round((layerScore / l.total) * 100);// TOP PROGRESS const lp = document.getElementById(`caflp-${l.id}`); const lpv = document.getElementById(`caflpv-${l.id}`);// TOP TAB COUNT const tc = document.getElementById(`caftc-${l.id}`);// SCORE PAGE BARS const lsb = document.getElementById(`caflsb-${l.id}`); const lsv = document.getElementById(`caflsv-${l.id}`);if(lp) lp.style.width = pct + '%';if(lpv){ lpv.textContent = `${layerScore} / ${l.total}`; }// UPDATE TOP TAB COUNT if(tc){ tc.textContent = `${layerScore}/${l.total}`; }// UPDATE ALL BOTTOM TAB COUNTS document.querySelectorAll(`[id^="cafbtc-"][id$="-${l.id}"]`).forEach(el=>{ el.textContent = `${layerScore}/${l.total}`; });// SCORE PAGE if(lsb){ lsb.style.width = pct + '%'; }if(lsv){ lsv.textContent = `${layerScore}/${l.total}`; }});// GLOBAL SCORE const totalPct = Math.round((total / 45) * 100);document.getElementById('globalFill').style.width = totalPct + '%';document.getElementById('globalScore').textContent = `${total} / 45`;// TOP SCORE TAB document.getElementById('caftc-score').textContent = `${total}/45`;// BOTTOM SCORE TABS document.querySelectorAll('.bottom-tabs').forEach(nav=>{const scoreTab = nav.lastElementChild;if(scoreTab){const count = scoreTab.querySelector('.tab-count');if(count){ count.textContent = `${total}/45`; } }});// TIER const tier = TIERS.find(t => total >= t.min) || TIERS[TIERS.length - 1];const tb = document.getElementById('globalTier');tb.textContent = tier.label;tb.className = 'tier-badge' + (tier.label === 'Citation-Ready' ? ' ready' : '');// SIGNAL MAP LAYERS.forEach(l => {l.signals.forEach(s => {const d = document.getElementById(`cafsm-${s.n}`);if(d){ d.className = 'ssl-dot' + (cafChecks[s.n] ? ' passed' : ''); }});});// UPDATE SCORE PAGE if(cafActiveTab === 'score'){ cafUpdateScorePage(); }}function cafUpdateScorePage(){ let total = 0; LAYERS.forEach(l => l.signals.forEach(s => { if(cafChecks[s.n]) total++; }));const tier = TIERS.find(t => total >= t.min) || TIERS[TIERS.length-1]; const pct = total/45; const circ = 201.1;document.getElementById('cafScoreBig').textContent = total; document.getElementById('cafScoreTierLabel').textContent = tier.label; document.getElementById('cafScoreTierLabel').style.color = tier.color; document.getElementById('cafScoreHeadline').textContent = tier.head; document.getElementById('cafScoreSub').textContent = tier.sub;const rf = document.getElementById('cafRingFg'); rf.style.strokeDashoffset = circ - (pct * circ); rf.style.stroke = tier.ring;['caftier1','caftier2','caftier3','caftier4'].forEach(id => { document.getElementById(id).classList.remove('active-tier'); }); if(total>=38) document.getElementById('caftier4').classList.add('active-tier'); else if(total>=28) document.getElementById('caftier3').classList.add('active-tier'); else if(total>=18) document.getElementById('caftier2').classList.add('active-tier'); else document.getElementById('caftier1').classList.add('active-tier'); }window.cafToggleHow = function(){ const b = document.getElementById('howBody'); const t = document.getElementById('howToggle'); const ch = t.querySelector('.chevron'); b.classList.toggle('open'); t.classList.toggle('open'); if(ch) ch.style.transform = b.classList.contains('open') ? 'rotate(180deg)' : 'rotate(0deg)'; };window.cafResetAll = function(){ LAYERS.forEach(l => l.signals.forEach(s => { cafChecks[s.n] = false; const cb = document.getElementById(`cafcb-${s.n}`); if(cb) cb.checked = false; document.getElementById(`cafmain-${s.n}`)?.classList.remove('checked'); document.getElementById(`cafst-${s.n}`)?.classList.remove('checked'); document.getElementById(`cafrow-${s.n}`)?.classList.remove('passed'); })); cafUpdateScores(); document.getElementById('globalTier').textContent = 'Not scored'; document.getElementById('globalTier').className = 'tier-badge'; document.getElementById('cafScoreTierLabel').textContent = 'Complete all layers to see your tier'; document.getElementById('cafScoreTierLabel').style.color = 'var(--text-3)'; document.getElementById('cafScoreHeadline').textContent = 'Answer questions above to generate your score'; document.getElementById('cafScoreSub').textContent = 'Work through each layer tab and check every signal that fully passes.'; document.getElementById('cafScoreBig').textContent = '0'; const rf = document.getElementById('cafRingFg'); rf.style.strokeDashoffset = '201.1'; rf.style.stroke = '#1D9E75'; ['caftier1','caftier2','caftier3','caftier4'].forEach(id => document.getElementById(id).classList.remove('active-tier')); };cafBuildUI();})();
Explore
Drag