[{"data":1,"prerenderedAt":1862},["ShallowReactive",2],{"docs-navigation:de":3,"content-page:docs:KOxIR_l0R_YmNMSOw8Ub04oPIXaQi9wkkWlYYb7Ayec":267,"content-page-surround:docs:KOxIR_l0R_YmNMSOw8Ub04oPIXaQi9wkkWlYYb7Ayec":1854,"i-lucide:file":1856,"i-lucide:clipboard":1860},[4,65,85,206],{"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,21,28,35,42,49,56],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"navigation":18,"path":20},"Guild Wars auf dem Mac installieren","content:de:1.dokumentation:1.anleitungen:1.installation.md","1\u002F1","lucide:download",{"title":19},"Install and sign in","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Finstallation",{"title":22,"id":23,"canonicalKey":24,"locale":8,"draft":6,"navigation":25,"icon":26,"path":27},"Konten & Mobile-Verknüpfung","content:de:1.dokumentation:1.anleitungen:2.konten.md","1\u002F2",{"title":22},"lucide:key-round","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fkonten",{"title":29,"id":30,"canonicalKey":31,"locale":8,"draft":6,"navigation":32,"icon":33,"path":34},"Auf dem Mac spielen: Optionen","content:de:1.dokumentation:1.anleitungen:3.guild-wars-auf-dem-mac-spielen.md","1\u002F3",{"title":29},"lucide:scale","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fguild-wars-auf-dem-mac-spielen",{"title":36,"id":37,"canonicalKey":38,"locale":8,"draft":6,"navigation":39,"icon":40,"path":41},"Leistung","content:de:1.dokumentation:1.anleitungen:4.leistung.md","1\u002F4",{"title":36},"lucide:gauge","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fleistung",{"title":43,"id":44,"canonicalKey":45,"locale":8,"draft":6,"navigation":46,"icon":47,"path":48},"Templates","content:de:1.dokumentation:1.anleitungen:5.templates.md","1\u002F5",{"title":43},"lucide:bookmark","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ftemplates",{"title":50,"id":51,"canonicalKey":52,"locale":8,"draft":6,"navigation":53,"icon":54,"path":55},"Fehlerbehebung","content:de:1.dokumentation:1.anleitungen:6.fehlerbehebung.md","1\u002F6",{"title":50},"lucide:wrench","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ffehlerbehebung",{"title":57,"id":58,"canonicalKey":59,"locale":60,"draft":6,"navigation":61,"icon":62,"fallback":63,"path":64},"Known issues","content:en:1.docs:1.guides:7.known-issues.md","1\u002F7","en",{"title":57},"lucide:triangle-alert",true,"\u002Fde\u002Fdokumentation\u002Fguides\u002Fknown-issues",{"title":66,"page":6,"canonicalKey":67,"locale":8,"id":68,"draft":6,"icon":69,"sidebar":70,"children":71},"Projekt","2","content:de:1.dokumentation:2.projekt:.navigation.yml","lucide:shield-check","group",[72,78],{"title":73,"id":74,"canonicalKey":75,"locale":8,"draft":6,"navigation":76,"icon":69,"path":77},"Sicherheit & Kontorisiko","content:de:1.dokumentation:2.projekt:1.sicherheit.md","2\u002F1",{"title":73},"\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fsicherheit",{"title":79,"id":80,"canonicalKey":81,"locale":8,"draft":6,"navigation":82,"icon":83,"path":84},"Über & Credits","content:de:1.dokumentation:2.projekt:2.ueber.md","2\u002F2",{"title":79},"lucide:users","\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fueber",{"title":86,"page":6,"canonicalKey":87,"locale":60,"id":88,"draft":6,"icon":89,"sidebar":11,"fallback":63,"children":90},"For ArenaNet","3","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",[91,98,105,131,157,169,188],{"title":92,"id":93,"canonicalKey":94,"locale":60,"draft":6,"navigation":95,"icon":96,"fallback":63,"path":97},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":92},"lucide:book-open-check","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fintroduction",{"title":99,"id":100,"canonicalKey":101,"locale":60,"draft":6,"navigation":102,"icon":103,"fallback":63,"path":104},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":99},"lucide:list-checks","\u002Fde\u002Fdokumentation\u002Fupstream\u002Frequest-summary",{"title":106,"page":6,"canonicalKey":107,"locale":60,"id":108,"draft":6,"icon":109,"sidebar":70,"fallback":63,"children":110},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[111,117,124],{"title":112,"id":113,"canonicalKey":114,"locale":60,"draft":6,"navigation":115,"icon":109,"fallback":63,"path":116},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":112},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":118,"id":119,"canonicalKey":120,"locale":60,"draft":6,"navigation":121,"icon":122,"fallback":63,"path":123},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":118},"lucide:scissors","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":125,"id":126,"canonicalKey":127,"locale":60,"draft":6,"navigation":128,"icon":129,"fallback":63,"path":130},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":125},"lucide:file-plus-2","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":132,"page":6,"canonicalKey":133,"locale":60,"id":134,"draft":6,"icon":135,"sidebar":70,"fallback":63,"children":136},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[137,143,150],{"title":138,"id":139,"canonicalKey":140,"locale":60,"draft":6,"navigation":141,"icon":135,"fallback":63,"path":142},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":138},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":144,"id":145,"canonicalKey":146,"locale":60,"draft":6,"navigation":147,"icon":148,"fallback":63,"path":149},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":144},"lucide:keyboard","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fkey-labels",{"title":151,"id":152,"canonicalKey":153,"locale":60,"draft":6,"navigation":154,"icon":155,"fallback":63,"path":156},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":151},"lucide:pointer","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":158,"page":6,"canonicalKey":159,"locale":60,"id":160,"draft":6,"icon":161,"sidebar":70,"fallback":63,"children":162},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[163],{"title":164,"id":165,"canonicalKey":166,"locale":60,"draft":6,"navigation":167,"icon":161,"fallback":63,"path":168},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":164},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":170,"page":6,"canonicalKey":171,"locale":60,"id":172,"draft":6,"icon":173,"sidebar":70,"fallback":63,"children":174},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[175,182],{"title":176,"id":177,"canonicalKey":178,"locale":60,"draft":6,"navigation":179,"icon":180,"fallback":63,"path":181},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":176},"lucide:fingerprint","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":183,"id":184,"canonicalKey":185,"locale":60,"draft":6,"navigation":186,"icon":173,"fallback":63,"path":187},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":183},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":189,"page":6,"canonicalKey":190,"locale":60,"id":191,"draft":6,"icon":192,"sidebar":70,"fallback":63,"children":193},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[194,200],{"title":195,"id":196,"canonicalKey":197,"locale":60,"draft":6,"navigation":198,"icon":54,"fallback":63,"path":199},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":195},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Four-workarounds",{"title":201,"id":202,"canonicalKey":203,"locale":60,"draft":6,"navigation":204,"icon":192,"fallback":63,"path":205},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":201},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Fverification-method",{"title":207,"page":6,"canonicalKey":208,"locale":60,"id":209,"draft":6,"icon":210,"sidebar":11,"fallback":63,"children":211},"Features","4","content:en:1.docs:4.features:.navigation.yml","lucide:layout-grid",[212,218,225,232,239,246,253,260],{"title":213,"id":214,"canonicalKey":215,"locale":60,"draft":6,"navigation":216,"icon":83,"fallback":63,"path":217},"Accounts and launcher","content:en:1.docs:4.features:1.accounts.md","4\u002F1",{"title":213},"\u002Fde\u002Fdokumentation\u002Ffeatures\u002Faccounts",{"title":219,"id":220,"canonicalKey":221,"locale":60,"draft":6,"navigation":222,"icon":223,"fallback":63,"path":224},"Hub and Switch Character","content:en:1.docs:4.features:2.hub.md","4\u002F2",{"title":219},"lucide:search","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fhub",{"title":226,"id":227,"canonicalKey":228,"locale":60,"draft":6,"navigation":229,"icon":230,"fallback":63,"path":231},"Travel and maps","content:en:1.docs:4.features:3.travel-and-maps.md","4\u002F3",{"title":226},"lucide:map","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Ftravel-and-maps",{"title":233,"id":234,"canonicalKey":235,"locale":60,"draft":6,"navigation":236,"icon":237,"fallback":63,"path":238},"Chat and trade","content:en:1.docs:4.features:4.chat-and-trade.md","4\u002F4",{"title":233},"lucide:messages-square","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fchat-and-trade",{"title":240,"id":241,"canonicalKey":242,"locale":60,"draft":6,"navigation":243,"icon":244,"fallback":63,"path":245},"Inventory","content:en:1.docs:4.features:5.inventory.md","4\u002F5",{"title":240},"lucide:package","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Finventory",{"title":247,"id":248,"canonicalKey":249,"locale":60,"draft":6,"navigation":250,"icon":251,"fallback":63,"path":252},"Timers and readouts","content:en:1.docs:4.features:6.combat.md","4\u002F6",{"title":247},"lucide:timer","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fcombat",{"title":254,"id":255,"canonicalKey":256,"locale":60,"draft":6,"navigation":257,"icon":258,"fallback":63,"path":259},"Appearance","content:en:1.docs:4.features:7.appearance.md","4\u002F7",{"title":254},"lucide:palette","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fappearance",{"title":261,"id":262,"canonicalKey":263,"locale":60,"draft":6,"navigation":264,"icon":265,"fallback":63,"path":266},"Game files and updates","content:en:1.docs:4.features:8.game-files-and-updates.md","4\u002F8",{"title":261},"lucide:hard-drive-download","\u002Fde\u002Fdokumentation\u002Ffeatures\u002Fgame-files-and-updates",{"title":268,"ref":269,"description":270,"icon":109,"updated":271,"navigation":272,"body":273,"type":1835,"id":113,"canonicalKey":114,"draft":6,"partial":6,"locale":60,"collection":1836,"navigationFile":6,"file":1837,"resolvedRefs":1843,"route":1844,"resolution":1851},"UR-01 to UR-04: unimplemented Emscripten file routines","docs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines","Four routines in Base\u002FOs\u002FEmscripten ship as stubs. They disable template save and list, screenshots, and chat logs. One of them aborts the client.","2026-08-04",{"title":112},{"type":274,"children":275,"toc":1802},"root",[276,306,465,477,484,596,600,606,630,640,647,652,665,683,702,707,821,840,846,864,882,888,960,963,969,986,995,1000,1018,1023,1033,1045,1168,1173,1178,1201,1223,1236,1241,1321,1324,1330,1346,1355,1360,1364,1372,1388,1413,1424,1429,1454,1482,1487,1531,1534,1540,1562,1571,1576,1581,1589,1601,1606,1611,1616,1631,1636,1665,1694,1697,1703,1708,1777,1783,1788],{"type":277,"tag":278,"props":279,"children":280},"element","p",{},[281,284,290,292,297,299,304],{"type":282,"value":283},"text","Four routines in ",{"type":277,"tag":285,"props":286,"children":287},"code",{},[288],{"type":282,"value":289},"Base\u002FOs\u002FEmscripten",{"type":282,"value":291}," ship without an implementation. Three\nreturn a constant; one calls ",{"type":277,"tag":285,"props":293,"children":294},{},[295],{"type":282,"value":296},"assert",{"type":282,"value":298}," and then ",{"type":277,"tag":285,"props":300,"children":301},{},[302],{"type":282,"value":303},"unreachable",{"type":282,"value":305},". Between them they\ndisable skill and equipment templates, the template list, screenshots, and chat\nlogs — and the fourth one aborts the client.",{"type":277,"tag":307,"props":308,"children":309},"table",{},[310,339],{"type":277,"tag":311,"props":312,"children":313},"thead",{},[314],{"type":277,"tag":315,"props":316,"children":317},"tr",{},[318,324,329,334],{"type":277,"tag":319,"props":320,"children":321},"th",{},[322],{"type":282,"value":323},"ID",{"type":277,"tag":319,"props":325,"children":326},{},[327],{"type":282,"value":328},"Routine",{"type":277,"tag":319,"props":330,"children":331},{},[332],{"type":282,"value":333},"Today",{"type":277,"tag":319,"props":335,"children":336},{},[337],{"type":282,"value":338},"Fix",{"type":277,"tag":340,"props":341,"children":342},"tbody",{},[343,373,402,428],{"type":277,"tag":315,"props":344,"children":345},{},[346,355,360,365],{"type":277,"tag":347,"props":348,"children":349},"td",{},[350],{"type":277,"tag":285,"props":351,"children":352},{},[353],{"type":282,"value":354},"UR-01",{"type":277,"tag":347,"props":356,"children":357},{},[358],{"type":282,"value":359},"Directory creation",{"type":277,"tag":347,"props":361,"children":362},{},[363],{"type":282,"value":364},"Returns error 2 unconditionally",{"type":277,"tag":347,"props":366,"children":367},{},[368],{"type":277,"tag":285,"props":369,"children":370},{},[371],{"type":282,"value":372},"FS.mkdirTree",{"type":277,"tag":315,"props":374,"children":375},{},[376,384,389,394],{"type":277,"tag":347,"props":377,"children":378},{},[379],{"type":277,"tag":285,"props":380,"children":381},{},[382],{"type":282,"value":383},"UR-02",{"type":277,"tag":347,"props":385,"children":386},{},[387],{"type":282,"value":388},"Directory enumeration",{"type":277,"tag":347,"props":390,"children":391},{},[392],{"type":282,"value":393},"Empty body, every directory reads as empty",{"type":277,"tag":347,"props":395,"children":396},{},[397],{"type":277,"tag":285,"props":398,"children":399},{},[400],{"type":282,"value":401},"FS.readdir",{"type":277,"tag":315,"props":403,"children":404},{},[405,413,418,423],{"type":277,"tag":347,"props":406,"children":407},{},[408],{"type":277,"tag":285,"props":409,"children":410},{},[411],{"type":282,"value":412},"UR-03",{"type":277,"tag":347,"props":414,"children":415},{},[416],{"type":282,"value":417},"Entry-name derivation",{"type":277,"tag":347,"props":419,"children":420},{},[421],{"type":282,"value":422},"Returns 0, writes nothing",{"type":277,"tag":347,"props":424,"children":425},{},[426],{"type":282,"value":427},"Path arithmetic",{"type":277,"tag":315,"props":429,"children":430},{},[431,439,444,457],{"type":277,"tag":347,"props":432,"children":433},{},[434],{"type":277,"tag":285,"props":435,"children":436},{},[437],{"type":282,"value":438},"UR-04",{"type":277,"tag":347,"props":440,"children":441},{},[442],{"type":282,"value":443},"File deletion",{"type":277,"tag":347,"props":445,"children":446},{},[447,451,453],{"type":277,"tag":285,"props":448,"children":449},{},[450],{"type":282,"value":296},{"type":282,"value":452}," and ",{"type":277,"tag":285,"props":454,"children":455},{},[456],{"type":282,"value":303},{"type":277,"tag":347,"props":458,"children":459},{},[460],{"type":277,"tag":285,"props":461,"children":462},{},[463],{"type":282,"value":464},"FS.unlink",{"type":277,"tag":278,"props":466,"children":467},{},[468,470,475],{"type":282,"value":469},"Build used for the measurements below:\n",{"type":277,"tag":285,"props":471,"children":472},{},[473],{"type":282,"value":474},"b0319704f3072d6948a66026a35af5eb0af12b48d70986783c293e7c77e98483",{"type":282,"value":476},".",{"type":277,"tag":478,"props":479,"children":481},"h2",{"id":480},"what-the-player-sees",[482],{"type":282,"value":483},"What the player sees",{"type":277,"tag":307,"props":485,"children":486},{},[487,503],{"type":277,"tag":311,"props":488,"children":489},{},[490],{"type":277,"tag":315,"props":491,"children":492},{},[493,498],{"type":277,"tag":319,"props":494,"children":495},{},[496],{"type":282,"value":497},"Action",{"type":277,"tag":319,"props":499,"children":500},{},[501],{"type":282,"value":502},"Result today",{"type":277,"tag":340,"props":504,"children":505},{},[506,523,536,552,565,583],{"type":277,"tag":315,"props":507,"children":508},{},[509,514],{"type":277,"tag":347,"props":510,"children":511},{},[512],{"type":282,"value":513},"Save a skill template",{"type":277,"tag":347,"props":515,"children":516},{},[517],{"type":277,"tag":518,"props":519,"children":520},"em",{},[521],{"type":282,"value":522},"\"The attempt to save the Skills Template named … failed because the file could not be created\u002Fwritten to\"",{"type":277,"tag":315,"props":524,"children":525},{},[526,531],{"type":277,"tag":347,"props":527,"children":528},{},[529],{"type":282,"value":530},"Open \"Load from Skills Template\"",{"type":277,"tag":347,"props":532,"children":533},{},[534],{"type":282,"value":535},"The list is always empty, also after a successful save",{"type":277,"tag":315,"props":537,"children":538},{},[539,544],{"type":277,"tag":347,"props":540,"children":541},{},[542],{"type":282,"value":543},"Rename a template",{"type":277,"tag":347,"props":545,"children":546},{},[547],{"type":277,"tag":518,"props":548,"children":549},{},[550],{"type":282,"value":551},"\"The attempt to rename the Skills Template named … failed\"",{"type":277,"tag":315,"props":553,"children":554},{},[555,560],{"type":277,"tag":347,"props":556,"children":557},{},[558],{"type":282,"value":559},"Delete a template",{"type":277,"tag":347,"props":561,"children":562},{},[563],{"type":282,"value":564},"The client stops",{"type":277,"tag":315,"props":566,"children":567},{},[568,573],{"type":277,"tag":347,"props":569,"children":570},{},[571],{"type":282,"value":572},"Take a screenshot",{"type":277,"tag":347,"props":574,"children":575},{},[576,578],{"type":282,"value":577},"No file appears in ",{"type":277,"tag":285,"props":579,"children":580},{},[581],{"type":282,"value":582},"Screens\u002F",{"type":277,"tag":315,"props":584,"children":585},{},[586,591],{"type":277,"tag":347,"props":587,"children":588},{},[589],{"type":282,"value":590},"Write a chat log",{"type":277,"tag":347,"props":592,"children":593},{},[594],{"type":282,"value":595},"No file appears",{"type":277,"tag":597,"props":598,"children":599},"hr",{},[],{"type":277,"tag":478,"props":601,"children":603},{"id":602},"ur-01-directory-creation-always-fails",[604],{"type":282,"value":605},"UR-01 — directory creation always fails",{"type":277,"tag":278,"props":607,"children":608},{},[609,615,617,622,624,629],{"type":277,"tag":610,"props":611,"children":612},"strong",{},[613],{"type":282,"value":614},"Function 404",{"type":282,"value":616},", signature ",{"type":277,"tag":285,"props":618,"children":619},{},[620],{"type":282,"value":621},"(wchar_t* path, int recursive) -> int",{"type":282,"value":623},", in\n",{"type":277,"tag":285,"props":625,"children":626},{},[627],{"type":282,"value":628},"Base\u002FOs\u002FEmscripten\u002FEmscriptenPath.cpp",{"type":282,"value":476},{"type":277,"tag":278,"props":631,"children":632},{},[633,638],{"type":277,"tag":610,"props":634,"children":635},{},[636],{"type":282,"value":637},"Fix:",{"type":282,"value":639}," low effort, small blast radius — one clear task with a working\nWindows equivalent, and four call sites that all expect this behaviour\nalready.",{"type":277,"tag":641,"props":642,"children":644},"h3",{"id":643},"ur-01-directory-creation-always-fails-what-the-client-does-now",[645],{"type":282,"value":646},"What the client does now",{"type":277,"tag":278,"props":648,"children":649},{},[650],{"type":282,"value":651},"The complete function body is two instructions:",{"type":277,"tag":653,"props":654,"children":658},"pre",{"language":655,"class":656,"tabindex":657},"wasm","shiki dark:dark-plus","0",[659],{"type":277,"tag":285,"props":660,"children":662},{"class":661},"language-wasm",[663],{"type":282,"value":664},"i32.const 2\nend",{"type":277,"tag":278,"props":666,"children":667},{},[668,670,674,676,681],{"type":282,"value":669},"It returns ",{"type":277,"tag":285,"props":671,"children":672},{},[673],{"type":282,"value":67},{"type":282,"value":675}," (",{"type":277,"tag":285,"props":677,"children":678},{},[679],{"type":282,"value":680},"ERROR_FILE_NOT_FOUND",{"type":282,"value":682},") every time, without touching the\nEmscripten file system. We called the shipped function directly:",{"type":277,"tag":653,"props":684,"children":686},{"language":282,"class":685,"tabindex":657},"shiki shiki-themes light-plus dark-plus dark:dark-plus",[687],{"type":277,"tag":285,"props":688,"children":690},{"class":689},"language-text",[691],{"type":277,"tag":692,"props":693,"children":696},"span",{"class":694,"style":695},"line","display: inline",[697],{"type":277,"tag":692,"props":698,"children":699},{},[700],{"type":282,"value":701},"func_404(L\"Templates\u002FSkills\u002F\", 1) = 2",{"type":277,"tag":278,"props":703,"children":704},{},[705],{"type":282,"value":706},"All callers treat a non-zero result as a failure of the whole operation:",{"type":277,"tag":307,"props":708,"children":709},{},[710,726],{"type":277,"tag":311,"props":711,"children":712},{},[713],{"type":277,"tag":315,"props":714,"children":715},{},[716,721],{"type":277,"tag":319,"props":717,"children":718},{},[719],{"type":282,"value":720},"Caller",{"type":277,"tag":319,"props":722,"children":723},{},[724],{"type":282,"value":725},"Purpose",{"type":277,"tag":340,"props":727,"children":728},{},[729,761,785,803],{"type":277,"tag":315,"props":730,"children":731},{},[732,742],{"type":277,"tag":347,"props":733,"children":734},{},[735,737],{"type":282,"value":736},"9757, ",{"type":277,"tag":285,"props":738,"children":739},{},[740],{"type":282,"value":741},"Gw\u002FAccount\u002FCli\u002FAcctCliTemplate.cpp",{"type":277,"tag":347,"props":743,"children":744},{},[745,747,752,754,759],{"type":282,"value":746},"Create ",{"type":277,"tag":285,"props":748,"children":749},{},[750],{"type":282,"value":751},"Templates\u002FSkills",{"type":282,"value":753}," or ",{"type":277,"tag":285,"props":755,"children":756},{},[757],{"type":282,"value":758},"Templates\u002FEquipment",{"type":282,"value":760}," before a write",{"type":277,"tag":315,"props":762,"children":763},{},[764,774],{"type":277,"tag":347,"props":765,"children":766},{},[767,769],{"type":282,"value":768},"12433, ",{"type":277,"tag":285,"props":770,"children":771},{},[772],{"type":282,"value":773},"Gw\u002FUi\u002FUiScreen.cpp",{"type":277,"tag":347,"props":775,"children":776},{},[777,778,783],{"type":282,"value":746},{"type":277,"tag":285,"props":779,"children":780},{},[781],{"type":282,"value":782},"Screens",{"type":282,"value":784}," before a screenshot",{"type":277,"tag":315,"props":786,"children":787},{},[788,798],{"type":277,"tag":347,"props":789,"children":790},{},[791,793],{"type":282,"value":792},"11744, ",{"type":277,"tag":285,"props":794,"children":795},{},[796],{"type":282,"value":797},"CtChatLog.cpp",{"type":277,"tag":347,"props":799,"children":800},{},[801],{"type":282,"value":802},"Create the chat-log directory",{"type":277,"tag":315,"props":804,"children":805},{},[806,816],{"type":277,"tag":347,"props":807,"children":808},{},[809,811],{"type":282,"value":810},"11460, ",{"type":277,"tag":285,"props":812,"children":813},{},[814],{"type":282,"value":815},"ActDlgLogin.cpp",{"type":277,"tag":347,"props":817,"children":818},{},[819],{"type":282,"value":820},"The result is discarded",{"type":277,"tag":278,"props":822,"children":823},{},[824,826,831,833,838],{"type":282,"value":825},"The template save path checks this result before opening the file, so\n",{"type":277,"tag":285,"props":827,"children":828},{},[829],{"type":282,"value":830},"AcctCliTemplate.cpp:1020",{"type":282,"value":832}," stores error 2 and the client reports that it can't\ncreate the file — without ever reaching the file system. We confirmed this:\nthe save failure occurs with zero ",{"type":277,"tag":285,"props":834,"children":835},{},[836],{"type":282,"value":837},"openat",{"type":282,"value":839}," activity.",{"type":277,"tag":641,"props":841,"children":843},{"id":842},"ur-01-directory-creation-always-fails-expected-behaviour",[844],{"type":282,"value":845},"Expected behaviour",{"type":277,"tag":278,"props":847,"children":848},{},[849,851,856,858,862],{"type":282,"value":850},"Create the directory, including parent directories when ",{"type":277,"tag":285,"props":852,"children":853},{},[854],{"type":282,"value":855},"recursive",{"type":282,"value":857}," is set.\nReturn ",{"type":277,"tag":285,"props":859,"children":860},{},[861],{"type":282,"value":657},{"type":282,"value":863}," on success and the matching error code on failure.",{"type":277,"tag":278,"props":865,"children":866},{},[867,869,874,876,880],{"type":282,"value":868},"The module imports no ",{"type":277,"tag":285,"props":870,"children":871},{},[872],{"type":282,"value":873},"mkdir",{"type":282,"value":875},". ",{"type":277,"tag":285,"props":877,"children":878},{},[879],{"type":282,"value":372},{"type":282,"value":881}," in the Emscripten file-system\nAPI is the direct equivalent.",{"type":277,"tag":641,"props":883,"children":885},{"id":884},"ur-01-directory-creation-always-fails-acceptance-criteria",[886],{"type":282,"value":887},"Acceptance criteria",{"type":277,"tag":889,"props":890,"children":891},"ul",{},[892,916,927,938,950],{"type":277,"tag":893,"props":894,"children":895},"li",{},[896,901,903,907,909,914],{"type":277,"tag":285,"props":897,"children":898},{},[899],{"type":282,"value":900},"func_404(L\"Templates\u002FSkills\u002F\", 1)",{"type":282,"value":902}," returns ",{"type":277,"tag":285,"props":904,"children":905},{},[906],{"type":282,"value":657},{"type":282,"value":908}," on a mount where\n",{"type":277,"tag":285,"props":910,"children":911},{},[912],{"type":282,"value":913},"Templates\u002F",{"type":282,"value":915}," does not exist yet.",{"type":277,"tag":893,"props":917,"children":918},{},[919,921,925],{"type":282,"value":920},"After the call, ",{"type":277,"tag":285,"props":922,"children":923},{},[924],{"type":282,"value":751},{"type":282,"value":926}," exists and is a directory.",{"type":277,"tag":893,"props":928,"children":929},{},[930,932,936],{"type":282,"value":931},"A second call on the same path returns ",{"type":277,"tag":285,"props":933,"children":934},{},[935],{"type":282,"value":657},{"type":282,"value":937}," and changes nothing.",{"type":277,"tag":893,"props":939,"children":940},{},[941,943,948],{"type":282,"value":942},"A call with ",{"type":277,"tag":285,"props":944,"children":945},{},[946],{"type":282,"value":947},"recursive = 0",{"type":282,"value":949}," on a path whose parent is absent returns a\nnon-zero error code.",{"type":277,"tag":893,"props":951,"children":952},{},[953,955,959],{"type":282,"value":954},"A screenshot creates a file in ",{"type":277,"tag":285,"props":956,"children":957},{},[958],{"type":282,"value":582},{"type":282,"value":476},{"type":277,"tag":597,"props":961,"children":962},{},[],{"type":277,"tag":478,"props":964,"children":966},{"id":965},"ur-02-directory-enumeration-does-nothing",[967],{"type":282,"value":968},"UR-02 — directory enumeration does nothing",{"type":277,"tag":278,"props":970,"children":971},{},[972,977,979,984],{"type":277,"tag":610,"props":973,"children":974},{},[975],{"type":282,"value":976},"Function 405",{"type":282,"value":978},", signature\n",{"type":277,"tag":285,"props":980,"children":981},{},[982],{"type":282,"value":983},"(FileList* out, const wchar_t* pattern, int flags) -> void",{"type":282,"value":985},", same translation\nunit.",{"type":277,"tag":278,"props":987,"children":988},{},[989,993],{"type":277,"tag":610,"props":990,"children":991},{},[992],{"type":282,"value":637},{"type":282,"value":994}," medium effort — the pattern match and the allocation contract need\ncare. Small blast radius: the callers already handle a list of any length.",{"type":277,"tag":641,"props":996,"children":998},{"id":997},"ur-02-directory-enumeration-does-nothing-what-the-client-does-now",[999],{"type":282,"value":646},{"type":277,"tag":278,"props":1001,"children":1002},{},[1003,1005,1010,1012,1016],{"type":282,"value":1004},"The function body is empty — it returns without writing to ",{"type":277,"tag":285,"props":1006,"children":1007},{},[1008],{"type":282,"value":1009},"out",{"type":282,"value":1011},". The caller\nzeroes ",{"type":277,"tag":285,"props":1013,"children":1014},{},[1015],{"type":282,"value":1009},{"type":282,"value":1017}," before the call, so every directory reads as empty.",{"type":277,"tag":278,"props":1019,"children":1020},{},[1021],{"type":282,"value":1022},"The output structure, taken from the call sites:",{"type":277,"tag":653,"props":1024,"children":1026},{"language":1025,"class":656,"tabindex":657},"c",[1027],{"type":277,"tag":285,"props":1028,"children":1030},{"class":1029},"language-c",[1031],{"type":282,"value":1032},"struct FileList {          \u002F\u002F 16 bytes, the caller zeroes this\n    Entry*   entries;      \u002F\u002F +0   the caller frees this with free()\n    uint32_t _pad;         \u002F\u002F +4\n    uint32_t count;        \u002F\u002F +8\n    uint32_t _pad2;        \u002F\u002F +12\n};\n\nstruct Entry {             \u002F\u002F 544 bytes, stride confirmed at every call site\n    uint8_t  header[24];   \u002F\u002F +0   no caller reads this\n    wchar_t  name[260];    \u002F\u002F +24  file name, with extension\n};",{"type":277,"tag":278,"props":1034,"children":1035},{},[1036,1038,1043],{"type":282,"value":1037},"The ",{"type":277,"tag":285,"props":1039,"children":1040},{},[1041],{"type":282,"value":1042},"flags",{"type":282,"value":1044}," parameter selects the entry kind. We observed these values:",{"type":277,"tag":307,"props":1046,"children":1047},{},[1048,1067],{"type":277,"tag":311,"props":1049,"children":1050},{},[1051],{"type":277,"tag":315,"props":1052,"children":1053},{},[1054,1058,1063],{"type":277,"tag":319,"props":1055,"children":1056},{},[1057],{"type":282,"value":720},{"type":277,"tag":319,"props":1059,"children":1060},{},[1061],{"type":282,"value":1062},"Pattern",{"type":277,"tag":319,"props":1064,"children":1065},{},[1066],{"type":282,"value":1042},{"type":277,"tag":340,"props":1068,"children":1069},{},[1070,1096,1121,1144],{"type":277,"tag":315,"props":1071,"children":1072},{},[1073,1083,1091],{"type":277,"tag":347,"props":1074,"children":1075},{},[1076,1078],{"type":282,"value":1077},"9747, ",{"type":277,"tag":285,"props":1079,"children":1080},{},[1081],{"type":282,"value":1082},"AcctCliTemplate.cpp",{"type":277,"tag":347,"props":1084,"children":1085},{},[1086],{"type":277,"tag":285,"props":1087,"children":1088},{},[1089],{"type":282,"value":1090},"Templates\u002FSkills\u002F*.txt",{"type":277,"tag":347,"props":1092,"children":1093},{},[1094],{"type":282,"value":1095},"17 — files",{"type":277,"tag":315,"props":1097,"children":1098},{},[1099,1108,1116],{"type":277,"tag":347,"props":1100,"children":1101},{},[1102,1104],{"type":282,"value":1103},"9746, ",{"type":277,"tag":285,"props":1105,"children":1106},{},[1107],{"type":282,"value":1082},{"type":277,"tag":347,"props":1109,"children":1110},{},[1111],{"type":277,"tag":285,"props":1112,"children":1113},{},[1114],{"type":282,"value":1115},"Templates\u002FSkills\u002F*",{"type":277,"tag":347,"props":1117,"children":1118},{},[1119],{"type":282,"value":1120},"18 — directories",{"type":277,"tag":315,"props":1122,"children":1123},{},[1124,1132,1140],{"type":277,"tag":347,"props":1125,"children":1126},{},[1127,1128],{"type":282,"value":792},{"type":277,"tag":285,"props":1129,"children":1130},{},[1131],{"type":282,"value":797},{"type":277,"tag":347,"props":1133,"children":1134},{},[1135],{"type":277,"tag":285,"props":1136,"children":1137},{},[1138],{"type":282,"value":1139},"\u003Cdir>\u002Fgw???.txt",{"type":277,"tag":347,"props":1141,"children":1142},{},[1143],{"type":282,"value":7},{"type":277,"tag":315,"props":1145,"children":1146},{},[1147,1156,1164],{"type":277,"tag":347,"props":1148,"children":1149},{},[1150,1151],{"type":282,"value":768},{"type":277,"tag":285,"props":1152,"children":1153},{},[1154],{"type":282,"value":1155},"UiScreen.cpp",{"type":277,"tag":347,"props":1157,"children":1158},{},[1159],{"type":277,"tag":285,"props":1160,"children":1161},{},[1162],{"type":282,"value":1163},"Screens\u002Fgw???.???",{"type":277,"tag":347,"props":1165,"children":1166},{},[1167],{"type":282,"value":7},{"type":277,"tag":278,"props":1169,"children":1170},{},[1171],{"type":282,"value":1172},"Bit 0 selects files, bit 1 selects directories. Bit 4 shows up only in the\ntemplate scans; we didn't determine its meaning.",{"type":277,"tag":641,"props":1174,"children":1176},{"id":1175},"ur-02-directory-enumeration-does-nothing-expected-behaviour",[1177],{"type":282,"value":845},{"type":277,"tag":278,"props":1179,"children":1180},{},[1181,1183,1187,1189,1194,1195,1200],{"type":282,"value":1182},"Write the matching entries into ",{"type":277,"tag":285,"props":1184,"children":1185},{},[1186],{"type":282,"value":1009},{"type":282,"value":1188},", setting ",{"type":277,"tag":285,"props":1190,"children":1191},{},[1192],{"type":282,"value":1193},"entries",{"type":282,"value":452},{"type":277,"tag":285,"props":1196,"children":1197},{},[1198],{"type":282,"value":1199},"count",{"type":282,"value":476},{"type":277,"tag":278,"props":1202,"children":1203},{},[1204,1205,1210,1212,1216,1217,1222],{"type":282,"value":868},{"type":277,"tag":285,"props":1206,"children":1207},{},[1208],{"type":282,"value":1209},"getdents",{"type":282,"value":1211},". Use ",{"type":277,"tag":285,"props":1213,"children":1214},{},[1215],{"type":282,"value":401},{"type":282,"value":452},{"type":277,"tag":285,"props":1218,"children":1219},{},[1220],{"type":282,"value":1221},"FS.stat",{"type":282,"value":476},{"type":277,"tag":1224,"props":1225,"children":1227},"warning",{"title":1226},"Allocation contract",[1228,1230,1234],{"type":282,"value":1229},"The caller frees ",{"type":277,"tag":285,"props":1231,"children":1232},{},[1233],{"type":282,"value":1193},{"type":282,"value":1235},", so the block has to come from the client's own\nallocator. Don't allocate it in the host or in a different heap.",{"type":277,"tag":641,"props":1237,"children":1239},{"id":1238},"ur-02-directory-enumeration-does-nothing-acceptance-criteria",[1240],{"type":282,"value":887},{"type":277,"tag":889,"props":1242,"children":1243},{},[1244,1255,1266,1271,1288,1304,1316],{"type":277,"tag":893,"props":1245,"children":1246},{},[1247,1249,1254],{"type":282,"value":1248},"A directory with three matching files gives ",{"type":277,"tag":285,"props":1250,"children":1251},{},[1252],{"type":282,"value":1253},"count = 3",{"type":282,"value":476},{"type":277,"tag":893,"props":1256,"children":1257},{},[1258,1260,1265],{"type":282,"value":1259},"Each entry holds the file name with its extension at offset ",{"type":277,"tag":285,"props":1261,"children":1262},{},[1263],{"type":282,"value":1264},"+24",{"type":282,"value":476},{"type":277,"tag":893,"props":1267,"children":1268},{},[1269],{"type":282,"value":1270},"The entry stride is 544 bytes.",{"type":277,"tag":893,"props":1272,"children":1273},{},[1274,1279,1281,1286],{"type":277,"tag":285,"props":1275,"children":1276},{},[1277],{"type":282,"value":1278},"flags = 1",{"type":282,"value":1280}," returns files only. ",{"type":277,"tag":285,"props":1282,"children":1283},{},[1284],{"type":282,"value":1285},"flags = 2",{"type":282,"value":1287}," returns directories only.",{"type":277,"tag":893,"props":1289,"children":1290},{},[1291,1296,1297,1302],{"type":277,"tag":285,"props":1292,"children":1293},{},[1294],{"type":282,"value":1295},"*",{"type":282,"value":452},{"type":277,"tag":285,"props":1298,"children":1299},{},[1300],{"type":282,"value":1301},"?",{"type":282,"value":1303}," match inside one path component.",{"type":277,"tag":893,"props":1305,"children":1306},{},[1307,1309,1314],{"type":282,"value":1308},"The caller can call ",{"type":277,"tag":285,"props":1310,"children":1311},{},[1312],{"type":282,"value":1313},"free(out->entries)",{"type":282,"value":1315}," without a fault.",{"type":277,"tag":893,"props":1317,"children":1318},{},[1319],{"type":282,"value":1320},"\"Load from Skills Template\" lists a template that the player saved before.",{"type":277,"tag":597,"props":1322,"children":1323},{},[],{"type":277,"tag":478,"props":1325,"children":1327},{"id":1326},"ur-03-entry-name-derivation-writes-nothing",[1328],{"type":282,"value":1329},"UR-03 — entry-name derivation writes nothing",{"type":277,"tag":278,"props":1331,"children":1332},{},[1333,1338,1339,1344],{"type":277,"tag":610,"props":1334,"children":1335},{},[1336],{"type":282,"value":1337},"Function 416",{"type":282,"value":978},{"type":277,"tag":285,"props":1340,"children":1341},{},[1342],{"type":282,"value":1343},"(wchar_t* dst, int, const wchar_t* baseDir, int, const wchar_t* path, int dstChars) -> int",{"type":282,"value":1345},",\nsame translation unit.",{"type":277,"tag":278,"props":1347,"children":1348},{},[1349,1353],{"type":277,"tag":610,"props":1350,"children":1351},{},[1352],{"type":282,"value":637},{"type":282,"value":1354}," low effort. Medium blast radius — the two model paths flip from\ntheir fallback branch to the main branch after the fix; test them together\nwith this change.",{"type":277,"tag":641,"props":1356,"children":1358},{"id":1357},"ur-03-entry-name-derivation-writes-nothing-what-the-client-does-now",[1359],{"type":282,"value":646},{"type":277,"tag":278,"props":1361,"children":1362},{},[1363],{"type":282,"value":651},{"type":277,"tag":653,"props":1365,"children":1366},{"language":655,"class":656,"tabindex":657},[1367],{"type":277,"tag":285,"props":1368,"children":1369},{"class":661},[1370],{"type":282,"value":1371},"i32.const 0\nend",{"type":277,"tag":278,"props":1373,"children":1374},{},[1375,1376,1380,1382,1387],{"type":282,"value":669},{"type":277,"tag":285,"props":1377,"children":1378},{},[1379],{"type":282,"value":657},{"type":282,"value":1381}," and writes nothing to ",{"type":277,"tag":285,"props":1383,"children":1384},{},[1385],{"type":282,"value":1386},"dst",{"type":282,"value":476},{"type":277,"tag":278,"props":1389,"children":1390},{},[1391,1393,1397,1399,1404,1406,1411],{"type":282,"value":1392},"Callers: 9746 and 9747 (",{"type":277,"tag":285,"props":1394,"children":1395},{},[1396],{"type":282,"value":1082},{"type":282,"value":1398},", both template scans), 4463\n(",{"type":277,"tag":285,"props":1400,"children":1401},{},[1402],{"type":282,"value":1403},"MdlDecomp.cpp",{"type":282,"value":1405},"), and 4532 (",{"type":277,"tag":285,"props":1407,"children":1408},{},[1409],{"type":282,"value":1410},"MdlTex.cpp",{"type":282,"value":1412},").",{"type":277,"tag":278,"props":1414,"children":1415},{},[1416,1418,1422],{"type":282,"value":1417},"In the template scans the client drops the result and then reads ",{"type":277,"tag":285,"props":1419,"children":1420},{},[1421],{"type":282,"value":1386},{"type":282,"value":1423}," anyway,\nso it ends up cleaning and registering uninitialised stack memory as the\ntemplate name. The two model paths test the result and take their fallback\nbranch.",{"type":277,"tag":641,"props":1425,"children":1427},{"id":1426},"ur-03-entry-name-derivation-writes-nothing-expected-behaviour",[1428],{"type":282,"value":845},{"type":277,"tag":278,"props":1430,"children":1431},{},[1432,1434,1439,1441,1446,1448,1452],{"type":282,"value":1433},"Write ",{"type":277,"tag":285,"props":1435,"children":1436},{},[1437],{"type":282,"value":1438},"path",{"type":282,"value":1440}," relative to ",{"type":277,"tag":285,"props":1442,"children":1443},{},[1444],{"type":282,"value":1445},"baseDir",{"type":282,"value":1447}," into ",{"type":277,"tag":285,"props":1449,"children":1450},{},[1451],{"type":282,"value":1386},{"type":282,"value":1453}," and return the number of\ncharacters written.",{"type":277,"tag":278,"props":1455,"children":1456},{},[1457,1459,1463,1465,1470,1471,1475,1477,1481],{"type":282,"value":1458},"In the template scans, ",{"type":277,"tag":285,"props":1460,"children":1461},{},[1462],{"type":282,"value":1445},{"type":282,"value":1464}," is ",{"type":277,"tag":285,"props":1466,"children":1467},{},[1468],{"type":282,"value":1469},"Templates\u002FSkills\u002F",{"type":282,"value":452},{"type":277,"tag":285,"props":1472,"children":1473},{},[1474],{"type":282,"value":1438},{"type":282,"value":1476}," is an entry\nname from ",{"type":277,"tag":285,"props":1478,"children":1479},{},[1480],{"type":282,"value":383},{"type":282,"value":476},{"type":277,"tag":641,"props":1483,"children":1485},{"id":1484},"ur-03-entry-name-derivation-writes-nothing-acceptance-criteria",[1486],{"type":282,"value":887},{"type":277,"tag":889,"props":1488,"children":1489},{},[1490,1514,1526],{"type":277,"tag":893,"props":1491,"children":1492},{},[1493,1495,1500,1501,1506,1508,1512],{"type":282,"value":1494},"With ",{"type":277,"tag":285,"props":1496,"children":1497},{},[1498],{"type":282,"value":1499},"baseDir = L\"Templates\u002FSkills\u002F\"",{"type":282,"value":452},{"type":277,"tag":285,"props":1502,"children":1503},{},[1504],{"type":282,"value":1505},"path = L\"Templates\u002FSkills\u002FMy.txt\"",{"type":282,"value":1507},",\n",{"type":277,"tag":285,"props":1509,"children":1510},{},[1511],{"type":282,"value":1386},{"type":282,"value":1513}," holds the relative name and the return value is non-zero.",{"type":277,"tag":893,"props":1515,"children":1516},{},[1517,1519,1524],{"type":282,"value":1518},"The function writes at most ",{"type":277,"tag":285,"props":1520,"children":1521},{},[1522],{"type":282,"value":1523},"dstChars",{"type":282,"value":1525}," characters.",{"type":277,"tag":893,"props":1527,"children":1528},{},[1529],{"type":282,"value":1530},"The two model paths keep their current behaviour when the derivation fails.",{"type":277,"tag":597,"props":1532,"children":1533},{},[],{"type":277,"tag":478,"props":1535,"children":1537},{"id":1536},"ur-04-file-deletion-stops-the-client",[1538],{"type":282,"value":1539},"UR-04 — file deletion stops the client",{"type":277,"tag":278,"props":1541,"children":1542},{},[1543,1548,1549,1554,1555,1560],{"type":277,"tag":610,"props":1544,"children":1545},{},[1546],{"type":282,"value":1547},"Function 552",{"type":282,"value":616},{"type":277,"tag":285,"props":1550,"children":1551},{},[1552],{"type":282,"value":1553},"(const wchar_t* path) -> int",{"type":282,"value":623},{"type":277,"tag":285,"props":1556,"children":1557},{},[1558],{"type":282,"value":1559},"Base\u002FOs\u002FEmscripten\u002FExe\u002FEmscriptenExeFile.cpp",{"type":282,"value":1561},", line 840.",{"type":277,"tag":278,"props":1563,"children":1564},{},[1565,1569],{"type":277,"tag":610,"props":1566,"children":1567},{},[1568],{"type":282,"value":637},{"type":282,"value":1570}," low effort, small blast radius — one live call path.",{"type":277,"tag":641,"props":1572,"children":1574},{"id":1573},"ur-04-file-deletion-stops-the-client-what-the-client-does-now",[1575],{"type":282,"value":646},{"type":277,"tag":278,"props":1577,"children":1578},{},[1579],{"type":282,"value":1580},"The complete function body is an assertion and a trap:",{"type":277,"tag":653,"props":1582,"children":1583},{"language":655,"class":656,"tabindex":657},[1584],{"type":277,"tag":285,"props":1585,"children":1586},{"class":661},[1587],{"type":282,"value":1588},"i32.const \"not implemented\"\ni32.const \"..\u002F..\u002F..\u002F..\u002FBase\u002FOs\u002FEmscripten\u002FExe\u002FEmscriptenExeFile.cpp\"\ni32.const 840\ncall \u003Cassert>\nunreachable",{"type":277,"tag":278,"props":1590,"children":1591},{},[1592,1594,1599],{"type":282,"value":1593},"The call path is ",{"type":277,"tag":285,"props":1595,"children":1596},{},[1597],{"type":282,"value":1598},"File::Delete",{"type":282,"value":1600}," → 730 → 678 → 552. The caller reads a non-zero\nresult as success and reports error 4 otherwise.",{"type":277,"tag":278,"props":1602,"children":1603},{},[1604],{"type":282,"value":1605},"A delete therefore stops the client. A rename stops it too, because a rename is\ntwo steps — write the new name, then delete the old one. When the write step\nfails first, the client reports a rename failure instead.",{"type":277,"tag":641,"props":1607,"children":1609},{"id":1608},"ur-04-file-deletion-stops-the-client-expected-behaviour",[1610],{"type":282,"value":845},{"type":277,"tag":278,"props":1612,"children":1613},{},[1614],{"type":282,"value":1615},"Delete the file. Return non-zero on success, zero on failure.",{"type":277,"tag":278,"props":1617,"children":1618},{},[1619,1620,1625,1626,1630],{"type":282,"value":868},{"type":277,"tag":285,"props":1621,"children":1622},{},[1623],{"type":282,"value":1624},"unlink",{"type":282,"value":1211},{"type":277,"tag":285,"props":1627,"children":1628},{},[1629],{"type":282,"value":464},{"type":282,"value":476},{"type":277,"tag":641,"props":1632,"children":1634},{"id":1633},"ur-04-file-deletion-stops-the-client-acceptance-criteria",[1635],{"type":282,"value":887},{"type":277,"tag":889,"props":1637,"children":1638},{},[1639,1644,1649,1654],{"type":277,"tag":893,"props":1640,"children":1641},{},[1642],{"type":282,"value":1643},"A delete of an existing template removes the file and returns non-zero.",{"type":277,"tag":893,"props":1645,"children":1646},{},[1647],{"type":282,"value":1648},"A delete of an absent file returns zero and does not stop the client.",{"type":277,"tag":893,"props":1650,"children":1651},{},[1652],{"type":282,"value":1653},"A rename of a template completes, and the old file is gone.",{"type":277,"tag":893,"props":1655,"children":1656},{},[1657,1659,1663],{"type":282,"value":1658},"No ",{"type":277,"tag":285,"props":1660,"children":1661},{},[1662],{"type":282,"value":296},{"type":282,"value":1664}," call remains on this path.",{"type":277,"tag":1666,"props":1667,"children":1669},"info",{"title":1668},"Ten more unimplemented bodies nearby",[1670,1689],{"type":277,"tag":278,"props":1671,"children":1672},{},[1673,1675,1680,1682,1687],{"type":282,"value":1674},"The same translation unit holds eight more ",{"type":277,"tag":285,"props":1676,"children":1677},{},[1678],{"type":282,"value":1679},"assert(\"not implemented\")",{"type":282,"value":1681}," bodies:\nfunctions 526, 527, 532, 533, 534, 535, 538, and 539, at lines 490, 601, 608,\nand 634. ",{"type":277,"tag":285,"props":1683,"children":1684},{},[1685],{"type":282,"value":1686},"Net\u002FDiagLib\u002FEmscripten\u002FEmscriptenDiagLib.cpp",{"type":282,"value":1688}," holds two more, at\nlines 23 and 28.",{"type":277,"tag":278,"props":1690,"children":1691},{},[1692],{"type":282,"value":1693},"None of them is reachable today — the eight are vtable slots with no live\ncaller, and the DiagLib pair sits behind a disabled flag. We list them in case\nthey're useful for planning.",{"type":277,"tag":597,"props":1695,"children":1696},{},[],{"type":277,"tag":478,"props":1698,"children":1700},{"id":1699},"how-to-reproduce",[1701],{"type":282,"value":1702},"How to reproduce",{"type":277,"tag":278,"props":1704,"children":1705},{},[1706],{"type":282,"value":1707},"These steps need a stock client. No host change is needed.",{"type":277,"tag":1709,"props":1710,"children":1712},"steps",{"mode":1711},"numbered",[1713,1719,1729,1735,1751,1756],{"type":277,"tag":641,"props":1714,"children":1716},{"id":1715},"how-to-reproduce-save-a-template",[1717],{"type":282,"value":1718},"Save a template",{"type":277,"tag":278,"props":1720,"children":1721},{},[1722,1724,1728],{"type":282,"value":1723},"Log in and open the skills panel. Save a build under any name. The save fails.\nThis is ",{"type":277,"tag":285,"props":1725,"children":1726},{},[1727],{"type":282,"value":354},{"type":282,"value":476},{"type":277,"tag":641,"props":1730,"children":1732},{"id":1731},"how-to-reproduce-open-the-template-list",[1733],{"type":282,"value":1734},"Open the template list",{"type":277,"tag":278,"props":1736,"children":1737},{},[1738,1740,1744,1746,1750],{"type":282,"value":1739},"Open \"Load from Skills Template\". The list is empty. This is ",{"type":277,"tag":285,"props":1741,"children":1742},{},[1743],{"type":282,"value":383},{"type":282,"value":1745}," and\n",{"type":277,"tag":285,"props":1747,"children":1748},{},[1749],{"type":282,"value":412},{"type":282,"value":476},{"type":277,"tag":641,"props":1752,"children":1754},{"id":1753},"how-to-reproduce-delete-a-template",[1755],{"type":282,"value":559},{"type":277,"tag":278,"props":1757,"children":1758},{},[1759,1761,1765,1766,1770,1772,1776],{"type":282,"value":1760},"This step needs a build in which ",{"type":277,"tag":285,"props":1762,"children":1763},{},[1764],{"type":282,"value":354},{"type":282,"value":452},{"type":277,"tag":285,"props":1767,"children":1768},{},[1769],{"type":282,"value":383},{"type":282,"value":1771}," work. Delete a listed\ntemplate. The client stops. This is ",{"type":277,"tag":285,"props":1773,"children":1774},{},[1775],{"type":282,"value":438},{"type":282,"value":476},{"type":277,"tag":478,"props":1778,"children":1780},{"id":1779},"our-workaround-today",[1781],{"type":282,"value":1782},"Our workaround today",{"type":277,"tag":278,"props":1784,"children":1785},{},[1786],{"type":282,"value":1787},"The host rewrites the module before starting the client: it appends five\nforwarder functions and repoints the stub call sites at them. Each forwarder\ncalls out to the host through a marker value on an existing syscall import,\nand the host does the actual file work in the Emscripten file system.",{"type":277,"tag":278,"props":1789,"children":1790},{},[1791,1793,1800],{"type":282,"value":1792},"That rewrite has to be re-certified for every new client build. Implementing\nthese four routines makes it unnecessary —\n",{"type":277,"tag":1794,"props":1795,"children":1797},"a",{"href":1796},"$docs\u002Fupstream\u002Freference\u002Four-workarounds",[1798],{"type":282,"value":1799},"our workarounds",{"type":282,"value":1801}," has the detail.",{"title":1803,"searchDepth":1804,"depth":1804,"links":1805},"",4,[1806,1808,1814,1819,1824,1829,1834],{"id":480,"depth":1807,"text":483},2,{"id":602,"depth":1807,"text":605,"children":1809},[1810,1812,1813],{"id":643,"depth":1811,"text":646},3,{"id":842,"depth":1811,"text":845},{"id":884,"depth":1811,"text":887},{"id":965,"depth":1807,"text":968,"children":1815},[1816,1817,1818],{"id":997,"depth":1811,"text":646},{"id":1175,"depth":1811,"text":845},{"id":1238,"depth":1811,"text":887},{"id":1326,"depth":1807,"text":1329,"children":1820},[1821,1822,1823],{"id":1357,"depth":1811,"text":646},{"id":1426,"depth":1811,"text":845},{"id":1484,"depth":1811,"text":887},{"id":1536,"depth":1807,"text":1539,"children":1825},[1826,1827,1828],{"id":1573,"depth":1811,"text":646},{"id":1608,"depth":1811,"text":845},{"id":1633,"depth":1811,"text":887},{"id":1699,"depth":1807,"text":1702,"children":1830},[1831,1832,1833],{"id":1715,"depth":1811,"text":1718},{"id":1731,"depth":1811,"text":1734},{"id":1753,"depth":1811,"text":559},{"id":1779,"depth":1807,"text":1782},"markdown","docs",{"source":1838,"path":1839,"stem":1840,"dir":1841,"extension":1842},"content","en\u002F1.docs\u002F3.upstream\u002F3.filesystem\u002F1.unimplemented-routines.md","en\u002F1.docs\u002F3.upstream\u002F3.filesystem\u002F1.unimplemented-routines","filesystem","md",{"$docs\u002Fupstream\u002Freference\u002Four-workarounds":199},{"requestedPath":116,"resolvedPath":1845,"alternates":1846},"\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",[1847,1849],{"locale":60,"path":1845,"source":1848},"variant",{"locale":8,"path":116,"source":1850,"resolvedLocale":60},"fallback",{"requested":1852,"resolved":1853,"usedFallback":63},{"locale":8},{"locale":60},{"previous":1855,"next":1855},null,{"left":1857,"top":1857,"width":1858,"height":1858,"rotate":1857,"vFlip":6,"hFlip":6,"body":1859},0,24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5\"\u002F>\u003C\u002Fg>",{"left":1857,"top":1857,"width":1858,"height":1858,"rotate":1857,"vFlip":6,"hFlip":6,"body":1861},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"\u002F>\u003Cpath d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\u002F>\u003C\u002Fg>",1794063740322]