[{"data":1,"prerenderedAt":722},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:U7P09iF1ThMxYdSqlJBzAIYIN79c1UDO31VZ6ueYpKU":195,"content-page-surround:docs:U7P09iF1ThMxYdSqlJBzAIYIN79c1UDO31VZ6ueYpKU":717},[4,54,74],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Guides",false,"1","en","content:en:1.docs:1.guides:.navigation.yml","lucide:route","section",[13,19,26,33,40,47],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"path":18},"Install Guild Wars on Mac","content:en:1.docs:1.guides:1.install.md","1\u002F1","lucide:download","\u002Fdocs\u002Fguides\u002Finstall",{"title":20,"id":21,"canonicalKey":22,"locale":8,"draft":6,"navigation":23,"icon":24,"path":25},"Accounts & mobile linking","content:en:1.docs:1.guides:2.accounts.md","1\u002F2",{"title":20},"lucide:key-round","\u002Fdocs\u002Fguides\u002Faccounts",{"title":27,"id":28,"canonicalKey":29,"locale":8,"draft":6,"navigation":30,"icon":31,"path":32},"Play on Mac: options","content:en:1.docs:1.guides:3.play-guild-wars-on-mac.md","1\u002F3",{"title":27},"lucide:scale","\u002Fdocs\u002Fguides\u002Fplay-guild-wars-on-mac",{"title":34,"id":35,"canonicalKey":36,"locale":8,"draft":6,"navigation":37,"icon":38,"path":39},"Performance","content:en:1.docs:1.guides:4.performance.md","1\u002F4",{"title":34},"lucide:gauge","\u002Fdocs\u002Fguides\u002Fperformance",{"title":41,"id":42,"canonicalKey":43,"locale":8,"draft":6,"navigation":44,"icon":45,"path":46},"Templates","content:en:1.docs:1.guides:5.templates.md","1\u002F5",{"title":41},"lucide:bookmark","\u002Fdocs\u002Fguides\u002Ftemplates",{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Troubleshooting","content:en:1.docs:1.guides:6.troubleshooting.md","1\u002F6",{"title":48},"lucide:wrench","\u002Fdocs\u002Fguides\u002Ftroubleshooting",{"title":55,"page":6,"canonicalKey":56,"locale":8,"id":57,"draft":6,"icon":58,"sidebar":59,"children":60},"Project","2","content:en:1.docs:2.project:.navigation.yml","lucide:shield-check","group",[61,67],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":58,"path":66},"Safety & account risk","content:en:1.docs:2.project:1.safety.md","2\u002F1",{"title":62},"\u002Fdocs\u002Fproject\u002Fsafety",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"About & credits","content:en:1.docs:2.project:2.about.md","2\u002F2",{"title":68},"lucide:users","\u002Fdocs\u002Fproject\u002Fabout",{"title":75,"page":6,"canonicalKey":76,"locale":8,"id":77,"draft":6,"icon":78,"sidebar":11,"children":79},"For ArenaNet","3","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",[80,87,94,120,146,158,177],{"title":81,"id":82,"canonicalKey":83,"locale":8,"draft":6,"navigation":84,"icon":85,"path":86},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":81},"lucide:book-open-check","\u002Fdocs\u002Fupstream\u002Fintroduction",{"title":88,"id":89,"canonicalKey":90,"locale":8,"draft":6,"navigation":91,"icon":92,"path":93},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":88},"lucide:list-checks","\u002Fdocs\u002Fupstream\u002Frequest-summary",{"title":95,"page":6,"canonicalKey":96,"locale":8,"id":97,"draft":6,"icon":98,"sidebar":59,"children":99},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[100,106,113],{"title":101,"id":102,"canonicalKey":103,"locale":8,"draft":6,"navigation":104,"icon":98,"path":105},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":101},"\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":107,"id":108,"canonicalKey":109,"locale":8,"draft":6,"navigation":110,"icon":111,"path":112},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":107},"lucide:scissors","\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":114,"id":115,"canonicalKey":116,"locale":8,"draft":6,"navigation":117,"icon":118,"path":119},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":114},"lucide:file-plus-2","\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":121,"page":6,"canonicalKey":122,"locale":8,"id":123,"draft":6,"icon":124,"sidebar":59,"children":125},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[126,132,139],{"title":127,"id":128,"canonicalKey":129,"locale":8,"draft":6,"navigation":130,"icon":124,"path":131},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":127},"\u002Fdocs\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":133,"id":134,"canonicalKey":135,"locale":8,"draft":6,"navigation":136,"icon":137,"path":138},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":133},"lucide:keyboard","\u002Fdocs\u002Fupstream\u002Finput\u002Fkey-labels",{"title":140,"id":141,"canonicalKey":142,"locale":8,"draft":6,"navigation":143,"icon":144,"path":145},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":140},"lucide:pointer","\u002Fdocs\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":147,"page":6,"canonicalKey":148,"locale":8,"id":149,"draft":6,"icon":150,"sidebar":59,"children":151},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[152],{"title":153,"id":154,"canonicalKey":155,"locale":8,"draft":6,"navigation":156,"icon":150,"path":157},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":153},"\u002Fdocs\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":159,"page":6,"canonicalKey":160,"locale":8,"id":161,"draft":6,"icon":162,"sidebar":59,"children":163},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[164,171],{"title":165,"id":166,"canonicalKey":167,"locale":8,"draft":6,"navigation":168,"icon":169,"path":170},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":165},"lucide:fingerprint","\u002Fdocs\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":172,"id":173,"canonicalKey":174,"locale":8,"draft":6,"navigation":175,"icon":162,"path":176},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":172},"\u002Fdocs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":178,"page":6,"canonicalKey":179,"locale":8,"id":180,"draft":6,"icon":181,"sidebar":59,"children":182},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[183,189],{"title":184,"id":185,"canonicalKey":186,"locale":8,"draft":6,"navigation":187,"icon":52,"path":188},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":184},"\u002Fdocs\u002Fupstream\u002Freference\u002Four-workarounds",{"title":190,"id":191,"canonicalKey":192,"locale":8,"draft":6,"navigation":193,"icon":181,"path":194},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":190},"\u002Fdocs\u002Fupstream\u002Freference\u002Fverification-method",{"title":196,"ref":197,"description":198,"icon":52,"updated":199,"navigation":200,"body":201,"type":701,"id":185,"canonicalKey":186,"draft":6,"partial":6,"locale":8,"collection":702,"navigationFile":6,"file":703,"resolvedRefs":709,"route":710,"resolution":714},"Our workarounds, and what each fix removes","docs\u002Fupstream\u002Freference\u002Four-workarounds","What GWonMac does to the client today, why each workaround exists, what it costs us per client build, and exactly what we delete after each upstream fix.","2026-08-08",{"title":184},{"type":202,"children":203,"toc":686},"root",[204,212,219,224,253,259,302,307,317,327,333,347,366,375,381,395,414,423,432,445,451,468,473,482,498,504,518,530,539,545,559,564,573,579,593,598,603,612,621,627,657,663],{"type":205,"tag":206,"props":207,"children":208},"element","p",{},[209],{"type":210,"value":211},"text","This page is everything our host does to the client today: why each workaround\nexists, what it costs per client build, and exactly what each upstream fix\nlets us delete.",{"type":205,"tag":213,"props":214,"children":216},"h2",{"id":215},"ground-rules",[217],{"type":210,"value":218},"Ground rules",{"type":205,"tag":206,"props":220,"children":221},{},[222],{"type":210,"value":223},"The downloaded artifact from ArenaNet stays canonical: we never change it on\ndisk and never redistribute it. When the client is broken on this platform,\nthe host derives a separate patched copy in memory, verifying the input by\nhash and the output by hash. If any check fails, the host serves the untouched\nofficial module — so a new client build degrades to \"the feature is missing\",\nnever to a broken client.",{"type":205,"tag":225,"props":226,"children":228},"info",{"title":227},"Three states, one decision",[229,231,237,239,244,246,251],{"type":210,"value":230},"Each build is ",{"type":205,"tag":232,"props":233,"children":234},"code",{},[235],{"type":210,"value":236},"certified",{"type":210,"value":238},", ",{"type":205,"tag":232,"props":240,"children":241},{},[242],{"type":210,"value":243},"template-only",{"type":210,"value":245},", or ",{"type":205,"tag":232,"props":247,"children":248},{},[249],{"type":210,"value":250},"uncertified",{"type":210,"value":252},", decided by one\ncomponent. A build we don't recognise runs as the plain official client, with\nevery workaround switched off.",{"type":205,"tag":213,"props":254,"children":256},{"id":255},"workaround-1-the-template-file-bridge",[257],{"type":210,"value":258},"Workaround 1 — the template file bridge",{"type":205,"tag":206,"props":260,"children":261},{},[262,268,270,275,276,281,282,287,288,293,295,300],{"type":205,"tag":263,"props":264,"children":265},"strong",{},[266],{"type":210,"value":267},"Removed by:",{"type":210,"value":269}," ",{"type":205,"tag":232,"props":271,"children":272},{},[273],{"type":210,"value":274},"UR-01",{"type":210,"value":238},{"type":205,"tag":232,"props":277,"children":278},{},[279],{"type":210,"value":280},"UR-02",{"type":210,"value":238},{"type":205,"tag":232,"props":283,"children":284},{},[285],{"type":210,"value":286},"UR-03",{"type":210,"value":238},{"type":205,"tag":232,"props":289,"children":290},{},[291],{"type":210,"value":292},"UR-04",{"type":210,"value":294},", and the probe part of\n",{"type":205,"tag":232,"props":296,"children":297},{},[298],{"type":210,"value":299},"UR-06",{"type":210,"value":301},".",{"type":205,"tag":206,"props":303,"children":304},{},[305],{"type":210,"value":306},"The host appends five forwarder functions to the module and repoints the call\nsites of the four stub routines at them. Each forwarder calls the host through\na marker value on a syscall import the module already has — no real call can\nproduce that value. The host then does the file work in the Emscripten file\nsystem: create a directory tree, list a directory, derive a relative name,\ndelete a file, and test for a file.",{"type":205,"tag":206,"props":308,"children":309},{},[310,315],{"type":205,"tag":263,"props":311,"children":312},{},[313],{"type":210,"value":314},"Cost per client build.",{"type":210,"value":316}," The five routines have to be found again, with\nproof that their callers didn't change. This part is automated: a machine\nlocates each routine by body bytes, signature, and caller set, then hashes the\ncomplete body of every caller the transform touches. If any of that changed,\nthe transform refuses to run.",{"type":205,"tag":206,"props":318,"children":319},{},[320,325],{"type":205,"tag":263,"props":321,"children":322},{},[323],{"type":210,"value":324},"Deleted after the fix:",{"type":210,"value":326}," all of it — five forwarders, five marker values,\nthe host file-system bridge, and the whole certification table for this\ntransform.",{"type":205,"tag":213,"props":328,"children":330},{"id":329},"workaround-2-the-entry-name-without-an-extension",[331],{"type":210,"value":332},"Workaround 2 — the entry name without an extension",{"type":205,"tag":206,"props":334,"children":335},{},[336,340,341,346],{"type":205,"tag":263,"props":337,"children":338},{},[339],{"type":210,"value":267},{"type":210,"value":269},{"type":205,"tag":232,"props":342,"children":343},{},[344],{"type":210,"value":345},"UR-05",{"type":210,"value":301},{"type":205,"tag":206,"props":348,"children":349},{},[350,352,357,359,364],{"type":210,"value":351},"Our bridge returns each entry name ",{"type":205,"tag":263,"props":353,"children":354},{},[355],{"type":210,"value":356},"without",{"type":210,"value":358}," its extension, so the client\ncalls ",{"type":205,"tag":232,"props":360,"children":361},{},[362],{"type":210,"value":363},"Path::RemoveExtension",{"type":210,"value":365}," on a name where the off-by-one can't fire.",{"type":205,"tag":206,"props":367,"children":368},{},[369,373],{"type":205,"tag":263,"props":370,"children":371},{},[372],{"type":210,"value":324},{"type":210,"value":374}," nothing on day one — removing an absent extension\ndoes nothing, so the workaround stays correct. It goes together with\nworkaround 1.",{"type":205,"tag":213,"props":376,"children":378},{"id":377},"workaround-3-the-double-click-flag",[379],{"type":210,"value":380},"Workaround 3 — the double-click flag",{"type":205,"tag":206,"props":382,"children":383},{},[384,388,389,394],{"type":205,"tag":263,"props":385,"children":386},{},[387],{"type":210,"value":267},{"type":210,"value":269},{"type":205,"tag":232,"props":390,"children":391},{},[392],{"type":210,"value":393},"UR-07",{"type":210,"value":301},{"type":205,"tag":206,"props":396,"children":397},{},[398,400,405,407,412],{"type":210,"value":399},"The host appends one exported mutable ",{"type":205,"tag":232,"props":401,"children":402},{},[403],{"type":210,"value":404},"i32",{"type":210,"value":406}," global to the module and splices\nthree instructions into the mousedown callback. They store the global's value\ninto the record word the client already carries to ",{"type":205,"tag":232,"props":408,"children":409},{},[410],{"type":210,"value":411},"FrMouse",{"type":210,"value":413},", and the host\nwrites the Chromium click count into that global on every trusted press. The\ntransform adds no function and moves no index or table entry.",{"type":205,"tag":206,"props":415,"children":416},{},[417,421],{"type":205,"tag":263,"props":418,"children":419},{},[420],{"type":210,"value":314},{"type":210,"value":422}," The exact body hash of the mousedown callback, plus\ntwo byte offsets. A machine re-derives this; a human confirms it.",{"type":205,"tag":206,"props":424,"children":425},{},[426,430],{"type":205,"tag":263,"props":427,"children":428},{},[429],{"type":210,"value":324},{"type":210,"value":431}," the transform, its table, and the renderer code\nthat writes the global.",{"type":205,"tag":206,"props":433,"children":434},{},[435,437,443],{"type":210,"value":436},"An earlier workaround for the same defect synthesised a pair of touch taps. It\ndelivered four clicks instead of two, so we deleted it —\n",{"type":205,"tag":438,"props":439,"children":441},"a",{"href":440},"$docs\u002Fupstream\u002Finput\u002Fdouble-click-flag",[442],{"type":210,"value":393},{"type":210,"value":444}," has the measurement.",{"type":205,"tag":213,"props":446,"children":448},{"id":447},"workaround-4-the-native-cursor",[449],{"type":210,"value":450},"Workaround 4 — the native cursor",{"type":205,"tag":206,"props":452,"children":453},{},[454,458,460,466],{"type":205,"tag":263,"props":455,"children":456},{},[457],{"type":210,"value":267},{"type":210,"value":459}," nothing today.\n",{"type":205,"tag":438,"props":461,"children":463},{"href":462},"$docs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",[464],{"type":210,"value":465},"UR-12",{"type":210,"value":467}," would remove it.",{"type":205,"tag":206,"props":469,"children":470},{},[471],{"type":210,"value":472},"The host adds a small companion component to the module. It reads the client's\ncursor state — the active art pointer, the texture chain, and the colour\nbuffer — and publishes a 32 by 32 image into a region the host allocated; the\nhost sets that image as the native cursor. The component imports no function\nand writes nothing the game owns. Every read goes through bounds-checked\npointer chases, and every chase can fail safely.",{"type":205,"tag":206,"props":474,"children":475},{},[476,480],{"type":205,"tag":263,"props":477,"children":478},{},[479],{"type":210,"value":314},{"type":210,"value":481}," Our most expensive workaround: twelve memory\naddresses and two function indices. No machine can prove a memory address, so\na human measures them on each build. Until that's done, the player gets the\nplain system pointer.",{"type":205,"tag":206,"props":483,"children":484},{},[485,496],{"type":205,"tag":263,"props":486,"children":487},{},[488,490,494],{"type":210,"value":489},"Deleted after ",{"type":205,"tag":232,"props":491,"children":492},{},[493],{"type":210,"value":465},{"type":210,"value":495},":",{"type":210,"value":497}," the twelve cursor addresses and the component's\nread path.",{"type":205,"tag":213,"props":499,"children":501},{"id":500},"workaround-5-the-pointer-replay",[502],{"type":210,"value":503},"Workaround 5 — the pointer replay",{"type":205,"tag":206,"props":505,"children":506},{},[507,511,512,517],{"type":205,"tag":263,"props":508,"children":509},{},[510],{"type":210,"value":267},{"type":210,"value":269},{"type":205,"tag":232,"props":513,"children":514},{},[515],{"type":210,"value":516},"UR-09",{"type":210,"value":301},{"type":205,"tag":206,"props":519,"children":520},{},[521,523,528],{"type":210,"value":522},"After a click that produced no cursor event, the host dispatches one synthetic\nout-and-back ",{"type":205,"tag":232,"props":524,"children":525},{},[526],{"type":210,"value":527},"mousemove",{"type":210,"value":529}," pair at the last click position; the physical pointer\ndoesn't move. It retries every 150 ms for at most 2,500 ms. The replay can't\nstart a click and can't leave the pointer at a new position. The host also\nsynthesises pointer moves while the player rotates the camera, because the\nclient steers from absolute coordinates — that path can't originate a click\neither.",{"type":205,"tag":206,"props":531,"children":532},{},[533,537],{"type":205,"tag":263,"props":534,"children":535},{},[536],{"type":210,"value":324},{"type":210,"value":538}," the whole retry path.",{"type":205,"tag":213,"props":540,"children":542},{"id":541},"workaround-6-the-heap-warning-and-safe-reload",[543],{"type":210,"value":544},"Workaround 6 — the heap warning and safe reload",{"type":205,"tag":206,"props":546,"children":547},{},[548,552,553,558],{"type":205,"tag":263,"props":549,"children":550},{},[551],{"type":210,"value":267},{"type":210,"value":269},{"type":205,"tag":232,"props":554,"children":555},{},[556],{"type":210,"value":557},"UR-10",{"type":210,"value":301},{"type":205,"tag":206,"props":560,"children":561},{},[562],{"type":210,"value":563},"The host monitors the effective heap cap, warns while the player still has\nroom to return somewhere safe, then offers a user-controlled reload. WASM\nmemory capacity cannot shrink inside one process; reload starts a new heap.",{"type":205,"tag":206,"props":565,"children":566},{},[567,571],{"type":205,"tag":263,"props":568,"children":569},{},[570],{"type":210,"value":324},{"type":210,"value":572}," emergency reload guidance can go once ArenaNet's\nownership policy is bounded and long content-diverse sessions remain well\nbelow the effective cap. The general crash-recovery path remains.",{"type":205,"tag":213,"props":574,"children":576},{"id":575},"research-profile-paired-4-gb-jswasm-transform",[577],{"type":210,"value":578},"Research profile — paired 4 GB JS\u002FWASM transform",{"type":205,"tag":206,"props":580,"children":581},{},[582,587,588,592],{"type":205,"tag":263,"props":583,"children":584},{},[585],{"type":210,"value":586},"Reduced or removed by:",{"type":210,"value":269},{"type":205,"tag":232,"props":589,"children":590},{},[591],{"type":210,"value":557},{"type":210,"value":301},{"type":205,"tag":206,"props":594,"children":595},{},[596],{"type":210,"value":597},"An off-by-default developer profile raises build 38797's WASM maximum to 4 GiB\nminus one page and transforms the matching generated JavaScript to normalize\nwasm32 pointers above 2 GiB. It is a paired transform: changing only the WASM\nmaximum would hand negative pointer values to JavaScript and is refused.",{"type":205,"tag":206,"props":599,"children":600},{},[601],{"type":210,"value":602},"The exact pair has passed ArenaNet-allocator qualification above 3 GiB and a\nlive Electron string-glue test at 2,625 MiB. It remains a research profile, not\na default player setting. All five variants the production chain can emit are\nhash-pinned. Before an experimental release it still needs packaged\nhigh-address gameplay coverage, system-memory testing, and explicit opt-in\ncopy. Diagnostics record the effective mode and cap.",{"type":205,"tag":206,"props":604,"children":605},{},[606,610],{"type":205,"tag":263,"props":607,"children":608},{},[609],{"type":210,"value":314},{"type":210,"value":611}," Both official artifact hashes, every accepted\npredecessor hash, both derived hashes, and the generated-glue pointer audit.\nAny ArenaNet update disables the profile until it is re-certified.",{"type":205,"tag":206,"props":613,"children":614},{},[615,619],{"type":205,"tag":263,"props":616,"children":617},{},[618],{"type":210,"value":324},{"type":210,"value":620}," the whole transform and its certification table. A\nsource-built 4 GB client already has the compiler's matching unsigned-pointer\nsupport; a bounded cache\u002Flifecycle fix removes the reason for our emergency\nheadroom.",{"type":205,"tag":213,"props":622,"children":624},{"id":623},"what-our-workarounds-never-do",[625],{"type":210,"value":626},"What our workarounds never do",{"type":205,"tag":628,"props":629,"children":630},"ul",{},[631,637,642,647,652],{"type":205,"tag":632,"props":633,"children":634},"li",{},[635],{"type":210,"value":636},"They never change the artifact on disk.",{"type":205,"tag":632,"props":638,"children":639},{},[640],{"type":210,"value":641},"They never redistribute game files.",{"type":205,"tag":632,"props":643,"children":644},{},[645],{"type":210,"value":646},"They never send credentials, account identifiers, or game traffic anywhere.",{"type":205,"tag":632,"props":648,"children":649},{},[650],{"type":210,"value":651},"They never automate gameplay. The host does not choose a target, move a\ncharacter, use a skill, or send chat.",{"type":205,"tag":632,"props":653,"children":654},{},[655],{"type":210,"value":656},"They never run on a build that we have not certified.",{"type":205,"tag":213,"props":658,"children":660},{"id":659},"the-bottom-line",[661],{"type":210,"value":662},"The bottom line",{"type":205,"tag":206,"props":664,"children":665},{},[666,668,672,674,678,680,684],{"type":210,"value":667},"Six of the twelve requests exist because of file handling; one exists because\nof a single unwritten byte. Fix ",{"type":205,"tag":232,"props":669,"children":670},{},[671],{"type":210,"value":274},{"type":210,"value":673}," to ",{"type":205,"tag":232,"props":675,"children":676},{},[677],{"type":210,"value":393},{"type":210,"value":679}," and three production\nworkarounds disappear outright. A source-level ",{"type":205,"tag":232,"props":681,"children":682},{},[683],{"type":210,"value":557},{"type":210,"value":685}," correction also avoids\nturning the research-only 4 GB profile into another permanent certification\nburden.",{"title":687,"searchDepth":688,"depth":688,"links":689},"",4,[690,692,693,694,695,696,697,698,699,700],{"id":215,"depth":691,"text":218},2,{"id":255,"depth":691,"text":258},{"id":329,"depth":691,"text":332},{"id":377,"depth":691,"text":380},{"id":447,"depth":691,"text":450},{"id":500,"depth":691,"text":503},{"id":541,"depth":691,"text":544},{"id":575,"depth":691,"text":578},{"id":623,"depth":691,"text":626},{"id":659,"depth":691,"text":662},"markdown","docs",{"source":704,"path":705,"stem":706,"dir":707,"extension":708},"content","en\u002F1.docs\u002F3.upstream\u002F7.reference\u002F1.our-workarounds.md","en\u002F1.docs\u002F3.upstream\u002F7.reference\u002F1.our-workarounds","reference","md",{"$docs\u002Fupstream\u002Finput\u002Fdouble-click-flag":131,"$docs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface":176},{"requestedPath":188,"resolvedPath":188,"alternates":711},[712],{"locale":8,"path":188,"source":713},"variant",{"requested":715,"resolved":716,"usedFallback":6},{"locale":8},{"locale":8},{"previous":718,"next":720},{"title":172,"id":173,"canonicalKey":174,"locale":8,"draft":6,"navigation":719,"path":176},{"title":172},{"title":190,"id":191,"canonicalKey":192,"locale":8,"draft":6,"navigation":721,"path":194},{"title":190},1786362929844]