Worker: w-meshfmt-a1; Task: meshfmt; Status: research/implement.
Read .agent-cache/WORKER.md. Bus: python "%USERPROFILE%/.claude/skills/agent-cache-orchestrator/scripts/acbus.py"
Parallel tasks: w-cmfmt-a1 (collision), w-entitypipe-a1 (placement), w-matpipe-a1 (surfaces), w-mapmanifest-a1 (streaming/manifest). You own geometry.
Objective
Make new 3D geometry writable. This is the single hardest remaining piece of "a real custom map", and the survey states it is tractable: a TNC map has no monolithic world blob—it consists of 955 model + 253 modelAsset + 249 modelstream entries placed into the world. Solve the mesh triple, and new shapes become possible.
Answer, with code and corpus evidence:
- The binary layout of
model, and howmodelAssetandmodelstreamrelate to it (which holds vertices, which holds LODs/streamed tails, which is a descriptor). - Can a NEW mesh be authored—a trivial one is enough, e.g., a box—such that the engine's own loader accepts it? Provide the writer.
- What else must exist for a mesh to be usable: a
md6Def/modelAssetdeclaration, amaterialbinding, bounds, LOD entries? Name the minimum set.
What is already solved - build on it, do not redo it
Today the whole container layer fell, and it is all independently re-verified:
wolfsdk/idclwrite.pywrites containers; round-trip on 3 retail archives is BYTE-IDENTICAL, 6/6 negative controls. You can put any payload into an archive and the engine will consider the archive sound.- entry
+0x50= MurmurHash64B(uncompressed payload, seed 0xDEADBEEF);+0x60, header+0x20/+0x08all derived.finalize()handles them. - So your problem is ONLY the payload bytes. Nothing about the archive is in your way any more.
re_probes/runtime_87400/module.binis a read-only capture of the RUNNING, SteamStub-unpacked executable (virtual RVA layout, file offset == RVA, sections in manifest.json,.pdatafor function bounds). Five formats fell to code-driven RE from it today; brute-force sweeps solved none. Go through the loader.
Sources / starting points
- The corpus is huge, which is your advantage: 955 models in
dlc_2/base/chunk_22.resourcesalone, plus every base chunk. Differential reading across many samples is cheap here. - Find the loader by its error strings in
.rdataand their xrefs, the wayre_probes/agent_reports/{idclhash,datahash,texdbkey,cfilekey2}.mddid—read at least one of those reports for the method before starting. re_probes/agent_reports/texdbkey.mdadditionally decoded the TNC.bimagemip table; the same report shows how a "header 0x32 bytes, then fixed-size records" layout was cracked. Meshes tend to look similar.- Part 1 knowledge, read-only:
docs/formats.md,docs/moddingflaeche-tno.md(md6Def is text, geometry in binary.md6mesh),wolfsdk/bim.py. TNC is id Tech 6; itsmd6Defentries (31 in chunk_22) are the descriptor side and are likely text—read some first, they may name the fields. - capstone 5.0.7 vendored: PYTHONPATH=re_probes/python_deps
- Game data READ ONLY:
/steamapps/common/Wolfenstein.II.The.New.Colossus
Ownership
tools/probe_meshfmt.py (new), re_probes/meshfmt/ (new dir),
re_probes/agent_reports/meshfmt.md (new).
wolfsdk/idcl.py, wolfsdk/idclwrite.py, wolfsdk/oodle.py,
tools/probe_*.py from other workers: READ-ONLY, import them.
Forbidden / do not touch
No game launch, no process attach, no writes under the Steam install or "%USERPROFILE%/Saved Games". Do not touch other workers' files or dirs (tools/probe_cmfmt.py, probe_entitypipe.py, probe_matpipe.py, probe_mapmanifest.py, and re_probes/{cmfmt,entitypipe,matpipe,mapmanifest,execcarrier,cfilekey,idclwriter,save_structure,map_alias_v3}/), docs/*, config.json. No pip install.
Hard constraints
Python 3.11, stdlib plus vendored capstone. Reuse wolfsdk/oodle.py for Kraken. Reproducible from the command line, no running game.
Acceptance criteria
- A parser that reads the mesh payload of a large sample and reports structure without guessing: state n/n over at least 300 real models across 3 archives, where "parsed" means every field consumed and the declared sizes land exactly on the payload end. Partial parses must be reported as partial.
- Round-trip: re-serialize a parsed retail mesh and reproduce the original bytes exactly, n/n on the same sample. This is the load-bearing control - a writer that cannot reproduce retail bytes cannot be trusted to author new ones.
- Negative controls: a flipped size field, a truncated tail and a wrong vertex count must each make the parser fail, not silently produce something.
- If you get that far: author a minimal new mesh (a box is fine) and place it in a container. Say plainly that it is untested at runtime.
Failure honesty
If the vertex data turns out to be in a compressed or GPU-specific encoding you cannot decode, say exactly where you stopped and what the obstacle is. A precise negative here redirects the whole program and is worth more than a hopeful half-parser. Report failed hypotheses with numbers.
Coordination / deliverable
Checkpoint at milestones (loader located; parser n/n; round-trip n/n). Publish a bus fact when the round-trip succeeds - w-cmfmt-a1 and w-entitypipe-a1 both need to know whether new geometry is on the table. Concise German report in re_probes/agent_reports/meshfmt.md. Finish the bus task.