The HTTP scan found `+(r.agent&&r.agent.webmcp&&r.agent.webmcp.found?`a source marker`:`no source marker`)+`. Browser Run runtime discovery is a separate observation.
`+e(t.detail||`No runtime WebMCP tools were observed.`)+`
`,a+=`
Use node scripts/lens-webmcp.mjs `+e(r.finalUrl||r.url)+` on the current machine for a Chrome-beta lab probe.
`;return n(`Runtime WebMCP`,i,`What a browser session can discover after the page runs.`,a)}function s(n,r){var i=r&&r.anatomy;if(!i||i.rawBytes==null)return``;var a=(n.content||``).length;if(n.contentTruncated)return`
HTTP vs rendered: `+e(t(i.rawBytes))+` → ≥`+e(t(a))+` (the rendered body hit the capture cap). A word-level comparison needs the full body, so Lens leaves it uncounted.
`;var o=i.wordCount||0,s=(n.content||``).replace(/<(script|style|noscript|template|svg)[\s\S]*?<\/\1>/gi,` `).replace(/<[^>]+>/g,` `).split(/\s+/).filter(Boolean).length,c=Math.abs(s-o)<=Math.max(10,o*.15)?`The HTTP fetch already carries this page; JavaScript changes little a reader needs.`:s>Math.max(o*3,o+150)?`This page is thin until JavaScript runs: a plain fetch gets `+o+` of the `+s+` words a browser ends up with.`:`JavaScript reshapes this page: the rendered copy disagrees with the HTTP fetch.`;return`
`}function c(c,l){var u=c.accessibilityTree,d={status:c.status==null?`unknown`:c.status,title:c.title||`(untitled)`,"final URL":c.finalUrl||c.url,"rendered HTML":t((c.content||``).length)+(c.contentTruncated?` (capped)`:``),"rendered Markdown":t((c.markdown||``).length),"accessibility nodes":u?a(u):`not returned`,observation:c.cached?`KV cache`:`fresh Browser Run`,elapsed:(c.elapsedMs||0)+` ms`},f=s(c,l);return f+=n(`Browser facts`,{text:c.status==null?`rendered`:String(c.status),kind:`ok`},`A rendered observation after page JavaScript. It is not folded into the AadharshBot HTTP readiness score.`,r(d)),c.screenshot&&(f+=n(`Rendered screenshot`,{text:`PNG`,kind:`ok`},`The viewport after the Browser Run page load.`,``)),f+=o(c.webmcp,l),f+=n(`Rendered HTML`,{text:t((c.content||``).length)},`The DOM returned after Browser Run executed the page. This is source evidence, shown escaped.`,i(c.content||`(no content)`)),f+=n(`Rendered Markdown`,{text:t((c.markdown||``).length)},`The browser's clean text representation, separate from Lens's dependency-free HTTP reconstruction.`,i(c.markdown||`(no Markdown)`)),u&&(f+=n(`Accessibility tree`,{text:a(u)+` nodes`,kind:`ok`},`The browser's structured view of roles, names, states, and hierarchy.`,i(JSON.stringify(u,null,2)))),f}function l(e,t,n,r){if(!t){e.innerHTML=`
Paste a URL above, then ask Browser Run to render it here.
Third surface: the rendered browser. This is separate from the HTTP Machine view and the Human view in your own browser.
It runs page JavaScript and returns rendered HTML, a screenshot, Markdown, an accessibility tree, and a runtime WebMCP result when the browser exposes one. It does not execute site tools.
Cloudflare Browser Run is opening a rendered session…
`,fetch(`/lens/browser?url=`+encodeURIComponent(n.finalUrl||n.url)).then(function(e){return e.json().then(function(t){if(!e.ok||!t||!t.ok)throw Error(t&&t.error||`Browser Run returned `+e.status);return t})}).then(r).catch(function(n){t.innerHTML=`
Browser Run could not render this URL: `+e(n&&n.message||n)+`
`;var r=document.getElementById(`lx-browser-run`);r&&r.addEventListener(`click`,a),i(n)})}window.LensBrowser={mount:l,run:u}})();
\ No newline at end of file
diff --git a/src/dict/a-dict/lens-browser.62f8bf05.js b/src/dict/a-dict/lens-browser.62f8bf05.js
new file mode 100644
index 000000000..16d4516c7
--- /dev/null
+++ b/src/dict/a-dict/lens-browser.62f8bf05.js
@@ -0,0 +1,2 @@
+/*! minified at deploy - readable source: /lens-browser.src.js */
+(function(){"use strict";function e(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function t(e){return String(e??``).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`)}function n(e){return e==null?`?`:e<1024?e+` B`:e<1048576?(e/1024).toFixed(1)+` KB`:(e/1048576).toFixed(2)+` MB`}function r(e){return e==null?`?`:e>=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`k`:String(e)}function i(e,n,r,i){var a=n?` `+t(n.text)+``:``,o=r?`
The HTTP scan found `+(n.agent&&n.agent.webmcp&&n.agent.webmcp.found?`a source marker`:`no source marker`)+`. Browser Run runtime discovery is a separate observation.
`+t(e.detail||`No runtime WebMCP tools were observed.`)+`
`,a+=`
Use node tools/lens-webmcp.mjs `+t(n.finalUrl||n.url)+` on the current machine for a Chrome-beta lab probe.
`;return i(`Runtime WebMCP`,r,`What a browser session can discover after the page runs.`,a)}function l(e,t){return t?Math.min(100,Math.round(e/t*100)):null}function u(e,t){var n=[];return e.jsonld!=null&&n.push([e.jsonld,`JSON-LD block`]),e.headings!=null&&n.push([e.headings,`heading`]),e.links!=null&&n.push([e.links,`link`]),n.map(function(e){return e[0]+` `+e[1]+(e[0]===1?``:`s`)}).join(` · `)}function d(e,r){var i=r&&r.anatomy;if(!i||i.rawBytes==null)return``;var a=(e.content||``).length,o=i.wordCount||0,s=e.tally;if(!s){if(e.contentTruncated)return`
HTTP vs rendered: `+t(n(i.rawBytes))+` → ≥`+t(n(a))+` (the rendered body hit the capture cap). A word-level comparison needs the full body, so Lens leaves it uncounted.
`;s={words:(e.content||``).replace(/<(script|style|noscript|template|svg)[\s\S]*?<\/\1>/gi,` `).replace(/<[^>]+>/g,` `).split(/\s+/).filter(Boolean).length}}var c=s.words||0,d=l(o,c),f=d===null?`The render returned no readable text, so there is nothing to compare against the HTTP fetch.`:Math.abs(c-o)<=Math.max(10,o*.15)?`A crawler that never runs JavaScript sees essentially all of this page.`:c`+d+`% of this page: `+o+` of the `+c+` words a browser ends up with.`,p=u(s,i);return`
`}var f=[{id:`expand`,label:`Open collapsed sections`,claim:`Opens every disclosure widget, then re-reads the page.`},{id:`consent`,label:`Remove the consent overlay`,claim:`Removes large fixed overlays worded like a consent or newsletter wall. Presses nothing.`}];function p(){return`
After interaction:
Lens runs one fixed, published script in its own copy of the page, then re-reads it. Each click spends one of your three renders a minute.
`+f.map(function(e){return``}).join(``)+`
`}function m(e,n,r){var i=e.interaction;if(!i)return``;var a;if(i.note===`no-receipt`){var o=r&&r.headers&&(r.headers[`content-security-policy`]||r.headers[`Content-Security-Policy`])||``;a=/script-src/i.test(o)?`The injected script never ran. This page's Content-Security-Policy refuses inline script, so Lens could not interact with it — which is itself something a machine learns about this page.`:`The injected script did not run, and the HTTP response carried no policy that explains it. Lens does not know why.`}else if(i.note===`forged-receipt`)a=`This page returned a forged result marker for a script Lens did not run. Lens discarded it. That is worth knowing on its own.`;else if(i.note===`threw`)a=`The script ran and threw inside this page, so Lens is not claiming it changed anything.`;else if(!i.acted)a=`Nothing to do here. Lens examined `+(i.scanned||0)+` candidate`+(i.scanned===1?``:`s`)+` and none matched.`;else{var s=i.acted,c=s+` element`+(s===1?``:`s`),l=e.tally&&e.tally.words||0,u=n&&n.tally?n.tally.words:i.before?i.before.words:null;if(u==null)a=``+c+` changed. Lens has no plain snapshot to measure this against, so it is not claiming a delta.`;else if(l<=u)a=``+c+` changed and the page did not grow. The wall was cosmetic — the text was already there for a machine.`;else{var d=Math.min(100,Math.round((l-u)/l*100));a=``+c+` changed, and the page went from `+u+` to `+l+` words: `+d+`% of what a machine can now read was behind something it cannot click.`}}var f=[];return i.scanned&&f.push(i.scanned+` candidate`+(i.scanned===1?``:`s`)+` examined`),e.engine&&f.push(`engine: `+t(e.engine)),f.push(e.cached?`KV cache`:`fresh Browser Run`),`
After “`+t(i.label)+`”: `+a+`
`+f.join(` · `)+`
`+(i.id===`consent`&&i.acted?`
Lens removed the overlay from its own copy of the page. It did not accept, refuse, or record any consent choice. If this was a paywall, you are looking at a page the publisher did not intend to show you, and Lens will not fetch anything further.
`}function h(e,n){return!e||!e.screenshot||!n.screenshot?``:i(`Before and after`,{text:`PNG`,kind:`ok`},`The same page, rendered twice: once as delivered, once after the script ran.`,`
`+t(/rate-limit|budget/i.test(s)?`No rendered snapshot right now: the shared Browser Run budget is spent. Everything below came from the HTTP fetch and is unaffected.`:`Browser Run could not render this URL: `+s)+`
`;if(!o)return c;var l=o.anatomy||{},u=o.structured||{},d=o.cost&&o.cost.tiers&&o.cost.tiers[0];return c+=i(`What a render would add`,{text:`not run`,kind:`warn`},`Rendered HTML after the page's JavaScript, a screenshot, the browser's own Markdown, and its accessibility tree. The gap between that and the HTTP response is this pane's whole point, and measuring it needs the render.`,``),c+=i(`What the HTTP fetch already got`,{text:`observed`,kind:`ok`},`None of this needed a browser. It is the same response every machine lens on this page is reading.`,a({status:o.status==null?`unknown`:o.status,title:u.title||`(untitled)`,"final URL":o.finalUrl||o.url,"content type":o.contentType||`(none)`,"HTTP payload":n(l.rawBytes)+(o.truncated?` (capped)`:``),"readable text":l.wordCount==null?n((l.text||``).length):l.wordCount+` words`,headings:l.headings?l.headings.length:0,"links in head":u.relLinks?u.relLinks.length:0,"cost to read":d?`~`+r(d.tokens)+` tokens of `+d.label:`not modelled`})),c}function _(e,r){var l=e.accessibilityTree,u={status:e.status==null?`unknown`:e.status,title:e.title||`(untitled)`,"final URL":e.finalUrl||e.url,"rendered HTML":n((e.content||``).length)+(e.contentTruncated?` (capped)`:``),"rendered Markdown":n((e.markdown||``).length),"accessibility nodes":l?s(l):`not returned`,observation:e.cached?`KV cache`:`fresh Browser Run`,elapsed:(e.elapsedMs||0)+` ms`},f=d(e,r);return f+=i(`Browser facts`,{text:e.status==null?`rendered`:String(e.status),kind:`ok`},`A rendered observation after page JavaScript. It is not folded into the AadharshBot HTTP readiness score.`,a(u)),e.screenshot?f+=i(`Rendered screenshot`,{text:`PNG`,kind:`ok`},`The viewport after the Browser Run page load.`,``):e.screenshotDropped&&(f+=i(`Rendered screenshot`,{text:`too large`,kind:`warn`},`Browser Run captured the page, and the full-page PNG came back at `+n(e.screenshotDropped)+` — past what this endpoint will return inline, so it was dropped. The rest of the snapshot is unaffected.`,``)),f+=c(e.webmcp,r),f+=i(`Rendered HTML`,{text:n((e.content||``).length)},`The DOM returned after Browser Run executed the page. This is source evidence, shown escaped.`,o(e.content||`(no content)`)),f+=i(`Rendered Markdown`,{text:n((e.markdown||``).length)},`The browser's clean text representation, separate from Lens's dependency-free HTTP reconstruction.`,o(e.markdown||`(no Markdown)`)),l&&(f+=i(`Accessibility tree`,{text:s(l)+` nodes`,kind:`ok`},`The browser's structured view of roles, names, states, and hierarchy.`,o(JSON.stringify(l,null,2)))),f}function v(e,t){for(var n=e.querySelectorAll(`.lx-do-chip`),r=0;rPaste a URL above, then ask Browser Run to render it here.`;return}if(n){e.innerHTML=(i?m(i,n,t):``)+p()+(i?h(n,i):``)+_(n,t),v(e,r);return}e.innerHTML=`
Third surface: the rendered browser. This is separate from the HTTP Machine view and the Human view in your own browser.
It runs page JavaScript and returns rendered HTML, a screenshot, Markdown, an accessibility tree, and a runtime WebMCP result when the browser exposes one. It does not execute site tools.
Cloudflare Browser Run is opening a rendered session`+(a?` and running the published script`:``)+`…
`,fetch(`/lens/browser?url=`+encodeURIComponent(t.finalUrl||t.url)+(a?`&do=`+encodeURIComponent(a):``)).then(function(e){return e.text().then(function(t){var n=null;try{n=JSON.parse(t)}catch{}if(!n)throw Error(`the server answered with `+(e.headers.get(`content-type`)||`an unknown body`)+` instead of a snapshot (HTTP `+e.status+`). That is the edge or the runtime failing the route, not the target page.`);if(!e.ok||!n.ok)throw Error(n.error||`Browser Run returned `+e.status);return n})}).then(n).catch(function(n){e.innerHTML=g(n,t);var a=document.getElementById(`lx-browser-run`);a&&a.addEventListener(`click`,i),r(n)})}window.LensBrowser={mount:y,run:b}})();
\ No newline at end of file
diff --git a/src/dict/a-dict/lens.32b705b8.js b/src/dict/a-dict/lens.a9ee703b.js
similarity index 99%
rename from src/dict/a-dict/lens.32b705b8.js
rename to src/dict/a-dict/lens.a9ee703b.js
index a4679eef4..7b28e5b78 100644
--- a/src/dict/a-dict/lens.32b705b8.js
+++ b/src/dict/a-dict/lens.a9ee703b.js
@@ -1,5 +1,5 @@
/*! minified at deploy - readable source: /lens.src.js */
-(function(){"use strict";function e(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function t(e){return typeof e==`string`&&e!==``?e:null}var n=document.getElementById(`lx-form`);if(!n)return;var r=document.getElementById(`lx-url`),i=document.getElementById(`lx-panes`),a=document.getElementById(`lx-human-body`),o=document.getElementById(`lx-machine-body`),s=document.getElementById(`lx-machine-top`),c=document.getElementById(`lx-machine-scroll`),l=document.getElementById(`lx-browser-body`),u=document.getElementById(`lx-machine-h`),d=document.getElementById(`lx-human-h`),f=document.getElementById(`lx-mode-note`),p=document.getElementById(`lx-status`),m=document.getElementById(`lx-toolbar`),h=document.getElementById(`lx-addr-vs`),g=document.getElementById(`lx-url-vs`),_=document.getElementById(`lx-vs-toggle`),ee=document.getElementById(`lx-vs-close`),v=document.getElementById(`lx-vs`),y=null,b=null,x=null,S=`both`,C=`anatomy`,w={markdown:!1,semantic:!1,contract:!1,authority:!1,receipt:!1,dictionary:!1,ech:!1},T=!1,E=!1,D=!1,O=!1,te=null,ne={readiness:`Agent-ready?`,anatomy:`Raw response`,reader:`Reader's guess`,wire:`What it costs`,structured:`What it claims`,ai:`Model cost`,terms:`Who's allowed`,discovery:`Agent doors`,tools:`What it accepts`},k=null,A=!1,j=null,M=!1,re=null,N=!1,P=null,F=!1;function I(e){return String(e??``).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`)}var ie=(function(){try{return JSON.parse(document.getElementById(`lx-glossary`).textContent)}catch{return{}}})(),ae=[];Object.keys(ie).forEach(function(e){[ie[e].label].concat(ie[e].alt||[]).forEach(function(t){ae.push([e,t])})}),ae.sort(function(e,t){return t[1].length-e[1].length});var oe=!1;function se(e,t){var n=ie[e];return n?``+I(t)+``:I(t)}function L(e,t){for(var n=String(e),r={},i=``,a=0;;){for(var o=null,s=0;s`+o.text+``,a=o.at+o.text.length}return i+n.slice(a)}window.matchMedia&&(matchMedia(`(hover: none)`).matches||matchMedia(`(pointer: coarse)`).matches)||import(`/a/hoist.d9081560.js`).then(function(e){var t=document.getElementById(`lx-tip`);if(t){e.createHoist({node:t,anchorName:`--lx-tip`,findTarget:function(e){return e&&e.closest?e.closest(`.lx-term`):null},contentFor:function(e){var t=ie[e.getAttribute(`data-t`)];return t?``+I(t.label)+``+I(t.plain)+(t.more?``+I(t.more)+``:``):``}}),oe=!0;for(var n=document.querySelectorAll(`.lx-term[title]`),r=0;r=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`k`:String(e)}function B(e){return e>=.1?`$`+e.toFixed(2):e>=5e-4?`$`+e.toFixed(4):e>0?`<$0.0005`:`$0`}function ce(t){return e(t)!==null&&Object.keys(t).length>0}function le(){var e=y&&y.cost,t=y&&y.readiness,n=t&&t.field,r=n&&n.overall!=null?``:``;if(!e||!e.tiers||e.tiers.length<2)return r?`
`+r+`Lens observed `+I(n.overall)+`/100 field access. The independent Cloudflare and Readability inputs sit under Agent-ready?.
`:``;var i=e.rates&&e.rates[0]||{usdPerMtok:3},a=e.tiers[0],o=e.tiers.filter(function(e){return e.key===`markdown`})[0]||e.tiers.filter(function(e){return e.key===`text`})[0]||e.tiers[e.tiers.length-1],s=a.tokens/1e6*i.usdPerMtok,c=s*1e3,l=o&&o.tokens&&o!==a?Math.round(a.tokens/o.tokens):0,u=`A person reads this page for free. A machine pays `+B(s)+` for the same words, because it chews through `+z(a.tokens)+` `+se(`token`,`tokens`)+` of raw HTML`+(l>1?`. As clean text it would cost ×`+l+` less`:``)+`. At 1,000 reads that is `+B(c)+` of inference, and the publisher collects $0.00.`;return`
`+r+u+`
`}var ue={markdownNegotiation:`Read mostly by coding agents; answer engines still scrape HTML.`,robotsTxtAiRules:`Honored by the major AI crawlers that identify themselves.`,contentSignals:`~3.8M domains publish it; Google says it changes nothing.`,webBotAuth:`Required for pay-per-crawl; almost no verifiers exist yet.`,dnsAid:`A 2026 Linux Foundation proposal; near-zero deployment.`,mcpServerCard:`MCP is the one surface here with a real consumer ecosystem.`,a2aAgentCard:`A2A discovery is early: 50+ orgs, nowhere near MCP's scale.`,apiCatalog:`An IETF linkset standard; discovery clients stay thin.`,llmsTxt:`~6% of top sites publish it; Google won't read it.`};function de(){var e=document.getElementById(`lx-initial-data`);if(!e)return null;try{return JSON.parse(e.textContent||`null`)}catch{return null}}var V=de(),fe={both:`Compare puts Human, HTTP Machine, and Browser Run side by side. Predict the machine pane; the miss is the lesson.`,human:`Human is the page as a person receives it. Every other view subtracts the person.`,machine:`Machine is an evidence-first briefing. Read claims first, then check each against its evidence.`,browser:`Browser Run renders after JavaScript beside HTTP. Disagreement reveals a JS dependency.`,delta:`Delta toggles hypothetical infrastructure. Predict, flip, check.`};function pe(){return S===`both`?`Compare`:S.charAt(0).toUpperCase()+S.slice(1)}function me(){var e=new URLSearchParams(location.search),t=[`both`,`human`,`machine`,`browser`,`delta`],n=Object.keys(ne),r={markdown:!1,semantic:!1,contract:!1,authority:!1,receipt:!1,dictionary:!1,ech:!1};return(e.get(`cf`)||``).split(`,`).forEach(function(e){Object.prototype.hasOwnProperty.call(r,e)&&(r[e]=!0)}),{url:e.get(`url`)||``,vs:e.get(`vs`)||``,view:t.indexOf(e.get(`view`))>=0?e.get(`view`):`both`,lens:n.indexOf(e.get(`lens`))>=0?e.get(`lens`):`anatomy`,counterfactuals:r}}function H(e){var t;try{t=new URL(location.href)}catch{return}t.pathname=`/lens`,[`url`,`vs`,`view`,`lens`,`cf`].forEach(function(e){t.searchParams.delete(e)});var n=r.value.trim();if(n&&t.searchParams.set(`url`,n),D&&g&&g.value.trim())t.searchParams.set(`vs`,g.value.trim());else{S!==`both`&&t.searchParams.set(`view`,S),C!==`anatomy`&&t.searchParams.set(`lens`,C);var i=Object.keys(w).filter(function(e){return w[e]});i.length&&t.searchParams.set(`cf`,i.join(`,`))}var a=t.pathname+(t.search||``)+(t.hash||``);if(a!==location.pathname+location.search+location.hash)try{(e?history.pushState:history.replaceState).call(history,null,``,a)}catch{}}function he(){var e=document.getElementById(`lx-sow-dialog`);if(e&&!e.open&&e.showModal)try{e.showModal()}catch{}}function ge(e){var t=e&&e.error||`Something went wrong.`;y=null,b=null,x=null,k=null,P=null,j=null,A=!1,F=!1,M=!1,o.innerHTML=`
`+(i.readiness===a.readiness?``+I(i.readiness)+` apiece. Same score, one rubric.`:``+I(U(i.finalUrl||i.url))+` `+I(i.readiness)+`, `+I(U(a.finalUrl||a.url))+` `+I(a.readiness)+`.`)+(o.length?` The gap is published surfaces: `+I(o.join(`, `))+`.`:` Both publish the same surfaces; the gap sits in the individual checks.`)+`
`}v.innerHTML=`
Two sites, one rubric, same evidence rules. Every number here links back to a full scan.
`,p.innerHTML=`Comparing `+I(U(e))+` and `+I(U(t))+` server-side…`,fetch(`/lens/compare.json?left=`+encodeURIComponent(e)+`&right=`+encodeURIComponent(t)).then(function(e){return e.json()}).then(function(n){O=!1,be(n),p.innerHTML=n&&n.ok?`Head-to-head`+I(U(e))+` vs `+I(U(t))+`both fetched server-side as AadharshBot`:`Comparison failed:`+I(n&&n.error||`unknown error`)+``}).catch(function(e){O=!1,v.innerHTML=`
Network error: `+I(e&&e.message||e)+`
`,p.innerHTML=`Network error.`})))}function Ce(e){g&&(g.value=``),xe(!1),e!==!1&&H(!0),y?X():p.innerHTML=`Idle. Nothing is fetched until you ask, and then just once, server-side, with no logging.`}function we(e,t){var n=document.getElementById(`lx-human-h`);n&&(n.innerHTML=`Human view `+I(e)+``+I(t)+``)}function Te(e){a.classList.toggle(`is-bleed`,!!e)}function Ee(){if(y.framable){Te(!0),we(`Live`,`loaded by your browser, like a real tab`),a.innerHTML=``;return}Oe()}function De(e,t){return e&&e.reason===`budget_spent`||t===429?null:e&&e.error&&!/^Browser Run (returned|request failed)/.test(e.error)?e.error:`A rendered snapshot needs a real headless Chrome, and this one did not come back (upstream said `+(t||`no status`)+`)`}function Oe(){var e=y.finalUrl;je(null,`Asking for a rendered snapshot as well`),fetch(`/lens/shot?url=`+encodeURIComponent(e)).then(function(t){var n=t.headers.get(`content-type`)||``;return t.ok&&n.indexOf(`image/`)===0?!y||(y.finalUrl||y.url)!==e?void 0:(Te(!0),we(`Refused`,(y.frameReason?`framing refused (`+y.frameReason+`)`:`this site refuses to be framed`)+`; a machine's render stands in`),t.blob().then(function(t){if(!(!y||(y.finalUrl||y.url)!==e)){te&&=(URL.revokeObjectURL(te),null);var n=URL.createObjectURL(t);te=n;var r=new Image;r.className=`lx-shot`,r.alt=`Rendered snapshot of `+e,r.onload=function(){te===n&&(URL.revokeObjectURL(n),te=null)},r.src=n,a.innerHTML=``,a.appendChild(r)}})):t.json().then(function(e){je(De(e,t.status)||e&&e.error||`snapshot failed (`+t.status+`)`)}).catch(function(){je(De(null,t.status)||`snapshot failed (`+t.status+`)`)})}).catch(function(){je(`The snapshot request did not go through`)})}function W(){if(!y){l.innerHTML=`
Scan a URL first.Then this pane fetches it with a real Chrome, so the site's JavaScript runs. Many pages look empty until it does.
`;return}if(!window.LensBrowser){l.innerHTML=`
Browser Run: rendered HTML, screenshot, Markdown, and accessibility tree.
`;var e=document.getElementById(`lx-browser-run`);e&&e.addEventListener(`click`,Ae);return}window.LensBrowser.mount(l,y,b,Ae,x)}function ke(){if(!(b||E||!y)&&(S===`both`||S===`browser`)){try{if(matchMedia(`(hover: none)`).matches||matchMedia(`(pointer: coarse)`).matches)return}catch{}Ae()}}function Ae(e){if(E||!y)return;t(e)===null&&(e=``),E=!0;function n(){if(!window.LensBrowser){E=!1,W();return}window.LensBrowser.run(l,y,function(t){E=!1,e?x=t:b=t,W(),X()},function(e){E=!1},Ae,e)}if(window.LensBrowser){n();return}var r=document.createElement(`script`);r.src=`/a/lens-browser.821aa61e.js`,r.onload=n,r.onerror=function(){E=!1,W()},document.head.appendChild(r)}function je(e,t){Te(!1),we(`Reader`,t?`embedding blocked, so here is the readable text while a snapshot is fetched`:`embedding blocked, no snapshot, so here is the readable text`);var n=y.anatomy,r=``;if(t?r=`
`+I(t)+`…
`:e&&(r=`
`+I(String(e).replace(/\.\s*$/,``))+`. Showing the readable text instead.
`}function Pe(){var e=y.anatomy||{},t=y.structured||{},n=y.agent||{},r=n.strategy||{},i=y.discovery||{},a=y.terms||{},o=t.jsonld?t.jsonld.length:0,s=t.microdata&&t.microdata.itemtypes?t.microdata.itemtypes.length:0,c=t.rdfa&&t.rdfa.typeof?t.rdfa.typeof.length:0,l=t.microformats?t.microformats.length:0,u=[];(t.jsonld||[]).forEach(function(e){(e.types||[]).forEach(function(e){u.indexOf(e)<0&&u.push(e)})});var d,f,p,m,h=``;if(C===`readiness`){var g=y.readiness||{},_=g.field||{},ee=g.nextActions&&g.nextActions[0];d=`Field evidence focus`,f={text:_.overall==null?`unknown`:_.overall+`/100`,kind:_.overall>=75?`ok`:`warn`},p=`This is what Lens observed itself; external standards and Readability recovery join it only in Agent-ready?.`,m={"identified fetch":y.status==null?`unknown`:y.status,"bot samples":g.botViews?g.botViews.length:0,"machine door":y.agent&&y.agent.strategy?y.agent.strategy.verdict:`unknown`,"next standards gap":ee?He(ee).label:`none observed`}}else if(C===`anatomy`){var v=e.imgTotal?e.imgTotal-e.imgNoAlt+` / `+e.imgTotal+` images have alt`:`no images found`;d=`Anatomy focus`,f={text:y.status+` `+Z(y.status),kind:y.status>=200&&y.status<400?`ok`:`warn`},p=`Can a machine get a usable reading surface before it knows what the page means?`,m={response:(y.contentType||`(none)`)+` · `+R(e.rawBytes),shape:(e.headings?e.headings.length:0)+` headings · `+(e.wordCount||0)+` words`,accessibility:v,headers:Object.keys(y.headers||{}).length+` received`}}else if(C===`reader`){var b=k,x=b&&b.ok&&b.dropped?b.dropped.pct:null;d=`Reader focus`,f={text:b==null?`not run`:b.ok?x==null?`n/a`:x+`% dropped`:`failed`,kind:b==null?``:b.ok?x>=50?`warn`:`ok`:`warn`},p=`How much of this page survives a reader-mode extractor, and how much of what survives is not prose.`,m=b&&b.ok?{"as served":(b.source?b.source.words:`?`)+` words`,"extractor kept":(b.kept?b.kept.words:`?`)+` words`,"control labels kept":b.controls?b.controls.kept+` of `+b.controls.total:`not counted`,extractor:b.extractor?b.extractor.name+` `+b.extractor.version:`readability`}:{status:b==null?`not run — this lens costs a second fetch`:`extraction failed`,"what it is":`a third-party extractor's opinion, not the served bytes`,engine:`readability (Apache-2.0), in its own Worker`}}else if(C===`wire`){var S=j,w=S&&S.ok?S.thirdParty.bytesPct:null;d=`Wire focus`,f={text:S==null?`not run`:S.ok?w+`% third-party`:`failed`,kind:S==null?``:S.ok?w>=60?`warn`:w>=30?``:`ok`:`warn`},p=`What loading this page actually spends, and how much of it goes to somebody who wrote none of it.`,m=S&&S.ok?{requests:S.requests+` to `+S.hostTotal+` host`+(S.hostTotal===1?``:`s`),transferred:R(S.bytes),"third-party":S.thirdParty.requests+` requests · `+R(S.thirdParty.bytes),load:S.loadFired?S.navMs+` ms`:`load event never fired`}:{status:S==null?`not run — this lens costs a whole browser instance`:`the trace failed`,"what it is":`one cold load recorded over CDP, as a declared bot`,"why it is opt-in":`ten browser-minutes a day, shared with every other browser lens`}}else if(C===`structured`)d=`Structured focus`,f={text:o||s||c||l?`signals found`:`mostly untyped`,kind:o||s||c||l?`ok`:`off`},p=`What entities and relationships can be lifted from the markup without guessing?`,m={title:t.title||`(untitled)`,schema:o+` JSON-LD · `+s+` microdata · `+c+` RDFa`,microformats:l+` class signal`+(l===1?``:`s`),preview:ce(t.og)?`Open Graph card present`:`no Open Graph card`},u.length&&(h=Me(u.slice(0,18)));else if(C===`ai`){var T=n.mdNegotiation&&n.mdNegotiation.supported?`negotiated text/markdown`:`HTML only`,E=(y.cost&&y.cost.tiers||[]).filter(function(e){return e.key===`markdown`})[0],D=y.ai&&y.ai.directives||{};d=`AI view focus`,f={text:E?`~`+z(E.tokens)+` tok`:T,kind:E?`ok`:`warn`},p=`What a model can ingest, how much context it costs, and whether the site offers a cleaner representation.`,m={representation:T+` · `+R((y.ai&&y.ai.markdown||``).length),directives:D.metaRobots||D.xRobotsTag||D.namesAiCrawlers?`crawler signals published`:`no AI-specific signal`,curation:y.ai&&y.ai.llmsTxtPresent?`llms.txt present`:`no llms.txt`,"cheapest shortcut":E?`markdown is the selected compact read`:`none observed`}}else if(C===`terms`){var O=a.spectrum&&a.spectrum.tier||`unknown`,te=(a.scoreboard||[]).filter(function(e){return e.verdict===`block`}).length,ne=a.enforcement&&(a.enforcement.challenged?`bot challenge`:a.enforcement.blocked?`fetch refused`:`fetch passed`);d=`Terms focus`,f={text:O,kind:O===`open`?`ok`:`warn`},p=`Is reading open, merely requested, actively enforced, or priced? Published policy and observed behavior stay separate.`,m={spectrum:O,robots:a.robotsUnknown?`unknown / unreachable`:a.robotsPresent?te+` of `+(a.scoreboard||[]).length+` bots blocked`:`no robots.txt`,enforcement:ne||`not observed`,price:a.paid&&a.paid.http402?`402 Payment Required`:`no payment signal`}}else{var A=[n.mcp,n.nlweb,n.webmcp,n.agentCard,n.openapi,n.apiCatalog].filter(function(e){return e&&(e.verdict===`yes`||e.verdict===`likely`||e.verdict===`maybe`||e.present||e.found)}).length,M=(i.llmsTxt&&i.llmsTxt.ok?1:0)+(i.sitemapXml&&i.sitemapXml.ok?1:0);d=`Discovery focus`,f={text:r.verdict||`unknown`,kind:r.verdict===`agent-native`?`ok`:r.verdict===`agent-readable`?``:`warn`},p=`What can an agent discover before it has to drive the human page?`,m={strategy:r.note||r.verdict||`unknown`,"site maps":M+` of 2 found · llms.txt / sitemap.xml`,"agent doors":A+` declared or probable`,feeds:(i.feeds||[]).length+` advertised`}}return`
`+G(d,f,p,K(m)+h)+`
`}function Fe(){var e=y.anatomy||{},t=y.structured||{},n=y.discovery||{},r=y.agent||{},i=r.strategy||{},a=y.cost&&y.cost.tiers&&y.cost.tiers[0],o=y.cost&&y.cost.rates&&y.cost.rates[0]||{usdPerMtok:3},s=[];function c(e,t){s.push({kind:e,text:t})}var l=a?` (~`+z(a.tokens)+` tok, `+B(a.tokens/1e6*o.usdPerMtok)+` at `+(o.model||`Sonnet`)+` rates)`:``;c(`ok`,`GET `+(y.finalUrl||y.url)+` as an agent → `+y.status+` `+I(Z(y.status))+`, `+(y.contentType||`?`)+`, `+R(e.rawBytes)+l+`.`);var u=r.mdNegotiation;u&&u.supported?c(`ok`,`Asked for text/markdown → the site served a clean machine copy. No HTML tax.`):c(`warn`,`Asked for text/markdown → still HTML. Paying the token tax to read markup meant for a browser.`);var d=(t.jsonld||[]).length;if(d){var f=[];(t.jsonld||[]).forEach(function(e){(e.types||[]).forEach(function(e){f.indexOf(e)<0&&f.push(e)})}),c(`ok`,`Parsed structured data → `+d+` JSON-LD block`+(d===1?``:`s`)+(f.length?` (`+f.slice(0,4).join(`, `)+`)`:``)+`. Entities without guessing.`)}else c(`warn`,`Looked for a typed entity graph → none. Any structure must be inferred from the prose.`);var p=i.action&&i.action.length;p?c(`ok`,`Probed for an action surface → `+i.action.join(`, `)+`. It can call, not just read.`):c(`warn`,`Probed for a callable contract (MCP, OpenAPI, agent-card)`+(n.agentsMd&&n.agentsMd.present?` (an AGENTS.md exists, but that's instructions, not a callable endpoint)`:``)+` → none. To do anything it must drive the human page and guess at side effects.`);var m=n.oauthProtectedResource&&n.oauthProtectedResource.ok||n.oauthDiscovery&&(n.oauthDiscovery.openidConfiguration&&n.oauthDiscovery.openidConfiguration.ok||n.oauthDiscovery.oauthAuthorizationServer&&n.oauthDiscovery.oauthAuthorizationServer.ok);m?c(`ok`,`Checked for a delegated-authority boundary → OAuth discovery present. A user could grant scoped access.`):c(`warn`,`Checked for a consent boundary → none. No scoped, revocable way to act on a user's behalf.`);var h,g;p&&m?(h=`ACT: this site was built for agents. A task with side effects can run against a real contract.`,g=`ok`):p?(h=`ACT (unsafe): an action surface exists, but with no consent boundary an agent acts without scoped permission.`,g=`warn`):(h=`BLOCKED: a task needing action can't complete. An agent can read this page, but not do anything here without a human driving a browser.`,g=`no`),c(g,`task verdict → `+h);var _=s.map(function(e){var t=e.kind===`ok`?`✓`:e.kind===`no`?`✗`:`•`;return`
`+t+``+L(I(e.text).replace(/×/g,`×`))+`
`}).join(``);return G(`Agent trace`,{text:`what an agent would do`,kind:g===`no`?`warn`:g},`One agent's attempt at a task on this URL, narrated only from evidence Lens already gathered. No model was called.`,`
Machine briefing. This is a reconstruction from the response and the probes Lens actually ran. It describes available evidence; it does not claim that a site has agreed to a new interface.
`;m+=G(`Observed document`,{text:`observed`,kind:`ok`},`The minimum contract a machine can recover from this response.`,K(p)),m+=G(`Machine affordances`,{text:i.verdict||`unknown`,kind:i.verdict===`agent-native`?`ok`:i.verdict===`agent-readable`?``:`warn`},`A readable page, a declared action surface, and permission are separate signals.`,Ne([[`read`,(y.contentType||`response`)+`, `+R(e.rawBytes),`observed`,`ok`],[`structure`,o+` JSON-LD, `+s+` microdata, `+c+` RDFa type(s)`,o||s||c?`found`:`absent`,o||s||c?`ok`:`off`],[`discover`,(n.llmsTxt&&n.llmsTxt.ok?`llms.txt`:``)+(n.sitemapXml&&n.sitemapXml.ok?` + sitemap`:``)||`site files not found`,n.llmsTxt&&n.llmsTxt.ok||n.sitemapXml&&n.sitemapXml.ok?`found`:`absent`,n.llmsTxt&&n.llmsTxt.ok||n.sitemapXml&&n.sitemapXml.ok?`ok`:`off`],[`action`,i.action&&i.action.length?i.action.join(`, `):`no declared action surface`,i.action&&i.action.length?`found`:`absent`,i.action&&i.action.length?`ok`:`off`],[`policy`,d+`; spectrum: `+f,d===`robots.txt answered`?`observed`:`unknown`,d===`robots.txt answered`?``:`warn`],[`markdown`,r.mdNegotiation&&r.mdNegotiation.supported?`same URL serves text/markdown`:`HTML response stays HTML`,r.mdNegotiation&&r.mdNegotiation.supported?`supported`:`absent`,r.mdNegotiation&&r.mdNegotiation.supported?`ok`:`off`]]));var h=`# observed
+(function(){"use strict";function e(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function t(e){return typeof e==`string`&&e!==``?e:null}var n=document.getElementById(`lx-form`);if(!n)return;var r=document.getElementById(`lx-url`),i=document.getElementById(`lx-panes`),a=document.getElementById(`lx-human-body`),o=document.getElementById(`lx-machine-body`),s=document.getElementById(`lx-machine-top`),c=document.getElementById(`lx-machine-scroll`),l=document.getElementById(`lx-browser-body`),u=document.getElementById(`lx-machine-h`),d=document.getElementById(`lx-human-h`),f=document.getElementById(`lx-mode-note`),p=document.getElementById(`lx-status`),m=document.getElementById(`lx-toolbar`),h=document.getElementById(`lx-addr-vs`),g=document.getElementById(`lx-url-vs`),_=document.getElementById(`lx-vs-toggle`),ee=document.getElementById(`lx-vs-close`),v=document.getElementById(`lx-vs`),y=null,b=null,x=null,S=`both`,C=`anatomy`,w={markdown:!1,semantic:!1,contract:!1,authority:!1,receipt:!1,dictionary:!1,ech:!1},T=!1,E=!1,D=!1,O=!1,te=null,ne={readiness:`Agent-ready?`,anatomy:`Raw response`,reader:`Reader's guess`,wire:`What it costs`,structured:`What it claims`,ai:`Model cost`,terms:`Who's allowed`,discovery:`Agent doors`,tools:`What it accepts`},k=null,A=!1,j=null,M=!1,re=null,N=!1,P=null,F=!1;function I(e){return String(e??``).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`)}var ie=(function(){try{return JSON.parse(document.getElementById(`lx-glossary`).textContent)}catch{return{}}})(),ae=[];Object.keys(ie).forEach(function(e){[ie[e].label].concat(ie[e].alt||[]).forEach(function(t){ae.push([e,t])})}),ae.sort(function(e,t){return t[1].length-e[1].length});var oe=!1;function se(e,t){var n=ie[e];return n?``+I(t)+``:I(t)}function L(e,t){for(var n=String(e),r={},i=``,a=0;;){for(var o=null,s=0;s`+o.text+``,a=o.at+o.text.length}return i+n.slice(a)}window.matchMedia&&(matchMedia(`(hover: none)`).matches||matchMedia(`(pointer: coarse)`).matches)||import(`/a/hoist.d9081560.js`).then(function(e){var t=document.getElementById(`lx-tip`);if(t){e.createHoist({node:t,anchorName:`--lx-tip`,findTarget:function(e){return e&&e.closest?e.closest(`.lx-term`):null},contentFor:function(e){var t=ie[e.getAttribute(`data-t`)];return t?``+I(t.label)+``+I(t.plain)+(t.more?``+I(t.more)+``:``):``}}),oe=!0;for(var n=document.querySelectorAll(`.lx-term[title]`),r=0;r=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`k`:String(e)}function B(e){return e>=.1?`$`+e.toFixed(2):e>=5e-4?`$`+e.toFixed(4):e>0?`<$0.0005`:`$0`}function ce(t){return e(t)!==null&&Object.keys(t).length>0}function le(){var e=y&&y.cost,t=y&&y.readiness,n=t&&t.field,r=n&&n.overall!=null?``:``;if(!e||!e.tiers||e.tiers.length<2)return r?`
`+r+`Lens observed `+I(n.overall)+`/100 field access. The independent Cloudflare and Readability inputs sit under Agent-ready?.
`:``;var i=e.rates&&e.rates[0]||{usdPerMtok:3},a=e.tiers[0],o=e.tiers.filter(function(e){return e.key===`markdown`})[0]||e.tiers.filter(function(e){return e.key===`text`})[0]||e.tiers[e.tiers.length-1],s=a.tokens/1e6*i.usdPerMtok,c=s*1e3,l=o&&o.tokens&&o!==a?Math.round(a.tokens/o.tokens):0,u=`A person reads this page for free. A machine pays `+B(s)+` for the same words, because it chews through `+z(a.tokens)+` `+se(`token`,`tokens`)+` of raw HTML`+(l>1?`. As clean text it would cost ×`+l+` less`:``)+`. At 1,000 reads that is `+B(c)+` of inference, and the publisher collects $0.00.`;return`
`+r+u+`
`}var ue={markdownNegotiation:`Read mostly by coding agents; answer engines still scrape HTML.`,robotsTxtAiRules:`Honored by the major AI crawlers that identify themselves.`,contentSignals:`~3.8M domains publish it; Google says it changes nothing.`,webBotAuth:`Required for pay-per-crawl; almost no verifiers exist yet.`,dnsAid:`A 2026 Linux Foundation proposal; near-zero deployment.`,mcpServerCard:`MCP is the one surface here with a real consumer ecosystem.`,a2aAgentCard:`A2A discovery is early: 50+ orgs, nowhere near MCP's scale.`,apiCatalog:`An IETF linkset standard; discovery clients stay thin.`,llmsTxt:`~6% of top sites publish it; Google won't read it.`};function de(){var e=document.getElementById(`lx-initial-data`);if(!e)return null;try{return JSON.parse(e.textContent||`null`)}catch{return null}}var V=de(),fe={both:`Compare puts Human, HTTP Machine, and Browser Run side by side. Predict the machine pane; the miss is the lesson.`,human:`Human is the page as a person receives it. Every other view subtracts the person.`,machine:`Machine is an evidence-first briefing. Read claims first, then check each against its evidence.`,browser:`Browser Run renders after JavaScript beside HTTP. Disagreement reveals a JS dependency.`,delta:`Delta toggles hypothetical infrastructure. Predict, flip, check.`};function pe(){return S===`both`?`Compare`:S.charAt(0).toUpperCase()+S.slice(1)}function me(){var e=new URLSearchParams(location.search),t=[`both`,`human`,`machine`,`browser`,`delta`],n=Object.keys(ne),r={markdown:!1,semantic:!1,contract:!1,authority:!1,receipt:!1,dictionary:!1,ech:!1};return(e.get(`cf`)||``).split(`,`).forEach(function(e){Object.prototype.hasOwnProperty.call(r,e)&&(r[e]=!0)}),{url:e.get(`url`)||``,vs:e.get(`vs`)||``,view:t.indexOf(e.get(`view`))>=0?e.get(`view`):`both`,lens:n.indexOf(e.get(`lens`))>=0?e.get(`lens`):`anatomy`,counterfactuals:r}}function H(e){var t;try{t=new URL(location.href)}catch{return}t.pathname=`/lens`,[`url`,`vs`,`view`,`lens`,`cf`].forEach(function(e){t.searchParams.delete(e)});var n=r.value.trim();if(n&&t.searchParams.set(`url`,n),D&&g&&g.value.trim())t.searchParams.set(`vs`,g.value.trim());else{S!==`both`&&t.searchParams.set(`view`,S),C!==`anatomy`&&t.searchParams.set(`lens`,C);var i=Object.keys(w).filter(function(e){return w[e]});i.length&&t.searchParams.set(`cf`,i.join(`,`))}var a=t.pathname+(t.search||``)+(t.hash||``);if(a!==location.pathname+location.search+location.hash)try{(e?history.pushState:history.replaceState).call(history,null,``,a)}catch{}}function he(){var e=document.getElementById(`lx-sow-dialog`);if(e&&!e.open&&e.showModal)try{e.showModal()}catch{}}function ge(e){var t=e&&e.error||`Something went wrong.`;y=null,b=null,x=null,k=null,P=null,j=null,A=!1,F=!1,M=!1,o.innerHTML=`
`+(i.readiness===a.readiness?``+I(i.readiness)+` apiece. Same score, one rubric.`:``+I(U(i.finalUrl||i.url))+` `+I(i.readiness)+`, `+I(U(a.finalUrl||a.url))+` `+I(a.readiness)+`.`)+(o.length?` The gap is published surfaces: `+I(o.join(`, `))+`.`:` Both publish the same surfaces; the gap sits in the individual checks.`)+`
`}v.innerHTML=`
Two sites, one rubric, same evidence rules. Every number here links back to a full scan.
`,p.innerHTML=`Comparing `+I(U(e))+` and `+I(U(t))+` server-side…`,fetch(`/lens/compare.json?left=`+encodeURIComponent(e)+`&right=`+encodeURIComponent(t)).then(function(e){return e.json()}).then(function(n){O=!1,be(n),p.innerHTML=n&&n.ok?`Head-to-head`+I(U(e))+` vs `+I(U(t))+`both fetched server-side as AadharshBot`:`Comparison failed:`+I(n&&n.error||`unknown error`)+``}).catch(function(e){O=!1,v.innerHTML=`
Network error: `+I(e&&e.message||e)+`
`,p.innerHTML=`Network error.`})))}function Ce(e){g&&(g.value=``),xe(!1),e!==!1&&H(!0),y?X():p.innerHTML=`Idle. Nothing is fetched until you ask, and then just once, server-side, with no logging.`}function we(e,t){var n=document.getElementById(`lx-human-h`);n&&(n.innerHTML=`Human view `+I(e)+``+I(t)+``)}function Te(e){a.classList.toggle(`is-bleed`,!!e)}function Ee(){if(y.framable){Te(!0),we(`Live`,`loaded by your browser, like a real tab`),a.innerHTML=``;return}Oe()}function De(e,t){return e&&e.reason===`budget_spent`||t===429?null:e&&e.error&&!/^Browser Run (returned|request failed)/.test(e.error)?e.error:`A rendered snapshot needs a real headless Chrome, and this one did not come back (upstream said `+(t||`no status`)+`)`}function Oe(){var e=y.finalUrl;je(null,`Asking for a rendered snapshot as well`),fetch(`/lens/shot?url=`+encodeURIComponent(e)).then(function(t){var n=t.headers.get(`content-type`)||``;return t.ok&&n.indexOf(`image/`)===0?!y||(y.finalUrl||y.url)!==e?void 0:(Te(!0),we(`Refused`,(y.frameReason?`framing refused (`+y.frameReason+`)`:`this site refuses to be framed`)+`; a machine's render stands in`),t.blob().then(function(t){if(!(!y||(y.finalUrl||y.url)!==e)){te&&=(URL.revokeObjectURL(te),null);var n=URL.createObjectURL(t);te=n;var r=new Image;r.className=`lx-shot`,r.alt=`Rendered snapshot of `+e,r.onload=function(){te===n&&(URL.revokeObjectURL(n),te=null)},r.src=n,a.innerHTML=``,a.appendChild(r)}})):t.json().then(function(e){je(De(e,t.status)||e&&e.error||`snapshot failed (`+t.status+`)`)}).catch(function(){je(De(null,t.status)||`snapshot failed (`+t.status+`)`)})}).catch(function(){je(`The snapshot request did not go through`)})}function W(){if(!y){l.innerHTML=`
Scan a URL first.Then this pane fetches it with a real Chrome, so the site's JavaScript runs. Many pages look empty until it does.
`;return}if(!window.LensBrowser){l.innerHTML=`
Browser Run: rendered HTML, screenshot, Markdown, and accessibility tree.
`;var e=document.getElementById(`lx-browser-run`);e&&e.addEventListener(`click`,Ae);return}window.LensBrowser.mount(l,y,b,Ae,x)}function ke(){if(!(b||E||!y)&&(S===`both`||S===`browser`)){try{if(matchMedia(`(hover: none)`).matches||matchMedia(`(pointer: coarse)`).matches)return}catch{}Ae()}}function Ae(e){if(E||!y)return;t(e)===null&&(e=``),E=!0;function n(){if(!window.LensBrowser){E=!1,W();return}window.LensBrowser.run(l,y,function(t){E=!1,e?x=t:b=t,W(),X()},function(e){E=!1},Ae,e)}if(window.LensBrowser){n();return}var r=document.createElement(`script`);r.src=`/a/lens-browser.62f8bf05.js`,r.onload=n,r.onerror=function(){E=!1,W()},document.head.appendChild(r)}function je(e,t){Te(!1),we(`Reader`,t?`embedding blocked, so here is the readable text while a snapshot is fetched`:`embedding blocked, no snapshot, so here is the readable text`);var n=y.anatomy,r=``;if(t?r=`
`+I(t)+`…
`:e&&(r=`
`+I(String(e).replace(/\.\s*$/,``))+`. Showing the readable text instead.
`}function Pe(){var e=y.anatomy||{},t=y.structured||{},n=y.agent||{},r=n.strategy||{},i=y.discovery||{},a=y.terms||{},o=t.jsonld?t.jsonld.length:0,s=t.microdata&&t.microdata.itemtypes?t.microdata.itemtypes.length:0,c=t.rdfa&&t.rdfa.typeof?t.rdfa.typeof.length:0,l=t.microformats?t.microformats.length:0,u=[];(t.jsonld||[]).forEach(function(e){(e.types||[]).forEach(function(e){u.indexOf(e)<0&&u.push(e)})});var d,f,p,m,h=``;if(C===`readiness`){var g=y.readiness||{},_=g.field||{},ee=g.nextActions&&g.nextActions[0];d=`Field evidence focus`,f={text:_.overall==null?`unknown`:_.overall+`/100`,kind:_.overall>=75?`ok`:`warn`},p=`This is what Lens observed itself; external standards and Readability recovery join it only in Agent-ready?.`,m={"identified fetch":y.status==null?`unknown`:y.status,"bot samples":g.botViews?g.botViews.length:0,"machine door":y.agent&&y.agent.strategy?y.agent.strategy.verdict:`unknown`,"next standards gap":ee?He(ee).label:`none observed`}}else if(C===`anatomy`){var v=e.imgTotal?e.imgTotal-e.imgNoAlt+` / `+e.imgTotal+` images have alt`:`no images found`;d=`Anatomy focus`,f={text:y.status+` `+Z(y.status),kind:y.status>=200&&y.status<400?`ok`:`warn`},p=`Can a machine get a usable reading surface before it knows what the page means?`,m={response:(y.contentType||`(none)`)+` · `+R(e.rawBytes),shape:(e.headings?e.headings.length:0)+` headings · `+(e.wordCount||0)+` words`,accessibility:v,headers:Object.keys(y.headers||{}).length+` received`}}else if(C===`reader`){var b=k,x=b&&b.ok&&b.dropped?b.dropped.pct:null;d=`Reader focus`,f={text:b==null?`not run`:b.ok?x==null?`n/a`:x+`% dropped`:`failed`,kind:b==null?``:b.ok?x>=50?`warn`:`ok`:`warn`},p=`How much of this page survives a reader-mode extractor, and how much of what survives is not prose.`,m=b&&b.ok?{"as served":(b.source?b.source.words:`?`)+` words`,"extractor kept":(b.kept?b.kept.words:`?`)+` words`,"control labels kept":b.controls?b.controls.kept+` of `+b.controls.total:`not counted`,extractor:b.extractor?b.extractor.name+` `+b.extractor.version:`readability`}:{status:b==null?`not run — this lens costs a second fetch`:`extraction failed`,"what it is":`a third-party extractor's opinion, not the served bytes`,engine:`readability (Apache-2.0), in its own Worker`}}else if(C===`wire`){var S=j,w=S&&S.ok?S.thirdParty.bytesPct:null;d=`Wire focus`,f={text:S==null?`not run`:S.ok?w+`% third-party`:`failed`,kind:S==null?``:S.ok?w>=60?`warn`:w>=30?``:`ok`:`warn`},p=`What loading this page actually spends, and how much of it goes to somebody who wrote none of it.`,m=S&&S.ok?{requests:S.requests+` to `+S.hostTotal+` host`+(S.hostTotal===1?``:`s`),transferred:R(S.bytes),"third-party":S.thirdParty.requests+` requests · `+R(S.thirdParty.bytes),load:S.loadFired?S.navMs+` ms`:`load event never fired`}:{status:S==null?`not run — this lens costs a whole browser instance`:`the trace failed`,"what it is":`one cold load recorded over CDP, as a declared bot`,"why it is opt-in":`ten browser-minutes a day, shared with every other browser lens`}}else if(C===`structured`)d=`Structured focus`,f={text:o||s||c||l?`signals found`:`mostly untyped`,kind:o||s||c||l?`ok`:`off`},p=`What entities and relationships can be lifted from the markup without guessing?`,m={title:t.title||`(untitled)`,schema:o+` JSON-LD · `+s+` microdata · `+c+` RDFa`,microformats:l+` class signal`+(l===1?``:`s`),preview:ce(t.og)?`Open Graph card present`:`no Open Graph card`},u.length&&(h=Me(u.slice(0,18)));else if(C===`ai`){var T=n.mdNegotiation&&n.mdNegotiation.supported?`negotiated text/markdown`:`HTML only`,E=(y.cost&&y.cost.tiers||[]).filter(function(e){return e.key===`markdown`})[0],D=y.ai&&y.ai.directives||{};d=`AI view focus`,f={text:E?`~`+z(E.tokens)+` tok`:T,kind:E?`ok`:`warn`},p=`What a model can ingest, how much context it costs, and whether the site offers a cleaner representation.`,m={representation:T+` · `+R((y.ai&&y.ai.markdown||``).length),directives:D.metaRobots||D.xRobotsTag||D.namesAiCrawlers?`crawler signals published`:`no AI-specific signal`,curation:y.ai&&y.ai.llmsTxtPresent?`llms.txt present`:`no llms.txt`,"cheapest shortcut":E?`markdown is the selected compact read`:`none observed`}}else if(C===`terms`){var O=a.spectrum&&a.spectrum.tier||`unknown`,te=(a.scoreboard||[]).filter(function(e){return e.verdict===`block`}).length,ne=a.enforcement&&(a.enforcement.challenged?`bot challenge`:a.enforcement.blocked?`fetch refused`:`fetch passed`);d=`Terms focus`,f={text:O,kind:O===`open`?`ok`:`warn`},p=`Is reading open, merely requested, actively enforced, or priced? Published policy and observed behavior stay separate.`,m={spectrum:O,robots:a.robotsUnknown?`unknown / unreachable`:a.robotsPresent?te+` of `+(a.scoreboard||[]).length+` bots blocked`:`no robots.txt`,enforcement:ne||`not observed`,price:a.paid&&a.paid.http402?`402 Payment Required`:`no payment signal`}}else{var A=[n.mcp,n.nlweb,n.webmcp,n.agentCard,n.openapi,n.apiCatalog].filter(function(e){return e&&(e.verdict===`yes`||e.verdict===`likely`||e.verdict===`maybe`||e.present||e.found)}).length,M=(i.llmsTxt&&i.llmsTxt.ok?1:0)+(i.sitemapXml&&i.sitemapXml.ok?1:0);d=`Discovery focus`,f={text:r.verdict||`unknown`,kind:r.verdict===`agent-native`?`ok`:r.verdict===`agent-readable`?``:`warn`},p=`What can an agent discover before it has to drive the human page?`,m={strategy:r.note||r.verdict||`unknown`,"site maps":M+` of 2 found · llms.txt / sitemap.xml`,"agent doors":A+` declared or probable`,feeds:(i.feeds||[]).length+` advertised`}}return`
`+G(d,f,p,K(m)+h)+`
`}function Fe(){var e=y.anatomy||{},t=y.structured||{},n=y.discovery||{},r=y.agent||{},i=r.strategy||{},a=y.cost&&y.cost.tiers&&y.cost.tiers[0],o=y.cost&&y.cost.rates&&y.cost.rates[0]||{usdPerMtok:3},s=[];function c(e,t){s.push({kind:e,text:t})}var l=a?` (~`+z(a.tokens)+` tok, `+B(a.tokens/1e6*o.usdPerMtok)+` at `+(o.model||`Sonnet`)+` rates)`:``;c(`ok`,`GET `+(y.finalUrl||y.url)+` as an agent → `+y.status+` `+I(Z(y.status))+`, `+(y.contentType||`?`)+`, `+R(e.rawBytes)+l+`.`);var u=r.mdNegotiation;u&&u.supported?c(`ok`,`Asked for text/markdown → the site served a clean machine copy. No HTML tax.`):c(`warn`,`Asked for text/markdown → still HTML. Paying the token tax to read markup meant for a browser.`);var d=(t.jsonld||[]).length;if(d){var f=[];(t.jsonld||[]).forEach(function(e){(e.types||[]).forEach(function(e){f.indexOf(e)<0&&f.push(e)})}),c(`ok`,`Parsed structured data → `+d+` JSON-LD block`+(d===1?``:`s`)+(f.length?` (`+f.slice(0,4).join(`, `)+`)`:``)+`. Entities without guessing.`)}else c(`warn`,`Looked for a typed entity graph → none. Any structure must be inferred from the prose.`);var p=i.action&&i.action.length;p?c(`ok`,`Probed for an action surface → `+i.action.join(`, `)+`. It can call, not just read.`):c(`warn`,`Probed for a callable contract (MCP, OpenAPI, agent-card)`+(n.agentsMd&&n.agentsMd.present?` (an AGENTS.md exists, but that's instructions, not a callable endpoint)`:``)+` → none. To do anything it must drive the human page and guess at side effects.`);var m=n.oauthProtectedResource&&n.oauthProtectedResource.ok||n.oauthDiscovery&&(n.oauthDiscovery.openidConfiguration&&n.oauthDiscovery.openidConfiguration.ok||n.oauthDiscovery.oauthAuthorizationServer&&n.oauthDiscovery.oauthAuthorizationServer.ok);m?c(`ok`,`Checked for a delegated-authority boundary → OAuth discovery present. A user could grant scoped access.`):c(`warn`,`Checked for a consent boundary → none. No scoped, revocable way to act on a user's behalf.`);var h,g;p&&m?(h=`ACT: this site was built for agents. A task with side effects can run against a real contract.`,g=`ok`):p?(h=`ACT (unsafe): an action surface exists, but with no consent boundary an agent acts without scoped permission.`,g=`warn`):(h=`BLOCKED: a task needing action can't complete. An agent can read this page, but not do anything here without a human driving a browser.`,g=`no`),c(g,`task verdict → `+h);var _=s.map(function(e){var t=e.kind===`ok`?`✓`:e.kind===`no`?`✗`:`•`;return`
`+t+``+L(I(e.text).replace(/×/g,`×`))+`
`}).join(``);return G(`Agent trace`,{text:`what an agent would do`,kind:g===`no`?`warn`:g},`One agent's attempt at a task on this URL, narrated only from evidence Lens already gathered. No model was called.`,`
Machine briefing. This is a reconstruction from the response and the probes Lens actually ran. It describes available evidence; it does not claim that a site has agreed to a new interface.
`;m+=G(`Observed document`,{text:`observed`,kind:`ok`},`The minimum contract a machine can recover from this response.`,K(p)),m+=G(`Machine affordances`,{text:i.verdict||`unknown`,kind:i.verdict===`agent-native`?`ok`:i.verdict===`agent-readable`?``:`warn`},`A readable page, a declared action surface, and permission are separate signals.`,Ne([[`read`,(y.contentType||`response`)+`, `+R(e.rawBytes),`observed`,`ok`],[`structure`,o+` JSON-LD, `+s+` microdata, `+c+` RDFa type(s)`,o||s||c?`found`:`absent`,o||s||c?`ok`:`off`],[`discover`,(n.llmsTxt&&n.llmsTxt.ok?`llms.txt`:``)+(n.sitemapXml&&n.sitemapXml.ok?` + sitemap`:``)||`site files not found`,n.llmsTxt&&n.llmsTxt.ok||n.sitemapXml&&n.sitemapXml.ok?`found`:`absent`,n.llmsTxt&&n.llmsTxt.ok||n.sitemapXml&&n.sitemapXml.ok?`ok`:`off`],[`action`,i.action&&i.action.length?i.action.join(`, `):`no declared action surface`,i.action&&i.action.length?`found`:`absent`,i.action&&i.action.length?`ok`:`off`],[`policy`,d+`; spectrum: `+f,d===`robots.txt answered`?`observed`:`unknown`,d===`robots.txt answered`?``:`warn`],[`markdown`,r.mdNegotiation&&r.mdNegotiation.supported?`same URL serves text/markdown`:`HTML response stays HTML`,r.mdNegotiation&&r.mdNegotiation.supported?`supported`:`absent`,r.mdNegotiation&&r.mdNegotiation.supported?`ok`:`off`]]));var h=`# observed
url `+y.finalUrl+`
title `+u+`
response `+y.status+` `+Z(y.status)+`
@@ -20,7 +20,7 @@ sidefx Lens inspected; it submitted no forms or tools`;return m+=G(`Copyable
`+(E||`(no switches on)`),!0))+`
`}function Be(){[].forEach.call(o.querySelectorAll(`.lx-cf-toggle`),function(e){e.addEventListener(`click`,function(){var t=e.getAttribute(`data-cf`);Object.prototype.hasOwnProperty.call(w,t)&&(w[t]=!w[t],H(!0),Y())})})}var Ve={robotsTxt:`Publish a valid /robots.txt with explicit User-agent rules and a Sitemap directive.`,sitemap:`Publish /sitemap.xml and reference it from robots.txt.`,linkHeaders:`Add RFC 8288 Link relations for your sitemap, docs, API catalog, or alternate machine representation.`,dnsAid:`Publish a DNSSEC-signed _index._agents. SVCB/HTTPS record for machine discovery.`,markdownNegotiation:`Return text/markdown when a client sends Accept: text/markdown, while keeping HTML for browsers.`,robotsTxtAiRules:`Declare explicit GPTBot, ClaudeBot, CCBot, and other AI crawler rules in robots.txt.`,contentSignals:`Add Content-Signal directives for ai-train, ai-input, and search to robots.txt.`,webBotAuth:`Publish a valid JWKS at /.well-known/http-message-signatures-directory.`,apiCatalog:`Publish /.well-known/api-catalog as application/linkset+json with service-desc and service-doc links.`,oauthDiscovery:`Publish OAuth/OIDC discovery metadata with issuer and token endpoints.`,oauthProtectedResource:`Publish /.well-known/oauth-protected-resource with authorization_servers and scopes_supported.`,authMd:`Publish /auth.md with agent registration instructions and link it to your OAuth metadata.`,mcpServerCard:`Publish /.well-known/mcp/server-card.json with serverInfo, transport, and capabilities.`,a2aAgentCard:`Publish /.well-known/agent-card.json describing the agent's interfaces, capabilities, and skills.`,agentSkills:`Publish /.well-known/agent-skills/index.json with skills, URLs, and digests.`,webMcp:`Expose safe browser actions with navigator.modelContext and JSON Schemas.`,x402:`Return a machine-readable HTTP 402 payment requirement for payable routes.`,mpp:`Describe payable OpenAPI operations with x-payment-info and MPP settlement metadata.`,ucp:`Publish /.well-known/ucp with protocol version, services, capabilities, and endpoints.`,acp:`Publish /.well-known/acp.json so agents can discover commerce services and transports.`,ap2:`Publish the AP2 discovery metadata when your commerce flow supports it.`};function He(e){var n=t(e)===null?e&&e.key:e;return{label:e&&e.label||n||`check`,fix:Ve[n]||`Inspect this surface and publish the expected machine-readable contract.`}}function Ue(e){return e.status===`pass`?{text:`pass`,kind:`ok`}:e.status===`neutral`?{text:`optional`,kind:`off`}:e.status===`unknown`?{text:`unknown`,kind:`warn`}:{text:`fix`,kind:`warn`}}function We(e){return(y.terms&&y.terms.scoreboard||[]).filter(function(t){return t.ua===e.key})[0]||null}function Ge(e){return e.error?{text:`unknown`,kind:`warn`}:e.challenge?{text:`challenge`,kind:`warn`}:e.blocked?{text:(e.status||`blocked`)+` blocked`,kind:`warn`}:e.status>=200&&e.status<400?{text:e.status+` `+(e.contentType||`readable`),kind:`ok`}:{text:e.status||`unknown`,kind:`warn`}}function Ke(e){var t=e.checks||{},n=[{key:`markdown`,label:`Clean machine text`},{key:`contract`,label:`Action contract`},{key:`authority`,label:`Delegated authority`}].filter(function(e){return w[e.key]&&!Re(e.key,t)});if(!n.length)return null;var r=e.passed,i=e.counted;return n.forEach(function(e){var n=t[Le[e.key].checks[0]];n&&n.countInScore&&r++}),{score:i?Math.round(r/i*100):e.overall,labels:n.map(function(e){return e.label})}}function qe(e,t){var n=function(){if(t){var e=t.textContent;t.textContent=`Copied`,setTimeout(function(){t.textContent=e},1400)}};if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(e).then(n).catch(function(){});else{var r=document.createElement(`textarea`);r.value=e,r.style.position=`fixed`,r.style.opacity=`0`,document.body.appendChild(r),r.select();try{document.execCommand(`copy`),n()}catch{}r.remove()}}function Je(){[].forEach.call(o.querySelectorAll(`.lx-copy-fix`),function(e){e.addEventListener(`click`,function(){qe(e.getAttribute(`data-fix`)||``,e)})});var e=o.querySelector(`.lx-copy-all`);e&&e.addEventListener(`click`,function(){var t=[].map.call(o.querySelectorAll(`.lx-readiness-check[data-status='fail']`),function(e){return`- `+e.getAttribute(`data-label`)+`: `+e.getAttribute(`data-fix`)});qe(`Lens readiness fixes for `+(y.finalUrl||y.url)+`
`+t.join(`
-`),e)})}function Ye(e,t,n,r,i,a){return`
0`+e+``+t+``+n+`
`+r+`
`+(i&&i.length?`
`+i.map(function(e){return`
`+e+`
`}).join(``)+`
`:``)+`
`}function Xe(e){var t=e.field||{},n=Number.isFinite(t.overall)?t.overall:null,r=P&&P.available&&Number.isFinite(P.score)?P.score:null,i=k&&k.ok&&k.recovery,a=i&&Number.isFinite(i.overall)?i.overall:null,o=r!=null&&n!=null&&a!=null,s=o?Math.round((r+n+a)/3):null,c=F?`checking…`:r==null?`—`:I(r)+`/100`,l=F?`Asking Cloudflare's public scanner for its independent standards level.`:r==null?I(P&&P.error||`Cloudflare's independent score is unavailable.`):`Cloudflare Agent Readiness · Level `+I(P.level)+`/5`+(P.levelName?` · `+I(P.levelName):``),u=(t.components||[]).map(function(e){return``+I(e.label)+`: `+(Number.isFinite(e.score)?I(e.score)+`/100`:`unknown`)}),d=i?(i.checks||[]).map(function(e){return(e.pass?`✓ `:`✕ `)+I(e.label)}):[],f=`
`+Ye(1,`Cloudflare standards`,c,l,[],F?`is-waiting`:r==null?`is-missing`:`is-ready`)+Ye(2,`Lens field evidence`,n==null?`—`:I(n)+`/100`,`Observed here: an identified fetch, six named bot samples, a usable body, and a machine door.`,u,n==null?`is-missing`:`is-ready`)+Ye(3,`Readability content recovery`,A?`extracting…`:a==null?`—`:I(a)+`/100`,A?`Readability is re-reading the page in the separate Reader Worker.`:a==null?I(k&&k.error||`The extraction result is unavailable.`):`Lens’s transparent checks over Readability output; Readability does not publish this score.`,d,A?`is-waiting`:a==null?`is-missing`:`is-ready`)+`
`+o.map(function(e){var t=We(e),n=Ge(e),r=e.blocked?`This identity may not retrieve the route.`:t&&t.verdict===`block`?`Robots asks it not to read; the sampled response is not enforcement.`:e.status>=200&&e.status<400?`It can retrieve this response; parsing and action are separate.`:`Access is uncertain from this sample.`;return`
`,c=[],l=e.checks||{};l.markdownNegotiation&&l.markdownNegotiation.status!==`pass`&&c.push(`Agents pay the HTML/token tax because this URL does not negotiate a clean machine representation.`),y.structured&&!(y.structured.jsonld||[]).length&&l.apiCatalog&&l.apiCatalog.status!==`pass`&&c.push(`A machine can read the page, but it has no stable entity graph or declared action catalog to validate.`),y.agent&&y.agent.strategy&&!y.agent.strategy.action.length&&c.push(`Reading is possible; acting is not declared. An agent must drive the human page and guess at side effects.`),c.length||c.push(`The main access surfaces are published. Inspect the individual checks for the remaining edge cases and bot-specific policy.`);var u=`
Local standards projection: `+I(n.score+`/100 if you add `+n.labels.join(`, `)+`.`)+` illustrative; the origin has not changed.
`),r+G(`Local standards mirror`,null,`The detailed checklist mirrors Cloudflare's public rubric for inspection and fixes. It is not counted again in the composite.`,p)+G(`The access gap`,{text:`human vs bot`},`A browser can render a page even when an agent cannot establish what it may read or do.`,u)+G(`Bot views`,{text:o.length+` sampled`},`Six representative, read-only GETs show observed response behavior. Robots policy and enforcement are deliberately separate.`,s)+G(`Checks and fixes`,null,`Every failed check has a concrete next move. Copy the complete implementation brief into your coding agent.`,``+d+a)}function Y(){if(u.innerHTML=S===`delta`?`Delta view · What changes`:`Machine view`,mt(),s&&(s.innerHTML=y&&S===`machine`?le()+Fe()+Ie():``),y){var e=Object.create(null);e.readiness=Ze,e.anatomy=ot,e.reader=Qe,e.wire=et,e.structured=st,e.ai=lt,e.terms=ut,e.discovery=ft,e.tools=nt;var t=Object.prototype.hasOwnProperty.call(e,C)?e[C]:null,n=typeof t==`function`?t:ot,r=S===`machine`?Pe()+n():S===`delta`?ze():n();S!==`delta`&&S!==`machine`&&(r=le()+r),o.innerHTML=r,c&&(c.scrollTop=0),S===`delta`&&Be(),C===`readiness`&&Je();var i=o.querySelector(`#lx-reader-run`);i&&i.addEventListener(`click`,$e);var a=o.querySelector(`#lx-wire-run`);a&&a.addEventListener(`click`,tt);var l=o.querySelector(`#lx-tools-run`);l&&l.addEventListener(`click`,rt),C===`tools`&&window.LensTools&&window.LensTools.bind(o,re,Y);var d=o.querySelector(`.lx-verdict-score`)||s&&s.querySelector(`.lx-verdict-score`);d&&d.addEventListener(`click`,function(){_t(`readiness`)}),C===`readiness`&&S!==`delta`&&setTimeout(at,0)}}function Qe(){return window.LensReader?window.LensReader.mount(k,A,y):G(`Reader's guess`,{text:`not run`},`A third-party extractor's opinion of this page, from its own Worker.`,`
Readability (Apache-2.0, mozilla/readability) guesses which part of the document is the article and throws the rest away. The Raw response tab is what the server actually sent. The interesting number is the gap.
`)}function $e(){if(A||!y)return;var e=y.finalUrl||y.url;A=!0,Y();function t(){if(!(!y||(y.finalUrl||y.url)!==e)){if(!window.LensReader){A=!1,Y();return}window.LensReader.run(y,function(t){!y||(y.finalUrl||y.url)!==e||(A=!1,k=t,Y(),X())},function(){!y||(y.finalUrl||y.url)!==e||(A=!1,Y())})}}if(window.LensReader){t();return}var n=document.createElement(`script`);n.src=`/a/lens-reader.20b46457.js`,n.onload=t,n.onerror=function(){!y||(y.finalUrl||y.url)!==e||(A=!1,Y())},document.head.appendChild(n)}function et(){return window.LensWire?window.LensWire.mount(j,M,y):G(`What it costs`,{text:`not run`},`Every request the page actually makes, and who receives them.`,`
Every other lens reads the document. This one records the load: each request the page fires, its bytes on the wire, and which host got it.
`)}function tt(){if(M||!y)return;var e=y.finalUrl||y.url;M=!0,Y();function t(){if(!(!y||(y.finalUrl||y.url)!==e)){if(!window.LensWire){M=!1,Y();return}window.LensWire.run(y,function(t){!y||(y.finalUrl||y.url)!==e||(M=!1,j=t,Y(),X())},function(){!y||(y.finalUrl||y.url)!==e||(M=!1,Y())})}}if(window.LensWire){t();return}var n=document.createElement(`script`);n.src=`/a/lens-wire.d234a22d.js`,n.onload=t,n.onerror=function(){!y||(y.finalUrl||y.url)!==e||(M=!1,Y())},document.head.appendChild(n)}function nt(){return window.LensTools?window.LensTools.render(N?{pending:!0}:re):G(`What it accepts`,{text:`not run`},`Reads this origin's MCP catalogue and draws a form for every tool, from the argument schema the server publishes.`,`
An MCP tool list is an ABI. A block explorer turns one into a form you can fill in, and inputSchema is the same artefact under another name.
`)}function rt(){if(N||!y)return;var e=y.finalUrl||y.url;N=!0,Y();function t(){if(!(!y||(y.finalUrl||y.url)!==e)){if(!window.LensTools){N=!1,Y();return}window.LensTools.run(e,function(t){!y||(y.finalUrl||y.url)!==e||(N=!1,re=t,Y())},function(){!y||(y.finalUrl||y.url)!==e||(N=!1,re={ok:!1,unreadable:!0,error:`the catalogue request did not complete`},Y())})}}if(window.LensTools){t();return}var n=document.createElement(`script`);n.src=`/a/lens-tools.ef810cf3.js`,n.onload=t,n.onerror=function(){!y||(y.finalUrl||y.url)!==e||(N=!1,Y())},document.head.appendChild(n)}function it(){if(!(F||!y)){var e=y.finalUrl||y.url;F=!0,Y(),fetch(`/lens/fetch?mode=cloudflare&url=`+encodeURIComponent(e)).then(function(e){return e.json()}).then(function(t){!y||(y.finalUrl||y.url)!==e||(F=!1,P=t&&t.ok?t:{available:!1,error:t&&t.error||`Cloudflare's scanner is unavailable.`},Y())}).catch(function(){!y||(y.finalUrl||y.url)!==e||(F=!1,P={available:!1,error:`Cloudflare's scanner is unavailable.`},Y())})}}function at(){!y||C!==`readiness`||S===`delta`||(!F&&!P&&it(),!A&&!k&&$e())}function ot(){var e=y.anatomy,t=``,n={status:y.status,"content-type":y.contentType||`(none)`,size:R(e?e.rawBytes:0)+(y.truncated?` (capped)`:``),words:e?e.wordCount:0,"img alt coverage":e?e.imgTotal?e.imgTotal-e.imgNoAlt+` / `+e.imgTotal+` have alt text`:`no images`:`?`};if(S===`both`){var r=y.cost&&y.cost.tiers&&y.cost.tiers[0],i=y.cost&&y.cost.rates&&y.cost.rates[0]||{usdPerMtok:3};r&&(n[`model read`]=`~`+z(r.tokens)+` tok · `+B(r.tokens/1e6*i.usdPerMtok)),t+=G(`What the bot received`,{text:y.status+` `+Z(y.status),kind:y.status>=200&&y.status<400?`ok`:`warn`},`The response before any browser touched it.`,K(n));var a=y.ai&&y.ai.markdown||``;return a?t+=G(`The scraper's diet`,{text:R(a.length)},`The first slice of the markdown a basic LLM scraper ingests.`,q(a.slice(0,1400)+(a.length>1400?`
+`),e)})}function Ye(e,t,n,r,i,a){return`
0`+e+``+t+``+n+`
`+r+`
`+(i&&i.length?`
`+i.map(function(e){return`
`+e+`
`}).join(``)+`
`:``)+`
`}function Xe(e){var t=e.field||{},n=Number.isFinite(t.overall)?t.overall:null,r=P&&P.available&&Number.isFinite(P.score)?P.score:null,i=k&&k.ok&&k.recovery,a=i&&Number.isFinite(i.overall)?i.overall:null,o=r!=null&&n!=null&&a!=null,s=o?Math.round((r+n+a)/3):null,c=F?`checking…`:r==null?`—`:I(r)+`/100`,l=F?`Asking Cloudflare's public scanner for its independent standards level.`:r==null?I(P&&P.error||`Cloudflare's independent score is unavailable.`):`Cloudflare Agent Readiness · Level `+I(P.level)+`/5`+(P.levelName?` · `+I(P.levelName):``),u=(t.components||[]).map(function(e){return``+I(e.label)+`: `+(Number.isFinite(e.score)?I(e.score)+`/100`:`unknown`)}),d=i?(i.checks||[]).map(function(e){return(e.pass?`✓ `:`✕ `)+I(e.label)}):[],f=`
`+Ye(1,`Cloudflare standards`,c,l,[],F?`is-waiting`:r==null?`is-missing`:`is-ready`)+Ye(2,`Lens field evidence`,n==null?`—`:I(n)+`/100`,`Observed here: an identified fetch, six named bot samples, a usable body, and a machine door.`,u,n==null?`is-missing`:`is-ready`)+Ye(3,`Readability content recovery`,A?`extracting…`:a==null?`—`:I(a)+`/100`,A?`Readability is re-reading the page in the separate Reader Worker.`:a==null?I(k&&k.error||`The extraction result is unavailable.`):`Lens’s transparent checks over Readability output; Readability does not publish this score.`,d,A?`is-waiting`:a==null?`is-missing`:`is-ready`)+`
`+o.map(function(e){var t=We(e),n=Ge(e),r=e.blocked?`This identity may not retrieve the route.`:t&&t.verdict===`block`?`Robots asks it not to read; the sampled response is not enforcement.`:e.status>=200&&e.status<400?`It can retrieve this response; parsing and action are separate.`:`Access is uncertain from this sample.`;return`
`,c=[],l=e.checks||{};l.markdownNegotiation&&l.markdownNegotiation.status!==`pass`&&c.push(`Agents pay the HTML/token tax because this URL does not negotiate a clean machine representation.`),y.structured&&!(y.structured.jsonld||[]).length&&l.apiCatalog&&l.apiCatalog.status!==`pass`&&c.push(`A machine can read the page, but it has no stable entity graph or declared action catalog to validate.`),y.agent&&y.agent.strategy&&!y.agent.strategy.action.length&&c.push(`Reading is possible; acting is not declared. An agent must drive the human page and guess at side effects.`),c.length||c.push(`The main access surfaces are published. Inspect the individual checks for the remaining edge cases and bot-specific policy.`);var u=`
Local standards projection: `+I(n.score+`/100 if you add `+n.labels.join(`, `)+`.`)+` illustrative; the origin has not changed.
`),r+G(`Local standards mirror`,null,`The detailed checklist mirrors Cloudflare's public rubric for inspection and fixes. It is not counted again in the composite.`,p)+G(`The access gap`,{text:`human vs bot`},`A browser can render a page even when an agent cannot establish what it may read or do.`,u)+G(`Bot views`,{text:o.length+` sampled`},`Six representative, read-only GETs show observed response behavior. Robots policy and enforcement are deliberately separate.`,s)+G(`Checks and fixes`,null,`Every failed check has a concrete next move. Copy the complete implementation brief into your coding agent.`,``+d+a)}function Y(){if(u.innerHTML=S===`delta`?`Delta view · What changes`:`Machine view`,mt(),s&&(s.innerHTML=y&&S===`machine`?le()+Fe()+Ie():``),y){var e=Object.create(null);e.readiness=Ze,e.anatomy=ot,e.reader=Qe,e.wire=et,e.structured=st,e.ai=lt,e.terms=ut,e.discovery=ft,e.tools=nt;var t=Object.prototype.hasOwnProperty.call(e,C)?e[C]:null,n=typeof t==`function`?t:ot,r=S===`machine`?Pe()+n():S===`delta`?ze():n();S!==`delta`&&S!==`machine`&&(r=le()+r),o.innerHTML=r,c&&(c.scrollTop=0),S===`delta`&&Be(),C===`readiness`&&Je();var i=o.querySelector(`#lx-reader-run`);i&&i.addEventListener(`click`,$e);var a=o.querySelector(`#lx-wire-run`);a&&a.addEventListener(`click`,tt);var l=o.querySelector(`#lx-tools-run`);l&&l.addEventListener(`click`,rt),C===`tools`&&window.LensTools&&window.LensTools.bind(o,re,Y);var d=o.querySelector(`.lx-verdict-score`)||s&&s.querySelector(`.lx-verdict-score`);d&&d.addEventListener(`click`,function(){_t(`readiness`)}),C===`readiness`&&S!==`delta`&&setTimeout(at,0)}}function Qe(){return window.LensReader?window.LensReader.mount(k,A,y):G(`Reader's guess`,{text:`not run`},`A third-party extractor's opinion of this page, from its own Worker.`,`
Readability (Apache-2.0, mozilla/readability) guesses which part of the document is the article and throws the rest away. The Raw response tab is what the server actually sent. The interesting number is the gap.
`)}function $e(){if(A||!y)return;var e=y.finalUrl||y.url;A=!0,Y();function t(){if(!(!y||(y.finalUrl||y.url)!==e)){if(!window.LensReader){A=!1,Y();return}window.LensReader.run(y,function(t){!y||(y.finalUrl||y.url)!==e||(A=!1,k=t,Y(),X())},function(){!y||(y.finalUrl||y.url)!==e||(A=!1,Y())})}}if(window.LensReader){t();return}var n=document.createElement(`script`);n.src=`/a/lens-reader.3c1fec9b.js`,n.onload=t,n.onerror=function(){!y||(y.finalUrl||y.url)!==e||(A=!1,Y())},document.head.appendChild(n)}function et(){return window.LensWire?window.LensWire.mount(j,M,y):G(`What it costs`,{text:`not run`},`Every request the page actually makes, and who receives them.`,`
Every other lens reads the document. This one records the load: each request the page fires, its bytes on the wire, and which host got it.
`)}function tt(){if(M||!y)return;var e=y.finalUrl||y.url;M=!0,Y();function t(){if(!(!y||(y.finalUrl||y.url)!==e)){if(!window.LensWire){M=!1,Y();return}window.LensWire.run(y,function(t){!y||(y.finalUrl||y.url)!==e||(M=!1,j=t,Y(),X())},function(){!y||(y.finalUrl||y.url)!==e||(M=!1,Y())})}}if(window.LensWire){t();return}var n=document.createElement(`script`);n.src=`/a/lens-wire.d234a22d.js`,n.onload=t,n.onerror=function(){!y||(y.finalUrl||y.url)!==e||(M=!1,Y())},document.head.appendChild(n)}function nt(){return window.LensTools?window.LensTools.render(N?{pending:!0}:re):G(`What it accepts`,{text:`not run`},`Reads this origin's MCP catalogue and draws a form for every tool, from the argument schema the server publishes.`,`
An MCP tool list is an ABI. A block explorer turns one into a form you can fill in, and inputSchema is the same artefact under another name.
`)}function rt(){if(N||!y)return;var e=y.finalUrl||y.url;N=!0,Y();function t(){if(!(!y||(y.finalUrl||y.url)!==e)){if(!window.LensTools){N=!1,Y();return}window.LensTools.run(e,function(t){!y||(y.finalUrl||y.url)!==e||(N=!1,re=t,Y())},function(){!y||(y.finalUrl||y.url)!==e||(N=!1,re={ok:!1,unreadable:!0,error:`the catalogue request did not complete`},Y())})}}if(window.LensTools){t();return}var n=document.createElement(`script`);n.src=`/a/lens-tools.ef810cf3.js`,n.onload=t,n.onerror=function(){!y||(y.finalUrl||y.url)!==e||(N=!1,Y())},document.head.appendChild(n)}function it(){if(!(F||!y)){var e=y.finalUrl||y.url;F=!0,Y(),fetch(`/lens/fetch?mode=cloudflare&url=`+encodeURIComponent(e)).then(function(e){return e.json()}).then(function(t){!y||(y.finalUrl||y.url)!==e||(F=!1,P=t&&t.ok?t:{available:!1,error:t&&t.error||`Cloudflare's scanner is unavailable.`},Y())}).catch(function(){!y||(y.finalUrl||y.url)!==e||(F=!1,P={available:!1,error:`Cloudflare's scanner is unavailable.`},Y())})}}function at(){!y||C!==`readiness`||S===`delta`||(!F&&!P&&it(),!A&&!k&&$e())}function ot(){var e=y.anatomy,t=``,n={status:y.status,"content-type":y.contentType||`(none)`,size:R(e?e.rawBytes:0)+(y.truncated?` (capped)`:``),words:e?e.wordCount:0,"img alt coverage":e?e.imgTotal?e.imgTotal-e.imgNoAlt+` / `+e.imgTotal+` have alt text`:`no images`:`?`};if(S===`both`){var r=y.cost&&y.cost.tiers&&y.cost.tiers[0],i=y.cost&&y.cost.rates&&y.cost.rates[0]||{usdPerMtok:3};r&&(n[`model read`]=`~`+z(r.tokens)+` tok · `+B(r.tokens/1e6*i.usdPerMtok)),t+=G(`What the bot received`,{text:y.status+` `+Z(y.status),kind:y.status>=200&&y.status<400?`ok`:`warn`},`The response before any browser touched it.`,K(n));var a=y.ai&&y.ai.markdown||``;return a?t+=G(`The scraper's diet`,{text:R(a.length)},`The first slice of the markdown a basic LLM scraper ingests.`,q(a.slice(0,1400)+(a.length>1400?`
[… `+R(a.length)+` total]`:``),!0)):e&&e.rawHtml&&(t+=G(`Raw body, first slice`,{text:R(e.rawBytes)},`Served as-is; already machine-shaped.`,q(e.rawHtml.slice(0,1400)+(e.rawBytes>1400?`
diff --git a/src/dict/a-dict/tooltip.274aab8b.js b/src/dict/a-dict/tooltip.274aab8b.js
new file mode 100644
index 000000000..a00ea9126
--- /dev/null
+++ b/src/dict/a-dict/tooltip.274aab8b.js
@@ -0,0 +1,2 @@
+/*! minified at deploy - readable source: /tooltip.src.js */
+import{createHoist,hoverCapable,ANCHOR_OK}from"/a/hoist.d9081560.js";function asNumber(e){return typeof e==`number`&&isFinite(e)?e:null}function asRecord(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}export function start(a){let o=document.getElementById(`xp-tooltip`);if(!o||!hoverCapable())return;let s=e=>{if(!e)return``;let t=Number(e);return t<1024?`${t} B`:t<1048576?`${(t/1024).toFixed(1)} KB`:t<1024**3?`${(t/1024/1024).toFixed(1)} MB`:`${(t/1024**3).toFixed(2)} GB`},c=e=>{if(!e)return``;let t=String(e).trim().replace(/^(\d{4}):(\d{2}):(\d{2})/,`$1-$2-$3`).replace(` `,`T`),n=e=>String(e).padStart(2,`0`);if(/[zZ]|[+-]\d{2}:?\d{2}$/.test(t)){try{if(typeof Temporal<`u`){let e=Temporal.Instant.from(t).toZonedDateTimeISO(Temporal.Now.timeZoneId());return`${n(e.month)}-${n(e.day)}-${e.year}, ${n(e.hour)}:${n(e.minute)}`}}catch{}let e=new Date(t);return isNaN(e.getTime())?``:`${n(e.getMonth()+1)}-${n(e.getDate())}-${e.getFullYear()}, ${n(e.getHours())}:${n(e.getMinutes())}`}try{if(typeof Temporal<`u`){let e=Temporal.PlainDateTime.from(t);return`${n(e.month)}-${n(e.day)}-${e.year}, ${n(e.hour)}:${n(e.minute)}`}}catch{}let r=t.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/);return r?`${r[2]}-${r[3]}-${r[1]}, ${r[4]}:${r[5]}`:``},l=e=>String(e??``).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),u=e=>e?String(e).replace(/\s+mm$/i,` mm`)+` FF`:``,d=e=>e&&/\bFired\b|\bOn\b/i.test(e)?``:``,f=e=>{if(!e||!Array.isArray(e.l)||!e.l.length)return``;let t=e=>(32-Math.max(0,Math.min(100,e))*30/100).toFixed(1),n=e=>e.map((e,n)=>`${n},${t(e)}`).join(` `),r=e.l.length,i=``,a=Array.isArray(e.r)?``:``,o=Array.isArray(e.g)?``:``,s=Array.isArray(e.b)?``:``;return``},p=e=>{if(!e||e.length!==256)return null;let t={l:[],r:[],g:[],b:[]},n=[`l`,`r`,`g`,`b`];for(let r=0;r<4;r++)for(let i=0;i<64;i++){let a=e.charCodeAt(r*64+i)-63;if(a<0||a>=64)return null;t[n[r]].push(Math.round(a*100/63))}return t},m=Object.create(null),h=(e,t)=>{if(e in m)return m[e];let n=t&&t.dataset&&t.dataset.hist;return m[e]=n?p(n):null,m[e]},g=(e,t)=>h(e,t)||_[e]&&_[e].hi||null,_=Object.create(null),v=new Set,y=`mv=7`,b=(e,t)=>{let n=_[e];n&&n.hi||v.has(e)||(v.add(e),fetch(`/images/meta/${encodeURIComponent(e)}.json?${y}`,t?{priority:t}:void 0).then(e=>{if(!e.ok||!(e.headers.get(`content-type`)||``).includes(`json`))throw 0;return e.json()}).then(t=>{if(!asRecord(t))throw 0;_[e]=t;let n=F.active();n&&n.matches?.(`.photos a`)&&(n.dataset.full||``).replace(/\.[^.]+$/,``)===e&&F.show(n)}).catch(()=>{}).finally(()=>{v.delete(e)}))},x=!1,S=()=>{x||(x=!0,fetch(`/images/exif.json?${y}`,{priority:`low`}).then(e=>{if(!e.ok||!(e.headers.get(`content-type`)||``).includes(`json`))throw 0;return e.json()}).then(e=>{if(!asRecord(e))throw 0;for(let t of Object.keys(e))_[t]||(_[t]=e[t]);let t=F.active();t&&t.matches?.(`.photos a`)&&F.show(t)}).catch(()=>{x=!1}))},C=e=>(e.dataset.full||decodeURIComponent((e.href||``).split(`/`).pop())).replace(/\.[^.]+$/,``),w=()=>{document.querySelector(`.photos a[data-full]`)&&S()},T=!1,E=()=>{if(T)return;T=!0;let e=()=>{T=!1,w()},t=()=>{typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:2e3}):setTimeout(e,0)};document.readyState===`complete`?setTimeout(t,750):window.addEventListener(`load`,()=>setTimeout(t,750),{once:!0})},D=document.querySelector(`section.photos`);D&&new MutationObserver(()=>E()).observe(D,{childList:!0}),E();let O=e=>e?.closest?.(`.np-artist-link, .photos a, .np-list li[data-track-title], .car-link`)||null;function k(e){return e.matches(`.car-link`)?A(e):e.matches(`.np-artist-link`)?N(e):e.matches(`.photos a`)?j(e):e.matches(`.np-list li`)?P(e):``}function A(e){let t=e.dataset.carAvif||``,n=e.dataset.carJpg||``;if(!t&&!n)return``;let r=e.dataset.carCaption||``,i=e.dataset.carCredit||``;return`