Summarize joined GPS route results

This commit is contained in:
2026-06-20 21:33:08 -05:00
parent 54f014b74d
commit bf72dcf6e3
3 changed files with 320 additions and 47 deletions
+72 -27
View File
@@ -4,12 +4,12 @@ Current date/time context: 2026-06-20/21, local timezone America/Chicago.
## Current Installed State
- Latest commit: `64ddf7a Trace GPS provider filters`.
- Latest installed probe commit: `54f014b Trace full GPS query results`.
- Installed RED4ext plugin:
`Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.dll`.
- Installed build is read-only. It should not alter route behavior.
- Plugin log is cleared and empty before the next test:
`Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.log`.
- Latest archived test log:
`logs/EdgeWeightGPS_query_route_probe_2308.log`.
- Game is cold as of the latest user message.
## New Toolbox Tools
@@ -32,6 +32,7 @@ In `red4ext/EdgeWeightGPS/src/Main.cpp`:
- `kEnableGpsTraceHooks = true`
- `kEnableGpsQueryLifecycleHooks = true`
- `kEnableGpsRouteJobLifecycleHooks = false`
- `kEnableGpsRouteJobStartTrace = false`
- `kEnableGpsLocalSearchHooks = true`
- `kEnableRouteUiTraceHooks = false`
@@ -113,37 +114,81 @@ Route result records:
- `h00` in those records matches `worldTrafficLanePersistent.nodeRefHash`.
- Route records can be joined to `work/raw-segment-json/all.traffic_persistent.json`.
- The low byte of route-record `u08` is not the same as the search point class.
- The log's human wall timestamp has a millisecond rollover bug around second
boundaries. Use the `+Nms` elapsed field for ordering and durations.
## Next User Test
## Latest 23:08 Test Result
Ask the user to run the usual routine:
The user clicked:
1. Launch game.
2. Hit Continue on main menu.
3. Hit Space to Continue.
4. Wait for minimap/GPS to settle.
5. Open map.
6. Plot the usual three routes plus one custom highway-ish target.
7. Close game.
- 23:08 continue on main menu
- 23:30 space to continue
- 23:46 map open
- 23:56 side job
- 24:06 Sinnerman
- 24:14 Claire
- 24:21 custom
- 24:30 Aldecaldo camp
- 24:47 far gig east
- 25:03 Violence
- 25:10 cyberpsycho unfinished highway
Ask for timestamps for:
Use:
- Space-to-Continue
- map open
- each route click
- game cold
```bash
python3 tools/summarize_gps_route_records.py \
--traffic-json work/raw-segment-json/all.traffic_persistent.json \
logs/EdgeWeightGPS_query_route_probe_2308.log
```
After the run:
Important result table:
1. Archive the log to `logs/EdgeWeightGPS_provider_filter_probe_<time>.log`.
2. Inspect `GPSQuerySubmit`/`GPSQueryResultFetch` lines for tracked route IDs
from submit return RVA `0x8d20d4`, especially successful `0x7094b8`
records with `gpsResult_ptr28_rec40`.
3. Inspect `GPSSearch result` lines for `filterPassClasses`,
`filterFailClasses`, `filterPassMaskBits`, and `filterFailMaskBits`.
4. Compare filter pass/fail classes to `edgeSrcClasses` and route output
records. The key question is whether the class/mask filter is selecting the
graph subset before cost weighting can matter.
- qid 1: startup/minimap route, 18 records, 50 ms, 1216.5 pavement length.
- qid 2: side job, 12 records, 32 ms, 578.6 pavement length.
- qid 3: Sinnerman, 23 records, 45 ms, 897.4 pavement, 160.4 highway,
89.8 road.
- qid 4: Claire, 18 records, 34 ms, 1216.5 pavement.
- qid 5: custom, 17 records, 44 ms, 1006.3 pavement, 241.0 highway,
38.0 road.
- qid 6: Aldecaldo camp, 80 records, 325 ms, 5853.5 road, 1492.9 highway,
1111.5 pavement, 24.6 gpsonly.
- qid 7: far east gig, 81 records, 144 ms, 5086.2 road, 1523.0 highway,
1111.5 pavement, 24.6 gpsonly.
- qid 8: Violence, 55 records, 97 ms, 1991.5 pavement, 358.5 highway,
86.1 road.
- qid 9: cyberpsycho unfinished highway, 58 records, 147 ms, 2657.4 pavement,
519.0 highway, 113.2 road, 56.7 gpsonly.
All 362 route-record handles matched traffic lane hashes in the extracted
resource.
Local search/provider aggregate from this run:
- 159 searches, 4036 provider filter calls, only 3 filter failures.
- Filter pass classes: `3:3114`, `5:451`, `15:310`, `1:116`, `4:42`.
- Edge source classes: `3:3244`, `5:487`, `15:318`, `1:117`, `4:58`.
- Edge return RVAs: `0x44f457:4033`, `0x44f629:151`,
`0x8d74d3:30`, `0x8d76b0:10`.
Inference:
- Provider vtable slot `+0x08` filtering is almost not pruning these route
searches, so it is not the dominant reason class-cost patches failed to
visibly steer GPS.
- Search-side edge classes are only `{1,3,4,5,15}` in this run. Final emitted
route-record classes include `{0,1,2,3,4,5,7,8,9}` and class 7/8/9 are
highway-heavy. Therefore final route-record `u08` low byte and search point
`point+0x13` class are different domains.
## Next Work
- Static disassembly around result-drain/producer RVAs `0x520783`,
`0x41be2c`, `0x41be94`, `0x70a42c`, and `0x8d20d4`.
- The plausible patch point is upstream of result copy: find where search
output is converted to 0x28 route records or where candidate lanes are ranked
with enough lane-hash/resource context to prefer highway/major-road lanes.
- Post-`0x7094b8` rewriting would likely only change displayed path records and
risks desynchronizing instructions from the real planner.
## Useful Commands
+31
View File
@@ -264,6 +264,37 @@ Route-record/resource correlation:
provider initialization site or a way to join search-side route points back to
`nodeRefHash`/lane flags before the edge cost is returned.
Latest full-route join:
- `logs/EdgeWeightGPS_query_route_probe_2308.log` contains nine solved route
results from the 23:08 user test. All 362 emitted route records matched
`worldTrafficLanePersistent.nodeRefHash` in
`work/raw-segment-json/all.traffic_persistent.json`.
- The log's wall timestamp currently wraps milliseconds without incrementing
the displayed second. Use the `+Nms` elapsed field when comparing submit and
result times.
- Representative solved route composition:
- side job: 12 records, 32 ms, 578.6 pavement length.
- Sinnerman: 23 records, 45 ms, 897.4 pavement, 160.4 highway, 89.8 road.
- Claire: 18 records, 34 ms, 1216.5 pavement.
- custom highway-ish pin: 17 records, 44 ms, 1006.3 pavement,
241.0 highway, 38.0 road.
- Aldecaldo camp: 80 records, 325 ms, 5853.5 road, 1492.9 highway,
1111.5 pavement, 24.6 gpsonly.
- far east gig: 81 records, 144 ms, 5086.2 road, 1523.0 highway,
1111.5 pavement, 24.6 gpsonly.
- Violence: 55 records, 97 ms, 1991.5 pavement, 358.5 highway,
86.1 road.
- cyberpsycho unfinished highway: 58 records, 147 ms, 2657.4 pavement,
519.0 highway, 113.2 road, 56.7 gpsonly.
- Search/provider aggregate in the same log: 159 searches, 4036 provider
filter calls, only 3 filter failures. Filter slot `+0x08` is therefore
almost never pruning this test graph.
- Search-side point classes observed by `0x44f838` are `{1,3,4,5,15}`. Final
route-record low-byte classes are `{0,1,2,3,4,5,7,8,9}`, and route-record
classes 7/8/9 are highway-heavy. These are different domains, which explains
why provider point-class tuning did not map cleanly to highway preference.
Current static producer lead:
- `0x70a908` packages the route endpoints and query settings, then calls