fixed severe audio slowdown on the news report at begin of the game

fixed severe audio slowdown on the news report at begin of the game
This commit is contained in:
Jessica_Natalia
2026-08-18 00:52:04 -03:00
parent 62f5774b9a
commit 568c95072d
24 changed files with 1540 additions and 76 deletions
@@ -0,0 +1,168 @@
# VCS PERF V8.2 CPU RUNTIME LEAN — handoff
Date: 2026-08-17
## Baseline and reason for this stage
V8.1 CPU LEAN is the protected baseline. The user reported that it fixed the
slow-motion feeling at low FPS. Its runtime architecture therefore remains
unchanged where timing/scheduling is concerned.
The latest V8.1 log confirms the CPU direction is better than V7/V8 under heavy
workload. Using all windows with at least 50k game draws:
- V7: 12.781 ms guest CPU, 57.29 FPS (120 windows, mean 74,461 draws)
- V8: 12.952 ms guest CPU, 56.70 FPS (124 windows, mean 74,482 draws)
- V8.1: 11.969 ms guest CPU, 60.69 FPS (122 windows, mean 76,124 draws)
These are workload-threshold aggregates, not deterministic replay pairs. V8.2
therefore does not alter the V8.1 frame/tick behavior; it targets repeated native
chain overhead and code footprint.
## 1. Generic PSPRecomp runtime-chain telemetry compile switch
New CMake option:
`PSPRECOMP_RUNTIME_CHAIN_TELEMETRY`
The generic framework defaults it ON so profiling capability remains available.
The VCS production build script defaults it OFF.
When OFF, the compiler removes per-chain branches/counters for:
- `g_guest_hotspot_profile_enabled`
- `g_guest_hotspot_unit_calls`
- guest-hotspot sampling clocks/records
- `g_unit_profile_enabled`
- `g_unit_profile_counts`
from compile-time direct chains, dynamic generated-unit chains, and Tier-2 fused
transfer entry accounting.
This does **not** disable the low-overhead VCS `PERF` telemetry used for FPS,
guest CPU, GE, Present and renderer workload measurements.
To produce a deep diagnostic build:
```bat
set PSPRECOMP_RUNTIME_CHAIN_TELEMETRY=ON
profiles\vcs\BUILD_VCS_NINJA.bat
```
## 2. PSP scheduler/tick semantics are protected
The following mechanisms are unchanged from V8.1:
- `PSPRECOMP_TIME_TICK_DISPATCHES` policy
- `g_runtime_starvation_interval_fast`
- `dispatches_since_import_`
- `run_starvation_boundary()`
- context-switch invalidation / native-chain unwind behavior
- `account_inlined_generated_leaf()` scheduler cadence
- Tier-2 fused-transfer scheduler accounting
This is intentional because V8.1 resolved the user's low-FPS slow-motion feeling.
## 3. Five tiny Boundary leaf wrappers removed
The Boundary cluster has four unit-0206 targets that pass the existing static
leaf validator:
- `0x08B3E084`
- `0x08B3E08C` (two call sites)
- `0x08B3E254`
- `0x08B3E260`
Total transformed sites: **5**.
The validator rejects nested generated/HLE/syscall calls, non-`$ra` returns and
foreign explicit PC exits. Each transformed site invokes the exact generated
entry and then calls `account_inlined_generated_leaf()` so the removed native
wrapper still contributes exactly one scheduler work edge.
No World direct-leaf expansion was enabled because previous experimentation
showed a compiler/codegen cliff when broad direct-leaf work was mixed with
World's GPR shadow.
## 4. Geometry/World protected shape
V8.2 deliberately keeps:
- Geometry: **379 blocks**, no GPR shadow, no inline/direct-leaf experiment
- World: **402 blocks**, no new direct-leaf experiment
- Tier-2 total: **1,060 blocks**
- static fused calls: **36**
- static fused tails: **13**
- Tier-2 direct-fastmem: **1,969 sites**
This avoids repeating V8's I-cache/code-size regression.
## Static code-size evidence
Same compiler/flags, Linux x86-64, V8.1 vs V8.2:
- generated unit 0085 `.text`: 374,333 -> 354,075 bytes (**-5.41%**)
- generated unit 0158 `.text`: 360,754 -> 345,782 bytes (**-4.15%**)
- Geometry Tier-2 `.text`: 170,247 -> 161,163 bytes (**-5.34%**), still 379 blocks
- Boundary Tier-2 `.text`: 24,937 -> 18,257 bytes (**-26.79%**)
`nm` audit on V8.2 unit 0085 shows no references to the guest-hotspot/unit-profile
symbols that were present in the V8.1 object.
## Isolated wrapper microbenchmark
20 million calls, x86-64 optimized build, scheduler interval disabled to isolate
native wrapper overhead:
- ordinary `invoke_chained_direct`: ~2.8 ns/call
- statically proven leaf direct call + `account_inlined_generated_leaf`: ~1.1–1.2 ns/call
This microbenchmark only validates the local mechanism. It is **not** a game-FPS
claim; Windows VCS gameplay remains authoritative.
## Validation
Passed:
- `psprecomp_tests`
- `vcs_profile_tests` (scheduler/callback/framebuffer)
- `vcs_config_tests`
- `vfpu_tier2_tests`
- V8.2 static audit
- 10/10 hooked generated units syntax-checked with production macros
- 7/7 Tier-2 cluster objects compiled
- generated unit 0085 optimized object compile
- generated unit 0158 optimized object compile
- Geometry/Boundary optimized object A/B code-size builds
A full Linux VCSNative link was started. The 234-unit O3 generated corpus exceeds
the interactive build window; no source diagnostic occurred before interruption.
The Windows VS2022/Ninja build is authoritative for the full executable.
## Runtime identity
Expected log:
```text
stage=perf-v8.2-cpu-runtime-lean-2026-08-17
...
guest_hotspot=0 ... chain_telemetry_compiled=0
...
perf_layer=8 cpu_lean_revision=2 runtime_chain_telemetry_default=0
...
direct_generated_leaf_sites=5
geometry_fusion_rollback=1
```
## What to compare
Primary comparison is V8.2 against V8.1, not against the rejected V8 build.
Compare `guest_cpu_us_avg` and FPS for similar draw bins, especially 50k+, 70k+
and 90k+ game draws. The game-speed/slow-motion feeling must remain identical to
V8.1; any regression there invalidates this stage regardless of average FPS.
## Progress estimate
- overall VCS recomp project: **~92%**
- CPU/Tier-2 architecture: **~97%**
- >150 FPS headroom goal: **~61%**, pending V8.2 Windows gameplay benchmark
@@ -0,0 +1,58 @@
{
"stage": "perf-v8.2-cpu-runtime-lean-2026-08-17",
"base": "perf-v8.1-cpu-lean-2026-08-17",
"protected_baseline": {
"slow_motion_feeling_fixed": true,
"geometry_blocks": 379,
"world_blocks": 402,
"tier2_hot_blocks": 1060,
"tier2_direct_mem_sites": 1969,
"scheduler_tick_semantics_changed": false
},
"runtime_chain_optimization": {
"generic_psprecomp_option": "PSPRECOMP_RUNTIME_CHAIN_TELEMETRY",
"generic_default": true,
"vcs_performance_default": false,
"perf_telemetry_preserved": true,
"scheduler_accounting_preserved": true
},
"boundary_direct_generated_leaves": {
"targets": ["0x08B3E084", "0x08B3E08C", "0x08B3E254", "0x08B3E260"],
"call_sites": 5,
"world_experiment_enabled": false,
"geometry_experiment_enabled": false
},
"static_text_bytes": {
"generated_unit_0085": {"v81": 374333, "v82": 354075, "reduction_percent": 5.41},
"generated_unit_0158": {"v81": 360754, "v82": 345782, "reduction_percent": 4.15},
"tier2_geometry": {"v81": 170247, "v82": 161163, "reduction_percent": 5.34},
"tier2_boundary": {"v81": 24937, "v82": 18257, "reduction_percent": 26.79}
},
"isolated_microbench_ns_per_call": {
"ordinary_invoke_chained_direct_approx": 2.8,
"direct_leaf_plus_scheduler_accounting_approx_range": [1.1, 1.2],
"game_fps_claim": false
},
"v81_runtime_baseline_ge_50000_draws": {
"windows": 122,
"guest_cpu_ms_mean": 11.969,
"fps_mean": 60.69,
"game_draws_mean": 76124
},
"validation": {
"psprecomp_tests": "PASS",
"vcs_profile_tests": "PASS",
"vcs_config_tests": "PASS",
"vfpu_tier2_tests": "PASS",
"v82_static_audit": "PASS",
"hook_units_syntax": "10/10 PASS",
"tier2_cluster_objects": "7/7 PASS",
"full_linux_vcsnative_link": "NOT COMPLETED: generated O3 corpus exceeded interactive build window without source diagnostic",
"windows_vs2022": "PENDING USER BUILD"
},
"progress_estimate": {
"overall_project_percent": 92,
"cpu_tier2_architecture_percent": 97,
"performance_150fps_goal_percent": 61
}
}
@@ -0,0 +1,165 @@
# VCSNative V8.2.1 — Correctness: Save + SAS loops + NEWS radio
**Date:** 2026-08-17
**Base:** PSPRecomp-VCS-PERF-V8.2-CPU-RUNTIME-LEAN-2026-08-17
**Stage:** `correctness-v8.2.1-save-audio-news-2026-08-17`
## Why this release exists
Performance work is intentionally paused. V8.1/V8.2 restored the correct gameplay-speed feeling, but three correctness risks have priority before further CPU work:
1. after a real successful Save Game, some later mission states can leave a black screen;
2. a vehicle-related SAS effect (reported most clearly on motorcycles, possibly brake/engine) can remain looped until entering the menu;
3. NEWS radio transitions may still hitch when a second ATRAC stream starts.
The V8.2 Tier-2 shape, Geometry rollback, scheduler cadence and runtime-chain lean path are unchanged.
## 1. Save Game black-screen hardening
### Firmware lifecycle fix
The successful LISTSAVE result path previously did all of these at once when the user acknowledged `SAVE COMPLETED`:
- changed the utility state to `Quit`;
- destroyed the host savedata UI;
- immediately cleared `display_window`'s system-utility ownership.
The guest had **not yet** observed `Quit` and called `sceUtilitySavedataShutdownStart`. The new path keeps system-utility ownership through that final PSP utility transition and releases it only from the existing ShutdownStart/Finished path.
This does not reuse or alter the older V9.6 LISTSAVE-cancel workaround. Load cancellation behavior remains unchanged.
### Transactional slot writes
The previous save writer truncated `DATA.BIN` before validating/writing every optional payload. Mission-dependent ICON/PIC/SND descriptors could therefore fail after the main file was already replaced.
V8.2.1 now:
1. validates and snapshots the main game save buffer;
2. validates and snapshots every supplied optional savedata buffer;
3. stages every host file beside its final target;
4. moves any old file to a temporary backup;
5. commits the staged files;
6. rolls all already-committed files back if a later commit fails;
7. removes backups only after the complete commit succeeds.
`VCSNative.meta` remains host-only decoration and cannot turn a valid game save into a failed PSP save operation.
A regression test creates an existing `DATA.BIN`, deliberately makes a later auxiliary target impossible, requires the transaction to fail, and verifies the old `DATA.BIN` remains byte-for-byte intact.
## 2. Stuck motorcycle / vehicle sound
The SAS error value `0x80420016` is now named `kSasErrorInvalidState` rather than the misleading `kSasErrorVoicePaused`.
More importantly, `__sceSasSetKeyOff` no longer rejects an active voice merely because that voice is currently mixer-paused. Pause is treated as a mixer gate, while KeyOff still latches:
- `on = false`;
- envelope phase = `Release`.
This closes the state hole where a looped VAG vehicle voice could be paused during a transition, receive a rejected KeyOff, and later resume with its key still logically held.
The existing zero-release-rate safeguard remains in place. A new regression test exercises:
`looped VAG -> paused -> KeyOff -> unpause -> Release -> retired`
and requires the voice to reach zero envelope and stop playing.
## 3. NEWS radio hitch investigation/fix
### Removed synchronous source scan from the common path
ATRAC setup previously identified a host source by iterating all registered AT3/AA3/OMA files with the same size, opening each candidate synchronously and reading up to 256 header bytes.
V8.2.1 records the native path associated with a normal file descriptor. When `sceIoRead` fills a guest buffer from an ATRAC source, it records the exact producer for that guest buffer. `sceAtracSetHalfwayBufferAndGetID` then resolves the source directly from that buffer address:
- no directory-sized candidate scan;
- no host file open;
- no header reread in the common case.
A bounded 256-byte prefix cache remains only as a fallback for raw virtual-disc layouts where the direct fd-to-buffer association is unavailable. Each fallback file is read at most once.
### Runtime proof in normal VCSNative.log
No environment variable is required. Low-volume lines are now written to the normal runtime log:
```text
ATRAC_SOURCE resolve_us=... candidates=... direct_buffer=1 fallback_reads=0 ... source=NEWS_....AT3
ATRAC_DECODE source=NEWS_....AT3 open=1 decode_us=... bytes=... sample=... slow_events=...
```
`ATRAC_DECODE` is emitted for every decoder open and for later decode calls taking at least 2 ms. Therefore the next physical NEWS test can distinguish:
- source resolution stall;
- FFmpeg decoder-open stall;
- slow steady-state decode.
This release removes the known synchronous resolver scan. It does **not** claim that FFmpeg opening a brand-new NEWS decoder is already proven hitch-free; the new log makes that measurable before a more invasive decoder-prewarm change is considered.
## Preserved V8.2 performance baseline
Unchanged:
- hot blocks: 1,060;
- static fused calls: 36;
- Geometry inline generated leaves: 0;
- Boundary direct generated leaf sites: 5;
- `cpu_lean_revision=2`;
- Geometry fusion rollback active;
- direct fastmem active;
- GE async quarantined/off;
- parallel vertex decode quarantined/off;
- scheduler/starvation cadence unchanged.
## Runtime identity
Expected header:
```text
stage=correctness-v8.2.1-save-audio-news-2026-08-17
...
correctness_revision=821
save_transaction=1
save_shutdown_lifecycle=1
sas_paused_keyoff=1
atrac_direct_source=1
atrac_stall_diag=1
```
## Validation completed
- `vcs_profile.cpp` VCSNative Release object: PASS.
- `vcs_runtime_log.cpp` VCSNative Release object: PASS.
- `psprecomp_tests`: PASS.
- `vcs_profile_tests`: PASS.
- `vcs_config_tests`: PASS.
- `vfpu_tier2_tests`: PASS.
- V8.2 CPU runtime-lean audit: PASS.
- V8.2.1 correctness static audit: **13/13 PASS**.
- transactional save rollback fixture: PASS as part of `vcs_profile_tests`.
- paused looped-SAS KeyOff fixture: PASS as part of `vcs_profile_tests`.
- changed-source audit for the prohibited external emulator name: PASS.
A full fresh Linux VCSNative link was not repeated because this host-only correctness overlay does not modify generated AOT/Tier-2/DX12 code; the changed VCSNative target objects were compiled directly. Windows VS2022/Ninja plus real VCS gameplay remains authoritative.
## Windows build / install
Preferred path from current V8.2 source: extract the V8.2.1 overlay over it, overwrite files, **do not delete `out`**, then run:
```bat
profiles\vcs\BUILD_VCS_NINJA.bat
```
The new one-shot stamp invalidates only `vcs_profile` and `vcs_runtime_log` objects. Generated AOT, Tier-2 and DX12 objects are preserved.
## Physical test order
1. Load the same save and complete several missions.
2. Save into an existing slot and a new slot; acknowledge `SAVE COMPLETED`; verify normal return every time.
3. Reproduce the motorcycle/vehicle sound that previously stuck; enter/leave pause and vehicles repeatedly; verify no effect survives incorrectly.
4. Listen until a NEWS bulletin starts. If any hitch remains, provide the new `VCSNative(...).log`; inspect `ATRAC_SOURCE` and `ATRAC_DECODE` around the NEWS filename.
## Progress estimate
- Overall VCS recomp project: **~92%**.
- Correctness/frontend/audio stabilization: **~94% implementation**, pending physical Windows verification of these three reports.
- CPU/Tier-2 optimization: remains **~97% architectural work**, intentionally paused here.
- 150+ FPS headroom objective: unchanged from V8.2 and not advanced by this correctness release.
@@ -0,0 +1,54 @@
{
"release": "PSPRecomp-VCS-V8.2.1-CORRECTNESS-SAVE-AUDIO-NEWS-2026-08-17",
"base": "PSPRecomp-VCS-PERF-V8.2-CPU-RUNTIME-LEAN-2026-08-17",
"stage": "correctness-v8.2.1-save-audio-news-2026-08-17",
"performance_baseline_preserved": {
"hot_blocks": 1060,
"static_fused_calls": 36,
"static_fused_tail": 13,
"hooks": 25,
"boundary_direct_generated_leaf_sites": 5,
"geometry_direct_generated_leaf_sites": 0,
"cpu_lean_revision": 2,
"scheduler_changed": false,
"geometry_changed": false,
"dx12_changed": false
},
"savedata": {
"transactional_buffer_snapshot": true,
"stage_before_replace": true,
"rollback_on_commit_failure": true,
"listsave_system_utility_released_at_shutdown": true,
"v9_6_cancel_policy_changed": false
},
"sas": {
"error_80420016_name": "InvalidState",
"keyoff_while_paused_latches_release": true,
"zero_release_fallback_preserved": true,
"paused_loop_regression_test": true
},
"news_atrac": {
"direct_sceIoRead_buffer_source_resolution": true,
"common_path_host_file_scan": false,
"lazy_prefix_fallback_bytes": 256,
"runtime_source_timing_log": true,
"runtime_decode_open_timing_log": true,
"slow_decode_threshold_us": 2000,
"ffmpeg_open_hitch_physically_verified": false
},
"validation": {
"psprecomp_tests": "PASS",
"vcs_profile_tests": "PASS",
"vcs_config_tests": "PASS",
"vfpu_tier2_tests": "PASS",
"v8_2_baseline_audit": "PASS",
"v8_2_1_correctness_audit": "13/13 PASS",
"vcsnative_vcs_profile_object": "PASS",
"vcsnative_runtime_log_object": "PASS"
},
"progress_estimate_percent": {
"overall": 92,
"correctness_frontend_audio_implementation": 94,
"cpu_tier2_architecture": 97
}
}
@@ -0,0 +1,88 @@
# VCSNative V8.2.2 Correctness Recovery — Save / SAS / ATRAC
Date: 2026-08-17
Base: V8.2 CPU Runtime Lean stable source (not V8.2.1)
Estimated total VCS recomp project progress: ~92%
## Why this recovery exists
The physical V8.2.1 test did not fix the stuck vehicle sound and introduced/revealed an infinite mission-interior Loading state. The supplied runtime log shows the Loading screen is active rather than blocked: from vblank 20461 onward the same 4500 game draws / 4080 GPU draws / 420 merges repeat with host I/O at zero for thousands of vblanks. There are no savedata operations in that run before the interior stall.
V8.2.2 therefore rebases correctness work onto the previously stable V8.2 source and does not carry forward the speculative V8.2.1 paused-KeyOff or LISTSAVE lifecycle changes.
## 1. Mission-interior Loading regression recovery
- Source base restored to V8.2 for runtime behavior.
- V8.2.1 paused-KeyOff behavior removed.
- V8.2.1 LISTSAVE host-ownership/lifecycle experiment removed.
- Tier-2, scheduler, Geometry, World, DX12 and performance architecture are unchanged from V8.2.
This removes V8.2.1-specific runtime changes from the mission/interior path. Physical gameplay remains authoritative to prove the interior transition is restored.
## 2. SAS audio correctness
### Latched EndFlag
The old HLE returned `!voice.playing` directly from `__sceSasGetEndFlag`. PSP SAS exposes end flags as a snapshot refreshed by a completed Core mixer cycle. V8.2.2 stores `SasState::end_flags` and refreshes it only after `sas_mix_into` / `sas_mix_raw` completes.
This prevents guest audio control code from observing a voice transition before the mixer cycle that publishes it, which can otherwise cause premature voice reuse/rearming.
### VAG loop predictor restoration
The decoder already captured `loop_start_history1/2`, but `rewind_loop()` never restored them. V8.2.2 restores both predictor histories on every loop jump. This makes every pass through a loop start from the same ADPCM decoder state instead of accumulating waveform drift.
### What was deliberately reverted
The V8.2.1 helper that accepted KeyOff while a voice was paused is gone. V8.2 paused-KeyOff behavior is restored until a physical trace proves a different state transition is required.
## 3. Savedata
The useful transactional write protection is retained, but the UI/status lifecycle is exactly the V8.2/V9.6 behavior again.
Before replacing an existing slot, V8.2.2 snapshots all guest buffers, stages DATA.BIN and optional auxiliary files to temporary host files, and commits only after all staging succeeds. A failure rolls the old slot back instead of leaving DATA.BIN partially replaced.
Normal VCSNative.log now records low-volume LISTSAVE diagnostics:
- `SAVEDATA_SAVE result=... data=... icon0=... icon1=... pic1=... snd0=...`
- `SAVEDATA_SAVE acknowledged status=QUIT`
- `SAVEDATA_SAVE shutdown status=FINISHED`
These lines will distinguish an I/O/descriptor failure from a guest frontend transition if the original post-save black screen still reproduces.
## 4. ATRAC / radio NEWS stall
V8.2.1 attempted direct source tracking only for ordinary host-file reads. The physical log showed every observed source resolution as `direct_buffer=0`, proving the radio was taking another path. VCS commonly reads these streams through the virtual UMD handle.
V8.2.2 maps virtual-disc read offsets back to the indexed `VirtualDiscFile` before the read, associates an ATRAC guest destination buffer with the exact AT3/AA3/OMA source, and consumes that mapping in `sceAtracSetHalfwayBufferAndGetID`.
The old content-header search remains only as fallback. `ATRAC_SOURCE` and `ATRAC_DECODE` remain low-volume runtime diagnostics.
Expected healthy line:
`ATRAC_SOURCE resolve_us=<small> direct_buffer=1 fallback_reads=0 source=...AT3`
The V8.2.1 physical log contained a 7152 us source lookup while the matching decoder open was only 431 us, so source resolution itself was still capable of producing a visible radio hitch.
## Validation
- CMake Release/Ninja configure: PASS
- changed `vcs_profile.cpp` object: PASS
- changed `vcs_runtime_log.cpp` object: PASS
- psprecomp_tests: PASS
- vcs_profile_tests: PASS
- vcs_config_tests: PASS
- vfpu_tier2_tests: PASS
- V8.2 CPU runtime lean audit: PASS
- V8.2.2 correctness recovery audit: PASS (15 checks)
- forbidden external-emulator reference audit: PASS
The full Windows/DX12 executable was not linked in the Linux container. VS2022/Ninja on the user's machine remains the authoritative full build and physical runtime test.
## Physical test order
1. Enter the same mission interior that looped on Loading. This is the first gate.
2. Reproduce the motorcycle/vehicle sound that used to stay looped; verify it retires without opening the menu.
3. Save after several missions and complete the Save UI. If black returns, send the new log; the SAVEDATA_SAVE lines now expose the exact result/descriptor state.
4. Let radio/news transitions occur. Check whether `ATRAC_SOURCE` is now `direct_buffer=1 fallback_reads=0`, and report any visible hitch.
Do not resume CPU optimization until these correctness gates pass.
@@ -0,0 +1,48 @@
{
"release": "V8.2.2 Correctness Recovery",
"date": "2026-08-17",
"base": "V8.2 CPU Runtime Lean",
"estimated_total_project_progress_percent": 92,
"runtime_stage": "correctness-v8.2.2-recovery-save-audio-news-2026-08-17",
"recovery": {
"v821_paused_keyoff_removed": true,
"v821_save_lifecycle_experiment_removed": true,
"tier2_scheduler_geometry_unchanged_from_v82": true
},
"sas": {
"end_flags_latched_after_core": true,
"vag_loop_predictor_history_restored": true
},
"savedata": {
"transactional_commit": true,
"rollback_on_staging_or_commit_failure": true,
"v82_v96_lifecycle_preserved": true,
"runtime_save_diagnostics": true
},
"atrac": {
"regular_file_buffer_source_tracking": true,
"virtual_umd_buffer_source_tracking": true,
"header_scan_fallback_retained": true,
"source_and_decode_timing_log": true,
"v821_observed_max_source_resolution_us": 7152,
"matching_decode_open_us": 431
},
"loading_loop_observation": {
"first_stable_vblank": 20461,
"last_observed_vblank": 24481,
"repeated_game_draws": 4500,
"repeated_gpu_draws": 4080,
"repeated_batch_merges": 420,
"io_us_avg": 0
},
"validation": {
"psprecomp_tests": "PASS",
"vcs_profile_tests": "PASS",
"vcs_config_tests": "PASS",
"vfpu_tier2_tests": "PASS",
"v82_static_audit": "PASS",
"v822_static_audit": "PASS",
"changed_host_objects": "PASS",
"full_windows_runtime": "PENDING_PHYSICAL_TEST"
}
}