Repository navigation
Known Contradictions
Raised on 2026-09-21 by reading all files in docs/, comparing the header comments of all modules in wolfsdk/ against the code and against files on disk. Resolved on 2026-09-21.
This document is now a resolution log, no longer an issue list. For each of the 20 points, it states what was changed—or why it remains open.
Why this matters: this project sells itself on the distinction between measured and assumed. A document that treats an assumption as a measurement damages exactly that property—even if the assumption turns out to be correct. Therefore, when resolving issues, "missing" has never been softened to "works"; where evidence was lacking, it now states "unverified."
| # | Topic | Status |
|---|---|---|
| W1 | Intro-Skip: locked but still set | fixed in text, code reported |
| W2 | README lists locked Cvars as functions | fixed |
| W3 | "2231 Cvars" for Part 2 is a candidate list | fixed in text, GUI reported |
| W4 | Patch mechanics: append vs. in-place | fixed |
| W5 | BIM-Encoder: six digits claim it fails | fixed, one remainder open |
| W6 | Slot size: csize + 15 vs. exact csize
|
fixed in text, code reported |
| W7 |
strings/*.lang: raw or deflate? |
fixed |
| W8 | IDCL: "unsolved" vs. read format | fixed |
| W9 | Virtual Textures: "not examined" | fixed |
| W10 |
sample: audio data or descriptor? |
fixed in text, tool reported |
| W11 | DevGUI: module promises a menu | only in code, reported |
| W12 | Raw write path: "missing" vs. present | fixed |
| W13 |
cvars.py contradicts itself in its own header |
only in code, reported |
| W14 | Two references in cvars.py point to nothing |
mitigated in text, code reported |
| W15 |
wolfsdk browse does not exist |
only in code, reported |
| W16 | Megatexture: 34 GB vs. 41 GB | fixed, remeasured |
| W17 | Type counting: 80 vs. 84 text types | fixed |
| W18 | Decl counting: 60,233 vs. 25,559 | fixed |
| W19 | README describes only Part 1 | fixed |
| W20 | Backup content described incorrectly | fixed, one remainder open |
| W21 |
SpawnAI: an earlier draft misread the command table (added 2026-10-01) |
fixed |
| W22 |
cfile "proven not possible" → solved, narrower scope (added 2026-10-01) |
fixed in text |
| W23 | The loader read the older base copy of duplicated assets (added 2026-10-04) | fixed in code and text |
| W24 | Where the TNC developer menu fails (added 2026-10-04) | fixed in text |
| W25 | Key binds in The New Colossus run restricted (added 2026-10-04) | fixed in code and text |
| W26 | A new map name needs far less than claimed (added 2026-10-04) | fixed in text |
| W27 | TNC sounds and normal maps: from "no write path" to built (added 2026-10-04) | fixed in text |
17 fixed, 3 with remainder or exclusively in code (2026-09-21 batch); W21/W22 added 2026-10-01, W23–W27 added 2026-10-04, see below. At the end, exactly three questions remain open, and all three require something this session was not allowed to do: a game start with inspection (W1, W5) and a Steam file check (W20).
Not touched because it is out of hand: wolfsdk/ and tools/ code (multiple workers are working on them), docs/ghidra/, docs/moddingflaeche-tnc.md, docs/stand.md.
Fixed in text. The matter could be decided without a game start: the qconsole.log from the session of 2026-09-21 at 18:47 contains four lines under the command line
325: Resetting cheat cvar: pm_autoSprint
326: Resetting cheat cvar: g_goreBloodyMess
327: Resetting cheat cvar: com_allowConsole
328: Resetting cheat cvar: com_skipIntroVideo
The value arrives and is wiped again by the Cheat-Reset. Home.md no longer promises that the intro is skipped, but states that the argument is provided and the signs speak against it. Modding-Limits.md §1 has added a new section "Two different Nows" regarding this.
Open: whether the intro skips despite this. No log says so; someone must inspect. Later code reading (not measured in game): the intro flag is read at startup before the cheat reset runs, so +com_skipIntroVideo 1 very probably does work even though the reset log line appears. Whether the flag really skips the intro is not proven.
Reported in code: wolfsdk/cvars.py:184 sets com_skipIntroVideo via ALWAYS on every start, with the justification "Sitting through the logo reel on each start is nobody's idea of quality of life" — this is a performance claim that contradicts the lock list twelve lines above. Harmless (an additional argument), but the comment needs correction.
Fixed. The table in Home.md now lists only those items under Cheats/QoL that are not affected by the lock (Godmode, infinite ammo, damage factor, FOV, toggle sprint, HUD, FPS). Below it is a box explicitly listing Noclip, gravity, head-bob, intro-skip, console, and pm_* speeds as locked, with a reference to §1 of Modding-Limits.md.
The second half — where the console was listed as unverified in the list of open questions, despite Modding-Limits.md having a measured no — is also corrected: The item now stands under "measured answered," supported by both forms of evidence (Config rejection and Cheat reset). Superseded in part (code reading, not run in game): the console was never locked by com_allowConsole; it opens with Ctrl+^, and the plain ~ used in the earlier test does nothing. See Modding-Limits.md §2. The cvar com_allowConsole itself only feeds an achievement check.
Additionally found: The quick-start line showed launch --god --ammo --console --skip-intro --fov 105 --binds, advertising two locked Cvars. The line is shortened, and below it states what the two switches are still useful for.
Fixed in text. docs/cvars-tnc.md now begins with a box identifying the file as a candidate list (222 of 2231 real, Quote 10%; the Engine reports 304, of which 82 are not present in this list at all) and references TNC-CVar-Validation.md as a reliable source. The candidate list itself has since been replaced by the registry catalogue (TNC-CVar-Catalog, 3,256 registered cvars; for The New Order TNO-CVar-Catalog, 3,194), so the 10 % figure describes only the old scraped list. docs/audio.md §5 says the same at the point where it adopted the number.
Reported in code (four locations, all with the same phrasing "2231 mined cvar names" or "2231 Cvar names"):
-
wolfsdk/gui.py:5,:28— Module header andROW_LIMITcomment. -
wolfsdk/gui.py:471— Info text in the "System & Info" tab, visible to the user: "The New Colossus: 2231 Cvar names from the EXE". -
wolfsdk/cvars.py:241— "The New Colossus has 2231 mined names and no measurements at all".
The phrasing that fits everywhere: 2231 harvested candidates, of which 222 are real Cvars; the Engine knows 304.
Fixed. docs/formats.md §3 "Patching" described appending to the file end — exactly the procedure that Modding-Limits.md §4 describes as a measured crash (FileTable is out of order). The section is replaced: Slot mechanism, deflate_exact(), raw path at csize == usize, rebuild as fallback path, plus a box marking the old procedure as refuted and referencing Modding-Limits.md §4.
With the same change, the revert description there is corrected (three stages instead of "indices back and shorten"; a .resources is never shortened) — see W20.
Fixed at all six locations (Home.md, Modding-Limits.md twice, File-Formats.md §5, UI-Assets.md twice). The phrasing is identical everywhere and deliberately not "goes":
Reader, Decoder, and Encoder exist (
wolfsdk/image.py, extracted aswolfsdk image-export/image-import). The Encoder writes only Format code 3 (RGBA8) and requires the replaced image as a header template. There is no BC1/BC3 compressor; thus a replacement will be larger than the original and usually forces an archive rebuild.
formats.md:198 was doubly wrong ("a pixel decoder is missing") and is replaced by a table of four directions.
New evidence changing the rating: The mod wolfsdk.gore_texturen replaces four image assets with self-built BIMs. It was applied during the run of 21.09.2026, and the qconsole.log from this 48-minute session contains no error lines. The Engine accepts our BIMs.
One question remains open: whether a replaced image looks correct on screen. Someone needs to look into it. The test is cheap.
Fixed in text. Both Modding-Limits.md §4 and UI-Assets.md §3 now state that the budget is exactly csize. The up to 15 bytes of alignment padding between two payloads is not touched by the Patcher, because a shrinking csize shifts the addressing of all subsequent entries (No address, error: 487). Shorter streams are refilled to csize. Anyone calculating headroom calculates csize − own Deflate, as TNO-Modding-Surface.md §4.1 has always done.
Reported in code: wolfsdk/patch.py:12-13 — "A slot holds the entry's compressed bytes plus up to 15 bytes of alignment padding, which is usually enough headroom for an edited decl." This contradicts resources.write_in_place() and plan_in_place() in the same repository. Description only, no malfunction.
Fixed. TNO-Modding-Surface.md §4.3 placed .lang under the same Rebuild reservation as .entities. Incorrect: .lang is stored raw in 6 of 6 entries in the archive. The section now refers to the raw write path in resources.plan_in_place(), states the condition (exactly equal length), and explicitly says that a Rebuild here would be the worse option because it would switch the entry from raw to Deflate — which is not measured.
Fixed. Four places said "unsolved". The corrected formulation separates Container and Content:
-
docs/audio.md§6, §7, and the conclusion in §7: TheIDCLcontainer format is read (wolfsdk/idcl.py, Layout checked against all 24 Retail.resources); for the Audio level this changes nothing, because the content is Wwise Banks, which are not connected to the Extractor, and Part 2 anyway hasmods=False. -
docs/texdb.md§6: The prerequisite listed as missing there exists, but is not connected.
Fixed. Modding-Limits.md §7 and File-Formats.md §7 referred to the .pages format as "not investigated", while docs/virtualtextures.md contains a 26 kB format description with a self-test. Both places now refer to the Container as decrypted and verified, and the Pixel data as what is open (truncated JPEG-XR stream, TNO-Virtual-Textures.md §8). The derived Modding statement remains unchanged: Pixel swapping is not possible.
Fixed in text. Engine-Modding-Surface.md wrote "Raw Audio Data (Ogg Vorbis)", while Audio.md measured the opposite for all 61,318 entries. The line is corrected; File-Formats.md §6 is elevated from "Not further investigated" to the measured description (Descriptor, BE u32 20 bytes after the size triplet, 16384-byte grid, 0 deviations) along with the note that both streaming containers are not in the backup.
Reported in tool: tools/survey_engine.py:45 continues to generate the incorrect line. Engine-Modding-Surface.md is a tool output — as long as the line is not re-added there, a new run brings back the error. This now stands as a hint under the block.
Not resolvable on the documentation side; reported in code. The documents are correct at this point: UI-Assets.md §5 and docs/README.md list DevGUI as "not possible — Renderer not connected in Retail", with both measurements as proof. Only the code is incorrect:
-
wolfsdk/devmenu.py:18-19— "Appending another page therefore gives a real in-game UI with no injection and no executable patch — the engine renders it, we only supply data." Two measurements explicitly exclude this (Modding-Limits.md§2,UI-Assets.md§5). -
wolfsdk/cli.py:583— The commandingame-menucarries no caveat. A user creates a menu page with it that they never see. -
wolfsdk/cvars.py:170— presentsdevguias a usable command, "Debug GUI (Default F10)", without noting that F10 does nothing according to measurements. Later code reading (not measured in game): the stock bind isdevgui 1, a bare assignment to a cheat cvar, so it is refused;toggle devgui 0 1is not, and the DevGUI only stays on inside a level.debugmenu.txthas no consumer that could be found, so the loader's page is probably never read. SeeModding-Limits.md§2 and TNO-CVar-Catalog.
Fixed. The path exists:
if entry.stored_raw: # csize == usize
return (data, len(data)) if len(data) == entry.csize else NoneUI-Assets.md §3 and §6 have been updated — including the assessment table, where Level 1 is no longer "small — a raw write path in the Patcher" as an effort, but "none". The fact that it exists is not evidence that the engine accepts the result: mods/menue_marke is built length-true (868.273 Bytes like the original), but was never applied.
The question behind this remains expressly open and continues to be in UI-Assets.md §3: whether the engine forgives if a raw-deposited entry is switched to Deflate. The raw write path does not constitute it.
Not addressed: docs/stand.md:74-76 continues to lead the path as missing. The document is a handover protocol and belongs to another worker.
In code only; reported.
-
wolfsdk/cvars.py:14-15— "Nothing here has been confirmed in a running game yet." -
wolfsdk/cvars.py:26-30— "Measured, not guessed. A probe config was fed to the retail build and the engine's own log was read back."
Twelve lines apart, two incompatible statements. Modding-Limits.md §1 supports the second. It is presumably meant that the effect of the unlocked Cvars is unconfirmed, while the blocklist is measured. This is now supplemented by a third point: "unconfirmed" is no longer quite right either — the patched archives are measured (Modding-Limits.md §4), and four Cvars were observed in the log during the Cheat-Reset.
Mitigated in text, reported in code. docs/verifying-cvars.md (cvars.py:15) and tools/probe_retail_cvars.py (cvars.py:30) both do not exist. The actual damage was that it remained unclear by what the blocklist was measured.
Checked again: no tool in the repository generates it.
tools/probe_cvars.py, tools/probe_cheatvars.py, and
tools/probe_retail_lock.py all read only the EXE; none start the game. The list comes from a probe run driven by hand. This now stands as a box in Modding-Limits.md §1 — "measured once, but not traceable on button press" is the honest description.
In code only; reported. wolfsdk/browser.py:3 — "Opens as a tab in the loader UI (or standalone via wolfsdk browse)." wolfsdk/cli.py:519-601 registers 20 commands, browse is none of them. The browser is only accessible via wolfsdk gui. To remove is the bracketed addition.
Fixed, remeasured. Both numbers were wrong:
virtualtextures\ 39 files 35 627 349 878 B = 35.6 GB = 33.2 GiB
File-Formats.md §7, Modding-Limits.md §5 and TNO-Virtual-Textures.md §1 now uniformly name 39 files and 35.6 GB (33.2 GiB) with measurement date. The "~34 GB" were presumably a rounded GiB, the "41 GB" remains unexplained.
Resolved, both sides using the counting rule. Recounted from the table in Engine-Modding-Surface.md: 105 types = 80 TEXT + 5 mixed + 20 binary. The five mixed types are sound, particle, renderProg, cuttableResource, and file.
TNO-Modding-Surface.md cites 84/21 because tools/survey_modding_surface.py does not know a "mixed" class: is_text() decides based on type at one sample (over 95% printable characters in the first 4096 bytes). Four of the five mixed types end up on the text side, one on the binary — 80 + 4 = 84, 20 + 1 = 21.
Both documents now carry the rule within themselves. "Directly editable without side effects" are the 80.
Resolved, counting basis written for both numbers. 60.233 are index entries in text types, with multiple copies counted across several chunks. 25.887 are unique (type, name) pairs, of which 25.559 are valid UTF-8; the 328 outliers consist of 327 embedded binary files under file: and one renderProg. No measurement error, two counting bases.
Added to Home.md, File-Formats.md §4 (as a box), and TNO-Modding-Surface.md (header).
Resolved. Home.md now mentions Part 2 in the second paragraph, including the decisive restriction (mods=False: read and started, not patched) with a reference to docs/README.md, which cleanly separates the scope of both titles.
Resolved — and harmless. The observation was correct (all 14 .index and all 14 .resources, totaling 2.98 GB), but the conclusion was not. The journal explains it fully:
journal.json: rebuilt = 14 files, slots = 0, assets = 373
All 14 archives had to be rewritten, so _backup_resources() created a full copy for all 14. This is exactly the described procedure and not a puzzle. apply() also resets first before copying — thus the copies come from the reset state.
Home.md now describes the folder correctly, citing the range from a few tens of MB to around 3 GB and the journal key rebuilt. File-Formats.md §3 describes the reset in three stages and explicitly states that a .resources is never truncated.
Verification check, purely reading: All 14 backup .resources have exactly the original length from manifest.json (14 of 14, 0 deviations).
One remaining open question: verify_backup() checks the sha256 of the indexes, not the .resources — the manifest stores only size and timestamp for these. That the full copies are bit-exact is likely but unproven. A fresh Steam file check would be decisive. Until that is done, a small question mark remains after Audio.md and TNO-Modding-Surface.md, which derive their numbers from this folder; it is small because the lengths match and revert was sha256-identical over two cycles.
Four things that were not present in the initial survey:
-
The log refutes the read method of the blacklist. From the command line, the engine does not output "CANNOT be set in retail" — it accepts the assignment and wipes it on cheat reset. The warning is the response to a Config line. Anyone searching the command line for
CANNOT be setto check if a CVar passes through is looking at the wrong line. Newly documented inModding-Limits.md§1. A later code reading adds that this accept-then-wipe is the cheat reset, and thattoggle,cvarAddandsys.setcvarare not gated (code only). -
Patched archives loaded. This was posed as the most critical open question in
Home.md. The run on 21.09.2026 (Apply 18:47:35, Start 18:47:50, approximately 48 minutes until Chapter 12) rewrote all 14.resourcesfiles, patched 373 Assets, and included four self-built BIMs in the archive — andqconsole.logcontains 0 lines ofERROR, 0zlib inflate error, 0FileTable is out of order, and 0No address. This was added toModding-Limits.md§4,Home.md, anddocs/README.md. -
g_EnableGoresurvives the reset. It was on the same command line, it is in the blacklist — and does not appear under "Resetting cheat cvar", unlikeg_goreBloodyMessnext to it. Whether it therefore works, the log does not say. Noted as an unverified side finding inModding-Limits.md§1, not sold as a function. -
wolfsdk tweaksdo not mark locked Cvars. The GUI writes✕ in Retail lockedbehind the affected lines (wolfsdk/gui.py:326-327), butcmd_tweaksinwolfsdk/cli.pydoes not, and even announces console commands with "needcom_allowConsole 1", without stating that exactly this cannot be measured. Reported in code;Home.mdnotes the difference. Update:com_allowConsoledoes not open the console at all (Ctrl+^ does, code-only); the loader now also sends cheat cvars as+toggle name v v, which is code-proven but not yet run in game.
Unchanged compared to the first report, so no one pulls the same threads twice:
-
binary.cfg—Home.md,docs/ladepfade.md, anddocs/limits.md§2 agree on the same thing: it is executed, values are reset afterwards. (The current log confirms this incidentally withcouldn't exec …/binary.cfg— in this installation, the file does not exist at all.) -
Start only via Steam —
Home.mdanddocs/ladepfade.mdagree. -
Particles —
TNO-Modding-Surface.md§6.1,UI-Assets.md§3, andAudio.md§3 describe the same mechanism without contradiction. -
.texdbfile count — 24 inbase/against 27 in the entire game directory; the three DLC chunks explain the difference. - Virtual-Texture-Pixel — all documents agree: not replaceable.
-
Game saves —
Save-Games-and-Profiles.mdandResearch-Status-2026-09-21.mdmatch.
Two more points, surfaced by the runtime-proven console-unlock work and the second-pass Kiscule catalogue. Neither invalidates anything above; both are logged the same way the rest of this document is — stating plainly what was wrong and what fixed it.
Fixed — a data correction, not an in-game test result. An earlier pass of the Round-4 static command-table scan (Research-Report-R4-Console-Commands) misread SpawnAI <entity-def-path> as a registered, non-exposed command (flags 0x0, the same table-entry shape as killAI/killAllAI), and named it as the compiled-in "place a fighting enemy" command behind the DevGUI debug menu's SpawnAI ai/testing/test_elite button.
A later static re-check of the same registered-command table found this wrong: SpawnAI does not appear among the 234 registered commands, the same as give, spawn, noclip, and lowercase god — none of these five names are compiled into this retail build as callable commands, under any capitalization. This is a correction to a static table reading, re-counted from the same disassembly; no one has typed SpawnAI into a running game, and no such test is logged anywhere in this project. The corrected line now stands consistently in Research-Report-R4-Console-Commands, Research-Report-R5-Kiscule-Command, TNC Console Unlock, and TNC Modding Surface.
TNC-Modding-Surface.md §0/§6 (surveyed before the key derivation existed) rated cfile as "proven not possible (yet)", reading the type as a closed door onto strings/*.lang and the .cfg configs together. The key is now derived and round-trip proven (Research-Report-Cfilekey2), and the loader uses it in a running game — but only to replace small, unused configs for the console-unlock recipe, not to edit the localization files. TNC-Modding-Surface.md §6 has been updated in place with a correction box rather than rewriting the original (still largely accurate) analysis; Home.md's capability table now lists cfile and the console/Cvar restriction as separate, both works, measured rows. Not a contradiction between documents — a capability that moved from "proven not possible" to "possible, with a narrower scope than the original question asked about" between surveys, worth stating explicitly so no one re-reads the old verdict as still current.
Five points, resolved by the dev menu, custom map and WolfSDK 0.2.0 release work. Logged the same way as above: what was wrong, and what fixed it.
Fixed in code and text. tncpatch.Installation.read took the first hit when an asset exists more than once. The reasoning was that the choice is harmless, because the loader writes its result into every copy anyway. That is the flaw: writing every copy makes the copy that was read the base of all of them. chunk_* sorts before patch_*, so the first hit was the older base copy; of 1,680 base/patch collisions the patch copy is the newer one 1,635 times. A mod could therefore undo official patch changes in the assets it touched. Since WolfSDK 0.2.0 the loader reads the newest patch_N copy, the one the Studio already showed. Now in Patch Precedence sections 8–9 and Kiscule Scripting §8–9.
Fixed in text. Earlier pages put the failure in the wrong place:
-
TNC Custom Map Status called
mapanddevmap"unknown" and "removed". Both are registered; the console only does not expose them. -
Research-Report-R3-Swfui called the dev menu "a dead end for TNC", because
debugmenu.txtis absent. That file belongs to The New Order's route; The New Colossus has its own menu ofdevMenuOptiondecls. - The first dev menu analysis held that only a native handler could repair the menu.
What is true: map entries queue loadDevMenuOption, which retail never registers. Entries with command lines run them at level 0, and devmap from the menu loads the map, confirmed in game on 2026-10-02. Still not reproduced: Progression and give. Corrected inline in TNC Custom Map Status; new page TNC Dev Menu. The research reports stay as written.
Fixed in code and text. TNC Console Unlock §1 listed six places that raise the restriction level, and the loader gave The New Colossus default F1–F4 binds (toggle ..., noclip). A later full scan (report r8) found one more bracket: the key-bind dispatcher buffers a bound command into the restricted buffer at level 1. Those binds could not work. The loader no longer binds keys for The New Colossus; a key bound to resourceExec <cfile> -s does work, which Sandbox Tools and Photo Mode use. Now in TNC Console Unlock §1 (note) and §7.
Fixed in text. TNC Custom Map Status said a truly new map ID needs IDCL identity, save and menu registration, and possibly PVS and navmesh changes together. Confirmed in game on 2026-10-02: game/wolfsdk/modtest loads. It needs only the name in dlc/dlc_0/base/packagemapspec.json, a textures.cache link under the new name, and the map-level entries renamed in the container. Corrected inline and in new sections of TNC Custom Map Status.
Fixed in text. A capability change, as W22 was. Audio §0, §6 and §7 said TNC audio has no write path and no bank parser. Both exist now; the sound replacement is built (held back in 0.2.0 because Revert did not yet restore replaced sound packs; enabled since 0.3.0). TNC Texture Database §4b and §6 said tile chains block replacement and a longer block forces a full rewrite. Normal maps are now written as plain BC5 under codec 1 without decoding tile chains, and longer blocks are appended. Neither is confirmed in game. Correction notes in place, new sections at the end of both pages.
All files in docs/ (excluding the two JSON data files), Home.md, and the header comments of all modules in wolfsdk/ were read and compared against the code. To resolve issues, three purely reading measurements were added:
| Measurement | Source |
|---|---|
| Cheat Reset, Command Line, Error-free patched run |
%USERPROFILE%\Saved Games\MachineGames\Wolfenstein The New Order\base\qconsole.log, 4,858 lines, 21.09.2026 18:47 |
Backup content, rebuilt/slots, original lengths |
base_wolfsdk_backup\journal.json + manifest.json
|
| Megatexture size |
virtualtextures\*.pages, 39 files |
Not done: no game start, no write access under <Steam library>, no apply, no revert, no changes to code or tools. Where a contradiction exists in the code, it is reported above with file and line instead of being fixed.
Changed: Home.md, docs/README.md, docs/limits.md, docs/formats.md, docs/ui-assets.md, docs/audio.md, docs/engine-surface.md, docs/cvars-tnc.md, docs/texdb.md, docs/virtualtextures.md, docs/moddingflaeche-tno.md, and this file.
English Wiki generated from the measured research notes in docs/. Evidence grades and uncertainty are preserved intentionally.
- WolfSDK Loader · DE
- WolfSDK Studio · DE
- FAQ · DE
- Mod format · DE
- Modding Guide
- Modding Surface
- CVar Catalog
- CVar Validation (old scrape)
- Texture Database
- Developer Mode
- Dev Menu
- Custom-Map Status