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:
- The binary layout of a
cmpayload: what primitives (brushes, hulls, triangle soup, BVH?), what index/BVH structure, what surface/material flags. - Round-trip: can a retail
cmbe re-serialized byte-exactly? - 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
cmpayloads are the easiest to fully account for, and a format proven on the small ones then generalizes. - Loader via
.rdataerror strings and their xrefs - the method is written up inre_probes/agent_reports/{idclhash,datahash,texdbkey}.md; read one first. - Names matter:
cmentries usually mirror amodelname. Cross-reference the two lists; acmthat pairs with a model tells you what it must describe. - Havok is present in this engine (
hknavmeshis a separate type) - do not assumecmis 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
cmpayloads 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.