1:"$Sreact.fragment" 2:I[39756,["/_next/static/chunks/3fntmmi971322.js"],"default"] 3:I[8821,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/22aga_6h1t_-r.js"],"default"] 4:I[37457,["/_next/static/chunks/3fntmmi971322.js"],"default"] 5:I[22016,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],""] 7:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"OutletBoundary"] 8:"$Sreact.suspense" b:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"ViewportBoundary"] d:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"MetadataBoundary"] f:I[68027,["/_next/static/chunks/3fntmmi971322.js"],"default",1] :HL["/_next/static/chunks/0p5_b9mq-qlz-.css","style"] :HL["/_next/static/media/017d9bea37084d9b-s.p.41rroleoq1br7.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/chunks/17s1t3rwlqr6e.css","style"] a:X 0:{"P":null,"c":["","docs","open-source","releases","2.2.0"],"q":"","i":false,"f":[[["",{"children":["docs",{"children":["open-source",{"children":[["path","releases/2.2.0","c",[]],{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4608]},"$undefined","$undefined",4608]},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0p5_b9mq-qlz-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/3fntmmi971322.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","data-theme":"dark","style":{"colorScheme":"dark"},"children":["$","body",null,{"className":"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$3","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"/_next/static/chunks/22aga_6h1t_-r.js","async":true,"nonce":"$undefined"}]],"template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","div",null,{"className":"flex min-h-screen flex-col items-center justify-center bg-stone-950 text-stone-100","children":[["$","h1",null,{"className":"text-6xl font-bold tracking-tight text-stone-400","children":"404"}],["$","p",null,{"className":"mt-4 text-lg text-stone-500","children":"Page not found"}],["$","$L5",null,{"href":"/","className":"mt-8 rounded-md bg-stone-800 px-5 py-2.5 text-sm font-medium text-stone-200 transition hover:bg-stone-700","children":"Back to home"}]]}],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":["$L6",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/17s1t3rwlqr6e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0ahwd129-7-30.js","async":true,"nonce":"$undefined"}]],["$","$L7",null,{"children":["$","$8",null,{"name":"Next.MetadataOutlet","children":"$@9"}]}]]}],{},null,false,null]},null,false,"$a"]},null,false,"$a"]},null,false,"$a"]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$8",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0p5_b9mq-qlz-.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"B8hBXTSnfA3UAgbX2EKsx"} a:C c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] 10:I[29306,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],"ProductMenu"] 11:I[5014,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],"default"] 12:I[33964,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],"PublicMobileNav"] 15:I[27201,["/_next/static/chunks/3fntmmi971322.js"],"IconMark"] 6:["$","div",null,{"className":"bricolage_grotesque_bcc75999-module__ZKECFW__variable relative min-h-screen overflow-x-clip bg-[#07090E] text-[#EAEDF2]","children":[["$","header",null,{"className":"sticky top-0 z-40 border-b border-white/[0.07] bg-[#07090E]/85 backdrop-blur-md","children":["$","div",null,{"className":"mx-auto flex max-w-7xl items-center justify-between gap-4 px-4 py-3.5 sm:px-6","children":[["$","div",null,{"className":"flex min-w-0 items-center gap-8","children":[["$","$L5",null,{"href":"/","className":"font-display inline-flex items-baseline gap-2 text-lg font-bold tracking-tight text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":[["$","span",null,{"className":"h-2 w-2 translate-y-[-1px] bg-emerald-400","aria-hidden":"true"}],"ShakerScan"]}],["$","nav",null,{"className":"hidden items-center gap-6 text-sm text-[#98A2B3] lg:flex","aria-label":"Primary","children":[["$","$L10",null,{"items":[{"label":"Scan","href":"/product/scan","description":"Repeatable DAST for web apps and APIs","badge":"$undefined"},{"label":"Hunt","href":"/product/hunt","description":"Adaptive investigation with your coding agent","badge":"$undefined"},{"label":"AI Security","href":"/product/ai-security","description":"Test chat, RAG, agent, and MCP systems","badge":"Preview"},{"label":"Model Intake","href":"/product/model-intake","description":"Check model artifacts before deployment","badge":"Preview"},{"label":"Attack Surface","href":"/product/attack-surface","description":"Endpoint inventory, subdomains, CT monitoring","badge":"$undefined"},{"label":"Connected Devices","href":"/product/connected-devices","description":"TVs, cameras, printers, routers, appliances","badge":"$undefined"}]}],[["$","a","/check/",{"href":"/check/","className":"transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":"Free check"}],["$","$L5","/docs",{"href":"/docs","className":"transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":"Docs"}],["$","$L5","/enterprise",{"href":"/enterprise","className":"transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400 font-semibold text-[#EAEDF2]","children":"Enterprise"}]],["$","a",null,{"href":"https://github.com/andriyze/shakerscan","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1.5 transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":[["$","$L11",null,{"ref":"$undefined","icon":{"name":"git-fork","size":24,"node":[["circle",{"cx":"12","cy":"18","r":"3","key":"1mpf1b"}],["circle",{"cx":"6","cy":"6","r":"3","key":"1lh9wr"}],["circle",{"cx":"18","cy":"6","r":"3","key":"1h7g24"}],["path",{"d":"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9","key":"1uq4wg"}],["path",{"d":"M12 12v3","key":"158kv8"}]]},"className":"h-3.5 w-3.5","aria-hidden":"true"}],"GitHub"]}]]}]]}],["$","div",null,{"className":"flex items-center gap-2 sm:gap-4","children":[["$","$L12",null,{"items":[{"label":"Scan","href":"/product/scan"},{"label":"Hunt","href":"/product/hunt"},{"label":"AI Security","href":"/product/ai-security"},{"label":"Model Intake","href":"/product/model-intake"},{"label":"Attack Surface","href":"/product/attack-surface"},{"label":"Connected Devices","href":"/product/connected-devices"},{"label":"Free check","href":"/check/","isAnchor":true,"emphasis":false},{"label":"Docs","href":"/docs","isAnchor":false,"emphasis":false},{"label":"Enterprise","href":"/enterprise","isAnchor":false,"emphasis":true},{"label":"GitHub","href":"https://github.com/andriyze/shakerscan"},{"label":"Open Source","href":"/open-source"}]}],["$","$L5",null,{"href":"/open-source#install","className":"rounded-lg bg-emerald-400 px-3.5 py-2 text-sm font-semibold text-emerald-950 transition-colors hover:bg-emerald-300 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":"Install ShakerScan"}]]}]]}]}],"$L13","$L14"]}] 9:null e:[["$","title","0",{"children":"ShakerScan 2.2.0 — ShakerScan Docs"}],["$","meta","1",{"name":"description","content":"Trustworthy upgrades, the fifth image handled everywhere, and DAST depth restored on the 2.1.0 platform. Upgrade in place from 2.1.0; 0.8.18 is the oldest…"}],["$","meta","2",{"name":"robots","content":"index, follow"}],["$","link","3",{"rel":"canonical","href":"https://shakerscan.com/docs/open-source/releases/2.2.0"}],["$","meta","4",{"property":"og:title","content":"ShakerScan 2.2.0 — ShakerScan Docs"}],["$","meta","5",{"property":"og:description","content":"Trustworthy upgrades, the fifth image handled everywhere, and DAST depth restored on the 2.1.0 platform. Upgrade in place from 2.1.0; 0.8.18 is the oldest…"}],["$","meta","6",{"property":"og:url","content":"https://shakerscan.com/docs/open-source/releases/2.2.0"}],["$","meta","7",{"property":"og:site_name","content":"ShakerScan"}],["$","meta","8",{"property":"og:type","content":"article"}],["$","meta","9",{"name":"twitter:card","content":"summary"}],["$","meta","10",{"name":"twitter:title","content":"ShakerScan 2.2.0 — ShakerScan Docs"}],["$","meta","11",{"name":"twitter:description","content":"Trustworthy upgrades, the fifth image handled everywhere, and DAST depth restored on the 2.1.0 platform. Upgrade in place from 2.1.0; 0.8.18 is the oldest…"}],["$","link","12",{"rel":"icon","href":"/favicon.svg","type":"image/svg+xml"}],["$","link","13",{"rel":"apple-touch-icon","href":"/apple-icon.svg","type":"image/svg+xml"}],["$","$L15","14",{}]] 13:["$","div",null,{"className":"mx-auto max-w-7xl px-4 py-8 sm:px-6 sm:py-12 lg:grid lg:grid-cols-[230px_minmax(0,1fr)] lg:gap-10 xl:grid-cols-[230px_minmax(0,1fr)_200px]","children":[["$","aside",null,{"className":"lg:sticky lg:top-20 lg:self-start","children":[["$","details",null,{"className":"rounded-lg border border-white/10 bg-[#0C1118] lg:hidden","children":[["$","summary",null,{"className":"cursor-pointer px-4 py-3 text-sm font-medium text-white","children":"Documentation menu"}],["$","div",null,{"className":"border-t border-white/[0.07] px-4 py-4","children":["$","nav",null,{"aria-label":"Open-source documentation","className":"space-y-6","children":[["$","$L5",null,{"href":"/docs/open-source","className":"block text-sm font-semibold text-white hover:text-emerald-200","children":"Documentation home"}],[["$","div","Getting started",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Getting started"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","README.md",{"children":["$","$L5",null,{"href":"/docs/open-source/readme","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"README: install and first scan"}]}],["$","li","WALKTHROUGH.md",{"children":["$","$L5",null,{"href":"/docs/open-source/walkthrough","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"First-run walkthrough"}]}],["$","li","docs/upgrade-and-rollback.md",{"children":["$","$L5",null,{"href":"/docs/open-source/upgrade-and-rollback","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Upgrade and rollback"}]}],["$","li","docs/client.md",{"children":["$","$L5",null,{"href":"/docs/open-source/client","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Client, CLI and public checks"}]}],["$","li","skills/README.md",{"children":["$","$L5",null,{"href":"/docs/open-source/skills","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Agent skills and setup"}]}]]}]]}],["$","div","Workflows",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Workflows"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","docs/product-model.md",{"children":["$","$L5",null,{"href":"/docs/open-source/product-model","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Product model and vocabulary"}]}],["$","li","docs/hunt-architecture.md",{"children":["$","$L5",null,{"href":"/docs/open-source/hunt-architecture","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Hunt architecture"}]}],["$","li","docs/hunt-authorization-workflow.md",{"children":["$","$L5",null,{"href":"/docs/open-source/hunt-authorization-workflow","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Hunt authorization workflow"}]}],["$","li","docs/hunt-authorization-behavior.md",{"children":["$","$L5",null,{"href":"/docs/open-source/hunt-authorization-behavior","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Hunt authorization behavior"}]}],"$L16","$L17","$L18"]}]]}],"$L19","$L1a"],"$L1b"]}]}]]}],"$L1c"]}],"$L1d","$L1e"]}] 14:["$","footer",null,{"className":"border-t border-white/[0.07]","children":["$","div",null,{"className":"mx-auto max-w-7xl px-4 py-12 sm:px-6 sm:py-16","children":[["$","div",null,{"className":"grid gap-10 sm:grid-cols-2 lg:grid-cols-[1.4fr_1fr_1fr_1fr]","children":[["$","div",null,{"children":[["$","$L5",null,{"href":"/","className":"font-display inline-flex items-baseline gap-2 text-lg font-bold tracking-tight text-white","children":[["$","span",null,{"className":"h-2 w-2 translate-y-[-1px] bg-emerald-400","aria-hidden":"true"}],"ShakerScan"]}],["$","p",null,{"className":"mt-3 max-w-xs text-sm leading-6 text-[#7C8798]","children":"Open-source security testing platform for web applications, APIs, AI systems, and network-connected devices. Self-hosted in Docker."}],["$","p",null,{"className":"mt-4 text-xs leading-5 text-[#5F6B7A]","children":"Only test systems you own or are explicitly authorized to assess."}]]}],[["$","div","Product",{"children":[["$","h4",null,{"className":"font-mono text-[11px] tracking-[0.22em] text-[#5F6B7A] uppercase","children":"Product"}],["$","ul",null,{"className":"mt-4 space-y-2.5","children":[["$","li","/product/scan",{"children":["$","$L5",null,{"href":"/product/scan","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Scan"}]}],["$","li","/product/hunt",{"children":["$","$L5",null,{"href":"/product/hunt","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Hunt"}]}],["$","li","/product/ai-security",{"children":["$","$L5",null,{"href":"/product/ai-security","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"AI Security"}]}],["$","li","/product/model-intake",{"children":["$","$L5",null,{"href":"/product/model-intake","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Model Intake"}]}],["$","li","/product/attack-surface",{"children":["$","$L5",null,{"href":"/product/attack-surface","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Attack Surface"}]}],["$","li","/product/connected-devices",{"children":["$","$L5",null,{"href":"/product/connected-devices","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Connected Devices"}]}]]}]]}],["$","div","Resources",{"children":[["$","h4",null,{"className":"font-mono text-[11px] tracking-[0.22em] text-[#5F6B7A] uppercase","children":"Resources"}],["$","ul",null,{"className":"mt-4 space-y-2.5","children":[["$","li","/open-source",{"children":["$","$L5",null,{"href":"/open-source","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Open Source"}]}],["$","li","/check/",{"children":["$","a",null,{"href":"/check/","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Free posture check"}]}],["$","li","/docs",{"children":["$","$L5",null,{"href":"/docs","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Documentation"}]}],["$","li","/research",{"children":["$","$L5",null,{"href":"/research","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Research"}]}],["$","li","/about",{"children":["$","$L5",null,{"href":"/about","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"About"}]}]]}]]}],["$","div","Trust",{"children":[["$","h4",null,{"className":"font-mono text-[11px] tracking-[0.22em] text-[#5F6B7A] uppercase","children":"Trust"}],["$","ul",null,{"className":"mt-4 space-y-2.5","children":[["$","li","/security",{"children":["$","$L5",null,{"href":"/security","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Security"}]}],"$L1f","$L20","$L21"]}]]}]]]}],"$L22"]}]}] 16:["$","li","docs/AI_TEST_WORKFLOWS.md",{"children":["$","$L5",null,{"href":"/docs/open-source/AI_TEST_WORKFLOWS","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"AI test workflows"}]}] 17:["$","li","docs/connected-device-security.md",{"children":["$","$L5",null,{"href":"/docs/open-source/connected-device-security","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Connected-device security"}]}] 18:["$","li","docs/model-intake-security-review-roadmap.md",{"children":["$","$L5",null,{"href":"/docs/open-source/model-intake-security-review-roadmap","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Model Intake boundary"}]}] 19:["$","div","Architecture and operations",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Architecture and operations"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","docs/dast-asm-architecture.md",{"children":["$","$L5",null,{"href":"/docs/open-source/dast-asm-architecture","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"DAST execution and Continuous ASM"}]}],["$","li","docs/multi-node-guide.md",{"children":["$","$L5",null,{"href":"/docs/open-source/multi-node-guide","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Multi-node Fleet guide"}]}],["$","li","docs/multi-node-architecture.md",{"children":["$","$L5",null,{"href":"/docs/open-source/multi-node-architecture","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Multi-node architecture"}]}],["$","li","docs/mcp.md",{"children":["$","$L5",null,{"href":"/docs/open-source/mcp","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"MCP adapter"}]}],["$","li","docs/owasp-coverage-matrix.md",{"children":["$","$L5",null,{"href":"/docs/open-source/owasp-coverage-matrix","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"OWASP coverage matrix"}]}],["$","li","docs/functionality-reference.md",{"children":["$","$L5",null,{"href":"/docs/open-source/functionality-reference","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Functionality reference"}]}]]}]]}] 1a:["$","div","Releases and process",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Releases and process"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","docs/release-process.md",{"children":["$","$L5",null,{"href":"/docs/open-source/release-process","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release process"}]}],["$","li","docs/sbom.md",{"children":["$","$L5",null,{"href":"/docs/open-source/sbom","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release SBOMs"}]}],["$","li","docs/releases/README.md",{"children":["$","$L5",null,{"href":"/docs/open-source/releases/README","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release notes index"}]}],["$","li","RELEASES.md",{"children":["$","$L5",null,{"href":"/docs/open-source/release-mapping","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release mapping"}]}],["$","li","benchmarks/README.md",{"children":["$","$L5",null,{"href":"/docs/open-source/benchmarks","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Benchmark fixtures"}]}],["$","li","AGENTS.md",{"children":["$","$L5",null,{"href":"/docs/open-source/agents","aria-current":"$undefined","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Agent operating policy"}]}]]}]]}] 1b:["$","div",null,{"className":"border-t border-white/[0.07] pt-4 text-xs leading-5 text-[#5F6B7A]","children":["Rendered from"," ",["$","a",null,{"href":"https://github.com/andriyze/shakerscan/tree/v2.5.4/docs","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 text-[#98A2B3] hover:text-white","children":["v2.5.4"," ",["$","$L11",null,{"ref":"$undefined","icon":{"name":"external-link","size":24,"node":[["path",{"d":"M15 3h6v6","key":"1q9fwt"}],["path",{"d":"M10 14 21 3","key":"gplh6r"}],["path",{"d":"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6","key":"a6xqqp"}]]},"className":"h-3 w-3","aria-hidden":"true"}]]}],", the current stable channel."]}] 1c:["$","div",null,{"className":"hidden max-h-[calc(100vh-6rem)] overflow-y-auto pr-2 lg:block","children":"$13:props:children:0:props:children:0:props:children:1:props:children"}] 1d:["$","main",null,{"className":"mt-8 min-w-0 lg:mt-0","children":[["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://shakerscan.com/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docs\",\"item\":\"https://shakerscan.com/docs\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Open Source\",\"item\":\"https://shakerscan.com/docs/open-source\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"ShakerScan 2.2.0\",\"item\":\"https://shakerscan.com/docs/open-source/releases/2.2.0\"}]}"}}],["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"TechArticle\",\"headline\":\"ShakerScan 2.2.0\",\"description\":\"Trustworthy upgrades, the fifth image handled everywhere, and DAST depth restored on the 2.1.0 platform. Upgrade in place from 2.1.0; 0.8.18 is the oldest…\",\"url\":\"https://shakerscan.com/docs/open-source/releases/2.2.0\",\"version\":\"2.5.4\",\"inLanguage\":\"en\",\"author\":{\"@type\":\"Organization\",\"name\":\"ShakerScan\",\"url\":\"https://shakerscan.com\"},\"isPartOf\":{\"@type\":\"WebSite\",\"name\":\"ShakerScan\",\"url\":\"https://shakerscan.com\"}}"}}],["$","nav",null,{"className":"font-mono text-[11px] tracking-wide text-[#5F6B7A] uppercase","aria-label":"Breadcrumb","children":[["$","$L5",null,{"href":"/docs","className":"transition-colors hover:text-[#98A2B3]","children":"Docs"}],["$","span",null,{"className":"mx-2 text-white/20","children":"/"}],["$","$L5",null,{"href":"/docs/open-source","className":"transition-colors hover:text-[#98A2B3]","children":"Open Source"}],["$","span",null,{"className":"mx-2 text-white/20","children":"/"}],["$","span",null,{"className":"normal-case","children":"docs/releases/2.2.0.md"}]]}],["$","div",null,{"className":"mt-4 flex flex-wrap items-center gap-x-5 gap-y-2 border-b border-white/[0.07] pb-4 text-xs text-[#7C8798]","children":[["$","span",null,{"children":["Pinned to ",["$","span",null,{"className":"font-mono text-[#C6CDD8]","children":"v2.5.4"}]]}],["$","a",null,{"href":"https://github.com/andriyze/shakerscan/blob/v2.5.4/docs/releases/2.2.0.md","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 text-[#98A2B3] hover:text-white","children":["View source on GitHub ",["$","$L11",null,{"ref":"$undefined","icon":"$1b:props:children:2:props:children:2:props:icon","className":"h-3 w-3","aria-hidden":"true"}]]}],["$","a",null,{"href":"https://github.com/andriyze/shakerscan/issues","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 text-[#98A2B3] hover:text-white","children":["Report an issue ",["$","$L11",null,{"ref":"$undefined","icon":"$1b:props:children:2:props:children:2:props:icon","className":"h-3 w-3","aria-hidden":"true"}]]}]]}],["$","article",null,{"className":"mt-6","children":["$","div",null,{"className":"oss-markdown","children":[["$","h1","h1-0",{"id":"shakerscan-220","children":["$","a",null,{"href":"#shakerscan-220","className":"oss-heading-anchor","children":"ShakerScan 2.2.0"}]}],"\n",["$","p","p-0",{"children":"Trustworthy upgrades, the fifth image handled everywhere, and DAST depth restored on the 2.1.0\nplatform. Upgrade in place from 2.1.0; 0.8.18 is the oldest directly certified upgrade base.\nOne additive schema change (Scan plan revisions may now hold up to nine rounds); no\ncapability-authority change."}],"\n",["$","h2","h2-0",{"id":"changes","children":["$","a",null,{"href":"#changes","className":"oss-heading-anchor","children":"Changes"}]}],"\n",["$","h3","h3-0",{"id":"upgrades-that-cannot-eat-an-install","children":["$","a",null,{"href":"#upgrades-that-cannot-eat-an-install","className":"oss-heading-anchor","children":"Upgrades that cannot eat an install"}]}],"\n",["$","ul","ul-0",{"children":["\n",["$","li","li-0",{"children":["Startup ensures the operator, session, and signer secrets before the datastore rotation, whose\n",["$","code","code-0",{"children":"compose up"}]," interpolates every required secret; the misleading\n","$L23"," failure on a 2.1.0 upgrade is gone."]}],"\n","$L24","\n","$L25","\n","$L26","\n","$L27","\n"]}],"\n","$L28","\n","$L29","\n","$L2a","\n","$L2b","\n","$L2c","\n","$L2d","\n","$L2e","\n","$L2f","\n","$L30","\n","$L31","\n","$L32","\n","$L33","\n","$L34","\n","$L35"]}]}],"$L36"]}] 1e:["$","aside",null,{"className":"hidden xl:sticky xl:top-20 xl:block xl:self-start","children":["$","nav",null,{"aria-label":"On this page","children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"On this page"}],["$","ul",null,{"className":"mt-2.5 max-h-[calc(100vh-8rem)] space-y-1 overflow-y-auto border-l border-white/[0.07] pl-3 text-xs leading-5","children":[["$","li","changes-2",{"children":["$","a",null,{"href":"#changes","className":"block text-[#98A2B3] hover:text-white ","children":"Changes"}]}],["$","li","upgrades-that-cannot-eat-an-install-3",{"children":["$","a",null,{"href":"#upgrades-that-cannot-eat-an-install","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Upgrades that cannot eat an install"}]}],["$","li","five-images-everywhere-3",{"children":["$","a",null,{"href":"#five-images-everywhere","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Five images, everywhere"}]}],["$","li","model-intake-release-fixes-3",{"children":["$","a",null,{"href":"#model-intake-release-fixes","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Model Intake release fixes"}]}],["$","li","dast-depth-3",{"children":["$","a",null,{"href":"#dast-depth","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"DAST depth"}]}],["$","li","post-20-audit-corrections-3",{"children":["$","a",null,{"href":"#post-20-audit-corrections","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Post-2.0 audit corrections"}]}],["$","li","release-engineering-3",{"children":["$","a",null,{"href":"#release-engineering","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Release engineering"}]}],["$","li","upgrade-2",{"children":["$","a",null,{"href":"#upgrade","className":"block text-[#98A2B3] hover:text-white ","children":"Upgrade"}]}],["$","li","provenance-2",{"children":["$","a",null,{"href":"#provenance","className":"block text-[#98A2B3] hover:text-white ","children":"Provenance"}]}]]}]]}]}] 1f:["$","li","/vulnerability-disclosure",{"children":["$","$L5",null,{"href":"/vulnerability-disclosure","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Vulnerability disclosure"}]}] 20:["$","li","/privacy",{"children":["$","$L5",null,{"href":"/privacy","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Privacy"}]}] 21:["$","li","/terms",{"children":["$","$L5",null,{"href":"/terms","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Terms"}]}] 22:["$","div",null,{"className":"mt-12 flex flex-col items-center justify-between gap-4 border-t border-white/[0.07] pt-6 sm:flex-row","children":[["$","span",null,{"className":"font-mono text-[11px] text-[#5F6B7A]","children":["© ",2026," ShakerScan. Source available under"," ",["$","a",null,{"href":"https://github.com/andriyze/shakerscan/blob/main/LICENSE","target":"_blank","rel":"noreferrer","className":"text-[#7C8798] underline decoration-white/20 underline-offset-2 transition-colors hover:text-white","children":"AGPL-3.0"}],"."]}],["$","div",null,{"className":"flex flex-wrap items-center justify-center gap-x-5 gap-y-2","children":[[["$","$L5","/enterprise",{"href":"/enterprise","className":"inline-flex items-center gap-1 font-mono text-[11px] text-[#7C8798] transition-colors hover:text-white","children":"Enterprise"}],["$","a","mailto:sales@shakerscan.com",{"href":"mailto:sales@shakerscan.com","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 font-mono text-[11px] text-[#7C8798] transition-colors hover:text-white","children":["Contact",["$","$L11",null,{"ref":"$undefined","icon":"$1b:props:children:2:props:children:2:props:icon","className":"h-3 w-3","aria-hidden":"true"}]]}]],["$","a",null,{"href":"https://github.com/andriyze/shakerscan","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-2 font-mono text-[11px] text-[#7C8798] transition-colors hover:text-white","children":[["$","$L11",null,{"ref":"$undefined","icon":"$6:props:children:0:props:children:props:children:0:props:children:1:props:children:2:props:children:0:props:icon","className":"h-3.5 w-3.5","aria-hidden":"true"}],"github.com/andriyze/shakerscan"]}]]}]]}] 23:["$","code","code-1",{"children":"MODEL_INTAKE_SIGNER_DATABASE_PASSWORD is required"}] 24:["$","li","li-1",{"children":["A data volume with no recorded password belongs to another install directory: startup refuses to\nrotate it away unless ",["$","code","code-0",{"children":"SHAKERSCAN_ADOPT_EXISTING_DATA=1"}],", and the hosted installer refuses a new\ndirectory when another directory owns the Compose project, printing the ",["$","code","code-1",{"children":"SHAKERSCAN_HOME="}]," command."]}] 25:["$","li","li-2",{"children":["The installer records prebuilt mode inside the atomic candidate tree and starts with ",["$","code","code-0",{"children":"--prebuilt"}],";\n",["$","code","code-1",{"children":"scanner.sh"}]," reads ",["$","code","code-2",{"children":"release-image-lock.env"}]," itself, so an installer run over a source checkout no\nlonger rebuilds the scanner image from source, and ",["$","code","code-3",{"children":"--image-tag"}]," still wins deliberately."]}] 26:["$","li","li-3",{"children":["The Model Intake signer init waits, bounded, for authenticated PostgreSQL instead of failing\n",["$","code","code-0",{"children":"compose up"}]," on the ",["$","code","code-1",{"children":"pg_isready"}]," race."]}] 27:["$","li","li-4",{"children":["Certification exercises stateful upgrade and rollback from both the previous stable and\n",["$","code","code-0",{"children":"install/OLDEST_SUPPORTED_UPGRADE_BASE"}]," (0.8.18), with all five release images, and a new\ninstaller-driven upgrade smoke covers the in-place, foreign-directory, and source-checkout cases."]}] 28:["$","h3","h3-1",{"id":"five-images-everywhere","children":["$","a",null,{"href":"#five-images-everywhere","className":"oss-heading-anchor","children":"Five images, everywhere"}]}] 29:["$","ul","ul-1",{"children":["\n",["$","li","li-0",{"children":[["$","code","code-0",{"children":"install/release-images.json"}]," is the one inventory the launcher, installer, smokes, release\nworkflows, ledger, certifier, and waiver validator derive the image set from."]}],"\n",["$","li","li-1",{"children":[["$","code","code-0",{"children":"MODEL_INTAKE_IMAGE"}]," follows the selected tag; pull, cached-image fallback, status, rebuild, and\nreload cover the Model Intake worker. Fleet overlays carry no Model Intake service."]}],"\n",["$","li","li-2",{"children":[["$","code","code-0",{"children":"/health.model_intake_worker"}]," and ",["$","code","code-1",{"children":"/workers.pools"}]," report each execution pool (Web DAST, agent\ntools, devices, Model Intake) as fresh, build-current, and tool-complete; startup waits for the\nModel Intake pool; a new Worker Pools page shows them. Busy workers heartbeat their identity."]}],"\n",["$","li","li-3",{"children":"Model Intake submissions cannot carry a fleet placement; the enqueue boundary strips one."}],"\n",["$","li","li-4",{"children":["The Model Intake image is vulnerability-scanned in full: the toolchain directory exclusion is\ngone and the waiver validator refuses directory exclusions. Unneeded ",["$","code","code-0",{"children":"pip"}]," and ",["$","code","code-1",{"children":"setuptools"}],"\nare removed from the tool environments; the pip-audit environment retains its required pip\ninterface but not the unused vendored msgpack/setuptools packages, and pip's own CycloneDX\nSBOM is pruned to match (a scanner reads that SBOM as the installed set, which is how the\ndeleted packages kept failing the gate). The image then scans its own toolchain and native\nscanners at build time with the release gate's exact policy, so a finding fails the build.\nNo image vulnerability waiver is added."]}],"\n",["$","li","li-5",{"children":["Trivy's database refreshes at Model Intake worker start when egress exists and falls back to the\nbaked copy; every static-analysis evidence manifest records ",["$","code","code-0",{"children":"trivy_db_updated_at"}],"."]}],"\n",["$","li","li-6",{"children":["The API image is built from the Playwright runtime without the scanner toolset, runs as a distinct\nnon-root user (10002; the sandbox keeps 10001), and reaches the Docker socket through the group the\nsocket carries inside a container, resolved at start. It bakes the same ",["$","code","code-0",{"children":"SCANNER_VERSION"}]," and\nsource-revision environment as the scanner runtime it is derived from; the build fails closed if\nthose values disagree with the runtime's release manifest."]}],"\n"]}] 2a:["$","h3","h3-2",{"id":"model-intake-release-fixes","children":["$","a",null,{"href":"#model-intake-release-fixes","className":"oss-heading-anchor","children":"Model Intake release fixes"}]}] 2b:["$","ul","ul-2",{"children":["\n",["$","li","li-0",{"children":"Installed-stack E2E propagates the loopback Origin with its short-lived Model Intake session.\nProduction session validation remains Origin-bound; no authentication check is removed."}],"\n",["$","li","li-1",{"children":"Semgrep 1.174.0 and MCP 1.29.0 replace the older dependency pair in the hash-locked tool environment."}],"\n",["$","li","li-2",{"children":["Trivy 0.74.0 and OSV Scanner 2.5.1 are built from pinned upstream commits with the digest-pinned\nGo 1.26.6 builder and explicit corrected dependency versions. Upstream release-version metadata\nis embedded in both binaries, and Trivy uses its upstream ",["$","code","code-0",{"children":"jsonv2"}]," build setting."]}],"\n",["$","li","li-3",{"children":"The builder verifies embedded dependency records and reported tool versions. PR CI exercises\nthe same builder assertions; malformed, missing, and mismatched dependency metadata fails."}],"\n",["$","li","li-4",{"children":"Build-only distro tooling is installed and purged in the same layer. Temporary repository-writing\nrepair workflows are removed; native-tool verification is read-only."}],"\n"]}] 2c:["$","h3","h3-3",{"id":"dast-depth","children":["$","a",null,{"href":"#dast-depth","className":"oss-heading-anchor","children":"DAST depth"}]}] 2d:["$","ul","ul-3",{"children":["\n",["$","li","li-0",{"children":["Profiles: fast 30 min / 5,000 requests, balanced 60 min / 20,000, thorough 180 min / 60,000, and an\nopt-in ",["$","code","code-0",{"children":"deep"}]," at 360 min / 150,000. Tool wall never exceeds wall. Old scans keep their labels."]}],"\n",["$","li","li-1",{"children":"Every verifier candidate holds the time its tool was measured to need (200 s for an XSS candidate,\n180 s for SQLi, 420 s for a request-body attempt), and larger profiles fund more candidates per\nslice at that cost rather than less time per candidate. One lane never holds more than a quarter\nof the wall in a single compile, and the first proof slice of every family is funded before any\nextra breadth, so a Scan no longer buys coverage it cannot prove anything with."}],"\n",["$","li","li-2",{"children":"Scans keep spending: up to eight append-only continuation rounds re-plan every lane from its next\nunplanned candidate against the reconciled residual, and the finalizer is its own terminal\nrevision, so a Scan ends when the work or the ceiling is exhausted, not after one round."}],"\n",["$","li","li-3",{"children":["The headless crawl carries the credential's browser state: a bearer token seeded into\n",["$","code","code-0",{"children":"localStorage"}]," (new ",["$","code","code-1",{"children":"browser_storage_key"}]," on bearer profiles) or the cookie header, in a private\nworker-owned Chromium profile, so token-in-localStorage applications crawl authenticated."]}],"\n",["$","li","li-4",{"children":"Installed CLI Hunt acceptance (H-10/H-11) and the Model Intake trust-anchor lifecycle (MI-6) are\nhard gates again."}],"\n"]}] 2e:["$","h3","h3-4",{"id":"post-20-audit-corrections","children":["$","a",null,{"href":"#post-20-audit-corrections","className":"oss-heading-anchor","children":"Post-2.0 audit corrections"}]}] 2f:["$","ul","ul-4",{"children":["\n",["$","li","li-0",{"children":"Spec discovery preserves same-origin OpenAPI server paths (including operation/path overrides,\nrelative URLs and default server variables) and Swagger base paths. External origins are not\nfollowed or silently remapped."}],"\n",["$","li","li-1",{"children":"Same-document parameter, request-body, path-item and schema references resolve with bounded\nJSON Pointer traversal; Swagger form fields keep their declared content type. Unsupported or\ncyclic definitions produce explicit partial-coverage diagnostics, not a silently empty surface."}],"\n",["$","li","li-2",{"children":"Broker execution uses the same bounded round compiler as local Scans. Continuation requests\nname their immediate parent revision; a lost-response retry returns the same successor under\na scan-row lock. Later rounds spend the cumulative residual, and cancellation stops the loop."}],"\n",["$","li","li-3",{"children":"Path-injection candidates are GET-only. Non-GET path operations are reported as unsupported\ncoverage instead of being tested as a different HTTP method. Existing unsafe candidates reject."}],"\n",["$","li","li-4",{"children":"XSS execution proof no longer assigns a universal 8.2 CVSS score. Supported existing impact\nassessments are preserved; otherwise CVSS remains unassessed, separate from verification."}],"\n",["$","li","li-5",{"children":"Materialized empty candidate lanes stop rather than spending all eight rounds on placeholders."}],"\n"]}] 30:["$","h3","h3-5",{"id":"release-engineering","children":["$","a",null,{"href":"#release-engineering","className":"oss-heading-anchor","children":"Release engineering"}]}] 31:["$","ul","ul-5",{"children":["\n",["$","li","li-0",{"children":["The candidate reuses the attested image set ",["$","code","code-0",{"children":"build-on-main"}]," built for the exact SHA and builds\nonly when none exists; ",["$","code","code-1",{"children":"build-on-main"}]," skips changes that cannot alter an image."]}],"\n",["$","li","li-1",{"children":["Version publication requires a successful fresh candidate and its certified, digest-bound receipt.\nThe stable installer channel and ",["$","code","code-0",{"children":"latest"}]," are promoted separately after public smoke."]}],"\n"]}] 32:["$","h2","h2-1",{"id":"upgrade","children":["$","a",null,{"href":"#upgrade","className":"oss-heading-anchor","children":"Upgrade"}]}] 33:["$","ul","ul-6",{"children":["\n",["$","li","li-0",{"children":["Re-run the installer, or ",["$","code","code-0",{"children":"shakerscan restart --prebuilt"}]," in place. See\n",["$","$L5","a-0",{"href":"/docs/open-source/upgrade-and-rollback","children":["$","code","code-0",{"children":"docs/upgrade-and-rollback.md"}]}],". Installs older than 0.8.18 must\nupgrade to 0.8.18 first."]}],"\n",["$","li","li-1",{"children":["Existing release installs gain ",["$","code","code-0",{"children":"api-storage-init"}],", which hands ",["$","code","code-1",{"children":"results/"}]," to the API's runtime\nidentity once at start."]}],"\n"]}] 34:["$","h2","h2-2",{"id":"provenance","children":["$","a",null,{"href":"#provenance","className":"oss-heading-anchor","children":"Provenance"}]}] 35:["$","p","p-1",{"children":"The published release attaches its exact source commit, immutable image lock, and certified\ncandidate receipt. These source release notes alone do not establish certification or publication."}] 36:["$","p",null,{"className":"mt-10 border-t border-white/[0.07] pt-4 text-xs leading-5 text-[#5F6B7A]","children":["This page is rendered from ",["$","span",null,{"className":"font-mono","children":"docs/releases/2.2.0.md"}]," in the open-source repository at ","v2.5.4",". When documentation and implementation disagree, the code, database schema, and tests at that tag are authoritative."]}]