<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Desync Postmortem]]></title><description><![CDATA[<p dir="auto">Let's start with the good news first: Due to relentless work by Nomander, supported through testing by JaggedAppliance, they managed to pinpoint the cause of the desync issues that plagued FAF recently. As I suspected, it was an engine patch, which brings me to the main topic I want to talk about: How do we deal with engine patches?</p>
<p dir="auto">We are in a peculiar position, because the people doing engine patches and opening Pull Requests for them are frustrated that getting them actually deployed in the game takes so long. On the other hand, these changes are extremely hard to review, because they look like this:<br />
´´´<br />
0x007A7858:<br />
jmp asm__ShouldAddUnit<br />
nop</p>
<p dir="auto">0x007EF12B:<br />
push esp<br />
mov ecx, esi<br />
call RenderRange__Moho__UserUnit__UserUnit<br />
nop</p>
<p dir="auto">0x005BF011:<br />
mov ecx, edi<br />
mov edx, eax<br />
call Hooked_SyncVisionRange<br />
jmp 0x005BF02C<br />
´´´<br />
Good luck checking the code for logical errors. And as we can see with the latest debacle, an engine patch can work on the surface. When you test it, it does what it is supposed to do, but it can bite us later when random desyncs pop up because the patch also can corrupt memory under special conditions.<br />
So for me as a team lead, merging in a barely tested engine patch feels like chugging an improvised bomb into my basement for storage. <em>Probably</em> nothing bad happens, but it definitely doesn't feel comfortable.</p>
<p dir="auto">Recently we got a lot more engine patches by new contributors, which is nice in principle, but it makes the problem even bigger, because with the old contributors I at least know that they have some experience. With the new guys it could be some AI-assisted reverse engineering which can be a good or a bad thing, but I can't tell at all how diligenty they worked on that.</p>
<p dir="auto">And the thing that annoys me the most is that I as a team lead am supposed to provide a good contribution environment, where people don't feel bogged down by bureaucracy and long approval processes. But if things go south, and nobody knows where the mysterious bugs that have appeared originated from, then I feel like all eyes go to the team lead to fix it. And frankly, I would rather stop storing IEDs in my basement than constantly rebuild the room. In this case, thankfully Nomander took the initiative, but he is also the Balance Team Lead since recently, so once again it is a team lead investing time cleaning up the mess other people made.</p>
<p dir="auto">I personally think that it is not a good look on FAForever as a whole, if the gaming experience is tainted by random desyncs and crashes. And I think we need to change something about how we apporach this whole engine patch topic. I realize that the position of "just stop it entirely" is too extreme, but just carring on is also unbearable. God, this whole thing makes me angry, not at anyone in particular, but at this whole situation. We can do better than this. We need to do better.</p>
<p dir="auto">I am looking forward to constructive suggestions.</p>
]]></description><link>https://forum.faforever.com/topic/10498/desync-postmortem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 27 Oct 2026 09:40:30 GMT</lastBuildDate><atom:link href="https://forum.faforever.com/topic/10498.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Oct 2026 09:49:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Desync Postmortem on Mon, 26 Oct 2026 21:07:40 GMT]]></title><description><![CDATA[<p dir="auto">I know Deribus said that the engine rebuild is not so relevant right now, but with the speed those things are now developing, and the speed at which we at FAF decide/execute things, isn't it more reasonable to expect that the engine rebuild will just straight up solve this issue?</p>
<p dir="auto">With a reconstructed source code, engine patches like these are no longer necessary, aren't they?</p>
]]></description><link>https://forum.faforever.com/post/75361</link><guid isPermaLink="true">https://forum.faforever.com/post/75361</guid><dc:creator><![CDATA[IndexLibrorum]]></dc:creator><pubDate>Mon, 26 Oct 2026 21:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Desync Postmortem on Mon, 26 Oct 2026 17:36:08 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/brutus5000" aria-label="Profile: Brutus5000">@<bdi>Brutus5000</bdi></a> <a href="/post/75355">said</a>:</p>
<p dir="auto">Can we build a CI-pipeline on old repos? <a class="plugin-mentions-user plugin-mentions-a" href="/user/draiget" aria-label="Profile: draiget">@<bdi>draiget</bdi></a> does this for the reverse engineering development somehow.</p>
</blockquote>
<p dir="auto">I need to finish implementation of headless faf (version for server-side networking without rendering) and it could be used on linux, but today it's just a replay checker that pickups Vault replays without desyncs and simulating game, any desync of valid replays means build has potential issue. This isn't for CI, or it would be very long CI pipeline run, checking 80+ replays will take few hours. I'm also checking every 50 beat checksums by storing log-file.</p>
]]></description><link>https://forum.faforever.com/post/75357</link><guid isPermaLink="true">https://forum.faforever.com/post/75357</guid><dc:creator><![CDATA[Draiget]]></dc:creator><pubDate>Mon, 26 Oct 2026 17:36:08 GMT</pubDate></item><item><title><![CDATA[Reply to Desync Postmortem on Mon, 26 Oct 2026 16:09:55 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/blackyps" aria-label="Profile: blackyps">@<bdi>blackyps</bdi></a> Would any of these desync issues appear in a replay out did it only happen in live games? Can we build a CI-pipeline on old repos? <a class="plugin-mentions-user plugin-mentions-a" href="/user/draiget" aria-label="Profile: draiget">@<bdi>draiget</bdi></a>  does this for the reverse engineering development somehow.</p>
<p dir="auto">We now have desync tracking in the lobby server, so this could be used as alarm tracking after patches. But that would basically require more releases / smaller changes per patch.</p>
]]></description><link>https://forum.faforever.com/post/75355</link><guid isPermaLink="true">https://forum.faforever.com/post/75355</guid><dc:creator><![CDATA[Brutus5000]]></dc:creator><pubDate>Mon, 26 Oct 2026 16:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Desync Postmortem on Mon, 26 Oct 2026 15:05:49 GMT]]></title><description><![CDATA[<p dir="auto">Rewrites and RE's ofcourse interesting and probably relevant soon.</p>
<p dir="auto">Until then:<br />
Some years ago we had a "forced" testing period for more significant changes (maybe it was ICE). For instance test thing X for 3 days, more activity on feedback gathering/analytics, then revert and digest results and decide from that. New releases are kinda that, but this would maybe emphasize more knowingly it is a test and data gathering for the decision making later on.</p>
<p dir="auto">Another avenue which has been used is the fafdevelop, if a binary patch could used that and more users pushed/incentivized to test that and report feedback, or again analytics in place.</p>
<p dir="auto">These could always be coordinated with promo team to try pushing people to test and report specific things we are on the lookout.</p>
]]></description><link>https://forum.faforever.com/post/75351</link><guid isPermaLink="true">https://forum.faforever.com/post/75351</guid><dc:creator><![CDATA[Giebmasse]]></dc:creator><pubDate>Mon, 26 Oct 2026 15:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to Desync Postmortem on Mon, 26 Oct 2026 14:45:22 GMT]]></title><description><![CDATA[<p dir="auto">I think engine rebuild and/or decompilation is a separate discussion.</p>
<p dir="auto">I agree it's unreasonable to expect bulletproof code reviews for binary patches. Best solution I can think of is tracking replays and see if there are upticks in desyncs after specific patches. Desyncs are visible from replay data and replays are publicly accessible.</p>
]]></description><link>https://forum.faforever.com/post/75350</link><guid isPermaLink="true">https://forum.faforever.com/post/75350</guid><dc:creator><![CDATA[Deribus]]></dc:creator><pubDate>Mon, 26 Oct 2026 14:45:22 GMT</pubDate></item><item><title><![CDATA[Reply to Desync Postmortem on Mon, 26 Oct 2026 11:58:24 GMT]]></title><description><![CDATA[<p dir="auto">Throw out the engine binary and build from the REed source released a day ago?^^<br />
<a href="https://forum.faforever.com/topic/10497/sc-fa-moho-engine-sources/9">https://forum.faforever.com/topic/10497/sc-fa-moho-engine-sources/9</a></p>
<p dir="auto">However, you probably still want to test changes to the RE engine in some form before releasing them to all players. In an ideal world you could even collect stats about crashes between different engine versions to get something similar to an A/B Test, no idea how hard that would be though.</p>
<p dir="auto">At the end of the day, people will flock to the REed version at some point because it will at some point become better than assembly-patched original (according to the author it already is but even if not its just a question of time). Im pretty sure FAF should hop onto that train as soon as possible, because the player base will get there one way or another.</p>
<p dir="auto">Edit:<br />
Of course the RE version should probably be tested with a few thousand more replays for near-perfect sim-compatibility.</p>
]]></description><link>https://forum.faforever.com/post/75340</link><guid isPermaLink="true">https://forum.faforever.com/post/75340</guid><dc:creator><![CDATA[Katharsas]]></dc:creator><pubDate>Mon, 26 Oct 2026 11:58:24 GMT</pubDate></item></channel></rss>