Rebuild of the xEdit project in Rust. Additionally features CLI control of all xEdit features and native support for AI agents to control it.
The build plan is in docs/PLAN.md.
Overall: 7 of 10 phases merged.
[##############......] 70% phases 0-6 of 0-9 merged into main
| Phase | Scope | Progress | State |
|---|---|---|---|
| 0 | Foundations | [##########] |
Merged |
| 1 | Read path for the first games | [##########] |
Merged |
| 2 | All games and saves | [##########] |
Merged |
| 3 | Write path and daemon | [##########] |
Merged (PR #12) |
| 4 | Analysis and tool modes | [##########] 10 of 10 steps |
Merged (PR #13) |
| 5 | Archives, assets and LOD | [##########] |
Merged (PR #14) |
| 6 | Scripting | [##########] 11 of 11 steps |
Merged (PR #20) |
| 7 | GUI | [..........] |
Not started |
| 8 | Performance | [..........] |
Not started |
| 9 | Release and cutover | [..........] |
Not started |
The overall bar counts merged phases only: 2 cells per phase out of 20. A phase on a draft pull request counts once it merges. Per-phase bars have 10 cells and show completed steps as a share of the phase's steps, as listed in docs/PLAN.md.
Keep this section current. Update it in the same pull request whenever a step lands, a phase starts or a phase merges: redraw the bars, change the step counts and the state column, and update the overall percentage.
- Port xEdit to Rust with 1:1 functionality*
- Morrowind and Enderal are loaded but not verified against the oracle yet (it can not dump or save Morrowind plugins, and Enderal is not installed); verified support comes later
- Match the upstream release build exactly
- The official binaries of the baseline tag (
xedit-4.1.5q) are the oracle; a differential harness compares the port's output with theirs on the real game files, and each phase closes only when its parity gate holds. Upstream quirks are reproduced, not corrected.
- The official binaries of the baseline tag (
- Keep existing scripts, plugins and workflows working. Compatibility with xEdit behaviour, its Pascal scripts and the files it writes wins over every other concern.
- Be easier to contribute to than the Delphi original: a modern toolchain (
cargo build,cargo test, clippy, one command for the parity check), no proprietary compiler, typed interfaces instead of 103 COM-style interfaces in one 50,000-line unit, and a module per upstream unit so the Pascal source stays a readable map of the Rust. - Expose every operation through the
xeditCLI as a typed command with--jsonoutput, stable error codes and a printable schema (xedit schema), so that an AI agent can discover and drive the whole tool without the GUI.- Make mutation safe for agents: an explicit edit flag,
--dry-run, structured outcomes, atomic saves with a backup, and a long-lived session (xedit batch,xedit serve,xedit mcp) that runs the same commands.
- Make mutation safe for agents: an explicit edit flag,
- Stay mergeable with upstream. One Rust module per Pascal unit with matching names, and
upstream-map.tomlrecords the last upstream commit merged into each, so upstream changes map onto the port line by line. - Get faster than upstream once parity holds
- No new file formats, record definitions or game support beyond what the baseline tag ships. New upstream releases are taken in through the sync procedure, not ahead of it.
- No redesign of the data model, the scripting language or the GUI. JvInterpreter Pascal stays the script language; the GUI reproduces the upstream forms on top of the same commands.
- No separate agent API. Agents use the same command layer as the CLI and the GUI; there is no second surface to keep in step.
- No dependence on a Delphi compiler. The oracle is the released binary, never a rebuild.
- No non-Windows platform before the Windows port is complete. Linux and macOS follow, behind thin platform modules.
- No game files in the repository. The parity corpus comes from local installs through environment variables.
- Phases 0 to 2 of the plan are done: every game mode from Morrowind to Starfield and every save format load and dump like the release build, verified file by file against it on the local game installs (Morrowind's masters and Enderal are not verified: the oracle cannot dump Morrowind plugins and Enderal is not installed on the development machine).
- Phase 3 (write path and daemon) is done (merged in PR #12). A loaded plugin can be edited, saved and served to a long-running session, and the saved bytes are xEdit's.
cargo xtask parity oracle-savedrives the xEdit GUI release build headlessly to save every plugin of the corpus and compares the port's save with it: 239 of 249 plugins are byte-identical, 7 are refused with the same message by both, and the 3 Morrowind masters have no oracle save because the 4.1.5q GUI cannot save Morrowind plugins;cargo xtask parity roundtriploads and saves the corpus and agrees.cargo xtask parity oracle-editreplays scripted edit sequences on both: the 4 of phase 3 give the oracle's bytes since phase 4 (the master update of a plugin with unchanged sorted arrays differed at the end of phase 3). - The write commands are
xedit elements set|add|remove(any element by path, a member, an array entry or a child record such as a reference of a cell),xedit records copy|delete(as an override or a new record, deep, with the masters it needs added),xedit masters add|sort|clean(with every FormID of the plugin rewritten to follow them),xedit formids change|renumber(updating the records that refer to the changed FormIDs),xedit files flags(ESM, ESL, medium, update, blueprint, localized) andxedit save. Every mutating command takes--dry-run, refuses to run without the global--editflag otherwise, and changes memory only untilxedit save. The AfterSet and AfterLoad callbacks of the definitions run, as in xEdit. xedit batchruns several commands in one session, so an edit and its save go together.xedit servekeeps a session loaded and answers every registry command as a JSON-RPC method over stdio or a Windows named pipe, andxedit mcpserves the same commands as MCP tools over stdio; both are built from the registry at run time, keep the--editgate anddry_run, and leave saving to an explicitfiles.save. The skillsusing-xedit-cliandadding-a-commandunder.claude/skillsdescribe how to drive the tool safely and how to add a command.- Loading reads the groups of a plugin on all CPUs and
xedit dumpbuilds and writes the records on all CPUs (--threads N; about five times faster onSkyrim.esmthan on one thread), with output that does not depend on the thread count. - Known gaps of the write path, all listed in docs/PLAN.md under "Owed from phase 3": copying over an existing override and partial forms, the order of the responses of a topic after a master update in the games that sort them by their
PNAM, the identity FormID of a Morrowind record, and one session per process. - Phase 4 (analysis and tool modes) is done (merged in PR #13). Conflict detection is done:
xedit conflictsgives the conflict status of every record of the loaded plugins as xEdit colours it (master, override, identical to master, conflict winner and loser, critical conflicts of injected records, game settings compared by editor ID), with per-file counts and filters, andxedit compareshows the records of a FormID side by side, row by row, as the view tab does.cargo xtask parity conflictshas the xEdit GUI classify every record of the vanilla plugins of each game and compares: 23.4 million records of 10 games equal (Morrowind has no oracle: the GUI runs it in view mode only). The comparison runs on all CPUs with the same output for every thread count. A session now reads plugins with the editor's settings (simple records, hidden unused fields, the contained-in elements, the sorted responses of a topic), as xEdit does;xedit dumpkeeps xDump's. The reference index is done:xedit refs getlists the records that refer to a record (xEdit's "Referenced By" tab) and the records it refers to,xedit refs buildbuilds the index of the loaded files on all CPUs or loads it from xEdit's reference cache files, which the CLI reads and writes in xEdit's format, and edits keep it right;formids change|renumberuse it.cargo xtask parity refshas the xEdit GUI build the index of the vanilla plugins of each game and compares every referenced-by list and every cache file: 33.2 million entries of 5.8 million records of 9 games equal, built and loaded from the cache, with every cache file of those games equal after decompression; Starfield differs in 18 entries, from perk activities whose JSON the port does not read yet. - Error checks are done (phase 4 step 3):
xedit checkis xEdit's "Check for Errors" (mniNavCheckForErrorsClick, the registry'sfiles.check): it loads the plugins with that mode's settings and checks the records on all CPUs, printing what xEdit's message log prints (the record, theelement -> errorof every error,Above errors were found in:after the elements of a container with errors), and--jsongives the records and their errors;xedit dump --checkis xDump's-check.cargo xtask parity checkruns the xEdit GUI's own check mode on the vanilla plugins of every game and compares the log lines, the counts and the exit code: 245 of the 249 plugins equal (1equal-log-loss, a Fallout 76 file whose oracle log lost lines under load, with every line it kept and the counts equal; 3oracle-unsupported, the Morrowind masters, which the GUI runs in view mode only; 0different), andcargo xtask parity check-dumpcompares xDump's-checkwithxedit dump --checkover the same corpus, the files whose dump the oracle crashes on compared as prefixes. - Plugin cleaning is done (phase 4 step 5):
xedit clean --quickis xEdit's quick auto clean mode (undelete and disable the deleted references, remove the records identical to their master, save, repeat), loading the plugins with that mode's settings as xEdit does, and--itm,--udrand--dry-runrun the steps alone or count them;xedit records cleanup-injectedis "Cleanup injected records".cargo xtask parity cleanruns xEdit's own quick auto clean mode headlessly on every corpus plugin that has masters and compares the saved bytes, the counts and the cleaned records with the port's (results in docs/PLAN.md). - Mod groups are done (phase 4 step 6):
xedit modgroups list|show|select|create|edit|delete|update-crcsreads and writes xEdit's.modgroupsfiles and its saved selection as xEdit does, andxedit conflicts --modgroups NAME,--all-modgroupsor--saved-modgroupsleaves the records the active groups hide out of the comparison (ctHiddenByModGroup).cargo xtask parity modgroupshas the xEdit GUI activate, edit, delete and update mod groups from its menus, answering its dialogs headlessly, and compares the conflict status of every record, the files it writes and its validation messages: 9 of 9 scenarios on Skyrim SE and Fallout 4 equal. - Localization is done (phase 4 step 7): a localized string of a localized plugin can be set and copied (the text goes into the plugin's string tables, a new string takes the next free ID),
xedit savewrites the changed.STRINGS,.DLSTRINGSand.ILSTRINGStables next to the plugin as xEdit writes them,xedit localization localize|delocalizeis xEdit's "Localize plugin" (with its translation from other tables) and "Delocalize plugin", andxedit localization files|strings|get|set|export|languages|languageare the localization editor and the Language menu;--languagepicks the tables' language and--translateloads in xEdit's translate mode.cargo xtask parity oracle-editgives the xEdit GUI the game's string tables, has it save its own tables and compares them: the edits, localizations and delocalizations of Skyrim SE, Fallout 4 and Starfield plugins give xEdit's bytes for 26 of 27 saved plugins and tables (results in docs/PLAN.md). - Merged patches are done (phase 4 step 8):
xedit patch merged <name> [--dry-run] [--no-save] [--output] [--no-backup]is xEdit's "Create Merged Patch" — the leveled lists, containers, faction relations, races, form lists (the ordered form lists whose editor ID ends inOrderedListtake appends only, and a faulty one is reported and left out), actor items, factions, effects, perks and keywords, and the keywords of the items and effects of the newer games, merged into one new plugin so that no plugin's changes are lost to the one that loads last;xedit files newis itsAddNewFile.cargo xtask parity mergedmakes the scenario's plugins with the port, has the xEdit GUI create its merged patch with the same files (clicking the menu items that activate mod groups and answering its dialogs headlessly) and compares the patches byte for byte: 12 of 12 scenarios on Fallout New Vegas, Skyrim SE, Fallout 4 and Oblivion equal, the faulty ordered list's message included (results in docs/PLAN.md). - The filter of the navigation tree is done (phase 4 step 4):
xedit filter applyruns every option of xEdit's filter dialog over the loaded plugins and reports what it keeps (the two passes, the nodes left and the records taken out of each file), either from the options in the request or from a[Filter <name>]preset of xEdit's settings file, whichxedit filter presets|save|deletemanage;xedit filter removetakes the filter off, andxedit refs build-reachableis "Build Reachable Info", which the not-reachable option reads. The view filter of the view tab is the--view-filter-name|valueoptions (with--keep-children,--keep-siblings,--keep-parents-siblings) ofxedit compare, and the referenced-by filter is the--filter-name|signature|fileoptions ofxedit refs get.cargo xtask parity filterhas the xEdit GUI apply filters from its script API and compares the counts it logs (results in docs/PLAN.md). - Tool modes are done (phase 4 step 9):
xedit tool modeslists the seventeen modes ofxeInit.paswith the switch of each, andxedit tool run <mode>runs one over the loaded plugins —setesm,clearesm,masterupdate,masterrestore,onamupdate,sortandcleanmasters,generateseq(the.seqfiles of the start-game-enabled quests a plugin adds),checkforerrors,checkforitm,checkfordr(which count and exit with the count, at most 127, as xEdit does) andexport(xDump's-export RAW: the profile of the game's record definitions, written as a file and printed as the structure of the definitions). Each mode loads with the settingsxeInit.pasgives it (the internal edits, the reference information, the translate mode, the ONAM filter and the rest). The command line of xEdit itself is read too:parse_legacy(the port ofwbCommandLine'swbFindCmdLineParamand ofDetectAppMode) accepts the switches a mod manager passes —-quickautoclean -qac -quickclean -checkforitm -checkfordr -CheckForErrors -translate -setesm -clearesm -masterupdate -masterrestore -onamupdate -sortandcleanmasters -generateseq -export -lodgen -script -D: -P: -l: -autoexit -autoload -IKnowWhatImDoingand the rest, including the executable names (SSEEditQuickAutoClean.exe) and the game switches (-SSE).cargo xtask parity tool-modeshas the xEdit GUI run each mode it has on the corpus plugins and compares the saved bytes, the message log lines and the exit codes (results in docs/PLAN.md);-CheckForErrorsisparity check,-dumpisparity dumpand-quickautocleanisparity clean. - The phase-4 agent workflow skills are under
.claude/skills:auditing-conflicts(which override of a FormID wins and what the conflict statuses mean, narrowing the list to the records a plugin wins or loses, the side-by-side compare of a record, the mod groups that hide records and the reference index that shows what a record is used by),cleaning-plugins(the ITM and UDR steps, the quick auto clean mode and the injection cleanup, with what the oracle check showed) andbuilding-patches(xEdit's merged patch and purpose-built override patches made fromfiles newandrecords copy). They are the native replacements for thexEdit-llmdaemon's comparison, cleaning and patch routes. - Phase 4 (analysis and tool modes) is done and its gate is met: the conflict status of the vanilla plugins of 10 games (23,383,514 records) equals the oracle, so does the reference index of 9 games (5,829,130 records with 33,228,829 entries, every cache file equal after decompression; Starfield is short by the 18 entries of the perk activities whose JSON the port does not read), the cleaning result of 231 of 238 corpus plugins (every pass's counts and every cleaned record line the oracle's; the 4 files that differ do so in the bytes of records the clean did not touch) and the error check output of 245 of 249 plugins (and, through xDump, 246 of 246 files). The phase's other oracle checks are in as well: the filter (37 of 37 and 8 of 8 configurations and the reachable-information scenario, results and what is owed in docs/PLAN.md under phase 4), 9 of 9 mod group scenarios, 12 of 12 merged-patch scenarios, the localization sequences (26 of 27 saved plugins and tables in the ten step-7 sequences, 31 of 32 saved files over all 15 since step 8, the one difference the known Starfield delocalize emulation limit) and 24 of 31 tool-mode cases (4
known-differencein the export, 3oracle-unsupported). What is still owed, with the numbers, is in docs/PLAN.md under phase 4. - Archives (phase 5 step 1):
xedit archive list|extract|packand thebsarchbinary read, unpack and write BSA (Morrowind, Oblivion, Fallout 3, New Vegas, Skyrim LE and SE) and general BA2 (Fallout 4, Fallout 76, Starfield) archives.bsarchtakes the arguments ofBSArch.exeand prints its text. Packing runs on all CPUs, and the archives are byte for byte the onesBSArch.exe -mt:nowrites, for every thread count:cargo xtask parity bsarchcompares the listings, the unpacked files and the packed archives of the game archives with the oracle. The texture archives (DX10, Fallout 4 and Starfield) pack and unpack too (phase 5 step 2): a DDS file is stored as chunks of mipmaps and written again with the header xEdit makes, byte for byte asBSArch.exedoes for the 125 texture archives of the corpus and for generated DDS folders, with the pixel conversion and the half-float array conversions on vector instructions where the machine has them (a scalar version gives the same bytes;XEDIT_SIMD=offforces it). - NIF meshes and materials (phase 5 step 3):
xedit assets dump|blocks|save|set|from-jsonread, dump, edit and write the NIF and KF files of every game from Morrowind to Fallout 4, Fallout 4 BGSM and BGEM materials, the LOD settings and tree LOD files, FUZ voice files and DDS headers, loose or inside an archive. A file loaded and saved gives xEdit's bytes, and the dump is the JSON of Sniff's converter or xEdit's text dump:cargo xtask parity nifcompares the port withSniff.exeand with the xEdit GUI's script adapter on every mesh and material of the game archives. Fallout 76 and Starfield meshes are refused with xEdit's own message, as the 4.1.5q release does; optimizing and stripifying a mesh is the Sniff operationOptimize mesh(step 6), theSpellOptimize,SpellStripifyandSpellTriangulatefunctions themselves having no command of their own. - Sniff (phase 5 steps 4 and 5):
xedit sniff list|runand thesniffbinary (which takes the arguments ofSniff.exe's automation mode) run 49 of Sniff's 50 batch operations on the meshes, animations and textures of a folder or an archive, on all CPUs: updating tangents and bounds, applying and adjusting transforms, the universal tweaker and fixer, the JSON converter, replacing asset paths, copying and merging geometry and shapes, painting vertex colours, copying and adding animation blocks (headtracking, facial, transform data, controlled blocks, skeleton bones), the Havok, shader flag and animation operations, optimizing and analysing meshes, and the reports (check for errors over meshes and textures, find textures, draw calls, UVs, transforms, Havok info).cargo xtask parity sniffcompares each operation's output files and log withSniff.exeon the game archives, the texture operations on the DDS files of the texture archives and of the unpacked samples of the others.Update MOPP codestays unported (it callsNifMopp.dll, a Havok library the port does not have) andProcCollapseLinksArraysis not registered in the 4.1.5q form. - LOD generation (phase 5 step 6):
xedit lodgenruns xEdit's LODGen mode on the loaded plugins, Oblivion's distant LOD (.lodand.cmp), the trees LOD (billboards,.lstlist,.bttand.dtlblocks, the atlas and its split) and the objects LOD of Skyrim and the Fallouts, with the form's options (--set, the settings file), a recoverable tree-rotation seed and the export filesLODGenx64.execonsumes.cargo xtask parity lodgencompares every output file, export file and log line with the GUI's LODGen mode: 20 of 20 cases equal (Fallout 4, Skyrim SE, New Vegas, Fallout 3 and Oblivion worldspaces, the atlas formats and sizes, trees LOD with billboards and with 3D trees, the splits of the atlases). - Phase 5 (archives, assets and LOD) is done and its gate is met: packed archives are byte-identical to
BSArch.exe -mt:no(cargo xtask parity bsarch: 1553 of 1553 checks equal, 0 different, over the archives of the 11 games and the synthetic folders), and the Sniff and LODGen outputs equal the oracle (cargo xtask parity nif: 542505 files equal, 0 different;cargo xtask parity sniff: every case run on the full corpus equal, the per-case numbers and the cases still owed in docs/PLAN.md;cargo xtask parity lodgen: 20 of 20 cases equal). The skillshandling-archivesandnif-batch-operationsunder.claude/skillsdescribe the asset commands. - Phase 6 (scripting) has started (draft pull request #20, branch
phase-6-scripting): the CLI isxedit script list|check|run(the registry'sscript.list,script.checkandscript.run, the last mutating with the--editgate,--dry-run,--no-saveand--scripts), and thetmScripttool mode and the legacy-script:switch run the same path. The interpreter (crates/xedit-script) is theJvInterpreterParser.pastokenizer and theJvInterpreter.pasfront end as an AST builder (step 2), theVariantvalue model, the registration model ofTJvInterpreterAdapterwith the sorted identifier dispatch and thefor/case64-bit dialect quirk (step 3), and the host ofxejviScriptHost.pas(theusesnamespace stripping, the unit sources of the scripts folder with the compiled-in stubs,FunctionExists,FunctionIsEmptyandCallFunction, step 4).xedit script checkcompiles asTJvInterpreterUnit.Compiledoes: a routine body is only scanned for its balancedend, so a statement-level error surfaces when the script runs. It parses all 150.pasof the 4.1.5qEdit Scripts(150 of 150, 0 fail). The corpus and its classification (150 scripts, 32 form, 11 dialogs, 110 headless,xEditAPI.pasthe declaration-only API the scriptsuses) arecrates/xtask/oracle/scripts/corpus.json; the run cases arecrates/xtask/oracle/scripts/runs.json. - The run loop of
xeMainForm.pas'sDoRunScript/ApplyScript(step 4,crates/xedit-session/src/script.rs) runsInitialize,Processover the navigation-tree selection (every loaded file, each file's elements from the last back to the file node) through theScriptProcessElements,ScriptProcessSignaturesand filter hooks, thenFinalize, and saves the plugins the run changed as the GUI's close does. A missing orFunctionIsEmptyroutine is skipped, a non-zero result stops the run withScript terminated itself, Result=<n>, and a failure prints the interpreter'sException in unit <u> line <n>: [<class>] <message>andAborted: Applying script "<name>", exits non-zero and still saves what the script changed before the failure. The message log is the output (stdout with the[mm:ss]prefixes of xEdit's log,messagesin the--jsonresponse), and aMode: Silentscript logs the closing line alone. The session-side script API ofxejviScriptAdapterHost.pas(the message log, the loaded files, the paths,ApplyFilter) is bound on top. - The script API landed step by step and is bound from the host down (steps 5 to 9): the five element-level units (
crates/xedit-session/src/script_units/: element, record, file, container and resource, 203 of their 207 ledger entriescovered), the data format unit (script_df.rs, 173 of 174, theTdfDef/TdfElementclasses over the phase-5 NIF, material, LOD, FUZ and DDS code), the misc family (script_misc*.rs,script_strings.rs,script_adapter.rs:TStringList/TEncoding, the StrUtils/SysUtils/Math/Variants helpers,TPerlRegEx,JsonDataObjects), the JVCL RTL (script_rtl/:System,SysUtils'sIntToStr/Format/Pos,Math, theClassesunit'sTStringList/TList/TStreamfamily andJvInterpreterFm's four registrations; all 548 live ledger entries of the five units bound) and the VCL surface (script_vcl/: the ten VCL-backed JVCL units andxejviScriptAdapterMiscVcl.pas, whose generated tables carry the class hierarchy and the 782 constants captured from the 4.1.5q oracle). The fixup pass ofp6-step5breconciledFullPathwith upstream, dispatched the indexedTStringsproperty and acceptedSetESL.pas's multi-statementonhandler; theRecord Header/ElementCountand single-precision findings were refuted against the oracle's own script output.cargo xtask checkcounts the phase at 3,663 script entries, 30 pending (29 functions ofxejviScriptAdapterHost.pas-- the file selection, settings, record lookup, conflict, form handle and LOD/atlas helpers -- and oneJvInterpreterentry), so a script that calls one aborts withUndeclared Identifier '<name>'. Headless, a form, dialog or control call refuses through theVclseam with[EVclUnavailable] <class>.<member> is not available without a GUI (script "<name>"), the seam the GUI phase fills, with the 1,210 window-bound membersexcludedin the ledger; theWindowsrecords, theControlshint, cursor and accel helpers, theMenusshortcut codec and theIniFiles/IOUtilsclasses answer; the corpus scripts that stop on such a call are the onescargo xtask parity scriptclassesform/interactive. - The phase gate harness is
cargo xtask parity script(step 10,crates/xtask/src/parity/script.rs), which drives the oracle GUI hidden. Parse, over all 150.pas: 150 of 150 equal (149equaland 1known-difference, exit 0; the oracle's 4.1.5q compiler faults on the declaration-onlyxEditAPI.pas, whichparse.jsonaccepts with its reason). Run, over the 117 form-free cases ofruns.json: 107 of the 117 cases in the first full comparison (12m03s at--jobs 3; the seven slowest skipped with--skipand 2 Fallout New Vegas cases skipped for an emptied data folder), 0equal, 78differentand 29oracle-interactive, the differences being names the host had not registered yet, the filter scripts' log lines and the abort text's shape. With steps 5 to 9 in,Bookmark1.pasandBookmark2.pasareequal(2 of 2: theBookmark.inibytes and aMode: Silentscript's whole log is the closing line), the phase's firstequalrun cases. The run-parity fixups (branchp6-rp-fix, 2026-10-10) then fixed the walk's over-delivery -- the port now reports the oracle'sProcessed Records: 869712for the all-records scripts overSkyrim.esm(single-case runs at the fixup tip), the script-visible short names (EditorID "Full Name" [SIG:FormID]), the abort line's shape (Exception in unit line -1: ...for interpreter errors) and theRemoveNode/ zero-argument registrations; the fresh full comparison at this tip was stopped by the system (low memory) before it produced case counts, so its class counts are owed, with the regression tests and the single-case runs as the evidence. The second run-parity fixup (branchp6-rp2, 2026-10-10) fixed the filter'sStart:/Done: Applying Filterlog lines (the filter scripts compare equal), the executable pseudo-file's[00] <exe>.exename and its game-master entry, the OS-error texts (Delphi's shape, without Rust's(os error N)), the interpreter'sInc/Decby-reference write-back, theTwbFastStringList.Createobject model andTDirectory's missing-folder raise; it wired the run's private folders into the harness recipe (the port's run folder asScriptsPath(), the plugins as privateDatacopies whose folder the port's data path follows,--program-path,--allow-edit-game-master,--build-refs), made the port save the changed plugins in the GUI's shapes (Saving: <name>.save.<timestamp>,Queued renaming of save ... on shutdown.,Done saving.), mapped each side's run folder to<root>and the save clock to<time>in the comparison, and added theequal-log-lossclass for the oracle memo's lost lines. Verification at this tip: the 14-case targeted rerun 11 of 14 equal, the other three traced (two fixed and probe-verified at the binary, one for the loss class), the parity mode's unit tests 7/7, clippy and the release build green; the fresh full comparison at this tip and thecargo fmt --all --check/cargo test --workspace/cargo xtask checkgates were started and stopped by the system (low memory) before producing results, so its class counts are owed, with the regression tests and the single-case runs as the evidence. The gates it was waiting on are green (fmt, clippy, 669 workspace tests,cargo xtask check), and the last complete full comparison (tipa1c2f22, 2026-10-11, canonical cache) gives 64 of the 117 casesequal, 20different, 31oracle-interactiveand 3oracle-failed(oracle timeouts); the third fixup round (p6-rp3) then fixed and witnessedDDS - Find textures,Remove invalid entries from from lists,List perk entry points usageandList used meshes from referencestoequalandList used meshestoequal-log-loss, and the systemic<Warning: Unused data in: ...>load lines now emit identically. The fresh re-classification at the merged tip was started and stopped by the system (low memory) and is owed, together with the phase's other owed items in docs/PLAN.md. - The phase's skill is
writing-xedit-scriptsunder.claude/skills(choosing a script overxedit batch, running one, the API ofxEditAPI.pasand the coverage ledger as the source of truth, the dialect, the headless limits, the output and log conventions, the divergences), andusing-xedit-cligained thexedit script run|list|checksurface. - Later phases (GUI, performance, release) have not started; phases 0 to 5 are done, merged and their gates met.
xEdit-rust is a port of xEdit by ElminsterAU and the xEdit contributors. xEdit is licensed under the Mozilla Public License 2.0, and ported files are Modifications that must stay under it, so this whole repository is licensed under MPL-2.0. See NOTICE for attribution and third-party terms.
Rules for contributions: