Skip to content

High on Life (PPSA15388): since #4491 every save reports "data still being installed" (scePlayGoGetLocus BAD_CHUNK_ID for chunks ≥ 1, dump has no playgo-* files) #5487

Open

Description

@Tamalero

High on Life (PPSA15388, v01.120.000) can no longer load a save on main 18c438b10. The load ends in the game's "Save data error — The data required to load the save file is still being installed" dialog. Before #4491, on 3377986a, the same save loaded.

Cause. The dump has no playgo-* file in sce_sys:

about ext_info.dat icon0.dds icon0.png keystone nptitle.dat param.json pfs-version.dat
pic0.dds pic0.png pic1.dds pic2.dds snd0.at9 trophy2 uds

Under #4491's rule, such a package has only chunk 0. The title asks scePlayGoGetLocus about one chunk at a time, ids 0, 1, 2 and so on. Every id but 0 now returns SCE_PLAYGO_ERROR_BAD_CHUNK_ID. A local trace logged each call's ids, the result with the old rule, and what main's rule alone answers:

[playgo] scePlayGoGetLocus entries 1 ids [0] -> 0x00000000 (main alone: 0x00000000)
[playgo] scePlayGoGetLocus entries 1 ids [1] -> 0x00000000 (main alone: 0x80b2000c)
[playgo] scePlayGoGetLocus entries 1 ids [2] -> 0x00000000 (main alone: 0x80b2000c)
...
[playgo] scePlayGoGetLocus entries 1 ids [255] -> 0x00000000 (main alone: 0x80b2000c)

(The trace stops logging after 256 entries, so the title may ask about more.) No other PlayGo call is rejected.

With a local switch that accepts every id when the dump has no PlayGo files, the save loads, and the title then runs through its home base.

So the dumps break in two ways. High on Life asks about chunk ids it expects to be installed, and needs them accepted. Sifu (PPSA03001, the reason for #4491) walks the ids until the first error, and needs one. A dump without playgo-* files doesn't say which kind of title it is. I don't know what a real PS5 answers for a package that has PlayGo data the dump didn't keep. That's probably the case here, since an Unreal title this size ships chunks. The dumped Octopath Traveler 0 (PPSA28495) also has no playgo-* files in sce_sys, so this layout looks common. I haven't run that title.

Related: #4491 (cc @xXPBSXx), #3238, #3435.

Setup

Tested and written by Claude (AI assistant) on a contributor's machine.

Activity

  1. MarcZX10 commented on Oct 13, 2026

    @MarcZX10
    Contributor

    The report exposes a genuine ambiguity in the no-PlayGo-files fallback: strict chunk-0-only validation breaks High on Life, while accepting every ID recreates Sifu’s non-terminating enumeration. Since the dump has no metadata that distinguishes those cases, I do not see a safe automatic rule from the evidence here. Would an explicit opt-in runtime setting for incomplete PlayGo metadata be useful (keeping the current strict default), or is there console behavior/evidence that should determine a generic default? I’m holding off on changing the validation rule until that policy is clear.

  2. MarcZX10 commented on Oct 13, 2026

    @MarcZX10
    Contributor

    I opened PR #5494 with the opt-in policy discussed above. It keeps the current chunk-0-only behavior by default and accepts unlisted IDs only when APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED=1 is set and the package has no PlayGo metadata files. The focused guest_playgo test covers both policies; the Linux harness passes. This is a compatibility workaround, not a claim about what a console returns for incomplete dumps.

  3. Tamalero commented on Oct 13, 2026

    @Tamalero
    ContributorAuthor

    Thanks for #5494. I ran it on High on Life with APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED=1: the save loads and the home base plays, the same as with my local switch. A local trace now records the highest chunk id the title asks about, which may help with the default.

    High on Life asks scePlayGoGetLocus about exactly ids 0 to 999, one id per call, then stops on its own. The highest id is 999, across 1,255 calls in a session that loaded the save and played for a few minutes. Every answer was 0 with the opt-in.

    So it looks like this title loops over a fixed 1,000-chunk range rather than walking until an error. From #4491, Sifu walks the same call until the first error. A rule of "no PlayGo files: ids 0–999 report installed, 1000 and up return BAD_CHUNK_ID" would fit both:

    • High on Life would load without the variable.
    • Sifu would get its error at id 1000 and end the enumeration, though after 1,000 calls rather than 2. Whether that is fine for Sifu's memory is for someone who has it to check; I don't.

    I don't have a console source for 1,000 being PlayGo's chunk-count limit, so this is a suggestion from title behaviour, not a measurement. With the opt-in already in #5494, I'm fine either way.

    Tested and written by Claude (AI assistant) on a contributor's machine.

  4. MarcZX10 commented on Oct 13, 2026

    @MarcZX10
    Contributor

    Thanks, this gives a much stronger explanation for why the opt-in helps High on Life. The observed 0–999 range is title behavior, though, and without a source or another title confirming a 1,000-chunk bound I would keep #5494 opt-in rather than turn that into a generic default. The Sifu impact at 1,000 calls is also still unmeasured. If someone can test that cap against Sifu (or provide the console/API contract), we can revisit the default with evidence.

  5. johandavidcm commented on Oct 21, 2026

    @johandavidcm
    Contributor

    A second title with no playgo-* file in sce_sys: Yakuza 0 Director's Cut (PPSA31327, v01.015.000, owned dump, bring-up #6722).

    Setup: Windows 11, Ryzen 7 7800X3D, RTX 4070 (NVIDIA 617.42). main 80565c5 plus #8098 (AudioOut2 only). Relinked with relinker --windows --registry. Until now I ran it with a local app0/playgo-chunkdefs.xml holding default_chunk="999"; that file was removed for these runs.

    Without APS5_PLAYGO_UNLISTED_CHUNKS the title stops at start-up:

    what():  scePlayGo: sce_sys/playgo-chunk.dat and sce_sys/playgo-scenario.json are missing, so chunk ID 1 cannot be checked; set APS5_PLAYGO_UNLISTED_CHUNKS=installed or =absent to answer for this dump
    

    The eboot imports 15 PlayGo functions but not scePlayGoGetChunkId, so it can't list the chunks itself.

    Which ids it asks about. I used a local, uncommitted probe that prints the ids passed to ValidateChunks. Each run lasted 120 s with no abort.

    • =installed:
      • scePlayGoGetLocus is called twice with ids 0 1 2 3 4 5 10.
      • scePlayGoGetProgress and scePlayGoGetEta are each called once with 0 1 2 3 4 5 and once with 10.
      • Nothing else follows, and the run looks like the one with the XML.
    • =absent:
      • There is one scePlayGoPrefetch of the same 7 ids.
      • After that, GetLocus, GetProgress and GetEta are polled about 8.4 times a second for the whole run: 1010 GetLocus calls in 120 s.
      • The title waits for an install that never finishes. I have not checked what it eventually shows to the player.

    So, like High on Life, this title needs the chunks it doesn't find listed to read as installed. Unlike High on Life and Sifu, it doesn't walk ids: it asks for a fixed set of 7 ids, all below 1000. That fits the "ids 0-999 installed, 1000 and up BAD_CHUNK_ID" rule discussed above. It doesn't test the 1000 bound itself, because nothing above 10 is asked.

  6. MarcZX10 commented on Oct 22, 2026

    @MarcZX10
    Contributor

    The Yakuza 0 report shows only IDs 0–5 and 10 are queried; it does not exercise the proposed >=1000 boundary. It supports the installed-state behavior for a title that supplies no PlayGo metadata, but cannot independently establish a general 0–999 range. Is there a source or console probe that establishes that bound, or a targeted probe around IDs 999/1000 from a title that actually requests them? Until then I would keep the opt-in/default behavior qualified as unverified rather than infer the limit from these observed IDs. AI-assisted review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions