[{"data":1,"prerenderedAt":532},["ShallowReactive",2],{"docs-navigation:de":3,"content-page:docs:uNToV6iY6_qptSrduXYtmZGh5LDeeVeRkL_D6128A2s":197,"content-page-surround:docs:uNToV6iY6_qptSrduXYtmZGh5LDeeVeRkL_D6128A2s":530},[4,54,74],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Ableitungen",false,"1","de","content:de:1.dokumentation:1.anleitungen:.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},"Guild Wars auf dem Mac installieren","content:de:1.dokumentation:1.anleitungen:1.installation.md","1\u002F1","lucide:download","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Finstallation",{"title":20,"id":21,"canonicalKey":22,"locale":8,"draft":6,"navigation":23,"icon":24,"path":25},"Konten & Mobile-Verknüpfung","content:de:1.dokumentation:1.anleitungen:2.konten.md","1\u002F2",{"title":20},"lucide:key-round","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fkonten",{"title":27,"id":28,"canonicalKey":29,"locale":8,"draft":6,"navigation":30,"icon":31,"path":32},"Auf dem Mac spielen: Optionen","content:de:1.dokumentation:1.anleitungen:3.guild-wars-auf-dem-mac-spielen.md","1\u002F3",{"title":27},"lucide:scale","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fguild-wars-auf-dem-mac-spielen",{"title":34,"id":35,"canonicalKey":36,"locale":8,"draft":6,"navigation":37,"icon":38,"path":39},"Leistung","content:de:1.dokumentation:1.anleitungen:4.leistung.md","1\u002F4",{"title":34},"lucide:gauge","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fleistung",{"title":41,"id":42,"canonicalKey":43,"locale":8,"draft":6,"navigation":44,"icon":45,"path":46},"Templates","content:de:1.dokumentation:1.anleitungen:5.templates.md","1\u002F5",{"title":41},"lucide:bookmark","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ftemplates",{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Fehlerbehebung","content:de:1.dokumentation:1.anleitungen:6.fehlerbehebung.md","1\u002F6",{"title":48},"lucide:wrench","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ffehlerbehebung",{"title":55,"page":6,"canonicalKey":56,"locale":8,"id":57,"draft":6,"icon":58,"sidebar":59,"children":60},"Projekt","2","content:de:1.dokumentation:2.projekt:.navigation.yml","lucide:shield-check","group",[61,67],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":58,"path":66},"Sicherheit & Kontorisiko","content:de:1.dokumentation:2.projekt:1.sicherheit.md","2\u002F1",{"title":62},"\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fsicherheit",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"Über & Credits","content:de:1.dokumentation:2.projekt:2.ueber.md","2\u002F2",{"title":68},"lucide:users","\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fueber",{"title":75,"page":6,"canonicalKey":76,"locale":77,"id":78,"draft":6,"icon":79,"sidebar":11,"fallback":80,"children":81},"For ArenaNet","3","en","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",true,[82,89,96,122,148,160,179],{"title":83,"id":84,"canonicalKey":85,"locale":77,"draft":6,"navigation":86,"icon":87,"fallback":80,"path":88},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":83},"lucide:book-open-check","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fintroduction",{"title":90,"id":91,"canonicalKey":92,"locale":77,"draft":6,"navigation":93,"icon":94,"fallback":80,"path":95},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":90},"lucide:list-checks","\u002Fde\u002Fdokumentation\u002Fupstream\u002Frequest-summary",{"title":97,"page":6,"canonicalKey":98,"locale":77,"id":99,"draft":6,"icon":100,"sidebar":59,"fallback":80,"children":101},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[102,108,115],{"title":103,"id":104,"canonicalKey":105,"locale":77,"draft":6,"navigation":106,"icon":100,"fallback":80,"path":107},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":103},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":109,"id":110,"canonicalKey":111,"locale":77,"draft":6,"navigation":112,"icon":113,"fallback":80,"path":114},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":109},"lucide:scissors","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":116,"id":117,"canonicalKey":118,"locale":77,"draft":6,"navigation":119,"icon":120,"fallback":80,"path":121},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":116},"lucide:file-plus-2","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":123,"page":6,"canonicalKey":124,"locale":77,"id":125,"draft":6,"icon":126,"sidebar":59,"fallback":80,"children":127},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[128,134,141],{"title":129,"id":130,"canonicalKey":131,"locale":77,"draft":6,"navigation":132,"icon":126,"fallback":80,"path":133},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":129},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":135,"id":136,"canonicalKey":137,"locale":77,"draft":6,"navigation":138,"icon":139,"fallback":80,"path":140},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":135},"lucide:keyboard","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fkey-labels",{"title":142,"id":143,"canonicalKey":144,"locale":77,"draft":6,"navigation":145,"icon":146,"fallback":80,"path":147},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":142},"lucide:pointer","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":149,"page":6,"canonicalKey":150,"locale":77,"id":151,"draft":6,"icon":152,"sidebar":59,"fallback":80,"children":153},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[154],{"title":155,"id":156,"canonicalKey":157,"locale":77,"draft":6,"navigation":158,"icon":152,"fallback":80,"path":159},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":155},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":161,"page":6,"canonicalKey":162,"locale":77,"id":163,"draft":6,"icon":164,"sidebar":59,"fallback":80,"children":165},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[166,173],{"title":167,"id":168,"canonicalKey":169,"locale":77,"draft":6,"navigation":170,"icon":171,"fallback":80,"path":172},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":167},"lucide:fingerprint","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":174,"id":175,"canonicalKey":176,"locale":77,"draft":6,"navigation":177,"icon":164,"fallback":80,"path":178},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":174},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":180,"page":6,"canonicalKey":181,"locale":77,"id":182,"draft":6,"icon":183,"sidebar":59,"fallback":80,"children":184},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[185,191],{"title":186,"id":187,"canonicalKey":188,"locale":77,"draft":6,"navigation":189,"icon":52,"fallback":80,"path":190},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":186},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Four-workarounds",{"title":192,"id":193,"canonicalKey":194,"locale":77,"draft":6,"navigation":195,"icon":183,"fallback":80,"path":196},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":192},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Fverification-method",{"title":198,"ref":199,"description":200,"icon":171,"updated":201,"navigation":202,"body":203,"type":512,"id":168,"canonicalKey":169,"draft":6,"partial":6,"locale":77,"collection":513,"navigationFile":6,"file":514,"route":520,"resolution":527},"UR-11: publish build identity and a symbol map","docs\u002Fupstream\u002Fproposals\u002Fbuild-identification","Keep the build_id section and the assert strings, and publish the function name map that the build already produces. No runtime change, and it saves hours per client update.","2026-08-04",{"title":167},{"type":204,"children":205,"toc":494},"root",[206,214,225,232,237,242,249,255,309,315,320,325,331,336,423,428,434,439,445,450,456,488],{"type":207,"tag":208,"props":209,"children":210},"element","p",{},[211],{"type":212,"value":213},"text","This request doesn't correct a defect. It asks ArenaNet to keep three things\nthe build already produces, and to publish one of them. Two of the three items\nare \"change nothing\"; the third is publishing an artifact that already exists.",{"type":207,"tag":208,"props":215,"children":216},{},[217,223],{"type":207,"tag":218,"props":219,"children":220},"strong",{},[221],{"type":212,"value":222},"Fix:",{"type":212,"value":224}," low effort, no blast radius at runtime — the published module doesn't\nchange, only the set of published files grows.",{"type":207,"tag":226,"props":227,"children":229},"h2",{"id":228},"the-problem-this-solves",[230],{"type":212,"value":231},"The problem this solves",{"type":207,"tag":208,"props":233,"children":234},{},[235],{"type":212,"value":236},"The published module is stripped: about 17,600 functions, no names, each one\nidentified only by its index. Every recompile moves those indices — add one\nfunction and every index after it changes. Static data addresses move too, and\nnot by one common offset; we measured this on build 38797, and the addresses\nshare no single delta.",{"type":207,"tag":208,"props":238,"children":239},{},[240],{"type":212,"value":241},"Any host that needs to locate something inside the client repeats that work\nafter every update. For us it's the single largest cost of the project.",{"type":207,"tag":243,"props":244,"children":246},"info",{"title":245},"Why we can't solve this alone",[247],{"type":212,"value":248},"We can find code by shape — a function by its exact body bytes and caller set,\nwith proof that the surrounding code didn't change. That survives updates. A\nplain number has no shape: nothing in the module says \"this global is the\ncontext root\", so every memory address has to be measured by hand, on each\nbuild.",{"type":207,"tag":226,"props":250,"children":252},{"id":251},"what-we-ask-for",[253],{"type":212,"value":254},"What we ask for",{"type":207,"tag":256,"props":257,"children":259},"steps",{"mode":258},"numbered",[260,267,272,278,291,297],{"type":207,"tag":261,"props":262,"children":264},"h3",{"id":263},"what-we-ask-for-keep-the-build_id-custom-section",[265],{"type":212,"value":266},"Keep the build_id custom section",{"type":207,"tag":208,"props":268,"children":269},{},[270],{"type":212,"value":271},"The module carries a custom section with a build identifier. We use it to gate\nevery build-specific decision, and we refuse to run any transform on an\nunknown build.",{"type":207,"tag":261,"props":273,"children":275},{"id":274},"what-we-ask-for-keep-the-assert-strings-and-the-source-paths",[276],{"type":212,"value":277},"Keep the assert strings and the source paths",{"type":207,"tag":208,"props":279,"children":280},{},[281,283,289],{"type":212,"value":282},"The data section holds assert messages and original source paths, for example\n",{"type":207,"tag":284,"props":285,"children":286},"code",{},[287],{"type":212,"value":288},"p:\\code\\gw\\ui\\game\\party\\ptsearch.cpp",{"type":212,"value":290},". They come from the source, not the\ncompiler, so they survive recompiles that move every index. They're the most\nstable anchors in the binary — the Windows tool community has leaned on them\nfor twenty years.",{"type":207,"tag":261,"props":292,"children":294},{"id":293},"what-we-ask-for-publish-the-function-name-map",[295],{"type":212,"value":296},"Publish the function name map",{"type":207,"tag":208,"props":298,"children":299},{},[300,302,307],{"type":212,"value":301},"The build already produces a name map: the module references\n",{"type":207,"tag":284,"props":303,"children":304},{},[305],{"type":212,"value":306},"external_debug_info",{"type":212,"value":308},", and an earlier build shipped with names. Publishing\nthat map as a separate file per build solves the problem outright.",{"type":207,"tag":226,"props":310,"children":312},{"id":311},"the-name-map-in-detail",[313],{"type":212,"value":314},"The name map, in detail",{"type":207,"tag":208,"props":316,"children":317},{},[318],{"type":212,"value":319},"A name map turns our hardest problem into a table lookup.",{"type":207,"tag":208,"props":321,"children":322},{},[323],{"type":212,"value":324},"We already carry names forward between builds with a correlator that compares\nan older named build against the new stripped one, using nine heuristics. On\none build pair it mapped 17,302 of 17,739 functions automatically, left 433\nuncertain, and 4 unmapped. That's a good result — and still a guess. A\npublished map makes it exact.",{"type":207,"tag":261,"props":326,"children":328},{"id":327},"the-name-map-in-detail-acceptable-forms",[329],{"type":212,"value":330},"Acceptable forms",{"type":207,"tag":208,"props":332,"children":333},{},[334],{"type":212,"value":335},"We don't need full debug information. Any of these works:",{"type":207,"tag":337,"props":338,"children":339},"table",{},[340,364],{"type":207,"tag":341,"props":342,"children":343},"thead",{},[344],{"type":207,"tag":345,"props":346,"children":347},"tr",{},[348,354,359],{"type":207,"tag":349,"props":350,"children":351},"th",{},[352],{"type":212,"value":353},"Form",{"type":207,"tag":349,"props":355,"children":356},{},[357],{"type":212,"value":358},"Content",{"type":207,"tag":349,"props":360,"children":361},{},[362],{"type":212,"value":363},"Our result",{"type":207,"tag":365,"props":366,"children":367},"tbody",{},[368,387,405],{"type":207,"tag":345,"props":369,"children":370},{},[371,377,382],{"type":207,"tag":372,"props":373,"children":374},"td",{},[375],{"type":212,"value":376},"A full name section",{"type":207,"tag":372,"props":378,"children":379},{},[380],{"type":212,"value":381},"Index to name for every function",{"type":207,"tag":372,"props":383,"children":384},{},[385],{"type":212,"value":386},"Exact",{"type":207,"tag":345,"props":388,"children":389},{},[390,395,400],{"type":207,"tag":372,"props":391,"children":392},{},[393],{"type":212,"value":394},"A partial map",{"type":207,"tag":372,"props":396,"children":397},{},[398],{"type":212,"value":399},"Index to name for exported and asserted functions only",{"type":207,"tag":372,"props":401,"children":402},{},[403],{"type":212,"value":404},"Almost exact",{"type":207,"tag":345,"props":406,"children":407},{},[408,413,418],{"type":207,"tag":372,"props":409,"children":410},{},[411],{"type":212,"value":412},"A hash map",{"type":207,"tag":372,"props":414,"children":415},{},[416],{"type":212,"value":417},"Index to a stable hash of the mangled name",{"type":207,"tag":372,"props":419,"children":420},{},[421],{"type":212,"value":422},"Exact matching, no readable names",{"type":207,"tag":208,"props":424,"children":425},{},[426],{"type":212,"value":427},"The third form discloses the least and still solves the problem — we only need\nto know that function 2469 in the new build is the same function as 2461 in\nthe old one.",{"type":207,"tag":261,"props":429,"children":431},{"id":430},"the-name-map-in-detail-what-we-dont-ask-for",[432],{"type":212,"value":433},"What we don't ask for",{"type":207,"tag":208,"props":435,"children":436},{},[437],{"type":212,"value":438},"No source code, no private build-system symbols, no debug build.",{"type":207,"tag":226,"props":440,"children":442},{"id":441},"a-fourth-optional-item-announce-a-build",[443],{"type":212,"value":444},"A fourth, optional item: announce a build",{"type":207,"tag":208,"props":446,"children":447},{},[448],{"type":212,"value":449},"We poll the patch manifest every fifteen minutes to notice a new build.\nThat's polite, but wasteful for both sides. A field in the manifest, or a\nsmall feed, would let us react to a signal instead of a timer. Optional — the\npolling works, and we keep it under one request per quarter hour.",{"type":207,"tag":226,"props":451,"children":453},{"id":452},"acceptance-criteria",[454],{"type":212,"value":455},"Acceptance criteria",{"type":207,"tag":457,"props":458,"children":459},"ul",{},[460,473,478,483],{"type":207,"tag":461,"props":462,"children":463},"li",{},[464,466,471],{"type":212,"value":465},"The ",{"type":207,"tag":284,"props":467,"children":468},{},[469],{"type":212,"value":470},"build_id",{"type":212,"value":472}," custom section is present in the published module.",{"type":207,"tag":461,"props":474,"children":475},{},[476],{"type":212,"value":477},"The assert strings and the source paths stay in the data section.",{"type":207,"tag":461,"props":479,"children":480},{},[481],{"type":212,"value":482},"A name map, in one of the three forms above, is published with each build,\nat a stable URL.",{"type":207,"tag":461,"props":484,"children":485},{},[486],{"type":212,"value":487},"The map covers the functions in the code section of the same build.",{"type":207,"tag":243,"props":489,"children":491},{"title":490},"Why this matters for reports like these",[492],{"type":212,"value":493},"Every report in this section exists because the assert strings are in the\nbinary — they're what lets us map a finding to a translation unit. A stable\nplatform host keeps reporting defects with function indices, byte offsets, and\nreproducible measurements.",{"title":495,"searchDepth":496,"depth":496,"links":497},"",4,[498,500,506,510,511],{"id":228,"depth":499,"text":231},2,{"id":251,"depth":499,"text":254,"children":501},[502,504,505],{"id":263,"depth":503,"text":266},3,{"id":274,"depth":503,"text":277},{"id":293,"depth":503,"text":296},{"id":311,"depth":499,"text":314,"children":507},[508,509],{"id":327,"depth":503,"text":330},{"id":430,"depth":503,"text":433},{"id":441,"depth":499,"text":444},{"id":452,"depth":499,"text":455},"markdown","docs",{"source":515,"path":516,"stem":517,"dir":518,"extension":519},"content","en\u002F1.docs\u002F3.upstream\u002F6.proposals\u002F1.build-identification.md","en\u002F1.docs\u002F3.upstream\u002F6.proposals\u002F1.build-identification","proposals","md",{"requestedPath":172,"resolvedPath":521,"alternates":522},"\u002Fdocs\u002Fupstream\u002Fproposals\u002Fbuild-identification",[523,525],{"locale":77,"path":521,"source":524},"variant",{"locale":8,"path":172,"source":526,"resolvedLocale":77},"fallback",{"requested":528,"resolved":529,"usedFallback":80},{"locale":8},{"locale":77},{"previous":531,"next":531},null,1786362945798]