Skip to content

Research Brief Cmfmt

LopeKinz edited this page Oct 1, 2026 · 2 revisions

Identity

Worker w-cmfmt-a1; task cmfmt; research/implement. Read .agent-cache/WORKER.md. Bus: python "%USERPROFILE%/.claude/skills/agent-cache-orchestrator/scripts/acbus.py" Parallel: w-meshfmt-a1 (geometry), w-entitypipe-a1 (placement), w-matpipe-a1 (surfaces), w-mapmanifest-a1 (streaming). You own collision.

Objective

Make collision writable. Geometry you can see but walk through is not a level. cm is the single largest asset group in a TNC map - 2795 entries in dlc_2/base/chunk_22.resources alone - so the corpus for differential reading is enormous and the format is almost certainly regular.

Answer with evidence:

  1. The binary layout of a cm payload: what primitives (brushes, hulls, triangle soup, BVH?), what index/BVH structure, what surface/material flags.
  2. Round-trip: can a retail cm be re-serialized byte-exactly?
  3. Can a NEW collision hull be authored - a box is enough - that the loader accepts, and what binds it to a model or to the world?

What is already solved - do not redo it

The container layer is finished and independently re-verified today: wolfsdk/idclwrite.py round-trips retail archives BYTE-IDENTICALLY (3/3, 6/6 negative controls) and finalize() recomputes every hash. Your problem is only the payload bytes. re_probes/runtime_87400/module.bin is a read-only capture of the RUNNING, SteamStub-unpacked executable (virtual RVA layout, file offset == RVA, sections in manifest.json, .pdata for function bounds). Five formats fell to code-driven RE from it today and zero fell to blind sweeps - find the loader, read the field offsets out of it.

Sources / starting points

  • 2795 samples in chunk_22, thousands more in the base chunks. Sort by size: the smallest cm payloads are the easiest to fully account for, and a format proven on the small ones then generalizes.
  • Loader via .rdata error strings and their xrefs - the method is written up in re_probes/agent_reports/{idclhash,datahash,texdbkey}.md; read one first.
  • Names matter: cm entries usually mirror a model name. Cross-reference the two lists; a cm that pairs with a model tells you what it must describe.
  • Havok is present in this engine (hknavmesh is a separate type) - do not assume cm is Havok, but check for its signatures before inventing a theory.
  • capstone 5.0.7 vendored: PYTHONPATH=re_probes/python_deps
  • Game data READ ONLY: /steamapps/common/Wolfenstein.II.The.New.Colossus

Ownership

tools/probe_cmfmt.py (new), re_probes/cmfmt/ (new dir), re_probes/agent_reports/cmfmt.md (new). wolfsdk/* and other workers' tools/probe_*.py: 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 (probe_meshfmt.py, probe_entitypipe.py, probe_matpipe.py, probe_mapmanifest.py, re_probes/{meshfmt,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. Reproducible from the command line, no running game.

Acceptance criteria

  • Parser: n/n over at least 500 real cm payloads across 3 archives, where "parsed" means every byte accounted for and declared counts landing exactly on the payload end. Report partials as partials, with the count.
  • Round-trip: re-serialize and reproduce retail bytes exactly, n/n on the same sample. This is the load-bearing control.
  • Negative controls: flipped count, truncated tail, wrong primitive stride - each must make the parser fail rather than silently accept.
  • If you get that far: author a minimal box hull and say plainly it is runtime-untested.

Failure honesty

If the structure is an opaque precomputed acceleration structure you cannot regenerate, say so with the offsets you established and stop. Knowing that collision must be reused from retail rather than authored is a load-bearing finding for the whole program, not a defeat.

Coordination / deliverable

Checkpoint at milestones. Publish a bus fact on the round-trip result - w-meshfmt-a1 needs to know whether authored geometry can be made solid. Concise German report in re_probes/agent_reports/cmfmt.md. Finish the bus task.

Clone this wiki locally