[{"id":"T2","fact":"`multi:true` did not return all crossings on complex collision here — step past each hit and re-trace instead","source":"live: repeated single-hit returns where a stepped profile found 5–7 surfaces","engine":"","ue":[],"bl":[],"section":"Trace behaviour"},{"id":"Md7e6b8","fact":"A port number is not the defence against collision: ue_engine_sweep.live_engine() asks whichever port it is about to use who it is - engine version and project name, read off self_audit - and refuses a mismatch before running anything. The first chosen base (8820 + minor) collided on its first check with an unrelated 5.7 editor on 8823.","source":"tools/ue_engine_sweep.py live_engine() at :355-379 (the self_audit request at :370, version+project return at :378-379); docs/17_PORTS.md § The 88xx range is NOT ours","engine":"","ue":[],"bl":[],"section":"MifBridge ports","value":"`live_engine(port) -> POST http://127.0.0.1:<port>/api/self_audit, returns (\"<major>.<minor>\", projectName)`"},{"id":"Mdc3b58","fact":"For real frame attribution use trace_start / trace_stop, which writes a .utrace to Saved/MifBridge/Traces on the cpu,frame,bookmark,stats channels for UnrealInsights.exe. trace_stop reports the file SIZE because a zero-byte trace means the channels captured nothing and otherwise looks identical to success; stopping when nothing was started answers stopped:false rather than failing, so the call stays idempotent.","source":"docs/16_DASHBOARD.md § PERFORMANCE (:159-168). Verified at source: the default channel string appears verbatim in MifBridgeTrace.cpp:52 and MifBridgeDescribe.cpp:2312, and the destination is fixed under Saved/MifBridge/Traces deliberately - MifBridgeDescribe.cpp:993 says a caller-supplied path 'is a way to write outsid","engine":"","ue":[],"bl":[],"section":"MifBridge tracing","value":"`channels: cpu,frame,bookmark,stats`"},{"id":"Mc30b04","fact":"BodySetup.AggGeom.ConvexElems is CPF_EditFixedSize so the property system cannot grow it, but K-DOP generation does append an element - pad with add_simplified_collision shape=26dop to the target count, then overwrite each element. 197/197 hulls (29/29, 67/67, 101/101) read back identical to vanilla.","source":"Eddie_v2/docs/29_VILLA_WINDOW_UPGRADES.md:202-208","engine":"","ue":[],"bl":[],"section":"UE collision / MifBridge"},{"id":"U99","fact":"**Opening a clean project with MifBridge installed logs two `LoadErrors: Error` entries that a control project without it does not**, and they are caused by the plugin force-enabling GameFeatures and Water: *\"Asset Manager settings do not include an entry for assets of type GameFeatureData\"* and *\"Collision Profile settings do not include an entry for the Water Body Collision profile\"*. Making the dependencies REQUIRED cannot fix this - it guarantees the plugins are enabled, which is what triggers it. **Shipping the missing entries in the plugin's own `Config/BaseEngine.ini` does NOT work**: a plugin's config is merged for the files the engine looks for by name, and `BaseEngine.ini` placed there never reaches the collision-profile or asset-manager check.","source":"measured 2026-09-19 on stock UE 5.3 by counting the two strings in three headless runs of the same harness: **0** in a control project with no MifBridge, **3** with MifBridge installed, and **3** again with a `Config/BaseEngine.ini` shipped inside the plugin carrying `+Profiles=(Name=\"WaterBodyCollision\"...)` and `+PrimaryAssetTypesToScan=(PrimaryAssetType=\"GameFeatureData\"...)`. The only remaining fix is to stop linking those two plugins, which costs their endpoint families - the eleven optional-plugin handler files are 9,575 lines between them, so it is a product decision rather than a patch.","engine":"5.3","ue":["5.3"],"bl":[],"section":"UE materials, actor identity and PIE"},{"id":"U292","fact":"**`TraceTypeQuery1` is Visibility and `TraceTypeQuery2` is Camera; custom trace channels follow in ascending `ECC_GameTraceChannelN` order, because the engine SORTS DefaultChannelResponses by channel before it builds the mapping - the ini's line order does not decide it.** A custom channel becomes a trace type only when its setup has bTraceType.","source":"5.3 `CollisionProfile.cpp:360`, 5.3 `CollisionProfile.cpp:381`, 5.3 `CollisionProfile.cpp:437`, 5.4 `CollisionProfile.cpp:381`, 5.5 `CollisionProfile.cpp:381`, 5.6 `CollisionProfile.cpp:381`, 5.7 `CollisionProfile.cpp:381`, 5.8 `CollisionProfile.cpp:377`, 5.8 `CollisionProfile.cpp:398`, 5.8 `CollisionProfile.cpp:449`","engine":"5.3-5.8","ue":["5.3","5.4","5.5","5.6","5.7","5.8"],"bl":[],"section":"UE trace channels - which channel a TraceTypeQuery is"},{"id":"U305","fact":"**A trace channel added while the editor runs is traceable at once, no restart: `UCollisionProfile::PostEditChangeProperty` calls `LoadProfileConfig(false)`, which rebuilds the TraceTypeQuery mapping and the default responses, so a `set_property` on `/Script/Engine.Default__CollisionProfile` `DefaultChannelResponses` (it runs PostEditChangeProperty) makes a new channel usable in the same session, and a component created afterwards takes the channel's DefaultResponse.** Until it is saved to config (saveConfig) a restart drops it, and a trace node saved with its TraceTypeQuery then converts to whichever custom trace channel sorts first (U292), or to `ECC_MAX` - no channel - when there is none. Measured on 5.8.2 with a channel added in memory only (DefaultResponse ECR_Ignore): in PIE a Line Trace By Channel on its query found a mesh set to block it, focus held while that mesh ignored Visibility and dropped when it ignored the new channel, and a StaticMeshActor spawned after the add did not block it.","source":"5.3 `CollisionProfile.cpp:826`, 5.8 `CollisionProfile.cpp:838`, 5.3 `CollisionProfile.cpp:768`, 5.3 `CollisionProfile.cpp:782`, 5.8 `CollisionProfile.cpp:780`, 5.8 `CollisionProfile.cpp:794`; measured tools/test_gameplay_recipes_live.py G210, G213, G217","engine":"5.3-5.8 (source), 5.8 (measured)","ue":["5.3","5.4","5.5","5.6","5.7","5.8"],"bl":[],"section":"UE trace channels - which channel a TraceTypeQuery is"},{"id":"GR10","fact":"**`gameplay_recipe`'s health recipe works as built: 83 steps, the component, the radial-damage source and the damageable example compiling with no error, warning or note and linting clean; in PIE the engine's ApplyDamage reaches the component through its owner's OnTakeAnyDamage (30 takes 30, OnHealthChanged reporting 70), Heal stops at MaxHealth, radial damage from the source reaches the cube inside its radius and not the one outside, and lethal damage leaves 0 with OnDeath fired once - further damage and a Heal change nothing.**","source":"measured: tools/test_gameplay_recipes_live.py G310-G317, 166/166 on 5.8.2; tools/test_gameplay_recipes_offline.py 140/140","engine":"5.8","ue":["5.8"],"bl":[],"section":"Gameplay recipes - whole systems built from verified calls"},{"id":"U371","fact":"**UGameplayStatics::ApplyDamage is BlueprintAuthorityOnly: it runs only where the caller has network authority. A PIE world (the server) has it; an editor world does not, so call_function refuses it there without allowAuthorityOnly.**","source":"5.3 and 5.8 `Runtime/Engine/Classes/Kismet/GameplayStatics.h:504`; measured on 5.8.2: call_function refused ApplyDamage without allowAuthorityOnly, and with it 30 damage took 30 in PIE","engine":"5.3, 5.8","ue":["5.3","5.8"],"bl":[],"section":"UE damage - who may apply it, and how radial damage falls off"},{"id":"U372","fact":"**ApplyRadialDamage without bDoFullDamage falls off linearly: it calls ApplyRadialDamageWithFalloff with minimum damage 0, inner radius 0, outer radius the damage radius and falloff exponent 1, and GetDamageScale gives 0 at and beyond the outer radius.** Measured: 25 of 50 to a cube whose nearest face was 250 of a 500 radius away.","source":"5.3 `Runtime/Engine/Private/GameplayStatics.cpp:717`, 5.8 `:721`; 5.3 and 5.8 `Runtime/Engine/Private/Engine/DamageEvents.cpp:49`; measured: tools/test_gameplay_recipes_live.py G315 on 5.8.2","engine":"5.3, 5.8","ue":["5.3","5.8"],"bl":[],"section":"UE damage - who may apply it, and how radial damage falls off"},{"id":"U453","fact":"**An Unreal Insights trace neither starts nor stops at once, and a stop asked too early is refused: a start opens the file but only sets a PENDING connection, which the trace writer's worker thread takes up on its next update (it sleeps 17 ms between updates on 5.3 and 5.8); the writer's stop returns false while that connection is pending or when nothing is connected, and a stop it accepts is only a request the worker carries out on a later update - until then the trace is still connected, and a new start is refused with \"Unable to start trace, already tracing to ...\". A trace file whose name already exists is refused as well (\"Trace file ... already exists\"), so two traces named to the same second collide.** MifBridge's trace_stop ignored the false and answered stopped:true: on 5.8.2 a start and a stop in one batch answered stopped:true with sizeBytes 0 while the file grew to 41 MB and stayed locked, and the next trace_start was refused. afcbddfe retries the stop while the connection is pending, waits until the trace is no longer connected (2-5 attempts, 23-62 ms in the engine log), and names traces to the millisecond.","source":"read: 5.3 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:1173`, 5.4 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:1172`, 5.5 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:1215`, 5.6 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:1392`, 5.7 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:1441`, 5.8 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:1664`, 5.3 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:551`, 5.4 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:618`, 5.5 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:631`, 5.6 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:731`, 5.7 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:889`, 5.8 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:1064`, 5.8 `Engine/Source/Runtime/TraceLog/Public/Trace/Config.h:154`, 5.3 `Engine/Source/Runtime/TraceLog/Private/Trace/Writer.cpp:666`, 5.8 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:2051`, 5.3 `Engine/Source/Runtime/Core/Private/ProfilingDebugging/TraceAuxiliary.cpp:1420`; measured 2026-09-28 on 5.8.2 and 5.3.2 with tools/test_trace_stop.py TS100-TS199: 2 of 9 checks passed with the old trace_stop and 9 of 9 after, on each engine","engine":"5.3-5.8","ue":["5.3","5.4","5.5","5.6","5.7","5.8"],"bl":[],"section":"UE Insights tracing - how a trace starts and stops"},{"id":"U501","fact":"**UClothingAssetFactory::CreateFromSkeletalMesh (Create Clothing Data from Section) gives the new asset ONE weight map, MaxDistance, all 0 - every vertex fixed until one is painted above 0 - and takes only the spheres and sphyls of the physics asset it is handed.** Measured through create_clothing_asset on the tutorial mannequin's one section (5.3.2 and 5.8.2): 3924 render vertices became 3189 simulation vertices and 6118 triangles, and the physics asset gave 23 capsules. The 5.3.2 factory named the asset 'Coat_0' when asked for 'Coat'.","source":"5.3 `Editor/ClothingSystemEditor/Private/ClothingAssetFactory.cpp:450` and 5.8 `Editor/ClothingSystemEditor/Private/ClothingAssetFactory.cpp:461`; tools/test_ue_spec_extensions_g.py SX3601. Read and measured 2026-10-04","engine":"5.3-5.8","ue":["5.3","5.4","5.5","5.6","5.7","5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U512","fact":"**The Chaos Outfit Asset plugin ships with 5.6, 5.7 and 5.8, not 5.8 only: Experimental and off by default in 5.6 and 5.7 (Engine/Plugins/Experimental/ChaosOutfitAsset), Beta and still off by default in 5.8 (moved to Engine/Plugins/ChaosOutfitAsset); 5.5 has no ChaosOutfitAsset.uplugin.** An outfit route can be probed on 5.6+ once the plugin is enabled, and the plugin's path differs between 5.7 and 5.8. Measured 2026-10-04 by locating ChaosOutfitAsset.uplugin in each installed engine.","source":"5.6 `Engine/Plugins/Experimental/ChaosOutfitAsset/ChaosOutfitAsset.uplugin:16`, 5.7 `Engine/Plugins/Experimental/ChaosOutfitAsset/ChaosOutfitAsset.uplugin:16`, 5.8 `Engine/Plugins/ChaosOutfitAsset/ChaosOutfitAsset.uplugin:15`, 5.8 `Engine/Plugins/ChaosOutfitAsset/ChaosOutfitAsset.uplugin:13`","engine":"5.6-5.8","ue":["5.6","5.7","5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U558","fact":"**In UE 5.8 a Python `AssetToolsHelpers.get_asset_tools().import_asset_tasks()` of an FBX static mesh goes through Interchange (the asset's import data is InterchangeAssetImportData) and the result had no UCX_ collision hulls although the FBX carried three named `UCX_<Mesh>_NN`; a later legacy FBX reimport over that asset still left zero convex elements, while a fresh legacy FbxFactory import of the same file (combineMeshes, oneConvexHullPerUCX) made all three.** The FbxImportUI set on the task (scale, collision options) was not what governed the import either: Interchange brought the mesh in at the FBX's unit scale, the legacy factory 100x smaller without uniformScale 100. Import FBX meshes that carry UCX hulls as new assets through the legacy factory, and count convex elements after.","source":"measured 2026-10-16 on 5.8.3 in a project: ten Blender-exported static meshes (FBX_SCALE_UNITS) via import_asset_tasks -> 0 hulls each, import data InterchangeAssetImportData; reimport with FbxFactory over one -> 0; fresh FbxFactory import of the same FBX to a new path -> 3; all ten re-imported fresh -> 1 to 3 each, matching the file","engine":"5.8 (measured on 5.8.3 only; Interchange's FBX translator source not read)","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U565","fact":"**A world line trace with trace_complex = True tests a static mesh's RENDER triangles (with CTF_USE_DEFAULT), not its simple collision hulls, so it can pass straight through an open mesh (a grating deck) that a character stands on, the character moving against the simple hulls. Walkability probes must trace with trace_complex = False.**","source":"measured 2026-10-16 on 5.8.3: down-traces over a grating landing whose UCX deck hull spans its whole area (ElemBox read back: X 0-120, Y 480-930, Z 330-350) hit only at 4 of 14 sample points with trace_complex True; with False the area audit reached the floor beyond it (reached spots 32,896 -> 53,527)","engine":"5.8 (measured on 5.8.3 only)","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U572","fact":"**Collision hulls copied onto an existing StaticMesh in editor Python (assigning another mesh's `body_setup.agg_geom` to it) do not take part in traces until the package is reloaded (`EditorLoadingAndSavingUtils.reload_packages`). Before the reload a line trace through the copied hull missed it. After the reload the same trace hit the copied convex element. The usual reason to copy hulls this way: a NEW asset made by a Python AssetImportTask (Interchange, 5.8) arrives with no UCX collision, so hulls are taken from a temporary import made another way.**","source":"Live on UE 5.8.3, 2026-10-17: a door frame mesh given hulls from a temporary MifBridge import_asset copy; a simple-collision line trace through the jamb missed before the reload and hit the jamb's hull after it. Measured once on one mesh; the engine source path was not read.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U573","fact":"**A Python AssetImportTask reimport (replace_existing) over an EXISTING StaticMesh from an FBX with NO UCX_ hulls keeps the asset's existing simple collision: the count of convex plus box elements in body_setup.agg_geom was 1 before and 1 after.** This is the counterpart of U572's case: a NEW asset made this way gets no hulls.","source":"Live on UE 5.8.3, 2026-10-17: a small prop mesh reimported from an FBX whose export log read 'hulls 0'; agg_geom convex_elems + box_elems read through get_editor_property before and after the import. Measured once; the engine source path was not read.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U574","fact":"**Extends U573: a Python `AssetImportTask` reimport over an existing StaticMesh keeps the asset's existing simple collision even when the FBX carries a DIFFERENT set of `UCX_` hulls: the FBX's hulls are not taken.** An asset with 1 convex element reimported from an FBX holding 2 `UCX_` hulls still had 1 afterwards; one with 2 kept 2. So a changed hull layout needs `import_asset` (oneConvexHullPerUCX) or a hull copy plus reload (U572), not a reimport.","source":"Live on UE 5.8.3, 2026-10-17: eleven prop meshes reimported over existing assets; export log 'hulls N' per FBX against `body_setup.agg_geom` convex + box element counts read after the import (the desk: FBX 2, asset 1 before and after). Measured once per asset; engine source not read.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U582","fact":"**`FWheelStatus` (Chaos `GetWheelState`) exposes no fields to editor Python: `get_editor_property(\"drive_torque\")` etc. fail, and `to_tuple()` on a default-constructed one is empty. `export_text()` gives every field** (bInContact, ContactPoint, HitLocation, PhysMaterial, NormalizedSuspensionLength, SpringForce, SlipAngle, bIsSlipping, SlipMagnitude, bIsSkidding, SkidMagnitude, SkidNormal, DriveTorque, BrakeTorque, bABSActivated).","source":"Live on UE 5.8.3, 2026-10-17: Python refusal messages and `unreal.WheelStatus().export_text()` output.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U585","fact":"**Chaos wheeled vehicle with traction control off: at full throttle from rest, the driven wheels stayed at SlipMagnitude 450-670 through all of first gear and the car took 8 s to reach 22 mph (about 1.2 m/s2, ~55 fps, physics substepping on), against about 3.9 m/s2 expected from the grip limit (ground friction 1.0 x wheel FrictionForceMultiplier 0.8 x half the weight).** Sustained wheelspin keeps only a fraction of the grip, so the launch is set by wheelspin, not by engine or gearing.","source":"Live measurement on UE 5.8.3, 2026-10-17: a per-frame log of GetForwardSpeed, engine rpm, gear, inputs and `GetWheelState(i)` export text (DriveTorque ~3,400, SlipMagnitude) over 20 s of a player drive.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U586","fact":"**Chaos wheel grip: `AvailableGrip = ForceIntoSurface * SurfaceFriction * FrictionMultiplier`; the longitudinal and lateral force are clipped together to it (friction circle), then scaled by SideSlipModifier. Traction control only caps drive force at `AvailableGrip * 0.98`, so it cannot raise acceleration above the grip limit (measured: no change in a wheelspin launch). `UChaosVehicleWheel` defaults: FrictionForceMultiplier 2.0, SlipThreshold 20, SkidThreshold 20, MaxWheelspinRotation 30.**","source":"Engine source, UE 5.8 launcher build: `Engine/Source/Runtime/Experimental/ChaosVehicles/ChaosVehiclesCore/Private/WheelSystem.cpp` lines 57, 84, 98-102, 160-175; `Engine/Plugins/Experimental/ChaosVehiclesPlugin/Source/ChaosVehicles/Private/ChaosVehicleWheel.cpp` lines 29-34. Live measurement 2026-10-17: slip 600-750 and the same launch with traction control set on through `SetTractionControlEnabled`.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U588","fact":"**Chaos `FVehicleEngineConfig::FillEngineSetup` normalises the torque curve by its own maximum and the sim multiplies by MaxTorque, so the curve's Y units don't matter: peak engine torque is MaxTorque.** (A vendor guide's \"Max Torque is multiplied by Torque Curve\" reads as if the curve were 0-1; it doesn't have to be.)","source":"Engine source, UE 5.8: `Plugins/Experimental/ChaosVehiclesPlugin/Source/ChaosVehicles/Public/ChaosWheeledVehicleMovementComponent.h` lines 286-299; `ChaosVehiclesCore/Private/EngineSystem.cpp` line 41; `ChaosVehiclesCore/Public/VehicleUtility.h` lines 61-83.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U589","fact":"**Chaos simple wheel: drive force above the grip limit always becomes wheel spin (`ExcessTorque`), even while the wheel is braking or on the handbrake, because the excess is computed before the braking branch. So handbrake plus throttle spins the driven wheels whenever drive force exceeds grip. The handbrake replaces that wheel's brake torque with HandbrakeTorque.**","source":"Engine source, UE 5.8: `Source/Runtime/Experimental/ChaosVehicles/ChaosVehiclesCore/Private/WheelSystem.cpp` lines 114-118 (excess) vs 127 (braking branch); `ChaosWheeledVehicleMovementComponent.cpp` lines 827-831 (handbrake).","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U593","fact":"**`UChaosWheeledVehicleMovementComponent::SetWheelFrictionMultiplier(i, f)` writes only the physics-thread wheel (`FSimpleWheelSim::FrictionMultiplier`); the wheel object's `FrictionForceMultiplier` keeps its value, so it can be read back to restore. `Wheels` (the wheel objects) is a public member.**","source":"Engine source, UE 5.8: `Plugins/Experimental/ChaosVehiclesPlugin/Source/ChaosVehicles/Private/ChaosWheeledVehicleMovementComponent.cpp` lines 2646-2660; `Public/ChaosWheeledVehicleMovementComponent.h` lines 566 (public:) and 674. A C++ helper using both compiled and linked against 5.8, 2026-10-17.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U594","fact":"**Chaos wheeled vehicles apply engine braking to every engine-driven wheel whenever the throttle is off, in any gear including neutral: `EngineBraking = EngineRPM * EngineBrakeEffect`, set as that wheel's brake torque. At idle 750 rpm and EngineBrakeEffect 0.5 that is 375 Nm per driven wheel, which stopped an empty 1550 kg sedan at about 1.6 m/s2; 0.1 gave ~0.35 m/s2 coasting.**","source":"Engine source, UE 5.8: `Plugins/Experimental/ChaosVehiclesPlugin/Source/ChaosVehicles/Private/ChaosWheeledVehicleMovementComponent.cpp` line 803 (EngineBraking) and lines 811-825 (applied when ThrottleInput < SMALL_NUMBER and moving). Live measurement 2026-10-17: per-frame GetWheelState BrakeTorque 375 on the rear wheels, gear 0, no inputs; then 75 after the change.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U614","fact":"**A Chaos cloth's setters (SetMaterialLinear, SetWind, SetGravity, ResetAndTeleport) are on the per-cloth UChaosClothingInteractor, reached through the simulation interactor's GetClothingInteractor(<clothing asset name>); call_function on GetClothingSimulationInteractor's own object answers 'has no function named SetMaterialLinear'. SetGravity(0) then ResetAndTeleport(reset) took a hanging cloth's mean displacement from 8.9 to 5.4-5.7 cm on 5.3.2-5.8.3** (tools/test_settle_routes.py RS1410/RS1411, 2026-10-18).","source":"5.3 `ChaosClothingSimulationInteractor.h:22` and 5.3 `ClothingSimulationInteractor.h:145`; 5.8 `ChaosClothingSimulationInteractor.h:33` and 5.8 `ClothingSimulationInteractor.h:164`","engine":"5.3-5.8","ue":["5.3","5.4","5.5","5.6","5.7","5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U628","fact":"**A Python `AssetImportTask` of an FBX whose `options` is an `FbxImportUI` with `static_mesh_import_data.auto_generate_collision = False` makes a NEW static mesh with NO simple collision on UE 5.8 - the file's `UCX_` hulls included - because the import goes through Interchange, whose converter turns that flag into the mesh pipeline's `bCollision`, the switch for every collision, and with it off the collision meshes are never processed. On 5.3 the FBX factory reads the same flag as \"generate none\" and keeps the hulls.** Kept on 5.8.3 by every other condition tried: no options, FbxImportUI defaults, combine_meshes, a two-part file with one part's hull, a reimport onto an asset with no hull (it took the file's), and a reimport with the flag off over an asset that had one (kept its own, U573). Leave the flag True for a file with UCX_ hulls.","source":"Live on stock UE 5.8.3 and 5.3.2, 2026-10-19 (tools/test_run_python_ucx.py RU108-RU109: 5.8.3 0 of 1, 5.3.2 1 of 1); engine read: 5.8 `InterchangeFbxAssetImportDataConverter.cpp:316` (bCollision = bAutoGenerateCollision), 5.8 `InterchangeLODDataParser.cpp:739` (no collision meshes when bCollision is false), 5.8 `InterchangeGenericMeshPipeline.h:101` (bCollision), 5.8 `FbxStaticMeshImport.cpp:2434` and 5.3 `FbxStaticMeshImport.cpp:2426` (the factory's flag gates generation only)","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U638","fact":"**A line trace (`line_trace_single` / `line_trace_multi_for_objects`, trace_complex true) that STARTS inside a static mesh's complex (use-complex-as-simple) collision does not report that mesh: an upward trace from 0.5 cm above a slab's downward-facing underside (inside the 20 cm slab) returned no hit, or the next surface 6 m up; the same trace started 1 cm below the underside hit it at 0.0 cm with ImpactNormal z -1.0. A probe that starts flush with a surface must start on the open side of it.**","source":"Live, 2026-10-19: UE 5.8.3 editor Python, three ceiling fixtures under building shells (CTF_USE_COMPLEX_AS_SIMPLE, BlockAll), traces from top -30, -10, -3 and +0.5 cm read back (hit z, actor, normal).","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U647","fact":"**Chaos `SetParked(true)` (UChaosVehicleMovementComponent) only sets `bParkEnabled`, which goes to the physics thread as `ControlInputs.ParkingEnabled`; there the wheeled sim applies the FULL `HandbrakeTorque` to every wheel (not only handbrake-enabled wheels) while parked. It is the engine's way to hold a left car still.**","source":"Engine source UE 5.8: `Plugins/Experimental/ChaosVehiclesPlugin/Source/ChaosVehicles/Private/ChaosVehicleMovementComponent.cpp` lines 1020-1023 (SetParked) and 935 (ControlInputs.ParkingEnabled); `ChaosWheeledVehicleMovementComponent.cpp` lines 827-829 (`HandbrakeInput && HandbrakeEnabled || ParkingEnabled`, force = HandbrakeTorque when parked). Read 2026-10-20.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U648","fact":"**Chaos vehicle inputs are processed only when `bRequiresControllerForInputs` is false or a local controller possesses the vehicle (`bProcessLocally = bRequiresControllerForInputs ? (Controller && Controller->IsLocalController()) : true`); with it true and no controller, the last inputs are not re-read from the game thread.**","source":"Engine source UE 5.8: `ChaosVehicleMovementComponent.cpp` line 1281. Read 2026-10-20.","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U668","fact":"**The stock UE 5.3 build compiles Chaos without Chaos Visual Debugger support, and 5.4 turns it on, so on 5.3 a ChaosVD recording holds frames and no solver data.** `bCompileChaosVisualDebuggerSupport` defaults to false in 5.3's TargetRules and to true in 5.4's, and it is a RequiresUniqueBuildEnvironment rule, so an installed engine carries whichever its own build used. Measured on a 5.3.2 probe (lane fix53, 2026-10-28): the trace channel list has 41 channels and no ChaosVD one, and a recording came out at 26 MB with 0 ChaosVD events; `record_chaos_vd` now refuses a start on such an engine by name (aa587384).","source":"5.3: Engine/Source/Programs/UnrealBuildTool/Configuration/TargetRules.cs:812-814; 5.4: Engine/Source/Programs/UnrealBuildTool/Configuration/TargetRules.cs:882-884","engine":"5.3-5.4","ue":["5.3","5.4"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"},{"id":"U689","fact":"**On 5.8.3 the second send to one path leaves InterchangeAssetImportData on the asset, so the third has no FBX import data to set bAutoGenerateCollision on, and with the collision cleared and autoCollision false it comes back with none.** Before: send 3 read convex 0, 'expected {'convex': 1}, Unreal has {}'. After, with autoCollision true on the replace: {'convex': 1} on each of four sends, with no 18-DOP beside it.","source":"Rerun: python tools/test_hand_off.py, rows SU138 (5718ef36a); before and after read 2026-11-02 on 5.8.3","engine":"5.8","ue":["5.8"],"bl":[],"section":"UE generic routes settled live - create_asset, set_property, edit_container, call_function, evaluate_sequence (UE 5.8.2 scratch editor, 2026-10-04)"}]