PageSourceSearch

https://ehosseini.info/

html ehosseini.info collected 2026-10-04 09:59:04 UTC 100,002 bytes, 13 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="generator" content="Gatsby 5.14.3"/><meta data-react-helmet="true" name="description" content="I write about what AI agents are allowed to do inside real companies, who they&#x27;re acting for, how far that permission reaches, and how you prove what happened afterwards."/><meta data-react-helmet="true" name="author" content="Ehsan Hosseini"/><meta data-react-helmet="true" name="robots" content="max-image-preview:large"/><meta data-react-helmet="true" name="theme-color" content="#000000"/><meta data-react-helmet="true" http-equiv="Content-Security-Policy" content="img-src &#x27;self&#x27; https://bx.ehosseini.info data: blob:;"/><meta data-react-helmet="true" property="og:type" content="website"/><meta data-react-helmet="true" property="og:url" content="https://ehosseini.info/"/><meta data-react-helmet="true" property="og:title" content="Ehsan Hosseini | AI agent access control"/><meta data-react-helmet="true" property="og:description" content="I write about what AI agents are allowed to do inside real companies, who they&#x27;re acting for, how far that permission reaches, and how you prove what happened afterwards."/><meta data-react-helmet="true" property="og:image" content="https://ehosseini.info/ehsan-hosseini.png"/><meta data-react-helmet="true" property="og:site_name" content="Ehsan Hosseini"/><meta data-react-helmet="true" name="twitter:card" content="summary"/><meta data-react-helmet="true" name="twitter:site" content="@eh_hosseini"/><meta data-react-helmet="true" name="twitter:creator" content="@eh_hosseini"/><meta data-react-helmet="true" name="twitter:title" content="Ehsan Hosseini | AI agent access control"/><meta data-react-helmet="true" name="twitter:description" content="I write about what AI agents are allowed to do inside real companies, who they&#x27;re acting for, how far that permission reaches, and how you prove what happened afterwards."/><meta data-react-helmet="true" name="twitter:image" content="https://ehosseini.info/ehsan-hosseini.png"/><meta name="theme-color" content="#000000"/><style data-href="/styles.e228d2bf6d9b58e57b6b.css" data-identity="gatsby-global-css">/*
2! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
3*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}
3[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>
3li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:#f0f0f0;border-radius:.25em;color:var(--tw-prose-code);font-size:8px;font-weight:600;padding:.25em .5em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){border-collapse:collapse;font-size:.875em;line-height:1.7142857;margin-bottom:1.5em;margin-top:1.5em;table-layout:auto;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;
3padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}
3.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose :where(table thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom:2px solid #d1d5db}.prose :where(table thead th):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:600;padding:.75em;text-align:left}.prose :where(table tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom:1px solid #e5e7eb;padding:.75em}.prose :where(table tbody tr:last-child td):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.top-16{top:4rem}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.line-clamp-2{-webkit-box-orient:vertical;-webkit-line-clamp:2;display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-video{aspect-ratio:16/9}.h-24{height:6rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.min-h-\[120px\]{min-height:120px}.min-h-\[2\.25rem\]{min-height:2.25rem}.min-h-screen{min-height:100vh}.w-24{width:6rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-7xl{max-width:80rem}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}
3.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}
3.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-4{padding-left:1rem}.pt-2{padding-top:.5rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-montserrat{font-family:Montserrat,sans-serif}.font-playfair{font-family:Playfair Display,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-6xl{font-size:3.75rem;line-height:1}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity))}.opacity-0{opacity:0}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);
3--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.prose{max-width:none}.prose img{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
3--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.prose pre{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));overflow-x:auto;padding:1rem}.prose code{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity));border-radius:.25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px!important;padding:.125rem .25rem}.prose iframe{aspect-ratio:16/9;border-radius:.5rem;width:100%}.prose ul li::marker{color:inherit}.prose ol li::marker{color:inherit}.prose ol li,.prose ul li{color:inherit}@keyframes bg-fade-in{0%{opacity:0}to{opacity:1}}.post-hero-bg-layer{animation:bg-fade-in .6s ease-out forwards}:is(.dark .dark\:prose-invert){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-gray-50\/50:hover{background-color:rgba(249,250,251,.5)}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
3--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.disabled\:opacity-50:disabled{opacity:.5}.group[open] .group-open\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:opacity-70{opacity:.7}.prose-headings\:font-playfair :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-family:Playfair Display,serif}.prose-headings\:font-medium :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *))){font-weight:500}.prose-a\:text-blue-600 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.prose-a\:no-underline :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))){text-decoration-line:none}.hover\:prose-a\:text-blue-800 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))):hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.prose-img\:rounded-lg :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){border-radius:.5rem}.prose-img\:shadow-md :is(:where(img):not(:where([class~=not-prose],[class~=not-prose] *))){--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
3--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:border-gray-600){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-700){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-800){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}:is(.dark .dark\:border-red-800){--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}:is(.dark .dark\:border-transparent){border-color:transparent}:is(.dark .dark\:bg-gray-600){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-700){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-800){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-900){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:bg-red-900\/20){background-color:rgba(127,29,29,.2)}:is(.dark .dark\:bg-white){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:is(.dark .dark\:text-gray-100){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-200){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-300){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-400){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-900){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:text-red-300){--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}:is(.dark .dark\:text-red-400){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:is(.dark .dark\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .dark\:placeholder-gray-400)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity))}:is(.dark .dark\:placeholder-gray-400)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity))}:is(.dark .dark\:shadow-sm){--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);
3--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:hover\:bg-gray-200:hover){--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-500:hover){--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-700:hover){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-700\/50:hover){background-color:rgba(55,65,81,.5)}:is(.dark .dark\:hover\:text-blue-400:hover){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-100:hover){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(.dark .dark\:focus\:ring-gray-500:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}:is(.dark .dark\:prose-headings\:text-gray-100 :is(:where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(.dark .dark\:prose-p\:text-gray-200 :is(:where(p):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:prose-a\:text-blue-400 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:is(.dark .dark\:hover\:prose-a\:text-blue-300 :is(:where(a):not(:where([class~=not-prose],[class~=not-prose] *))):hover){--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}:is(.dark .dark\:prose-blockquote\:text-gray-300 :is(:where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(.dark .dark\:prose-strong\:text-gray-100 :is(:where(strong):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(.dark .dark\:prose-code\:text-gray-200 :is(:where(code):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:prose-pre\:bg-gray-800 :is(:where(pre):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:prose-li\:text-gray-200 :is(:where(li):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:prose-th\:text-gray-200 :is(:where(th):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:prose-td\:text-gray-200 :is(:where(td):not(:where([class~=not-prose],[class~=not-prose] *)))){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#ccc;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}</style><title data-react-helmet="true">Ehsan Hosseini | AI agent access control</title>
3<link data-react-helmet="true" rel="preconnect" href="https://fonts.googleapis.com"/><link data-react-helmet="true" rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link data-react-helmet="true" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&amp;family=Lato:wght@300;400;700&amp;display=swap" rel="stylesheet"/><link data-react-helmet="true" rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"/><link data-react-helmet="true" rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"/><link data-react-helmet="true" rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"/><link data-react-helmet="true" rel="manifest" href="/manifest.webmanifest"/><link data-react-helmet="true" rel="alternate" type="application/rss+xml" title="Ehsan Hosseini - RSS Feed" href="/rss.xml"/><link data-react-helmet="true" rel="canonical" href="https://ehosseini.info/"/><link rel="alternate" type="application/rss+xml" title="Ehsan Hosseini&#x27;s Blog RSS Feed" href="/rss.xml"/>
vendor: 1,074 bytes, lines 3-6
3<script>
4 !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
5posthog.init('phc_WOC2ZPbgTBxXo0hjo1z9YrwPmYD2Dl8xcUTT9fXXGcA', {"api_host":"https://eu.i.posthog.com","defaults":"2025-05-24","person_profiles":"always"})
6          </script>
6<style>.gatsby-image-wrapper{position:relative;overflow:hidden}.gatsby-image-wrapper picture.object-fit-polyfill{position:static!important}.gatsby-image-wrapper img{bottom:0;height:100%;left:0;margin:0;max-width:none;padding:0;position:absolute;right:0;top:0;width:100%;object-fit:cover}.gatsby-image-wrapper [data-main-image]{opacity:0;transform:translateZ(0);transition:opacity .25s linear;will-change:opacity}.gatsby-image-wrapper-constrained{display:inline-block;vertical-align:top}</style><noscript><style>.gatsby-image-wrapper noscript [data-main-image]{opacity:1!important}.gatsby-image-wrapper [data-placeholder-image]{opacity:0!important}</style></noscript>
6<script type="module">const e="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;e&&document.body.addEventListener("load",(function(e){const t=e.target;if(void 0===t.dataset.mainImage)return;if(void 0===t.dataset.gatsbyImageSsr)return;let a=null,n=t;for(;null===a&&n;)void 0!==n.parentNode.dataset.gatsbyImageWrapper&&(a=n.parentNode),n=n.parentNode;const o=a.querySelector("[data-placeholder-image]"),r=new Image;r.src=t.currentSrc,r.decode().catch((()=>{})).then((()=>{t.style.opacity=1,o&&(o.style.opacity=0,o.style.transition="opacity 500ms linear")}))}),!0);</script>
6<link rel="sitemap" type="application/xml" href="/sitemap-index.xml"/><link rel="icon" href="/favicon-32x32.png?v=e9a86ea055fedd64f3ca1a544f78432e" type="image/png"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="anonymous"/><link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png?v=e9a86ea055fedd64f3ca1a544f78432e"/><link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png?v=e9a86ea055fedd64f3ca1a544f78432e"/></head><body><div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div class="min-h-screen bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 transition-colors duration-200">
6<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://ehosseini.info/#person","name":"Ehsan Hosseini","givenName":"Ehsan","familyName":"Hosseini","url":"https://ehosseini.info/","image":"https://ehosseini.info/ehsan-hosseini.png","jobTitle":"Founder and Tech Lead","description":"I work on what AI agents are allowed to do inside companies, and whether you can prove who authorized it.","disambiguatingDescription":"Software engineer and founder based in Berlin, Germany, working on identity, delegation, and audit for enterprise AI agents.","homeLocation":{"@type":"Place","address":{"@type":"PostalAddress","addressLocality":"Berlin","addressRegion":"Berlin","addressCountry":"DE"}},"knowsAbout":["AI agent authorization","agent identity and delegation","per-action authorization","identity mesh","OAuth 2.0","OpenID Connect","OAuth token exchange","token attenuation","Model Context Protocol","MCP enterprise-managed authorization","Identity Assertion JWT Authorization Grant","audit trails for AI systems","AI agent governance","EU AI Act","ISO 42001","prompt injection","AI agent planning","web application security","frontend performance engineering","distributed systems"],"sameAs":["https://github.com/e-hosseini","https://x.com/eh_hosseini","https://www.linkedin.com/in/sehosseini/"]},{"@type":"WebSite","@id":"https://ehosseini.info/#website","url":"https://ehosseini.info/","name":"Ehsan Hosseini","publisher":{"@id":"https://ehosseini.info/#person"},"inLanguage":"en"}]}</script>
6<header class="border-b border-gray-200 dark:border-gray-800"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between items-center py-4"><a aria-current="page" class="text-xl font-bold flex items-center gap-2" href="/">Ehsan Hosseini</a><div class="flex items-center gap-4"><button class="md:hidden p-2 rounded focus:outline-none focus:ring-2 focus:ring-blue-500" aria-label="Open menu" aria-expanded="false"><svg class="h-6 w-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg></button><nav class="hidden md:flex items-center space-x-6 min-h-[2.25rem]"><a class="inline-flex items-center hover:text-blue-600 dark:hover:text-blue-400" href="/agent-access-control/">Series</a><a class="inline-flex items-center hover:text-blue-600 dark:hover:text-blue-400" href="/articles/">Articles</a><a class="inline-flex items-center hover:text-blue-600 dark:hover:text-blue-400" href="/about/">About</a><a href="https://calendar.app.google/c1tEUgv3jKVZ86ew9" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-3 py-1.5 text-sm rounded-lg font-medium bg-gray-900 text-white hover:bg-black dark:bg-white dark:text-gray-900 dark:hover:bg-gray-200 transition-colors shrink-0">Book 25 minutes</a></nav><button class="p-2 rounded-full hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors" aria-label="Switch to dark mode"><svg class="w-5 h-5 text-gray-700" fill="currentColor" viewBox="0 0 20 20"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg></button></div></div></div></header><main><div class="max-w-3xl mx-auto px-4 py-8"><div class="mb-12"><div class="flex flex-col md:flex-row gap-8 items-center"><div class="flex-shrink-0"><div data-gatsby-image-wrapper="" class="gatsby-image-wrapper gatsby-image-wrapper-constrained rounded-full w-24 h-24"><div style="max-width:1062px;display:block"><img alt="" role="presentation" aria-hidden="true" src="data:image/svg+xml;charset=utf-8,%3Csvg%20height=&#x27;1062&#x27;%20width=&#x27;1062&#x27;%20xmlns=&#x27;http://www.w3.org/2000/svg&#x27;%20version=&#x27;1.1&#x27;%3E%3C/svg%3E" style="max-width:100%;display:block;position:static"/></div><img aria-hidden="true" data-placeholder-image="" style="opacity:1;transition:opacity 500ms linear" decoding="async" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEHklEQVR42l1U3U/aZxT+JVYBFRFQQa0CfraKgoiIIKLyoYBfE2uME5eWbUa9kK5z6WLSddGLOi/Mqm1aLzRtqjPpulhv6mLSXXnRJf5Nz845Squ7eMPL733f5zzPec45ilqtRkFBAbRaLYqLi1FiNMJsMqOqqgqNjY2or6+HxVINq9WK2tpa+Waz2VBdVY3ycjNKSkqgp3dFRUUoLCyAkp+voU2hgJWWlqKyshI1NTY0NTWhrq6O9jVoa3PC5XKhoaEBNQTW0tKC27duyfnNm5XyTq/XE6gWCrPT6XT0sUQO+VIjPQyHw1hdXcXu7i7+evcOB/v7WH/yBJ2dnbDb7XC3twtwQ0O9qDGZTAKqMKrBYEBFRblIam2lSyRzY2MD5+fnOD09xfHxMQ4PD7G3t4fFxUUB8vt88HR00P1WYc6gZWVlUFiqyVRGObKIzHaKzCxevniBfz5+xNnZGU4+fMDx+/fY3NxEJrOErq4uBHt7EQh0o9PjERJMpqKiAgqz47xx8p1OJ132SvTtrS2ROzU1hZ8fPsTs7KwwCQZ70d/fj3g8hv6+PnT7/SK/qem2mKcwTXaQ2bnd7egJBDA9PY2lpSWkZmbQR4/u3Utjbm4Od+5M4Gs6Gx8fx9DQECKRMHqJaZfXC4ejVfKvlJvNn3Pn9XYKu0wmg+fPnuH1q1fY3t7G/ps3Ysovjx5hjYxKpVICGBscFLZ+v0+qgEtKYWfZKZbrI7BgMIiR4WECfI6joyP8fXKCnZc7+DadRoZY//jgAUZGRuROIh6XagiQKo+nQ1Qq2QJ2tbVRJD9CoX6RmZpJ4enT37G1vYWVlRV8QzlMJscRj8WQSMQxNjqKoUQC0WgUvUTCS7JbWuxQOJFZd7uJejgcotxEMDk5ibW1VSzMz+PXx4+F3cREUlR8NTYmgMMke2BgQAiwmZw2xWazwt7cjA63G4FuvyQ6Go1g7vvv8Ofbt5gnQDYjSUawikHK20QySbKHRTYzDoVCknun08GANqr8ZnLYjZ6eAGKxQUkwM/r30yfs7OxgYWGeTEiQCTEMkMQESWXQUWIZY0AyhtWxDxeAxJALlEuGu8BoMEpvp8mIPw4OpB5/W1/HD/fvU/3FqbP0kqIIGcIM+dd3lWEzAXJC2SDuawbj35ycHCn49N27+Gl5Gcu0PBQ4NzcXWmrZUpo0VouFUuESQ50OAqwmEAbiiWGg5ubxZaTuYRbc7CqVSoCLLweISpUn04nHFc8B3vNiLxzU14rReCFPTwAXIMWXl4tkRuou9xqNRsB5OmVBmGX2Hs9VHnVK9vBL1IvFkq8CZ/cCRP///42Z81yQAZtP0dVqzfXoVx5kQbXawmvn2cXvmD0vRUNUmS7/UdP6zFTHLK8D8tlF0C+BC7X8LR+qvDzcuJGD/wBIeoz1gU80xgAAAABJRU5ErkJggg==" alt=""/><picture><source type="image/webp" data-srcset="/static/e9a86ea055fedd64f3ca1a544f78432e/fd489/ehsan-hosseini.webp 266w,/static/e9a86ea055fedd64f3ca1a544f78432e/dc6f9/ehsan-hosseini.webp 531w,/static/e9a86ea055fedd64f3ca1a544f78432e/e2e5c/ehsan-hosseini.webp 1062w" sizes="(min-width: 1062px) 1062px, 100vw"/><img data-gatsby-image-ssr="" data-main-image="" style="opacity:0" sizes="(min-width: 1062px) 1062px, 100vw" decoding="async" loading="lazy" data-src="/static/e9a86ea055fedd64f3ca1a544f78432e/50d0a/ehsan-hosseini.png" data-srcset="/static/e9a86ea055fedd64f3ca1a544f78432e/10fb2/ehsan-hosseini.png 266w,/static/e9a86ea055fedd64f3ca1a544f78432e/d2621/ehsan-hosseini.png 531w,/static/e9a86ea055fedd64f3ca1a544f78432e/50d0a/ehsan-hosseini.png 1062w" alt="Ehsan Hosseini"/></picture><noscript><picture><source type="image/webp" srcSet="/static/e9a86ea055fedd64f3ca1a544f78432e/fd489/ehsan-hosseini.webp 266w,/static/e9a86ea055fedd64f3ca1a544f78432e/dc6f9/ehsan-hosseini.webp 531w,/static/e9a86ea055fedd64f3ca1a544f78432e/e2e5c/ehsan-hosseini.webp 1062w" sizes="(min-width: 1062px) 1062px, 100vw"/><img data-gatsby-image-ssr="" data-main-image="" style="opacity:0" sizes="(min-width: 1062px) 1062px, 100vw" decoding="async" loading="lazy" src="/static/e9a86ea055fedd64f3ca1a544f78432e/50d0a/ehsan-hosseini.png" srcSet="/static/e9a86ea055fedd64f3ca1a544f78432e/10fb2/ehsan-hosseini.png 266w,/static/e9a86ea055fedd64f3ca1a544f78432e/d2621/ehsan-hosseini.png 531w,/static/e9a86ea055fedd64f3ca1a544f78432e/50d0a/ehsan-hosseini.png 1062w" alt="Ehsan Hosseini"/></picture></noscript>
6<script type="module">const t="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll("img[data-main-image]");for(let e of t){e.dataset.src&&(e.setAttribute("src",e.dataset.src),e.removeAttribute("data-src")),e.dataset.srcset&&(e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset"));const t=e.parentNode.querySelectorAll("source[data-srcset]");for(let e of t)e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset");e.complete&&(e.style.opacity=1,e.parentNode.parentNode.querySelector("[data-placeholder-image]").style.opacity=0)}}</script>
6</div></div><div class="flex-1"><h1 class="text-2xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">Ehsan Hosseini</h1><p class="text-gray-600 dark:text-gray-400 text-sm mb-3">I work on what AI agents are allowed to do inside companies, and whether you can prove who authorized it.<!-- --> Based in Berlin.</p><p class="text-gray-700 dark:text-gray-300 text-sm mb-4">For AI agents, authentication is largely solved. Authorization is not. I write about the identity, delegation, and audit primitives that decide what an agent is actually allowed to do, and I build them at my company.</p><div class="flex flex-wrap items-center gap-4"><div class="flex space-x-3"><a href="https://github.com/e-hosseini" target="_blank" rel="me noopener noreferrer" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100" aria-label="GitHub"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.237 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg></a><a href="https://x.com/eh_hosseini" target="_blank" rel="me noopener noreferrer" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100" aria-label="X"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.227-8.451L1.502 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></svg></a><a href="https://www.linkedin.com/in/sehosseini/" target="_blank" rel="me noopener noreferrer" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100" aria-label="LinkedIn"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"></path></svg></a></div><a class="text-sm font-medium text-gray-900 dark:text-gray-100 hover:underline" href="/agent-access-control/">Read the series →</a></div></div></div></div><div class="mb-12 border-l-2 border-gray-200 dark:border-gray-700 pl-4"><h2 class="text-sm font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400 mb-3">Currently</h2><ul class="space-y-2 text-sm text-gray-700 dark:text-gray-300"><li>- Writing<!-- --> <a class="underline hover:text-gray-900 dark:hover:text-gray-100" href="/agent-access-control/">Agent Access Control: Pilot → Production</a>, a six-part series</li><li>- Building an access control layer for enterprise AI at my company</li><li>- Tracking the IETF drafts on agentic delegation and token attenuation</li><li>- Working through what the EU AI Act&#x27;s audit trail requirements mean in practice</li></ul></div><div class="mb-12"><div class="w-full bg-white border border-gray-200 dark:border-transparent dark:bg-gray-800 rounded-lg dark:shadow-sm p-6"><div class="flex flex-col sm:flex-row items-center justify-between gap-4 mb-4"><div><h2 class="text-lg font-medium text-gray-900 dark:text-white">Get the series as it ships</h2><p class="text-sm text-gray-600 dark:text-gray-300">New parts of Agent Access Control, plus analysis of agent identity standards as they move. Roughly monthly. No filler, no cadence promises I won&#x27;t keep.</p></div></div><form class='flex flex-col sm:flex-row gap-3' method='POST' name='newsletter'><input type="hidden" name="form-name" value="newsletter"/><div class="hidden"><input name="bot-field"/></div><div class="flex-1 flex flex-col sm:flex-row gap-3"><input type="text" name="name" id="name" placeholder="Your name" required="" class="flex-1 rounded-md border border-gray-300 focus:border-blue-500 focus:ring-blue-500 bg-white text-gray-900 placeholder-gray-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white dark:placeholder-gray-400 text-sm px-4 py-2 disabled:opacity-50"/><input type="email" name="email" id="email" placeholder="Your email" required="" class="flex-1 rounded-md border border-gray-300 focus:border-blue-500 focus:ring-blue-500 bg-white text-gray-900 placeholder-gray-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white dark:placeholder-gray-400 text-sm px-4 py-2 disabled:opacity-50"/></div><button type="submit" class="w-full sm:w-auto whitespace-nowrap px-6 py-2 border border-transparent roun
6ded-md shadow-sm text-sm font-medium text-black bg-gray-300 hover:bg-gray-400 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-400 dark:text-white dark:bg-gray-600 dark:hover:bg-gray-500 dark:focus:ring-gray-500 disabled:opacity-50">Subscribe</button></form></div></div><div><h2 class="text-2xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-6">Latest Articles</h2><div class="space-y-6"><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/ai-agent-governance-and-safety/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=ai-agent-governance-and-safety&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">AI Agent Governance and Safety: understanding the control points that matter</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">August 01, 2026</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/ai-agent-governance/">ai agent governance</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/ai-agent-safety/">ai agent safety</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/ai-agent-security/">ai agent security</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/agentic-ai-security/">agentic ai security</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/prompt-injection/">prompt injection</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/eu-ai-act-compliance/">eu ai act compliance</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/iso-42001/">iso 42001</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/owasp-top-10-agentic-applications/">owasp top 10 agentic applications</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/human-in-the-loop/">human in the loop</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/ai-governance-framework/">ai governance framework</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">In late July 2026 I gave a talk in Berlin on AI agent governance and safety, written for people who are new to the space. The topic sprawls across technical, architectural and legal ground, so this written version stays where engineers have real leverage: the control points where vulnerabilities actually happen.</p></a></div><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/mcp-enterprise-managed-authorization-ema/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=mcp-enterprise-managed-authorization-ema&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">Enterprise-Managed Authorization for MCP: what it actually does, and what it leaves to you</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">June 21, 2026</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/mcp/">MCP</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/agent-access-control/">agent-access-control</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/oauth-oidc/">oauth-oidc</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/authorization/">authorization</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/identity/">identity</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">MCP enterprise-managed authorization (EMA) lets the corporate identity provider decide which MCP servers employees can reach, with no per-server consent prompts. A practical, spec-accurate guide to the ID-JAG flow with a build checklist, and a hard line between what EMA secures (the connection) and what it leaves to you (per-action authorization).</p></a></div><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/identity-mesh-and-secure-ai-agents/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=identity-mesh-and-secure-ai-agents&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">Identity Mesh and Secure AI Agents</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">February 03, 2026</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/agent-access-control/">agent-access-control</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/identity/">identity</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/authorization/">authorization</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/oauth-oidc/">oauth-oidc</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/audit/">audit</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">Agent Access Control: Pilot → Production, Part 1 of 6. Why production AI agents must execute on behalf of a human or service identity, not with a shared &quot;agent token.&quot; Introduces Subject/Actor/Authority and per-action scoped access for auditable tool calls, plus the Identity Mesh concept for consistent per-action policy decisions across tools.</p></a></div><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/gdpr-vs-eu-ai-act/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=gdpr-vs-eu-ai-act&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">GDPR vs. the EU AI Act: Why This Time, the Stakes Feel Different</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">October 10, 2025</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/eu-ai-act/">
6EU AI Act</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/audit/">audit</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/agent-access-control/">agent-access-control</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">Exploring how the EU AI Act extends the principles of GDPR from data protection to system accountability, and why this new regulatory wave feels fundamentally different.</p></a></div><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/ai-future-of-agents/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=ai-future-of-agents&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">The Future of LLMs and AI Agentic Platforms: Opportunities and Strategies</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">August 06, 2025</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/ai-agents/">ai-agents</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">An in-depth exploration of how Large Language Models (LLMs) and specialized AI agentic platforms will shape the future, examining current challenges, technological advancements, practical use-cases, and strategic insights.</p></a></div><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/ai-security-shared-conversation-leaks/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=ai-security-shared-conversation-leaks&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">Crucial Considerations for Corporate Data Security: Public Accessibility of Shared AI Conversations</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">July 31, 2025</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/audit/">audit</a><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/agent-access-control/">agent-access-control</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">Contrary to common understanding, shared AI conversations often end up being publicly indexed and available. This chapter warns businesses about the real and immediate threats, and guides how to safeguard against data leakage via AI tools.</p></a></div><div class="border-b relative border-gray-100 dark:border-gray-800 pb-6"><a class="block bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 p-4 rounded-md transition-colors duration-200 group" href="/articles/ai-agent-planning/"><div class="group-hover:opacity-70 transition-opacity duration-200 opacity-0 rounded-md absolute top-0 left-0" style="width:100%;height:10px;background-image:url(https://bx.ehosseini.info/?text=ai-agent-planning&amp;width=800&amp;height=50&amp;complexity=6);background-size:cover;background-repeat:no-repeat;background-position:center"></div><h3 class="text-xl font-playfair font-medium text-gray-900 dark:text-gray-100 mb-2">Advanced Techniques for Planning in AI Agents: A Comprehensive Guide</h3><div class="flex items-center text-sm text-gray-500 dark:text-gray-400 mb-3"><span class="mr-3">May 15, 2025</span><div class="flex flex-wrap gap-1"><a class="inline-block px-2 py-1 text-xs font-medium rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 " href="/tags/ai-agents/">ai-agents</a></div></div><p class="text-gray-600 dark:text-gray-300 text-sm">Planning is a fundamental aspect that transforms AI agents from simple chatbots into intelligent assistants capable of executing complex tasks. This article dives deep into the concept of planning, the challenges it presents, and provides real-world examples.</p></a></div></div><div class="mt-8 text-center"><a class="inline-block text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 text-sm" href="/articles/">View All Articles →</a></div></div></div></main><footer class="bg-white dark:bg-gray-900 border-t border-gray-100 dark:border-gray-800"><div class="max-w-7xl mx-auto px-4 py-24"><div class="grid grid-cols-1 md:grid-cols-3 gap-16"><div><h2 class="text-6xl font-light tracking-tight mb-16 text-gray-900 dark:text-gray-100">about</h2></div><div class="md:col-span-2"><div class="flex flex-col"><div class="w-48 h-48 rounded-full overflow-hidden mb-6"><div data-gatsby-image-wrapper="" class="gatsby-image-wrapper gatsby-image-wrapper-constrained w-full h-full object-cover"><div style="max-width:192px;display:block"><img alt="" role="presentation" aria-hidden="true" src="data:image/svg+xml;charset=utf-8,%3Csvg%20height=&#x27;192&#x27;%20width=&#x27;192&#x27;%20xmlns=&#x27;http://www.w3.org/2000/svg&#x27;%20version=&#x27;1.1&#x27;%3E%3C/svg%3E" style="max-width:100%;display:block;position:static"/></div><img aria-hidden="true" data-placeholder-image="" style="opacity:1;transition:opacity 500ms linear" decoding="async" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEHklEQVR42l1U3U/aZxT+JVYBFRFQQa0CfraKgoiIIKLyoYBfE2uME5eWbUa9kK5z6WLSddGLOi/Mqm1aLzRtqjPpulhv6mLSXXnRJf5Nz845Squ7eMPL733f5zzPec45ilqtRkFBAbRaLYqLi1FiNMJsMqOqqgqNjY2or6+HxVINq9WK2tpa+Waz2VBdVY3ycjNKSkqgp3dFRUUoLCyAkp+voU2hgJWWlqKyshI1NTY0NTWhrq6O9jVoa3PC5XKhoaEBNQTW0tKC27duyfnNm5XyTq/XE6gWCrPT6XT0sUQO+VIjPQyHw1hdXcXu7i7+evcOB/v7WH/yBJ2dnbDb7XC3twtwQ0O9qDGZTAKqMKrBYEBFRblIam2lSyRzY2MD5+fnOD09xfHxMQ4PD7G3t4fFxUUB8vt88HR00P1WYc6gZWVlUFiqyVRGObKIzHaKzCxevniBfz5+xNnZGU4+fMDx+/fY3NxEJrOErq4uBHt7EQh0o9PjERJMpqKiAgqz47xx8p1OJ132SvTtrS2ROzU1hZ8fPsTs7KwwCQZ70d/fj3g8hv6+PnT7/SK/qem2mKcwTXaQ2bnd7egJBDA9PY2lpSWkZmbQR4/u3Utjbm4Od+5M4Gs6Gx8fx9DQECKRMHqJaZfXC4ejVfKvlJvNn3Pn9XYKu0wmg+fPnuH1q1fY3t7G/ps3Ysovjx5hjYxKpVICGBscFLZ+v0+qgEtKYWfZKZbrI7BgMIiR4WECfI6joyP8fXKCnZc7+DadRoZY//jgAUZGRuROIh6XagiQKo+nQ1Qq2QJ2tbVRJD9CoX6RmZpJ4enT37G1vYWVlRV8QzlMJscRj8WQSMQxNjqKoUQC0WgUvUTCS7JbWuxQOJFZd7uJejgcotxEMDk5ibW1VSzMz+PXx4+F3cREUlR8NTYmgMMke2BgQAiwmZw2xWazwt7cjA63G4FuvyQ6Go1g7vvv8Ofbt5gnQDYjSUawikHK20QySbKHRTYzDoVCknun08GANqr8ZnLYjZ6eAGKxQUkwM/r30yfs7OxgYWGeTEiQCTEMkMQESWXQUWIZY0AyhtWxDxeAxJALlEuGu8BoMEpvp8mIPw4OpB5/W1/HD/fvU/3FqbP0kqIIGcIM+dd3lWEzAXJC2SDuawbj35ycHCn49N27+Gl5Gcu0PBQ4NzcXWmrZUpo0VouFUuESQ50OAqwmEAbiiWGg5ubxZaTuYRbc7CqVSoCLLweISpUn04nHFc8B3vNiLxzU14rReCFPTwAXIMWXl4tkRuou9xqNRsB5OmVBmGX2Hs9VHnVK9vBL1IvFkq8CZ/cCRP///42Z81yQAZtP0dVqzfXoVx5kQbXawmvn2cXvmD0vRUNUmS7/UdP6zFTHLK8D8tlF0C+BC7X8LR+qvDzcuJGD/wBIeoz1gU80xgAAAABJRU5ErkJggg==" alt=""/><picture><source type="image/webp" data-srcset="/static/e9a86ea055fedd64f3ca1a544f78432e/b86bb/ehsan-hosseini.webp 48w,/static/e9a86ea055fedd64f3ca1a544f78432e/bb677/ehsan-hosseini.webp 96w,/static/e9a86ea055fedd64f3ca1a544f78432e/5a28d/ehsan-hosseini.webp 192w,/static/e9a86ea055fedd64f3ca1a544f78432e/bee8a/ehsan-hosseini.webp 384w" sizes="(min-width: 192px) 192px, 100vw"/><img data-gatsby-image-ssr="" data-main-image="" style="opacity:0" sizes="(min-width: 192px) 192px, 100vw" decoding="async" loading="lazy" data-src="/static/e9a86ea055fedd64f3ca1a544f78432e/fb5f6/ehsan-hosseini.png" data-srcset="/static/e9a86ea055fedd64f3ca1a544f78432e/aceca/ehsan-hosseini.png 48w,/static/e9a86ea055fedd64f3ca1a544f78432e/707b5/ehsan-hosseini.png 96w,/static/e9a86ea055fedd64f3ca1a544f78432e/fb5f6/ehsan-hosseini.png 192w,/static/e9a86ea055fedd64f3ca1a544f78432e/569d1/ehsan-hosseini.png 384w" alt="Ehsan Hosseini"/></picture><noscript><picture><source type="image/webp" srcSet="/static/e9a86ea055fedd64f3ca1a544f78432e/b86bb/ehsan-hosseini.webp 48w,/static/e9a86ea055fedd64f3ca1a544f78432e/bb677/ehsan-hosseini.webp 96w,/static/e9a86ea055fedd64f3ca1a544f78432e/5a28d/ehsan-hosseini.webp 192w,/static/e9a86ea055fedd64f3ca1a544f78432e/bee8a/ehsan-hosseini.webp 384w" sizes="(min-width: 192px) 192px, 100vw"/><img data-gatsby-image-ssr="" data-main-image="" style="opacity:0" sizes="(min-width: 192px) 192px, 100vw" decoding="async" loading="lazy" src="/static/e9a86ea055fedd64f3ca1a544f78432e/fb5f6/ehsan-hosseini.png" srcSet="/static/e9a86ea055fedd64f3ca1a544f78432e/aceca/ehsan-hosseini.png 48w,/static/e9a86ea055fedd64f3ca1a544f78432e/707b5/ehsan-hosseini.png 96w,/static/e9a86ea055fedd64f3ca1a544f78432e/fb5f6/ehsan-hosseini.png 192w,/static/e9a86ea055fedd64f3ca1a544f78432e/569d1/ehsan-hosseini.png 384w" alt="Ehsan Hosseini"/></picture></noscript>
6<script type="module">const t="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll("img[data-main-image]");for(let e of t){e.dataset.src&&(e.setAttribute("src",e.dataset.src),e.removeAttribute("data-src")),e.dataset.srcset&&(e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset"));const t=e.parentNode.querySelectorAll("source[data-srcset]");for(let e of t)e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset");e.complete&&(e.style.opacity=1,e.parentNode.parentNode.querySelector("[data-placeholder-image]").style.opacity=0)}}</script>
6</div></div><div class="flex space-x-4"><a href="https://github.com/e-hosseini" target="_blank" rel="me noopener noreferrer" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100" aria-label="GitHub"><svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.237 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg></a><a href="https://x.com/eh_hosseini" target="_blank" rel="me noopener noreferrer" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100" aria-label="X"><svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.227-8.451L1.502 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></svg></a><a href="https://www.linkedin.com/in/sehosseini/" target="_blank" rel="me noopener noreferrer" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100" aria-label="LinkedIn"><svg class="w-6 h-6" fill="currentColor" viewBox="0 0 24 24"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"></path></svg></a></div></div><div class="mt-12"><h3 class="text-xl font-light mb-4 text-gray-900 dark:text-gray-100">Ehsan Hosseini</h3><p class="text-md font-light text-gray-700 dark:text-gray-300">me [at] ehosseini [dot] info</p></div><p class="text-md font-light leading-relaxed text-gray-700 dark:text-gray-300 mb-4 mt-4">I work on what AI agents are allowed to do inside companies, and whether you can prove who authorized it. I write about it here, and build it at my company.</p></div></div></div></footer></div></div><div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div></div>
6<script id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/";/*]]>*/</script>
6<!-- slice-start id="_gatsby-scripts-1" -->
7          
7<script
8            id="gatsby-chunk-mapping"
9          >
10            window.___chunkMapping="{\"app\":[\"/app-468c49ca4641ef06a1d0.js\"],\"component---src-pages-404-tsx\":[\"/component---src-pages-404-tsx-e6ba7bcb7bdca1d2e5bc.js\"],\"component---src-pages-about-tsx\":[\"/component---src-pages-about-tsx-7dadfcf5f60f34220ce4.js\"],\"component---src-pages-agent-access-control-tsx\":[\"/component---src-pages-agent-access-control-tsx-55a926b77eec56f42760.js\"],\"component---src-pages-index-tsx\":[\"/component---src-pages-index-tsx-d335a4aef851511c7a0d.js\"],\"component---src-pages-tags-tsx\":[\"/component---src-pages-tags-tsx-b1546cd7f3e18979a57e.js\"],\"component---src-templates-blog-list-tsx\":[\"/component---src-templates-blog-list-tsx-d67e9cbec9a239df4695.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-adaptive-loading-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-adaptive-loading-mdx-4317eb68969519d000c3.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-ai-agent-governance-and-safety-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-ai-agent-governance-and-safety-mdx-ff73cca207f001ea96d7.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-ai-agent-planning-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-ai-agent-planning-mdx-83363dac6e57ce0e32f1.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-ai-future-of-agents-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-ai-future-of-agents-mdx-c140fe3714a68c4fb24a.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-ai-security-shared-conversation-leaks-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-ai-security-shared-conversation-leaks-mdx-6ce40861c0d4645d45e5.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-authentication-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-authentication-mdx-a7f4eff99bfea7fe8843.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-authorization-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-authorization-mdx-e9d8d313ff7a20ba428a.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-caching-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-caching-mdx-97f8c3437467e3689bbd.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-error-handling-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-error-handling-mdx-9c98b75f166089cd9eac.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-filtering-sorting-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-filtering-sorting-mdx-f035bc6a16ee621f9b68.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-pagination-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-pagination-mdx-130a716731ac01c4d11f.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-rate-limiting-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-rate-limiting-mdx-b332bea61cbcf7f47090.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-api-webhook-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-api-webhook-mdx-b5852a70e1d53f943ff6.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-batching-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-batching-mdx-8ed2dfc4de998b12f831.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-bundle-splitting-lazy-loading-code-splitting-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-bundle-splitting-lazy-loading-code-splitting-mdx-d0786101a8a69376d64b.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-caching-expiry-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-caching-expiry-mdx-5387b4d701b2a29021dd.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-caching-memoizing-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-caching-memoizing-mdx-f01108a3f05ad0a38519.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-client-side-rendering-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-client-side-rendering-mdx-aa338faa1aa335d4f39e.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-composition-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-composition-mdx-97b5ca8627e0874a5bf3.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-compression-code-media-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-compression-code-media-mdx-a59e837b58a48955e535.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-core-web-vitals-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-core-web-vitals-mdx-2190fb2ef59e762e5a13.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-debounce-throttle-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-debounce-throttle-mdx-a1bf44717b061338a403.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-debouncing-throttling-performance-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-debouncing-throttling-performance-mdx-93acfa19187b09428447.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-dom-batching-minimizing-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-dom-batching-minimizing-mdx-274270967f533652c457.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-edge-rendering-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-edge-rendering-mdx-9ff80fe978d0dccaa46a.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-event-handlers-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-event-handlers-mdx-12b39807c78dd4388770.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-fetching-data-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-fetching-data-mdx-b0431faeeff643711668.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-flux-architecture-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-flux-architecture-mdx-736915f9b4a3dda8344c.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-focus-management-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-focus-management-mdx-4fa44c3c24a1e94ea3c2.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-gdpr-vs-eu-ai-act-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-gdpr-vs-eu-ai-act-mdx-0b683f6ddca2bc39b614.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-graphql-api-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-graphql-api-mdx-18b1da8978271804eba4.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-headings-hierarchy-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-headings-hierarchy-mdx-8584c928117e90099842.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-identity-mesh-and-secure-ai-agents-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-identity-mesh-and-secure-ai-agents-mdx-7bdeb2dcdfabda03f7a6.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-incremental-static-regeneration-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-incremental-static-regeneration-mdx-6b6a8bf9d90b99fa575e.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-islands-architecture-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-islands-architecture-mdx-3db553f64c32bb809aec.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-keyboard-interactions-shortcuts-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-keyboard-interactions-shortcuts-mdx-7669119a0fb1056feb59.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-lazy-loading-state-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-lazy-loading-state-mdx-f906c9a985411d36825f.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-list-virtualization-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-list-virtualization-mdx-588bbea6dae95ed86a4a.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-long-polling-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-long-polling-mdx-b13a94e20e16118818f6.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-mcp-enterprise-managed-authorization-ema-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-mcp-enterprise-managed-authorization-ema-mdx-48a327a397871c9c76bf.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-memory-leaks-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-memory-leaks-mdx-f3d0ce35841277a2ad49.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-monitoring-js-stack-traces-sourcemaps-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-monitoring-js-stack-traces-sourcemaps-mdx-f24d6d764323d2bb0e7d.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-monitoring-opentelemetry-frontend-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-monitoring-opentelemetry-frontend-mdx-ece2d073a1083b0d05c2.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-monitoring-user-journey-tracking-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-monitoring-user-journey-tracking-mdx-aeff3de18e661a6793d4.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-normalized-stores-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-normalized-stores-mdx-9e4104cb652c70522fab.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-optimistic-updates-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-optimistic-updates-mdx-554981
10a849e31e6447d6.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-optimistic-updates-performance-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-optimistic-updates-performance-mdx-dbd656b6352d8194ee35.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-optimize-loading-sequences-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-optimize-loading-sequences-mdx-70fea92bfc7d37083d58.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-partial-hydration-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-partial-hydration-mdx-0af27107e679538401fc.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-polling-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-polling-mdx-a06510b5c84e125f6ced.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-preloading-prefetching-js-data-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-preloading-prefetching-js-data-mdx-d306dddb2a5c65c2d02c.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-progressive-hydration-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-progressive-hydration-mdx-f76bcf1746f037eee17f.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-race-conditions-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-race-conditions-mdx-acba21cda4732d5034a1.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-rate-limiting-patterns-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-rate-limiting-patterns-mdx-7e497aa818e8a332e1a0.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-react-server-components-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-react-server-components-mdx-7af6fc39924af887af95.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-react-streaming-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-react-streaming-mdx-bb2a99431b76738d284c.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-reducing-reflows-repaints-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-reducing-reflows-repaints-mdx-2704eaa39ab5f7397102.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-render-props-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-render-props-mdx-4395b45e17a873659665.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-rendering-strategies-comparison-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-rendering-strategies-comparison-mdx-083df3bb2d76f72bd489.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-restful-api-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-restful-api-mdx-0cf4e36ec2ff7b09bfbf.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-retries-backoff-jitter-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-retries-backoff-jitter-mdx-e700c5e05735b9a7a3a6.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-security-cors-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-security-cors-mdx-8c48fbb82769b8130765.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-security-csp-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-security-csp-mdx-27795e033ae32356bbd1.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-security-csrf-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-security-csrf-mdx-4dbddeaab5b95ca06162.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-security-xss-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-security-xss-mdx-5d11854d1927fc59418d.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-server-sent-events-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-server-sent-events-mdx-a4d1b4a11aa457552df1.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-server-side-rendering-ssr-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-server-side-rendering-ssr-mdx-52aa6244491acabb3fa0.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-serverless-architecture-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-serverless-architecture-mdx-a9aca35e01b8e7b45a94.js\"],\"component---src-templates-post-tsx-content-file-path-src-posts-web
10sockets-mdx\":[\"/component---src-templates-post-tsx-content-file-path-src-posts-websockets-mdx-33e8581c8dd2a77d06cf.js\"],\"component---src-templates-tag-tsx\":[\"/component---src-templates-tag-tsx-58b7507265bc7dcf8372.js\"],\"component---src-templates-tags-list-tsx\":[\"/component---src-templates-tags-list-tsx-0fd19c0e2eb09ef03e5e.js\"]}";
11          </script>
11
12        
12<script>window.___webpackCompilationHash="0127eb78ae7b9de91724";</script>
12<script src="/webpack-runtime-cbe812f2a47b5ddf59c5.js" async></script>
12<script src="/framework-8a11a281608396051262.js" async></script>
12<script src="/app-468c49ca4641ef06a1d0.js" async></script>
12<!-- slice-end id="_gatsby-scripts-1" -->
12<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"4b1a0bf9efc1408694938d213cc44e0d","r":1,"spa":2}' crossorigin="anonymous"></script>
12
13</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.